@chromvoid/headless-ui 0.1.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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +99 -0
  3. package/dist/a11y-contracts/index.d.ts +23 -0
  4. package/dist/a11y-contracts/index.js +1 -0
  5. package/dist/accordion/index.d.ts +78 -0
  6. package/dist/accordion/index.js +264 -0
  7. package/dist/adapters/index.d.ts +9 -0
  8. package/dist/adapters/index.js +1 -0
  9. package/dist/alert/index.d.ts +33 -0
  10. package/dist/alert/index.js +54 -0
  11. package/dist/alert-dialog/index.d.ts +69 -0
  12. package/dist/alert-dialog/index.js +94 -0
  13. package/dist/badge/index.d.ts +48 -0
  14. package/dist/badge/index.js +89 -0
  15. package/dist/breadcrumb/index.d.ts +55 -0
  16. package/dist/breadcrumb/index.js +77 -0
  17. package/dist/button/index.d.ts +46 -0
  18. package/dist/button/index.js +86 -0
  19. package/dist/callout/index.d.ts +41 -0
  20. package/dist/callout/index.js +63 -0
  21. package/dist/card/index.d.ts +54 -0
  22. package/dist/card/index.js +103 -0
  23. package/dist/carousel/index.d.ts +98 -0
  24. package/dist/carousel/index.js +243 -0
  25. package/dist/checkbox/index.d.ts +50 -0
  26. package/dist/checkbox/index.js +87 -0
  27. package/dist/combobox/index.d.ts +114 -0
  28. package/dist/combobox/index.js +431 -0
  29. package/dist/command-palette/index.d.ts +73 -0
  30. package/dist/command-palette/index.js +147 -0
  31. package/dist/context-menu/index.d.ts +111 -0
  32. package/dist/context-menu/index.js +372 -0
  33. package/dist/copy-button/index.d.ts +62 -0
  34. package/dist/copy-button/index.js +183 -0
  35. package/dist/core/index.d.ts +20 -0
  36. package/dist/core/index.js +2 -0
  37. package/dist/core/selection.d.ts +5 -0
  38. package/dist/core/selection.js +39 -0
  39. package/dist/core/value-range.d.ts +49 -0
  40. package/dist/core/value-range.js +134 -0
  41. package/dist/date-picker/index.d.ts +210 -0
  42. package/dist/date-picker/index.js +895 -0
  43. package/dist/dialog/index.d.ts +95 -0
  44. package/dist/dialog/index.js +153 -0
  45. package/dist/disclosure/index.d.ts +52 -0
  46. package/dist/disclosure/index.js +159 -0
  47. package/dist/drawer/index.d.ts +30 -0
  48. package/dist/drawer/index.js +39 -0
  49. package/dist/feed/index.d.ts +77 -0
  50. package/dist/feed/index.js +260 -0
  51. package/dist/grid/index.d.ts +103 -0
  52. package/dist/grid/index.js +415 -0
  53. package/dist/index.d.ts +51 -0
  54. package/dist/index.js +51 -0
  55. package/dist/input/index.d.ts +86 -0
  56. package/dist/input/index.js +156 -0
  57. package/dist/interactions/composite-navigation.d.ts +69 -0
  58. package/dist/interactions/composite-navigation.js +169 -0
  59. package/dist/interactions/index.d.ts +15 -0
  60. package/dist/interactions/index.js +4 -0
  61. package/dist/interactions/keyboard-intents.d.ts +16 -0
  62. package/dist/interactions/keyboard-intents.js +33 -0
  63. package/dist/interactions/overlay-focus.d.ts +40 -0
  64. package/dist/interactions/overlay-focus.js +93 -0
  65. package/dist/interactions/typeahead.d.ts +20 -0
  66. package/dist/interactions/typeahead.js +41 -0
  67. package/dist/landmarks/index.d.ts +39 -0
  68. package/dist/landmarks/index.js +58 -0
  69. package/dist/link/index.d.ts +34 -0
  70. package/dist/link/index.js +39 -0
  71. package/dist/listbox/index.d.ts +92 -0
  72. package/dist/listbox/index.js +337 -0
  73. package/dist/menu/index.d.ts +132 -0
  74. package/dist/menu/index.js +541 -0
  75. package/dist/menu-button/index.d.ts +71 -0
  76. package/dist/menu-button/index.js +121 -0
  77. package/dist/meter/index.d.ts +45 -0
  78. package/dist/meter/index.js +106 -0
  79. package/dist/number/index.d.ts +113 -0
  80. package/dist/number/index.js +252 -0
  81. package/dist/popover/index.d.ts +70 -0
  82. package/dist/popover/index.js +126 -0
  83. package/dist/progress/index.d.ts +49 -0
  84. package/dist/progress/index.js +79 -0
  85. package/dist/radio-group/index.d.ts +61 -0
  86. package/dist/radio-group/index.js +150 -0
  87. package/dist/select/index.d.ts +92 -0
  88. package/dist/select/index.js +239 -0
  89. package/dist/sidebar/index.d.ts +74 -0
  90. package/dist/sidebar/index.js +186 -0
  91. package/dist/slider/index.d.ts +61 -0
  92. package/dist/slider/index.js +150 -0
  93. package/dist/slider-multi-thumb/index.d.ts +70 -0
  94. package/dist/slider-multi-thumb/index.js +222 -0
  95. package/dist/spinbutton/index.d.ts +75 -0
  96. package/dist/spinbutton/index.js +214 -0
  97. package/dist/spinner/index.d.ts +1 -0
  98. package/dist/spinner/index.js +1 -0
  99. package/dist/spinner/spinner.d.ts +23 -0
  100. package/dist/spinner/spinner.js +25 -0
  101. package/dist/switch/index.d.ts +40 -0
  102. package/dist/switch/index.js +61 -0
  103. package/dist/table/index.d.ts +117 -0
  104. package/dist/table/index.js +377 -0
  105. package/dist/tabs/index.d.ts +63 -0
  106. package/dist/tabs/index.js +174 -0
  107. package/dist/textarea/index.d.ts +68 -0
  108. package/dist/textarea/index.js +137 -0
  109. package/dist/toast/index.d.ts +67 -0
  110. package/dist/toast/index.js +145 -0
  111. package/dist/toolbar/index.d.ts +59 -0
  112. package/dist/toolbar/index.js +139 -0
  113. package/dist/tooltip/index.d.ts +52 -0
  114. package/dist/tooltip/index.js +169 -0
  115. package/dist/treegrid/index.d.ts +101 -0
  116. package/dist/treegrid/index.js +463 -0
  117. package/dist/treeview/index.d.ts +68 -0
  118. package/dist/treeview/index.js +370 -0
  119. package/dist/window-splitter/index.d.ts +65 -0
  120. package/dist/window-splitter/index.js +204 -0
  121. package/package.json +92 -0
  122. package/specs/ADR-001-headless-architecture.md +461 -0
  123. package/specs/ADR-002-repo-release-model.md +108 -0
  124. package/specs/ADR-003-public-api-versioning.md +136 -0
  125. package/specs/ADR-004-focus-selection-policy.md +117 -0
  126. package/specs/IMPLEMENTATION-ROADMAP.md +237 -0
  127. package/specs/ISSUE-BACKLOG.md +681 -0
  128. package/specs/RELEASE-CANDIDATE.md +30 -0
  129. package/specs/components/accordion.md +130 -0
  130. package/specs/components/alert-dialog.md +72 -0
  131. package/specs/components/alert.md +65 -0
  132. package/specs/components/badge.md +220 -0
  133. package/specs/components/breadcrumb.md +74 -0
  134. package/specs/components/button.md +115 -0
  135. package/specs/components/callout.md +195 -0
  136. package/specs/components/card.md +280 -0
  137. package/specs/components/carousel.md +140 -0
  138. package/specs/components/checkbox.md +172 -0
  139. package/specs/components/combobox.md +423 -0
  140. package/specs/components/command-palette.md +92 -0
  141. package/specs/components/context-menu.md +556 -0
  142. package/specs/components/copy-button.md +293 -0
  143. package/specs/components/date-picker.md +400 -0
  144. package/specs/components/dialog.md +298 -0
  145. package/specs/components/disclosure.md +257 -0
  146. package/specs/components/drawer.md +353 -0
  147. package/specs/components/feed.md +265 -0
  148. package/specs/components/grid.md +186 -0
  149. package/specs/components/input.md +254 -0
  150. package/specs/components/landmarks.md +136 -0
  151. package/specs/components/link.md +134 -0
  152. package/specs/components/listbox.md +351 -0
  153. package/specs/components/menu-button.md +76 -0
  154. package/specs/components/menu.md +623 -0
  155. package/specs/components/meter.md +149 -0
  156. package/specs/components/number.md +393 -0
  157. package/specs/components/popover.md +252 -0
  158. package/specs/components/progress.md +188 -0
  159. package/specs/components/radio-group.md +151 -0
  160. package/specs/components/select.md +144 -0
  161. package/specs/components/sidebar.md +321 -0
  162. package/specs/components/slider-multi-thumb.md +78 -0
  163. package/specs/components/slider.md +84 -0
  164. package/specs/components/spinbutton.md +140 -0
  165. package/specs/components/spinner.md +132 -0
  166. package/specs/components/switch.md +175 -0
  167. package/specs/components/table.md +403 -0
  168. package/specs/components/tabs.md +265 -0
  169. package/specs/components/textarea.md +185 -0
  170. package/specs/components/toast.md +198 -0
  171. package/specs/components/toolbar.md +278 -0
  172. package/specs/components/tooltip.md +252 -0
  173. package/specs/components/treegrid.md +281 -0
  174. package/specs/components/treeview.md +91 -0
  175. package/specs/components/window-splitter.md +297 -0
  176. package/specs/ops/git-shard-sync.md +107 -0
  177. package/specs/ops/release-checklist.md +76 -0
  178. package/specs/release/GAP-TO-GREEN-ISSUES.md +88 -0
  179. package/specs/release/api-freeze-candidate.md +54 -0
  180. package/specs/release/changelog-automation.md +76 -0
  181. package/specs/release/changelog.generated.md +53 -0
  182. package/specs/release/changelog.patch.generated.md +46 -0
  183. package/specs/release/consumer-integration.md +53 -0
  184. package/specs/release/migration-notes-pre-v1.md +40 -0
  185. package/specs/release/mvp-changelog.md +57 -0
  186. package/specs/release/release-notes-template.md +61 -0
  187. package/specs/release/release-rehearsal.md +113 -0
  188. package/specs/release/semver-deprecation-dry-run.md +89 -0
  189. package/specs/release/shard-release-drill-report.md +50 -0
  190. package/specs/release/shard-release-follow-ups.md +31 -0
  191. package/specs/signals.md +208 -0
@@ -0,0 +1,136 @@
1
+ # ADR-003: Public API Versioning and Evolution Policy
2
+
3
+ > **Status**: Draft
4
+ > **Version**: 2026-02-08-r3
5
+ > **Date**: 2026-02-08
6
+ > **Authors**: Team ChromVoid
7
+ > **Related Documents**:
8
+ >
9
+ > - [ADR-001-headless-architecture](./ADR-001-headless-architecture.md) - API baseline
10
+ > - [ADR-002-repo-release-model](./ADR-002-repo-release-model.md) - release ownership
11
+
12
+ ## Context
13
+
14
+ The package is distributed as an independent public library.
15
+ Its API must evolve predictably for external consumers and remain stable across internal refactors.
16
+
17
+ ## Problem
18
+
19
+ Without a formal policy:
20
+
21
+ - safe vs breaking changes are inconsistently classified;
22
+ - deprecation becomes ad-hoc;
23
+ - consumers cannot plan upgrades confidently.
24
+
25
+ ## Goals
26
+
27
+ 1. Define SemVer policy.
28
+ 2. Define what counts as public API.
29
+ 3. Define a required deprecation flow.
30
+ 4. Make breaking changes explicit and planned.
31
+
32
+ ## Non-Goals
33
+
34
+ - Changelog template details.
35
+ - Release cadence policy.
36
+
37
+ ## Decision
38
+
39
+ ### 1. Public API Definition
40
+
41
+ Public API includes only items exported from package root exports (`.`):
42
+
43
+ - `createX` factories;
44
+ - documented `actions`, `selectors`, and `state` contracts;
45
+ - `get*Props` accessibility contracts;
46
+ - documented public types.
47
+
48
+ Anything not exported from root entrypoint is private implementation detail.
49
+
50
+ ### 2. SemVer Rules
51
+
52
+ Pre-v1 policy (`0.x`):
53
+
54
+ - `PATCH`: bug fix with no intentional contract reshape.
55
+ - `MINOR`: additions and allowed contract redesign when it improves consumer DX.
56
+ - all intentional breaking changes in `0.x` MUST include explicit migration notes.
57
+
58
+ Post-v1 policy (`>=1.0.0`):
59
+
60
+ - `PATCH`: bug fix with no public API contract change.
61
+ - `MINOR`: backward-compatible additions.
62
+ - `MAJOR`: any breaking runtime, type-level, or behavior-contract change.
63
+
64
+ ### 3. Deprecation Rules
65
+
66
+ For each public API scheduled for removal:
67
+
68
+ 1. add `@deprecated` annotation in types and docs;
69
+ 2. publish release notes with migration path;
70
+ 3. keep at least one `MINOR` release cycle before removal;
71
+ 4. remove only in the next `MAJOR` release.
72
+
73
+ Pre-v1 exception (`0.x`):
74
+
75
+ - if rapid API redesign is needed for better consumer ergonomics, hard deprecation cycles may be shortened,
76
+ but migration notes are still mandatory.
77
+
78
+ ### 4. Behavior Compatibility
79
+
80
+ Breaking change includes behavior contracts, not only signatures:
81
+
82
+ - keyboard semantics;
83
+ - focus and selection invariants;
84
+ - ARIA contract shape.
85
+
86
+ Any incompatible APG contract change requires `MAJOR`.
87
+
88
+ ### 5. Release Classification Checklist
89
+
90
+ Before release, classify each change across:
91
+
92
+ 1. API shape (`createX`, options, return contracts)
93
+ 2. Type compatibility
94
+ 3. Behavior compatibility (APG, focus, keyboard)
95
+ 4. Migration requirements
96
+
97
+ For post-v1 releases, if at least one item is incompatible, release must be `MAJOR`.
98
+
99
+ For pre-v1 releases, incompatible changes are allowed in `MINOR`, but require migration notes and explicit release annotation.
100
+
101
+ ## Alternatives
102
+
103
+ ### A. Informal versioning only
104
+
105
+ **Rejected**:
106
+
107
+ - unpredictable for consumers;
108
+ - high risk of accidental breaking releases.
109
+
110
+ ### B. Freeze API until 1.0
111
+
112
+ **Rejected**:
113
+
114
+ - blocks practical evolution;
115
+ - does not fit early contract formation stage.
116
+
117
+ ## Consequences
118
+
119
+ ### Positive
120
+
121
+ - clearer upgrade expectations;
122
+ - fewer consumer regressions;
123
+ - better external ecosystem trust.
124
+
125
+ ### Negative
126
+
127
+ - stricter release review discipline required;
128
+ - more documentation overhead for deprecations.
129
+
130
+ ## Change History
131
+
132
+ | Date | Change |
133
+ | ---------- | ---------------------------------------------------------------------------- |
134
+ | 2026-02-08 | Initial draft created (r1) |
135
+ | 2026-02-08 | Rewritten to full English and clarified release checklist (r2) |
136
+ | 2026-02-08 | Added pre-v1 DX-first versioning policy and migration-note requirements (r3) |
@@ -0,0 +1,117 @@
1
+ # ADR-004: Shared Focus/Selection Policy and APG Strategy
2
+
3
+ > **Status**: Draft
4
+ > **Version**: 2026-02-08-r2
5
+ > **Date**: 2026-02-08
6
+ > **Authors**: Team ChromVoid
7
+ > **Related Documents**:
8
+ >
9
+ > - [ADR-001-headless-architecture](./ADR-001-headless-architecture.md) - layers and API shape
10
+ > - [WAI-ARIA APG Listbox](https://www.w3.org/WAI/ARIA/apg/patterns/listbox/) - listbox baseline behavior
11
+ > - [WAI-ARIA APG Keyboard Interface](https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/) - keyboard and focus rules
12
+
13
+ ## Context
14
+
15
+ The headless package must provide predictable APG-conformant behavior contracts.
16
+ Main risk: inconsistent interpretation of focus, selection, and keyboard behavior across components.
17
+
18
+ ## Problem
19
+
20
+ Without a shared policy:
21
+
22
+ - one component may treat focus as selection while another does not;
23
+ - keymaps drift between components;
24
+ - `roving-tabindex` and `aria-activedescendant` are chosen ad-hoc;
25
+ - accessibility regressions become more likely.
26
+
27
+ ## Goals
28
+
29
+ 1. Define shared focus and selection invariants.
30
+ 2. Define focus-strategy decision criteria.
31
+ 3. Standardize baseline keyboard behavior.
32
+ 4. Keep `get*Props()` contracts APG-conformant.
33
+
34
+ ## Non-Goals
35
+
36
+ - Full keymap catalog for every future component.
37
+ - Visual focus ring styling and presentation design.
38
+
39
+ ## Decision
40
+
41
+ ### 1. State Invariants
42
+
43
+ 1. `focus` and `selection` are independent states.
44
+ 2. Single-select may enable selection-follows-focus only as explicit option.
45
+ 3. Multi-select must not clear selection during standard arrow navigation.
46
+ 4. Active item (`activeId`) must always be valid option id or `null`.
47
+
48
+ ### 2. Focus Strategy Choice
49
+
50
+ Supported strategies:
51
+
52
+ - `roving-tabindex`
53
+ - `aria-activedescendant`
54
+
55
+ Selection rules:
56
+
57
+ - use `roving-tabindex` by default for non-virtualized collections;
58
+ - use `aria-activedescendant` when DOM focus must stay on root/control, or when virtualized behavior requires stable focus anchor;
59
+ - strategy selection must be explicit in `createX(options)`.
60
+
61
+ ### 3. Baseline Keyboard Contract
62
+
63
+ Required baseline, when applicable for a given pattern:
64
+
65
+ - `ArrowUp/ArrowDown` (or horizontal equivalent): focus navigation;
66
+ - `Home/End`: move to first/last item;
67
+ - `Space`: toggle/select action according to APG;
68
+ - `Enter`: activate action for activation-capable patterns;
69
+ - `Escape`: dismiss/reset action for open/overlay-capable patterns.
70
+
71
+ ### 4. APG Props Contract
72
+
73
+ `getRootProps()` and `getItemProps()` MUST:
74
+
75
+ - provide correct `role` values;
76
+ - provide `aria-selected` for selectable options;
77
+ - provide `tabindex` or `aria-activedescendant` based on chosen strategy;
78
+ - avoid any presentation logic.
79
+
80
+ ### 5. Compatibility Rule
81
+
82
+ Focus/selection/keyboard semantic changes are behavior-breaking
83
+ if they change observable contract behavior for consumers.
84
+
85
+ ## Alternatives
86
+
87
+ ### A. Support only one focus strategy
88
+
89
+ **Rejected**:
90
+
91
+ - does not cover all widget classes and virtualization cases.
92
+
93
+ ### B. Define policy per component without shared ADR
94
+
95
+ **Rejected**:
96
+
97
+ - leads to contract drift and inconsistent accessibility behavior.
98
+
99
+ ## Consequences
100
+
101
+ ### Positive
102
+
103
+ - unified behavior model across components;
104
+ - fewer APG regressions;
105
+ - more predictable consumer integrations.
106
+
107
+ ### Negative
108
+
109
+ - higher entry bar for new component implementations;
110
+ - stricter keyboard/focus test matrix required.
111
+
112
+ ## Change History
113
+
114
+ | Date | Change |
115
+ | ---------- | ----------------------------------------------------------- |
116
+ | 2026-02-08 | Initial draft created (r1) |
117
+ | 2026-02-08 | Rewritten to full English and clarified strategy rules (r2) |
@@ -0,0 +1,237 @@
1
+ # Headless Components Implementation and Testing Roadmap
2
+
3
+ ## Scope
4
+
5
+ This roadmap defines the next component implementations for `@chromvoid/headless-ui`
6
+ and the required testing strategy for each component.
7
+
8
+ The package remains independent and APG-driven, with one component per directory
9
+ and one component spec per file.
10
+
11
+ ## Ground Rules
12
+
13
+ - one component per directory: `src/<component>/`
14
+ - one component spec: `specs/components/<component>.md`
15
+ - TDD-first workflow (red -> green -> refactor)
16
+ - APG behavior contracts are part of the public API
17
+ - no internal monorepo imports (`@project/*`, `apps/*`)
18
+
19
+ ## Delivery Waves
20
+
21
+ ## APG Full Coverage Target (30 patterns)
22
+
23
+ Source of truth: `https://www.w3.org/WAI/ARIA/apg/patterns/`
24
+
25
+ Current status in this package:
26
+
27
+ - implemented: Listbox, Combobox, Menu and Menubar (menu), Tabs, Tree View
28
+ - planned: all remaining APG patterns below
29
+
30
+ Patterns to cover in roadmap scope:
31
+
32
+ 1. Accordion (Sections With Show/Hide Functionality)
33
+ 2. Alert
34
+ 3. Alert and Message Dialogs
35
+ 4. Breadcrumb
36
+ 5. Button
37
+ 6. Carousel (Slide Show or Image Rotator)
38
+ 7. Checkbox
39
+ 8. Combobox
40
+ 9. Dialog (Modal)
41
+ 10. Disclosure (Show/Hide)
42
+ 11. Feed
43
+ 12. Grid (Interactive Tabular Data and Layout Containers)
44
+ 13. Landmarks
45
+ 14. Link
46
+ 15. Listbox
47
+ 16. Menu and Menubar
48
+ 17. Menu Button
49
+ 18. Meter
50
+ 19. Radio Group
51
+ 20. Slider
52
+ 21. Slider (Multi-Thumb)
53
+ 22. Spinbutton
54
+ 23. Switch
55
+ 24. Table
56
+ 25. Tabs
57
+ 26. Toolbar
58
+ 27. Tooltip
59
+ 28. Tree View
60
+ 29. Treegrid
61
+ 30. Window Splitter
62
+
63
+ ## Wave 1: Stabilization of Implemented Complex Widgets
64
+
65
+ ### Components
66
+
67
+ - Listbox
68
+ - Combobox
69
+ - Menu and Menubar
70
+ - Tabs
71
+ - Tree View
72
+
73
+ ### Planned Work
74
+
75
+ 1. complete APG edge-case coverage for keyboard matrices and disabled-item invariants
76
+ 2. normalize public APIs and naming across implemented widgets
77
+ 3. align each implemented widget spec with latest APG wording and links
78
+
79
+ ### Required Tests
80
+
81
+ - full keyboard matrix parity against APG contracts
82
+ - id/reference integrity (`aria-controls`, `aria-labelledby`, `aria-activedescendant`)
83
+ - regression tests for previously fixed interaction bugs
84
+
85
+ ## Wave 2: Core Form and Command Widgets
86
+
87
+ ### Components
88
+
89
+ - Button
90
+ - Checkbox
91
+ - Radio Group
92
+ - Switch
93
+ - Slider
94
+ - Slider (Multi-Thumb)
95
+ - Spinbutton
96
+ - Meter
97
+ - Link
98
+
99
+ ### Planned Work
100
+
101
+ 1. implement per-pattern state models and headless prop contracts in `src/<component>/index.ts`
102
+ 2. add one APG-focused spec per component in `specs/components/<component>.md`
103
+ 3. extract reusable value-range and toggle primitives in shared core layers
104
+
105
+ ### Required Tests
106
+
107
+ - value boundaries, stepping rules, and min/max clamping where applicable
108
+ - selection/toggle semantics and role/state attributes
109
+ - pointer + keyboard parity and disabled behavior
110
+
111
+ ## Wave 3: Disclosure, Overlay, and Messaging Patterns
112
+
113
+ ### Components
114
+
115
+ - Disclosure (Show/Hide)
116
+ - Accordion (Sections With Show/Hide Functionality)
117
+ - Dialog (Modal)
118
+ - Alert and Message Dialogs
119
+ - Alert
120
+ - Tooltip
121
+ - Toolbar
122
+ - Menu Button
123
+
124
+ ### Planned Work
125
+
126
+ 1. implement overlay and dismiss primitives reusable by dialog, alertdialog, tooltip, and menu button
127
+ 2. model focus entry/exit rules and restore-focus contracts
128
+ 3. define interaction boundaries for modal/non-modal behavior and announcement semantics
129
+
130
+ ### Required Tests
131
+
132
+ - focus trapping/restore and escape/outside-intent close paths
133
+ - heading/description/id linkage guarantees
134
+ - non-interruptive vs interruptive announcement behavior (`alert` vs `alertdialog`)
135
+
136
+ ## Wave 4: Data Navigation and Collection Patterns
137
+
138
+ ### Components
139
+
140
+ - Grid (Interactive Tabular Data and Layout Containers)
141
+ - Treegrid
142
+ - Table
143
+ - Feed
144
+ - Carousel (Slide Show or Image Rotator)
145
+ - Window Splitter
146
+
147
+ ### Planned Work
148
+
149
+ 1. implement row/cell navigation engines and hierarchical grid contracts
150
+ 2. define static vs interactive tabular APIs (`table` vs `grid`/`treegrid`)
151
+ 3. implement region/slide control contracts for carousel and pane size contracts for window splitter
152
+
153
+ ### Required Tests
154
+
155
+ - directional navigation and edit/interaction mode transitions
156
+ - row/column/level metadata correctness where required
157
+ - resize boundary behavior and persisted pane ratio contracts for splitter
158
+
159
+ ## Wave 5: Structural Navigation and Page Semantics
160
+
161
+ ### Components
162
+
163
+ - Breadcrumb
164
+ - Landmarks
165
+
166
+ ### Planned Work
167
+
168
+ 1. provide headless helpers for landmark role assignment and labeling contracts
169
+ 2. provide breadcrumb generation helpers with current-page semantics
170
+
171
+ ### Required Tests
172
+
173
+ - semantic role/label correctness and uniqueness constraints
174
+ - current-item semantics (`aria-current`) and link structure invariants
175
+
176
+ ## Wave 6: MVP-next Extension Components
177
+
178
+ ### Components
179
+
180
+ - Select
181
+ - Popover
182
+ - Context Menu
183
+ - Command Palette
184
+ - Toast
185
+ - Progress
186
+
187
+ ### Planned Work
188
+
189
+ 1. productize scaffold components into stable public contracts and expand behavior documentation parity
190
+ 2. enforce deterministic state transitions for open/close, execute, queue timing, and value semantics
191
+ 3. add explicit dependency sequencing to minimize churn in shared overlay/selection primitives
192
+
193
+ ### Required Tests
194
+
195
+ - source/intent tracking for open, close, and dismiss behavior where applicable
196
+ - keyboard invocation and command execution parity (`Enter`, `Space`, shortcut toggles)
197
+ - queue/timer lifecycle correctness for toast pause/resume with remaining-duration preservation
198
+ - determinate/indeterminate aria contract integrity for progress
199
+ - regression tests for focus restore and target linkage contracts
200
+
201
+ ## Shared Testing Blueprint (applies to every component)
202
+
203
+ For each component, the test suite must include:
204
+
205
+ 1. state transition tests
206
+ 2. keyboard contract tests
207
+ 3. accessibility props contract tests
208
+ 4. disabled and edge-case invariant tests
209
+ 5. regression tests for previously fixed bugs
210
+
211
+ Suggested local layout:
212
+
213
+ - `src/<component>/index.ts`
214
+ - `src/<component>/<component>.test.ts`
215
+ - optional split: `src/<component>/<component>.keyboard.test.ts` (when keyboard matrix grows)
216
+
217
+ ## Definition of Done per Component
218
+
219
+ A component is done when:
220
+
221
+ 1. component spec exists and is up to date
222
+ 2. public API exported via `src/index.ts`
223
+ 3. APG contract covered by tests
224
+ 4. `npm run lint` passes
225
+ 5. `npm run test` passes
226
+ 6. boundary check remains green
227
+
228
+ ## Execution Order (recommended)
229
+
230
+ 1. Stabilization of implemented complex widgets
231
+ 2. Core form and command widgets
232
+ 3. Disclosure, overlay, and messaging patterns
233
+ 4. Data navigation and collection patterns
234
+ 5. Structural navigation and page semantics
235
+ 6. MVP-next extension components
236
+
237
+ This order prioritizes reusable interaction primitives, keeps risk low for already-shipped widgets, and expands APG coverage to all listed patterns.