material_plus_ui 1.14.0
material_plus_ui: ^1.14.0 copied to clipboard
Material Design 3 for Flutter, written from the specification and extended past it: over 120 components, charts, a data table and a command palette included, themed from one source colour. No dependencies.
Changelog #
The Flutter package, material_plus_ui. The React package keeps its own history in packages/react/CHANGELOG.md, and the two version independently.
vNext (2026--) #
1.14.0 - 2026-11-10 #
This release makes MPConfigProvider the place to set the components' own words, the floating label and the first day of the week for everything under it, which is why a field's floatingLabel is a bool? now, the one change an app may have to answer. The rest are fixes: focus rings and floated labels that a scroll view cut off, in MPDialog, MPDrawer, MPCollapsible and MPScrollZone, a placeholder that flashed over its rising label, and two equal MPConfigValues that hashed apart.
Breaking changes #
- A field's
floatingLabelis abool?now. It was aboolthat defaulted totrue, and it isnullwhen left out so thatMPConfigProvidercan decide it. Passing a value works as it did. Code that reads the field off a widget, such asfield.floatingLabel, readsfield.floatingLabel ?? trueinstead. The widgets areMPTextField,MPSelect,MPCombobox,MPNumberField,MPColorPicker,MPTreeSelect,MPDatePicker,MPDateRangePicker,MPDateTimePickerandMPTimePicker.
Added #
MPConfigProvidertakeslabels, for the words the components say on their own behalf. It is keyed by namespace and then by key, the shaperegisterMPMessagestakes, and is a partial:{'alert': {'dismiss': 'Hide'}}renames one button for the whole subtree and leaves every other word as the locale has it. A component's ownlabelsstill wins, and nested providers merge a word at a time.MPConfigProvidertakesfloatingLabelandweekStartsOn.floatingLabel: falsekeeps the label of every field under it in the notch from the start, andweekStartsOnsets the first day of the week inMPCalendar,MPDatePicker,MPDateRangePickerandMPDateTimePickerinstead of taking it from the date names. A component's own parameter still wins over both.
Fixed #
-
A field's placeholder no longer flashes over its rising label. The placeholder appeared the moment an empty field with a floating label took the focus, while the label was still on its line for the first part of its rise, so the two were drawn over each other. The placeholder now waits until the label is seven eighths of the way up, where the React package shows it too, and goes the moment the label starts back down. This holds for
MPTextField,MPNumberField,MPCombobox,MPSelectand the pickers. A field whose label starts up, or that has none, shows its placeholder at once as before. -
A field at the top of an
MPDialogbody shows its floated label whole when the body scrolls, and a button at its top or bottom shows its focus ring whole. The scroll view clips at its edges once what it holds overflows, and its padding sat outside it, so it kept no room inside them. A label that has risen to the border sits half above its field, so the body cut off 6px of it, and it cut off a focus ring at its top, its bottom and its sides. The padding is inside the scroll view now, with room for both, and the gaps around the body give that room back, so nothing on the sheet moves. A ruled body scrolls up to the rule, as it does in React, instead of disappearing one padding short of it. -
A field at the top of an
MPDrawerbody shows its floated label whole when the body scrolls. The body kept 4px inside its scroll view for a focus ring, and a label that has risen to the border rises 6px above its field, so the top 2px were cut off. It now keeps room for the label as well, and the gaps around it give that room back, so nothing on the panel moves. -
A trigger of your own on an
MPCollapsibleshows its focus ring. The sheet clipped everything in it, and the widgettriggerBuilderreturns sits against the sheet's edges, so the ring painted outside it was cut off on all four sides. Under a trigger of your own only the panel is clipped now, to the sheet's lower corners. A trigger that paints its own square background is no longer cropped to the sheet's corners. The default header is unchanged. -
A child of an
MPScrollZoneshows its whole focus ring. The strip's scroll view clipped at its children's own edges once it overflowed, so a ring painted outside a button or a chip in it was cut off at the top, at the bottom and at whichever end it was against. The strip is now painted 4px past its box on every side, so the ring shows and nothing moves to make room for it. -
Two equal
MPConfigValues hash alike when theirbreakpointsare in another order.==compared the boundaries by window class, andhashCoderead them in order, so a value used as a key in aMapor aSetcould miss its equal.
1.13.0 - 2026-11-05 #
This release comes out of running the package on iPhone, iOS Simulator and Android emulator screens in examples/flutter, an app now in the repository with every component in it. A menu row's shortcut is written in MPShortcut's notation, the one change an app will notice without having met a bug. The rest are fixes from those screens: the system back closed the page under an MPConfirmProvider question rather than the question, popups ran off the edge of the screen, a calendar cut the name of its month short, components ran past the edge of a phone, and shortcuts, dates and times were reordered under a right-to-left page.
Changed #
- A
shortcuton a menu row is written inMPShortcut's notation.MPMenuItem,MPMenuCheckboxItemandMPMenuRadioItemprinted the string as they were given it, so theMod+Nthe documentation's menubar wrote, whichMPCommandPalettealready reads that way, came out as the lettersMod+N. It now reads⌘Non a Mac andCtrl+Neverywhere else, as text rather than key caps, and is read out by the names of its keys; a string with no key name in it, such as⌘C, is drawn as it is.
Documentation #
- The Flutter snippets name their pictures by a full address. They named them by the documentation site's own path,
/samples/..., which only resolves on that site, so a snippet copied into an app on a phone or a desktop drew an empty box where the picture should be.
Fixed #
- A progress ring shows whole in the leading slot of an
MPPill. The slot is a glyph's size, 20px on a medium pill, and the smallestMPProgressCircularis 24px across, so an upload pill overflowed its slot and the circle the slot is clipped to kept half a pixel of the ring. Anything larger than the slot is scaled down to it now, and a glyph that fits is drawn at its own size. - An
MPOtpFieldfits a phone. Its slots kept the width of their rung, so six medium slots, 328 wide, ran past the edge of a 360 phone with 24px margins, and a grouped code further still. The slots narrow to fit a row too small for them now, all by the same amount, and keep their height. - An
MPPaginationtoo wide for what holds it goes on to a second line. Eleven cells, which a long list with its edges shown has, ran past the edge of a phone. The cells wrap now, every line centred, and an ellipsis takes the width of a cell rather than a line of its own. - A calendar shows the whole name of its month. The header had the grid's width and no more, so
September,NovemberandDecemberwere cut short at the default size, and nearly every month atxsandsm, inMPCalendarand in the popups of the date pickers. A calendar now widens to its header where the header needs it, as the React popup does, by the room its longest month needs, so it keeps one width from month to month; the grid stays seven cells wide in the middle. - A popup opened beside the edge of the screen stays on it. A popup only flipped to the other side of its anchor, so an
MPPopover,MPPopconfirm,MPTooltip,MPHoverCardor menu centred on a button at the side of a phone ran off the screen and cut its first words off. One that would run off now slides back on to the screen, 8px from the edge, and its arrow moves the other way so it still points at the anchor. The slide is decided when the side is, so it does not move with a scroll. - A horizontal
MPNavigationMenuwider than its room scrolls along. Three items with panels ran past the edge of a phone. The bar scrolls sideways now, and an item the arrow keys reach is scrolled into view with its focus ring; the scroller reaches past the bar by the ring's width, so a ring at the edge is not cut off, and a bar that fits takes the room it took before. - A shortcut reads left to right under a right-to-left page.
MPShortcutlaid its caps out the page's way, soCtrl+Shift+Pcame outP + Shift + Ctrl, and a menu row's⌘⇧Pcame outP⇧⌘. Both run left to right now, as Arabic and Hebrew write a shortcut. - A date or a time a picker shows reads in its own language's direction. Under a page laid out the other way it was reordered: a Korean
2026. 11. 5.under an Arabic page read.5 .11 .2026, and3:30 PMreadPM 3:30. The value inMPDatePicker,MPTimePicker,MPDateTimePickerandMPDateRangePickeris now drawn in the direction of its first letter, as HTML's<bdi>decides it, and placed where the page's text starts. - The system back closes an
MPConfirmProviderquestion instead of the page under it. A provider inWidgetsApp.builder, where its documentation puts it, sits above the navigator and in no route, so Android's back button popped the page the question was asked from and left the question on screen. The back now answers the questionfalse, as Escape does, and a question that is notdismissiblekeeps the back from doing anything.
1.12.0 - 2026-10-30 #
The first release of Material Plus for Flutter: the components of the React package under the same names, the same parameter vocabulary and the same numbers, built on package:flutter/widgets.dart alone, with no dependencies.
Added #
- The components of the React package, under the same
MPnames and the samesize,color,variant,densityandelevationvocabulary: charts, display, feedback, inputs, layout, navigation and transitions. Four React components are not here because they answer problems only the DOM has or that no Flutter gesture means the same everywhere:MPFlex,MPPortal,MPVisuallyHiddenandMPContextMenu. Each one's page names the Flutter equivalent. MPTheme, which derives every colour role from one source colour with the arithmetic of the React token sheet, so the same source colour gives the same hex values in both packages. It also carries MD3's type scale and thematerial,roundedandsharpcorner presets, scopes to a subtree, and follows the platform's brightness when nothing pins it.MPConfigProviderandMPLocaleProvider, which set the defaults and the language for a subtree, as they do in the React package. With no locale anywhere, a component follows the app'sLocalizations.- Eighteen translations under
package:material_plus_ui/locales.dart, the same tables and keys as the React package, registered withregisterMPMessages. The date pickers and the charts carry month and weekday names for the same eighteen languages and English, read off the Unicode CLDR data, with nointldependency. - Selection handles and a text menu on every field that takes text, drawn by the package because there is no Material to borrow them from: a long press on Android selects a word with handles in the theme's primary colour and a menu of cut, copy, paste, select all and share in the field's language, iOS shows its system menu, and a right click on a desktop opens the same menu. The OTP field, whose editor is hidden behind its boxes, has no handles; a long press or a right click there opens a menu with Paste in it.