用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Fadil369/Solutions --skill form-pattern-engine命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Provides accessible UI component patterns with ARIA attributes, keyboard navigation, and screen reader support.
Builds robust API clients with retry logic, caching, error handling, and request/response transformation.
Designs secure authentication flows including OAuth2, OIDC, MFA, session management, and password reset patterns.
基于 SOC 职业分类
正在显示 SKILL.md
| name | Form Pattern Engine |
| version | 1.0.0 |
| description | Implements robust form patterns with validation, conditional fields, multi-step wizards, and auto-save. |
| author | workspace |
| activated | false |
Implements robust form patterns with validation, conditional fields, multi-step wizards, and auto-save.
Use when: Complex forms, multi-step wizards, conditional fields, real-time validation, auto-save needed
Don't use when: Simple single-field inputs, search boxes
// BAD: Silent validation
if (!email.includes('@')) return;
// GOOD: Clear error message
if (!email.includes('@')) {
setErrors({ email: 'Please enter a valid email address' });
return;
}
Always mark required fields visually and in ARIA attributes.
function useForm(initialValues, validationSchema) {
const [values, setValues] = useState(initialValues);
const [errors, setErrors] = useState({});
const [touched, setTouched] = useState({});
const validate = useCallback(() => {
const result = validationSchema.safeParse(values);
if (!result.success) {
const fieldErrors = {};
result.error.errors.forEach(e => {
fieldErrors[e.path.join('.')] = e.message;
});
setErrors(fieldErrors);
return false;
}
setErrors({});
return true;
}, [values, validationSchema]);
const getFieldProps = (name) => ({
name, value: values[name] || '',
onChange: (e) => setValues(v => ({ ...v, [name]: e.target.value })),
onBlur: () => setTouched( ({ ...t, [name]: })),
: touched[name] && !!errors[name],
: errors[name] ? : ,
});
{ values, errors, touched, validate, getFieldProps, setValues };
}
const FormWizard = ({ steps, onComplete }) => {
const [currentStep, setCurrentStep] = useState(0);
const [data, setData] = useState({});
const step = steps[currentStep];
const isFirst = currentStep === 0;
const isLast = currentStep === steps.length - 1;
return (
<form aria-label={`Step ${currentStep + 1} of ${steps.length}: ${step.title}`}>
<h2>{step.title}</h2>
<step.component data={data} onChange={setData} />
<div>
{!isFirst && <button type="button" onClick={() => setCurrentStep(s => s - 1)}>Back</button>}
<button type="button" onClick={() => isLast ? onComplete(data) : setCurrentStep(s => s + 1)}>
{isLast ? 'Submit' : 'Next'}
</button>
);
};