# Roadmap Planning notes for the `@primitiv-ui/react` headless component library. Two lists: 1. **Components to build** — the master backlog. 2. **Workbench examples** — components that exist but still need an `apps/workbench` example page. ## Harmoni plugin UI — minimum base components The six base components required to build the Harmoni plugin wireframe screens. Composite components (PaletteRamp, Swatch, etc.) are out of scope here. | Component | `@primitiv-ui/react` | Figma design | Notes | |---|---|---|---| | Button | ✓ built | ✓ | Primary, secondary, ghost/link, and icon-only variants all appear | | Slider | ✓ built | ✓ | Horizontal (Padding control) and vertical (curve editors) | | Switch | ✓ built | ✓ | Step labels and A11y badges on/off toggles | | Toggle Group | ✓ built | ✓ | Layout, Shape, Naming, and Modes pill selectors | | Input | ✓ built | ✓ | Hex colour text inputs; pair with `InputGroup` for the leading colour-swatch slot | | Select | ✓ built (native) | ✓ | Workspace picker and Collection dropdown; Rich Select / Combobox tracked in [`docs/select-future-work.md`](docs/select-future-work.md) | "Figma design" = a Figma component set exists for the component. All six base components now have Figma component sets. The Field wrapper (label + nested control + helper) also has a Figma set, though it is not one of the six base components above. Build priority: ~~Select (native)~~ → ~~Input~~ → ~~InputGroup~~ → ~~Field~~ → Figma design for Select. ## Figma design coverage Which built components have a Figma component set. Utility-only primitives (AccessibleIcon, DirectionProvider, Portal, SkipNav, VisuallyHidden) are not visual components and do not need a Figma design. | Component | Figma design | Node ID | |---|---|---| | Accordion | ✓ | 416:6729 (Item), 417:6881 (Panel) | | Alert | — | | | Avatar | ✓ | 433:7944 | | Breadcrumb | ✓ | 436:12220 (Item), 436:12221 (Separator), 436:12911 (composition) | | Button | ✓ | 347:14161 | | Carousel | — | | | Checkbox | ✓ | 369:30652 | | CheckboxCard | — | | | Collapsible | — | | | ContextMenu | — | | | Divider | ✓ | | | Dropdown | ✓ | 402:18499 | | EmptyState | — | | | Field | ✓ | 394:7449 | | Fieldset | — | | | Icon Button | ✓ | 433:8386 | | Input | ✓ | 393:6159 | | InputGroup | — | | | MillerColumns | — | | | Modal | ✓ | 435:10250 (Modal), 435:9450 (Header), 435:10108 (Body), 435:10161 (Footer) | | Progress | ✓ | 443:7839 | | RadioCard | — | | | RadioGroup | ✓ | 401:17958 | | Select | ✓ | 403:1883 | | Slider | ✓ | 392:5196 (track), 392:4353 (thumb) | | Status | — | | | Switch | ✓ | 315:5884 | | Table | ✓ | 605:13524 (Table), 604:9802 (Cell), 604:9991 (Header Cell), 604:10228 (Row) | | Tabs | ✓ | 425:5528 (Trigger), 425:5539 (Panel) | | Textarea | ✓ | 439:14511 | | Toggle | ✓ | 385:1418 | | ToggleGroup | ✓ | assembled from Toggle | | Tooltip | — | | | Tree | — | | ## Components to build What remains is every component that carries genuine interaction logic, ARIA behaviour, focus management, or non-trivial accessibility semantics that CSS alone cannot provide. ### Layout - [x] Divider ### Buttons - [x] Button ### Forms - [x] Checkbox - [x] Checkbox Card - [ ] Color Picker - [ ] Editable - [x] Field - [x] Fieldset - [ ] File Upload - [ ] Form - [x] Input - [x] InputGroup - [ ] Number Input - [ ] One-Time Password Field - [ ] Password Input - [ ] Pin Input - [x] Radio - [x] Radio Group - [x] Radio Card - [ ] Rating - [ ] Segmented Control - [x] Select (Native) - [x] Slider - [x] Switch - [ ] Tags Input - [x] Textarea ### Collections & Selection - [ ] Combobox — see [`docs/select-future-work.md`](docs/select-future-work.md) - [ ] Listbox - [ ] Select (Rich) — see [`docs/select-future-work.md`](docs/select-future-work.md) - [x] Tree - [x] Miller Columns - [ ] Date & Time - [ ] Calendar - [ ] Date Picker ### Overlays - [x] Action Bar - [ ] Alert Dialog - [x] Context Menu - [ ] Drawer - [x] Dropdown - [ ] Hover Card - [x] Modal - [ ] Popover - [x] Tooltip ### Disclosure - [x] Accordion - [x] Breadcrumb - [x] Carousel - [x] Collapsible - [ ] Pagination - [ ] Steps - [x] Tabs ### Navigation - [ ] Menubar - [ ] Navigation Menu - [x] Toggle - [x] Toggle Group - [ ] Toolbar ### Feedback & Status - [x] Alert - [x] Empty State - [x] Progress - [ ] Progress Circle - [x] Status ### Data Display - [x] Avatar - [ ] Clipboard - [ ] QR Code - [ ] Scroll Area - [ ] Splitter - [x] Table ### Utilities - [x] Accessible Icon - [x] Direction Provider - [ ] Environment Provider - [x] Portal - [ ] Presence - [x] Skip Nav - [x] Slot - [x] Visually Hidden ### Borderline cases A few entries are worth revisiting — they carry little or no JS behaviour, but were kept for meaningful ARIA semantics: - **Alert / Empty State / Status** — no JS behaviour, but meaningful ARIA role semantics (`role="alert"`, `role="status"`) that a plain `