1.0.0 prep: hardening, live-QA fixes, and doc sync#94
Conversation
On Flutter web dart:io File throws at runtime; the /-leading background image branch now returns null on web (graceful degrade) and keeps FileImage on non-web. Adds an explicit platforms: map so pub.dev does not narrow platform detection from the dart:io import graph.
Aligns max-w-prose with max-w-lg and Tailwind's 65ch reading-width intent as a deliberate fixed-px divergence (was 1040px).
When semanticLabel is set, WAnchor now emits a single Semantics node with excludeSemantics:true and lifts onTap/onLongPress onto it, so the accessible name no longer doubles with visible child text while screen reader activation still fires. The label-null path is unchanged.
copyWith no longer fabricates an empty BoxDecoration when decoration is null, keeping the downstream decoration != null Container gate honest.
needsContainer treats an empty boxShadow as no shadow, so shadow-none no longer forces a needless Container.
Defensively coerce non-string type and non-list children from untrusted JSON instead of throwing on a malformed server-driven payload.
Adds value-based operator== across all 23 fields (mapEquals for token maps) and a scalar-only hashCode so theme changes compare by value.
Documents that a programmatic controller.text assignment does not fire onChanged, per the Flutter TextField contract.
Comment now reads up to 7 fields (5 always + 2 conditional).
Fixes broken/absolute links, adds WPopover autoFlip, semanticLabel wording, ring/updateTheme/equality notes, and tracking/max-w-prose divergence rows across the doc/ reference.
Bumps SKILL.md surface counts, refines semanticLabel and token notes, and aligns the references with the v1 widget/parser/theme roster.
Updates widget/parser counts (22 widgets, 19 parsers, 7 debug fields, 24 icons) across README, ARCHITECTURE, llms.txt and CLAUDE, and logs the fixes under the CHANGELOG release section.
Aligns the copilot instructions and .claude/rules with the v1 counts, Container-elision, copyWith and semanticLabel conventions.
Replaces Lorem ipsum with realistic content and adds dark: pairs to color tokens across the affected demo pages.
Removes 13 parser-class exports plus WindPlatformService, WindLogger/ LogEntry, WDynamicRenderer and WindDebugResolverImpl from the public barrel (breaking-by-design for the unreleased 1.0.0). Repoints the barrel-consumer tests to direct src/ imports; the debug resolver stays reachable for consumers via the Wind facade.
…nd widgets reference
…rride, barrel lockdown
…t disabled branch
WindDebugResolverImpl.resolve called (widget as dynamic).className on every W-prefixed widget, but WAnchor/WBreakpoint/WindAnimationWrapper/ WKeyboardActions have no className, so a bare WAnchor in the tree threw NoSuchMethodError and crashed the whole dusk/telescope diagnostic snapshot. Guard the dynamic read (deliberate NoSuchMethodError handling) and treat absence as a non-stylable miss. Found via live QA.
The public enum collided with Flutter Material's own DatePickerMode, forcing every consumer importing both material and the wind barrel to hide one symbol (wind itself did internally). Rename to WDatePickerMode and drop the now-redundant hide clauses. Breaking, acceptable pre-publish. Renamed across lib, tests, example pages, docs and skill. Found via live QA in a fresh consumer app.
Accept Tailwind's canonical self-* shorthand (self-start/end/center/ stretch/auto/baseline) as an alias for align-self-*. Fix shrink-0, which canParse claimed but never mapped, so flexFit stayed null (silent no-op); it now sets FlexFit.tight. Document the remaining unsupported Tailwind classes (inline-flex, logical rounded-s/e and ms/me, negative space) in the divergence reference. Found via live Tailwind-component QA.
The earlier shrink-0 -> FlexFit.tight change was a misdiagnosis: a non-null flexFit makes the widget self-wrap in Flexible(fit: tight), forcing a fill (the opposite of shrink-0) and asserting outside a Flex. shrink-0's no-shrink behavior is delivered by WDiv._hasShrinkZero, so flexFit must stay null. Reverts the map entry + test assertions, adds render-level regression tests (standalone builds with no Flexible wrap; Row child keeps intrinsic width), and drops the stale CHANGELOG/ divergence wording. Caught during the 1.0.0 doc-sync pass.
….0.0 Documents the self-* align-self shorthand (flexbox + tokens + SKILL), notes the debug resolver now safely skips className-less W-widgets (WAnchor etc.) instead of crashing the snapshot, and adds the brightness + syncWithSystem gotcha (a declarative brightness is overridden by OS sync unless syncWithSystem:false). Bumps skill to v2.0.3 for the API-surface change.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (6)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (5)
📝 WalkthroughWalkthroughFactual release consolidation: API renames (WDatePickerMode), accessibility semantics (semanticLabel), parser/layout fixes (self-*, shrink-0, max-w-prose), WindTheme value equality, debug/dynamic hardening, docs/examples additions, export-surface cleanup, and matching test updates. ChangesRelease consolidation
Estimated code review effort Possibly related PRs
✨ Finishing Touches🧪 Generate unit tests (beta)
|
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Pull request overview
Pre-1.0.0 stabilization and doc/API sync pass across Wind’s parser + widget surfaces, incorporating live QA findings, tightening public exports, and updating docs/examples/skills to match the final v1 API.
Changes:
- Hardened core runtime behaviors (web-safe background images, defensive dynamic JSON, debug resolver robustness, container elision, shrink-0 regression coverage).
- Finalized API surface adjustments (e.g.,
DatePickerMode→WDatePickerMode, reduced public barrel exports,WindThemeDatavalue equality). - Synchronized docs/examples/skills/README/changelog for the 1.0.0 roster and semantics guidance.
Reviewed changes
Copilot reviewed 97 out of 97 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| test/wind_facade_test.dart | Tests updated for internal debug resolver access. |
| test/widgets/w_form_date_picker_test.dart | Updated tests for WDatePickerMode rename. |
| test/widgets/w_div/flex_shrink_test.dart | Added shrink-0 regression widget tests. |
| test/widgets/w_date_picker_test.dart | Updated mode enum + added rename regression tests. |
| test/widgets/w_button_test.dart | Added semantics coverage for semanticLabel. |
| test/widgets/w_anchor_test.dart | Added semantics coverage for semanticLabel behavior. |
| test/utils/wind_logger_test.dart | Updated tests for non-exported logger. |
| test/theme/wind_theme_data_test.dart | Added WindThemeData equality/hash tests. |
| test/parser/wind_style_test.dart | New tests for WindStyle.copyWith decoration behavior. |
| test/parser/parsers/zindex_parser_test.dart | Updated to import internal parser directly. |
| test/parser/parsers/transition_parser_test.dart | Updated to import internal parser directly. |
| test/parser/parsers/text_parser_font_family_test.dart | Updated to import internal parser directly. |
| test/parser/parsers/sizing_parser_test.dart | Added max-w-prose regression + cache clear. |
| test/parser/parsers/shadow_parser_test.dart | Updated shadow-none expectations for container elision. |
| test/parser/parsers/ring_parser_test.dart | Updated to import internal parser directly. |
| test/parser/parsers/overflow_parser_test.dart | Updated to import internal parser directly. |
| test/parser/parsers/flexbox_grid_parser_test.dart | Updated shrink-0 semantics + added self-* alias tests. |
| test/parser/parsers/background_parser_test.dart | Added web-safe image-provider selection tests. |
| test/parser/parsers/aspectratio_parser_test.dart | Updated to import internal parser directly. |
| test/dynamic/w_dynamic_renderer_test.dart | Added hostile JSON coercion regression tests. |
| test/debug_resolver_test.dart | Added resolver robustness tests for className-less widgets. |
| test/core/platform_service_test.dart | Updated tests for non-exported platform service. |
| skills/wind-ui/SKILL.md | Bumped skill version + updated guidance catalog. |
| skills/wind-ui/references/widgets.md | Added WKeyboardActions/WindAnimationWrapper + updated types. |
| skills/wind-ui/references/tokens.md | Updated token docs (self-*, max-w-prose, border-x/y). |
| skills/wind-ui/references/theme.md | Updated theming docs for equality + sync gotcha. |
| skills/wind-ui/references/tailwind-divergence.md | Documented prose + tracking divergences + debug fields. |
| skills/wind-ui/references/forms.md | Updated form docs for WDatePickerMode. |
| skills/wind-ui/references/dynamic.md | Updated dynamic docs (icon count, mapping notes). |
| skills/wind-ui/references/debug.md | Updated resolver contract + className-less widget behavior. |
| README.md | Synced public surface counts (widgets/parsers/etc). |
| pubspec.yaml | Declared explicit supported platforms for pub.dev. |
| llms.txt | Synced package surface counts + debug resolver field count. |
| lib/src/widgets/w_text.dart | Added dartdoc cross-links (“See also”). |
| lib/src/widgets/w_input.dart | Added behavior clarifications + dartdoc cross-links. |
| lib/src/widgets/w_form_date_picker.dart | Updated to WDatePickerMode. |
| lib/src/widgets/w_div.dart | Container elision: avoid wrapping on empty shadows. |
| lib/src/widgets/w_date_picker.dart | Renamed public enum to WDatePickerMode. |
| lib/src/widgets/w_button.dart | Added semanticLabel API and forwarded to WAnchor. |
| lib/src/widgets/w_anchor.dart | Implemented semanticLabel override semantics path. |
| lib/src/theme/wind_theme_data.dart | Implemented value == + hashCode. |
| lib/src/parser/wind_style.dart | Keep decoration null unless explicitly set in copyWith. |
| lib/src/parser/parsers/sizing_parser.dart | Tailwind-aligned max-w-prose to fixed 512px. |
| lib/src/parser/parsers/flexbox_grid_parser.dart | Added self-* alias + clarified shrink-0 behavior. |
| lib/src/parser/parsers/background_parser.dart | Web-safe FileImage guard + fix hex-as-image parsing. |
| lib/src/dynamic/w_dynamic_renderer.dart | Defensive coercion for untrusted JSON shapes. |
| lib/src/debug_resolver.dart | Guard className access for W-widgets without className. |
| lib/fluttersdk_wind.dart | Locked down barrel exports (hide internals). |
| example/lib/routes.dart | Registered new example routes. |
| example/lib/pages/widgets/wind_animation_wrapper_basic.dart | Added WindAnimationWrapper demo page. |
| example/lib/pages/widgets/w_keyboard_actions_basic.dart | Added WKeyboardActions demo page. |
| example/lib/pages/widgets/w_date_picker.dart | Updated example to WDatePickerMode. |
| example/lib/pages/widgets/date_picker_styled.dart | Updated imports post-enum rename. |
| example/lib/pages/widgets/date_picker_range.dart | Updated docs/strings and enum usage. |
| example/lib/pages/widgets/date_picker_basic.dart | Updated imports post-enum rename. |
| example/lib/pages/typography/alignment.dart | Added dark variant + replaced placeholder paragraph text. |
| example/lib/pages/spacing/margin.dart | Added dark variants to color demos. |
| example/lib/pages/forms/form_date_picker_range.dart | Updated copy + enum usage. |
| example/lib/pages/forms/form_date_picker_basic.dart | Updated imports post-enum rename. |
| example/lib/pages/examples/blog_section.dart | Replaced lorem ipsum with realistic copy. |
| example/lib/pages/effects/states_basic.dart | Added dark variants to state demos. |
| example/lib/pages/effects/shadow.dart | Added dark variants to colored shadow demos. |
| example/lib/pages/animation/animation_basic.dart | Added dark variants to animation demos. |
| doc/widgets/wind-animation-wrapper.md | New WindAnimationWrapper documentation page. |
| doc/widgets/w-text.md | Props table required formatting fix. |
| doc/widgets/w-svg.md | Removed outdated related-link reference. |
| doc/widgets/w-popover.md | Documented autoFlip parameter. |
| doc/widgets/w-keyboard-actions.md | New WKeyboardActions documentation page. |
| doc/widgets/w-form-select.md | Removed outdated related-link reference. |
| doc/widgets/w-form-input.md | Documented new constructor params (restorationId/focusNode). |
| doc/widgets/w-form-date-picker.md | Updated docs to WDatePickerMode. |
| doc/widgets/w-dynamic.md | Added dark variants in JSON example. |
| doc/widgets/w-div.md | Fixed internal doc links to local paths. |
| doc/widgets/w-date-picker.md | Updated docs to WDatePickerMode. |
| doc/widgets/w-button.md | Documented semanticLabel. |
| doc/widgets/w-breakpoint.md | Fixed related links to new doc structure. |
| doc/widgets/w-anchor.md | Documented semanticLabel. |
| doc/utilities/responsive-helpers.md | Fixed relative link to responsive design guide. |
| doc/typography/text-overflow.md | Removed outdated related-link reference. |
| doc/typography/font-family.md | Updated guidance for custom fonts in WindThemeData. |
| doc/styling/opacity.md | Fixed relative links. |
| doc/styling/background-color.md | Fixed relative links / consolidated border docs link. |
| doc/layout/z-index.md | Fixed relative links to layout docs. |
| doc/layout/sizing.md | Updated max-w-prose docs + link fix. |
| doc/layout/positioning.md | Added dark variants + fixed related links. |
| doc/layout/flexbox.md | Documented self-* shorthand alias. |
| doc/layout/display.md | Removed outdated related-link reference. |
| doc/core-concepts/theming.md | Documented sync gotcha + controller methods + equality. |
| doc/borders/borders.md | Fixed relative link to ring docs. |
| dartdoc_options.yaml | Added GitHub source linking for dartdoc. |
| CLAUDE.md | Synced acceptance counts for v1 public surface. |
| CHANGELOG.md | Updated 1.0.0 notes (TBD date + detailed fixes). |
| ARCHITECTURE.md | Synced parser/widget counts + debug resolver field count. |
| .github/copilot-instructions.md | Synced parser/widget counts in instructions. |
| .claude/rules/widgets.md | Added semantics + container-elision rules. |
| .claude/rules/parsers.md | Documented decoration-null constraint for copyWith usage. |
| .claude/rules/dynamic.md | Updated dynamic renderer docs (date picker note, icon count). |
| // 1. One FocusNode per field so WKeyboardActions can navigate between them. | ||
| final _nameFocus = FocusNode(); | ||
| final _emailFocus = FocusNode(); | ||
| final _amountFocus = FocusNode(); |
| WInput( | ||
| focusNode: _amountFocus, | ||
| placeholder: '0.00', | ||
| keyboardType: TextInputType.number, |
There was a problem hiding this comment.
Actionable comments posted: 9
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
test/parser/parsers/flexbox_grid_parser_test.dart (1)
172-178:⚠️ Potential issue | 🟠 Major | ⚡ Quick winAlign conflicting
shrink/shrink-0expectations with last-class-wins parser contract.These tests currently enforce order-independent outcomes for conflicting classes, which contradicts the parser contract that later classes override earlier ones. Please update expectations so order changes the result.
Proposed test expectation fix
- test('shrink contributes FlexFit.loose; shrink-0 contributes none', () { + test('last class wins for shrink vs shrink-0', () { final styles = parser.parse(WindStyle(), ['shrink', 'shrink-0'], context); - expect(styles.flexFit, FlexFit.loose); + expect(styles.flexFit, isNull); }); ... - test('shrink contributes FlexFit.loose regardless of shrink-0 position', + test('shrink/shrink-0 resolution follows class order', () { - expect( - parser.parse(WindStyle(), ['shrink', 'shrink-0'], context).flexFit, - FlexFit.loose, - ); + expect( + parser.parse(WindStyle(), ['shrink', 'shrink-0'], context).flexFit, + isNull, + ); expect( parser.parse(WindStyle(), ['shrink-0', 'shrink'], context).flexFit, FlexFit.loose, );As per coding guidelines:
lib/src/parser/**/*.dart: “Last class wins — later classes override earlier ones for the same property.”Also applies to: 206-218
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/parser/parsers/flexbox_grid_parser_test.dart` around lines 172 - 178, The test currently expects order-independent behavior for conflicting classes but the parser follows "last class wins"; update the assertions so the final class in the input list decides the result. For the test using parser.parse(WindStyle(), ['shrink', 'shrink-0'], context) (the 'shrink contributes FlexFit.loose; shrink-0 contributes none' test) change the expectation to reflect that 'shrink-0' (the later class) overrides 'shrink' and results in no FlexFit (i.e., assert that styles.flexFit is null or not set). Also adjust the paired/reversed-order test (the one using ['shrink-0', 'shrink']) to expect FlexFit.loose when 'shrink' is last; update any other related assertions in the block around lines 206-218 similarly so they follow the last-class-wins contract.Source: Coding guidelines
🧹 Nitpick comments (1)
doc/widgets/wind-animation-wrapper.md (1)
128-131: ⚡ Quick winNormalize Related Documentation links to the required format.
These bullets include trailing descriptions (
:...). The doc rule asks for plain link entries (- [Widget Name](path)), so please align this section for consistency.Suggested doc patch
-- [WDiv](./w-div.md): Universal container; supports `animate-*` via `className`. -- [WIcon](./w-icon.md): Icon widget; wraps automatically in `WindAnimationWrapper` when className contains `animate-*`. -- [Animation](../interactivity/animation.md): Full reference for the `animate-*` tokens. -- [Transition](../interactivity/transition.md): Reference for `transition-*`, `duration-*`, and `ease-*` tokens. +- [WDiv](./w-div.md) +- [WIcon](./w-icon.md) +- [Animation](../interactivity/animation.md) +- [Transition](../interactivity/transition.md)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@doc/widgets/wind-animation-wrapper.md` around lines 128 - 131, Update the four bullet entries so they are plain link lines without trailing descriptions: replace the current lines referencing WDiv, WIcon, Animation, and Transition (which include colon and explanatory text) with simple entries like "- [WDiv](./w-div.md)", "- [WIcon](./w-icon.md)", "- [Animation](../interactivity/animation.md)", and "- [Transition](../interactivity/transition.md)" so the section conforms to the doc rule requiring plain link entries.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@CHANGELOG.md`:
- Line 58: Update the platform name casing in the release notes by replacing the
lowercase token "macos" with the canonical "macOS" in the sentence describing
declared platform support (the string listing `android`, `ios`, `macos`, `web`,
`linux`, `windows`) in CHANGELOG.md so it reads `android`, `ios`, `macOS`,
`web`, `linux`, `windows`; preserve all other punctuation and wording.
- Line 39: Update the mismatched version string in the CHANGELOG entry that
currently reads "`wind-ui` skill v2.0.2 community pattern" to reflect the
shipped artifact version v2.0.3 so the changelog matches the PR summary; locate
the bullet containing "`skills/wind-ui/SKILL.md` section 15" /
"`skills/wind-ui/references/community.md`" and replace "v2.0.2" with "v2.0.3".
In `@doc/widgets/w-form-input.md`:
- Around line 66-70: Add a Props table row documenting the new constructor
parameter restorationId: describe its type (String?), purpose (restoration ID
for state restoration), default/nullable behavior (optional, nullable), and
where it applies (used by WFormInput constructor/props) so the API docs include
searchable details for restorationId; update the Props table in this doc next to
the existing entries like enabled and focusNode and follow the same formatting
as other rows.
In `@example/lib/pages/effects/states_basic.dart`:
- Line 43: The focus classes in the className string "bg-white dark:bg-slate-800
border border-gray-300 dark:border-gray-600 focus:ring-2 focus:ring-blue-500
focus:border-blue-500 px-6 py-3 rounded-lg" lack dark-mode variants; update that
string to include dark:focus:ring-<blue> and dark:focus:border-<blue>
equivalents (for example add dark:focus:ring-blue-400 and
dark:focus:border-blue-400) so the focus ring and border use appropriate styles
in dark mode.
In `@example/lib/pages/widgets/w_keyboard_actions_basic.dart`:
- Around line 42-47: The page currently returns ExampleScaffold as the root (see
ExampleScaffold) but must use a root WDiv with className 'w-full h-full
overflow-y-auto p-4' and scrollPrimary: true; replace the top-level
ExampleScaffold with WDiv(..., scrollPrimary: true, child: ...) and refactor the
children into the required structure using the helper functions
_buildHeader(...) for the page header and _buildSection(...) for content
sections, ensuring the same title/description/children are moved into those
helpers and the overall visual layout is preserved.
- Around line 54-58: The issue is that the same FocusNode instance (_nameFocus)
is being attached to multiple WInput widgets; create distinct FocusNode
instances for each WInput instead of reusing _nameFocus (e.g., _nameFocus1,
_nameFocus2, _nameFocus3 or local fields per form section), update each WInput's
focusNodes list to reference its own unique FocusNode (also ensure _emailFocus
and _amountFocus are not reused across multiple inputs), and add/dispose these
new FocusNode members in the widget State's initState/dispose (call dispose()
for each new FocusNode) so there are no multiple attachments or memory leaks.
- Line 93: The className string currently uses 'flex flex-row gap-2 flex-wrap'
which is a no-op; update the className used in the widget (the property value
'flex flex-row gap-2 flex-wrap') to use Wind-supported wrapping by replacing
'flex-wrap' with 'wrap' so it becomes 'flex flex-row wrap gap-2' (preserve other
utilities and spacing order as needed).
In `@example/lib/pages/widgets/wind_animation_wrapper_basic.dart`:
- Line 144: The demo is using a hardcoded color in the Icon widget (child:
Icon(icon, size: 28, color: Colors.grey)), which bypasses Wind theming and has
no dark-mode variant; replace Icon with the Wind-aware WIcon (or remove the
color prop) and apply a className/token-based color (e.g., a text color token
with a matching dark: variant) so the icon follows the Wind theme and responds
to dark mode changes.
In `@lib/src/parser/parsers/background_parser.dart`:
- Around line 254-259: The coverage pragma lacks the required one-line WHY
comment immediately above the ignored line in the kIsWeb branch; add a
single-line rationale comment directly above the exact statement "return null;
// coverage:ignore-line" in background_parser.dart (inside the code handling
kIsWeb in the relevant parser function) explaining why the line is ignored
(e.g., File unsupported on web), so the WHY comment sits on the line immediately
above that return null statement.
---
Outside diff comments:
In `@test/parser/parsers/flexbox_grid_parser_test.dart`:
- Around line 172-178: The test currently expects order-independent behavior for
conflicting classes but the parser follows "last class wins"; update the
assertions so the final class in the input list decides the result. For the test
using parser.parse(WindStyle(), ['shrink', 'shrink-0'], context) (the 'shrink
contributes FlexFit.loose; shrink-0 contributes none' test) change the
expectation to reflect that 'shrink-0' (the later class) overrides 'shrink' and
results in no FlexFit (i.e., assert that styles.flexFit is null or not set).
Also adjust the paired/reversed-order test (the one using ['shrink-0',
'shrink']) to expect FlexFit.loose when 'shrink' is last; update any other
related assertions in the block around lines 206-218 similarly so they follow
the last-class-wins contract.
---
Nitpick comments:
In `@doc/widgets/wind-animation-wrapper.md`:
- Around line 128-131: Update the four bullet entries so they are plain link
lines without trailing descriptions: replace the current lines referencing WDiv,
WIcon, Animation, and Transition (which include colon and explanatory text) with
simple entries like "- [WDiv](./w-div.md)", "- [WIcon](./w-icon.md)", "-
[Animation](../interactivity/animation.md)", and "-
[Transition](../interactivity/transition.md)" so the section conforms to the doc
rule requiring plain link entries.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 686d9aa5-6790-43eb-96be-79cd6a3a5da4
📒 Files selected for processing (97)
.claude/rules/dynamic.md.claude/rules/parsers.md.claude/rules/widgets.md.github/copilot-instructions.mdARCHITECTURE.mdCHANGELOG.mdCLAUDE.mdREADME.mddartdoc_options.yamldoc/borders/borders.mddoc/core-concepts/theming.mddoc/layout/display.mddoc/layout/flexbox.mddoc/layout/positioning.mddoc/layout/sizing.mddoc/layout/z-index.mddoc/styling/background-color.mddoc/styling/opacity.mddoc/typography/font-family.mddoc/typography/text-overflow.mddoc/utilities/responsive-helpers.mddoc/widgets/w-anchor.mddoc/widgets/w-breakpoint.mddoc/widgets/w-button.mddoc/widgets/w-date-picker.mddoc/widgets/w-div.mddoc/widgets/w-dynamic.mddoc/widgets/w-form-date-picker.mddoc/widgets/w-form-input.mddoc/widgets/w-form-select.mddoc/widgets/w-keyboard-actions.mddoc/widgets/w-popover.mddoc/widgets/w-svg.mddoc/widgets/w-text.mddoc/widgets/wind-animation-wrapper.mdexample/lib/pages/animation/animation_basic.dartexample/lib/pages/effects/shadow.dartexample/lib/pages/effects/states_basic.dartexample/lib/pages/examples/blog_section.dartexample/lib/pages/forms/form_date_picker_basic.dartexample/lib/pages/forms/form_date_picker_range.dartexample/lib/pages/spacing/margin.dartexample/lib/pages/typography/alignment.dartexample/lib/pages/widgets/date_picker_basic.dartexample/lib/pages/widgets/date_picker_range.dartexample/lib/pages/widgets/date_picker_styled.dartexample/lib/pages/widgets/w_date_picker.dartexample/lib/pages/widgets/w_keyboard_actions_basic.dartexample/lib/pages/widgets/wind_animation_wrapper_basic.dartexample/lib/routes.dartlib/fluttersdk_wind.dartlib/src/debug_resolver.dartlib/src/dynamic/w_dynamic_renderer.dartlib/src/parser/parsers/background_parser.dartlib/src/parser/parsers/flexbox_grid_parser.dartlib/src/parser/parsers/sizing_parser.dartlib/src/parser/wind_style.dartlib/src/theme/wind_theme_data.dartlib/src/widgets/w_anchor.dartlib/src/widgets/w_button.dartlib/src/widgets/w_date_picker.dartlib/src/widgets/w_div.dartlib/src/widgets/w_form_date_picker.dartlib/src/widgets/w_input.dartlib/src/widgets/w_text.dartllms.txtpubspec.yamlskills/wind-ui/SKILL.mdskills/wind-ui/references/debug.mdskills/wind-ui/references/dynamic.mdskills/wind-ui/references/forms.mdskills/wind-ui/references/tailwind-divergence.mdskills/wind-ui/references/theme.mdskills/wind-ui/references/tokens.mdskills/wind-ui/references/widgets.mdtest/core/platform_service_test.darttest/debug_resolver_test.darttest/dynamic/w_dynamic_renderer_test.darttest/parser/parsers/aspectratio_parser_test.darttest/parser/parsers/background_parser_test.darttest/parser/parsers/flexbox_grid_parser_test.darttest/parser/parsers/overflow_parser_test.darttest/parser/parsers/ring_parser_test.darttest/parser/parsers/shadow_parser_test.darttest/parser/parsers/sizing_parser_test.darttest/parser/parsers/text_parser_font_family_test.darttest/parser/parsers/transition_parser_test.darttest/parser/parsers/zindex_parser_test.darttest/parser/wind_style_test.darttest/theme/wind_theme_data_test.darttest/utils/wind_logger_test.darttest/widgets/w_anchor_test.darttest/widgets/w_button_test.darttest/widgets/w_date_picker_test.darttest/widgets/w_div/flex_shrink_test.darttest/widgets/w_form_date_picker_test.darttest/wind_facade_test.dart
💤 Files with no reviewable changes (5)
- doc/layout/display.md
- doc/widgets/w-form-select.md
- doc/typography/text-overflow.md
- doc/widgets/w-svg.md
- lib/fluttersdk_wind.dart
| - **Accessibility / Semantics** on 7 interactive widgets (`WAnchor`, `WButton`, `WInput`, `WFormInput`, `WCheckbox`, `WSelect`, `WDatePicker`): emit `Semantics` nodes with role + label, password fields mark `obscured`. Enables Playwright `getByRole` / `getByLabel` / `getByText` resolution against the Flutter web build. New optional `semanticLabel` parameters on `WInput`, `WButton`, and `WAnchor`; the button/anchor label gives icon-only controls an accessible name when there is no child text for `MergeSemantics` to absorb. | ||
| - **`Wind.installDebugResolver()`**: call inside `kDebugMode` to register a `WindDebugResolverImpl` against the new `fluttersdk_wind_diagnostics_contracts` bridge. Resolves 7 fields per Wind widget element: `className`, `breakpoint`, `brightness`, `platform`, `states`, conditional `bgColor`, conditional `textColor`. Consumed by `fluttersdk_dusk` for E2E snapshot capture and by any runtime inspector. Tree-shaken in release builds. | ||
| - **`wind-ui` skill v2.0.1 community pattern**: `skills/wind-ui/SKILL.md` section 15 plus `skills/wind-ui/references/community.md` add opt-in star + issue-report CTAs surfaced once per session after a verified Wind task or a genuine wind-side bug. Prose-permission only, never auto-executed, `gh auth status`-gated. (#89) | ||
| - **`wind-ui` skill v2.0.2 community pattern**: `skills/wind-ui/SKILL.md` section 15 plus `skills/wind-ui/references/community.md` add opt-in star + issue-report CTAs surfaced once per session after a verified Wind task or a genuine wind-side bug. Prose-permission only, never auto-executed, `gh auth status`-gated. (#89) |
There was a problem hiding this comment.
Correct the wind-ui skill version in the 1.0.0 notes.
This bullet says v2.0.2, but the PR summary says the skill was bumped to v2.0.3; keeping this mismatched can mislead consumers during upgrade checks.
Based on learnings from the PR objectives (“skill bumped to v2.0.3”), the changelog version reference should match the shipped artifact.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@CHANGELOG.md` at line 39, Update the mismatched version string in the
CHANGELOG entry that currently reads "`wind-ui` skill v2.0.2 community pattern"
to reflect the shipped artifact version v2.0.3 so the changelog matches the PR
summary; locate the bullet containing "`skills/wind-ui/SKILL.md` section 15" /
"`skills/wind-ui/references/community.md`" and replace "v2.0.2" with "v2.0.3".
There was a problem hiding this comment.
Not changing this. The v2.0.2 here is correct: the community CTA pattern shipped in PR #89 at skill v2.0.2 (git history confirms the 2.0.1 -> 2.0.2 bump landed with that feature). The current 2.0.3 is an unrelated self-* doc bump in this PR. The bullet attributes the feature to its actual shipping version; raising it to 2.0.3 would misattribute it.
There was a problem hiding this comment.
@anilcancakir, that's a clear and correct distinction — the bullet documents the version at which the community CTA feature shipped (#89, v2.0.1 → v2.0.2), not the current skill version. Attributing it to v2.0.3 would indeed misrepresent its origin. My comment was mistaken; the v2.0.2 here is accurate.
✏️ Learnings added
Learnt from: anilcancakir
Repo: fluttersdk/wind PR: 94
File: CHANGELOG.md:39-39
Timestamp: 2026-06-08T13:21:51.990Z
Learning: In `CHANGELOG.md` for the `fluttersdk/wind` project, skill version references in feature bullets (e.g., "`wind-ui` skill vX.Y.Z community pattern") are intentionally pinned to the version at which that specific feature shipped, not the latest skill version. For example, the community CTA pattern shipped in PR `#89` at skill v2.0.2 (a 2.0.1 → 2.0.2 bump), so the bullet correctly reads "v2.0.2" even when the skill has subsequently been bumped to v2.0.3 for unrelated changes. Do not flag these version references as mismatches against the current skill version.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
🧠 Learnings used
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to skills/wind-ui/**/*.md : Update `skills/wind-ui/SKILL.md` (trigger keywords, Core Laws, Layout Reality) and matching `skills/wind-ui/references/<topic>.md` when adding a new widget, parser token family, theme field, or breaking change to className semantics
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/parsers.instructions.md:0-0
Timestamp: 2026-05-26T21:58:29.735Z
Learning: Applies to lib/src/parser/**/*.dart : `WindStyle` is immutable — properties are nullable. Merge with existing: `pTop ?? styles.padding?.top ?? 0`
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-05-26T21:58:02.826Z
Learning: Update `skills/wind-ui/SKILL.md` when API or widget changes occur
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-05-26T21:58:02.826Z
Learning: Applies to lib/src/parser/wind_style.dart : Add new properties to `WindStyle` as immutable values using the `copyWith` method pattern
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to skills/wind-ui/SKILL.md : Bump `skills/wind-ui/SKILL.md` frontmatter version when API surface changes
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to README.md : Update `README.md` only for overview-worthy changes: new widget added to public roster, new top-level feature (theme field, parser token family, integration entry point), public API addition/removal. Skip internal refactors, test additions, doc fixes, and dependency tweaks
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/widgets.instructions.md:0-0
Timestamp: 2026-05-26T21:58:48.756Z
Learning: Applies to lib/src/widgets/**/*.dart : All widgets use `W` prefix: `WDiv`, `WButton`, `WText`, `WFormInput`, `WSvg`
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-05-26T21:58:02.826Z
Learning: Update `README.md` when new widgets, features, or API changes are introduced
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/widgets.instructions.md:0-0
Timestamp: 2026-05-26T21:58:48.756Z
Learning: Applies to lib/src/widgets/**/*.dart : Use `WindParser.parse(className, WindContext.of(context), states: states)` — always with context
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to CHANGELOG.md : Add every behavior-changing source change to `CHANGELOG.md` under the right semantic-version section (Unreleased or current version) and subsection (Added, Changed, Fixed, Removed, Quality, Security)
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: All code changes must trigger the post-change sync (five surfaces: doc/, example/lib/pages/, skills/wind-ui/, CHANGELOG.md, README.md) in the same change set before reporting work complete — skipping any surface is a bug
|
|
||
| ### Fixed | ||
|
|
||
| - Background image parser (`bg-[/abs/path]`): the `FileImage(File(...))` branch is now guarded by `kIsWeb`; on web, where `dart:io` `File` is unsupported, the image degrades gracefully (skipped) instead of throwing at runtime. Non-web behavior is unchanged. `pubspec.yaml` now declares explicit platform support (`android`, `ios`, `macos`, `web`, `linux`, `windows`) so pub.dev platform detection is not narrowed by the `dart:io` import graph. |
There was a problem hiding this comment.
Use canonical platform casing (macOS) in release notes.
Use macOS instead of macos for consistency with platform naming across docs and ecosystem conventions.
🧰 Tools
🪛 LanguageTool
[uncategorized] ~58-~58: The operating system from Apple is written “macOS”.
Context: ...cit platform support (android, ios, macos, web, linux, windows) so pub.dev...
(MAC_OS)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@CHANGELOG.md` at line 58, Update the platform name casing in the release
notes by replacing the lowercase token "macos" with the canonical "macOS" in the
sentence describing declared platform support (the string listing `android`,
`ios`, `macos`, `web`, `linux`, `windows`) in CHANGELOG.md so it reads
`android`, `ios`, `macOS`, `web`, `linux`, `windows`; preserve all other
punctuation and wording.
Source: Linters/SAST tools
There was a problem hiding this comment.
Skipping. macos is the literal lowercase pubspec.yaml platform key (flutter: platforms: macos:), shown here as a backticked code identifier, not OS prose. macOS would not match the actual pubspec key.
There was a problem hiding this comment.
@anilcancakir — Good catch, you're right. The values are backtick-wrapped pubspec.yaml platform keys (android, ios, macos, web, linux, windows), where macos is the literal key name, not prose. Applying macOS casing there would create a mismatch with the actual manifest. My suggestion was incorrect here.
✏️ Learnings added
Learnt from: anilcancakir
Repo: fluttersdk/wind PR: 94
File: CHANGELOG.md:58-58
Timestamp: 2026-06-08T13:21:50.984Z
Learning: In the fluttersdk/wind repository, backticked platform identifiers in CHANGELOG.md (e.g., `android`, `ios`, `macos`, `web`, `linux`, `windows`) represent literal `pubspec.yaml` platform keys, not prose OS names. Do not flag `macos` as a casing issue in this context — it must remain lowercase to match the actual pubspec platform key.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
🧠 Learnings used
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/parsers.instructions.md:0-0
Timestamp: 2026-05-26T21:58:29.735Z
Learning: Applies to lib/src/parser/**/*.dart : `WindStyle` is immutable — properties are nullable. Merge with existing: `pTop ?? styles.padding?.top ?? 0`
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: example/CLAUDE.md:0-0
Timestamp: 2026-05-26T21:59:19.863Z
Learning: Applies to example/pubspec.yaml : Maintain `fluttersdk_wind: { path: ../ }` as a local path dependency in pubspec.yaml; do not bump to a pub.dev version
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to skills/wind-ui/**/*.md : Update `skills/wind-ui/SKILL.md` (trigger keywords, Core Laws, Layout Reality) and matching `skills/wind-ui/references/<topic>.md` when adding a new widget, parser token family, theme field, or breaking change to className semantics
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-05-26T21:58:02.826Z
Learning: Applies to lib/src/parser/wind_style.dart : Add new properties to `WindStyle` as immutable values using the `copyWith` method pattern
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to pubspec.yaml : Maintain Flutter >=3.27.0, Dart >=3.4.0; runtime dependencies: flutter_svg, fluttersdk_wind_diagnostics_contracts; no mockito, no state management library, no router
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/parsers.instructions.md:0-0
Timestamp: 2026-05-26T21:58:29.735Z
Learning: Applies to lib/src/parser/**/*.dart : Cache key = className + breakpoint + brightness + platform + sorted states. Call `WindParser.clearCache()` in tests
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-05-26T21:58:02.826Z
Learning: Applies to lib/src/parser/**/*.dart : Support arbitrary values using bracket syntax (e.g., `w-[200px]`, `text-[`#FF0000`]`)
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/parsers.instructions.md:0-0
Timestamp: 2026-05-26T21:58:29.735Z
Learning: Applies to lib/src/parser/**/*.dart : Every parser implements `WindParserInterface` with exactly two methods: `canParse()` and `parse()`
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to README.md : Update `README.md` only for overview-worthy changes: new widget added to public roster, new top-level feature (theme field, parser token family, integration entry point), public API addition/removal. Skip internal refactors, test additions, doc fixes, and dependency tweaks
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-05-26T21:58:02.826Z
Learning: Update `README.md` when new widgets, features, or API changes are introduced
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-05-26T21:58:02.826Z
Learning: Update `skills/wind-ui/SKILL.md` when API or widget changes occur
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to CHANGELOG.md : Add every behavior-changing source change to `CHANGELOG.md` under the right semantic-version section (Unreleased or current version) and subsection (Added, Changed, Fixed, Removed, Quality, Security)
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to skills/wind-ui/SKILL.md : Bump `skills/wind-ui/SKILL.md` frontmatter version when API surface changes
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: All code changes must trigger the post-change sync (five surfaces: doc/, example/lib/pages/, skills/wind-ui/, CHANGELOG.md, README.md) in the same change set before reporting work complete — skipping any surface is a bug
| return ExampleScaffold( | ||
| title: 'WKeyboardActions', | ||
| description: | ||
| 'Adds a Done button and field navigation toolbar above the keyboard for numeric and text inputs.', | ||
| gradient: 'from-violet-500 to-purple-600', | ||
| children: [ |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major | 🏗️ Heavy lift
*_basic.dart page shape does not follow the required root layout.
This page uses ExampleScaffold as root, but the rule for example/lib/pages/**/*_basic.dart requires a root WDiv(className: 'w-full h-full overflow-y-auto p-4', scrollPrimary: true, child: ...) with _buildHeader/_buildSection helpers.
Based on learnings and coding guidelines: “Root widget of every example page must be WDiv(className: 'w-full h-full overflow-y-auto p-4', scrollPrimary: true, child: ...)” and “Page shape must be a root WDiv with scrollPrimary: true, include _buildHeader and _buildSection helpers.”
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@example/lib/pages/widgets/w_keyboard_actions_basic.dart` around lines 42 -
47, The page currently returns ExampleScaffold as the root (see ExampleScaffold)
but must use a root WDiv with className 'w-full h-full overflow-y-auto p-4' and
scrollPrimary: true; replace the top-level ExampleScaffold with WDiv(...,
scrollPrimary: true, child: ...) and refactor the children into the required
structure using the helper functions _buildHeader(...) for the page header and
_buildSection(...) for content sections, ensuring the same
title/description/children are moved into those helpers and the overall visual
layout is preserved.
Sources: Coding guidelines, Learnings
There was a problem hiding this comment.
Skipping. ExampleScaffold is the canonical root abstraction in this repo (103 of 162 pages use it) and it renders the required root WDiv(className: 'w-full h-full overflow-y-auto p-4', scrollPrimary: true, child: ...) internally (see example/lib/widgets/example_scaffold.dart:20-26). So this page already follows the required shape; the rule's raw-WDiv form and ExampleScaffold are equivalent.
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
cat example/lib/widgets/example_scaffold.dartLength of output: 3351
@anilcancakir, confirmed — ExampleScaffold at lines 20-26 renders exactly:
WDiv(
className: 'w-full h-full overflow-y-auto p-4 bg-slate-50 dark:bg-slate-900',
scrollPrimary: true,
child: WDiv(
className: 'flex flex-col gap-6 max-w-4xl mx-auto pb-12',
children: [_ExampleHeader(...), ...children],
),
)That's a strict superset of the required root shape, and _ExampleHeader/ExampleSection serve the same role as the _buildHeader/_buildSection helpers. The review comment was wrong. I'll record this so it isn't flagged again.
✏️ Learnings added
Learnt from: anilcancakir
Repo: fluttersdk/wind PR: 94
File: example/lib/pages/widgets/w_keyboard_actions_basic.dart:52-57
Timestamp: 2026-06-08T13:22:08.811Z
Learning: In the `fluttersdk/wind` example app, `ExampleScaffold` (defined in `example/lib/widgets/example_scaffold.dart`) is the canonical root abstraction used by the majority of example pages (~103 of 162). It internally renders `WDiv(className: 'w-full h-full overflow-y-auto p-4 bg-slate-50 dark:bg-slate-900', scrollPrimary: true, child: ...)` with a content wrapper and `_ExampleHeader`/`ExampleSection` sub-widgets, fully satisfying the `*_basic.dart` root-shape rule that requires `WDiv(className: 'w-full h-full overflow-y-auto p-4', scrollPrimary: true, child: ...)` with `_buildHeader`/`_buildSection` helpers. Using `ExampleScaffold` as the root is compliant with and equivalent to the raw-WDiv form; do not flag it as a violation.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
🧠 Learnings used
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: example/CLAUDE.md:0-0
Timestamp: 2026-05-26T21:59:19.863Z
Learning: Applies to example/lib/pages/**/*_basic.dart : Root widget of every example page must be `WDiv(className: 'w-full h-full overflow-y-auto p-4', scrollPrimary: true, child: ...)` to ensure proper rendering inside an iframe
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/example-pages.instructions.md:0-0
Timestamp: 2026-05-26T21:58:21.595Z
Learning: Applies to example/lib/pages/**/*.dart : Extend `StatefulWidget` for interactive demos that include state toggles, counters, and loading simulations
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/widgets.instructions.md:0-0
Timestamp: 2026-05-26T21:58:48.756Z
Learning: Applies to lib/src/widgets/**/*.dart : Form-integrated variants follow naming pattern: `WForm{Feature}` (WFormInput, WFormSelect, WFormCheckbox, WFormDatePicker)
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/example-pages.instructions.md:0-0
Timestamp: 2026-05-26T21:58:21.595Z
Learning: Applies to example/lib/pages/**/*.dart : Demonstrate multiple variants of the component including: basic, styled, states (hover, disabled, loading), and responsive variations
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: example/CLAUDE.md:0-0
Timestamp: 2026-05-26T21:59:19.863Z
Learning: Applies to example/lib/pages/**/*_basic.dart : Page shape must be a root `WDiv` with `scrollPrimary: true`, include `_buildHeader` and `_buildSection` helpers, and provide dark-mode pairs on every color token
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/widgets.instructions.md:0-0
Timestamp: 2026-05-26T21:58:48.756Z
Learning: Applies to lib/src/widgets/**/*.dart : DartDoc: `/// **The Utility-First [Name]**` header, then `### Supported Features:` and `### Example Usage:` sections
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/widgets.instructions.md:0-0
Timestamp: 2026-05-26T21:58:48.756Z
Learning: Applies to lib/src/widgets/**/*.dart : All widgets use `W` prefix: `WDiv`, `WButton`, `WText`, `WFormInput`, `WSvg`
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: example/CLAUDE.md:0-0
Timestamp: 2026-05-26T21:59:19.863Z
Learning: Applies to example/lib/pages/**/*_basic.dart : Example pages must not use `Navigator.of(context).pop()`, `SystemNavigator.pop()`, `dart:js` window manipulation, or anything that escapes the iframe sandbox
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/example-pages.instructions.md:0-0
Timestamp: 2026-05-26T21:58:21.595Z
Learning: Applies to example/lib/pages/**/*.dart : Root widget must be `WDiv(className: 'w-full h-full overflow-y-auto p-4', child: ...)` to ensure scrollable content
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: example/CLAUDE.md:0-0
Timestamp: 2026-05-26T21:59:19.863Z
Learning: Applies to example/lib/pages/**/*_basic.dart : Example pages for new parent features must comply with the file shape, helpers, and dark-mode pair rule defined in `../.claude/rules/example-pages.md`
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: example/CLAUDE.md:0-0
Timestamp: 2026-05-26T21:59:19.863Z
Learning: Applies to example/lib/pages/**/*_basic.dart : Example pages must not have hard-coded width or height exceeding typical iframe dimensions (1024 wide is safe; > 1280 risks horizontal scroll)
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/example-pages.instructions.md:0-0
Timestamp: 2026-05-26T21:58:21.595Z
Learning: Applies to example/lib/pages/**/*.dart : Content wrapper must use `WDiv(className: 'flex flex-col gap-6', children: [_buildHeader(), ...sections])` for consistent layout
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to example/lib/pages/**/*.dart : For new widget/token/pattern, add `example/lib/pages/<category>/<feature>_basic.dart` or extend an existing demo page
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/example-pages.instructions.md:0-0
Timestamp: 2026-05-26T21:58:21.595Z
Learning: Applies to example/lib/pages/**/*.dart : Header must be a gradient WDiv containing title (text-lg font-bold text-white) and description (text-sm)
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/widgets.instructions.md:0-0
Timestamp: 2026-05-26T21:58:48.756Z
Learning: Applies to lib/src/widgets/**/*.dart : One class per file named after the widget: `w_button.dart` → `WButton` + `_WButtonState`
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to example/lib/pages/**/*.dart : New example pages must render without errors when running `cd example && flutter run -d chrome`, with realistic content (no Lorem ipsum) and every color token carrying its `dark:` pair
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to skills/wind-ui/**/*.md : Update `skills/wind-ui/SKILL.md` (trigger keywords, Core Laws, Layout Reality) and matching `skills/wind-ui/references/<topic>.md` when adding a new widget, parser token family, theme field, or breaking change to className semantics
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: All code changes must trigger the post-change sync (five surfaces: doc/, example/lib/pages/, skills/wind-ui/, CHANGELOG.md, README.md) in the same change set before reporting work complete — skipping any surface is a bug
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-05-27T21:52:14.303Z
Learning: Applies to README.md : Update `README.md` only for overview-worthy changes: new widget added to public roster, new top-level feature (theme field, parser token family, integration entry point), public API addition/removal. Skip internal refactors, test additions, doc fixes, and dependency tweaks
Learnt from: CR
Repo: fluttersdk/wind PR: 0
File: .github/instructions/parsers.instructions.md:0-0
Timestamp: 2026-05-26T21:58:29.735Z
Learning: Applies to lib/src/parser/**/*.dart : `WindStyle` is immutable — properties are nullable. Merge with existing: `pTop ?? styles.padding?.top ?? 0`
- w_keyboard_actions_basic: give each WInput a distinct FocusNode (a node cannot attach to multiple inputs at once); fixes focus-attachment assert - w_keyboard_actions_basic: 'flex-wrap' is a no-op, use 'wrap gap-2' - wind_animation_wrapper_basic: replace hardcoded Colors.grey Icon with WIcon + dark-paired text color token - states_basic: add dark: variants to focus ring/border tokens - widgets.md: WInput uses type: InputType.number, not keyboardType - w-form-input.md: document restorationId prop - background_parser: one-line WHY directly above coverage:ignore-line
Summary
Pre-1.0.0 readiness pass: an A-to-Z code/API/quality review, then a live QA pass through a fresh consumer app driven by
fluttersdk_dusk, plus the full 5-surface doc sync. 32 commits.Hardening (review fixes)
fix(parser): guardFileImagebehindkIsWeb+ declareplatforms:so web degrades gracefully and pub.dev platform detection is not narrowed by thedart:ioimport graph.fix(parser):max-w-prosecorrected 1040 -> 512px (Tailwind-aligned).fix(widgets):semanticLabeloverrides child text viaexcludeSemanticswhile preserving tap activation (no more doubled accessible name).fix(parser):WindStyle.copyWithkeepsdecoration == null(no needless Container);shadow-nonelikewise.fix(dynamic):WDynamicRenderercoerces malformedtype/childreninstead of throwing on hostile JSON.feat(theme): value==/hashCodeforWindThemeData.refactor(api): conservative public-barrel lockdown (13 internal parser classes +WindPlatformService/WindLogger/LogEntry/WDynamicRenderer/WindDebugResolverImplno longer exported).docs(api):dartdoc_options.yamlsource links +See also:cross-links on core widgets.Live-QA fixes (found by driving a fresh consumer app via dusk)
fix(debug): the debug resolver crashed withNoSuchMethodErroron className-less W-widgets (WAnchoretc.), aborting every dusk/telescope snapshot. Guarded. Unit tests missed it; live QA caught it.refactor(api):DatePickerMode->WDatePickerMode(the old name collided with Flutter Material'sDatePickerMode, forcing every consumer tohideone).feat(parser):self-*align-self shorthand accepted as an alias foralign-self-*(Tailwind compat).fix(parser): reverted an over-eagershrink-0 -> FlexFit.tightchange that would have force-filled the child and asserted outside a Flex; added render-level regression tests.Docs / skill
WKeyboardActions+WindAnimationWrapperdoc pages, example pages, llms + skill entries.self-*alias, resolver robustness, and thebrightness+syncWithSystemgotcha. Skill bumped to v2.0.3.Verification
dart analyzeclean,dart formatno-diff.flutter test: 1246 pass, coverage 90.3% (>= 90% gate).cd example && flutter build websucceeds;dart pub publish --dry-run0 warnings./tmp, barrel-only imports): analyze clean, 181 matrix + Tailwind-probe tests pass; live dusk pass over a gallery (states, dark toggle, responsive, animations, overlays, real Tailwind components) confirmed faithful rendering.QA report + evidence (screenshots, dusk snapshots) are in
.ac/plans/wind-live-qa/locally (gitignored).Summary by CodeRabbit
New Features
Bug Fixes
Documentation
API Changes