Implements Microsoft's Fluent Design System in Flutter.

Overview

fluent_ui

Design beautiful native windows apps using Flutter

Unofficial implementation of Fluent UI for Flutter. It's written based on the official documentation

You can check the web version of it here

Content

Motivation

Since flutter has Windows support (currently in stable under an early release flag as of 30/03/2021), it's necessary to have support to its UI guidelines to build apps with fidelity, since it has support for Material and Cupertino. See this for more info on the offical fluent ui support

See also:

Installation

Add the package to your dependencies:

dependencies:
  fluent_ui:
    git: https://github.com/bdlukaa/fluent_ui.git

You can see the example app here

Finally, run dart pub get to downlaod 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:

<a title="Made with Fluent Design" href="https://github.com/bdlukaa/fluent_ui">
  <img
    src="https://img.shields.io/badge/fluent-design-blue?style=flat-square&color=7A7574&labelColor=0078D7"
  />
</a>

Style

Learn more about Fluent 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
FluentApp(
  title: 'MyApp',
  theme: ThemeData(
    ...
  ),
)
  1. Using the FluentTheme widget
FluentTheme(
  theme: ThemeData(
    ...
  ),
  child: ...,
),

Icons

Icons Preview

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:

Icon(FluentIcons.add),

Colors

This library also includes the Fluent UI colors with it, so you can just call Colors.[color_name]:

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.

By default, the accent color is Colors.blue. However, you can also customize your app's accent color to reflect your brand:

ThemeData(
  accentColor: Colors.blue,
)

To use the system's accent color, you can use the plugin system_theme made by me :). It has support for (04/01/2021) Android, Web and Windows.

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

  2. Brightness.dark

    Dark theme

It defaults to the brightness of the device. (MediaQuery.of(context).brightness)

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.

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:

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. 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.

Font Segoe UI Showcase

Learn more

Type ramp

The Windows type ramp establishes crucial relationships between the type styles on a page, helping users read content easily. Learn more

Windows Type Ramp

Reveal Focus

Reveal Focus is a lighting effect for 10-foot experiences, 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

Reveal Focus calls attention to focused elements by adding an animated glow around the element's border:

Reveal Focus Preview

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 focusStyle in your app ThemeData:

theme: ThemeData(
  focusTheme: FocusStyle(
    glowFactor: 4.0,
  ),
),

To enable it in a 10 foot screen, use the method is10footScreen:

import 'dart:ui' as ui;

theme: ThemeData(
  focusStyle: FocusStyle(
    glowFactor: is10footScreen(ui.window.physicalSize.width) ? 2.0 : 0.0,
  ),
),

Go to the 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:

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:

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

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

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

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

App Bar

The app bar is the top app bar that every desktop nowadays have.

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.

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 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 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 The pane shows only icons until opened and is positioned to the left of the content.
Minimal Only the menu button is shown until the pane is opened. When opened, it's positioned to the left of the content.
Auto 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:

pane: NavigationPane(
  indicatorBuilder: ({
    required BuildContext context,
    /// The current selected index
    int? index,
    /// A function that, when executed, returns the position of all the
    /// PaneItems. This function must be called after the widget was
    /// rendered at least once
    required List<Offset> Function() offsets,
    /// A function that, when executed, returns the size of all the
    /// PaneItems. This function must be called after the widget was
    /// rendered at least once
    required List<Size> Function() sizes,
    /// 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 (index == null) return child;
    assert(debugCheckHasFluentTheme(context));
    final theme = NavigationPaneThemeData.of(context);
    return EndNavigationIndicator(
      index: index,
      offsets: offsets,
      sizes: sizes,
      child: child,
      color: theme.highlightColor,
      curve: theme.animationCurve ?? Curves.linear,
      axis: axis,
    );
  },
)

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.

int _currentIndex = 0;

NavigationView(
  ...,
  content: NavigationBody(index: _currentIndex, children: [...]),
)

You can use NavigationBody.builder

NavigationView(
  ...,
  content: NavigationBody(
    index: _currentIndex,
    itemBuilder: (context, index) {
      return ...;
    }
  )
)

ScaffoldPage is usually used with the navigation body as its children:

NavigationBody(
  index: _currentIndex,
  children: [
    ScaffoldPage(
      topBar: PageTopBar(header: Text('Your Songs'))
    )
  ],
)

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

Here's an example of how to create a tab view:

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: Tooltip(
          message: 'Close tab',
          child: IconButton(
            icon: Icon(FluentIcons.close),
            onPressed: () {
              setState(() => tabs--);
              if (currentIndex > tabs - 1) currentIndex--;
            },
          ),
        ),
      );
    }),
    bodies: List.generate(
      tabs,
      (index) => Container(
        color: index.isEven ? Colors.red : Colors.yellow,
      ),
    ),
  ),
),

The code above produces the following:

TabView Preview

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

Here's an example of how to create a bottom navigation:

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

Here's an example of how to create a basic button:

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

You can also use some alternative buttons:

Icon Button

This button is used to display an Icon as content. It's optmized to show icons.

IconButton(
  icon: Icon(FluentIcons.add),
  onPressed: () {
    print('pressed icon 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

You can use a SplitButtonBar to create a Split Button. It takes two Buttons 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:

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

Toggle Button

A button that can be on or off.

Here's an example of how to create a basic toggle button:

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

Here's an example of how to create a checkbox:

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

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

Here's an example of how to create a basic toggle switch:

bool _checked = false;

ToggleSwitch(
  checked: _checked,
  onChanged: (v) => setState(() => _checked = v),
  content: Text(_checked ? 'On' : 'Off');
)

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

Here's an example of how to create a basic set of radio buttons:

int _currentIndex = -1;

final List<String> radioButtons = <String>[
  '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

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

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 instead.

Here's an example of how to create a basic slider:

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

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

Example

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.

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

TextBox Preview

You can use the Forms screen in the example app for reference.

You can use the widget TextBox to create text boxes:

TextBox(
  controller: ...,
  header: 'Notes',
  placeholder: 'Type your notes here',
),

Which produces the following:

TextBox Example Preview

Auto Suggest Box

Use an AutoSuggestBox to provide a list of suggestions for a user to select from as they type. Learn more

Example

final autoSuggestBox = TextEditingController();

AutoSuggestBox<String>(
  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

Screenshots

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

Here's an example of how to create a basic combo box:

final values = ['Blue', 'Green', 'Yellow', 'Red'];
String? comboBoxValue;

SizedBox(
  width: 200,
  child: Combobox<String>(
    placeholder: Text('Selected list item'),
    isExpanded: true,
    items: values
        .map((e) => ComboboxItem<String>(
              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

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

To add a tooltip to a widget, wrap it in a Tooltip widget:

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

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

You can create a Dialog with the widget ContentDialog:

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

You can display the dialog as an overlay by calling the function showDialog:

showDialog(
  context: context,
  builder: (context) {
    return ContentDialog(...);
  },
);

Delete File Dialog
Subscribe to App Service Dialog\

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.

Example

final flyoutController = FlyoutController();

Flyout(
  controller: flyoutController,
  contentWidth: 450,
  content: FlyoutContent(
    child: Text(
        'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.'),
  ),
  child: Button(
    child: Text('Open flyout'),
    onPressed: () {
      flyoutController.open = true;
    },
  ),
);

@override
void dispose() {
  flyoutController.dispose();
  super.dispose();
}

The code above produces the following:

Screenshots


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

Acrylic

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.
SizedBox(
  height: ...,
  width: ...,
  child: Acrylic(
          child: Button(
            child: Text('Mom it\'s me hehe <3'),
            onPressed: () {
              print('button inside acrylic pressed');
            }
          ),
        ),
),

Acrylic preview

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:

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

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

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 to format the dates. You can change the current locale to change formatting

Here's an example of how to create a basic date picker:

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

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

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:

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

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:

ProgressBar(value: 35)

Determinate Progress Bar

You can omit the value property to create an indeterminate progress bar:

Indeterminate Progress Bar

Indeterminate Progress Bar is a courtesy of @raitonubero. Show him some love

Here's an example of how to create a progress ring:

ProgressRing(value: 35)

Determinate Progress Ring

You can omit the value property to create an indeterminate progress ring:

Indeterminate Progress Ring

Both Indeterminate ProgressBar and Indeterminate ProgressRing is a courtesy of @raitonubero. Show him some love ❀

Scrollbar

A scrollbar thumb indicates which portion of a [ScrollView] is actually visible. Learn more

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 and this issues for more info.

Scrollbar Panning Indicator Traditional Scrollbar

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:

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

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

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

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:

InfoLabel(
  label: 'Colors',
  child: ComboBox(...),
),

The code above produces the following:

InfoHeader Preview

Some widgets, such as ComboBox and TextBox, already come with a header property, so you can use them easily with them:

ComboBox(
  header: 'Control header',
  ...
)

This will produce the same as the image above.

Mobile Widgets

Widgets with focus on mobile. Based on the official documentation and source code for iOS and 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

Here's an example of how to display a bottom sheet:

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

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:

Chip(
  image: CircleAvatar(size: 12.0),
  text: Text('Chip'),
),
Chip.selected(
  image: FlutterLogo(size: 14.0),
  text: Text('Chip'),
)

Light Chips

Dark Chips

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:

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

Dark PillButtonBar

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:

showSnackbar(
  context,
  Snackbar(
    content: Text('A new update is available!'),
  ),
);

Snackbar Example


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
DropdownButton Combobox
- 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

Contribution

Feel free to file an issue if you find a problem or make pull requests.

All contributions are welcome :)

Acknowledgements

Irrespective of order, thanks to all the people below for contributing with the project. It means a lot to me :)

Comments
  • FluentUI Widgets Localization Support

    FluentUI Widgets Localization Support

    This PR adds support for onboard widgets localization support using intl package.

    Related with https://github.com/bdlukaa/fluent_ui/issues/213

    I've included a wide list of most spoken languages: ~~Arabic, Bengali, English, Spanish, French, Hindi, Indonesian, Portuguese, Russian and Simplified Chinese using Google Translate.~~ UPDATE: ⭐️ @bdlukaa and I (@henry2man) agreed that we prefer confirmed localizations vs "Google Translate" ones, so we need some help!

    How to contribute:

    • Get any of the already verified translation files like https://github.com/bdlukaa/fluent_ui/pull/216/files#diff-d38a1072799c0e0b8936fb54ea8bcc732c76241afed954d025815eb8369aad32R1-R27
    • Get the file you want to review: for example: https://github.com/bdlukaa/fluent_ui/pull/216/files#diff-613ee02ebb6ae3d3300afd6f00fe30255b8e37336c5d89170bbbf9cee108c1daR1-R27
    • Review and copy the contents of your reviewed file and leave a comment!
    • Then we will merge them into the branch πŸ‘πŸ»

    Current status:

    • [x] English βœ…
    • [X] Spanish βœ… - Verified by @henry2man
    • [X] French βœ… - Already verified by @WinXaito
    • [x] Portuguese βœ… - Reviewed by @bdlukaa
    • [x] Russian βœ… - Reviewed by @raitonoberu
    • [x] German βœ… - Reviewed by @Larsb24
    • [x] Hindi βœ… - Reviewed by @alexmercerind
    • [x] Simplified Chinese βœ… - Reviewed by @zacksleo
    • Other languages are welcomed!

    I've added detailed instructions for adding new localizations in the README.md: https://github.com/bdlukaa/fluent_ui/pull/216/files?short_path=b335630#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5


    If you run the example app and change the language of the browser, the corresponding messages are shown.

    Also I've done some little tweaks to shortcuts label implementation. AFAIK they aren't strictly that needs a translation (Ctrl or Cmd are standards names for corresponding keys).

    Please take notice of changes here: https://github.com/bdlukaa/fluent_ui/pull/216/files#diff-3705042816f3bd9d24304192811bed9d5104fa569a36f063a4166cfea97b845aR376-R377 and here https://github.com/bdlukaa/fluent_ui/pull/216/files#diff-8b7e9df87668ffa6a04b32e1769a33434999e54ae081c52e5d943c541d4c0d25R13-R14 in order to support multilanguage material localizations.

    Lastly, take a look at this List<Locale> constant: https://github.com/bdlukaa/fluent_ui/pull/216/files#diff-ccec5c5fa2c4d7bf6bc0e9748a8836c4bc5ff4a8c59461448d14047f6b242617R128-R139

    As the note says, this would be defined into DefaultFluentLocalizations but I cannot be able to make it work, so this was a working workarround.

    Pre-launch Checklist

    • [x] I have run dartfmt on all changed files
    • [x] I have updated CHANGELOG.md with my changes
    • [x] I have run "optimize/organize imports" on all changed files
    • [x] I have addressed all analyzer warnings as best I could
    • [x] I have added/updated relevant documentation
    • [ ] I have run flutter pub publish --dry-run and addressed any warnings
    opened by henry2man 20
  • [Question/Proposal] NavigationBody and state preservation

    [Question/Proposal] NavigationBody and state preservation

    I'm using NavigationView, a NavigationPane with menu entries and a NavigationBody.

    Looking into the source code, it looks that every time I change the main index the associated children[index] is rebuilt from scratch. But, in my case, I wish there were some kind of state preservation.

    I've added AutomaticKeepAliveClientMixin to every children but every time I change the page using the menu the previous state is lost.

    Is there a known way to preserve state when switching between menu options? If not, I think it would be great to add this option to NavigationBody.

    At the moment I think I am going to try to use a PageView, where I do have experience maintaining the state between changes.

    Here it is a sample code:

    import 'package:fluent_ui/fluent_ui.dart';
    
    void main() {
      runApp(MainScreenTest());
    }
    
    class MainScreenTest extends StatefulWidget {
      MainScreenTest({Key? key}) : super(key: key);
    
      @override
      State<MainScreenTest> createState() => _MainScreenTestState();
    }
    
    class _MainScreenTestState extends State<MainScreenTest> {
      int index = 0;
    
      @override
      Widget build(BuildContext context) {
        return FluentApp(
          home: NavigationView(
              content: NavigationBody(
                index: index,
                children: [
                  StatefulPage(title: "Screen 1"),
                  StatefulPage(title: "Screen 2"),
                  StatefulPage(title: "Screen 3")
                ],
              ),
              pane: NavigationPane(
                selected: index,
                onChanged: (i) => setState(() => index = i),
                // displayMode: PaneDisplayMode.top,
                items: [
                  PaneItem(icon: Icon(FluentIcons.home), title: Text("Screen 1")),
                  PaneItem(icon: Icon(FluentIcons.read), title: Text("Screen 2")),
                  PaneItem(icon: Icon(FluentIcons.event), title: Text("Screen 3")),
                ],
              )),
        );
      }
    }
    
    class StatefulPage extends StatefulWidget {
      const StatefulPage({Key? key, required this.title}) : super(key: key);
      final String title;
    
      @override
      _StatefulPageState createState() => _StatefulPageState();
    }
    
    class _StatefulPageState extends State<StatefulPage>
        with AutomaticKeepAliveClientMixin {
      int counter = 0;
    
      @override
      bool get wantKeepAlive => true;
    
      @override
      Widget build(BuildContext context) {
        super.build(context);
        return Mica(
          child: Column(
            children: [
              Text(widget.title),
              Button(
                child: Text("Current: $counter - Press to increment!"),
                onPressed: () => setState(() => counter++),
              ),
            ],
          ),
        );
      }
    }
    
    
    invalid 
    opened by henry2man 19
  • DateTimePicker update

    DateTimePicker update

    Fixes #306

    Pre-launch Checklist

    • [x] I have updated CHANGELOG.md with my changes
    • [x] I have run "dart format ." on the project
    • [x] I have added/updated relevant documentation
    opened by bdlukaa 10
  • Theming buttons and pane items

    Theming buttons and pane items

    Hello, I was trying this library together with the flutter_acrylic library, and I tried to apply an "app-wide" mica effect.

    I got some pretty decent results, but encountered some limitations, especially when trying to theme elements like buttons, pane items, text input boxes etc..

    image

    It isn't clear whether it is possible to chage these colors, in the specific case of pill buttons and pane items I wanted to use a translucent shade of white for dark theme and a translucent shade of gray for light theme instead of the default opaque colors.

    enhancement 
    opened by alesimula 10
  • πŸ› Scrollbar This widget has been unmounted, so the State no longer has a context (and should be considered defunct).

    πŸ› Scrollbar This widget has been unmounted, so the State no longer has a context (and should be considered defunct).

    I get the following error message using a NavigationBody (which contains two views):

    The following assertion was thrown during a scheduler callback: This widget has been unmounted, so the State no longer has a context (and should be considered defunct).

    Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active. When the exception was thrown, this was the stack: #0 State.context. (package:flutter/src/widgets/framework.dart:909:9) #1 State.context (package:flutter/src/widgets/framework.dart:915:6) #2 RawScrollbarState._maybeTriggerScrollbar. (package:flutter/src/widgets/scrollbar.dart:1236:98) #3 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1143:15) #4 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1088:9) #5 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:996:5) #9 _invoke (dart:ui/hooks.dart:166:10) #10 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:270:5) #11 _drawFrame (dart:ui/hooks.dart:129:31) (elided 3 frames from dart:async)

    To be honest, I'm a little baffled. The error seems to be related to the NavigationBody (since I don't get the error when using a regular Material Scaffold). I tried adding AutomaticKeepAliveClientMixins to the views of the NavigationBody but that didn't help.

    Have any of you ever experienced something similar?

    bug blocked 
    opened by slimyjimmy 10
  • πŸ› TabView - shortcutsEnabled is not working

    πŸ› TabView - shortcutsEnabled is not working

    Describe the bug I'm not able to enable TabView shortcuts using shortcutsEnabled: true. I've tested both on Chrome and MacOS native.

    To Reproduce Steps to reproduce the behavior:

    1. Setup a TabView with shortcutsEnabled: true
    2. Create some tabs
    3. Press 1-8 (first to eighth tab), nothing happens
    4. Press 9 (last tab), nothing happens
    5. Press Ctrl + W (using MacOS), nothing happens

    Expected behavior As documented, the shortcuts lets the user navigate through the tabs.

    Screenshots N/A

    Additional context N/A

    bug blocked 
    opened by henry2man 9
  • How can i use PaneItemExpander on left side navigation pane. Any example use case for that??

    How can i use PaneItemExpander on left side navigation pane. Any example use case for that??

    i am working on the left side navigation pane. Now since item are many, so i want to group different PaneItems in different expanders. i've added an example for you to check. Please respond. Thankyou Screenshot 2022-11-05 at 4 27 36 PM

    opened by faisalmushtaq007 8
  • Implement command bars and dynamic overflow layout

    Implement command bars and dynamic overflow layout

    This is a first implementation of command bars as described in #231.

    A CommandBar control provides quick access to common tasks. This could be application-level or page-level commands.

    Refer to the spec.

    The current implementation does not implement the open/closed state, nor does it implement the secondary commands "more" button with dynamic overflow of items into the secondary commands menu.

    Also, during implementation of the example, I realized that I needed control over the primary and controller properties of the ListView inside of the TreeView, so this also adds these properties to TreeView.

    Here is what the examples look like with the various overflow behaviors:

    image

    And here is what it looks like alongside the large TreeView:

    image

    Pre-launch Checklist

    • [X] I have updated CHANGELOG.md with my changes
    • [X] I have run "optimize/organize imports" on all changed files
    • [X] I have added/updated relevant documentation
    opened by klondikedragon 8
  • FR: Dialog: Actions & Keybindings

    FR: Dialog: Actions & Keybindings

    I think the dialogues can be improved a bit.

    After working with other frameworks and component palettes I think we could have the following improvements.

    • Actions: Instead of having a wide-open "List <Widget>? actions" we could have some specific class like DialogAction that allows having a title, maybe an (optional) icon, an onTap / onClick callback and more importantly, attributes like isDefaultAction or isDestructiveAction. The presentation would be as is usually done now with Button elements but we would already have semantics and the ability to work better with the UI (the default action is highlighted in color, the destructive action is red, RTL support ...)

    • Related to the above, I miss some key combinations:

      • Esc to close the active dialog
      • Enter to "execute the isDefaultAction=true action callback"
      • Tab to rotate the focus between the available actions, always starting with the default action

    What do you think?

    enhancement blocked 
    opened by henry2man 8
  • build issue

    build issue

    /AppData/Local/Pub/Cache/hosted/pub.dartlang.org/fluent_ui-3.4.1/lib/src/controls/form/selection_controls.dart(35,52): error G366B1FB5: Too few positional arguments: 2 required, 1 given. [C:\Users\Jack Selvam\Downloads\fluent_ui-master (1)\fluent_ui-master\example\build\windows\flutter\flutter_assemble.vcxproj]

    Flutter 2.6.0-12.0.pre.825 β€’ channel master β€’ https://github.com/flutter/flutter.git Framework β€’ revision 6a3ea7eb83 (27 hours ago) β€’ 2021-11-23 17:38:02 -0800 Engine β€’ revision 635b4202d7 Tools β€’ Dart 2.16.0 (build 2.16.0-38.0.dev) β€’ DevTools 2.8.0

    bug good first issue blocked 
    opened by selvam920 8
  • πŸ› NavigationView UI artifacts on 125% DPI scaling

    πŸ› NavigationView UI artifacts on 125% DPI scaling

    This can also be observed on the example project, the app looks fine on 100% scaling, but a black line will appear between the navigation pane and the navigation body on 125% scaling; I've tried changing the clip behaviour to hardEdge and antiAliasWithSaveLayer to no avail

    image

    opened by alesimula 8
  • Further customization of compact navigation bar

    Further customization of compact navigation bar

    Is your feature request related to a problem? Please describe. The pictures below show that there are different styles of compact navigation. They have a different combination of the hamburger menu button, backward button, search button, and app icon. However, the current version of compact navigation cannot provide this customization.

    image image image

    Describe the solution you'd like customization by adding parameters like showBeforeLeadingAppIcon to choose whether the navigation tab appears on the left of the app Icon. Adding parameters like controlsOrder to order and show wanted controls(backward button, hamburger menu, search button etc.)

     pane: NavigationPane(
        selected: topIndex,
        onChanged: (index) => setState(() => topIndex = index),
        displayMode: displayMode,
        showBeforeLeadingAppIcon: true //bool parameter default with true, just like the media player
        //can remove the buttons by not adding to the controlsOrder List of the controlsOrder parameter
        controlsOrder: List<controlsOrder>[BackwardButton, HamburgerMenu, SearchButton] //the default order of list parameter, 
      ...
     )
    

    Describe alternatives you've considered N/A

    Additional context N/A

    enhancement 
    opened by Hopy-Jaden 0
  • Buttons and text box enhancement

    Buttons and text box enhancement

    Is your feature request related to a problem? Please describe.

    1. Parameters to resize the buttons (including filled buttons, icon buttons, toggle buttons, dropdown buttons, split buttons)
    2. ability to add a floating action button in a fluent style
    3. Ability to have leading and action parameter to the textbox and auto suggestion box

    Describe the solution you'd like

    Example with parameters width and height to change the size of buttons

    Button(
      child: const Text('A better button I guess),
      onPressed: disabled ? null : () => debugPrint('pressed button'),
      width: 20px
      height: 20px
    )
    

    Example of having floating action button (also have customization to the size of button?) WIndows 11 clock app: image

    FloatingActionButton(
      child: Row(
         Icon(FluentIcons.edit), 
         Icon(FluentIcons.add), 
      ),
      onPressed: disabled ? null : () => debugPrint('pressed button'),
      width: 20px
      height: 20px
    )
    

    Example of having action icon in auto suggestion box Old - Auto Suggestion box in Documentation: image New - Windows 11 microsoft store search box: image

    String? selectedCat;
    
    AutoSuggestBox<String>(
      items: cats.map((cat) {
        return AutoSuggestBoxItem<String>(
          value: cat,
          label: cat,
          onFocusChange: (focused) {
            if (focused) { 
              debugPrint('Focused $cat');
            }
          }
        );
      }).toList(),
      onSelected: (item) {
        setState(() => selected = item);
      },
      actions: Icons(FluentIcons.search),
    ),
    
    const cats = <String>[
      'Abyssinian',
      'Aegean',
      'American Bobtail',
      'American Curl',
      ...
    ];
    

    Describe alternatives you've considered N/A

    Additional context N/A

    waiting response 
    opened by Hopy-Jaden 1
  • Flyout submenu overlapπŸ›

    Flyout submenu overlapπŸ›

    Describe the bug The overlap is too much or not under controll.

    To Reproduce In the official example: image

    Just change the text to a long one:

      Widget _menuFlyoutWithSubItem() {
        return Flyout(
          placement: FlyoutPlacement.end,
          content: (context) {
            return MenuFlyout(
              items: [
                MenuFlyoutSubItem(
                  text: const Text('New Plain Text Document'),
                  items: [
                    MenuFlyoutItem(
                      text: const Text('Plain Text Document'),
                      onPressed: () {},
                    ),
                    MenuFlyoutItem(
                      text: const Text('Rich Text Document'),
                      onPressed: () {},
                    ),
                    MenuFlyoutItem(
                      text: const Text('Other formats...'),
                      onPressed: () {},
                    ),
                  ],
                ),
                MenuFlyoutItem(
                  text: const Text('Open'),
                  onPressed: () {},
                ),
                MenuFlyoutItem(
                  text: const Text('Save'),
                  onPressed: () {},
                ),
                const MenuFlyoutSeparator(),
                MenuFlyoutItem(
                  text: const Text('Exit'),
                  onPressed: () {},
                ),
              ],
            );
          },
          openMode: FlyoutOpenMode.press,
          child: Container(
            color: Colors.orange,
            padding: const EdgeInsets.symmetric(horizontal: 10.0),
            child: const Text('Click to show flyout with subitem'),
          ),
        );
      }
    

    Screenshots If applicable, add screenshots to help explain your problem. flyout_with_subitem_overlap

    Additional context Add any other context about the problem here.

    Thank you.

    bug 
    opened by kevinxxq 0
  • Windows drag when TitleBarStyle.hidden

    Windows drag when TitleBarStyle.hidden

    Describe the solution you'd like I would like to use DragToMoveArea widget provided by windowManager so that when title bar is hidden I can drag with FluentApp navigation bar.

    Describe alternatives you've considered Currently I am using it like as below, now user has to drag title text to drag window.

    appBar: NavigationAppBar(
              height: 40,
              leading: const Icon(FluentIcons.a_a_d_logo),
              title: const DragToMoveArea(child: Text("FFMpeg Testing")),
              automaticallyImplyLeading: false,
              actions:
                  Row(mainAxisAlignment: MainAxisAlignment.end, children: const [
                if (!kIsWeb) WindowButtons(),
              ]),
            ),
    

    Additional context NavigationAppBar can be reconstructed to have a argument which will but its content inside DragToMoveArea, to move window.

    opened by abhay-s-rawat 4
  • Wrap TabView content in a FocusTrap

    Wrap TabView content in a FocusTrap

    Fixes #648

    Pre-launch Checklist

    • [ ] I have updated CHANGELOG.md with my changes
    • [x] I have run "dart format ." on the project
    • [ ] I have added/updated relevant documentation
    opened by bdlukaa 0
  • changes borderRadius at lib/src/controls/navigation/navigation_view/p…

    changes borderRadius at lib/src/controls/navigation/navigation_view/p…

    …ane_items.dart

    Pre-launch Checklist

    • [ ] I have updated CHANGELOG.md with my changes
    • [ ] I have run "dart format ." on the project
    • [ ] I have added/updated relevant documentation
    invalid 
    opened by soumyajitdas365 1
Releases(v4.1.2)
  • v4.1.2(Dec 12, 2022)

    • PageHeader now gives appropriate bounds to its commandBar (#642)
    • Ensure NavigationView body state is not lost when resizing window
    • Ensure TabView' tabs' state are not lost when changing selected tab (#607)
    • Do not block text field tap (#343)
    • Do not duplicate trailing in FlyoutContent (#487)

    What's Changed

    • updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/645
    • Add uk localization by @vadimbarda in https://github.com/bdlukaa/fluent_ui/pull/647

    New Contributors

    • @vadimbarda made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/647

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v4.1.1...v4.1.2

    Source code(tar.gz)
    Source code(zip)
  • v4.1.1(Dec 8, 2022)

    • Ensure acrylic is updated only if it's mounted (#634)
    • Ensure the provided startYear and endYear in DateTime are used properly (#627)
    • Fix left arrow key not moving to parent item on collapsed TreeViewItem (#632)
    • Added NavigationPane.scrollBehavior (#640)
    • Added CommandBarCard.borderRadius (#641)
    • Ensure combobox scroll controller has a client attached before using it (#620)
    • Correctly use TextFormBox.initialValue
    • Added TreeViewState.toggleItem, which toggles the item expanded state (#493)
    • Ensure NavigationView pane items are brought into view when selected
    • Fixed TreeView selection state behavior for items that are not expanded (#578)
    • Added support for Romanian language (#602)
    • Ensure the body state in NavigationView is properly preserved (#607)
    • BREAKING Renamed ExpanderState.open to ExpanderState.isExpanded
    • The same identifier is no longer used for every Expander (#596)
    • Ensure the TabView scroll controller has clients before using it (#615)
    • TabView now waits a time to resize after closed (#617)
    • ToggleButton border width is uniform (#610)

    What's Changed

    • Fix TreeView selection state for unexpanded items by @klondikedragon in https://github.com/bdlukaa/fluent_ui/pull/597
    • Add suport for Romanian language by @antoniocranga in https://github.com/bdlukaa/fluent_ui/pull/602
    • Use PageView to build the view content by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/607
    • Remove Expander identifier by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/609
    • Bug fixes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/618
    • Added Bahasa Indonesia by @ekasetiawans in https://github.com/bdlukaa/fluent_ui/pull/625
    • Fix left arrow key not moving to parent item on collapsed TreeViewItem by @robkri in https://github.com/bdlukaa/fluent_ui/pull/636
    • Ensure the provided startYear and endYear in DateTime are used properly by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/637
    • Acrylic state fix by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/638

    New Contributors

    • @antoniocranga made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/602
    • @ekasetiawans made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/625

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v4.0.3...v4.1.1

    Source code(tar.gz)
    Source code(zip)
  • v4.0.3(Oct 22, 2022)

    • NavigationView scrollbar can now be dragged (#472)
    • PaneItemHeader can now be used inside a PaneItemExpander (#575)
    • InfoBadge no longer overflows when transitioning from compact mode to open mode in NavigationView (#588)

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v4.0.2...v4.0.3

    Source code(tar.gz)
    Source code(zip)
  • v4.0.2(Oct 13, 2022)

    • Add NavigationView.paneBodyBuilder for customization of widget built for body of pane. (#548)
    • Fixed NavigationAppBar unnecessary leading icon when no pane is provided in NavigationView (#551)
    • Added NavigationView.minimalPaneOpen and, with it, the possibility to open minimal pane programatically (#564)
    • Assign an index to pane item expanders (#566)
    • Update NavigationView compact mode transition
    • TreeView updates (#555):
      • BREAKING Added TreeViewItemInvokeReason parameter to TreeView.onItemInvoked and TreeViewItem.onInvoked.
      • Fix clearing out selection state on initial state build in certain cases for a single selection mode tree view.
      • Fix single selection mode to properly deselect hidden child items when selecting a collapsed parent item.
      • Add TreeView.includePartiallySelectedItems so that items who have children with a mixed selection state will be included in the onSelectionChanged callback.
      • Add TreeView.deselectParentWhenChildrenDeselected optional behavior so that parent items can remain selected when all of their children are deselected.
      • Add TreeViewItem.setSelectionStateForMultiSelectionMode helper method and [TreeViewItem].selectedItems extension method, to make it easier for application code to programmatically change selection state of items in a multi-selection mode tree view.
    • Added support for Uzbek language

    What's Changed

    • Add support for Hebrew language by @YehudaKremer in https://github.com/bdlukaa/fluent_ui/pull/550
    • Fix #544: TimePicker popup gets cut on a small application by @YehudaKremer in https://github.com/bdlukaa/fluent_ui/pull/547
    • fix: PaneItemAction tap event called twice by @MasterHiei in https://github.com/bdlukaa/fluent_ui/pull/546
    • I have added Uzbek language by @bobobekturdiyev in https://github.com/bdlukaa/fluent_ui/pull/563
    • TreeView selection state fixes by @klondikedragon in https://github.com/bdlukaa/fluent_ui/pull/556
    • Add NavigationView.paneBodyBuilder by @klondikedragon in https://github.com/bdlukaa/fluent_ui/pull/553
    • Fix unnecessary NavigationAppBar leading icon when no NavigationPane was provided by @DMouayad in https://github.com/bdlukaa/fluent_ui/pull/551
    • [Example Project] Colorful Code Snippets by @YehudaKremer in https://github.com/bdlukaa/fluent_ui/pull/567
    • NavigationView updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/569

    New Contributors

    • @MasterHiei made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/546
    • @bobobekturdiyev made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/563
    • @DMouayad made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/551

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v4.0.1...v4.0.2

    Source code(tar.gz)
    Source code(zip)
  • v4.0.1(Sep 28, 2022)

    • PaneItemAction.body is no longer required (#545)
    • Added DropDownButton.onOpen and DropDownButton.onClose callbacks (#537)
    • Ensure MenuFlyoutItem.onPressed is called after the flyout is closed if DropDownButton.closeAfterClick is true (#520)
    • Ensure the TimePicker and DatePicker popups will fit if the screen is small (#544)
    • Do not apply padding to NavigationAppBar.leading (#539)
    • Added AutoSuggestBox.noResultsFoundBuilder (#542)
    • Added AutoSuggestBox.inputFormatters (#542)

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v4.0.0...v4.0.1

    Source code(tar.gz)
    Source code(zip)
  • v4.0.0(Sep 25, 2022)

    • BREAKING Removed NavigationBody. Use PaneItem.body instead (#510/#531):
      Before:

      NavigationView(
        pane: NavigationPane(
          items: [
            PaneItem(icon: Icon(FluentIcons.add)),
            PaneItem(icon: Icon(FluentIcons.add)),
            PaneItem(icon: Icon(FluentIcons.add)),
          ],
        ),
        content: NavigationBody(
          children: [
            _Item1(),
            _Item2(),
            _Item3(),
          ],
        ),
      ),
      

      Now:

      NavigationView(
        ...
        pane: NavigationPane(
          items: [
            PaneItem(
              icon: Icon(FluentIcons.add),
              body: _Item1(),
            ),
            PaneItem(
              icon: Icon(FluentIcons.add),
              body: _Item2(),
            ),
            PaneItem(
              icon: Icon(FluentIcons.add),
              body: _Item3(),
            ),
          ],
        ),
      ),
      

      Or if you don't have a pane, you can use the content like the following:

      NavigationView(
        content: ScaffoldPage(
          header: PageHeader(
            title: titleRow,
          ),
          content: child,
        ),
      ),
      

      either one attribute of pane or content must not be null

      Use NavigationView.transitionsBuilder to create custom transitions

    • Added PaneItem.onTap (#533)

    • BREAKING AutoSuggestBox dynamic type support (#441):

      Before:

      AutoSuggestBox(
        items: cats.map((cat) {
          return AutoSuggestBoxItem(
            value: cat,
            onFocusChange: (focused) {
              if (focused) debugPrint('Focused $cat');
            }
          );
        }).toList(),
        onSelected: (item) {
          setState(() => selected = item);
        },
      ),
      

      Now:

      AutoSuggestBox<String>(
        items: cats.map((cat) {
          return AutoSuggestBoxItem<String>(
            value: cat,
            label: cat,
            onFocusChange: (focused) {
              if (focused) debugPrint('Focused \$cat');
            }
          );
        }).toList(),
        onSelected: (item) {
          setState(() => selected = item);
        },
      ),
      
    • Compact pane is no longer toggled when item is selected (#533). To toggle it programatically, use NavigationViewState.toggleCompactOpenMode when an item is tapped

    • Dynamic header height for open pane (#530)

    • Fixes memory leaks on NavigationView

    • TreeView updates:

      • All items of the same depth level now have the same indentation. Before, only items with the same parent were aligned.

      • The hitbox for the expand icon of each item now uses the item's full height and is three times wider than the actual icon. This corresponds to the implementation in the explorer of Windows 10/11.

      • You can now choose whether the items of a TreeView should use narrow or wide spacing.

      • Do not invoke the tree view item on secondary tap (#526)

      • BREAKING TreeView.onSecondaryTap is now a (TreeViewItem item, TapDownDetails details) callback: Before:

        TreeView(
          ...,
          onSecondaryTap: (item, offset) async {}
        ),
        

        Now:

        TreeView(
          ...,
          onSecondaryTap: (item, details) {
            final offset = details.globalPosition;
          },
        )
        
      • Expand/collape items with right and left arrow keys, respectively (#517)

      • Added TreeView.onItemExpandToggle and TreeViewItem.onExpandToggle (#522)

    What's Changed

    • Add italian (IT) localization by @patricknicolosi in https://github.com/bdlukaa/fluent_ui/pull/337
    • add FlyoutOpenMode secondaryPress by @nidetuzi in https://github.com/bdlukaa/fluent_ui/pull/334
    • Add macOS support to example project by @h3x4d3c1m4l in https://github.com/bdlukaa/fluent_ui/pull/339
    • Add Dutch (nl) l10n support by @h3x4d3c1m4l in https://github.com/bdlukaa/fluent_ui/pull/338
    • Fix incorrect documentation for waitDuration on Tooltip by @harysuryanto in https://github.com/bdlukaa/fluent_ui/pull/349
    • Add Traditional Chinese (zh_Hant) localization by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/340
    • Show menu button on minimal mode when display mode is auto by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/350
    • Fluent app review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/351
    • TextBox review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/352
    • Add Persian by @xmine64 in https://github.com/bdlukaa/fluent_ui/pull/354
    • Add AutoSuggestBox.form by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/353
    • UI updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/355
    • Retry add Korean (ko) from #267 by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/358
    • add korean(ko) localization by @dubh3 in https://github.com/bdlukaa/fluent_ui/pull/267
    • Date/Time pickers review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/357
    • Color updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/368
    • Fix flutter.dev link by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/378
    • Added Malay (ms) localizations to l10n by @jonsaw in https://github.com/bdlukaa/fluent_ui/pull/380
    • Updated DropDownButton documentation by @tobiasht in https://github.com/bdlukaa/fluent_ui/pull/374
    • Remove header space when null by @Alphamplyer in https://github.com/bdlukaa/fluent_ui/pull/359
    • AutoSuggestBox updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/389
    • Polish translations by @madik7 in https://github.com/bdlukaa/fluent_ui/pull/388
    • NavigationView updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/390
    • Add supported language in README.md by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/391
    • TextBox review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/395
    • [wip] Example app rework by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/397
    • README improvements by @phorcys420 in https://github.com/bdlukaa/fluent_ui/pull/400
    • Example app update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/407
    • add context menu by @nidetuzi in https://github.com/bdlukaa/fluent_ui/pull/398
    • DateTimePicker update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/406
    • Update Dutch translations by @h3x4d3c1m4l in https://github.com/bdlukaa/fluent_ui/pull/410
    • Add date time localization in Chinese (both Simplified and Traditional) by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/416
    • add japanese localization by @chari8 in https://github.com/bdlukaa/fluent_ui/pull/408
    • Tiles update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/422
    • Navigation view updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/425
    • Tabview rework by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/427
    • Flyouts size by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/435
    • Added Czech localization [cs] by @morning4coffe-dev in https://github.com/bdlukaa/fluent_ui/pull/439
    • Top navigation update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/440
    • Add Hungarian language by @RedyAu in https://github.com/bdlukaa/fluent_ui/pull/442
    • Fix incorrect time display format in TimePicker in Chinese by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/445
    • Padding by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/447
    • Use trackColor and add inner padding for Scrollbar by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/356
    • Rework AutoSuggestBox by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/450
    • Comboboxes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/454
    • Close overlay when size changes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/458
    • Public PaneItemKeys for support custom PaneItem by @ccl0326 in https://github.com/bdlukaa/fluent_ui/pull/453
    • Correctly check for supported locales by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/459
    • Lazy loading asb by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/460
    • Update README's ScaffoldPage example by @loic-sharma in https://github.com/bdlukaa/fluent_ui/pull/466
    • Some bug fixes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/469
    • tr localization by @timurturbil in https://github.com/bdlukaa/fluent_ui/pull/470
    • Changed source code of second combobox by @DobreRadu in https://github.com/bdlukaa/fluent_ui/pull/465
    • Some fixes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/480
    • Fix dropdown button padding issue by @loic-sharma in https://github.com/bdlukaa/fluent_ui/pull/476
    • Interactive code snippet by @YehudaKremer in https://github.com/bdlukaa/fluent_ui/pull/479
    • Combobox updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/481
    • Pane item expander by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/299
    • Update Arabic translations by @dmakwt in https://github.com/bdlukaa/fluent_ui/pull/488
    • Live documentation by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/494
    • Some fixes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/495
    • Focus review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/497
    • fix: changelog scrollbar wrong position by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/491
    • [localizations] S renamed to FluentS by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/503
    • Fix progress indicator animation speed affected by frame rate by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/502
    • Make the animation of the progress ring consistent with FluentUI by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/505
    • Fix #482 and support to save and restore the open state by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/501
    • Theme change by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/507
    • TreeView: Fix indentation, fix size of expand-icon's hitbox, add option to choose spacing of item content by @robkri in https://github.com/bdlukaa/fluent_ui/pull/515
    • Fix bug: The disabled TextBox blocks the focus traversal by pressing SHIFT+Tab keys by @hnbsoft in https://github.com/bdlukaa/fluent_ui/pull/521
    • Use flutter gen-l10n command instead of flutter intl plugin to generate localizations by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/518
    • Deferred components by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/510
    • Revert attribute content and add assert with pane attribute by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/531
    • AutoSuggestBox dynamic T by @henry2man in https://github.com/bdlukaa/fluent_ui/pull/509
    • TreeView: onExpand-callback by @robkri in https://github.com/bdlukaa/fluent_ui/pull/543

    New Contributors

    • @patricknicolosi made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/337
    • @nidetuzi made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/334
    • @harysuryanto made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/349
    • @rk0cc made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/340
    • @xmine64 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/354
    • @dubh3 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/267
    • @jonsaw made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/380
    • @Alphamplyer made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/359
    • @madik7 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/388
    • @phorcys420 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/400
    • @chari8 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/408
    • @morning4coffe-dev made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/439
    • @RedyAu made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/442
    • @ccl0326 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/453
    • @loic-sharma made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/466
    • @timurturbil made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/470
    • @DobreRadu made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/465
    • @YehudaKremer made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/479
    • @DemoJameson made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/491
    • @robkri made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/515
    • @hnbsoft made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/521

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.12.0...v4.0.0

    Source code(tar.gz)
    Source code(zip)
  • v4.0.0-pre.4(Sep 2, 2022)

    • DisableAcrylic now fully disable transparency of its decendents Acrylics (#468)
    • Do not interpolate between infinite constraints on TabView (#430)
    • Do not rebuild the TimePicker popup when already rebuilding (#437)
    • ToggleSwitch updates:
      • Use the correct color for DefaultToggleSwitchThumb (#463)
      • Added ToggleSwitch.leadingContent, which positions the content before the switch (#464)
      • Added ToggleSwitch.thumbBuilder, which builds the thumb based on the current state
    • Added TextChangedReason.cleared, which is called when the text is cleared by the user in an AutoSuggestBox (#461)
    • Call AutoSuggestBox.onChanged when an item is selected using the keyboard (#483)
    • Tooltip overlay is now ignored when hovered (#443)
    • Do not add unnecessary padding in DropdownButton (#475)
    • ComboBox updates:
      • BREAKING Renamed Combobox to ComboBox
      • BREAKING Renamed ComboboxItem to ComboBoxItem
      • BREAKING Renamed ComboBox.backgroundColor to ComboBox.popupColor
      • Implement EditableComboBox, a combo box that accepts items that aren't listed (#244)
      • ComboBox.isExpanded: false now correctly sets the button width (#382)
      • ComboBox's items height are correctly calculated, as well as initial scroll offset (#472)
      • BREAKING ComboBox.disabledHint was renamed to ComboBox.disabledPlaceholder
      • Added ComboBoxFormField and EditableComboBoxFormField (#373)
      • ComboBox.comboBoxColor is now correctly applied (#468)
      • ComboBox popup can't be opened if disabled
    • Implemented PaneItemExpander (#299)
    • TimePicker and DatePicker popup now needs a minimum width of 260 (#494)
    • Correctly align NavigationAppBar content (#494)
    • BREAKING Added InfoLabel.rich. InfoLabel is no longer a constant contructor (#494)
    • Always add GlobalMaterialLocalizations above ReorderableListView (#492)
    • BREAKING Removed ContentDialog.backgroundDismiss. Use showDialog.barrierDismissable (#490)
    • Reviewed focus (#496)
      • DatePicker and TimePicker now show the focus highlight. Their popup now can be controlled using the keyboard
      • NavigationBody now uses a FocusTraversalGroup to handle focus This means the the content of the body will be fully traversed before moving on to another widget or group of widgets. Learn more
      • TreeViewItem now shows the focus highlight. They can also be selected using the keyboard
      • Expander now shows the focus highlight
    • Progress Indicators velocity is no longer affected by device frame rate (#502)
    • Added AutoSuggestBox.enabled (#504)
    • Correctly keep the NavigationView animation state (cf0fae1 ,bd89ba6)
    • Calculate selected for all parents as soon as the TreeView is built

    What's Changed

    • Update README's ScaffoldPage example by @loic-sharma in https://github.com/bdlukaa/fluent_ui/pull/466
    • Some bug fixes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/469
    • tr localization by @timurturbil in https://github.com/bdlukaa/fluent_ui/pull/470
    • Changed source code of second combobox by @DobreRadu in https://github.com/bdlukaa/fluent_ui/pull/465
    • Some fixes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/480
    • Fix dropdown button padding issue by @loic-sharma in https://github.com/bdlukaa/fluent_ui/pull/476
    • Interactive code snippet by @YehudaKremer in https://github.com/bdlukaa/fluent_ui/pull/479
    • Combobox updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/481
    • Pane item expander by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/299
    • Update Arabic translations by @dmakwt in https://github.com/bdlukaa/fluent_ui/pull/488
    • Live documentation by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/494
    • Some fixes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/495
    • Focus review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/497
    • fix: changelog scrollbar wrong position by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/491
    • [localizations] S renamed to FluentS by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/503
    • Fix progress indicator animation speed affected by frame rate by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/502
    • Make the animation of the progress ring consistent with FluentUI by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/505
    • Fix #482 and support to save and restore the open state by @DemoJameson in https://github.com/bdlukaa/fluent_ui/pull/501
    • Theme change by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/507

    New Contributors

    • @loic-sharma made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/466
    • @timurturbil made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/470
    • @DobreRadu made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/465
    • @YehudaKremer made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/479
    • @DemoJameson made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/491

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v4.0.0-pre.3...v4.0.0-pre.4

    Source code(tar.gz)
    Source code(zip)
  • v4.0.0-pre.3(Aug 13, 2022)

    • NavigationView mode fixes:

      • When top overflow menu is opened, PaneItemHeader no longer throws an unsupported error
      • When on top mode, PaneItemHeader is properly aligned to the other items.
      • Added NavigationPaneThemeData.headerPadding, which is applied to PaneItemHeader on open, compact and minimal mode. It defaults to 10 pixels at the top
      • BREAKING PaneItem.getPropertyFromTitle is now widget.getProperty:

      Before: getPropertyFromTitle<TextStyle>()

      Now: title.getProperty<TextStyle>()

      This was changed because the properties of PaneItemHeader needed to be accessed, but the old version only supported to get the properties of PaneItem.title. It can be called on a Text, RichText or in an Icon widget

      • InheritedNavigationView is now accessible on the top overflow menu
      • Added NavigationPaneThemeData.selectedTopTextStyle and NavigationPaneThemeData.unselectedTopTextStyle, which is applied to the items on top mode
      • Fixed content focus on minimal mode
      • Updated default transitions for top mode: HorizontalSlidePageTransition
    • Fix incorrect translation of TimePicker in Traditional Chinese.

    • Added ScaffoldPage.resizeToAvoidBottomInset (#444)

    • Consider view padding for NavigationAppBar

    • Scrollbar updates (#356):

      • Correctly use backgroundColor to display the track color
      • Added padding and hoveringPadding
      • Check if animation is disposed before using it (#446)
    • Update AutoSuggestBox (#450):

      • Added .enableKeyboardControls. When true, items can be selected using the keyboard (#19)
      • Added .sorter, which lets you set a custom sort function for the suggestions. AutoSuggestBox.defaultItemSorter is used by default
      • Overlay's height is now correctly calculated based on the screen size. It no longer overlaps the screen. viewPadding is also taken into consideration
      • Close the overlay if the textbox width is changes (#456)
      • .items can be dynamically loaded (#387)
      • BREAKING .items is now a List<AutoSuggestBoxItem>: Before:
      AutoSuggestBox(
        items: [
          'Cat',
          'Dog',
          'Bird',
          'Horse',
        ],
        ...
      ),
      

      Now:

      AutoSuggestBox(
        items: [
          'Cat',
          'Dog',
          'Bird',
          'Horse',
        ].map((animal) {
          return AutoSuggestBoxItem(
            value: animal, // this takes a String
            child: Text('Animal $animal'), // this takes a Widget. If null, value is displayed as a text
            onFocusChange: (focused) {
              // this is called when the item is focused using the keyboard arrow keys
              if (focused) debugPrint('Focused animal $animal');
            },
            onSelected: () {
              // this is called when the item is selected
              debugPrint('Selected animal $animal');
            }
          );
        }).toList(),
        ...
      )
      
    • Combobox updates (#454):

      • Popup size is now correctly calculated (#413)
      • Correctly clip the popup while performing the animation (#379)
    • Correctly check if a locale is supported (#455)

    Release candidate 2

    • Remove whitespace on ContentDialog if title is omitted (#418)
    • Apply correct color to the Date and Time Pickers button when selected (#415, #417)
    • Expose more useful properties to AutoSuggestBox (#419)
    • BREAKING PopupContentSizeInfo was renamed to ContentSizeInfo
    • Reworked ListTile (#422):
      • BREAKING Removed TappableListTile
      • Added support for single and multiple selection. Use ListTile.selectable (#409)
      • Added focus support
      • Use the Win UI design
    • Reviewed animation durations (#421)
      • BREAKING Removed .animationDuration and .animationCurve from ScrollbarThemeData
      • Added expandContractAnimationDuration and contractDelay to ScrollbarThemeData
    • NavigationPaneSize constraints are now correctly applied when in open mode (#336)
    • NavigationIndicator can't be invisble anymore when animation is stale (#335)
    • Updated TabView:
      • BREAKING Removed TabView.bodies. Now, Tab.body is used. Before

        TabView(
          tabs: [
            Tab(text: Text('Tab 1')),
            Tab(text: Text('Tab 2')),
          ],
          bodies: [
            Tab1Body(),
            Tab2Body(),
          ],
        ),
        

        Now:

        TabView(
          tabs: [
            Tab(
              text: Text('Tab 1'),
              body: Tab1Body(),
            ),
            Tab(
              text: Text('Tab 2'),
              body: Tab2Body(),
            ),
          ],
        ),
        
      • Updated TabView tabs' constraints and padding

      • Fixed tab width when TabWidthBehavior is compact

      • FlutterLogo is no longer the default tab Icon

    • DropDownButton menu is now sized correctly according to the screen size
    • If there isn't enough space to display the menu on the preferred position, Flyout will display on the opposite position (#435)

    Release candidate 1

    • Exposed private properties that makes it easier to create custom panes for NavigationView (#365):

      • kCompactNavigationPaneWidth
      • kOpenNavigationPaneWidth
      • NavigationPane.changeTo
      • PaneItem.getPropertyFromTitle
    • PaneScrollConfiguration is now applied to custom pane on NavigationView

    • Added NavigationViewState.displayMode. It results in the current display mode used by the view, including the automatic display mode (#360):

      // Define the key
      final key = GlobalKey<NavigationViewState>();
      
      NavigationView(
        // pass the key to the view
        key: key,
        ...,
      )
      
      // Get the current display mode. Note that, in order to find out the automatic display mode,
      // the widget must have been built at least once
      final PaneDisplayMode currentDisplayMode = key.currentState.displayMode;
      
    • The app bar action no longer overflow when minimal pane/compact overlay is open (#361)

    • Update AutoSuggestBox:

      • It now uses Acrylic, but it can be disabled using DisableAcrylic
      • TextChangedReason.suggestionChoosen is now called properly
    • Updated TextBox:

      • TextBox colors were updated to match the Win 11 design.
      • Fluent Text Selection Control now make use of Acrylic. Its items were also updated
    • Updated pickers (#406):

      • If selected is null, a placeholder text is shown (#306)
      • Added new localization messages: hour, minute, AM, PM, month, dayand year.
      • BREAKING Removed .hourPlaceholder, .minutePlaceholder, .amText, .pmText from TimePicker. It was replaced, respectivelly, by the hour, minute, AM, PM localization messages
      • On DatePicker, it's now possible to change the order of the fields:
      DatePicker(
        ...,
        fieldOrder: [
          DatePickerField.day,
          DatePickerField.month,
          DatePickerField.year,
        ],
      )
      

      The fields are ordered based on the current locale by default

      • On DatePicker, the day and year fields are now formatted based on the current locale (getDateOrderFromLocale)
    • Update Slider (#405):

      • Added .thumbRadius and .trackHeight to SliderThemeData
      • The active track now isn't taller than the inactive track

    What's Changed

    • Add italian (IT) localization by @patricknicolosi in https://github.com/bdlukaa/fluent_ui/pull/337
    • add FlyoutOpenMode secondaryPress by @nidetuzi in https://github.com/bdlukaa/fluent_ui/pull/334
    • Add macOS support to example project by @h3x4d3c1m4l in https://github.com/bdlukaa/fluent_ui/pull/339
    • Add Dutch (nl) l10n support by @h3x4d3c1m4l in https://github.com/bdlukaa/fluent_ui/pull/338
    • Fix incorrect documentation for waitDuration on Tooltip by @harysuryanto in https://github.com/bdlukaa/fluent_ui/pull/349
    • Add Traditional Chinese (zh_Hant) localization by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/340
    • Show menu button on minimal mode when display mode is auto by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/350
    • Fluent app review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/351
    • TextBox review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/352
    • Add Persian by @xmine64 in https://github.com/bdlukaa/fluent_ui/pull/354
    • Add AutoSuggestBox.form by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/353
    • UI updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/355
    • Retry add Korean (ko) from #267 by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/358
    • add korean(ko) localization by @dubh3 in https://github.com/bdlukaa/fluent_ui/pull/267
    • Date/Time pickers review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/357
    • Color updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/368
    • Fix flutter.dev link by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/378
    • Added Malay (ms) localizations to l10n by @jonsaw in https://github.com/bdlukaa/fluent_ui/pull/380
    • Updated DropDownButton documentation by @tobiasht in https://github.com/bdlukaa/fluent_ui/pull/374
    • Remove header space when null by @Alphamplyer in https://github.com/bdlukaa/fluent_ui/pull/359
    • AutoSuggestBox updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/389
    • Polish translations by @madik7 in https://github.com/bdlukaa/fluent_ui/pull/388
    • NavigationView updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/390
    • Add supported language in README.md by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/391
    • TextBox review by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/395
    • [wip] Example app rework by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/397
    • README improvements by @phorcys420 in https://github.com/bdlukaa/fluent_ui/pull/400
    • Example app update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/407
    • add context menu by @nidetuzi in https://github.com/bdlukaa/fluent_ui/pull/398
    • DateTimePicker update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/406
    • Update Dutch translations by @h3x4d3c1m4l in https://github.com/bdlukaa/fluent_ui/pull/410
    • Add date time localization in Chinese (both Simplified and Traditional) by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/416
    • add japanese localization by @chari8 in https://github.com/bdlukaa/fluent_ui/pull/408
    • Tiles update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/422
    • Navigation view updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/425
    • Tabview rework by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/427
    • Flyouts size by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/435
    • Added Czech localization [cs] by @morning4coffe-dev in https://github.com/bdlukaa/fluent_ui/pull/439
    • Top navigation update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/440
    • Add Hungarian language by @RedyAu in https://github.com/bdlukaa/fluent_ui/pull/442
    • Fix incorrect time display format in TimePicker in Chinese by @rk0cc in https://github.com/bdlukaa/fluent_ui/pull/445
    • Padding by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/447
    • Use trackColor and add inner padding for Scrollbar by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/356
    • Rework AutoSuggestBox by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/450
    • Comboboxes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/454
    • Close overlay when size changes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/458
    • Public PaneItemKeys for support custom PaneItem by @ccl0326 in https://github.com/bdlukaa/fluent_ui/pull/453
    • Correctly check for supported locales by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/459
    • Lazy loading asb by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/460

    New Contributors

    • @patricknicolosi made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/337
    • @nidetuzi made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/334
    • @harysuryanto made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/349
    • @rk0cc made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/340
    • @xmine64 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/354
    • @dubh3 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/267
    • @jonsaw made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/380
    • @Alphamplyer made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/359
    • @madik7 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/388
    • @phorcys420 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/400
    • @chari8 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/408
    • @morning4coffe-dev made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/439
    • @RedyAu made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/442
    • @ccl0326 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/453

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.12.0...v4.0.0-pre.3

    Source code(tar.gz)
    Source code(zip)
  • v3.12.0(May 13, 2022)

    What's Changed

    • Build on Flutter 3.0.0 by @h3x4d3c1m4l in https://github.com/bdlukaa/fluent_ui/pull/325
    • Bump Version + flutter_lints by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/333

    New Contributors

    • @h3x4d3c1m4l made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/325

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.11.1...v3.12.0

    Source code(tar.gz)
    Source code(zip)
  • v3.11.1(Apr 30, 2022)

    What's Changed

    • Dropdown scroll by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/297
    • Make TextButton use the text button style by @devnought in https://github.com/bdlukaa/fluent_ui/pull/302
    • Hotfixes by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/308
    • Add decoration property by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/312
    • Remove DragToMoveArea parent of WindowButtons by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/313

    New Contributors

    • @devnought made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/302

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.11.0...v3.11.1

    Source code(tar.gz)
    Source code(zip)
  • v3.11.0(Apr 23, 2022)

    What's Changed

    • Implement MenuFlyout by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/266
    • Improve NavigationView Top mode by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/277
    • Info Badge Updates by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/296

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v.3.10.3...v3.11.0

    Source code(tar.gz)
    Source code(zip)
  • v.3.10.3(Apr 15, 2022)

    What's Changed

    • NavigationView hotfix by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/278
    • Add _NavigationViewScrollBehavior by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/279
    • Allow to define the minimal tab width by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/283
    • Pane header height by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/281
    • Fix link (anchor) for Info Label by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/285
    • Feature 284 - Added leading property for NavigationPane Widget #288 by @imp-sike in https://github.com/bdlukaa/fluent_ui/pull/288
    • Text field focus fix by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/290
    • TextFormBox expands fix by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/291

    New Contributors

    • @imp-sike made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/288

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.10.1...v.3.10.3

    Source code(tar.gz)
    Source code(zip)
  • v3.10.1(Apr 6, 2022)

    What's Changed

    • Add Arabic(ar) localization by @dmakwt in https://github.com/bdlukaa/fluent_ui/pull/268
    • Fix overflow behavior for TreeViewItem by @klondikedragon in https://github.com/bdlukaa/fluent_ui/pull/270
    • Indicator hotfix by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/273

    New Contributors

    • @dmakwt made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/268

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v.3.10.0...v3.10.1

    Source code(tar.gz)
    Source code(zip)
  • v.3.10.0(Apr 2, 2022)

    • Improves icons.dart formatting and its generation (#215)
    • Use correct color on FilledButton when disabled (209)
    • Built-in support for new languages (#216):
    • Add useInheritedMediaQuery property to FluentApp (#211)
    • TreeView updates (#255):
      • 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)
    • Implement CommandBar (#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)
    • Content state is no longer lost when the pane display mode is changed (#250)
    • BREAKING Update indicators (#248):
      • Added InheritedNavigationView

      • Updated sticky indicator to match the latest Win 11 UI (#173)

      • BREAKING Renamed NavigationPane.indicatorBuilder to NavigationPane.indicator

      • BREAKING Indicators are no longer built with functions Before:

        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:

        indicator: StickyNavigationIndicator(
          color: Colors.blue.lighter, // optional
        ),
        
    • initiallyExpanded property on Expander works properly (#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):
      • 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)

    What's Changed

    • Add useInheritedMediaQuery to FluentApp by @henry2man in https://github.com/bdlukaa/fluent_ui/pull/211
    • Replace WindowButtons & Add Confirm before closing by @lijy91 in https://github.com/bdlukaa/fluent_ui/pull/214
    • Fix disabled color foreground on FilledButton by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/209
    • Improve navpane anim by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/217
    • chore: bump pub score by @Ascenio in https://github.com/bdlukaa/fluent_ui/pull/215
    • ci: enforce static analysis by @Ascenio in https://github.com/bdlukaa/fluent_ui/pull/227
    • FluentUI Widgets Localization Support by @henry2man in https://github.com/bdlukaa/fluent_ui/pull/216
    • Vertical scrolling for TreeView and other enhancements by @klondikedragon in https://github.com/bdlukaa/fluent_ui/pull/225
    • Account for enabled on pressing states by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/233
    • Implement command bars and dynamic overflow layout by @klondikedragon in https://github.com/bdlukaa/fluent_ui/pull/232
    • Add isCompact field to CommandBar by @klondikedragon in https://github.com/bdlukaa/fluent_ui/pull/235
    • Window Transparency support by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/237
    • Restyle CommandBar Flyout by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/241
    • Clear button autosuggest by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/240
    • Dialog long text by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/246
    • Minimal pane by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/247
    • Use a key on the content by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/250
    • Open Expander according to initiallyExpanded by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/252
    • fix README by @yoehwan in https://github.com/bdlukaa/fluent_ui/pull/259
    • Typography by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/261
    • Flyout rework by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/253
    • New StickyIndicator by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/248
    • Fix TabWidthBehavior.sizeToContent by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/264

    New Contributors

    • @lijy91 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/214
    • @Ascenio made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/215
    • @klondikedragon made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/225
    • @yoehwan made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/259

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.9.1...v.3.10.0

    Source code(tar.gz)
    Source code(zip)
  • v3.9.1(Feb 25, 2022)

    • TextBox updates: (#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)
      • 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)
    • Correctly apply elevation for DropDownButton overlay (#182)
    • Show app bar even if NavigationPane is not provided on NavigationView (#187)
    • Ensure NavigationAppBar.actions are rendered on the top of the other widgets (#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)

    What's Changed

    • Update README.md by @MohamadNezar in https://github.com/bdlukaa/fluent_ui/pull/180
    • Text input update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/179
    • Right to Left support by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/184
    • Appbar navigationview by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/189
    • Dropdown corners by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/188
    • Example app by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/191
    • fix opened pane opacity by @maxnemoy in https://github.com/bdlukaa/fluent_ui/pull/195
    • Selection controls by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/196
    • Colors update by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/201

    New Contributors

    • @MohamadNezar made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/180
    • @maxnemoy made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/195

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.9.0...v3.9.1

    Source code(tar.gz)
    Source code(zip)
  • v3.9.0(Feb 10, 2022)

    What's Changed

    • 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)

    • 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)

    • Update ButtonThemeData.uncheckedInputColor

    New Contributors

    • @michalsrutek made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/149
    • @Icyscools made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/154
    • @miguelsilv made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/172

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.8.0...v3.9.0

    Source code(tar.gz)
    Source code(zip)
  • v3.8.0(Feb 3, 2022)

    • Tests (#142)

    • Added Material Theme to Fluent Theme Builder (#133)

    • Add more customization options to PaneItem (#111, #144)

    • NavigationView updates BREAKING:

      • Properly add item key to PaneItem in top mode (#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 NavigationIndicator

      Before:

      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:

      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,
          );
        },
      ),
      
    Source code(tar.gz)
    Source code(zip)
  • v.3.7.0(Jan 21, 2022)

    What's Changed

    • Fluent Icons Gallery Showcase by @henry2man in https://github.com/bdlukaa/fluent_ui/pull/124
    • TextBoxForm by @MeloHenrique in https://github.com/bdlukaa/fluent_ui/pull/126
    • Fix ComboBox borders by @alesimula in https://github.com/bdlukaa/fluent_ui/pull/129
    • AutoSuggestBox gets opened automatically when gets focus by @ashutosh2014 in https://github.com/bdlukaa/fluent_ui/pull/130
    • Fix IconButton hover/press color + add button mode by @alesimula in https://github.com/bdlukaa/fluent_ui/pull/134
    • Implement Lazy Tree View by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/139

    New Contributors

    • @henry2man made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/124
    • @MeloHenrique made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/126
    • @alesimula made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/129
    • @ashutosh2014 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/130

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.6.0...v.3.7.0

    Source code(tar.gz)
    Source code(zip)
  • v3.6.0(Dec 26, 2021)

    • Implement TreeView (#120)
    • Fix Tooltip.useMousePosition
    • Fix Slider and RatingBar (#116)
    • Fix scroll buttons when there are too many tabs in TabView (#92)
    • Fix button style on tab in TabView (#90)
    • Added Close on middle click on tabs in TabView (#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

    • 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

    • Update inputs colors
    • Expander now properly disposes its resources
    • Add the borderRadius and shape attributes to the Mica widget
    • Implement DropDownButton (#85)

    • BREAKING Minimal Flutter version is now 2.8
    • NavigationAppBar.backgroundColor is now applied correctly. (#100)
    • ComboBox's Popup Acrylic can now be disabled if wrapped in a DisableAcrylic (#105)
    • NavigationPane width can now be customizable (#99)
    • Implement PaneItemAction for NavigationPane (#104)

    What's Changed

    • WIP: Implement DropDownButton by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/108
    • Add borderRadius and shape field to the Mica widget by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/114
    • Fix sliders (#116) by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/118
    • Minor update of ToggleSwitch, Buttons, TextBox, Checkbox styles by @Kapranov98 in https://github.com/bdlukaa/fluent_ui/pull/117
    • Fix tabview by @WinXaito in https://github.com/bdlukaa/fluent_ui/pull/119
    • Implement TreeView by @bdlukaa in https://github.com/bdlukaa/fluent_ui/pull/120

    New Contributors

    • @Kapranov98 made their first contribution in https://github.com/bdlukaa/fluent_ui/pull/117

    Full Changelog: https://github.com/bdlukaa/fluent_ui/compare/v3.5.0...v3.6.0

    Source code(tar.gz)
    Source code(zip)
  • v3.5.0(Dec 9, 2021)

    • BREAKING Minimal Flutter version is now 2.8
    • NavigationAppBar.backgroundColor is now applied correctly. (#100)
    • ComboBox's Popup Acrylic can now be disabled if wrapped in a DisableAcrylic (#105)
    • NavigationPane width can now be customizable (#99)
    • Implement PaneItemAction for NavigationPane (#104)
    • ContentDialog constraints can now be customizable (#86)
    • Add possibility to disable acrylic by wrapping it in a DisableAcrylic (#89)
    • Fix onReaorder null exception (#88)
    • Implement InfoBadge
    • Implement Expander (#85)
    • Default inputMouseCursor is now MouseCursor.defer
    • NavigationView.contentShape is now rendered at the foreground
    Source code(tar.gz)
    Source code(zip)
  • v3.4.0(Oct 22, 2021)

    • ProgressRing now spins on the correct direction (https://github.com/bdlukaa/fluent_ui/issues/83)
    • Added the backwards property to ProgressRing
    • FluentApp.builder now works as expected (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
    Source code(tar.gz)
    Source code(zip)
  • v3.3.0(Oct 12, 2021)

    • Back button now isn't forced when using top navigation mode (#74)
    • PilButtonBar now accept 2 items (#66)
    • Added builder variant to NavigationBody.
    • Fixed content bug when AppBar was not supplied too NavigationView
    Source code(tar.gz)
    Source code(zip)
  • v3.2.0(Sep 15, 2021)

    • Added missing parameters in _FluentTextSelectionControls methods (#67)
    • Min Flutter version is now 2.5.0
    • EXAMPLE APP Updated the url strategy on web.
    • EXAMPLE APP Upgraded dependencies
    Source code(tar.gz)
    Source code(zip)
  • 3.0.0(Aug 24, 2021)

    Updated the package to match the Windows 11 design system.

    • 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)
    Source code(tar.gz)
    Source code(zip)
  • v2.2.1(Jun 26, 2021)

    • Implement Fluent Selection Controls for TextBox (#49)
    • Tooltip is now displayed when focused (#45)
    • AppBar is now displayed when minimal pane is open.
    • AppBar's animation now follows the pane animation
    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Jun 26, 2021)

    • BREAKING: Material Icons are not used anymore. Use FluentIcons instead.
    • BREAKING: Reworked the Acrylic widget implementation (#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.
    Source code(tar.gz)
    Source code(zip)
  • 2.1.1(Jun 3, 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)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(May 23, 2021)

    • BREAKING CHANGES: Reworked the theme api (#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 AnimateContainers all around the library

      • Dedicated theme for each theme data (#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

    Source code(tar.gz)
    Source code(zip)
Owner
Bruno D'Luka
have fun, no one lasts forever
Bruno D'Luka
A Flutter package that makes it easy to customize and work with your Flutter desktop app's system tray.

system_tray A Flutter package that that enables support for system tray menu for desktop flutter apps. on Windows, macOS and Linux. Features: - Modify

AnTler 140 Dec 30, 2022
This plugin allows Flutter desktop apps to defines system/inapp wide hotkey (i.e. shortcut).

hotkey_manager This plugin allows Flutter desktop apps to defines system/inapp wide hotkey (i.e. shortcut). hotkey_manager Platform Support Quick Star

LeanFlutter 81 Dec 21, 2022
This plugin allows Flutter desktop apps to defines system tray.

tray_manager This plugin allows Flutter desktop apps to defines system tray. tray_manager Platform Support Quick Start Installation ⚠️ Linux requireme

LeanFlutter 122 Dec 22, 2022
Remote debugging system.

rds A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this is y

null 1 Oct 24, 2021
Online Crime Reporting System

Online Crime Reporting System This website develped for a DBMS course assignment, we uses dart , flutter , hostinger , phpmyadmin , mysql , for creati

Shivam Bindal 6 Nov 25, 2021
Flutter widgets and themes implementing the current macOS design language.

macos_ui Flutter widgets and themes implementing the current macOS design language. NOTE: This package depends on the excellent native_context_menu pl

Reuben Turner 1.1k Jan 1, 2023
My Notes is an app to create simple notes and add 3 levels of tags to them. The uniqueness of the app lies in its design and dark theme

?? My Notes | Simple & Beautiful Note Taking App ?? About The App ?? My Notes is an app to create simple notes and add 3 levels of tags to them. The u

null 4 Apr 27, 2022
A simple app design

shopper_design A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started i

Samuel Adekunle 2 Nov 25, 2021
Flutter Installer is an installer for Flutter built with Flutter πŸ’™πŸ˜ŽβœŒ

Flutter Installer Flutter Installer is an installer for Flutter built with Flutter ?? ?? ✌ Flutter and the related logo are trademarks of Google LLC.

Yazeed AlKhalaf 406 Dec 27, 2022
A Flutter package that makes it easy to customize and work with your Flutter desktop app window.

bitsdojo_window A Flutter package that makes it easy to customize and work with your Flutter desktop app window on Windows, macOS and Linux. Watch the

Bits Dojo 607 Jan 4, 2023
Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size.

desktop_window Flutter plugin for Flutter desktop(macOS/Linux/Windows) to change window size. Usage import 'package:desktop_window/desktop_window.dart

ChunKoo Park 72 Dec 2, 2022
Fluttern is a web app made with Flutter to list Flutter internships/jobs for the community.

Fluttern Fluttern is a web app made with Flutter to list Flutter internships/jobs for the community. It uses Google Sheet as a backend, simplifying th

Aditya Thakur 3 Jan 5, 2022
Flutter on Windows, MacOS and Linux - based on Flutter Embedding, Go and GLFW.

go-flutter - A package that brings Flutter to the desktop Purpose Flutter allows you to build beautiful native apps on iOS and Android from a single c

null 5.5k Jan 6, 2023
A clean front-end plugin to Volumio, the Linux distribution for music playback. Volumio Touch Display Lite is written in Flutter and runs on flutter-pi.

EN | δΈ­ζ–‡ Touch Display Lite plugin for Volumio 3 Feng Zhou, 2021-12 Touch Display Lite is a clean and fast user interface for Volumio 3, the Linux dist

Feng Zhou 5 Jul 26, 2022
Ubuntu-flutter-plugins - A collection of Flutter plugins and packages for Ubuntu applications.

Flutter plugins for Ubuntu A collection of Flutter plugins and packages for Ubuntu applications. ubuntu_localizations - provides localizations for Flu

Canonical 25 Oct 12, 2022
File picker plugin for Flutter, compatible with mobile (iOS & Android), Web, Desktop (Mac, Linux, Windows) platforms with Flutter Go support.

A package that allows you to use the native file explorer to pick single or multiple files, with extensions filtering support.

Miguel Ruivo 987 Jan 6, 2023
Flutter Community Plus Plugins

Flutter Community Plus Plugins Plus plugins PlusPlugins is a set of Flutter plugins that is developed based on existing Flutter plugins with extra fun

Flutter Community 1.1k Jan 5, 2023
Flutter plugin to store data behind biometric authentication (ie. fingerprint)

biometric_storage Encrypted file store, optionally secured by biometric lock for Android, iOS, MacOS and partial support for Linux, Windows and Web. M

AuthPass 125 Dec 28, 2022
The Chicago widget set for Flutter

Chicago widget library The Chicago widget set is a retro 32-bit desktop design language for Flutter. It was discussed in the Building a desktop design

Todd Volkert 405 Dec 30, 2022