Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
02307d5
docs(website): remove internal Prop patterns and use fluent API consi…
leoafarias Feb 26, 2026
05c3d5a
docs(website): improve documentation quality and remove internal API …
leoafarias Feb 26, 2026
e3aad18
chore(examples): fix dart format violations
leoafarias Feb 26, 2026
3232658
ci: bootstrap packages before format check for dot-shorthand support
leoafarias Feb 26, 2026
4ac8b33
docs(website): fix code correctness, API patterns, and writing qualit…
leoafarias Feb 26, 2026
1f7c2bb
docs(website): fix critical issues from deep review across 15 pages
leoafarias Feb 26, 2026
da44f2c
fix(website): add missing Callout import and format Dart examples
leoafarias Feb 26, 2026
eb27f48
fix(website): correct BoxStyler.create example, add StackBox to sideb…
leoafarias Feb 26, 2026
2080c9a
docs(website): improve accuracy of guides and tutorial content
leoafarias Feb 26, 2026
d32ecab
docs(website): add missing docs frontmatter metadata
leoafarias Feb 26, 2026
e8a2b16
feat(mix): add missing AnimationConfig factory constructors for dot-s…
leoafarias Feb 27, 2026
3badee7
docs(website): address PR review comments across docs pages
leoafarias Feb 27, 2026
7df81e6
fix(docs): remove shadow contradiction in styler guidelines, add para…
leoafarias Feb 27, 2026
fe4e5c9
docs(website): fix migration API mappings and snippet validity
leoafarias Feb 27, 2026
3842f03
test(mix): apply dart format to animation config tests
leoafarias Feb 27, 2026
93d8304
docs: remove documentation quality checklist guide
leoafarias Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/preview-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,5 +61,8 @@ jobs:
- name: Validate Preview Manifest
run: cd website && pnpm run check:previews

- name: Validate Docs Frontmatter
run: cd website && pnpm run check:frontmatter

- name: Build Website
run: cd website && pnpm run build
4 changes: 4 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ jobs:
with:
flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }}
channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }}
- name: Install Melos
run: dart pub global activate melos
- name: Bootstrap packages
run: melos bootstrap
- name: Check formatting
run: dart format --set-exit-if-changed .

Expand Down
5 changes: 1 addition & 4 deletions examples/lib/api/context_variants/selected.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,7 @@ class _ExampleState extends State<Example> {
.height(100)
.width(100)
.borderRounded(10)
.variant(
ContextVariant.widgetState(.selected),
.color(Colors.blue),
);
.variant(ContextVariant.widgetState(.selected), .color(Colors.blue));

return Pressable(
onPress: () {
Expand Down
5 changes: 1 addition & 4 deletions examples/lib/api/context_variants/selected_toggle.dart
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,7 @@ class _ExampleState extends State<Example> {
.fontSize(16)
.fontWeight(.w600)
.color(Colors.grey.shade700)
.variant(
ContextVariant.widgetState(.selected),
.color(Colors.white),
);
.variant(ContextVariant.widgetState(.selected), .color(Colors.white));

return Pressable(
onPress: () {
Expand Down
4 changes: 1 addition & 3 deletions examples/lib/api/default_widgets/default_styled_text.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@ class Example extends StatelessWidget {
StyledText('hello world'),
StyledText(
'Mix is awesome',
style: TextStyler().onHovered(
.color(Colors.deepPurple),
),
style: TextStyler().onHovered(.color(Colors.deepPurple)),
),
StyledIcon(icon: Icons.ac_unit),
],
Expand Down
1 change: 1 addition & 0 deletions examples/lib/api/ecosystem/tw_card_alert.dart
Original file line number Diff line number Diff line change
Expand Up @@ -83,4 +83,5 @@ class Example extends StatelessWidget {
);
}
}

// #enddocregion example
5 changes: 1 addition & 4 deletions examples/lib/components/chip_button.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,7 @@ final chipButtonContainer = BoxStyler()
.color(Colors.blue)
.borderRounded(20)
.onHovered(.color(Colors.blue.shade700))
.variant(
ContextVariant.widgetState(.selected),
.color(Colors.black),
)
.variant(ContextVariant.widgetState(.selected), .color(Colors.black))
.alignment(.center)
.animate(.easeInOut(300.ms));

Expand Down
10 changes: 2 additions & 8 deletions examples/lib/docs/guides/animations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,10 +85,7 @@ class _Section extends StatelessWidget {
children: [
Text(
title,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
const SizedBox(height: 12),
...children,
Expand All @@ -113,10 +110,7 @@ class _Card extends StatelessWidget {
children: [
Text(
title,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
),
style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
),
const SizedBox(height: 8),
child,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ class ImplicitStateCounterExample extends StatefulWidget {
_ImplicitStateCounterExampleState();
}

class _ImplicitStateCounterExampleState extends State<ImplicitStateCounterExample> {
class _ImplicitStateCounterExampleState
extends State<ImplicitStateCounterExample> {
int _counter = 2;

@override
Expand Down
6 changes: 5 additions & 1 deletion examples/lib/docs/guides/styling.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import 'package:mix/mix.dart';

void main() {
// 1
final style = BoxStyler().width(240).height(100).color(Colors.blue).borderRounded(12);
final style = BoxStyler()
.width(240)
.height(100)
.color(Colors.blue)
.borderRounded(12);

// 2
final base = BoxStyler()
Expand Down
6 changes: 5 additions & 1 deletion examples/lib/docs/guides/variants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ void main() {

final styleB = styleA.onHovered(.color(Colors.green));

final result = BoxStyler().color(Colors.green).height(100).width(200).borderRounded(10);
final result = BoxStyler()
.color(Colors.green)
.height(100)
.width(200)
.borderRounded(10);

// 3
final hoverStyle = BoxStyler()
Expand Down
11 changes: 9 additions & 2 deletions examples/lib/docs/overview/index.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,16 @@ class Example extends StatelessWidget {
}

// 1
final boxStyle = BoxStyler().height(100).width(100).color(Colors.purple).borderRounded(10);
final boxStyle = BoxStyler()
.height(100)
.width(100)
.color(Colors.purple)
.borderRounded(10);

final textStyle = TextStyler().fontSize(20).fontWeight(.bold).color(Colors.black);
final textStyle = TextStyler()
.fontSize(20)
.fontWeight(.bold)
.color(Colors.black);

// 2
final buttonStyle = BoxStyler()
Expand Down
15 changes: 10 additions & 5 deletions examples/lib/preview_registry.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ import 'package:flutter/widgets.dart';
import 'api/ecosystem/tw_card_alert.dart' as tw_card_alert;
import 'api/animation/implicit.curved.scale.dart' as auto_scale;
import 'api/animation/implicit.spring.translate.dart' as spring_anim;
import 'docs/guides/animations/implicit_state_counter.dart' as guide_implicit_counter;
import 'docs/guides/animations/implicit_variant_hover.dart' as guide_implicit_hover;
import 'docs/guides/animations/implicit_state_counter.dart'
as guide_implicit_counter;
import 'docs/guides/animations/implicit_variant_hover.dart'
as guide_implicit_hover;
import 'docs/guides/animations/keyframe_loop.dart' as guide_keyframe_loop;
import 'docs/guides/animations/keyframe_switch.dart' as guide_keyframe_switch;
import 'docs/guides/animations/phase_tap_compress.dart' as guide_phase_tap;
Expand Down Expand Up @@ -262,15 +264,18 @@ class PreviewRegistry {
// Animations (guides — match animations.mdx)
PreviewEntry(
previewId: 'implicit-anim-counter',
sourcePath: 'examples/lib/docs/guides/animations/implicit_state_counter.dart',
sourcePath:
'examples/lib/docs/guides/animations/implicit_state_counter.dart',
title: 'State-triggered Implicit Animation',
description: 'Square grows each time you tap it',
category: _animations,
builder: (_) => const guide_implicit_counter.ImplicitStateCounterExample(),
builder: (_) =>
const guide_implicit_counter.ImplicitStateCounterExample(),
),
PreviewEntry(
previewId: 'anim-hover-scale',
sourcePath: 'examples/lib/docs/guides/animations/implicit_variant_hover.dart',
sourcePath:
'examples/lib/docs/guides/animations/implicit_variant_hover.dart',
title: 'Hover Scale Animation',
description: 'Box that scales up smoothly when hovered',
category: _animations,
Expand Down
2 changes: 1 addition & 1 deletion guides/styler-api-guidelines.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ These are used mid-chain or at the end. They should remain as instance methods:
| Modifiers | `wrap`, `phaseAnimation`, `keyframeAnimation` |
| Compound spacing | `padding(.all(8))`, `padding(.horizontal(8))`, `padding(.vertical(8))`, `margin(.all(8))`, `margin(.horizontal(8))`, `margin(.vertical(8))`, `padding(.only(left: 8, right: 8))` |
| Compound border | `border(.all())`, `border(.top())`, `borderRadius(.circular())` |
| Compound box methods | `shadow(.color(...).blurRadius(...))`, `backgroundImageUrl` |
| Compound box methods | `backgroundImageUrl` |
| Text directives | `uppercase`, `titlecase`, `sentencecase`, `reverse` |
| Variants | `onHovered`, `onPressed`, `onDark`, `onLight`, `onDisabled`, `onFocused`, `variant`, `onBreakpoint` |

Expand Down
120 changes: 105 additions & 15 deletions packages/mix/lib/src/animation/animation_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -310,21 +310,18 @@ sealed class AnimationConfig {
const AnimationConfig();

/// Creates animation data with default settings.
static CurveAnimationConfig withDefaults() {
return const CurveAnimationConfig(
duration: kDefaultAnimationDuration,
curve: Curves.linear,
);
}
factory AnimationConfig.withDefaults() => const CurveAnimationConfig(
duration: kDefaultAnimationDuration,
curve: Curves.linear,
);

/// Creates a spring animation configuration with standard spring physics.
static SpringAnimationConfig springDescription({
factory AnimationConfig.springDescription({
double mass = 1.0,
double stiffness = 180.0,
double damping = 12.0,
// Duration delay = Duration.zero,
VoidCallback? onEnd,
}) => .new(
}) => SpringAnimationConfig(
spring: SpringDescription(
mass: mass,
stiffness: stiffness,
Expand All @@ -333,33 +330,126 @@ sealed class AnimationConfig {
onEnd: onEnd,
);

static SpringAnimationConfig spring(
factory AnimationConfig.spring(
Duration duration, {
double bounce = 0,
// Duration delay = Duration.zero,
VoidCallback? onEnd,
}) => .new(
}) => SpringAnimationConfig(
spring: SpringDescription.withDurationAndBounce(
duration: duration,
bounce: bounce,
),
onEnd: onEnd,
);

static SpringAnimationConfig springWithDampingRatio({
factory AnimationConfig.springWithDampingRatio({
double mass = 1.0,
double stiffness = 180.0,
double dampingRatio = 0.8,
// Duration delay = Duration.zero,
VoidCallback? onEnd,
}) => .new(
}) => SpringAnimationConfig(
spring: SpringDescription.withDampingRatio(
mass: mass,
stiffness: stiffness,
ratio: dampingRatio,
),
onEnd: onEnd,
);
Comment on lines 312 to 357
Copy link

Copilot AI Feb 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changing AnimationConfig.withDefaults()/springDescription()/spring()/springWithDampingRatio() from static ... methods returning concrete config types into factory AnimationConfig... constructors weakens the return type to AnimationConfig. This is a source-breaking API change for callers that previously relied on CurveAnimationConfig/SpringAnimationConfig members without casting. Consider keeping typed static helpers (possibly under different names) alongside the new factory wrappers, or provide typed alternatives so downstream code doesn’t need as CurveAnimationConfig / as SpringAnimationConfig.

Copilot uses AI. Check for mistakes.

/// Creates a curve-based spring animation with duration and bounce.
factory AnimationConfig.springDurationBased(
Duration duration, {
double bounce = 0.0,
Duration delay = .zero,
VoidCallback? onEnd,
}) => CurveAnimationConfig.springDurationBased(
duration,
bounce: bounce,
delay: delay,
onEnd: onEnd,
);

/// Creates a curve-based spring animation with explicit physics parameters.
factory AnimationConfig.curveSpring(
Duration duration, {
double mass = 1.0,
double stiffness = 180.0,
double damping = 12.0,
Duration delay = .zero,
VoidCallback? onEnd,
}) => CurveAnimationConfig.spring(
duration,
mass: mass,
stiffness: stiffness,
damping: damping,
delay: delay,
onEnd: onEnd,
);

/// Creates a curve-based spring animation with damping ratio.
factory AnimationConfig.curveSpringWithDampingRatio(
Duration duration, {
double mass = 1.0,
double stiffness = 180.0,
double ratio = 0.8,
Duration delay = .zero,
VoidCallback? onEnd,
}) => CurveAnimationConfig.springWithDampingRatio(
duration,
mass: mass,
stiffness: stiffness,
ratio: ratio,
delay: delay,
onEnd: onEnd,
);

/// Creates a spring animation with standard physics parameters.
factory AnimationConfig.springStandard({
double mass = 1.0,
double stiffness = 180.0,
double damping = 12.0,
VoidCallback? onEnd,
}) => SpringAnimationConfig.standard(
mass: mass,
stiffness: stiffness,
damping: damping,
onEnd: onEnd,
);

/// Creates a spring animation with duration and bounce.
factory AnimationConfig.springWithDurationAndBounce({
Duration duration = const Duration(milliseconds: 500),
double bounce = 0.0,
VoidCallback? onEnd,
}) => SpringAnimationConfig.withDurationAndBounce(
duration: duration,
bounce: bounce,
onEnd: onEnd,
);

/// Creates a critically damped spring animation.
factory AnimationConfig.springCriticallyDamped({
double mass = 1.0,
double stiffness = 180.0,
VoidCallback? onEnd,
}) => SpringAnimationConfig.criticallyDamped(
mass: mass,
stiffness: stiffness,
onEnd: onEnd,
);

/// Creates an under-damped (bouncy) spring animation.
factory AnimationConfig.springUnderdamped({
double mass = 1.0,
double stiffness = 180.0,
double ratio = 0.5,
VoidCallback? onEnd,
}) => SpringAnimationConfig.underdamped(
mass: mass,
stiffness: stiffness,
ratio: ratio,
onEnd: onEnd,
);
}

/// Curve-based animation configuration with fixed duration.
Expand Down
Loading
Loading