react-component-generator — скилл для Claude Code: генерация
Скилл для генерации React-компонентов на TypeScript: пропсы, хуки, доступность. Пригодится при создании новых UI-элементов и рефакторинге.
npx skills add OneWave-AI/claude-skills --skill react-component-generator -a claude-codeЧто делает react-component-generator
Скилл задаёт агенту порядок работы при создании React-компонента: определить, клиентский он или серверный, описать интерфейс пропсов на TypeScript, реализовать по практикам и добавить атрибуты доступности. Внутри — готовые шаблоны под три случая: клиентский компонент, серверный компонент и форма на React Hook Form с валидацией через zod.
Шаблон клиентского компонента показывает кнопку с вариантами оформления, размерами и состоянием загрузки. Серверный — список пользователей с запросом к базе и параметром limit. Форма разбирает схему zod, связывает ошибки с полями через aria-invalid и aria-describedby. Есть чек-лист по доступности: семантические теги, aria-label для кнопок без текста, роли, навигация с клавиатуры, aria-busy для загрузки.
Установка идёт через npx skills add с флагом под конкретную платформу, файл скилла ложится в папку вроде ~/.claude/skills/react-component-generator/SKILL.md. Шаблоны опираются на react-hook-form, @hookform/resolvers и zod — если этих пакетов в проекте нет, примеры формы придётся адаптировать. Это повод проверить зависимости до того, как агент начнёт вставлять код.
Какие задачи решает
- сгенерировать кнопку с вариантами оформления и состоянием загрузки
- написать серверный компонент со списком из базы
- собрать форму логина с валидацией полей
- связать ошибки формы с полями через aria-атрибуты
- пройти чек-лист доступности при рефакторинге компонента
Примеры запросов агенту
- Создай клиентский компонент Button с вариантами primary, secondary и ghost
- Напиши серверный компонент UserList с параметром limit
- Сделай форму логина на React Hook Form с валидацией через zod
Как установить react-component-generator
1Через Skills CLI (Vercel)
npx skills add OneWave-AI/claude-skills --skill react-component-generator -a claude-code2Вручную: положить файлы
~/.claude/skills/react-component-generator/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/react-component-generator/
1Через Skills CLI (Vercel)
npx skills add OneWave-AI/claude-skills --skill react-component-generator -a codex2Вручную: положить файлы
.agents/skills/react-component-generator/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add OneWave-AI/claude-skills --skill react-component-generator -a cursor2Вручную: положить файлы
.cursor/skills/react-component-generator/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install OneWave-AI/claude-skills react-component-generator2Вручную: положить файлы
.github/skills/react-component-generator/SKILL.md1Через Skills CLI (Vercel)
npx skills add OneWave-AI/claude-skills --skill react-component-generator -a gemini-cli2Командой платформы
gemini skills install https://github.com/OneWave-AI/claude-skills --path react-component-generatorВручную: положить файлы
.devin/skills/react-component-generator/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add OneWave-AI/claude-skills --skill react-component-generator -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора58
Похожие
Рядом в теме «Фронтенд и UI»
Всё по теме «Фронтенд и UI» →Вопросы о react-component-generator
Как установить react-component-generator в Claude?
Выполните npx skills add OneWave-AI/claude-skills --skill react-component-generator -a claude-code. Файл скилла появится по пути ~/.claude/skills/react-component-generator/SKILL.md.
Что делает react-component-generator?
Помогает агенту писать React-компоненты на TypeScript: определяет тип компонента, описывает пропсы, добавляет хуки и атрибуты доступности. Внутри есть шаблоны для клиентских и серверных компонентов и для форм.
Что нужно для работы скилла?
Шаблон формы использует react-hook-form, @hookform/resolvers и zod. Если этих пакетов в проекте нет, примеры придётся переписать под свои зависимости.
Исходный текст
SKILL.md · MIT
---
name: react-component-generator
description: Generate React components with TypeScript, proper props, hooks, and accessibility. Use when creating new React components, UI elements, or refactoring existing components.
---
# React Component Generator
## Instructions
When creating React components:
1. **Determine component type**: Client or Server component
2. **Define props interface** with TypeScript
3. **Implement with best practices**
4. **Add accessibility attributes**
## Templates
### Client Component
```tsx
'use client';
import { useState, useCallback } from 'react';
import { cn } from '@/lib/utils';
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
variant?: 'primary' | 'secondary' | 'ghost';
size?: 'sm' | 'md' | 'lg';
isLoading?: boolean;
children: React.ReactNode;
}
export function Button({
variant = 'primary',
size = 'md',
isLoading = false,
children,
className,
disabled,
...props
}: ButtonProps) {
const baseStyles = 'inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2';
const variants = {
primary: 'bg-blue-600 text-white hover:bg-blue-700',
secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',
ghost: 'hover:bg-gray-100',
};
const sizes = {
sm: 'h-8 px-3 text-sm',
md: 'h-10 px-4',
lg: 'h-12 px-6 text-lg',
};
return (
<button
className={cn(baseStyles, variants[variant], sizes[size], className)}
disabled={disabled || isLoading}
aria-busy={isLoading}
{...props}
>
{isLoading ? <span className="animate-spin mr-2">⏳</span> : null}
{children}
</button>
);
}
```
### Server Component
```tsx
import { db } from '@/lib/db';
interface UserListProps {
limit?: number;
}
export async function UserList({ limit = 10 }: UserListProps) {
const users = await db.user.findMany({ take: limit });
if (users.length === 0) {
return <p className="text-gray-500">No users found.</p>;
}
return (
<ul role="list" className="divide-y">
{users.map((user) => (
<li key={user.id} className="py-4">
<span>{user.name}</span>
</li>
))}
</ul>
);
}
```
### Form Component with React Hook Form
```tsx
'use client';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
const schema = z.object({
email: z.string().email('Invalid email'),
password: z.string().min(8, 'Min 8 characters'),
});
type FormData = z.infer<typeof schema>;
export function LoginForm({ onSubmit }: { onSubmit: (data: FormData) => void }) {
const {
register,
handleSubmit,
formState: { errors, isSubmitting },
} = useForm<FormData>({
resolver: zodResolver(schema),
});
return (
<form onSubmit={handleSubmit(onSubmit)} noValidate>
<div>
<label htmlFor="email">Email</label>
<input
id="email"
type="email"
aria-invalid={!!errors.email}
aria-describedby={errors.email ? 'email-error' : undefined}
{...register('email')}
/>
{errors.email && (
<p id="email-error" role="alert">{errors.email.message}</p>
)}
</div>
<button type="submit" disabled={isSubmitting}>
{isSubmitting ? 'Loading...' : 'Submit'}
</button>
</form>
);
}
```
## Accessibility Checklist
- [ ] Use semantic HTML elements
- [ ] Add `aria-label` for icon-only buttons
- [ ] Include `role` attributes where needed
- [ ] Ensure keyboard navigation works
- [ ] Add `aria-invalid` and `aria-describedby` for form errors
- [ ] Use `aria-busy` for loading states
© OneWave-AI · MIT · OneWave-AI/claude-skills