프로젝트의 shadcn/ui + Tailwind 패턴에 따라 새 React 컴포넌트를 생성합니다. UI 프리미티브(버튼, 다이얼로그 등) 또는 도메인 컴포넌트(ServerMap, Inspector 등)를 새로 만들 때 반드시 이 스킬을 사용하세요.
$ARGUMENTS 설명을 가진 $0 컴포넌트를 생성합니다.
재사용 가능한 일반 UI 컴포넌트(버튼 변형, 다이얼로그, 입력 등):
@pinpoint-fe/ui/src/lib/utils의 cn() 사용asChild 지원React.forwardRef 사용기능별 컴포넌트(ServerMap, ErrorAnalysis 등):
packages/ui/src/components/ 아래 서브디렉토리 생성packages/ui/src/components/ui/button.tsx 또는 dialog.tsx 읽기import * as React from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
import { cn } from '@pinpoint-fe/ui/src/lib/utils';
const componentVariants = cva('base-classes', {
variants: { variant: { default: '...', outline: '...' }, size: { default: '...', sm: '...' } },
defaultVariants: { variant: 'default', size: 'default' },
});
export interface ComponentProps
extends React.HTMLAttributes<HTMLDivElement>,
VariantProps<typeof componentVariants> {}
const Component = React.forwardRef<HTMLDivElement, ComponentProps>(
({ className, variant, size, ...props }, ref) => (
<div ref={ref} className={cn(componentVariants({ variant, size, className }))} {...props} />
),
);
Component.displayName = 'Component';
export { Component, componentVariants };
import React, { Suspense } from 'react';
import { ErrorBoundary } from 'react-error-boundary';
import { useTranslation } from 'react-i18next';
import { useAtomValue } from 'jotai';
import { cn } from '@pinpoint-fe/ui/src/lib/utils';
import { someSearchParamAtom } from '@pinpoint-fe/ui/src/atoms';
import { useGetMyData } from '@pinpoint-fe/ui/src/hooks/api';
export interface MyComponentProps {
className?: string;
}
const MyComponentContent = ({ className }: MyComponentProps) => {
const { t } = useTranslation();
const searchParam = useAtomValue(someSearchParamAtom);
const { data } = useGetMyData({ param: searchParam });
if (!data) return null;
return <div className={cn('...', className)}>{/* 렌더링 */}</div>;
};
export const MyComponent = ({ className }: MyComponentProps) => (
<ErrorBoundary fallback={<div>Error</div>}>
<Suspense fallback={<div>Loading...</div>}>
<MyComponentContent className={className} />
</Suspense>
</ErrorBoundary>
);
var(--ui-primary), var(--ui-border)cn() 사용packages/ui/src/components/index.ts (또는 해당 서브디렉토리의 index.ts)에서 컴포넌트 익스포트yarn build로 TypeScript 오류 없음 확인