Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .ai-team/agents/beast/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,14 @@
Team update (2026-02-27): No-op stub property coverage intentionally limited (41-50% acceptable) deep AJAX infrastructure properties omitted decided by Forge

Team update (2026-02-27): UpdatePanel Triggers collection deliberately omitted Blazor rendering model makes it unnecessary decided by Forge

- **Issue #359 — M6-M8 doc page updates (5 pages):**
1. **ChangePassword** (`docs/LoginControls/ChangePassword.md`) — Verified already complete. Orientation and TextLayout sections with enum tables, migration examples, and `@using BlazorWebFormsComponents.Enums` tip were already present from a prior session.
2. **PagerSettings** (`docs/DataControls/PagerSettings.md`) — Verified already complete. Properties reference, enum tables, parent control usage examples, and migration notes all match `PagerSettings.cs` source.
3. **FormView** (`docs/DataControls/FormView.md`) — Added individual CRUD event names (OnItemDeleting/Deleted, OnItemInserting/Inserted, OnItemUpdating/Updated) to Features section. Added "Web Forms Features NOT Supported" section (DataSourceID, ViewState, Theming, RenderTable). Added CRUD event handling example with FormViewUpdateEventArgs/FormViewDeleteEventArgs.
4. **DetailsView** (`docs/DataControls/DetailsView.md`) — Added Caption/CaptionAlign attributes to Web Forms declarative syntax. Added all 10 style sub-component elements and PagerSettings child element to the Web Forms syntax block, bringing it to parity with actual Web Forms control markup.
5. **DataGrid** (`docs/DataControls/DataGrid.md`) — Removed stale "not every syntax element supported" caveat (features were implemented in M6-M8). Enhanced paging section with property reference table, PagerStyle example, and admonition explaining DataGrid's built-in numeric pager vs. GridView/FormView/DetailsView PagerSettings. Added PagerSettings cross-reference in See Also.
- All 5 pages verified present in `mkdocs.yml` nav. No nav changes needed.
- **Pattern discovered:** DataGrid is the only pageable data control without PagerSettings sub-component support — it always uses a numeric pager. Worth noting for future migration guidance.

Team update (2026-02-28): Cyclops fixed MenuItemStyle Font- attributes (SetFontsFromAttributes) and CheckBox bare input id may need doc updates. Issue #379 (LinkButton CssClass) verified as already fixed in M15, can be closed.
136 changes: 28 additions & 108 deletions .ai-team/agents/colossus/history.md

Large diffs are not rendered by default.

17 changes: 17 additions & 0 deletions .ai-team/agents/cyclops/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,20 @@
- **Issue #386 (Stable deterministic IDs):** CheckBox and RadioButtonList already used `ClientID` (from `ComponentIdGenerator`) when developer provides `ID`, falling back to GUID when not. The only fix needed was adding `id="@_inputId"` to CheckBox's bare (no-text) `<input>` element (line 20) which was missing the `id` attribute. RadioButtonList was already correct: `{ClientID}_0`, `{ClientID}_1` pattern for item IDs, and `ClientID` as the `name` attribute for mutual exclusion. Tests in `CheckBox/IDRendering.razor` and `RadioButtonList/StableIds.razor` already cover all scenarios.
- **Issue #360 (Menu level styles):** The four style sub-components (`DynamicMenuStyle`, `StaticMenuStyle`, `DynamicMenuItemStyle`, `StaticMenuItemStyle`) were already implemented in `MenuItemStyle.razor.cs` as C# classes inheriting from `MenuItemStyle`. The `IMenuStyleContainer` interface was already wired. The actual fix was that `MenuItemStyle.SetPropertiesFromUnknownAttributes()` did not process `Font-` prefixed attributes (e.g. `Font-Bold`, `Font-Italic`). Added `this.SetFontsFromAttributes(OtherAttributes)` call in `OnInitialized()` after `SetPropertiesFromUnknownAttributes()` to use the existing `HasStyleExtensions.SetFontsFromAttributes` method. This fixed the failing `Menu_StaticMenuItemStyle_FontBold_RendersFontWeight` test.
- **Lesson:** When style sub-components use `CaptureUnmatchedValues`, font properties need explicit handling via `SetFontsFromAttributes()` because `Font-Bold` doesn't map to a simple property — it maps to `Font.Bold` on the `FontInfo` sub-object.

### Issue #379 — LinkButton CssClass Verification (2026-02-27)

- **Issue #379 (LinkButton CssClass pass-through):** Verified already correct from M15. `LinkButton.razor` already has `class="@GetCssClassOrNull()"` on both `<a>` elements (PostBackUrl null and non-null branches). The `GetCssClassOrNull()` method in the `@code` block correctly returns: CssClass when enabled and non-empty, `null` when enabled and empty (omitting the attribute), and `CssClass + " aspNetDisabled"` when disabled. Six bUnit tests already exist in `LinkButton/Format.razor` covering: CssClass renders, no CssClass omits attribute, disabled adds aspNetDisabled, disabled+CssClass renders both, and CssClass with PostBackUrl. All 25 LinkButton tests pass. No code change needed.
- **Key files:** `src/BlazorWebFormsComponents/LinkButton.razor`, `src/BlazorWebFormsComponents.Test/LinkButton/Format.razor`
- **Lesson:** M15 was thorough — always verify the current state before assuming a bug still exists. The issue was filed before M15 landed.

Team update (2026-02-28): Rogue noted GetCssClassOrNull() uses IsNullOrEmpty not IsNullOrWhiteSpace whitespace-only CssClass renders class=" " instead of being omitted. Low priority future cleanup.

### Issue #387 — Normalizer Enhancements (2026-03-01)

- **Enhancement 1 (case-insensitive matching):** Compare mode now pairs files case-insensitively using lowercase key maps, eliminating false HyperLink/Hyperlink dupes. Preference goes to source A casing for display.
- **Enhancement 2 (boolean attributes):** New `normalizeBooleanAttributes()` collapses `selected=""` and `selected="selected"` to bare `selected` for 6 boolean attrs (selected, checked, disabled, readonly, multiple, nowrap).
- **Enhancement 3 (empty style stripping):** New `stripEmptyStyles()` removes `style=""` attributes before comparison.
- **Enhancement 4 (GUID ID normalization):** New `normalizeGuidIds()` replaces GUID patterns in `id` attribute values with `GUID` placeholder, covering CheckBox/RadioButtonList/FileUpload auto-generated IDs.
- **Key files:** `scripts/normalize-html.mjs`, `scripts/normalize-rules.json`
- **Lesson:** Normalization functions should run in a specific order: regex rules → style normalization → empty style strip → boolean attrs → GUID IDs → attribute sort → artifact cleanup → whitespace. Each step depends on the previous one leaving clean output.
13 changes: 13 additions & 0 deletions .ai-team/agents/forge/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,16 @@ Line-by-line classification: DataList (110 lines), GridView (33 lines), ListView
Team update (2026-02-27): M17 audit fixes resolved 5 fidelity issues fixed (EnablePartialRendering default, Scripts collection, CssClass rendering, display:block style, ScriptReference properties). 9 new tests, 1367 total. PR #402 decided by Forge, Cyclops

� Team update (2026-02-27): M17 audit fix test patterns ScriptReference tested via C# instantiation, UpdateProgress CssClass tested with/without value, 9 new tests decided by Rogue

### Summary: Divergence Registry Update D-11 through D-14 (2026-02-28)

**By:** Forge
**What:** Added 4 new divergence entries to `planning-docs/DIVERGENCE-REGISTRY.md` based on findings from M15-M18 audit work. Issue #388.

**New entries:**
- **D-11 (GUID-Based IDs):** CheckBox, RadioButton, RadioButtonList, FileUpload generate GUID-based IDs instead of predictable naming-hierarchy IDs. Status: Fix recommended -- GUIDs are non-deterministic and untargetable. Separate from D-01 (prefix mangling).
- **D-12 (Boolean Attribute Format):** `selected=""` (HTML5) vs `selected="selected"` (XHTML). Status: Intentional -- both are valid HTML per W3C spec. Normalizer should canonicalize.
- **D-13 (Calendar Previous-Month Day Padding):** Web Forms renders full 42-cell grid with adjacent-month days; Blazor may not fill leading cells. Status: Fix recommended -- visible structural content.
- **D-14 (Calendar Style Property Pass-Through):** Web Forms applies inline styles from TitleStyle, DayStyle, TodayDayStyle etc.; Blazor doesn't fully pass through. Status: Fix progressively.

**Also updated:** Summary table, category definitions (added ID Generation, Attribute Format, Style), revision history, header status line.
19 changes: 19 additions & 0 deletions .ai-team/agents/rogue/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,3 +96,22 @@ All 29 ScriptManager/UpdateProgress/ScriptReference tests pass (0 failures). Bui
📌 Test pattern: UpdateProgress CssClass uses `class="@(string.IsNullOrEmpty(CssClass) ? null : CssClass)"` — when CssClass is empty/null, AngleSharp returns null for `GetAttribute("class")`, matching Web Forms behavior of omitting the class attribute entirely. — Rogue

Team update (2026-02-27): M17 audit fixes resolved 5 fidelity issues fixed (EnablePartialRendering default, Scripts collection, CssClass rendering, display:block style, ScriptReference properties). 9 new tests, 1367 total. PR #402 decided by Forge, Cyclops

### LinkButton CssClass Tests (Issue #379)

Wrote 8 bUnit tests in `src/BlazorWebFormsComponents.Test/LinkButton/CssClass.razor` verifying CssClass pass-through on the `<a>` element:

1. `SingleClass_RendersAsClassAttributeOnAnchor` — single class renders correctly
2. `MultipleClasses_RendersSpaceSeparatedOnAnchor` — space-separated classes preserved
3. `NoCssClass_OmitsClassAttribute` — no CssClass param omits class attribute entirely
4. `EmptyCssClass_OmitsClassAttribute` — empty string CssClass also omits attribute
5. `CssClass_WithIdAttribute_BothRenderOnAnchor` — CssClass + ID coexist
6. `CssClass_WithPostBackUrl_RendersOnAnchor` — PostBackUrl branch also renders class
7. `Disabled_NoCssClass_RendersAspNetDisabledOnly` — disabled state adds aspNetDisabled
8. `Disabled_WithCssClass_RendersBothClasses` — disabled + CssClass combines both

📌 Test pattern: LinkButton has two render branches (PostBackUrl null vs non-null). Both share `GetCssClassOrNull()` which returns null for empty/null CssClass (AngleSharp `HasAttribute("class")` returns false) and appends "aspNetDisabled" when Enabled=false. Must test both branches for CssClass. — Rogue

📌 Edge case: `GetCssClassOrNull()` uses `string.IsNullOrEmpty()` not `IsNullOrWhiteSpace()` — whitespace-only CssClass like " " would render `class=" "`. Not a blocker for #379 but noted for future audit. — Rogue

Team update (2026-02-28): Cyclops fixed MenuItemStyle Font- attributes (SetFontsFromAttributes call in OnInitialized) and CheckBox bare input missing id attribute may warrant additional test coverage. Issue #379 confirmed already fixed in M15.
30 changes: 30 additions & 0 deletions .ai-team/decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -3098,3 +3098,33 @@ The honest bottom line: **This library will never achieve 100% exact HTML match
**What:** Added 9 bUnit tests covering all 5 M17 audit fixes (EnablePartialRendering default, Scripts collection, CssClass rendering, display:block;visibility:hidden, ScriptReference properties). Updated 2 existing tests to match new behavior. All 29 ScriptManager/UpdateProgress tests pass.
**Why:** Audit fixes change observable behavior — tests must be updated to assert the corrected defaults and new properties. ScriptReference defaults tested via plain C# instantiation (no render needed). UpdateProgress CssClass tested both with and without value to ensure no spurious `class=""` attribute.


### 2026-02-27: M6-M8 doc pages updated for #359
**By:** Beast
**What:** Updated 3 of 5 doc pages for Issue #359. ChangePassword and PagerSettings were already complete from prior work. FormView gained explicit CRUD event docs and a "NOT Supported" section. DetailsView Web Forms syntax block now includes Caption/CaptionAlign attributes and all style sub-component/PagerSettings child elements. DataGrid paging docs refreshed stale caveat removed, property table and PagerSettings comparison admonition added.
**Why:** The M9 audit identified these 5 pages as having gaps relative to M6-M8 feature additions. Key finding: DataGrid is the only pageable data control that does NOT support the <PagerSettings> sub-component.

### 2026-02-27: Issue #358 5 interaction tests close audit gap
**By:** Colossus
**What:** Added 5 interaction tests in InteractiveComponentTests.cs for pages identified by M9 audit: ListView CrudOperations (2 tests Edit mode, Delete row), Label (AssociatedControlID rendering), DataGrid Styles (caption/header/data rows/GridLines), LoginControls Orientation (4 layout variants). Panel/BackImageUrl skipped static display only, smoke test sufficient.
**Why:** M9 audit identified 5 sample pages without interaction test coverage. Smoke tests were already added in a prior session. All 5 gap pages now have both smoke AND interaction test coverage (except Panel/BackImageUrl which only warrants a smoke test).

### 2026-02-27: Issue #379 LinkButton CssClass verified as already fixed
**By:** Cyclops
**What:** Issue #379 (LinkButton CssClass not passed to rendered class attribute) was already fixed during M15 (commit 65aedc0). LinkButton.razor already contains class="@GetCssClassOrNull()" on both <a> elements. Six bUnit tests in LinkButton/Format.razor cover all CssClass scenarios. All 25 LinkButton tests pass.
**Why:** No code change needed. Issue #379 can be closed as already resolved.

### 2026-02-27: MenuItemStyle sub-components must call SetFontsFromAttributes for Font- attributes
**By:** Cyclops
**What:** Added his.SetFontsFromAttributes(OtherAttributes) in MenuItemStyle.OnInitialized() after SetPropertiesFromUnknownAttributes(). This ensures Font-Bold, Font-Italic, Font-Size, etc. attributes declared on style sub-components (like <StaticMenuItemStyle Font-Bold="true" />) are properly applied to the FontInfo sub-object.
**Why:** The SetPropertiesFromUnknownAttributes() method uses reflection to map attribute names to properties, but Font-Bold maps to Font.Bold (a sub-property), not a direct property. Without the explicit SetFontsFromAttributes call, all Font- attributes were silently ignored on menu style sub-components, causing CSS like ont-weight:bold to never appear in rendered output.

### 2026-02-27: CheckBox must always render id attribute on input element
**By:** Cyclops
**What:** CheckBox.razor's bare (no-text) <input> element was missing the id="@_inputId" attribute. Added it to match the behavior of the text-present code paths. Web Forms always renders an id on CheckBox inputs regardless of whether Text is set.
**Why:** Consistency with Web Forms HTML output and with the text-present code paths in the same component. The bare input path renders class, style, and itle but was missing id, which would break JavaScript targeting and CSS selectors that rely on the control's ID.

### 2026-02-28: LinkButton CssClass test coverage strategy
**By:** Rogue
**What:** Created dedicated CssClass.razor test file (8 tests) for LinkButton, separate from Format.razor which already had some CssClass tests. Both files coexist Format.razor tests are integration-style (MarkupMatches), CssClass.razor tests are targeted attribute assertions covering edge cases and both render paths (PostBackUrl null vs non-null).
**Why:** Edge case noted: GetCssClassOrNull() uses string.IsNullOrEmpty() not string.IsNullOrWhiteSpace(). Whitespace-only CssClass renders class=" " instead of being omitted. Low priority future cleanup. When testing any component CssClass, verify both "no class" case and disabled state (spNetDisabled appended).
9 changes: 0 additions & 9 deletions .ai-team/decisions/inbox/cyclops-m18-wave2.md

This file was deleted.

5 changes: 5 additions & 0 deletions .ai-team/decisions/inbox/cyclops-normalizer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
### 2026-03-01: Normalizer pipeline order and compare case-insensitivity

**By:** Cyclops
**What:** The HTML normalizer pipeline in `scripts/normalize-html.mjs` runs transforms in a fixed order: regex rules → style normalization → empty style strip → boolean attrs → GUID IDs → attribute sort → artifact cleanup → whitespace. Compare mode uses case-insensitive file pairing (lowercase key maps) so that folder casing differences (e.g., HyperLink vs Hyperlink) don't produce false divergences. Boolean attributes are collapsed to bare form, GUIDs in IDs are replaced with `GUID` placeholder, and empty `style=""` attributes are stripped.
**Why:** These 4 enhancements (issue #387) eliminate the main sources of false-positive divergences in the HTML fidelity audit. The pipeline ordering matters because later steps depend on earlier cleanup (e.g., empty style stripping must happen after style normalization).
33 changes: 33 additions & 0 deletions .ai-team/decisions/inbox/forge-divergence-registry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Decision: Divergence Registry D-11 through D-14

**Date:** 2026-02-28
**Author:** Forge (Lead / Web Forms Reviewer)
**Issue:** #388
**Status:** Recorded

## Context

The M15–M18 HTML fidelity audit identified 4 new divergence patterns not covered by D-01 through D-10. These were flagged in multiple audit reports (M11, M12, M15 data control analysis, post-fix capture results, HTML fidelity master report) and needed formal registry entries.

## Decisions Made

### D-11: GUID-Based IDs — Fix, don't register as permanent intentional
- **Affected:** CheckBox, RadioButton, RadioButtonList, FileUpload
- **Decision:** These controls should be fixed to use developer-provided ID + `_0`/`_1` suffix convention per Web Forms. GUIDs make HTML non-deterministic and untargetable by CSS/JS. This is a bug, not an architectural divergence.
- **Registered temporarily** so the audit pipeline can normalize GUIDs while the fix is pending.

### D-12: Boolean Attribute Format — Intentional, no fix
- **Affected:** Any control rendering boolean HTML attributes (selected, checked, disabled)
- **Decision:** `selected=""` vs `selected="selected"` is a platform-level difference. Both are valid HTML5. Register as intentional. Add normalizer rule to canonicalize before comparison.

### D-13: Calendar Previous-Month Day Padding — Fix recommended
- **Affected:** Calendar
- **Decision:** Web Forms renders a full 42-cell grid with adjacent-month day numbers. This is visible structural content, not infrastructure. Blazor Calendar should match this layout. Registered to track until fixed.

### D-14: Calendar Style Property Pass-Through — Fix progressively
- **Affected:** Calendar
- **Decision:** The Calendar's style sub-properties (TitleStyle, DayStyle, TodayDayStyle, etc.) are not fully applied to rendered HTML. This is a significant fidelity gap. Fix progressively, prioritizing TitleStyle, DayStyle, and TodayDayStyle first.

## Rationale

The divergence registry is the authoritative reference for classifying audit findings. Without these entries, auditors would repeatedly investigate these patterns as potential bugs. D-11, D-13, and D-14 are tracked as "fix recommended" rather than "intentional" — they are registered for visibility but should be resolved.
Loading
Loading