Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Web and App implementation guide for Skeuomorphism. Trigger when user wants UI to mimic real-world objects, realistic textures, or physical metaphors.
.claude/skills/lingxling-skeuomorphism/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 396% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 112% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 65% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 120% | 0% |
> "Digital interfaces that look and behave like their physical counterparts."
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.
css.skeuo-button { /* Brushed metal effect */ background: linear-gradient(180deg, #e0e0e0 0%, #a0a0a0 100%), url('brushed-metal-texture.png'); background-blend-mode: overlay; border: 1px solid #7a7a7a; border-radius: 50%; width: 80px; height: 80px; /* Bevel, inner highlight, and drop shadow */ box-shadow: inset 0 2px 4px rgba(255,255,255,0.8), /* Top highlight */ inset 0 -2px 4px rgba(0,0,0,0.4), /* Bottom shading */ 0 4px 6px rgba(0,0,0,0.5), /* Drop shadow */ 0 1px 1px rgba(0,0,0,0.2); } .skeuo-button:active { /* Pressing the physical button */ box-shadow: inset 0 4px 8px rgba(0,0,0,0.6), inset 0 -1px 2px rgba(255,255,255,0.4), 0 1px 1px rgba(0,0,0,0.2); transform: translateY(2px); }
swiftstruct SkeuoButton: View { @State private var isPressed = false var body: some View { Button(action: {}) { Text("POWER") .font(.system(size: 14, weight: .bold)) .foregroundColor(.white) .textCase(.uppercase) } .frame(width: 80, height: 80) .background( ZStack { // Brushed metal base Circle() .fill( LinearGradient( colors: [Color(white: 0.88), Color(white: 0.63)], startPoint: .top, endPoint: .bottom ) ) // Inner highlight (top bevel) Circle() .stroke( LinearGradient( colors: [.white.opacity(0.8), .clear], startPoint: .top, endPoint: .center ), lineWidth: 2 ) .padding(1) } ) .clipShape(Circle()) // Outer bezel ring .overlay(Circle().stroke(Color(white: 0.5), lineWidth: 1)) // Physical drop shadow .shadow(color: .black.opacity(isPressed ? 0.2 : 0.5), radius: isPressed ? 2 : 6, x: 0, y: isPressed ? 1 : 4) .scaleEffect(isPressed ? 0.96 : 1.0) .animation(.easeOut(duration: 0.1), value: isPressed) .simultaneousGesture( DragGesture(minimumDistance: 0) .onChanged { _ in isPressed = true } .onEnded { _ in isPressed = false } ) } }
Circle, RoundedRectangle) with different gradients to build up realistic depth..overlay() with stroked shapes for highlight bezels along the edges.dartclass SkeuoButton extends StatefulWidget { @override State<SkeuoButton> createState() => _SkeuoButtonState(); } class _SkeuoButtonState extends State<SkeuoButton> { bool _isPressed = false; @override Widget build(BuildContext context) { return GestureDetector( onTapDown: (_) => setState(() => _isPressed = true), onTapUp: (_) => setState(() => _isPressed = false), onTapCancel: () => setState(() => _isPressed = false), child: AnimatedContainer( duration: const Duration(milliseconds: 100), width: 80, height: 80, decoration: BoxDecoration( shape: BoxShape.circle, // Brushed metal gradient gradient: LinearGradient( colors: [Colors.grey[300]!, Colors.grey[600]!], begin: Alignment.topCenter, end: Alignment.bottomCenter, ), border: Border.all(color: Colors.grey[500]!, width: 1), boxShadow: [ // Outer drop shadow BoxShadow( color: Colors.black.withOpacity(_isPressed ? 0.2 : 0.5), blurRadius: _isPressed ? 4 : 12, offset: Offset(0, _isPressed ? 2 : 6), ), // Inner top highlight (faked with a light inset) BoxShadow( color: Colors.white.withOpacity(0.6), blurRadius: 1, offset: const Offset(0, -1), spreadRadius: -1, ), ], ), transform: Matrix4.identity()..scale(_isPressed ? 0.96 : 1.0), alignment: Alignment.center, child: const Text('POWER', style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 14, shadows: [ Shadow(color: Colors.black54, offset: Offset(0, 1), blurRadius: 2), ])), ), ); } }
AnimatedContainer for smooth press transitions. Adjust boxShadow, transform, and gradient on tap.BoxShadow entries: one for the outer drop shadow, one for the inner top-edge highlight.DecorationImage with an asset file inside BoxDecoration.jsxconst SkeuoButton = () => { const [pressed, setPressed] = useState(false); return ( <Pressable onPressIn={() => setPressed(true)} onPressOut={() => setPressed(false)} style={{ width: 80, height: 80, borderRadius: 40, alignItems: 'center', justifyContent: 'center', // Metal gradient must be done via an image or LinearGradient component backgroundColor: '#A0A0A0', borderWidth: 1, borderColor: '#7A7A7A', // Shadow changes on press shadowColor: '#000', shadowOffset: { width: 0, height: pressed ? 1 : 4 }, shadowOpacity: pressed ? 0.2 : 0.5, shadowRadius: pressed ? 2 : 6, elevation: pressed ? 2 : 8, transform: [{ scale: pressed ? 0.96 : 1 }], }} > <Text style={{ color: '#FFF', fontWeight: '700', fontSize: 14, textShadowColor: 'rgba(0,0,0,0.5)', textShadowOffset: { width: 0, height: 1 }, textShadowRadius: 2, }}> POWER </Text> </Pressable> ); };
ImageBackground with exported texture assets (leather.png, brushed-metal.png).Pressable with onPressIn/onPressOut to animate shadow depth, scale, and opacity changes.react-native-linear-gradient or expo-linear-gradient.kotlin@Composable fun SkeuoButton() { var isPressed by remember { mutableStateOf(false) } val scale by animateFloatAsState(if (isPressed) 0.96f else 1f) val elevation by animateDpAsState(if (isPressed) 2.dp else 8.dp) Box( modifier = Modifier .size(80.dp) .graphicsLayer { scaleX = scale; scaleY = scale } .shadow(elevation, CircleShape) .clip(CircleShape) .background( Brush.verticalGradient( colors = listOf(Color(0xFFE0E0E0), Color(0xFFA0A0A0)) ) ) .border(1.dp, Color(0xFF7A7A7A), CircleShape) .pointerInput(Unit) { detectTapGestures( onPress = { isPressed = true tryAwaitRelease() isPressed = false } ) }, contentAlignment = Alignment.Center, ) { Text("POWER", color = Color.White, fontWeight = FontWeight.Bold, fontSize = 14.sp, style = TextStyle(shadow = Shadow( color = Color.Black.copy(alpha = 0.5f), offset = Offset(0f, 2f), blurRadius = 4f, ))) } }
Brush.verticalGradient() for metallic surfaces and Modifier.border() with CircleShape for bezels.shadow elevation and graphicsLayer { scaleX/scaleY } on press for realistic physical push.Modifier.paint(painterResource(R.drawable.brushed_metal)) as a background.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→fail | 15,375 | 12,413 | -19% | 1 | 1 | 0% | 2,600 | 4,995 | +92% | 0 | 0 | — |
case-01 | pass→pass | 18,337 | 28,110 | +53% | 1 | 1 | 0% | 2,636 | 5,967 | +126% | 0 | 0 | — |
case-02 | fail→fail | 13,753 | 13,199 | -4% | 1 | 1 | 0% | 1,935 | 5,237 | +171% | 0 | 0 | — |
case-03 | fail→pass | 6,122 | 18,751 | +206% | 1 | 1 | 0% | 1,117 | 5,535 | +396% | 0 | 0 | — |
case-04 | pass→fail | 17,519 | 19,792 | +13% | 1 | 1 | 0% | 3,307 | 5,557 | +68% | 0 | 0 | — |
case-06 | fail→pass | 18,479 | 12,753 | -31% | 1 | 1 | 0% | 2,435 | 5,172 | +112% | 0 | 0 | — |
case-07 | fail→fail | 17,073 | 22,408 | +31% | 1 | 1 | 0% | 3,359 | 7,060 | +110% | 0 | 0 | — |
case-08 | pass→pass | 12,805 | 11,060 | -14% | 1 | 1 | 0% | 2,143 | 4,750 | +122% | 0 | 0 | — |
case-09 | fail→pass | 29,003 | 25,634 | -12% | 1 | 1 | 0% | 4,411 | 7,149 | +62% | 0 | 0 | — |
case-10 | fail→pass | 17,511 | 16,265 | -7% | 1 | 1 | 0% | 3,185 | 5,264 | +65% | 0 | 0 | — |
case-19 | pass→pass | 19,454 | 11,973 | -38% | 1 | 1 | 0% | 3,821 | 5,077 | +33% | 0 | 0 | — |
case-11 | pass→pass | 17,655 | 17,518 | -1% | 1 | 1 | 0% | 2,329 | 5,457 | +134% | 0 | 0 | — |
case-12 | pass→pass | 17,733 | 15,881 | -10% | 1 | 1 | 0% | 2,286 | 5,059 | +121% | 0 | 0 | — |
case-13 | pass→pass | 16,651 | 15,961 | -4% | 1 | 1 | 0% | 2,585 | 5,524 | +114% | 0 | 0 | — |
case-14 | pass→pass | 14,742 | 15,311 | +4% | 1 | 1 | 0% | 1,964 | 5,170 | +163% | 0 | 0 | — |
case-15 | pass→pass | 11,911 | 14,999 | +26% | 1 | 1 | 0% | 2,101 | 5,031 | +139% | 0 | 0 | — |
case-16 | pass→pass | 14,402 | 15,959 | +11% | 1 | 1 | 0% | 2,657 | 5,236 | +97% | 0 | 0 | — |
case-17 | pass→pass | 11,531 | 13,035 | +13% | 1 | 1 | 0% | 2,166 | 4,716 | +118% | 0 | 0 | — |
case-18 | fail→pass | 14,177 | 14,352 | +1% | 1 | 1 | 0% | 2,450 | 5,395 | +120% | 0 | 0 | — |
case-20 | pass→pass | 8,943 | 8,096 | -9% | 1 | 1 | 0% | 1,900 | 4,282 | +125% | 0 | 0 | — |
case-21 | fail→fail | 15,082 | 34,977 | +132% | 1 | 1 | 0% | 2,465 | 10,088 | +309% | 0 | 0 | — |
case-22 | pass→pass | 13,882 | 10,907 | -21% | 1 | 1 | 0% | 2,150 | 4,454 | +107% | 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.