claymorphism – skill Thiết kế & UI cho agent AI
Hướng dẫn triển khai Claymorphism cho Web và App. Kích hoạt khi người dùng muốn các phần tử 3D mềm, hình khối bo tròn và giao diện vui nhộn, có cảm giác chạm.
Cài skill claymorphism bằng một lệnh
Chọn công cụ bạn đang dùng, copy lệnh và dán vào terminal. Skill sẽ nằm trong thư mục skills của công cụ đó và sẵn sàng dùng ở phiên làm việc tiếp theo.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/claymorphism-b5c5a.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /claymorphism – rồi mô tả công việc bạn muốn làm.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/claymorphism-b5c5a.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $claymorphism – rồi mô tả công việc bạn muốn làm.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/claymorphism-b5c5a.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /claymorphism – rồi mô tả công việc bạn muốn làm.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/claymorphism-b5c5a.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /claymorphism – rồi mô tả công việc bạn muốn làm.
Nội dung SKILL.md
Nội dung SKILL.md gốc bằng tiếng Anh.
Claymorphism
> "Like interacting with a pristine, digital claymation set. Soft, bubbly, and incredibly approachable."
When to Use
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.
Core Principles
1. Fluffy 3D Volume: Elements look like inflated balloons or soft clay blocks.
2. Double Inner Shadows: The signature of claymorphism is an inset light shadow on the top-left and an inset dark shadow on the bottom-right, giving 3D volume to a solid shape.
3. Continuous Curves: Maximum border-radius. No sharp edges exist in this universe.
Visual DNA
- Colors: Thrives on pastels and bright, friendly hues. Desert Mirage, Earth-Grounded Elegance, or custom pastel palettes work best.
- Typography: Playful, thick, rounded fonts (e.g.,
Sniglet,Fredoka One,Nunito). - Shapes: 'Squicles' (squares with heavily rounded, continuous corners) and perfect circles.
Web Implementation
- Distinct from Neumorphism: Claymorphism elements detach from the background (they have drop shadows) and use inner shadows to create volume, often using colors that contrast with the background.
- CSS Example:
.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);
}App Implementation
SwiftUI
struct ClayCard: View {
@State private var isPressed = false
var body: some View {
VStack(spacing: 16) {
Image(systemName: "cloud.sun.fill")
.font(.system(size: 48))
.foregroundColor(Color(white: 0.15))
Text("Claymorphic Card")
.font(.system(size: 20, weight: .bold, design: .rounded))
.foregroundColor(Color(white: 0.15))
}
.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 }
)
}
}- The "clay" volume comes from a gradient stroke overlay: white on top-left, dark on bottom-right.
- Use
.interpolatingSpring(stiffness: 300, damping: 10)for the bouncy feel — critical for clay aesthetics. - Background color should be pastel/bright but NOT the same as the parent (unlike neumorphism).
Flutter
class 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,
),
],
// Standard Flutter fallback; a gradient border needs a custom painter.
border: Border.all(color: Colors.white.withOpacity(0.5), width: 3),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.wb_sunny, size: 48, color: Colors.black87),
const SizedBox(height: 16),
const Text('Claymorphic Card',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold,
color: Colors.black87)),
],
),
),
),
);
}
}- Use
Curves.elasticOutorCurves.bounceOutfor the spring animation — essential for the clay feeling. - Gradient borders require a custom
ShapeDecorationor aStackwith a gradient container behind the main container. - Alternative for inner shadow: use
flutter_inset_box_shadowpackage with light top-left and dark bottom-right insets.
React Native
const 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: '#262626', marginTop: 16,
}}>
Claymorphic Card
</Text>
</Animated.View>
</Pressable>
);
};- Use
Animated.springwith lowfriction(3-5) for the signature bouncy clay behavior. - Gradient borders aren't possible natively — use a solid white-tinted border as a simplified approximation, or wrap in an
expo-linear-gradientView.
Jetpack Compose
@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, contentDescription = null, tint = Color(0xFF262626),
modifier = Modifier.size(48.dp))
Spacer(Modifier.height(16.dp… (nội dung đầy đủ có trong gói tải về)
Skill liên quan
- interview-system-designer – Skill này nên được dùng khi người dùng yêu cầu "design interview processes", "create…
- popular-web-designs – 54 hệ thống thiết kế thực tế (Stripe, Linear, Vercel) dưới dạng HTML/CSS.
- codebase-design – Từ vựng chung để thiết kế module sâu. Dùng khi người dùng muốn thiết kế hoặc cải thiện…
- codebase-to-wordpress-converter – Skill chuyên gia chuyển đổi bất kỳ codebase nào (React/HTML/Next.js) thành theme…
- react-native-design – Làm chủ styling, navigation và animation Reanimated trong React Native cho phát triển…
- color-blocking – Hướng dẫn triển khai Color Blocking cho Web và App. Kích hoạt khi người dùng muốn các…
- comfyui-gateway – Cổng REST API cho máy chủ ComfyUI. Quản lý workflow, xếp hàng job, webhook, bộ nhớ đệm…
- command-center-ui – Hướng dẫn triển khai Command Center UI cho Web và App. Kích hoạt khi người dùng muốn hệ…