Skip to content

1.0.0 prep: hardening, live-QA fixes, and doc sync#94

Merged
anilcancakir merged 33 commits into
masterfrom
chore/1.0.0-prep
Jun 8, 2026
Merged

1.0.0 prep: hardening, live-QA fixes, and doc sync#94
anilcancakir merged 33 commits into
masterfrom
chore/1.0.0-prep

Conversation

@anilcancakir

@anilcancakir anilcancakir commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

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): guard FileImage behind kIsWeb + declare platforms: so web degrades gracefully and pub.dev platform detection is not narrowed by the dart:io import graph.
  • fix(parser): max-w-prose corrected 1040 -> 512px (Tailwind-aligned).
  • fix(widgets): semanticLabel overrides child text via excludeSemantics while preserving tap activation (no more doubled accessible name).
  • fix(parser): WindStyle.copyWith keeps decoration == null (no needless Container); shadow-none likewise.
  • fix(dynamic): WDynamicRenderer coerces malformed type/children instead of throwing on hostile JSON.
  • feat(theme): value == / hashCode for WindThemeData.
  • refactor(api): conservative public-barrel lockdown (13 internal parser classes + WindPlatformService / WindLogger / LogEntry / WDynamicRenderer / WindDebugResolverImpl no longer exported).
  • docs(api): dartdoc_options.yaml source 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 with NoSuchMethodError on className-less W-widgets (WAnchor etc.), 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's DatePickerMode, forcing every consumer to hide one).
  • feat(parser): self-* align-self shorthand accepted as an alias for align-self-* (Tailwind compat).
  • fix(parser): reverted an over-eager shrink-0 -> FlexFit.tight change that would have force-filled the child and asserted outside a Flex; added render-level regression tests.

Docs / skill

  • New WKeyboardActions + WindAnimationWrapper doc pages, example pages, llms + skill entries.
  • Synced doc/, skill, CHANGELOG, README/ARCHITECTURE counts; documented the self-* alias, resolver robustness, and the brightness + syncWithSystem gotcha. Skill bumped to v2.0.3.

Verification

  • dart analyze clean, dart format no-diff.
  • flutter test: 1246 pass, coverage 90.3% (>= 90% gate).
  • cd example && flutter build web succeeds; dart pub publish --dry-run 0 warnings.
  • Fresh consumer app (/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

    • Added semanticLabel to WAnchor/WButton for icon-only accessibility.
    • Added WKeyboardActions and WindAnimationWrapper widgets; WPopover gains autoFlip.
    • Flex utilities accept self-* aliases.
  • Bug Fixes

    • Safer dynamic JSON rendering and improved shadow/container behavior.
    • Wind debug snapshots now include additional color fields when available.
  • Documentation

    • Updated counts, examples, and max-w-prose reading width (fixed to 512px).
  • API Changes

    • DatePickerMode renamed to WDatePickerMode.
    • WindThemeData implements value equality (== / hashCode).

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.
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.
Copilot AI review requested due to automatic review settings June 8, 2026 13:00
@coderabbitai

coderabbitai Bot commented Jun 8, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 1ca1413a-1d20-4567-a920-9ca5c166fa76

📥 Commits

Reviewing files that changed from the base of the PR and between 25ab1fd and aff50cf.

📒 Files selected for processing (6)
  • doc/widgets/w-form-input.md
  • example/lib/pages/effects/states_basic.dart
  • example/lib/pages/widgets/w_keyboard_actions_basic.dart
  • example/lib/pages/widgets/wind_animation_wrapper_basic.dart
  • lib/src/parser/parsers/background_parser.dart
  • skills/wind-ui/references/widgets.md
✅ Files skipped from review due to trivial changes (1)
  • example/lib/pages/effects/states_basic.dart
🚧 Files skipped from review as they are similar to previous changes (5)
  • doc/widgets/w-form-input.md
  • lib/src/parser/parsers/background_parser.dart
  • example/lib/pages/widgets/w_keyboard_actions_basic.dart
  • example/lib/pages/widgets/wind_animation_wrapper_basic.dart
  • skills/wind-ui/references/widgets.md

📝 Walkthrough

Walkthrough

Factual 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.

Changes

Release consolidation

Layer / File(s) Summary
APIs & widget semantics
lib/src/widgets/w_anchor.dart, lib/src/widgets/w_button.dart, doc/widgets/w-anchor.md, doc/widgets/w-button.md, skills/wind-ui/references/widgets.md
Adds semanticLabel: String? on WAnchor/WButton and forwards it to Semantics; docs updated. Tests added for enabled/disabled and child-text fallback.
Date picker rename and propagation
lib/src/widgets/w_date_picker.dart, lib/src/widgets/w_form_date_picker.dart, doc/widgets/w-date-picker.md, test/widgets/w_date_picker_test.dart, example/lib/pages/*date_picker*.dart
Renames picker enum to WDatePickerMode and updates all mode branching, docs, examples, and tests to use WDatePickerMode.
Parser & layout fixes
lib/src/parser/parsers/flexbox_grid_parser.dart, lib/src/parser/parsers/sizing_parser.dart, lib/src/parser/parsers/background_parser.dart, lib/src/parser/wind_style.dart, lib/src/widgets/w_div.dart
Adds self-* aliasing, fixes max-w-prose to 512px, guards web FileImage usage, preserves decoration == null in WindStyle.copyWith, and only emits Container for non-empty shadows. Tests added/updated.
Theme equality & debug/dynamic hardening
lib/src/theme/wind_theme_data.dart, lib/src/debug_resolver.dart, lib/src/dynamic/w_dynamic_renderer.dart, test/theme/wind_theme_data_test.dart, test/debug_resolver_test.dart, test/dynamic/w_dynamic_renderer_test.dart
Implements WindThemeData ==/hashCode; debug resolver safely reads optional className; dynamic renderer validates untrusted JSON types. Tests added.
Docs, examples, and new widgets
doc/widgets/w-keyboard-actions.md, doc/widgets/wind-animation-wrapper.md, example/lib/pages/widgets/*, example/lib/routes.dart, ARCHITECTURE.md, CHANGELOG.md, README.md
Adds docs for WKeyboardActions and WindAnimationWrapper, new example pages and routes, updates architecture/docs counts and changelog, and adds dark-mode variants to examples.
Public exports & tests import cleanup
lib/fluttersdk_wind.dart, various test/* files, pubspec.yaml, dartdoc_options.yaml
Removes many concrete parser and debug/dynamic re-exports from package entrypoint; tests updated to import internal src/ modules; pubspec platforms and dartdoc linking adjusted.

Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • fluttersdk/wind#90: Related edits to WindStyle.copyWith behavior and decoration resolution.

"— from a rabbit's burrow I hop to say,
Semantics now guide the accessible way,
Parsers learned their self-* dance,
Themes find equality's chance,
Docs and demos bloom for v1.0 day."

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/1.0.0-prep

@sentry

sentry Bot commented Jun 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.41270% with 1 line in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
lib/src/widgets/w_date_picker.dart 90.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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., DatePickerModeWDatePickerMode, reduced public barrel exports, WindThemeData value 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).

Comment on lines +16 to +19
// 1. One FocusNode per field so WKeyboardActions can navigate between them.
final _nameFocus = FocusNode();
final _emailFocus = FocusNode();
final _amountFocus = FocusNode();
Comment thread skills/wind-ui/references/widgets.md Outdated
WInput(
focusNode: _amountFocus,
placeholder: '0.00',
keyboardType: TextInputType.number,

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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 win

Align conflicting shrink/shrink-0 expectations 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 win

Normalize 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

📥 Commits

Reviewing files that changed from the base of the PR and between 517e102 and 25ab1fd.

📒 Files selected for processing (97)
  • .claude/rules/dynamic.md
  • .claude/rules/parsers.md
  • .claude/rules/widgets.md
  • .github/copilot-instructions.md
  • ARCHITECTURE.md
  • CHANGELOG.md
  • CLAUDE.md
  • README.md
  • dartdoc_options.yaml
  • doc/borders/borders.md
  • doc/core-concepts/theming.md
  • doc/layout/display.md
  • doc/layout/flexbox.md
  • doc/layout/positioning.md
  • doc/layout/sizing.md
  • doc/layout/z-index.md
  • doc/styling/background-color.md
  • doc/styling/opacity.md
  • doc/typography/font-family.md
  • doc/typography/text-overflow.md
  • doc/utilities/responsive-helpers.md
  • doc/widgets/w-anchor.md
  • doc/widgets/w-breakpoint.md
  • doc/widgets/w-button.md
  • doc/widgets/w-date-picker.md
  • doc/widgets/w-div.md
  • doc/widgets/w-dynamic.md
  • doc/widgets/w-form-date-picker.md
  • doc/widgets/w-form-input.md
  • doc/widgets/w-form-select.md
  • doc/widgets/w-keyboard-actions.md
  • doc/widgets/w-popover.md
  • doc/widgets/w-svg.md
  • doc/widgets/w-text.md
  • doc/widgets/wind-animation-wrapper.md
  • example/lib/pages/animation/animation_basic.dart
  • example/lib/pages/effects/shadow.dart
  • example/lib/pages/effects/states_basic.dart
  • example/lib/pages/examples/blog_section.dart
  • example/lib/pages/forms/form_date_picker_basic.dart
  • example/lib/pages/forms/form_date_picker_range.dart
  • example/lib/pages/spacing/margin.dart
  • example/lib/pages/typography/alignment.dart
  • example/lib/pages/widgets/date_picker_basic.dart
  • example/lib/pages/widgets/date_picker_range.dart
  • example/lib/pages/widgets/date_picker_styled.dart
  • example/lib/pages/widgets/w_date_picker.dart
  • example/lib/pages/widgets/w_keyboard_actions_basic.dart
  • example/lib/pages/widgets/wind_animation_wrapper_basic.dart
  • example/lib/routes.dart
  • lib/fluttersdk_wind.dart
  • lib/src/debug_resolver.dart
  • lib/src/dynamic/w_dynamic_renderer.dart
  • lib/src/parser/parsers/background_parser.dart
  • lib/src/parser/parsers/flexbox_grid_parser.dart
  • lib/src/parser/parsers/sizing_parser.dart
  • lib/src/parser/wind_style.dart
  • lib/src/theme/wind_theme_data.dart
  • lib/src/widgets/w_anchor.dart
  • lib/src/widgets/w_button.dart
  • lib/src/widgets/w_date_picker.dart
  • lib/src/widgets/w_div.dart
  • lib/src/widgets/w_form_date_picker.dart
  • lib/src/widgets/w_input.dart
  • lib/src/widgets/w_text.dart
  • llms.txt
  • pubspec.yaml
  • skills/wind-ui/SKILL.md
  • skills/wind-ui/references/debug.md
  • skills/wind-ui/references/dynamic.md
  • skills/wind-ui/references/forms.md
  • skills/wind-ui/references/tailwind-divergence.md
  • skills/wind-ui/references/theme.md
  • skills/wind-ui/references/tokens.md
  • skills/wind-ui/references/widgets.md
  • test/core/platform_service_test.dart
  • test/debug_resolver_test.dart
  • test/dynamic/w_dynamic_renderer_test.dart
  • test/parser/parsers/aspectratio_parser_test.dart
  • test/parser/parsers/background_parser_test.dart
  • test/parser/parsers/flexbox_grid_parser_test.dart
  • test/parser/parsers/overflow_parser_test.dart
  • test/parser/parsers/ring_parser_test.dart
  • test/parser/parsers/shadow_parser_test.dart
  • test/parser/parsers/sizing_parser_test.dart
  • test/parser/parsers/text_parser_font_family_test.dart
  • test/parser/parsers/transition_parser_test.dart
  • test/parser/parsers/zindex_parser_test.dart
  • test/parser/wind_style_test.dart
  • test/theme/wind_theme_data_test.dart
  • test/utils/wind_logger_test.dart
  • test/widgets/w_anchor_test.dart
  • test/widgets/w_button_test.dart
  • test/widgets/w_date_picker_test.dart
  • test/widgets/w_div/flex_shrink_test.dart
  • test/widgets/w_form_date_picker_test.dart
  • test/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

Comment thread CHANGELOG.md
- **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)

@coderabbitai coderabbitai Bot Jun 8, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

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".

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@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

Comment thread CHANGELOG.md

### 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.

@coderabbitai coderabbitai Bot Jun 8, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@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

Comment thread doc/widgets/w-form-input.md
Comment thread example/lib/pages/effects/states_basic.dart Outdated
Comment on lines +42 to +47
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: [

@coderabbitai coderabbitai Bot Jun 8, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ 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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
cat example/lib/widgets/example_scaffold.dart

Length 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`

Comment thread example/lib/pages/widgets/w_keyboard_actions_basic.dart
Comment thread example/lib/pages/widgets/w_keyboard_actions_basic.dart Outdated
Comment thread example/lib/pages/widgets/wind_animation_wrapper_basic.dart Outdated
Comment thread lib/src/parser/parsers/background_parser.dart Outdated
- 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
@anilcancakir anilcancakir merged commit f230d01 into master Jun 8, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants