Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Claymorphism. Trigger when user wants soft 3D elements, rounded shapes, and a playful, tactile appearance.
.claude/skills/lingxling-claymorphism/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 107% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-20 | ✗→✓ | ▲ Improved | 89% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 85% | 0% |
> "Like interacting with a pristine, digital claymation set. Soft, bubbly, and incredibly approachable."
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.
Sniglet, Fredoka One, Nunito).css.clay-card { background-color: #F8B4A6; /* Soft coral */ border-radius: 32px; padding: 40px; /* 1. Outer drop shadow (detaches from background) 2. Inner top-left highlight (volume) 3. Inner bottom-right shadow (volume) */ box-shadow: 8px 8px 24px rgba(0, 0, 0, 0.15), /* Outer */ inset -8px -8px 16px rgba(0, 0, 0, 0.1), /* Inner dark */ inset 8px 8px 16px rgba(255, 255, 255, 0.4); /* Inner light */ transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1); /* Bouncy */ } .clay-card:hover { transform: translateY(-5px) scale(1.02); }
swiftstruct ClayCard: View { @State private var isPressed = false var body: some View { VStack(spacing: 16) { Image(systemName: "cloud.sun.fill") .font(.system(size: 48)) .foregroundColor(.white) Text("Claymorphic Card") .font(.system(size: 20, weight: .bold, design: .rounded)) .foregroundColor(.white) } .padding(40) .background(Color(red: 0.97, green: 0.71, blue: 0.65)) // Soft coral .cornerRadius(32) // Outer shadow — detaches from background .shadow(color: .black.opacity(0.15), radius: 12, x: 8, y: 8) // Inner highlight (top-left) — faked with overlay .overlay( RoundedRectangle(cornerRadius: 32) .stroke( LinearGradient( colors: [.white.opacity(0.5), .clear, .black.opacity(0.1)], startPoint: .topLeading, endPoint: .bottomTrailing ), lineWidth: 3 ) ) // Bouncy spring animation on tap .scaleEffect(isPressed ? 0.95 : 1.0) .animation(.interpolatingSpring(stiffness: 300, damping: 10), value: isPressed) .onTapGesture { } .simultaneousGesture( DragGesture(minimumDistance: 0) .onChanged { _ in isPressed = true } .onEnded { _ in isPressed = false } ) } }
.interpolatingSpring(stiffness: 300, damping: 10) for the bouncy feel — critical for clay aesthetics.dartclass ClayCard extends StatefulWidget { @override State<ClayCard> createState() => _ClayCardState(); } class _ClayCardState extends State<ClayCard> with SingleTickerProviderStateMixin { double _scale = 1.0; @override Widget build(BuildContext context) { return GestureDetector( onTapDown: (_) => setState(() => _scale = 0.95), onTapUp: (_) => setState(() => _scale = 1.0), onTapCancel: () => setState(() => _scale = 1.0), child: AnimatedScale( scale: _scale, duration: const Duration(milliseconds: 200), curve: Curves.elasticOut, // Bouncy clay feel child: Container( padding: const EdgeInsets.all(40), decoration: BoxDecoration( color: const Color(0xFFF8B4A6), // Soft coral borderRadius: BorderRadius.circular(32), boxShadow: [ // Outer shadow BoxShadow( color: Colors.black.withOpacity(0.15), offset: const Offset(8, 8), blurRadius: 24, ), ], // Gradient border for the clay volume effect border: GradientBorder( gradient: LinearGradient( colors: [ Colors.white.withOpacity(0.5), Colors.transparent, Colors.black.withOpacity(0.1), ], begin: Alignment.topLeft, end: Alignment.bottomRight, ), width: 3, ), ), child: Column( mainAxisSize: MainAxisSize.min, children: [ const Icon(Icons.wb_sunny, size: 48, color: Colors.white), const SizedBox(height: 16), const Text('Claymorphic Card', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold, color: Colors.white)), ], ), ), ), ); } }
Curves.elasticOut or Curves.bounceOut for the spring animation — essential for the clay feeling.ShapeDecoration or a Stack with a gradient container behind the main container.flutter_inset_box_shadow package with light top-left and dark bottom-right insets.jsxconst ClayCard = () => { const scale = useRef(new Animated.Value(1)).current; const pressIn = () => { Animated.spring(scale, { toValue: 0.95, friction: 3, // Low friction = bouncy tension: 100, useNativeDriver: true, }).start(); }; const pressOut = () => { Animated.spring(scale, { toValue: 1, friction: 3, tension: 100, useNativeDriver: true, }).start(); }; return ( <Pressable onPressIn={pressIn} onPressOut={pressOut}> <Animated.View style={{ transform: [{ scale }], padding: 40, backgroundColor: '#F8B4A6', borderRadius: 32, alignItems: 'center', // Outer shadow shadowColor: '#000', shadowOffset: { width: 8, height: 8 }, shadowOpacity: 0.15, shadowRadius: 12, elevation: 8, // Gradient border must be faked with a wrapper or SVG borderWidth: 3, borderColor: 'rgba(255,255,255,0.3)', // Simplified — top highlight }}> <Text style={{ fontSize: 48 }}>☀️</Text> <Text style={{ fontSize: 20, fontWeight: '700', color: '#FFF', marginTop: 16, }}> Claymorphic Card </Text> </Animated.View> </Pressable> ); };
Animated.spring with low friction (3-5) for the signature bouncy clay behavior.expo-linear-gradient View.kotlin@Composable fun ClayCard() { var isPressed by remember { mutableStateOf(false) } val scale by animateFloatAsState( targetValue = if (isPressed) 0.95f else 1f, animationSpec = spring(dampingRatio = 0.3f, stiffness = 300f), ) Box( modifier = Modifier .graphicsLayer { scaleX = scale; scaleY = scale } .shadow(8.dp, RoundedCornerShape(32.dp)) .clip(RoundedCornerShape(32.dp)) .background(Color(0xFFF8B4A6)) .border( 3.dp, Brush.linearGradient( colors = listOf( Color.White.copy(alpha = 0.5f), Color.Transparent, Color.Black.copy(alpha = 0.1f), ), start = Offset.Zero, end = Offset.Infinite, ), RoundedCornerShape(32.dp), ) .padding(40.dp) .pointerInput(Unit) { detectTapGestures( onPress = { isPressed = true tryAwaitRelease() isPressed = false }, ) }, contentAlignment = Alignment.Center, ) { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon(Icons.Default.WbSunny, tint = Color.White, modifier = Modifier.size(48.dp)) Spacer(Modifier.height(16.dp)) Text("Claymorphic Card", fontSize = 20.sp, fontWeight = FontWeight.Bold, color = Color.White) } } }
spring(dampingRatio = 0.3f) — low damping = bouncy. This is the core of the clay feeling.Modifier.border(width, Brush.linearGradient(...), shape).Modifier.clip() before .background() to ensure the rounded corners clip content properly.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 14,523 | 9,285 | -36% | 1 | 1 | 0% | 2,176 | 3,816 | +75% | 0 | 0 | — |
case-02 | pass→pass | 14,342 | 10,855 | -24% | 1 | 1 | 0% | 2,190 | 4,324 | +97% | 0 | 0 | — |
case-03 | pass→fail | 13,549 | 8,605 | -36% | 1 | 1 | 0% | 2,298 | 4,264 | +86% | 0 | 0 | — |
case-08 | pass→pass | 19,081 | 17,553 | -8% | 1 | 1 | 0% | 2,777 | 6,115 | +120% | 0 | 0 | — |
case-04 | pass→pass | 12,905 | 11,835 | -8% | 1 | 1 | 0% | 2,061 | 4,502 | +118% | 0 | 0 | — |
case-05 | pass→pass | 11,384 | 10,636 | -7% | 1 | 1 | 0% | 2,037 | 4,263 | +109% | 0 | 0 | — |
case-06 | fail→pass | 10,562 | 7,105 | -33% | 1 | 1 | 0% | 1,804 | 4,012 | +122% | 0 | 0 | — |
case-07 | pass→pass | 12,731 | 3,498 | -73% | 1 | 1 | 0% | 1,645 | 3,324 | +102% | 0 | 0 | — |
case-09 | fail→pass | 11,711 | 3,984 | -66% | 1 | 1 | 0% | 1,650 | 3,423 | +107% | 0 | 0 | — |
case-10 | fail→pass | 11,279 | 5,032 | -55% | 1 | 1 | 0% | 1,916 | 3,647 | +90% | 0 | 0 | — |
case-11 | pass→pass | 8,046 | 7,589 | -6% | 1 | 1 | 0% | 1,364 | 4,148 | +204% | 0 | 0 | — |
case-12 | pass→pass | 8,226 | 4,456 | -46% | 1 | 1 | 0% | 1,275 | 3,545 | +178% | 0 | 0 | — |
case-13 | pass→pass | 19,465 | 12,652 | -35% | 1 | 1 | 0% | 2,615 | 4,658 | +78% | 0 | 0 | — |
case-14 | pass→pass | 7,351 | 5,977 | -19% | 1 | 1 | 0% | 993 | 3,663 | +269% | 0 | 0 | — |
case-15 | pass→pass | 20,408 | 14,677 | -28% | 1 | 1 | 0% | 2,882 | 5,649 | +96% | 0 | 0 | — |
case-16 | pass→pass | 11,906 | 8,693 | -27% | 1 | 1 | 0% | 1,764 | 4,066 | +130% | 0 | 0 | — |
case-17 | pass→pass | 9,826 | 8,140 | -17% | 1 | 1 | 0% | 1,526 | 3,790 | +148% | 0 | 0 | — |
case-18 | pass→pass | 14,859 | 7,498 | -50% | 1 | 1 | 0% | 2,059 | 3,769 | +83% | 0 | 0 | — |
case-19 | pass→pass | 18,267 | 12,373 | -32% | 1 | 1 | 0% | 2,666 | 5,088 | +91% | 0 | 0 | — |
case-20 | fail→pass | 12,767 | 9,948 | -22% | 1 | 1 | 0% | 2,281 | 4,318 | +89% | 0 | 0 | — |
case-21 | pass→pass | 12,025 | 5,674 | -53% | 1 | 1 | 0% | 1,837 | 3,434 | +87% | 0 | 0 | — |
case-22 | fail→pass | 22,487 | 18,813 | -16% | 1 | 1 | 0% | 3,478 | 6,425 | +85% | 0 | 0 | — |
case-23 | pass→pass | 11,454 | 11,682 | +2% | 1 | 1 | 0% | 2,099 | 4,615 | +120% | 0 | 0 | — |
case-24 | pass→pass | 14,080 | 11,236 | -20% | 1 | 1 | 0% | 2,235 | 4,502 | +101% | 0 | 0 | — |
case-25 | pass→pass | 7,200 | 7,747 | +8% | 1 | 1 | 0% | 1,002 | 4,117 | +311% | 0 | 0 | — |
case-26 | pass→pass | 14,166 | 16,253 | +15% | 1 | 1 | 0% | 2,574 | 5,106 | +98% | 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. 26 cases were attempted. The headline lift of +15 percentage points is the difference between those two pass rates over the 26 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.