| name | ux-copywriting-standards |
| description | Write user-facing copy for vehicle insurance platform UI. Use when writing error messages, button labels, tooltips, success messages, or formatting numbers. Mentions "write message", "button text", "error copy", "toast message", or "format number". |
| allowed-tools | Read, Edit, Grep, Glob |
UX Copywriting Standards
Professional, concise, and friendly copy guidelines for user interface text.
When to Activate
Use this skill when the user:
- Asks "write an error message" or "what should the button say?"
- Mentions "toast message", "success text", or "warning copy"
- Needs to "format a number" or "write tooltip text"
- Wants to "improve this message" or "make it more user-friendly"
Tone Principles
1. Professional (专业)
- State facts clearly
- Avoid casual expressions
- Use industry terminology correctly
✅ Good: "数据加载完成,共加载 5,123 条记录" ❌ Bad: "哇!数据超多的!"
2. Concise (简洁)
- Use 3-10 words when possible
- Remove unnecessary adjectives
- Get to the point
✅ Good: "刷新成功" (3 words) ❌ Bad: "您的数据刷新操作已经成功完成了" (冗长)
3. Friendly (友好)
- Be polite
- Offer solutions
- Don't blame users
✅ Good: "未找到匹配数据,请调整筛选条件" ❌ Bad: "没数据"
Copy Templates
Success Messages
| Scenario | Template | Duration |
|---|---|---|
| Data refresh | "数据刷新成功,最新日期: {date}" | 3s |
| Filter applied | "筛选已应用,找到 {count} 条记录" | 2s |
| File exported | "{filename} 已下载" | 2.5s |
| Settings saved | "设置已保存" | 2s |
Implementation:
export const SUCCESS_MESSAGES = {
dataRefresh: (date) => `数据刷新成功,最新日期: ${date}`,
filterApply: (count) => `筛选已应用,找到 ${count.toLocaleString()} 条记录`,
export: (filename) => `${filename} 已下载`,
settingsSaved: () => '设置已保存'
}
Error Messages
Formula: Problem + Solution
| Scenario | Problem | Solution |
|---|---|---|
| Network error | "无法连接服务器" | "请检查网络连接,或稍后重试" |
| Data load failed | "数据加载失败" | "请刷新页面或联系管理员" |
| Invalid format | "不支持的文件格式" | "请上传 .xlsx 或 .csv 文件" |
| No permission | "无权限访问" | "请联系管理员开通权限" |
Implementation:
export const ERROR_MESSAGES = {
network: {
title: '无法连接服务器',
message: '请检查网络连接,或稍后重试'
},
dataLoad: (reason) => ({
title: '数据加载失败',
message: reason || '请刷新页面或联系管理员'
}),
invalidFile: {
title: '不支持的文件格式',
message: '请上传 .xlsx 或 .csv 文件'
}
}
Warning Messages
| Severity | Icon | Template |
|---|---|---|
| High | ⚠️ | "数据质量评分较低 ({score}分),建议检查数据源" |
| Medium | 💡 | "发现 {count} 条异常数据,建议人工复核" |
| Low | ℹ️ | "{count} 名业务员未匹配,映射覆盖率 {rate}%" |
Button Labels
| Action Type | Primary | Secondary | Danger |
|---|---|---|---|
| Confirm | "确定" | "取消" | - |
| Submit | "提交" | "重置" | - |
| Save | "保存" | "放弃修改" | - |
| Delete | - | "取消" | "确认删除" |
| Refresh | "立即刷新" | "稍后" | - |
Number Formatting
Formatter Functions
export const formatters = {
// Premium formatting
premium(value) {
if (value == null) return '-'
const abs = Math.abs(value)
const sign = value < 0 ? '-' : ''
if (abs >= 10000) {
return `${sign}${(abs / 10000).toFixed(1)} 万元`
}
return `${sign}${abs.toLocaleString('zh-CN')} 元`
},
// Percentage
percentage(value, decimals = 1) {
if (value == null) return '-'
return `${(value * 100).toFixed(decimals)}%`
},
// Count
count(value) {
if (value == null) return '-'
return `${value.toLocaleString('zh-CN')} 条`
},
// Date
date(value, format = 'short') {
if (!value) return '-'
const d = new Date(value)
if (format === 'short') {
return d.toISOString().split('T')[0] // YYYY-MM-DD
}
return `${d.getFullYear()}年${String(d.getMonth()+1).padStart(2,'0')}月${String(d.getDate()).padStart(2,'0')}日`
}
}
Usage Examples
formatters.premium(125420) // "12.5 万元"
formatters.premium(-5000) // "-5,000 元"
formatters.percentage(0.235) // "23.5%"
formatters.count(5123) // "5,123 条"
formatters.date('2025-11-09') // "2025-11-09"
formatters.date('2025-11-09', 'long') // "2025年11月09日"
Writing Checklist
Before publishing copy:
- Follows 3 tone principles (professional, concise, friendly)
- Uses established templates
- Numbers are formatted correctly
- Error messages include solutions
- No emojis (unless user requests)
- Length: 3-20 words for most messages
- Tested with longest possible values
Common Mistakes
❌ Mistake 1: Too casual
"哇塞!数据好多啊~"
✅ Fix: "数据加载完成,共 5,123 条记录"
❌ Mistake 2: Too technical
"NullPointerException in data loader"
✅ Fix: "数据加载失败,请稍后重试"
❌ Mistake 3: No solution
"错误"
✅ Fix: "数据加载失败,请刷新页面或联系管理员"
❌ Mistake 4: Unformatted numbers
"保费: 1254200"
✅ Fix: "保费: 125.4 万元"
Related Files
Toast component: frontend/src/components/common/Toast.vue
Format utils: Create frontend/src/utils/format.js
Copy templates: Create frontend/src/utils/copy.js
Related Skills:
status-message-components- Implement status UI componentsuser-guidance-flows- Write onboarding and help text
Skill Version: v1.0 Created: 2025-11-09 Focuses On: Writing copy only (not design or layout)