From fbb8def9ce7ef2ac31065d2e528a66154f8fd2ef Mon Sep 17 00:00:00 2001 From: tegwick Date: Sat, 23 May 2026 19:09:18 +0200 Subject: [PATCH] Plan WP-0017: whynot-design adoption (tokens + CSS only) Add cross-framework analysis to history/ and WP-0017 workplan for the tokens+CSS phase of adopting ~/whynot-design. Component port deferred until upstream ships Lit web components and missing atoms (Card, Modal, Input, Table, Toast). Decisions captured: vendor (not npm), big-bang swap (not pilot), keep off-spec red for btn-danger until upstream defines one. --- ...-whynot-design-cross-framework-analysis.md | 361 ++++++++++++++++ workplans/WP-0017-whynot-design-tokens.md | 398 ++++++++++++++++++ 2 files changed, 759 insertions(+) create mode 100644 history/2026-05-23-whynot-design-cross-framework-analysis.md create mode 100644 workplans/WP-0017-whynot-design-tokens.md diff --git a/history/2026-05-23-whynot-design-cross-framework-analysis.md b/history/2026-05-23-whynot-design-cross-framework-analysis.md new file mode 100644 index 0000000..409432e --- /dev/null +++ b/history/2026-05-23-whynot-design-cross-framework-analysis.md @@ -0,0 +1,361 @@ +--- +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 (`