mix 2.2.0-beta.4
mix: ^2.2.0-beta.4 copied to clipboard
An expressive way to effortlessly build design systems in Flutter.
2.2.0-beta.4 #
Fixes #
- Variant merge priority follows declared state dependencies: Priority now
groups active variants by whether they declare
ContextVariant.widgetStateDependenciesrather than by whether they are aWidgetStateVariant, soonFocusVisible(...)competes by declaration order instead of always losing to any widget-state variant sharing a property, which had been silently replacing focus rings. Variants built onContextVariant.not(...)move with their inner variant, soonEnabled(...)now outranks an ambient variant such asonDark(...)declared after it. - Declaration order within a priority group is reliable: Grouping is a
stable partition rather than a
List.sort, which fell back to an unstable quicksort at 32 elements and could reorder equal-priority variants in styles that large.
2.2.0-beta.3 #
New features #
ContextVariant.widgetStateDependencies: Context variants now declare the widget states they read, so custom variants participate in nested dependency discovery instead of relying on the framework recognizing a specific variant type. Automatic self-tracking is limited to pointer-driven hover and press; other states still require an ancestor scope or external controller.- Typed focus-visible variants: Added
FocusVisibleVariant,ContextVariant.focusVisible(), andonFocusVisible(...), which apply while focus is highlighted in Flutter's traditional (keyboard/directional) mode. - Pressable semantics roles: Added
PressableSemanticsRolewith button, link, and neutral roles.PressableBoxnow forwards the full Pressable focus, keyboard, controller, feedback, cursor, action, and semantics surface.
Breaking changes #
- Pressable input and semantics: Replaced
semanticButtonLabelwithsemanticsLabel, addedsemanticsRole, and removed the deprecatedonKeycallback. UseonKeyEventfor custom keyboard handling. - Reserved activation keys: While it holds primary focus and can activate,
Pressable owns unmodified Space, Enter, numpad Enter, select, and game button
A so it can model held-key state consistently. Override those direct key
bindings with
onKeyEvent.onPressstill honorsActivateIntentdispatched by remapped shortcuts or programmatic invocation, and customactionscan override that binding or handle other intents. Only those five reserved keys are claimed raw; they are left untouched when a descendant holds focus, and modified chords are left to application shortcuts. A link-role Pressable activates with Enter but leaves Space available for scrolling.
Fixes #
- Nested widget-state discovery:
Style.widgetStatesnow discovers state requirements recursively through nested and negated context-variant branches with identity-based cycle protection, so variants likeonDark(BoxStyler().onHovered(...))andonEnabled(...)are tracked instead of silently never activating. Branches under un-applied named variants are deliberately not tracked because they cannot activate untilapplyVariantshoists them to the top level. - Interaction detector is mounted only when it can help:
StyleBuildernow installs its pointer-interaction detector only for the states that detector actually drives (hovered/pressed). States such asdisabledandfocusedcan only come from an externalWidgetStatesControlleror an ancestor scope, so styles depending solely on those no longer gain an opaque hit-test target that swallowed pointer events aimed at widgets beneath them, and no longer hijack the state scope of descendants that do track hover. - Pressable lifecycle: Pointer and keyboard press sources are combined without clearing each other, keyboard activation fires once on key-up, cancellation clears held state, focus-visible follows Flutter input modality, and disabled controls ignore custom key handling and expose neither semantic nor custom actions.
- Press state ends with the gesture: A pointer that drifts past the tap slop stops counting as a press, so items no longer stay visually pressed while a list scrolls under the finger.
- Focus-visible scope: The focus-highlight scope is now provided wherever
widget states are, so
onFocusVisiblealso resolves — and repaints on input modality changes — outside aPressable. AWidgetStateStyleOverrideforcingfocusednow applies it too, matchingonFocused.
2.2.0-beta.2 #
New features #
- GridBox: Added the public
GridTrack,GridBoxSpec,GridBoxStyler, andGridBoxAPI with fixed/fractional tracks, explicit and repeated rows, gaps, row-major placement, clipping, and localBreakpoint-based constraint branches. Equal fractional columns useequalColumns; numeric tracks and gaps support Mix tokens; compatible geometry participates in implicit style animation. - WrapBox: Added the public
WrapSpec,WrapStyler,WrapBoxSpec,WrapBoxStyler, andWrapBoxfamily with flattened fluent Wrap styling, collision-safe Box/Wrap names, generated constructors and factories, and a runnable gallery example.
2.2.0-beta.1 #
Fixes #
- Box shadow blur styles:
BoxShadowMixnow preserves non-defaultBoxShadow.blurStylevalues across construction, conversion, merging, resolution, diagnostics, equality, and its fluent and factory APIs (#992).
2.2.0-beta.0 #
New features #
- Style-state override scope:
WidgetStateStyleOverridelets tooling and tests force widget-state variants through normalstyleresolution, taking precedence over controllers and nested interaction providers without changing component behavior. CssKeywordLinearTransform: Adds a reusable bounds-awareGradientTransformfor CSS linear-gradient keyword directions, so Tailwind corner gradients can round-trip through schema tooling without losing visual parity.- Typed context variants:
BrightnessVariant,BreakpointVariant,OrientationVariant,DirectionalityVariant,PlatformVariant,WebVariant, andNotVariantare now public value objects behind theirContextVariantfactories, giving schema and tooling code stable typed data to inspect instead of parsing keys.
Fixes #
- Variant merge-key collisions: Variant styles now merge by an opaque,
semantic identity instead of the human-readable
Variant.key. Equivalent named, enum-backed, and built-in context variants still coalesce, while unrelated variants with the same label retain their own predicates. Dynamic builders keep their existing build-then-merge behavior and use function equality instead of a hash string for merge identity. - Context variant equality:
ContextVariant.brightness,ContextVariant.breakpoint,ContextVariant.orientation,ContextVariant.directionality,ContextVariant.platform,ContextVariant.web, andContextVariant.notnow compare by their typed values instead of identity, so equivalent variants deduplicate and round-trip predictably. - Default text style modifier merge: Partial
DefaultTextStyleModifierMixoverrides now merge with the ambientDefaultTextStyleinstead of replacing inherited text style fields.
API changes #
tokenFromReferenceValueis now public for schema/tooling code that needs to identify unresolved token references, including sentinel-backedDoubleRefvalues, without importing Mix internals.
2.1.0 #
This release adds context-derived token resolution and richer animation configuration, fixes variant resolution in nested styles and animation interpolation edge cases, and hardens the token-reference system while tightening the public API around the internal token registry.
New features #
ContextToken: Zero-config token whose value is derived directly from the build context, so context-dependent values resolve without first registering a token in a scope (#938).- Spring animation helpers:
AnimationConfigstatics are now factories, with added spring-curve wrappers for configuring physics-based transitions (#937).
Fixes #
- Variants in nested styles: A
Stylenested inside another style'sProp(a component sub-style) now applies its own context variants — widget states, brightness, breakpoints. PreviouslyProp.resolvePropresolved the merged nested style viaresolve(), which skips variants. No-op for nested styles without variants (#926). Matrix4interpolation: Tween a transform against the identity matrix when one endpoint is null, instead of producing a degenerate result (#931).- Animation config fallback: Fall back to the previous animation config when a transition resolves to null, rather than dropping the animation (#930).
DoubleRefsentinel collisions: Two distinctMixToken<double>instances whose hashes landed in the same bucket previously aliased to the same sentinel. The registry now hands out sentinels from a monotonic counter, so sentinels are unique among registered tokens; a reverse cache re-issues the same sentinel for the same token.BreakpointToken.resolveno longer masks type errors: the built-inmobile/tablet/desktopdefaults are only used when the scope is absent or omits the entry. A scope entry of the wrong type now surfaces the underlyingStateErrorfromMixScope.getToken.- Numeric directives on multi-source props:
Prop.value(x).mergeProp( Prop.token(t)).multiply(2)and similar chains now resolve instead of throwing —_asPropNumrebuilds every source asProp<num>and merges in order. Prop.valuenull safety: the token-ref detection branch no longer crashes whenVis nullable and the supplied value isnull.
API changes #
ValueRef.noSuchMethodthrowsUnsupportedError(wasUnimplementedError). The detailed message is unchanged; only the error type differs. Any user code that catches the specific class needs to switch.getReferenceValueno longer silently casts an unsupported token type — it now throwsUnsupportedErrornaming the token andT. All concreteMixTokensubclasses overridecall()and never hit this path; the change only affects customMixTokenauthors who relied on the cast.- Removed from the public API:
clearTokenRegistryandgetTokenFromValueare no longer re-exported frompackage:mix/mix.dart(both are now@internal; tests reach them viapackage:mix/src/...). The publicDoubleRef(double)constructor was removed —DoubleRefinstances are only ever obtained throughMixToken<double>.call(). For an explicit, type-safe handle to a double token, useProp.token(token). isAnyTokenRefdrops the brittleruntimeType.toString().endsWith(...)check; aPropcarrying aTokenSourceis now the sole class-based invariant.
Other changes #
StyleWidgetdefaults toIdentityStyle<Spec>, giving widgets a well-defined no-op style when none is supplied (#921).
2.0.3 #
This release adds finer-grained control over scope inheritance and theming, and restores compatibility with newer Flutter SDKs.
New features #
MixScope.inherit: Opt into merging with the nearest ancestorMixScopeinstead of replacing it, so nested scopes can extend tokens and breakpoints without re-declaring them (#914).ColorRefdirective overrides: Non-deprecatedColormethods onColorRef(e.g.withValues) are now overridden to return a ref carrying a directive, keeping color tokens unresolved until rendering (#908).
Fixes #
- Flutter SDK compatibility: Removed
TextDecorationRefso Mix builds against newer Flutter SDKs whereTextDecorationis no longer extendable (#913).
2.0.2 #
This release completes the 2.0 Styler migration by removing the remaining legacy utility surface, and adds new ergonomic shorthands and variant tooling.
Removals #
- Legacy utility classes and mutable stylers: All remaining deprecated utility classes and mutable stylers were removed, finishing the transition to the Styler-first API (#901).
New features #
- EnumVariant mixin: Define type-safe enum-based variants without hand-written boilerplate (#894).
- DefaultTextStylerModifier: Propagate default
TextStylervalues down the widget tree via a modifier, matching the pattern used by other default stylers (#905). - Text shadow shorthand: Dot-shorthand entry point for configuring text shadows (#890).
- Uniform border shorthand: Dot-shorthand for applying a uniform border in one call (#889).
MixStylerexport:MixStyleris now exported from the public API, matching the documentation (#900).
Fixes #
- RotateModifier lerp: Interpolate the rotation angle directly instead of the transform matrix, producing smoother rotation transitions (#898).
2.0.1 #
This patch release improves day-to-day styling ergonomics and makes looping animations more reliable in edge cases.
New features #
- Dot shorthand coverage expanded: Static factory constructors are now available for all Styler instance methods, making Dart 3.11 shorthand syntax available across the full styling surface (#884).
Fixes #
- Looping animations: Loop driver updates now use the latest configured duration so repeated animations stay in sync with configuration changes (#885).
- Matrix interpolation stability: Matrix lerp now safely handles null endpoints to prevent snapping artifacts during transitions (#882).
2.0.0 #
Mix 2.0 is a ground-up rethink of how styling works in Flutter. This release introduces Styler-first APIs with fluent chaining, leverages Dart 3.11+ dot shorthands for concise syntax, modernizes the widget modifier model, and adds full code generation for specs and stylers via mix_annotations / mix_generator.
Breaking changes #
- Styler APIs replace legacy
$utilities.BoxStyler(),TextStyler(),IconStyler(), and related stylers are the primary styling surface. All deprecated spec utilities, legacy widget/style entry points, and unused enum/color helpers have been removed (#806, #870). - Widget modifiers now use
WidgetModifierConfigconstruction instead of older patterns (#775). - Internal resolver usage:
resolvePropis@internal; useMixOps.resolvewhere you relied on the previous surface (#833). - Minimum SDK: Dart
>=3.11.0, Flutter>=3.41.0. - Styled widget naming: Legacy
Styled*widget names deprecated in favor of new naming conventions (#619). - NestedStyleAttribute removed: Migrate to direct
Styleusage (#644). - SpecConfiguration/SpecStyle removed from environment (#656).
- MixWidgetState renamed to
MixWidgetStateModel(#698);MixWidgetStateControllerdeprecated (#586).
New features #
- Fluent Styler API: Build styles with chained method calls —
BoxStyler().color(Colors.blue).size(100, 100).paddingAll(16). - Styler dot shorthands: Static factory constructors on stylers for Dart 3.11 dot-notation syntax (#857).
- Named variants:
applyVariants()for applyingNamedVariantsets in one place (#801). - Style lookup:
Style.of()andStyle.maybeOf()for reading resolved styles from the widget tree (#784). - Layout widgets: Callable
Stack/FlexBox(and related) for concise composition;Stack/StackBoxrestructured for the 2.0 model (#779). - Widget builder pattern: Ergonomic Mix API through widget builders (#754).
- Default widget styles: Mix widgets ship with sensible defaults out of the box (#759).
- Numeric styling: Number directives and extensions for numeric transforms in styles (#785).
- Defaults:
DefaultStyledTextandDefaultStyledIcontypedefs for consistent defaults (#767). - Codegen:
MixableSpec/MixableStylergeneration,MixableField.setterType, and Style-class extension support inmix_generator(#835, #846, #845). - Animation loops: Loop support for Phase and Keyframe animations (#824).
- Unified attributes:
SpecUtility,Style, andAttributesunified as compatible values (#643). - Style-focused modifiers and specs: Generated modifiers and specs for streamlined styling (#652).
- Builder optimization: Improved style builder performance (#629).
Improvements #
- Widget state variant mixins split into focused files; unsupported widget state variants removed (#768, #769).
StyleSpecBuilderbuild path simplified (#825).- Specs standardized with
@immutable; clearer equality behavior (#821). BaseStyleutility class introduced for improved styling architecture (#659).- Widget state handling moved from
MixBuildertoSpecBuilder(#651). - Docs, examples, and codebase updated to dot-shorthand / Styler syntax throughout.
Fixes #
- Variants: More reliable
VariantStylemerge and widget state handling inStyleBuilder(#774, #765). - copyWith / lerp: Nullable
copyWithparameters; lerp respects nullability (including generator fixes) (#848, #849). - Stylers:
chaingetter onStackStyler;AnimationStyleMixinonFlexBoxStylerandStackBoxStyler(#818, #819). - Animations: Visibility stays correct through the end of exit animations (#771). Animation drivers no longer reset when animation configuration is unchanged (#859).
- Equality:
Mixablenow extendsEqualityMixininstead ofStyleElement(#648). - CopyWith: Overriding bug fixed (#622).
- Breakpoints: Breakpoint utility merge exception resolved (#758).
1.7.0 #
- REFACTOR: Implement BaseStyle utility class and improve styling architecture #659
- REFACTOR: Remove SpecConfiguration and SpecStyle from environment (#656)
- REFACTOR: Move widget state handling from MixBuilder to SpecBuilder (#651).
- REFACTOR: Rename WidgetModifiersData to WidgetModifiersConfig (#649).
- REFACTOR: Fix deprecations and modernize codebase (#647).
- REFACTOR: Remove NestedStyleAttribute and migrate to direct Style usage (#644).
- REFACTOR: Deprecate
MixWidgetStateController(#586). - REFACTOR: Use WidgetState instead of MixWidgetState (#582).
- FIX: Change Mixable to extend EqualityMixin instead of StyleElement (#648).
- FIX: CopyWith overriding bug (#622).
- FEAT: builder optimization (#629).
- FEAT: deprecate styled widgets in favor of new naming conventions (#619).
- FEAT: Implementing duration extension for int (#634).
- FEAT: Create MixBuilder (#581).
- FEAT: Add generated style-focused modifiers and specs (#652).
- FEAT: Unify SpecUtility, Style, and Attributes as compatible values (#643).
- FEAT: Add utilities for animatedData (#660).
- FEAT: Add focused style classes for spec utilities (#677)
1.6.0 #
- REFACTOR: Rename
MixablePropertytoMixableType(#574) - REFACTOR: mix generator clean up and mix semantic changes (#569)
- CHORE: Update min version compatibility (#572)
1.5.4 #
- FEAT: Accordion interaction based on open variable (#546).
1.5.3 #
- REFACTOR: Solve dcm lint issues (#519).
- FIX: Order of modifiers implementation on Box, Image and Text (#529).
- FIX: reset modifiers and modifiers when using fluentAPI (#482).
- FEAT: Add spring curve (#503).
- FEAT: Create StrokeAlignUtility (#496).
- FEAT: Utilities for text height behavior (#495).
- FEAT: Rewrite FlexBox as a Mix's primitive component (#517).
- FEAT: Add
SpecConfiguration(#483). - DOCS: Add section for
TokenResolver(#537).
mix - v1.5.2
- REFACTOR: ShapeBorder merge (#490).
- FEAT: Improve error messages (#491).
- FEAT: add error state to MixWidgetState (#489).
mix - v1.5.1
- FEAT: Add MixOutlinedBorder (#487).
1.5.0 #
- FIX: Update OnBrightnessVariant to use
MediaQueryinstead ofTheme(#471). - FIX: Style when merged with an AnimatedStyle should generate an AnimatedStyle (#472).
- FEAT: Create a specific utility to Transform.translate (#484).
- FEAT: Add more modifiers to Colors (#477).
- FEAT: implement a way to clear inline modifiers (#478).
- FEAT: Fluent API (#475).
1.4.6 #
- FIX(docs): fix fn level docs for Style::applyVariants (#460).
- FIX: Shadow list animation (#445).
- FIX: SpecModifiers were taking a long time to animate. (#457).
- FEAT: Create mouse cursor Decorator (#263).
- FEAT: Add parameter onEnd for AnimatedStyle (#458).
- FEAT:
SingleChildScrollViewwidget modifier (#427). - FEAT: Remix improvements and further improvements (#410).
1.4.5 #
- FIX: HitTestBehavior when there is an Interectable in the tree (#437).
- FEAT: Create a specific utility to Transform.rotate (#434).
- FEAT: TargetPlatform and web variants (#431).
1.4.4 #
- FIX: Pressable disposes controller only if it creates it (#424).
1.4.3 #
- FIX: Breakpoint utility merge exception (#421).
1.4.2 #
- FIX: FlexSpecWidget prioritizes the direction in spec (#414).
1.4.1 #
- FIX: Added missing widget state utilities (#411).
- FIX: Correct handling of individual border sides (#408).
- DOCS: improve mix theme data features explanations (#404).
1.4.0 #
- FEAT: Code generation for Widget Modifiers (#396).
- FEAT: Ability to pass MixWidgetStateController to SpecBuilder (#391).
- FEAT: Interactive widget state by default (#384).
- FEAT: MixThemeData can alter default order of modifiers (#380).
- FEAT: Dto utility generation now adds constructor and static methods (#377).
- FEAT: ColorSwatchToken and other token improvements (#378).
- REFACTOR: Code gen more lint friendly dart code (#399).
- FIX: Gestures propagation for GestureMixStateWidget (#394).
- FIX: Normalization of order of modifier when applied to a Styled Widget (#389).
- FIX: Animations of Stack and Flex (#388).
- FIX: Review the order of modifiers adding FlexibleModifier, PaddingModifier, and RotatedModifier (#379).
1.3.0 #
- REFACTOR: unpressDelay uses timer instead of future
- REFACTOR: bump min flutter version to 3.19.0 (#365).
- FEAT: added modifiers per spec (#333).
- FEAT: add attribute to fontVariantion (#371).
1.2.0 #
- FIX: Exception when there is no children on flex (#345).
- FIX: Added remaining params to callable specs and modifiers (#332).
- FIX: Gap resolve SpaceToken in flex attribute (#327).
- FIX: mix - Improved merge behavior between ShapeDecoration and BoxDecoration (#316).
- FEAT: pressable supports keyboard events (#346).
1.1.3 #
- Improved merge behavior between ShapeDecoration and BoxDecoration
- Fixed space token resolve on gap in flex attribute
- Added remaining params to callable specs and modifiers
1.1.2 #
- Chore: Changed the class modifier of the Spec class for code generation.
1.1.1 #
- Fixed some specs not respecting nested animated.
- Added call build method to specs.
1.1.0 #
- Mix now uses mix_generator for Spec and Dto generation.
- Added missing utilities for IconSpec and ImageSpec.
- Added missing ShapeBorders.
- Improved ShapeBorderDto merge behavior.
- Bumped minimum Dart SDK to 3.0.6.
- Added animated utility to Spec.
1.0.0 #
- Revamped Mix API for improved functionality and developer experience.
- Enhanced performance and system responsiveness.
- Broadened test coverage for greater reliability.
- Extensive bug fixes for increased stability.
- Too many things to list; view our docs for more info.
Visit our documentation site for more information https://www.fluttermix.com
0.0.7 #
0.0.6 #
- Refactored MixTheme & Context Tokens.
- ZBox Widget by @.
- Headless Widgets (Experimental).
- Lots of bug fixes and performance improvements.
0.0.5 #
- Adjustments on Mix helper for applying variants and attributes.
0.0.4 #
- Optimization improvements.
- Added clip decorator.
- Fixed some bugs.
0.0.3 #
- Global Mix for reusability of design tokens and mixes across DS.
withMixutility to add nested mixes and combine them.- Attribute modifiers, create attributes that modify a widget value.
0.0.2 #
- Added screen size dynamic attribute.
- Added device orientation dynamic attribute.
0.0.1 #
- Initial release.
