pencil-ui-design
0
总安装量
26
周安装量
安装命令
npx skills add https://github.com/allenai2014/pencil-ui-design --skill pencil-ui-design
Agent 安装分布
opencode
22
gemini-cli
21
codex
21
github-copilot
17
kimi-cli
13
Skill 文档
Pencil MCP å·¥ä¸çº§ UI 设计 Skills
æ¬ Skills æä¾äºä¸å¥å·¥ä¸çº§æ åç UI 设计è§èï¼ç¨äº Pencil MCP 设计工ä½ã
å¿«éå¼å§
1. åå§å设计系ç»åé
å¨å¼å§è®¾è®¡åï¼å 设置设计系ç»åéï¼
mcp_pencil_set_variables({
filePath: "<your-file.pen>",
variables: {
// åè design-tokens.json ä¸ç宿´åéå®ä¹
}
})
2. å建å¯å¤ç¨ç»ä»¶
ä½¿ç¨ reusable: true å建ç»ä»¶ï¼éè¿ ref å¤ç¨ï¼
// å建ç»ä»¶
buttonPrimary=I(document, {type: "frame", reusable: true, name: "Button/Primary", ...})
// 使ç¨ç»ä»¶
btn1=I(someParent, {type: "ref", ref: "buttonPrimary"})
设计系ç»è§è
é¢è²ç³»ç» (Color Tokens)
| åéå | Light Mode | Dark Mode | ç¨é |
|---|---|---|---|
--background |
#FAFAFA |
#09090B |
页é¢èæ¯ |
--foreground |
#18181B |
#FAFAFA |
ä¸»ææ¬ |
--card |
#FFFFFF |
#18181B |
å¡çèæ¯ |
--card-foreground |
#18181B |
#FAFAFA |
å¡çææ¬ |
--muted |
#F4F4F5 |
#27272A |
次è¦èæ¯ |
--muted-foreground |
#71717A |
#A1A1AA |
æ¬¡è¦ææ¬ |
--border |
#E4E4E7 |
#27272A |
è¾¹æ¡ |
--primary |
#18181B |
#FAFAFA |
主æé® |
--primary-foreground |
#FAFAFA |
#18181B |
主æé®ææ¬ |
--secondary |
#F4F4F5 |
#27272A |
次æé® |
--accent |
#FCD34D |
#FCD34D |
强è°è² |
--destructive |
#EF4444 |
#EF4444 |
å±é©æä½ |
--ring |
#18181B |
#D4D4D8 |
Focus ring |
åä½å±çº§ (Typography Scale)
| å±çº§ | å¤§å° | åé | è¡é« | ç¨é |
|---|---|---|---|---|
| Display | 36px | 700 | 1.2 | 大æ é¢ |
| H1 | 24px | 600 | 1.3 | 页颿 é¢ |
| H2 | 20px | 600 | 1.4 | åºåæ é¢ |
| H3 | 18px | 600 | 1.4 | å¡çæ é¢ |
| Body | 14px | 400 | 1.5 | æ£æ |
| Small | 12px | 400 | 1.4 | è¾ å©ææ¬ |
| Caption | 10px | 500 | 1.3 | æ ç¾ |
æ¨èåä½: Inter (è±æ), Noto Sans SC (䏿)
é´è·ç³»ç» (Spacing)
åºäº 4px ç½æ ¼ï¼
xs: 4pxsm: 8pxmd: 12pxlg: 16pxxl: 24px2xl: 32px3xl: 48px
åè§è§è (Border Radius)
| åé | å¼ | ç¨é |
|---|---|---|
radius-sm |
6px | å°å ç´ (Badge, Chip) |
radius-md |
8px | æé®ãè¾å ¥æ¡ |
radius-lg |
12px | å¡çãå¼¹çª |
radius-xl |
16px | 大å¡ç |
radius-full |
9999px | å形头å |
é´å½±ç³»ç» (Shadows)
{
"shadow-sm": {
"type": "shadow",
"shadowType": "outer",
"color": "#0000000D",
"blur": 2,
"offset": {"x": 0, "y": 1}
},
"shadow-md": {
"type": "shadow",
"shadowType": "outer",
"color": "#0000000A",
"blur": 6,
"offset": {"x": 0, "y": 4}
},
"shadow-lg": {
"type": "shadow",
"shadowType": "outer",
"color": "#00000014",
"blur": 15,
"offset": {"x": 0, "y": 8}
}
}
ç»ä»¶è§è
Button æé®
Primary Button
{
"type": "frame",
"name": "Button/Primary",
"reusable": true,
"height": 40,
"layout": "horizontal",
"padding": [16, 10],
"gap": 8,
"alignItems": "center",
"justifyContent": "center",
"fill": "#18181B",
"cornerRadius": 8,
"effect": {
"type": "shadow",
"shadowType": "outer",
"color": "#0000001A",
"blur": 2,
"offset": {"x": 0, "y": 1}
}
}
// ææ¬: fill="#FFFFFF", fontFamily="Inter", fontSize=14, fontWeight=500
Secondary Button
{
"fill": "#F4F4F5",
"stroke": "#E4E4E7",
"strokeThickness": 1,
"cornerRadius": 8
}
// ææ¬: fill="#18181B"
Ghost Button
{
"fill": "transparent",
"cornerRadius": 8
}
// Hover: fill="#F4F4F5"
Destructive Button
{
"fill": "#EF4444",
"cornerRadius": 8
}
// ææ¬: fill="#FFFFFF"
Card å¡ç
{
"type": "frame",
"name": "Card",
"reusable": true,
"layout": "vertical",
"padding": 16,
"gap": 12,
"fill": "#FFFFFF",
"stroke": "#E4E4E7",
"strokeThickness": 1,
"cornerRadius": 12,
"effect": {
"type": "shadow",
"shadowType": "outer",
"color": "#0000000A",
"blur": 4,
"offset": {"x": 0, "y": 2}
}
}
Input è¾å ¥æ¡
{
"type": "frame",
"name": "Input",
"reusable": true,
"height": 40,
"layout": "horizontal",
"padding": [12, 10],
"gap": 8,
"alignItems": "center",
"fill": "#FFFFFF",
"stroke": "#E4E4E7",
"strokeThickness": 1,
"cornerRadius": 8
}
// Focus ç¶æ: stroke="#18181B", strokeThickness=2
Avatar 头å
{
"type": "frame",
"name": "Avatar",
"reusable": true,
"width": 40,
"height": 40,
"cornerRadius": 9999,
"fill": "#F4F4F5",
"layout": "vertical",
"alignItems": "center",
"justifyContent": "center"
}
Badge å¾½ç«
{
"type": "frame",
"name": "Badge",
"reusable": true,
"height": 22,
"layout": "horizontal",
"padding": [6, 8],
"alignItems": "center",
"justifyContent": "center",
"fill": "#F4F4F5",
"stroke": "#E4E4E7",
"strokeThickness": 1,
"cornerRadius": 6
}
// ææ¬: fontSize=10, fontWeight=500
徿 è§è
â ï¸ éè¦: Pencil MCP 使ç¨
Material Symbols Rounded徿 åä½ï¼ä¸æ¯ Lucideï¼
åºæ¬ç¨æ³
{
"type": "icon_font",
"iconFontFamily": "Material Symbols Rounded",
"iconFontName": "home",
"fontSize": 24,
"width": 24,
"height": 24,
"fill": "#71717A"
}
注æ: å¿ é¡»åæ¶è®¾ç½®
fontSizeãwidthåheight屿§ï¼å¦å徿 å¯è½ä¸æ¾ç¤ºï¼
常ç¨å¾æ éæ¥è¡¨
| ç±»å« | 徿 åç§° | ç¨é |
|---|---|---|
| å¯¼èª | home, menu, arrow_back, arrow_forward, close |
导èªåèå |
| æä½ | add, edit, delete, search, settings |
å¸¸ç¨æä½ |
| ç¶æ | check_circle, error, warning, info |
ç¶ææç¤º |
| åªä½ | headphones, mic, volume_up, play_arrow, pause |
é³é¢è§é¢ |
| 社交 | person, group, share, favorite, star |
社交åè½ |
| æä»¶ | folder, description, menu_book, article |
æä»¶ææ¡£ |
| éä¿¡ | mail, chat, notifications, send |
æ¶æ¯éç¥ |
| 游æ | extension, sports_esports, military_tech |
游æå¥å± |
| å¦ä¹ | school, lightbulb, timer, assignment |
æè²å¦ä¹ |
徿 尺寸è§è
| 尺寸 | å¼ | ç¨é |
|---|---|---|
| XS | 16px | è¾ å©å°å¾æ ãå¾½ç« å |
| SM | 20px | æé®å 徿 ãåè¡¨å¾æ |
| MD | 24px | æ å徿 ã导èªå¾æ |
| LG | 32px | 大æé®ãç©ºç¶æå¾æ |
| XL | 48px | ç¹æ®å¼ºè°ãå¡ç䏻徿 |
宿´ç¤ºä¾
// å建ä¸ä¸ªå¸¦å¾æ çæé®
iconBtn=I(parent, {
type: "frame",
width: 48,
height: 48,
layout: "vertical",
alignItems: "center",
justifyContent: "center",
fill: "#1E2A2F",
cornerRadius: 9999
})
icon=I(iconBtn, {
type: "icon_font",
iconFontFamily: "Material Symbols Rounded",
iconFontName: "add",
fontSize: 24,
width: 24,
height: 24,
fill: "#FFFFFF"
})
å¾çç´ æå¤ç
ä½¿ç¨ G() æä½çæå¾ç
Pencil MCP æä¾ G() æä½æ¥çææè·åå¾çï¼æ¯æä¸¤ç§æ¹å¼ï¼
AI çæå¾ç (æ¨èç¨äºæç»ã头åã徿 )
// å
å建ä¸ä¸ª frame 容å¨
avatar=I(parent, {type: "frame", width: 48, height: 48, cornerRadius: 9999})
// ä½¿ç¨ AI çæå¾çå¡«å
G(avatar, "ai", "cute cartoon boy avatar, friendly smile, warm colors, children illustration style")
Stock å¾ç (æ¨èç¨äºçå®ç §ç)
// è·å Unsplash å¾ç
heroImg=I(parent, {type: "frame", width: 400, height: 300})
G(heroImg, "stock", "modern office workspace laptop natural light")
Prompt ç¼åæå·§
| ç±»å | 好ç Prompt | ä¸å¥½ç Prompt |
|---|---|---|
| 头å | “cute cartoon boy, round face, brown hair, warm yellow background, simple illustration” | “boy” |
| 徿 | “isometric cloud server icon, soft gradients, minimalist” | “server” |
| èæ¯ | “abstract gradient purple blue, soft blur, dreamy atmosphere” | “background” |
å¾çä½¿ç¨æ³¨æäºé¡¹
- 没æ image èç¹ç±»å – å¾çåªè½ä½ä¸º frame/rectangle çå¡«å
- å
åå»ºå®¹å¨ – å¿
é¡»å
ç¨
I()å建 frameï¼åç¨G()åºç¨å¾ç - 设置æ£ç¡®å°ºå¯¸ – frame ç width/height å³å®æ¾ç¤ºå°ºå¯¸
- åè§è£åª – 设置
cornerRadius: 9999å¯å®ç°åå½¢å¾ç
ææ¬å¤çè§è
鲿¢ææ¬æº¢åº
彿æ¬å 容è¾é¿æ¶ï¼å¿ 须设置以ä¸å±æ§é²æ¢æº¢åºï¼
{
"type": "text",
"content": "è¿æ¯ä¸æ®µå¾é¿çææ¬å
容...",
"width": "fill_container",
"textGrowth": "fixed-width",
"lineHeight": 1.5
}
textGrowth 屿§è¯´æ
| å¼ | 说æ | éç¨åºæ¯ |
|---|---|---|
"auto" |
ææ¬æ ¹æ®å 容èªå¨è°æ´å®½åº¦ï¼é»è®¤ï¼ | çææ¬ãæ ç¾ |
"fixed-width" |
åºå®å®½åº¦ï¼è¶ åºèªå¨æ¢è¡ | 段è½ãæè¿°ææ¬ |
"truncate" |
åºå®å®½åº¦ï¼è¶ åºæ¾ç¤ºçç¥å· | å表项æ é¢ |
å¸¸è§ææ¬æ ·å¼
// æ®µè½ææ¬ (èªå¨æ¢è¡)
paragraph=I(parent, {
type: "text",
content: "è¿æ¯ä¸æ®µè¾é¿çæè¿°ææ¬ï¼éè¦èªå¨æ¢è¡æ¾ç¤ºã",
width: "fill_container",
textGrowth: "fixed-width",
fontSize: 14,
lineHeight: 1.5,
fill: "#71717A"
})
// æ é¢ææ¬ (åè¡)
title=I(parent, {
type: "text",
content: "æ 颿æ¬",
fontSize: 18,
fontWeight: 600,
fill: "#1E2A2F"
})
è®¾è®¡å·¥ä½æµ
ç¬¬ä¸æ¥ï¼è®¾ç½®è®¾è®¡ç³»ç»
- æå¼æå建 .pen æä»¶
- 使ç¨
mcp_pencil_set_variables设置é¢è²åé - å建å¯å¤ç¨ç»ä»¶
ç¬¬äºæ¥ï¼å建页é¢ç»æ
- åå»ºé¡µé¢ Frame (390×844 for iPhone)
- è®¾ç½®èæ¯è²
#FAFAFA - 使ç¨åç´å¸å±
layout: "vertical"
ç¬¬ä¸æ¥ï¼ä½¿ç¨ç»ä»¶æå»º UI
- éè¿
refå¼ç¨å¯å¤ç¨ç»ä»¶ - 使ç¨
U()è¦çç¹å®å±æ§ - ä¿æè®¾è®¡ä¸è´æ§
ç¬¬åæ¥ï¼éªè¯è®¾è®¡
- 使ç¨
mcp_pencil_get_screenshotæªå¾æ£æ¥ - éªè¯å¯¹é½ãé´è·ãé¢è²
- æ£æ¥åä½å徿 ä¸è´æ§
ç¬¬äºæ¥ï¼è¿ä»£ä¼å
- æ ¹æ®åé¦è°æ´ç»è
- ç¡®ä¿æ è§è§é误
- è¾åºæç»è®¾è®¡ç¨¿
æ¹éæ´æ°æ ·å¼
ä½¿ç¨ mcp_pencil_replace_all_matching_properties æ¹éæ¿æ¢å±æ§ï¼
mcp_pencil_replace_all_matching_properties({
filePath: "design.pen",
parents: ["pageId1", "pageId2"],
properties: {
"fillColor": {"#FFF9F2": "#FAFAFA"},
"fontFamily": {"Fredoka": "Inter"},
"cornerRadius": {24: 12}
}
})
è´¨éæ£æ¥æ¸ å
- ææé¡µé¢èæ¯ç»ä¸ (
#FAFAFA) - ææå¡çæè¾¹æ¡ (
1px #E4E4E7) - é´å½±ææä¸è´ (blur 2-6px)
- æé®åè§ç»ä¸ (8px)
- åä½ç»ä¸ (Inter)
- 徿 åºç»ä¸ (Lucide)
- åä½å±çº§æ£ç¡® (12/14/16/18/20/24px)
- é´è·éµå¾ª 4px ç½æ ¼