--- date: 2026-05-23 topic: whynot-design adoption — cross-framework analysis status: research / decision pending author: claude (opus-4.7) related: - ~/whynot-design (the React DS in question) - ~/whynot-control (the org control surface — explicitly out of scope) - vergabe-teilnahme (the consuming Django app) follow-ups: - workplan: VERGABE_TEILNAHME-WP-0017 (whynot-design adoption) — not yet drafted, depends on strategy decision below - possible new repo: whynot-design-django — see §5 --- # whynot-design — cross-framework adoption analysis > Persisted from a research conversation on 2026-05-23. The conversation was triggered > by the question "should vergabe-teilnahme adopt the whynot design system, and how?" > The strategic question opened up because whynot-design ships React components > while vergabe-teilnahme is Django + HTMX + Tailwind. ## 1. The headline insight There is **no community** around "React → Django component porting." That pattern doesn't exist as a tool, library, or codified practice. The reason: cross-framework UI sharing has, since ~2020, converged on **Web Components** as the standard answer. Every major design system that supports multiple frameworks (Shoelace / Web Awesome, IBM Carbon, Adobe Spectrum, Salesforce Lightning, Material Web) either ships Web Components or maintains parallel hand-rolled implementations per framework. There is no third option that the industry has validated. The W3C Design Tokens Community Group spec reached its **first stable version in October 2025**, with Style Dictionary, Figma, Penpot, Tokens Studio, and others as reference implementations. Tokens as a cross-framework contract are now genuinely portable; *components* still aren't, except via web components. The strategic question therefore reshapes itself: **do we accept the parallel-implementations cost, or do we change what `whynot-design` actually ships?** ## 2. Research findings — existing approaches and their communities | Approach | What it is | Community / activity | Fit for whynot | |---|---|---|---| | **Web Components** (Lit, Stencil) | Browser-standard custom elements; works in any framework | Very active; React 19 finally scores perfect on custom-elements-everywhere.com | **High** — best general answer if we're willing to refactor whynot-design | | **Shoelace / Web Awesome** | Pre-built Web Components UI kit (Shoelace's successor) | Large, active OSS community | Not direct (competing DS), but proves the model. Has explicit HTMX integration guides | | **Stencil JS** | Compiler that emits framework-specific bindings from one source | Mature; IBM/Apple use it; declining mindshare vs. Lit | **Medium** — heavier than Lit but generates per-framework wrappers automatically | | **Style Dictionary + DTCG tokens** | One token file → CSS / Tailwind / iOS / Android / Flutter | W3C-backed, stable spec since 2025-10 | **High** — should be our token pipeline regardless of component choice | | **Carbon / Spectrum / Lightning / Material pattern** | Single design source, hand-maintained parallel packages per framework | Active but they're 100+ engineer teams | **Low** at our scale — the "expensive but principled" reference path | | **Single-spa / micro-frontends** | Multiple frameworks coexisting in one app | Niche, mostly enterprise integration | **Off-topic** — not about sharing components, about hosting heterogeneous apps | | **django-cotton / django-components / django-bird** | Django-template-native component libraries; HTMX-friendly | Active, growing in 2024–2026; mature enough to depend on | **High** as the *Django-side runtime* — but doesn't solve cross-framework, just gives Django a real component model | | **"Port React to Django" libraries** | (doesn't exist) | None | None | **Read of the field:** the world has settled on "tokens are cross-framework; components are framework-native." Most teams either pick web components (one implementation, runs anywhere with some friction) or accept parallel implementations from a shared design language. ## 3. Three viable strategies for whynot's situation **Strategy A — Pivot whynot-design to Web Components.** Rewrite `Atoms.jsx` + `Chrome.jsx` as Lit components. Ship one runtime artefact (`@whynot/design`) that Django + HTMX templates can drop into a page via plain `` tags. No React dependency anywhere. Tailwind / CSS variables continue to drive theming. **Strategy B — Keep whynot-design React-canonical; add a parallel `whynot-design-django` repo.** Treat the React JSX as the *visual + API specification*. Hand-port to Django partials in a separate, reusable repo so vergabe-teilnahme and future Django consumers share one implementation. Tokens stay in whynot-design (single source). **Strategy C — Tokens only; components are framework-local forever.** Don't promise component parity. Vergabe re-implements whynot's *look* using the tokens but its components live and die in vergabe-teilnahme. Other Django apps would do the same fork. Bernd implied this is unsatisfying — he wants a real component library for cross-project consistency. The real choice is **A vs. B**. ## 4. Pros / cons — A (Web Components) vs. B (parallel Django repo) ### Strategy A — Pivot to Web Components (Lit) **Pros** - *One* implementation. Zero divergence risk. Bug fixes ship once. - Standards-backed; outlives any framework choice. Works in vanilla HTML, Django templates, future Vue/Svelte/Solid apps, marketing sites, claude.ai artifacts. - HTMX swaps work cleanly — web components are just DOM; HTMX doesn't care. - The community is *here*. Tutorials, debugging tools, Storybook integration, accessibility testing infrastructure all exist. - The Claude atelier in claude.ai can still output JSX prototypes; Lit ports are mechanical once the design is decided. **Cons** - One-time rewrite cost of the existing 11 React components. Real, but small (~267 lines of JSX, not a library of 200 components). - Web components have Shadow DOM trade-offs: form-association, deep style scoping, and slotting have learning curves. Workable but real friction. - React-shaped APIs (`