How EnterUI stays polished by default, fully themeable, and free of any required utility-CSS framework.
EnterUI brings the FroggDesign visual language into ready-to-use product surfaces. It targets React and Next.js apps, dashboards, SaaS products, internal tools, admin panels, and interfaces that need refined defaults without a heavy styling setup.
The styling principle is simple: beautiful by default, flexible by design.
Every component ships with mature defaults but stays open to override. Start with the component as-is, then adjust theme, brand, density, or repeated product patterns through CSS variables, className, style, or composition, in that order.
EnterUI does not depend on Tailwind. You can use Tailwind alongside it, but it is fully optional.
The primary styling layer is plain CSS variables plus predictable .eui-* classes. That keeps EnterUI portable across plain CSS, CSS Modules, Sass, styled-components, vanilla-extract, Panda CSS, Emotion, Tailwind, and existing product design systems.
Apply overrides in this order:
className for one-off component adjustments.style for local dynamic values.Use variables for design decisions that should survive component updates.
:root {
--eui-primary: #2563eb;
--eui-primary-foreground: #ffffff;
--eui-ring: #60a5fa;
--eui-radius-md: 12px;
}Use className when a local product surface needs extra layout or a narrow visual adjustment.
import { Button } from "@froggdesign/enter-ui-react";
export function SaveButton() {
return <Button className="settings-save-button">Save</Button>;
}.settings-save-button {
min-width: 120px;
}import { Button } from "@froggdesign/enter-ui-react";
export function HeroAction() {
return <Button className="rounded-full px-6">Get started</Button>;
}This is a convenience, not a requirement. EnterUI does not ship Tailwind, depend on it, or lock consumers into utility classes.
.customButton {
border-radius: 9999px;
padding-inline: 24px;
}import { Button } from "@froggdesign/enter-ui-react";
import styles from "./button.module.css";
export function SaveButton() {
return <Button className={styles.customButton}>Save</Button>;
}Compose EnterUI primitives into product-specific components instead of changing package internals.
import {
Badge,
Button,
Card,
CardContent,
CardFooter,
CardHeader,
CardTitle,
} from "@froggdesign/enter-ui-react";
export function ProductCard() {
return (
<Card>
<CardHeader>
<Badge variant="info">Platform</Badge>
<CardTitle>Billing Console</CardTitle>
</CardHeader>
<CardContent>Built with EnterUI primitives and FroggDesign tokens.</CardContent>
<CardFooter>
<Button>Open product</Button>
</CardFooter>
</Card>
);
}EnterUI uses the .eui-* prefix so overrides are easy to identify. Common public classes include:
.eui-button
.eui-card
.eui-input
.eui-select__trigger
.eui-dialog__content
.eui-table
.eui-app-shell
.eui-toast
Prefer top-level component classes and documented parts. Avoid depending on private DOM structure unless the docs explicitly describe that part as a stable styling surface.
Charts use lightweight SVG and token-based tones. Avoid turning analytics cards into decorative illustrations. Keep line, area, heatmap, and metric colors restrained so they support scanning instead of dominating the page.
Do
className for local layout.Don't
EnterUI exists so teams can ship refined interfaces immediately while keeping full control when a product needs a custom theme, density, or composition pattern.