# UI Donor Census — the durable design-system census

**Audience: AI coding agents first.** A FACTS doc, not a judgment doc. Optimize reads for activation.
**Date:** 2026-06-16 · **Status:** Living census, path-scoped commit-anchored. Refresh per `docs/catalog/index.md §3`.
**Purpose:** answer *"how do donors build UI — what engine, token layer, variant system, taxonomy, design-system page?"* once, against pinned commits, so we **never re-explore the UI question**. Indexed in `docs/catalog/index.md §2`.

> **FACTS, not verdict.** This records what each donor's UI subtree *contains*. Whether any of it becomes product is decided by the UI product brief (`docs/specs/2026-06-16-ui-product-brief.md`) and the delivery-stack kill (`docs/specs/2026-06-16-delivery-stack.md §3`, `registry.json → deliveryStages.ui-primitives`). The `ui-react` **umbrella** stays KILLED; the live form is a **flat `@platform-modules/ui-*` family inside `mod`** (`ui-tokens`/`ui-util`/`ui-primitives`) on the framework/presentation axis (RECONCILED 2026-06-16 — *not* a separate repo/brand). See the brief.

---

## Per-donor census (path-scoped, pinned)

Pin = last commit that touched the UI path (`git -C <repo> log -1 --format=%h -- <ui-path>`). Fresh iff unchanged.

| Donor | UI path | Pin (path-scoped) | Engine | Token layer | Variants | Framework | a11y |
|---|---|---|---|---|---|---|---|
| `multideal` | `apps/web/src/components/ui` | `875012ff8` (2026-06-14) | **Radix** (~17 `@radix-ui/*`) | Tailwind + CSS custom props | CVA + `cn` (clsx + tailwind-merge) | Astro + React islands | Radix-backed |
| `trance-shop-israel` | `packages/ui` | `8bfb1f24` (2026-06-11) | **Radix** (~18 `@radix-ui/*`) | Tailwind + CSS custom props | CVA + `cn` | Astro + React | Radix-backed |
| `zync.is` | `packages/ui` | `33b6489` (2026-06-11) | **Radix** (~14 `@radix-ui/*`) + `cmdk` | Tailwind + CSS custom props | CVA + `cn` | Vite React + Astro site | Radix-backed |
| `vibeflare` | `apps/ui` | `3154d95` (2026-06-12) | **Radix** (dialog/select/tabs/toast/checkbox/progress/tooltip) | Tailwind + CSS custom props | CVA + `cn` | Astro + React islands | Radix-backed |
| `ForumZone` | `packages/ui` | `c248484` (2026-06-04) | **hand-rolled** (no Radix-family dep) | Tailwind + CSS custom props | ad-hoc | Astro + React | **UNVERIFIED** |
| `Press.zone` | `frontend/app/src/components` | **untracked** (snapshot; backend HEAD `bf69846`, 2026-06-13) | **hand-rolled** | (Vite React) | ad-hoc | Vite React | **UNVERIFIED** |

**Design-system page (the abstraction target — owner builds one per project):**
- `vibeflare`: `design-system.astro` + `DesignSystemGallery` (a live themed-primitive showcase).
- `multideal`: `features/design-system/` (~19 sections).
- `zync.is`: Storybook 8 (minimal).
- (others: none catalogued.)

---

## Convergence synthesis (what the census proves)

**1. Token layer is unanimous — 6/6 Tailwind + CSS custom properties.** Every donor themes via CSS variables (`:root` / `@theme` / `[data-theme]`) consumed by Tailwind. This is the **universal theming contract** and the one finding strong enough to be the product's spine. *Proven for Tailwind donors; CSS-variable tokens are framework-portable in principle, but "works with any CSS system" is design intent, not donor-proven — every donor is Tailwind.*

**2. Engine converges on the shadcn stack — 4/6 Radix + Tailwind + CVA + `cmdk`/`lucide`.** The four mature donors (multideal, trance, zync, vibeflare) run *the same* stack: Radix primitives, Tailwind styling, CVA variants, `cn` merge. That stack **is** shadcn/ui's. Ark/Panda (Park UI) appears in **zero** donors — the earlier "Park UI lead" hypothesis is closed by the data. The convergent engine = **Radix + Tailwind + CVA**, which is also the most agent-legible choice (shadcn is the dominant pattern in agent training data).

**3. The 2 hand-rolled donors are the slop evidence.** ForumZone and Press.zone hand-roll primitives with **accessibility unverified** — the exact failure mode the product's enforcement triad exists to prevent. Convergence > count holds: where donors converge they converge *on Radix*, not on a shared internal contract; the hand-rolled two are the non-converging outliers, not a counter-pattern.

**4. Framework — 6/6 React; Astro + React islands dominant (4/6).** React is the proven axis. Non-React is a deferred axis (unproven surface), not v1.

**5. Taxonomy splits clean — generic primitives vs domain.** Folder structure across donors separates **generic primitives** (`components/ui/*`, `packages/ui` — Button/Input/Dialog/…) from **domain/sections/admin** (app-specific compositions). This is the core-vs-host answer: generic primitives = product (importable); domain/sections/admin = host-owned.

**6. Design-system page recurs per project (owner-confirmed).** The owner hand-builds a design-system page in every project and wants it abstracted ("just import the elements I need, use them with your design"). That ×every-project demand validates the product (it's adopter #1's own recurring need) and is itself a product deliverable (a living themed-primitive showcase).

---

## What this census does NOT cover (so it isn't over-claimed)

This is a **primitive/engine/token-grain** UI census. It does **not** carry **screen-shape** convergence (does a login screen / admin shell / checkout flow recur as a reusable *shape* across donors?). That screen-grain read is the residual check the template stage still needs (`delivery-stack.md §3.1` "screen half open") — a separate exploration, not closed here.
