@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.
- package/LICENSE +21 -0
- package/README.md +99 -0
- package/dist/a11y-contracts/index.d.ts +23 -0
- package/dist/a11y-contracts/index.js +1 -0
- package/dist/accordion/index.d.ts +78 -0
- package/dist/accordion/index.js +264 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.js +1 -0
- package/dist/alert/index.d.ts +33 -0
- package/dist/alert/index.js +54 -0
- package/dist/alert-dialog/index.d.ts +69 -0
- package/dist/alert-dialog/index.js +94 -0
- package/dist/badge/index.d.ts +48 -0
- package/dist/badge/index.js +89 -0
- package/dist/breadcrumb/index.d.ts +55 -0
- package/dist/breadcrumb/index.js +77 -0
- package/dist/button/index.d.ts +46 -0
- package/dist/button/index.js +86 -0
- package/dist/callout/index.d.ts +41 -0
- package/dist/callout/index.js +63 -0
- package/dist/card/index.d.ts +54 -0
- package/dist/card/index.js +103 -0
- package/dist/carousel/index.d.ts +98 -0
- package/dist/carousel/index.js +243 -0
- package/dist/checkbox/index.d.ts +50 -0
- package/dist/checkbox/index.js +87 -0
- package/dist/combobox/index.d.ts +114 -0
- package/dist/combobox/index.js +431 -0
- package/dist/command-palette/index.d.ts +73 -0
- package/dist/command-palette/index.js +147 -0
- package/dist/context-menu/index.d.ts +111 -0
- package/dist/context-menu/index.js +372 -0
- package/dist/copy-button/index.d.ts +62 -0
- package/dist/copy-button/index.js +183 -0
- package/dist/core/index.d.ts +20 -0
- package/dist/core/index.js +2 -0
- package/dist/core/selection.d.ts +5 -0
- package/dist/core/selection.js +39 -0
- package/dist/core/value-range.d.ts +49 -0
- package/dist/core/value-range.js +134 -0
- package/dist/date-picker/index.d.ts +210 -0
- package/dist/date-picker/index.js +895 -0
- package/dist/dialog/index.d.ts +95 -0
- package/dist/dialog/index.js +153 -0
- package/dist/disclosure/index.d.ts +52 -0
- package/dist/disclosure/index.js +159 -0
- package/dist/drawer/index.d.ts +30 -0
- package/dist/drawer/index.js +39 -0
- package/dist/feed/index.d.ts +77 -0
- package/dist/feed/index.js +260 -0
- package/dist/grid/index.d.ts +103 -0
- package/dist/grid/index.js +415 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.js +51 -0
- package/dist/input/index.d.ts +86 -0
- package/dist/input/index.js +156 -0
- package/dist/interactions/composite-navigation.d.ts +69 -0
- package/dist/interactions/composite-navigation.js +169 -0
- package/dist/interactions/index.d.ts +15 -0
- package/dist/interactions/index.js +4 -0
- package/dist/interactions/keyboard-intents.d.ts +16 -0
- package/dist/interactions/keyboard-intents.js +33 -0
- package/dist/interactions/overlay-focus.d.ts +40 -0
- package/dist/interactions/overlay-focus.js +93 -0
- package/dist/interactions/typeahead.d.ts +20 -0
- package/dist/interactions/typeahead.js +41 -0
- package/dist/landmarks/index.d.ts +39 -0
- package/dist/landmarks/index.js +58 -0
- package/dist/link/index.d.ts +34 -0
- package/dist/link/index.js +39 -0
- package/dist/listbox/index.d.ts +92 -0
- package/dist/listbox/index.js +337 -0
- package/dist/menu/index.d.ts +132 -0
- package/dist/menu/index.js +541 -0
- package/dist/menu-button/index.d.ts +71 -0
- package/dist/menu-button/index.js +121 -0
- package/dist/meter/index.d.ts +45 -0
- package/dist/meter/index.js +106 -0
- package/dist/number/index.d.ts +113 -0
- package/dist/number/index.js +252 -0
- package/dist/popover/index.d.ts +70 -0
- package/dist/popover/index.js +126 -0
- package/dist/progress/index.d.ts +49 -0
- package/dist/progress/index.js +79 -0
- package/dist/radio-group/index.d.ts +61 -0
- package/dist/radio-group/index.js +150 -0
- package/dist/select/index.d.ts +92 -0
- package/dist/select/index.js +239 -0
- package/dist/sidebar/index.d.ts +74 -0
- package/dist/sidebar/index.js +186 -0
- package/dist/slider/index.d.ts +61 -0
- package/dist/slider/index.js +150 -0
- package/dist/slider-multi-thumb/index.d.ts +70 -0
- package/dist/slider-multi-thumb/index.js +222 -0
- package/dist/spinbutton/index.d.ts +75 -0
- package/dist/spinbutton/index.js +214 -0
- package/dist/spinner/index.d.ts +1 -0
- package/dist/spinner/index.js +1 -0
- package/dist/spinner/spinner.d.ts +23 -0
- package/dist/spinner/spinner.js +25 -0
- package/dist/switch/index.d.ts +40 -0
- package/dist/switch/index.js +61 -0
- package/dist/table/index.d.ts +117 -0
- package/dist/table/index.js +377 -0
- package/dist/tabs/index.d.ts +63 -0
- package/dist/tabs/index.js +174 -0
- package/dist/textarea/index.d.ts +68 -0
- package/dist/textarea/index.js +137 -0
- package/dist/toast/index.d.ts +67 -0
- package/dist/toast/index.js +145 -0
- package/dist/toolbar/index.d.ts +59 -0
- package/dist/toolbar/index.js +139 -0
- package/dist/tooltip/index.d.ts +52 -0
- package/dist/tooltip/index.js +169 -0
- package/dist/treegrid/index.d.ts +101 -0
- package/dist/treegrid/index.js +463 -0
- package/dist/treeview/index.d.ts +68 -0
- package/dist/treeview/index.js +370 -0
- package/dist/window-splitter/index.d.ts +65 -0
- package/dist/window-splitter/index.js +204 -0
- package/package.json +92 -0
- package/specs/ADR-001-headless-architecture.md +461 -0
- package/specs/ADR-002-repo-release-model.md +108 -0
- package/specs/ADR-003-public-api-versioning.md +136 -0
- package/specs/ADR-004-focus-selection-policy.md +117 -0
- package/specs/IMPLEMENTATION-ROADMAP.md +237 -0
- package/specs/ISSUE-BACKLOG.md +681 -0
- package/specs/RELEASE-CANDIDATE.md +30 -0
- package/specs/components/accordion.md +130 -0
- package/specs/components/alert-dialog.md +72 -0
- package/specs/components/alert.md +65 -0
- package/specs/components/badge.md +220 -0
- package/specs/components/breadcrumb.md +74 -0
- package/specs/components/button.md +115 -0
- package/specs/components/callout.md +195 -0
- package/specs/components/card.md +280 -0
- package/specs/components/carousel.md +140 -0
- package/specs/components/checkbox.md +172 -0
- package/specs/components/combobox.md +423 -0
- package/specs/components/command-palette.md +92 -0
- package/specs/components/context-menu.md +556 -0
- package/specs/components/copy-button.md +293 -0
- package/specs/components/date-picker.md +400 -0
- package/specs/components/dialog.md +298 -0
- package/specs/components/disclosure.md +257 -0
- package/specs/components/drawer.md +353 -0
- package/specs/components/feed.md +265 -0
- package/specs/components/grid.md +186 -0
- package/specs/components/input.md +254 -0
- package/specs/components/landmarks.md +136 -0
- package/specs/components/link.md +134 -0
- package/specs/components/listbox.md +351 -0
- package/specs/components/menu-button.md +76 -0
- package/specs/components/menu.md +623 -0
- package/specs/components/meter.md +149 -0
- package/specs/components/number.md +393 -0
- package/specs/components/popover.md +252 -0
- package/specs/components/progress.md +188 -0
- package/specs/components/radio-group.md +151 -0
- package/specs/components/select.md +144 -0
- package/specs/components/sidebar.md +321 -0
- package/specs/components/slider-multi-thumb.md +78 -0
- package/specs/components/slider.md +84 -0
- package/specs/components/spinbutton.md +140 -0
- package/specs/components/spinner.md +132 -0
- package/specs/components/switch.md +175 -0
- package/specs/components/table.md +403 -0
- package/specs/components/tabs.md +265 -0
- package/specs/components/textarea.md +185 -0
- package/specs/components/toast.md +198 -0
- package/specs/components/toolbar.md +278 -0
- package/specs/components/tooltip.md +252 -0
- package/specs/components/treegrid.md +281 -0
- package/specs/components/treeview.md +91 -0
- package/specs/components/window-splitter.md +297 -0
- package/specs/ops/git-shard-sync.md +107 -0
- package/specs/ops/release-checklist.md +76 -0
- package/specs/release/GAP-TO-GREEN-ISSUES.md +88 -0
- package/specs/release/api-freeze-candidate.md +54 -0
- package/specs/release/changelog-automation.md +76 -0
- package/specs/release/changelog.generated.md +53 -0
- package/specs/release/changelog.patch.generated.md +46 -0
- package/specs/release/consumer-integration.md +53 -0
- package/specs/release/migration-notes-pre-v1.md +40 -0
- package/specs/release/mvp-changelog.md +57 -0
- package/specs/release/release-notes-template.md +61 -0
- package/specs/release/release-rehearsal.md +113 -0
- package/specs/release/semver-deprecation-dry-run.md +89 -0
- package/specs/release/shard-release-drill-report.md +50 -0
- package/specs/release/shard-release-follow-ups.md +31 -0
- 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.
|