Type-safe React components without JSX
A production-ready component library that replaces JSX with function-based composition, featuring direct CSS prop styling, context-based theming, automatic memoization, and full React Server Components support—powered by @emotion/react.
MeoNode UI eliminates JSX while maintaining full React compatibility through functional composition. Style components with CSS properties as props, leverage automatic theme resolution via React Context, and benefit from intelligent caching without manual optimization.
JSX Pattern:
<div style={{ padding: '20px', borderRadius: '12px' }}> <h2 style={{ fontSize: '1.5rem', marginBottom: '8px' }}>{title}</h2> {children} </div>
MeoNode Pattern:
Div({ padding: '20px', borderRadius: '12px', backgroundColor: 'theme.primary', children: [H2(title, { fontSize: '1.5rem', marginBottom: '8px' }), ...children], })
Plain JavaScript functions replace JSX—no build transforms, no syntax extensions. Compose UIs as first-class function trees with full TypeScript inference.
Pass CSS properties directly to components. No separate styled-components declarations, no className juggling. All valid CSS properties work as props with full type safety.
Button('Submit', { padding: '12px 24px', backgroundColor: 'theme.primary', borderRadius: 8, transition: 'all 0.2s ease', css: { ':hover': { transform: 'scale(1.05)' }, }, })
Theme values resolve automatically through React Context. Reference semantic tokens anywhere without prop drilling. Supports nested themes and dynamic switching.
ThemeProvider({ theme: { mode: 'dark', system: { primary: { default: '#FF6B6B', content: '#4A0000' }, spacing: { sm: 8, md: 16, lg: 24 }, }, }, children: [ /* your app */ ], })
Memoize at node-level granularity—not just entire components. Control re-renders with precision by specifying dependency arrays directly on individual nodes.
Node-Level Memoization:
const UserCard = ({ user }) => Div( { padding: 16, children: [ H2(user.name), // Re-renders on any prop change Text(user.bio), ], }, [user.id], ).render() // Only re-render when user.id changes
Component-Level Memoization:
Node(ExpensiveComponent, { data }, [data.id]).render()
Full RSC support with proper client/server component boundaries. Use in Next.js App Router, Remix, or any RSC-enabled environment without configuration.
Built on @emotion/react for:
Automatically separates style props from DOM attributes. Pass onClick, aria-*, data-* alongside CSS props—MeoNode
routes them correctly.
Button('Click Me', { padding: '12px', // → style color: 'theme.primary', // → style onClick: handleClick, // → DOM attribute 'aria-label': 'Submit', // → DOM attribute disabled: isLoading, // → DOM attribute })
import { ThemeProvider, Center, Column, H1, Button, Text } from '@meonode/ui' const theme = { mode: 'light', system: { primary: { default: '#FF6B6B', content: '#FFFFFF' }, base: { default: '#F8F8F8', content: '#333333' }, }, } const App = () => ThemeProvider({ theme, children: [ Center({ padding: 40, backgroundColor: 'theme.base', children: Column({ gap: 24, children: [ H1('MeoNode UI', { fontSize: '3rem', color: 'theme.primary', }), Text('Type-safe React without JSX', { fontSize: '1.2rem', color: 'theme.base.content', }), Button('Get Started', { backgroundColor: 'theme.primary', color: 'theme.primary.content', padding: '12px 24px', borderRadius: 8, cursor: 'pointer', onClick: () => console.log('Started!'), }), ], }), }), ], }).render()
Component Factory System
Node factory + Component wrapper + semantic elements (Div, Button, etc.) enable both rapid prototyping and
sophisticated component architectures.
Theme Resolution Engine
Context-based theme propagation with automatic value resolution. Nested theme objects inherit and override parent values
without explicit passing.
Portal Management
First-class portal support for modals, tooltips, overlays—integrated with theme context for consistent styling across
React trees.
CSS Engine
@emotion/react provides CSS-in-JS with automatic optimization, critical CSS extraction for SSR, and zero-runtime
overhead in production builds.
For Teams Building Design Systems:
For Performance-Critical Applications:
For Developer Productivity:
Ready to build React applications without JSX?
@meonode/ui using Yarn or npm.@meonode/ui.css prop, pseudo-classes, media queries, and animations.@meonode/ui with Next.js, Vite,
and other React setups.On this page