The End of Boring: Brutalism in UI
Over the last 10 years, the web has suffered a massive "corporatization". Everything is flat, clean, with blurred shadows and friendly neutral colors. Web Brutalism (and its variant "Ink & Acid") is born as a response to this sea of boredom.
The 3 Rules of Brutalism
To create a component with a truly brutalist style in The UI Factory, we apply three unbreakable rules:
1. Solid and Offset Shadows
Forget about the soft box-shadow. Shadows in brutalism simulate physical ink blocks printed on paper.
// The wrong way (Too soft)
<div className="shadow-lg border-gray-200" />
// The right way (Brutalist)
<div className="shadow-[8px_8px_0px_#000] border-4 border-black bg-[#ccff00]" />
2. Aggressive Typography
Use heavy fonts (font-black), uppercase (uppercase), and wide letter spacing (tracking-widest). Text is not just read, it is shouted.
3. Exaggerated Physics with Framer Motion
A brutalist interface is not static. When interacting with it, it must react drastically. This is where Framer Motion comes in.
import { motion } from "framer-motion";
export const BrutalButton = () => (
<motion.button
whileHover={{
x: -4,
y: -4,
boxShadow: "12px 12px 0px #000"
}}
whileTap={{
x: 4,
y: 4,
boxShadow: "0px 0px 0px #000"
}}
className="bg-[#ff00ff] text-white border-4 border-black font-black uppercase shadow-[8px_8px_0px_#000] px-8 py-4"
>
Activate System
</motion.button>
);
Notice the whileTap: when the user presses the button, we move it exactly the same distance the shadow occupies, while reducing the shadow to zero. This creates a perfect optical illusion of "pressing a physical button".
Brutalism is not for all projects, but when it fits, it leaves an indelible impression.