I'm a true fan of shadcn/ui as it offers out-of-the-box components that are highly customizable. By blending TailwindCSS for styling and theming, along with Radix for accessibility, it provides a smart kick-start for product development.
However, at some point, you will have to create your own React-TypeScript components, which can become complicated, even for coding a simple styled div
:
import { cn } from "@/lib/utils"
const Card = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn(
"rounded-xl border bg-card text-card-foreground shadow",
className
)}
{...props}
/>
))
Enter TWC, that dramatically simplifies this with a straightforward syntax:
import { twc } from "react-twc";
const Card = twc.div`rounded-xl border bg-card text-card-foreground shadow`;
Among other features TWC offers some useful helpers like handling conditional classes, cva support and conditional props.
import { twc, TwcComponentProps } from "react-twc";
type ButtonProps = TwcComponentProps<"button"> & { $primary?: boolean };
// Conditional ClassNames
const Button = twc.button<ButtonProps>((props) => [
"font-semibold border border-blue-500 rounded",
props.$primary ? "bg-blue-500 text-white" : "bg-white text-gray-800",
]);
import { twc, TwcComponentProps } from "react-twc";
// Adds `target` and `rel` attributes on external links
const Anchor = twc.a.attrs<AnchorProps>((props) =>
props.$external ? { target: "_blank", rel: "noopener noreferrer" } : {},
)`appearance-none size-4 border-2 border-blue-500 rounded-sm bg-white`;
Integration with Other Libraries
TWC can be used to add TailwindCSS classes on several design systems components including Radix or React Aria.
Takeaway
TWC is not a revolution, but it's a lib crafted by an experienced developer (gregberge), that addresses the frustrations of building React components in modern stacks. For me, it's a ❤️ tool that enhances development experience, and my productivity.
Top comments (1)
Thanks! I created TWC to help developers be more productive. I am very happy that it fulfills its mission 🤗