On this page
- TL;DR
- Why this is suddenly interesting
- Who actually needs this
- The spec format that makes it work
- Purpose
- Props
- Slots / Composition
- Behavior
- States
- Accessibility
- Styling
- The prompt that produces real code
- What you actually get
- Where this falls down
- Real workflow for a component library team
- Use as a migration tool
- Use for framework shopping
- The broader pattern
- Common failures
- What this means for the framework wars
- The summary
TL;DR
- Multi-framework generation means giving an AI one spec and getting working components back in React, Vue, Svelte, and Solid simultaneously. In 2026 this is finally usable.
- The pattern works because frontend frameworks have converged on the same primitives — signals, slots, lifecycle, server components — and Claude Opus 4.7 / GPT-5 hold all four in head equally well.
- Real use cases: shipping a component library, migrating between frameworks, letting a multi-team org pick its stack, prototyping the same idea in two frameworks to compare ergonomics.
- The trick is a framework-agnostic spec format — props, behavior, accessibility, states. Then you tell the model which framework to render. Get the spec right and the outputs are nearly drop-in.
- It does not work for everything. Anything that depends on framework-specific patterns (RSC, Vue stores, Svelte runes' edge cases, Solid's deep reactivity) needs hand-tuning.
Why this is suddenly interesting
For years the "write once, run anywhere" UI dream was either wishful (jQuery) or compromised (Web Components, with their accessibility holes and styling weirdness). Native multi-framework was a non-starter because each framework's mental model was different enough that "translating" felt like rewriting.
Two things changed in the last 18 months:
- Frameworks converged. React introduced signals-adjacent primitives. Vue 3.5 cleaned up reactivity. Svelte 5 added runes that look a lot like signals. Solid was already there. The conceptual gap between "a reactive UI component" in any of these is now narrow.
- Models got good enough. Claude Opus 4.7 and GPT-5 hold all four frameworks in mind well enough to generate idiomatic code in each. Not transpiled. Idiomatic.
Together, those two shifts make a workflow possible that was a fantasy in 2023: write a component spec in plain language, get four working implementations.
Who actually needs this
Three audiences, not all overlapping.
Component library authors. If you ship a UI kit, supporting multiple frameworks is the difference between a small audience and a viable product. Headless UI, Radix-style libraries, design system primitives — multi-framework support is now table stakes for a serious launch. AI generation makes maintaining four implementations of fifty components actually possible for a small team.
Migrating teams. You are on Vue 2, you want to be on React. Or you are on React, you are eyeing Solid. Manual rewrites of 200 components is a year of work. AI rewrites are weeks. Quality of the output is the question, and as of 2026 the answer is "good enough that the work is review and adjustment, not rewrite."
Multi-team organizations. Big companies with multiple frontend teams pick different frameworks. A shared design system that ships in only one is useless. Multi-framework generation lets the central team maintain one canonical source and produce all four flavors automatically.
Curious builders. You want to know if your idea is better expressed in Svelte than React. Generate both. Compare. Pick. Zero-cost framework shopping.
The spec format that makes it work
The single biggest determinant of output quality is your spec. A vague natural-language description gives you four inconsistent implementations. A precise, framework-agnostic spec gives you four near-identical components in flavor.
Here is the spec shape I have settled on after a lot of iteration:
# Component: Combobox
## Purpose
A typeahead select that lets users filter and choose from a list of options,
supports async loading, and is keyboard-accessible per WAI-ARIA combobox spec.
## Props
- options: Array<{ value: string, label: string, disabled?: boolean }>
- value: string | null
- onChange: (value: string | null) => void
- placeholder?: string
- loading?: boolean
- onSearch?: (query: string) => void // for async filtering
- emptyMessage?: string
- disabled?: boolean
## Slots / Composition
- Custom option renderer (slot in Vue/Svelte, render prop in React/Solid)
- Empty state override
- Loading indicator override
## Behavior
- Opens on focus or click
- Filter list as user types (client-side if no onSearch, otherwise calls onSearch)
- Arrow keys navigate, Enter selects, Escape closes
- Click outside closes without committing
- Highlighted option is announced to screen readers
## States
- Closed (default)
- Open + empty input (show all options)
- Open + filtered (show matches)
- Open + loading (show loading indicator)
- Open + no results (show emptyMessage)
- Disabled
## Accessibility
- role="combobox" on input, aria-expanded, aria-controls
- role="listbox" on dropdown, role="option" on items
- aria-activedescendant for keyboard navigation (no focus shift)
- Announces result count on filter change
## Styling
- Tailwind classes, dark mode supported via dark: prefix
- Use CSS variables for primary color
- Mobile-first; desktop adjustments at md breakpoint
That spec is your canonical source. You commit it. You version it. When you change behavior, you change the spec, then regenerate.
The prompt that produces real code
Then for each framework, the prompt is just:
Implement the component specified below as an idiomatic [React 19 / Vue 3.5 / Svelte 5 / Solid 1.9] component. Use [TypeScript / framework-typed primitives]. Match the spec exactly. Follow the conventions of the framework — do not produce generic code. Use the framework's preferred reactivity primitive (hooks / refs / runes / signals). Output only the component file with no commentary.
Spec: [paste spec]
Run it through Claude Opus 4.7 four times, once per framework. The outputs are not identical — they are idiomatic to each framework. A React engineer reads the React output and recognizes their world. A Svelte engineer reads the Svelte output and the same.
This is the part that changed. In 2023, model output for "non-default" frameworks was mediocre — generic JS that happened to compile. In 2026, the framework-specific knowledge is deep enough that the outputs feel native.
What you actually get
Realistic quality across the four frameworks for our Combobox example:
- React 19: ~95% drop-in. Will use the latest hooks idiomatically. Sometimes over-uses
useMemo. Quick adjustments. - Vue 3.5: ~95% drop-in. Composition API,
<script setup>, idiomatic reactivity. Occasionally chooses an awkward slot pattern. - Svelte 5: ~85% drop-in. Runes are still relatively new and the model sometimes mixes pre-rune patterns. More review needed.
- Solid 1.9: ~90% drop-in. The signals model maps well to what the model knows. Edge cases around resource handling sometimes need attention.
So: not literally one-click. But "spend 20 minutes adjusting" instead of "spend 4 hours writing." That is a meaningful productivity unlock for component library work.
Where this falls down
Some classes of components are framework-coupled in ways AI cannot abstract over.
Server-rendered components with framework-specific data fetching. React Server Components, Nuxt server data, SvelteKit loaders, SolidStart — these have framework-specific lifecycles. You cannot meaningfully share a spec across them. Generate the client part shared, write the server part per framework.
Routing-coupled components. Anything that pulls from the router or modifies it is framework-specific. Same advice: generate the visual part, integrate locally.
Store integrations. If your component talks to a Pinia store, a Redux store, a Svelte store, and a Solid store, the integration code is per-framework. Generate the component as store-agnostic (props in, callbacks out) and wire stores per project.
Animation libraries. Motion-One, Framer Motion, Svelte transitions, Solid Motion — totally different APIs. Generate behavior-level animations (fade, slide) as plain CSS where possible.
The pattern: keep the spec at the behavior and accessibility level, not at the integration level. Wire each framework's integrations by hand. That is where your engineers add value anyway.
Real workflow for a component library team
A two-engineer team shipping a component library across four frameworks in 2026 looks like this:
- Spec authoring. One engineer writes the canonical spec for the next component. ~30 min.
- Multi-generation. Run the spec through Claude Opus 4.7 four times, once per framework. ~5 min including review of obvious failures and re-prompts.
- Per-framework cleanup. ~20 min per framework. Adjust idioms, fix edge cases, integrate primitives.
- Shared test spec. Write Playwright or Vitest behavioral tests that run against each framework's playground. ~45 min total.
- Docs generation. Hand spec + four implementations to GPT-5 for documentation generation. ~10 min.
Total per component: ~3 hours for four frameworks. Pre-AI: ~2 days for four frameworks. The math works.
Use as a migration tool
A team migrating a 200-component Vue 2 codebase to React 19:
- Per component, extract a behavior spec from the existing implementation. (This itself can be done by AI — paste the Vue file and ask for a spec in your canonical format.)
- Generate the React equivalent.
- Engineer reviews and adjusts.
- Run shared behavioral tests against both old and new to validate.
Per-component time: ~30-45 minutes. For 200 components: 100-150 engineer-hours. Compare to ~1500-2000 hours of manual rewrite. Even with quality concerns and additional QA time, the math is overwhelming.
The catch: you must have behavioral tests, or at least visual regression tests. Without them, you are migrating on faith.
Use for framework shopping
The most fun use case. You have an idea for an internal tool. You are not sure if React or Solid is the better fit for it.
Spec the core component. Generate both. Build a 200-line prototype in each. Compare:
- Bundle size
- Reactivity behavior
- Developer experience
- How the framework handles your specific complexity
Pick. Ship. You spent two extra hours and made a better decision.
This is the kind of decision that used to be made by ideology ("we're a React shop") and is now made by experiment. AI made the experiment cheap.
The broader pattern
What is happening here is bigger than UI components. The same approach works for:
- Backend handlers across Express / Fastify / Hono / NestJS
- ORM queries across Prisma / Drizzle / Kysely
- Validation schemas across Zod / Yup / Valibot
- Test cases across Jest / Vitest / Playwright
Anywhere there is a portable spec layer above a framework-specific implementation, AI can generate the implementations on demand. The spec becomes the source of truth and the framework becomes a deployment target.
This is a quietly important shift in how multi-stack teams work. See vibe coding in 2026 for the broader context on AI-driven engineering workflows.
Common failures
Spec drift. Spec says one thing, implementations diverged. Fix: make the spec the only place behavior is documented and treat implementations as derivatives. Re-generate when the spec changes.
Inconsistent prop names. React generates onChange, Vue generates update:value. Fix: specify naming conventions explicitly per framework in the prompt, or accept idiomatic differences.
Bundle bloat. Models sometimes import heavy utilities. Fix: specify "no external dependencies beyond the framework runtime" in the prompt.
Type drift. TypeScript types differ subtly across implementations. Fix: generate a shared types file once, import it from each framework implementation.
Accessibility regressions. Models sometimes drop ARIA attributes. Fix: include accessibility requirements as explicit checklist items in the spec, not as prose.
What this means for the framework wars
For a decade, framework wars were tribal. React vs Vue vs Svelte was a culture argument as much as a technical one.
In 2026, the wars are quieter, because the cost of switching dropped. If you can regenerate your component library in another framework in a week, the choice of framework matters less. It becomes a runtime / ecosystem / hiring question, not an architectural one.
That is not bad news. It means teams can pick the framework that fits the people, not the people that fit the framework.
The summary
- Spec your component agnostically. Generate per framework.
- Claude Opus 4.7 and GPT-5 are good enough at all four major frameworks now.
- Use it for component libraries, migrations, multi-team orgs, and framework shopping.
- Do not try to abstract framework-coupled concerns (server, router, store). Abstract behavior, integrate locally.
- The spec is your asset. The implementations are deliverables.
The framework you pick today is no longer the framework you are stuck with. That changes how you think about the choice.
NovaKit lets you run the same spec through Claude, GPT-5, and Gemini in parallel, compare outputs side by side, and pay providers directly. BYOK keeps your component library and prompts on your machine.