UI stack and design system
UI-001 records why the UI contracts are a separate, zero-dependency PHP package that describes UI and never renders it. UI-003 records that the first-party client that renders those contracts is React + TypeScript over Inertia, with ReUI (shadcn/ui, Radix UI and Tailwind CSS, MIT, copy-paste distribution) as the design system foundation. The PHP package middag-php-ui owns transport-neutral page and block contracts; @middag-io/react owns the React renderer and components. A Moodle or WordPress adapter connects those pieces to its host.
| Concern | Current source |
|---|---|
| Package boundary decision | UI-001 |
| First-party client decision | UI-003 |
| PHP page and block contracts | middag-php-ui/src |
| React components and renderer | middag-react/src |
| React setup and supported components | middag-react/docs |
At the 2026-11-04 review (middag-react/main@56f72c697f79da42c4b811f272053a5d1e668c17, package version 0.42.0), @middag-io/react declared React 19 and @inertiajs/react 3 as peer dependencies. Check the package version used by a product before selecting components or installation steps. Component inventory, bundle size, and third-party license terms belong to the current package and its dependencies; this page does not freeze those changing values.
Client stack rationale
Why the first-party client is React + TypeScript with ReUI, and what that choice costs, is explained in ui architecture. The wire contract does not depend on that choice: another renderer can consume the same JSON; see UI wire contract.