ux-copywriting-standards
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".
When & Why to Use This Skill
This Claude skill provides professional UX copywriting standards and templates specifically designed for vehicle insurance platforms. It streamlines the creation of user-facing text—including error messages, button labels, and status notifications—by enforcing a professional, concise, and friendly tone. Additionally, it offers technical implementation logic for standardized number and date formatting to ensure data consistency across the UI.
Use Cases
- Drafting actionable error messages that follow the 'Problem + Solution' formula to reduce user frustration during technical issues.
- Standardizing button labels and tooltips across a platform to ensure a consistent and professional user interface.
- Generating localized and human-readable formats for insurance premiums, percentages, and record counts using predefined JavaScript utility functions.
- Creating concise success and warning notifications for common data operations like refreshing, filtering, or exporting insurance records.
- Refining existing UI copy to align with industry-specific tone principles and professional standards.
| 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)