Embed a contact form in React, Vue, or Angular
Web components are part of the DOM. Drop the tag straight into JSX, Vue templates, or Angular components — no wrapper needed.
<script src="https://cdn.toimii.io/components/your-code.js" async></script>
<toimii-contact></toimii-contact>
Step by step
Common gotchas
Frequently asked
Do I need a React/Vue/Angular wrapper component?
No. Web components are part of the DOM standard — React, Vue, and Angular all render unknown tags as plain HTML and let the browser take over. No npm package, no @types, nothing to install.
How do I tell TypeScript about the custom element?
Yes. Add this to a global.d.ts file: declare namespace JSX { interface IntrinsicElements { 'toimii-contact': any } }. The form works without it — TypeScript just stops complaining.
How do I pass props or config?
Pass them as regular HTML attributes. Web components read attributes from the DOM the same way React reads props from JSX. For dynamic values, use a ref and set properties imperatively if needed.
Does it work with Next.js, Remix, or SvelteKit?
Yes. In Next.js, add the script tag in app/layout.tsx (with the next/script component) or in pages/_document.tsx. The custom element renders client-side — wrap it in a "use client" boundary if you're in the App Router.
What about server-side rendering?
The custom element renders client-side, like any web component. SSR emits the tag, the browser registers the element when the script loads, then the form appears. There's a brief flash of empty space — usually unnoticeable.
Embedding on a different platform?
Same two lines of code, picked apart for each platform.
Ready to try it?
30-day free trial. No credit card. Set up in minutes.
No credit card required. Set up in 2 minutes.