fluentui-design 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -8,6 +8,43 @@ Each release records three things: the skill version, the baseline
8
8
  `@fluentui/react-components` package version, and the pinned `fluentui-mcp` facts commit. See
9
9
  [MAINTENANCE.md](MAINTENANCE.md) for the re-pin procedure.
10
10
 
11
+ ## [0.2.0] - 2026-09-21
12
+
13
+ ### Baseline
14
+
15
+ | Item | Value |
16
+ | --- | --- |
17
+ | `@fluentui/react-components` | 9.74.7 |
18
+ | `fluentui-mcp` facts commit | d595d79 |
19
+
20
+ ### Fixes
21
+
22
+ - datagrid: correct the finding kinds and rule provenance
23
+
24
+ ### Documentation
25
+
26
+ - plan: correct the datagrid coverage progress count
27
+ - plan: add the datagrid coverage requirements and plan
28
+
29
+ ### Features
30
+
31
+ - datagrid: enrich the list pattern and regenerate the skill
32
+ - datagrid: add API-grounded grid rules and refresh coverage
33
+ - datagrid: add the DataGrid evidence source and findings
34
+
35
+ ## [0.1.2] - 2026-09-21
36
+
37
+ ### Baseline
38
+
39
+ | Item | Value |
40
+ | --- | --- |
41
+ | `@fluentui/react-components` | 9.74.7 |
42
+ | `fluentui-mcp` facts commit | d595d79 |
43
+
44
+ ### Documentation
45
+
46
+ - plan: record the validated automated release
47
+
11
48
  ## [0.1.1] - 2026-09-21
12
49
 
13
50
  ### Baseline
package/README.md CHANGED
@@ -115,8 +115,6 @@ re-verify the rules it uses.
115
115
  (`SRC-045`) are recorded as a discovered expansion target; `SRC-002` covers only the public
116
116
  getting-started page. Rules therefore lean on published guidance and the component library, not on
117
117
  Figma files.
118
- - **The dedicated v9 DataGrid usage page was not analyzed.** Grid rules lean on the accessibility
119
- practices guide (APG) and the pinned package source (`SRC-027`).
120
118
  - **Automated accessibility output is findings, not conformance.** The fixture is scanned with axe
121
119
  and the results are reported as defects that were fixed; the project makes no WCAG conformance
122
120
  claim.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluentui-design",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "description": "Evidence-backed Agent Skill for composing web applications with Fluent UI React v9",
6
6
  "license": "MIT",
@@ -11,9 +11,9 @@ For exact component props and imports, use the sibling `fluentui` skill
11
11
  | Decision | Patterns | Rules |
12
12
  | --- | --- | --- |
13
13
  | `command-scope` | PAT-001 | RULE-001, RULE-002, RULE-003 |
14
- | `data-processing-location` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016 |
15
- | `data-resilience` | PAT-002, PAT-008 | RULE-003, RULE-010, RULE-011, RULE-012, RULE-015, RULE-016 |
16
- | `data-surface` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016 |
14
+ | `data-processing-location` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016, RULE-031, RULE-032, RULE-033, RULE-034, RULE-035, RULE-036 |
15
+ | `data-resilience` | PAT-002, PAT-008 | RULE-003, RULE-010, RULE-011, RULE-012, RULE-015, RULE-016, RULE-031, RULE-032, RULE-033, RULE-034, RULE-035, RULE-036 |
16
+ | `data-surface` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016, RULE-031, RULE-032, RULE-033, RULE-034, RULE-035, RULE-036 |
17
17
  | `edit-surface` | PAT-005 | RULE-008, RULE-009, RULE-029 |
18
18
  | `feedback-channel` | PAT-008 | RULE-003, RULE-015, RULE-016 |
19
19
  | `field-annotation` | PAT-004 | RULE-005, RULE-006, RULE-007, RULE-029, RULE-030 |
@@ -22,11 +22,11 @@ For exact component props and imports, use the sibling `fluentui` skill
22
22
  | `navigation-model` | PAT-001, PAT-006 | RULE-001, RULE-002, RULE-003, RULE-013, RULE-014 |
23
23
  | `permission-state` | PAT-003, PAT-008 | RULE-003, RULE-015, RULE-016, RULE-029 |
24
24
  | `progressive-disclosure` | PAT-006 | RULE-013, RULE-014 |
25
- | `row-activation` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016 |
25
+ | `row-activation` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016, RULE-031, RULE-032, RULE-033, RULE-034, RULE-035, RULE-036 |
26
26
  | `save-model` | PAT-007 | RULE-029, RULE-030 |
27
- | `selection-scope` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016 |
27
+ | `selection-scope` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016, RULE-031, RULE-032, RULE-033, RULE-034, RULE-035, RULE-036 |
28
28
  | `submit-feedback` | PAT-004, PAT-007 | RULE-005, RULE-006, RULE-007, RULE-029, RULE-030 |
29
- | `virtualization` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016 |
29
+ | `virtualization` | PAT-002 | RULE-010, RULE-011, RULE-012, RULE-016, RULE-031, RULE-032, RULE-033, RULE-034, RULE-035, RULE-036 |
30
30
 
31
31
  ## Application patterns
32
32
 
@@ -2,8 +2,8 @@
2
2
  id: PAT-002
3
3
  title: Searchable and filterable list page
4
4
  decisions: [data-surface, data-processing-location, selection-scope, row-activation, data-resilience, virtualization]
5
- rules: [RULE-010, RULE-011, RULE-012, RULE-016]
6
- components: [DataGrid, DataGridBody, DataGridRow, DataGridCell, DataGridHeader, DataGridHeaderCell, DataGridSelectionCell, createTableColumn, Table, TableHeader, TableRow, TableCell, TableBody, TableCellLayout, Input, Button, MenuButton, Menu, MenuTrigger, MenuPopover, MenuList, MenuItem, Spinner, Skeleton, SkeletonItem, MessageBar, MessageBarBody, Checkbox, Field]
5
+ rules: [RULE-010, RULE-011, RULE-012, RULE-016, RULE-031, RULE-032, RULE-033, RULE-034, RULE-035, RULE-036]
6
+ components: [DataGrid, DataGridBody, DataGridRow, DataGridCell, DataGridHeader, DataGridHeaderCell, DataGridSelectionCell, createTableColumn, TableResizeHandle, Table, TableHeader, TableRow, TableCell, TableBody, TableCellLayout, Input, Button, MenuButton, Menu, MenuTrigger, MenuPopover, MenuList, MenuItem, Spinner, Skeleton, SkeletonItem, MessageBar, MessageBarBody, Checkbox, Field]
7
7
  derived: [application-owned FilterBar composition, application-owned query and pagination state]
8
8
  ---
9
9
 
@@ -51,27 +51,38 @@ or on the server is explicit in application state, not inferred by the grid.
51
51
 
52
52
  Below the project's narrow breakpoint, low-priority columns are hidden behind a detail view and
53
53
  filters collapse into a single control that opens a panel. The grid keeps vertical scrolling; it
54
- never requires two-dimensional scrolling to read a value. Virtualize the grid only after measuring a
55
- performance need, because virtualization keeps only the visible rows in the DOM and can break
56
- in-page search and predictable focus movement.
54
+ never requires two-dimensional scrolling to read a value. When columns can be resized, keep the grid
55
+ inside a region that scrolls horizontally so resizing never pushes the page itself into horizontal
56
+ scrolling, and prefer hiding low-priority columns over relying on resize at narrow widths.
57
+ Virtualize the grid only after measuring a performance need, because virtualization keeps only the
58
+ visible rows in the DOM and can break in-page search and predictable focus movement; when it is
59
+ used, keep the row renderer stable and the row key constant so the rendered window does not churn.
57
60
 
58
61
  ## Accessibility
59
62
 
60
- The grid uses one tab stop with arrow-key navigation inside it. Sort state is announced, selection
61
- changes are announced, and an async result update is announced through a polite status region. The
62
- select-all control states whether it selects the current page or all matching results.
63
+ The grid uses one tab stop with arrow-key navigation inside it. A cell that contains controls
64
+ declares its own focus mode: `group` when it holds several focusable elements so Enter enters the
65
+ cell and Escape returns to it, and `none` when it holds exactly one so that control is reached
66
+ directly. A sortable header cell stays a single sort button and must not contain nested focusable
67
+ controls. Sort state, selection changes, and async result updates are announced through a polite
68
+ status region, and every selection control carries an accessible name: the header control states
69
+ its selection scope and each row control names the row. The select-all control states whether it
70
+ selects the current page or all matching results.
63
71
 
64
72
  ## Edge cases
65
73
 
66
74
  Loading shows Skeletons in the grid region. No data, no search matches, and a failed load each show a
67
- distinct message; the failed state offers a retry action. A server-paged sort re-queries instead of
68
- sorting only the loaded page. A selection that spans pages keeps its ids when the page changes. When
69
- virtualization is enabled, keep a stable row key, expose the row's position and total count to
70
- assistive technology, and ensure focus is not lost when the visible window moves.
75
+ distinct message; the failed state offers a retry action. A column with no `compare` function stays
76
+ unsortable even when sorting is enabled, so a header that looks sortable can silently do nothing.
77
+ Because the library does not reliably announce a sort change, add a polite status message when the
78
+ result order changes. A server-paged sort re-queries instead of sorting only the loaded page. A
79
+ selection that spans pages keeps its ids when the page changes. When virtualization is enabled, keep
80
+ a stable row key, expose the row's position and total count to assistive technology, and ensure
81
+ focus is not lost when the visible window moves.
71
82
 
72
83
  ## Rules applied
73
84
 
74
- RULE-010, RULE-011, RULE-012, RULE-016
85
+ RULE-010, RULE-011, RULE-012, RULE-016, RULE-031, RULE-032, RULE-033, RULE-034, RULE-035, RULE-036
75
86
 
76
87
  ## Derived decisions
77
88
 
@@ -50,6 +50,12 @@ when it applies, and where its evidence comes from. Full provenance lives in
50
50
  | RULE-010 | should | Use DataGrid when the layout must be controlled by column definitions and keyboard grid behavior is required, and use Table when a native table structure is the goal. |
51
51
  | RULE-011 | should | Decide explicitly whether each collection operation runs on loaded rows or on the server, and pass the resulting state into the grid so the component does not imply a data source it does not have. |
52
52
  | RULE-012 | must | Make the selection scope explicit to the user, and when a bulk action can apply to all matching results rather than only the loaded page, offer that choice deliberately. |
53
+ | RULE-031 | must | Provide a compare function in every column definition whose header is meant to sort; a column without compare stays unsortable even when the grid enables sorting. |
54
+ | RULE-032 | must | Set focusMode group on a cell with several focusable elements so Enter enters the cell and Escape returns to it, and set focusMode none on a cell with exactly one focusable element so that control receives focus directly. |
55
+ | RULE-033 | must | Keep a sortable header cell free of nested focusable controls; move header actions into a context menu or into the body cells instead. |
56
+ | RULE-034 | should | Use resizableColumns only inside a container that allows horizontal overflow, provide the column sizing options, and keep keyboard resizing available; do not let resizing push the page into two-dimensional scrolling. |
57
+ | RULE-035 | must | Keep the row render function stable with useCallback and a stable row key before enabling virtualization. |
58
+ | RULE-036 | must | Provide an aria-label through the selection cell for both the header select-all control and each row control, naming the action and, for the header, the selection scope. |
53
59
 
54
60
  ## overlays
55
61