}>
  This course is a systems track, not a demo track. You will build production-quality wrappers and learn how primitives behave under real constraints: nested overlays, async workflows, keyboard-first navigation, and accessibility audits.

## Outcomes

After completing the course, you should be able to:

* Build and ship design-system wrappers around primitives.
* Choose controlled vs uncontrolled strategies intentionally.
* Debug focus, dismissal, and layering issues quickly.
* Implement motion with `Presence` and reduced-motion support.
* Verify accessibility with keyboard and screen reader workflows.
* Build quality gates that catch interaction regressions early.
* Run an internal registry of vetted primitive wrapper examples.

***

## How to run this course

Recommended cadence:

1. Read one lesson.
2. Build the lab in a local playground.
3. Add one production constraint (async, nesting, RTL, or reduced motion).
4. Validate with keyboard and screen reader checks.

If you only copy snippets, you will miss the behavioral contracts that matter in production.

***

## Curriculum

| # | Lesson | Core topic | Production lens |
| --- | --- | --- | --- |
| 1 | [Why Primitives](/duck-primitives/course/01-why-primitives) | Behavioral abstraction | What complexity you should never rebuild manually |
| 2 | [Your First Dialog](/duck-primitives/course/02-first-dialog) | Compound anatomy | State ownership and guarded dismiss flows |
| 3 | [The asChild Pattern](/duck-primitives/course/03-as-child) | Composition model | Ref safety and prop merging contracts |
| 4 | [Popover and Positioning](/duck-primitives/course/04-popover) | Popper placement | Collision strategy and anchor modeling |
| 5 | [Menus, Dropdowns, and Selection](/duck-primitives/course/05-menus) | Complex selection UIs | Keyboard routing, item semantics, and submenus |
| 6 | [Animation with Presence](/duck-primitives/course/06-animation) | Mount lifecycle | Exit timing, forceMount, and reduced-motion policy |
| 7 | [Accessibility Deep Dive](/duck-primitives/course/07-accessibility) | ARIA + focus rules | Practical audits and failure modes |
| 8 | [Building a Design System](/duck-primitives/course/08-design-system) | Wrapper architecture | API consistency, defaults, and scaling patterns |
| 9 | [Testing and Quality Gates](/duck-primitives/course/09-testing-quality) | Reliability engineering | Interaction tests, a11y assertions, CI gates |
| 10 | [Operations, Migration, and Internal Registry](/duck-primitives/course/10-operations-migration) | Long-term operations | Rollout safety, governance, migration, registry |

***

## Prep checklist

Before lesson 1:

* Install `@gentleduck/primitives`.
* Create a playground app where you can iterate quickly.
* Set document and provider direction (`ltr` or `rtl`).
* Have one keyboard and one screen-reader pass workflow ready.

***

## Suggested capstone

Build this in your own repo while taking the course:

* `Dialog` wrapper with guarded async close.
* `Popover` wrapper with side-aware motion.
* `Menu` wrapper with checkbox/radio semantics.
* `Tooltip` wrapper with provider defaults.
* Internal registry entries for each wrapper with examples and test references.

If you are following this inside this monorepo, use `packages/registers/registry-internal/registry-internal.ts` as the internal registry entry source.

Then write a short engineering note explaining:

* Why you chose controlled vs uncontrolled for each.
* Which accessibility checks you automated vs manual.
* Which defaults belong in wrappers vs app usage.

***

## Coverage map

Use API docs as the canonical prop/event source:

* [All APIs](/duck-primitives/api)
* [Core Concepts](/duck-primitives/concepts)
* [Guides](/duck-primitives/guides)