Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
a623ec5
feat: add mix_tailwinds Phase 1 POC with review documentation
leoafarias Nov 3, 2025
55cb250
feat: complete mix_tailwinds P1 fixes
leoafarias Nov 3, 2025
0e40e77
docs: close out P1 mix_tailwinds phase
leoafarias Nov 3, 2025
2e9965e
test: add mix_tailwinds smoke test
leoafarias Nov 3, 2025
3c15ea0
fix: match Tailwind flex semantics for prefixed-only tokens
leoafarias Nov 3, 2025
ad528c4
chore: clean up obsolete working documents and finalize implementation
leoafarias Nov 25, 2025
4eee389
fix: resolve analysis errors in mix_tailwinds example tests
leoafarias Nov 25, 2025
7237831
fix: add missing wrapDefaultTextStyle extension for BoxStyler
leoafarias Nov 25, 2025
265ba36
docs: add README with experimental/proof of concept notice
leoafarias Nov 25, 2025
45afb3e
feat: auto-detect flex intent from flex-only properties
leoafarias Nov 25, 2025
9ac4dd6
feat: add animation/transition token parsing support
leoafarias Nov 26, 2025
986a825
fix: restrict duration/delay to standard Tailwind values only
leoafarias Dec 1, 2025
5af0e27
test: add missing delay-100 and delay-700 test coverage
leoafarias Dec 2, 2025
a9b6c9c
feat: add transform utilities
leoafarias Dec 3, 2025
174f54c
docs: organize future work roadmap with Tailwind v4.x gap analysis
leoafarias Dec 4, 2025
e7d3ac5
feat(tw): support variant-aware transforms
leoafarias Dec 5, 2025
c9b9681
feat(tw): add TwConfigProvider and copyWith for custom theming
leoafarias Dec 8, 2025
6cde5c3
feat(tw): improve flex-none behavior, docs, and refactor spacing logic
leoafarias Dec 9, 2025
57ebac2
fix(website): regenerate yarn.lock for @napi-rs/simple-git native bin…
leoafarias Dec 9, 2025
21b8aab
refactor(tw): unify border and radius token handling
leoafarias Dec 9, 2025
4979ae7
refactor(tw): modernize switch statements and rename Warn typedef
leoafarias Dec 9, 2025
23607ae
fix(tw): apply CSS margin semantics for hover/press detection
leoafarias Dec 9, 2025
cb391fc
feat: Enhance border handling and introduce new text components
leoafarias Dec 11, 2025
d2a758e
docs: add simplification strategy from over-engineering review
leoafarias Dec 16, 2025
2e5308b
feat: Enhance P and Span widgets with Tailwind styling and update pub…
leoafarias Dec 17, 2025
921fb45
Remove obsolete image assets and update visual comparison workflow
leoafarias Dec 17, 2025
c6fb580
feat: Add Card Alert Preview widget and Tailwind CSS integration
leoafarias Dec 18, 2025
93903af
feat: Refactor CardAlertPreview widget and enhance responsive sizing …
leoafarias Dec 18, 2025
fc2aee5
feat: add initial implementation of Tailwind CSS semantic values and …
leoafarias Dec 19, 2025
6d800ac
feat: enhance Tailwind CSS integration with additional properties and…
leoafarias Dec 19, 2025
5a9397b
docs: align versions and trim tailwinds notes
leoafarias Dec 21, 2025
4e784e1
fix: bracket-aware colon parsing and CSS semantic margin refactoring
leoafarias Jan 27, 2026
e86c4f2
feat: add variant-aware transforms, text shadows, and blur filter
leoafarias Jan 28, 2026
8b209d4
test: add blur and text shadow test coverage
leoafarias Jan 29, 2026
f7e58b6
fix: remove unused dart:ui import from blur_modifier_test
leoafarias Jan 29, 2026
45a030a
style: apply dart format to fix CI
leoafarias Jan 30, 2026
e22012c
fix(mix_tailwinds): improve visual comparison testing and gradient pa…
leoafarias Jan 30, 2026
5b41f3d
chore(mix_tailwinds): add visual comparison test outputs and lockfile
leoafarias Jan 31, 2026
2ce7b7b
docs(mix_tailwinds): add Codex visual parity analysis workflow
leoafarias Jan 31, 2026
41c13c2
feat(mix_tailwinds): add box utilities to Span and margin support to …
leoafarias Feb 2, 2026
3d264c1
test(mix_tailwinds): add tests for Span box utilities and P/H* margins
leoafarias Feb 2, 2026
60ed569
style(mix_tailwinds): apply dart format
leoafarias Feb 2, 2026
d4c73cb
fix(mix_tailwinds): improve visual parity with Tailwind CSS
leoafarias Feb 2, 2026
2eaaf18
Fix div sizing and screenshot harness
leoafarias Feb 2, 2026
2f12fa2
Match Tailwind shadows and text line-height
leoafarias Feb 3, 2026
391edbc
fix(mix_tailwinds): w-full/h-full in flex
leoafarias Feb 3, 2026
1614772
chore(examples): satisfy dcm style rules
leoafarias Feb 3, 2026
0efacfc
style(mix_tailwinds): apply dart format
leoafarias Feb 3, 2026
53c243f
fix(mix_tailwinds): correctness fixes and unbounded flex CSS parity
leoafarias Feb 6, 2026
32d6117
Fix responsive flex width parity and default items stretch
leoafarias Feb 6, 2026
60a7bdc
style(mix_tailwinds): format golden tests and config
leoafarias Feb 6, 2026
8066972
ci: make widgetbook workflow valid and disabled
leoafarias Feb 6, 2026
68e7bc9
docs: remove legacy dot-shorthand setup and align example SDK floor
leoafarias Feb 6, 2026
5745f89
docs(mix_tailwinds): remove FUTURE_WORK.md and update FLUTTER_ADAPTAT…
leoafarias Feb 6, 2026
731c5c3
ci: pin format check to .fvmrc Flutter version
leoafarias Feb 6, 2026
34127a6
fix: remove dead website scripts and fix __dirname in mjs files
leoafarias Feb 6, 2026
648681e
chore(mix_tailwinds): remove completed text rendering exploration art…
leoafarias Feb 6, 2026
56f7322
feat(mix_tailwinds): improve parser, tests, and exports
leoafarias Feb 6, 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
5 changes: 4 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: kuhnroyal/flutter-fvm-config-action@v2
id: fvm-config-action
- uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }}
channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }}
- name: Check formatting
run: dart format --set-exit-if-changed .

Expand Down
63 changes: 9 additions & 54 deletions .github/workflows/widgetbook.yml
Original file line number Diff line number Diff line change
@@ -1,56 +1,11 @@
# name: "Widgetbook"
name: Widgetbook (disabled)

# on: push
on:
workflow_dispatch:

# jobs:
# production:
# runs-on: ubuntu-latest
# steps:
# - name: Checkout
# uses: actions/checkout@v4

# - name: Install FVM
# shell: bash
# run: |
# curl -fsSL https://fvm.app/install.sh | bash
# fvm use ${{ inputs.flutter-version }} --force

# - uses: kuhnroyal/flutter-fvm-config-action@v2
# id: fvm-config-action

# - uses: subosito/flutter-action@v2
# with:
# flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }}
# channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }}

# - name: Flutter version
# shell: bash
# run: flutter --version

# - name: Setup Melos
# uses: bluefireteam/melos-action@v3

# - name: Bootstrap App
# shell: bash
# run: |
# flutter pub get

# - name: Bootstrap Widgetbook
# working-directory: packages/remix/demo
# shell: bash
# run: |
# flutter pub get
# dart run build_runner build -d

# - name: Build Widgetbook
# working-directory: packages/remix/demo
# shell: bash
# run: |
# flutter build web

# - name: Install Widgetbook CLI
# run: dart pub global activate widgetbook_cli

# - name: Upload Widgetbook
# working-directory: packages/remix/demo
# run: widgetbook cloud build push --api-key ${{ secrets.WIDGETBOOK_API_KEY }}
jobs:
disabled:
runs-on: ubuntu-latest
steps:
- name: Notice
run: echo "Widgetbook workflow is intentionally disabled."
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ packages/mix/.cody/ignore

.cursor
.orbit
CLAUDE.md
!packages/mix_tailwinds/CLAUDE.md
.augment/env/setup.sh

# API compatibility reports
Expand Down
112 changes: 50 additions & 62 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Mix addresses these challenges by creating a styling system that uses utility fu
### Prerequisites

- **Dart SDK**: ≥ 3.10.0 (required for dot notation syntax)
- **Flutter**: Latest stable version
- **Flutter**: ≥ 3.38.1

### Add Mix to Your Project

Expand All @@ -62,85 +62,74 @@ flutter pub add mix:^2.0.0-rc.0

### **Powerful Styling API**:

Styles are easily defined using Styler classes like `BoxStyler` and `TextStyler`, which provide a fluent, chainable API for defining style properties:
Styles are easily defined using the `Style` class, which allows you to define a style's properties and values. Here's an example of defining a style:

```dart
final cardStyle = BoxStyler()
.height(100)
.width(240)
.color(Colors.purple)
.borderRounded(12)
.paddingAll(16);

// Apply the style to a Box widget
Box(
style: cardStyle,
child: StyledText(
'Hello Mix',
style: TextStyler().color(Colors.white).fontSize(18),
),
// Traditional syntax with cascade notation (always supported)
final style = Style(
$box.height(100)
..width(100)
..color.purple()
..borderRadius(10),
);
```

### Enabling Dot Notation Syntax (Recommended)

Mix 2.0 is optimized for Dart's experimental dot notation syntax, which provides an even cleaner API. To enable it, add this to your `analysis_options.yaml`:

```yaml
analyzer:
enable-experiment:
- dot-shorthands
// NEW: Dot notation syntax (requires Dart SDK ≥ 3.10.0)
final style = Style.box(
.height(100)
.width(100)
.color(Colors.purple)
.borderRadius(.circular(10))
);
```

With dot notation enabled, you can write:
### Dot Notation Syntax (Recommended)

```dart
final cardStyle = BoxStyler()
.height(100)
.width(240)
.color(Colors.purple)
.borderRounded(12);
```
Mix 2.0 is optimized for Dart's dot notation syntax, which provides a cleaner and more intuitive API. On Dart SDK `>=3.10.0`, no `analysis_options.yaml` experiment flag is required.

**Note**: This feature requires Dart SDK ≥ 3.10.0.
The traditional cascade syntax is still fully supported.

Learn more about [styling](https://fluttermix.com/docs/guides/styling)

### **First-Class Variant Support**:

First-class support for variants, allowing you to define styling variations that can be applied conditionally or responsively.

```dart
// Define styles with widget state variants
final buttonStyle = BoxStyler()
.borderRounded(10)
.color(Colors.blue)
.paddingAll(16)
// Variants are applied automatically based on widget state
.onHovered(BoxStyler().color(Colors.blue.shade700))
.onPressed(BoxStyler().color(Colors.blue.shade900));

// Use with a Pressable widget - states are tracked automatically
Pressable(
onPress: () => print('Pressed!'),
child: Box(style: buttonStyle, child: Text('Click me')),
```dart {1, 8-12, 15}
const onOutlined = NamedVariant('outlined');

final baseStyle = Style(
$box.borderRadius(10),
$box.color.black(),
$text.style.color.white(),

onOutlined(
$box.color.transparent(),
$box.border.color.black(),
$text.style.color.black(),
),
);

final outlinedStyle = baseStyle.applyVariant(onOutlined);
```

Learn more about [dynamic styling](https://fluttermix.com/docs/guides/dynamic-styling)
Learn more about [variants](https://fluttermix.com/docs/guides/variants)

### **BuildContext Responsive Styling**:

Mix allows you to define styles that are context-aware, applying styles conditionally based on the BuildContext.
Mix allows you to define styles that are context-aware, allowing you to apply styles conditionally based on the BuildContext.

```dart
final style = BoxStyler()
.color(Colors.black)
.onDark(BoxStyler().color(Colors.white))
.onLight(BoxStyler().color(Colors.black));
```dart {4-7}
final style = Style(
$box.color.black(),
$text.style.color.white(),
$on.dark(
$box.color.white(),
$text.style.color.black(),
),
);
```

Learn more about [dynamic styling](https://fluttermix.com/docs/guides/dynamic-styling)
Learn more about [context variants](https://fluttermix.com/docs/guides/variants#context-variants)

### **Design Tokens and Theming**:

Expand All @@ -151,12 +140,11 @@ Mix goes beyond the Material `Theme` definitions by allowing the definition of d
A complete set of utility primitives allows you to define styling properties and values in a more intuitive and composable way.

```dart
BoxStyler()
.paddingAll(20) // Padding 20 on all sides
.paddingX(16) // Padding 16 on left and right
.paddingY(8) // Padding 8 on top and bottom
.paddingTop(20) // Padding 20 on top
.paddingLeft(20); // Padding 20 on left
$box.padding(20); /// Padding 20 on all sides
$box.padding(20, 10); /// Padding 20 on top and bottom, 10 on left and right

$box.padding.top(20); /// Padding 20 on top
$box.padding.horizontal(20); /// Padding 20 on left and right
```

Learn more about [utilities](https://fluttermix.com/docs/overview/utility-first)
Expand Down
Loading
Loading