Skip to content

Commit 13cbe75

Browse files
csharpfritzCopilot
andcommitted
docs: Milestone 5 feature comparison audit + themes/skins migration strategy
- Created 53 audit documents in planning-docs/ comparing every ASP.NET Web Forms control against its Blazor component implementation - Created planning-docs/SUMMARY.md with aggregate gap analysis (66.3% feature match) - Created docs/Migration/ThemesAndSkins.md with 5 evaluated migration approaches (recommended: CascadingValue ThemeProvider pattern) - Updated mkdocs.yml nav with ThemesAndSkins entry - Key findings: AccessKey/ToolTip universally missing, GridView weakest at 20.7%, DetailsView+PasswordRecovery stranded on unmerged sprint3 branch, 7 base-class fixes would close ~180 gaps across the library Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 2443b6e commit 13cbe75

55 files changed

Lines changed: 5616 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

planning-docs/AdRotator.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# AdRotator — Feature Comparison Audit
2+
3+
**ASP.NET Docs:** https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.adrotator?view=netframework-4.8
4+
**Blazor Component:** `BlazorWebFormsComponents.AdRotator`
5+
**Implementation Status:** ✅ Implemented
6+
7+
## Properties
8+
9+
### Control-Specific Properties
10+
11+
| Property | Web Forms Type | Blazor Status | Notes |
12+
|----------|---------------|---------------|-------|
13+
| AdvertisementFile | string | ✅ Match | Loads ads from XML file |
14+
| AlternateTextField | string | ✅ Match | Default "AlternateText" |
15+
| ImageUrlField | string | ✅ Match | Default "ImageUrl" |
16+
| NavigateUrlField | string | ✅ Match | Default "NavigateUrl" |
17+
| KeywordFilter | string | ✅ Match | Filters ads by keyword |
18+
| Target | string | ✅ Match | Link target window/frame |
19+
20+
### Data Binding Properties (from DataBoundComponent)
21+
22+
| Property | Web Forms Type | Blazor Status | Notes |
23+
|----------|---------------|---------------|-------|
24+
| DataSource | object | ✅ Match | Via `DataBoundComponent<Advertisment>` |
25+
| DataMember | string | ✅ Match | Inherited from DataBoundComponent |
26+
| DataSourceID | string | 🔴 Missing | No server-side DataSource controls in Blazor |
27+
| Items | IEnumerable | ✅ Match | Via `DataBoundComponent<Advertisment>` |
28+
| SelectMethod | delegate | ✅ Match | Model binding support |
29+
30+
### WebControl Inherited Properties
31+
32+
| Property | Web Forms Type | Blazor Status | Notes |
33+
|----------|---------------|---------------|-------|
34+
| AccessKey | string | 🔴 Missing | Not in base class or IStyle |
35+
| BackColor | Color | ✅ Match | Via IStyle implementation |
36+
| BorderColor | Color | ✅ Match | Via IStyle implementation |
37+
| BorderStyle | BorderStyle | ✅ Match | Via IStyle implementation |
38+
| BorderWidth | Unit | ✅ Match | Via IStyle implementation |
39+
| CssClass | string | ✅ Match | Via IStyle implementation |
40+
| Enabled | bool | ✅ Match | From BaseWebFormsComponent |
41+
| Font | FontInfo | ✅ Match | Via IStyle implementation |
42+
| ForeColor | Color | ✅ Match | Via IStyle implementation |
43+
| Height | Unit | ✅ Match | Via IStyle implementation |
44+
| Width | Unit | ✅ Match | Via IStyle implementation |
45+
| TabIndex | short | ✅ Match | From BaseWebFormsComponent |
46+
| ToolTip | string | 🔴 Missing | Not implemented on this component |
47+
| Style | CssStyleCollection | ✅ Match | Computed from IStyle properties |
48+
49+
### Control Inherited Properties
50+
51+
| Property | Web Forms Type | Blazor Status | Notes |
52+
|----------|---------------|---------------|-------|
53+
| ID | string | ✅ Match | From BaseWebFormsComponent |
54+
| ClientID | string | ✅ Match | From BaseWebFormsComponent |
55+
| Visible | bool | ✅ Match | From BaseWebFormsComponent |
56+
| EnableViewState | bool | N/A | Server-only; marked obsolete |
57+
| ViewState | StateBag | N/A | Server-only |
58+
| EnableTheming | bool | N/A | Server-only; marked obsolete |
59+
| SkinID | string | N/A | Server-only; marked obsolete |
60+
| Page | Page | N/A | Server-only |
61+
| Parent | Control | N/A | Server-only (Blazor has Parent cascade) |
62+
| NamingContainer | Control | N/A | Server-only |
63+
| UniqueID | string | N/A | Server-only |
64+
| ClientIDMode | ClientIDMode | N/A | Server-only |
65+
| ViewStateMode | ViewStateMode | N/A | Server-only |
66+
67+
## Events
68+
69+
| Event | Web Forms Signature | Blazor Status | Notes |
70+
|-------|-------------------|---------------|-------|
71+
| AdCreated | AdCreatedEventHandler | ✅ Match | `EventCallback<AdCreatedEventArgs> OnAdCreated` |
72+
| DataBinding | EventHandler | ✅ Match | `EventCallback<EventArgs> OnDataBinding` (base) |
73+
| Init | EventHandler | ✅ Match | `EventCallback<EventArgs> OnInit` (base) |
74+
| Load | EventHandler | ✅ Match | `EventCallback<EventArgs> OnLoad` (base) |
75+
| PreRender | EventHandler | ✅ Match | `EventCallback<EventArgs> OnPreRender` (base) |
76+
| Unload | EventHandler | ✅ Match | `EventCallback<EventArgs> OnUnload` (base) |
77+
| Disposed | EventHandler | ✅ Match | `EventCallback<EventArgs> OnDisposed` (base) |
78+
79+
## Methods
80+
81+
| Method | Web Forms Signature | Blazor Status | Notes |
82+
|--------|-------------------|---------------|-------|
83+
| DataBind() | void | N/A | Server-only; marked obsolete in base |
84+
| Focus() | void | N/A | Server-only |
85+
| FindControl(string) | Control | ✅ Match | `FindControl` in BaseWebFormsComponent |
86+
87+
## HTML Output Comparison
88+
89+
Web Forms renders `<a href="..."><img src="..." /></a>` — the Blazor component matches this output. The `<a>` tag includes `target`, `style`, and `class` attributes. The `<img>` tag includes `src`, `width`, `height`, and `alt` attributes from the advertisement data.
90+
91+
Note: Web Forms also renders an `id` attribute on the outer element. The Blazor component does not currently render `id` on the `<a>` tag.
92+
93+
## Summary
94+
95+
- **Matching:** 20 properties, 7 events
96+
- **Needs Work:** 0 properties, 0 events
97+
- **Missing:** 3 properties (AccessKey, ToolTip, DataSourceID), 0 events
98+
- **N/A (server-only):** 9 items

planning-docs/BulletedList.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# BulletedList — Feature Comparison Audit
2+
3+
**ASP.NET Docs:** https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.bulletedlist?view=netframework-4.8
4+
**Blazor Component:** `BlazorWebFormsComponents.BulletedList<TItem>`
5+
**Implementation Status:** ✅ Implemented
6+
7+
## Properties
8+
9+
### Control-Specific Properties
10+
11+
| Property | Web Forms Type | Blazor Status | Notes |
12+
|----------|---------------|---------------|-------|
13+
| BulletStyle | BulletStyle | ✅ Match | Enum with all values (Disc, Circle, Square, Numbered, etc.) |
14+
| BulletImageUrl | string | ✅ Match | Custom image for bullets |
15+
| DisplayMode | BulletedListDisplayMode | ✅ Match | Text, HyperLink, LinkButton |
16+
| FirstBulletNumber | int | ✅ Match | Starting number for ordered lists |
17+
| Target | string | ✅ Match | Target for hyperlinks |
18+
19+
### ListControl Inherited Properties
20+
21+
| Property | Web Forms Type | Blazor Status | Notes |
22+
|----------|---------------|---------------|-------|
23+
| Items | ListItemCollection | ✅ Match | Via `StaticItems` parameter |
24+
| DataTextField | string | ✅ Match | Maps data to text |
25+
| DataValueField | string | ✅ Match | Maps data to value |
26+
| DataTextFormatString | string | 🔴 Missing | No format string support |
27+
| DataSource | object | ✅ Match | Via DataBoundComponent |
28+
| DataMember | string | ✅ Match | Via DataBoundComponent |
29+
| DataSourceID | string | 🔴 Missing | No server-side DataSource controls |
30+
| AppendDataBoundItems | bool | 🔴 Missing | Always appends static + data items |
31+
| SelectedIndex | int | 🔴 Missing | Not applicable for bulleted list (read-only in WF too) |
32+
| SelectedItem | ListItem | 🔴 Missing | Not applicable for bulleted list |
33+
| SelectedValue | string | 🔴 Missing | Not applicable for bulleted list |
34+
| AutoPostBack | bool | 🔴 Missing | Not applicable (bulleted list has no selection) |
35+
| CausesValidation | bool | 🔴 Missing | Not implemented |
36+
| ValidationGroup | string | 🔴 Missing | Not implemented |
37+
38+
### WebControl Inherited Properties
39+
40+
| Property | Web Forms Type | Blazor Status | Notes |
41+
|----------|---------------|---------------|-------|
42+
| AccessKey | string | 🔴 Missing | Not in base class or IStyle |
43+
| BackColor | Color | ✅ Match | Via IStyle implementation |
44+
| BorderColor | Color | ✅ Match | Via IStyle implementation |
45+
| BorderStyle | BorderStyle | ✅ Match | Via IStyle implementation |
46+
| BorderWidth | Unit | ✅ Match | Via IStyle implementation |
47+
| CssClass | string | ✅ Match | Via IStyle implementation |
48+
| Enabled | bool | ✅ Match | From BaseWebFormsComponent; propagates to items |
49+
| Font | FontInfo | ✅ Match | Via IStyle implementation |
50+
| ForeColor | Color | ✅ Match | Via IStyle implementation |
51+
| Height | Unit | ✅ Match | Via IStyle implementation |
52+
| Width | Unit | ✅ Match | Via IStyle implementation |
53+
| TabIndex | short | ✅ Match | From BaseWebFormsComponent |
54+
| ToolTip | string | 🔴 Missing | Not implemented on this component |
55+
| Style | CssStyleCollection | ✅ Match | Computed from IStyle properties |
56+
57+
### Control Inherited Properties
58+
59+
| Property | Web Forms Type | Blazor Status | Notes |
60+
|----------|---------------|---------------|-------|
61+
| ID | string | ✅ Match | From BaseWebFormsComponent; rendered on list element |
62+
| ClientID | string | ✅ Match | Rendered as `id` on `<ul>`/`<ol>` |
63+
| Visible | bool | ✅ Match | From BaseWebFormsComponent |
64+
| EnableViewState | bool | N/A | Server-only |
65+
| ViewState | StateBag | N/A | Server-only |
66+
| EnableTheming | bool | N/A | Server-only |
67+
| SkinID | string | N/A | Server-only |
68+
| Page | Page | N/A | Server-only |
69+
| NamingContainer | Control | N/A | Server-only |
70+
| UniqueID | string | N/A | Server-only |
71+
| ClientIDMode | ClientIDMode | N/A | Server-only |
72+
73+
## Events
74+
75+
| Event | Web Forms Signature | Blazor Status | Notes |
76+
|-------|-------------------|---------------|-------|
77+
| Click | BulletedListEventHandler | ✅ Match | `EventCallback<BulletedListEventArgs> OnClick` (LinkButton mode) |
78+
| DataBinding | EventHandler | ✅ Match | Via base class |
79+
| Init | EventHandler | ✅ Match | Via base class |
80+
| Load | EventHandler | ✅ Match | Via base class |
81+
| PreRender | EventHandler | ✅ Match | Via base class |
82+
| Unload | EventHandler | ✅ Match | Via base class |
83+
84+
## Methods
85+
86+
| Method | Web Forms Signature | Blazor Status | Notes |
87+
|--------|-------------------|---------------|-------|
88+
| DataBind() | void | N/A | Server-only |
89+
| Focus() | void | N/A | Server-only |
90+
91+
## HTML Output Comparison
92+
93+
Web Forms renders `<ul>` for unordered styles and `<ol>` for ordered styles (Numbered, LowerAlpha, UpperAlpha, LowerRoman, UpperRoman). Each item is a `<li>` containing either plain text in a `<span>`, an `<a>` hyperlink, or a clickable `<a>` link button. The Blazor component matches this structure. The `type` attribute is rendered on `<ol>` for ordered lists.
94+
95+
Custom image bullets use `list-style-image` CSS — matches Web Forms behavior.
96+
97+
## Summary
98+
99+
- **Matching:** 19 properties, 6 events
100+
- **Needs Work:** 0 properties, 0 events
101+
- **Missing:** 10 properties (AccessKey, ToolTip, DataTextFormatString, DataSourceID, AppendDataBoundItems, SelectedIndex, SelectedItem, SelectedValue, AutoPostBack, CausesValidation, ValidationGroup), 0 events
102+
- **N/A (server-only):** 7 items

planning-docs/Button.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Button — Feature Comparison Audit
2+
3+
**ASP.NET Docs:** https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.button?view=netframework-4.8
4+
**Blazor Component:** `BlazorWebFormsComponents.Button`
5+
**Implementation Status:** ✅ Implemented
6+
7+
## Properties
8+
9+
### Control-Specific Properties
10+
11+
| Property | Web Forms Type | Blazor Status | Notes |
12+
|----------|---------------|---------------|-------|
13+
| Text | string | ✅ Match | From ButtonBaseComponent |
14+
| CommandName | string | ✅ Match | From ButtonBaseComponent |
15+
| CommandArgument | object | ✅ Match | From ButtonBaseComponent |
16+
| CausesValidation | bool | ✅ Match | From ButtonBaseComponent; defaults to true |
17+
| ValidationGroup | string | ✅ Match | From ButtonBaseComponent |
18+
| PostBackUrl | string | ✅ Match | Marked obsolete — not supported in Blazor |
19+
| OnClientClick | string | ✅ Match | From ButtonBaseComponent |
20+
| UseSubmitBehavior | bool | ✅ Match | Marked obsolete — behaves same either way in Blazor |
21+
| ToolTip | string | ✅ Match | Rendered as `title` attribute |
22+
23+
### WebControl Inherited Properties (from BaseStyledComponent)
24+
25+
| Property | Web Forms Type | Blazor Status | Notes |
26+
|----------|---------------|---------------|-------|
27+
| AccessKey | string | 🔴 Missing | Not in BaseStyledComponent |
28+
| BackColor | Color | ✅ Match | From BaseStyledComponent |
29+
| BorderColor | Color | ✅ Match | From BaseStyledComponent |
30+
| BorderStyle | BorderStyle | ✅ Match | From BaseStyledComponent |
31+
| BorderWidth | Unit | ✅ Match | From BaseStyledComponent |
32+
| CssClass | string | ✅ Match | From BaseStyledComponent; adds `aspNetDisabled` when disabled |
33+
| Enabled | bool | ✅ Match | From BaseWebFormsComponent; renders `disabled` attribute |
34+
| Font | FontInfo | ✅ Match | From BaseStyledComponent |
35+
| ForeColor | Color | ✅ Match | From BaseStyledComponent |
36+
| Height | Unit | ✅ Match | From BaseStyledComponent |
37+
| Width | Unit | ✅ Match | From BaseStyledComponent |
38+
| TabIndex | short | ✅ Match | From BaseWebFormsComponent |
39+
| Style | CssStyleCollection | ✅ Match | Computed from BaseStyledComponent |
40+
41+
### Control Inherited Properties
42+
43+
| Property | Web Forms Type | Blazor Status | Notes |
44+
|----------|---------------|---------------|-------|
45+
| ID | string | ✅ Match | From BaseWebFormsComponent; rendered as `id` |
46+
| ClientID | string | ✅ Match | From BaseWebFormsComponent |
47+
| Visible | bool | ✅ Match | From BaseWebFormsComponent |
48+
| EnableViewState | bool | N/A | Server-only |
49+
| ViewState | StateBag | N/A | Server-only |
50+
| EnableTheming | bool | N/A | Server-only |
51+
| SkinID | string | N/A | Server-only |
52+
| Page | Page | N/A | Server-only |
53+
| NamingContainer | Control | N/A | Server-only |
54+
| UniqueID | string | N/A | Server-only |
55+
| ClientIDMode | ClientIDMode | N/A | Server-only |
56+
57+
## Events
58+
59+
| Event | Web Forms Signature | Blazor Status | Notes |
60+
|-------|-------------------|---------------|-------|
61+
| Click | EventHandler | ✅ Match | `EventCallback<MouseEventArgs> OnClick` |
62+
| Command | CommandEventHandler | ✅ Match | `EventCallback<CommandEventArgs> OnCommand` |
63+
| Init | EventHandler | ✅ Match | Via base class |
64+
| Load | EventHandler | ✅ Match | Via base class |
65+
| PreRender | EventHandler | ✅ Match | Via base class |
66+
| Unload | EventHandler | ✅ Match | Via base class |
67+
68+
## Methods
69+
70+
| Method | Web Forms Signature | Blazor Status | Notes |
71+
|--------|-------------------|---------------|-------|
72+
| Focus() | void | N/A | Server-only |
73+
| DataBind() | void | N/A | Server-only |
74+
75+
## HTML Output Comparison
76+
77+
Web Forms renders `<input type="submit" ... />` by default (or `<button>` with `UseSubmitBehavior=false`). The Blazor component renders `<button type="submit">` (or `type="button"` when `CausesValidation=false`). The button text is rendered as child content.
78+
79+
The `disabled` attribute is rendered when `Enabled=false`, and the `aspNetDisabled` CSS class is appended — matching Web Forms behavior.
80+
81+
Minor difference: Web Forms uses `<input type="submit" value="...">` while Blazor uses `<button type="submit">Text</button>`.
82+
83+
## Summary
84+
85+
- **Matching:** 22 properties, 6 events
86+
- **Needs Work:** 0 properties, 0 events
87+
- **Missing:** 1 property (AccessKey), 0 events
88+
- **N/A (server-only):** 7 items

0 commit comments

Comments
 (0)