Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Neo-Brutalism. Trigger when user wants thick borders, hard shadows, bright colors, and a playful yet structured look.
.claude/skills/lingxling-neo-brutalism/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 79% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 63% | 0% |
> "Brutalism, but make it pop. Hard lines, stark shadows, and vibrant, unashamed colors."
Use this sub-style when the user's request matches the aesthetic described above. This is a child reference of the design-it skill and is not meant to be triggered directly.
#FDF8F5), add stark black borders #000000, and use saturated accents like lemon yellow, bright cyan, or coral.Space Grotesk, Archivo Black, Inter Black).box-shadow with 0 blur.css:root { --neo-border: 3px solid #000000; --neo-shadow: 6px 6px 0px #000000; --neo-bg: #F4F4F0; --neo-accent: #FF3366; } body { background-color: var(--neo-bg); font-family: 'Space Grotesk', sans-serif; } .neo-card { background-color: #ffffff; border: var(--neo-border); box-shadow: var(--neo-shadow); border-radius: 8px; /* Optional, sharp is fine too */ padding: 32px; transition: transform 0.1s, box-shadow 0.1s; } .neo-btn { background-color: var(--neo-accent); color: #000; font-weight: 800; text-transform: uppercase; border: var(--neo-border); box-shadow: 4px 4px 0px #000000; padding: 16px 32px; cursor: pointer; transition: all 0.1s ease; } .neo-btn:active { /* The "press" effect is removing the shadow and moving it down */ transform: translate(4px, 4px); box-shadow: 0px 0px 0px #000000; }
swiftstruct NeoCard: View { @State private var isPressed = false let neoBorder: CGFloat = 3 let neoShadow: CGFloat = 6 var body: some View { Button(action: {}) { VStack(alignment: .leading, spacing: 16) { Text("NEO-BRUTALISM") .font(.system(size: 24, weight: .black, design: .default)) .foregroundColor(.black) Text("Stark shadows, bright colors.") .font(.system(size: 16, weight: .bold)) .foregroundColor(.black) } .padding(24) .frame(maxWidth: .infinity, alignment: .leading) .background(Color(red: 1.0, green: 0.2, blue: 0.4)) // Bright Coral // Neo-brutalist solid outline .overlay( Rectangle() .stroke(Color.black, lineWidth: neoBorder) ) } .buttonStyle(.plain) // Hard drop shadow (0 blur) .shadow(color: .black, radius: 0, x: isPressed ? 0 : neoShadow, y: isPressed ? 0 : neoShadow) // Translate the button physically when pressed to cover the shadow .offset(x: isPressed ? neoShadow : 0, y: isPressed ? neoShadow : 0) .simultaneousGesture( DragGesture(minimumDistance: 0) .onChanged { _ in isPressed = true } .onEnded { _ in isPressed = false } ) // Instant pop, no smooth animation .animation(.none, value: isPressed) } }
.shadow(radius: 0) is the secret. Set an offset (e.g. x: 6, y: 6)..offset()..animation(.none) — Neo-brutalism interactions should be instant, snapping like physical switches.dartclass NeoCard extends StatefulWidget { @override State<NeoCard> createState() => _NeoCardState(); } class _NeoCardState extends State<NeoCard> { bool _isPressed = false; final double neoOffset = 6.0; @override Widget build(BuildContext context) { return GestureDetector( onTapDown: (_) => setState(() => _isPressed = true), onTapUp: (_) => setState(() => _isPressed = false), onTapCancel: () => setState(() => _isPressed = false), child: Transform.translate( // Move the container when pressed offset: Offset(_isPressed ? neoOffset : 0, _isPressed ? neoOffset : 0), child: Container( padding: const EdgeInsets.all(24), decoration: BoxDecoration( color: const Color(0xFFFF3366), // Bright coral border: Border.all(color: Colors.black, width: 3), // Sharp shadow disappears on press boxShadow: _isPressed ? [] : [ BoxShadow( color: Colors.black, blurRadius: 0, // Critical: 0 blur spreadRadius: 0, offset: Offset(neoOffset, neoOffset), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: const [ Text('NEO-BRUTALISM', style: TextStyle(fontSize: 24, fontWeight: FontWeight.w900, color: Colors.black)), SizedBox(height: 16), Text('Stark shadows, bright colors.', style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black)), ], ), ), ), ); } }
blurRadius: 0 inside BoxShadow creates the solid block color._isPressed is true, and simultaneously use Transform.translate to shift the widget down-right.jsxconst NeoCard = () => { const [pressed, setPressed] = useState(false); const offset = 6; return ( <Pressable onPressIn={() => setPressed(true)} onPressOut={() => setPressed(false)} style={{ backgroundColor: '#FF3366', padding: 24, borderWidth: 3, borderColor: '#000', transform: [ { translateX: pressed ? offset : 0 }, { translateY: pressed ? offset : 0 } ], // iOS Hard Shadow shadowColor: '#000', shadowOffset: { width: pressed ? 0 : offset, height: pressed ? 0 : offset }, shadowOpacity: pressed ? 0 : 1, shadowRadius: 0, // Android elevation cannot do 0-blur offset shadows natively // elevation: 0 }} > <Text style={{ fontSize: 24, fontWeight: '900', color: '#000' }}> NEO-BRUTALISM </Text> </Pressable> ); };
elevation CANNOT create an unblurred, offset drop shadow. react-native-drop-shadow library or fake it by rendering an identical black <View> absolutely positioned directly behind the main card.kotlin@Composable fun NeoCard() { var isPressed by remember { mutableStateOf(false) } val neoOffset = 6.dp // Compose Modifier.shadow() always blurs. // To get a solid hard shadow, we use Modifier.drawBehind. Box( modifier = Modifier .padding(16.dp) .offset( x = if (isPressed) neoOffset else 0.dp, y = if (isPressed) neoOffset else 0.dp ) .drawBehind { if (!isPressed) { drawRect( color = Color.Black, topLeft = Offset(neoOffset.toPx(), neoOffset.toPx()), size = size ) } } .background(Color(0xFFFF3366)) .border(3.dp, Color.Black) .pointerInput(Unit) { detectTapGestures( onPress = { isPressed = true tryAwaitRelease() isPressed = false } ) } .padding(24.dp) ) { Column { Text("NEO-BRUTALISM", fontSize = 24.sp, fontWeight = FontWeight.Black, color = Color.Black) Spacer(Modifier.height(16.dp)) Text("Stark shadows, bright colors.", fontSize = 16.sp, fontWeight = FontWeight.Bold, color = Color.Black) } } }
Modifier.shadow() applies ambient blur which breaks the neo-brutalist aesthetic.Modifier.drawBehind { drawRect(...) } with an offset to manually draw the solid shadow block behind the container.Modifier.offset on press, while hiding the shadow layer.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 18,143 | 34,424 | +90% | 1 | 1 | 0% | 3,463 | 4,993 | +44% | 0 | 0 | — |
case-02 | pass→pass | 16,465 | 13,157 | -20% | 1 | 1 | 0% | 3,051 | 5,271 | +73% | 0 | 0 | — |
case-03 | fail→pass | 18,650 | 9,390 | -50% | 1 | 1 | 0% | 2,685 | 4,132 | +54% | 0 | 0 | — |
case-04 | pass→pass | 3,289 | 3,779 | +15% | 1 | 1 | 0% | 556 | 3,149 | +466% | 0 | 0 | — |
case-05 | fail→pass | 13,539 | 11,137 | -18% | 1 | 1 | 0% | 2,390 | 4,282 | +79% | 0 | 0 | — |
case-06 | pass→pass | 6,380 | 5,789 | -9% | 1 | 1 | 0% | 947 | 3,208 | +239% | 0 | 0 | — |
case-07 | fail→pass | 13,734 | 11,745 | -14% | 1 | 1 | 0% | 2,373 | 4,249 | +79% | 0 | 0 | — |
case-08 | pass→pass | 3,527 | 5,396 | +53% | 1 | 1 | 0% | 620 | 3,386 | +446% | 0 | 0 | — |
case-09 | pass→pass | 13,761 | 10,166 | -26% | 1 | 1 | 0% | 2,021 | 3,978 | +97% | 0 | 0 | — |
case-10 | pass→pass | 13,655 | 10,366 | -24% | 1 | 1 | 0% | 2,327 | 4,172 | +79% | 0 | 0 | — |
case-11 | pass→pass | 16,618 | 11,270 | -32% | 1 | 1 | 0% | 2,571 | 4,132 | +61% | 0 | 0 | — |
case-12 | pass→pass | 16,962 | 8,677 | -49% | 1 | 1 | 0% | 2,130 | 3,809 | +79% | 0 | 0 | — |
case-13 | pass→pass | 15,262 | 5,652 | -63% | 1 | 1 | 0% | 2,634 | 3,586 | +36% | 0 | 0 | — |
case-14 | pass→pass | 10,165 | 3,866 | -62% | 1 | 1 | 0% | 1,524 | 3,247 | +113% | 0 | 0 | — |
case-20 | pass→pass | 13,724 | 9,426 | -31% | 1 | 1 | 0% | 2,128 | 4,433 | +108% | 0 | 0 | — |
case-15 | pass→pass | 11,218 | 4,852 | -57% | 1 | 1 | 0% | 1,701 | 3,384 | +99% | 0 | 0 | — |
case-16 | pass→pass | 12,241 | 6,840 | -44% | 1 | 1 | 0% | 1,890 | 3,526 | +87% | 0 | 0 | — |
case-17 | pass→pass | 13,832 | 6,944 | -50% | 1 | 1 | 0% | 2,339 | 3,645 | +56% | 0 | 0 | — |
case-18 | pass→pass | 11,010 | 7,956 | -28% | 1 | 1 | 0% | 1,979 | 4,059 | +105% | 0 | 0 | — |
case-19 | pass→pass | 13,620 | 7,359 | -46% | 1 | 1 | 0% | 2,163 | 3,659 | +69% | 0 | 0 | — |
case-21 | fail→pass | 16,894 | 11,564 | -32% | 1 | 1 | 0% | 2,910 | 4,757 | +63% | 0 | 0 | — |
case-22 | pass→fail | 9,189 | 15,240 | +66% | 1 | 1 | 0% | 1,367 | 5,107 | +274% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.