tile-design – skill Thiết kế & UI cho agent AI
Hướng dẫn triển khai Web và App theo Tile Design. Kích hoạt khi người dùng muốn phong cách Microsoft Metro, các khối thông tin vuông sắc nét và lưới cuộn ngang.
Cài skill tile-design 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/tile-design-2e31e.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /tile-design – 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/tile-design-2e31e.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $tile-design – 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/tile-design-2e31e.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /tile-design – 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/tile-design-2e31e.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /tile-design – 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.
Tile Design (Metro UI)
> "Authentically digital. Clean, sharp squares relying purely on typography and flat color."
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. Sharp Corners: Absolutely no border-radius. Everything is a perfect square or sharp rectangle.
2. Live Data: Tiles flip, scroll, or fade internally to show live updates without the user interacting.
3. Horizontal Panning: The grid often expands infinitely to the right, encouraging horizontal scrolling.
Visual DNA
- Colors: High saturation, flat colors. A dark background (pure black) with bright cyan, magenta, orange, and green tiles.
- Typography: Extremely clean, light sans-serifs (like
Segoe UI Light). Text is almost always pure white. - Icons: Simple, wireframe, monochromatic glyphs placed centrally or in the corner.
Web Implementation
- CSS Example:
body {
background-color: #111;
color: #fff;
font-family: 'Segoe UI', sans-serif;
overflow-x: auto; /* Horizontal scroll */
}
.tile-group {
display: grid;
grid-template-columns: repeat(4, 150px);
grid-auto-rows: 150px;
gap: 8px;
padding: 40px;
}
.tile {
background-color: #0078D7; /* Classic Windows Blue */
padding: 12px;
display: flex;
flex-direction: column;
justify-content: space-between;
cursor: pointer;
/* The "tilt" click effect */
transition: transform 0.1s;
transform-origin: center;
}
.tile:active {
transform: scale(0.95);
}
.tile-wide { grid-column: span 2; }
.tile-large { grid-column: span 2; grid-row: span 2; }
/* Live Tile Animation */
.tile-live-content {
animation: slideUp 5s infinite;
}
@keyframes slideUp {
0%, 45% { transform: translateY(0); }
50%, 95% { transform: translateY(-100%); } /* Slides up to reveal next item */
100% { transform: translateY(0); }
}App Implementation
SwiftUI
struct TileDesignView: View {
let rows = [GridItem(.fixed(150), spacing: 8), GridItem(.fixed(150), spacing: 8)]
var body: some View {
ScrollView(.horizontal, showsIndicators: false) {
LazyHGrid(rows: rows, spacing: 8) {
TileView(title: "Mail", color: Color(hex: "0078D7"), icon: "envelope")
TileView(title: "Photos", color: Color(hex: "00CC6A"), icon: "photo", isLarge: true)
TileView(title: "Weather", color: Color(hex: "2D7D9A"), icon: "cloud.sun")
TileView(title: "Calendar", color: Color(hex: "D13438"), icon: "calendar")
}
.padding(40)
}
.background(Color(hex: "111111").ignoresSafeArea())
}
}
struct TileView: View {
let title: String
let color: Color
let icon: String
var isLarge: Bool = false
@State private var isPressed = false
var body: some View {
VStack(alignment: .leading) {
Image(systemName: icon)
.font(.system(size: 32, weight: .light))
.foregroundColor(.white)
Spacer()
Text(title)
.font(.custom("Segoe UI", size: 16))
.foregroundColor(.white)
}
.padding(16)
// Sharp corners are mandatory
.frame(width: isLarge ? 308 : 150, height: isLarge ? 308 : 150, alignment: .leading)
.background(color)
.scaleEffect(isPressed ? 0.95 : 1.0)
.animation(.spring(response: 0.2, dampingFraction: 0.5), value: isPressed)
.onLongPressGesture(minimumDuration: .infinity, maximumDistance: .infinity, pressing: { pressing in
isPressed = pressing
}, perform: {})
}
}- A
LazyHGridinside a horizontalScrollViewapproximates the Windows Phone / Windows 8 start screen. - Absolutely NO corner radius.
- The
isPressedstate triggering a.scaleEffect(0.95)replicates the physical "tilt" interaction of Metro tiles.
Flutter
class TileDesignScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFF111111),
body: SingleChildScrollView(
scrollDirection: Axis.horizontal,
padding: const EdgeInsets.all(40),
child: SizedBox(
height: 308, // Two rows of 150px + 8px spacing
child: Wrap(
direction: Axis.vertical,
spacing: 8,
runSpacing: 8,
children: [
_buildTile('Mail', const Color(0xFF0078D7), Icons.mail_outline),
_buildTile('Weather', const Color(0xFF2D7D9A), Icons.cloud_outlined),
_buildTile('Photos', const Color(0xFF00CC6A), Icons.photo_outlined, isLarge: true),
_buildTile('Calendar', const Color(0xFFD13438), Icons.calendar_today),
],
),
),
),
);
}
Widget _buildTile(String title, Color color, IconData icon, {bool isLarge = false}) {
bool isPressed = false; // Keep state outside the builder closure.
return StatefulBuilder(
builder: (context, setState) {
return GestureDetector(
onTapDown: (_) => setState(() => isPressed = true),
onTapUp: (_) => setState(() => isPressed = false),
onTapCancel: () => setState(() => isPressed = false),
child: AnimatedScale(
scale: isPressed ? 0.95 : 1.0,
duration: const Duration(milliseconds: 100),
child: Container(
width: isLarge ? 308 : 150,
height: isLarge ? 308 : 150,
color: color, // Sharp corners
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Icon(icon, color: Colors.white, size: 32),
Text(title, style: const TextStyle(color: Colors.white, fontFamily: 'Segoe UI', fontSize: 16)),
],
),
),
),
);
}
);
}
}Wrapwithdirection: Axis.verticalinside a horizontally scrollingSizedBoxis the easiest way to build a Metro grid that flows left-to-right.- Wrap tiles in
GestureDetectorandAnimatedScaleto handle the press animation.
React Native
const TileDesignScreen = () => {
return (
<ScrollView horizontal style={{ flex: 1, backgroundColor: '#111' }} contentContainerStyle={{ padding: 40 }}>
<View style={{ flexDirection: 'column', flexWrap: 'wrap', height: 308, gap: 8 }}>
<Tile title="Mail" color="#0078D7" />
<Tile title="Weather" color="#2D7D9A" />
<Tile title="Photos" color="#00CC6A" isLarge />
<Tile title="Calendar" color="#D13438" />
</View>
</ScrollView>
);
};
const Tile = ({ title, color, isLarge }) => {
const scale = useRef(new Animated.Value(1)).current;
const handlePressIn = () => Animated.spring(scale, { toValue: 0.95, useNativeDriver: true }).start();
const handlePressOut = () => Animated.spring(scale, { toValue: 1, useNativeDriver: true }).start();
return (
<TouchableWithoutFeedback onPressIn={handlePressIn} onPressOut={handlePressOut}>
<Animated.View style={{
width: isLarge ? 308 : 150, height: isLarge ? 308 : 150,
backgroundColor: color, padding: 16, justifyContent: 'space-between',
transform: [{ scale }] // The Metro tilt effect
}}>
<View style={{ width: 32, height: 32, backgroundColor: '#FFF', opacity: 0.5 }} />
<Text style={{ color: '#FFF', fontFamily: 'Segoe UI', fontSize: 16 }}>{title}</Text>
</Animated.View>
</TouchableWithoutFeedback>
);
};- Use a
<ScrollView horizontal>combined with a child<View>that has a fixedheightandflexWrap: 'wrap', flexDirection: 'column'. This forces children to form columns and flow horizontally. - Use
Animated.ViewandTouchableWithoutFeedbackto create the scale animation.
Jetpack Compose
@Composable
fun TileDesignScreen() {
LazyHorizontalGrid(
rows = GridCells.Fixed(2),
modifier = Modifier.fillMaxSize().background(Color(0xFF111111)),
contentPadding = PaddingValues(40.dp),
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
item(span = { GridItemSpan(1) }) { Tile("Mail", Color(0xFF0078D7)) }
// GridItemSpan(2) spans both rows. Set the item width separately for a 2x2 tile.
item(span = { GridItemSpan(2) }) { Tile("Photos Wide", Color(0xFF00CC6A)) }
item(span = { GridItemSpan(1) }) { Tile("Weather", Color(0xFF2D7D9A)) }
}
}
@Composable
fun Tile(title: String, color: Color) {
var isPressed by remember { mutableStateOf(false) }
val scale by animateFloatAsState(… (nội dung đầy đủ có trong gói tải về)
Skill liên quan
- tone-of-voice-analyzer – Bộ phân tích giọng văn (Tone of Voice). Dùng khi làm việc với văn bản và mẫu giọng…
- tool-design – Xây dựng công cụ mà agent có thể dùng hiệu quả, bao gồm các mẫu thu gọn kiến trúc. Dùng…
- typography-first – Hướng dẫn triển khai Typography First Design cho Web và App. Kích hoạt khi người dùng…
- ui-a11y – Kiểm tra component hoặc trang để tìm lỗi khả năng truy cập (accessibility) và sửa chúng.
- ui-component – Tạo component UI mới theo quy ước thiết kế của StyleSeed.
- ui-from-screenshot – Chuyển ảnh chụp màn hình hoặc mockup thành giao diện tương ứng bằng chính các component…
- ui-lint – Lint tự động nhanh — phát hiện các vi phạm design system phổ biến chỉ trong vài giây.
- ui-motion – Áp dụng một chuyển động StyleSeed có tên cho component — hoặc một trong 5 seed tính cách…