mcpField
C
component-template-generator

component-template-generator

github.com/curiositechデザイン・UI257129 回インストール2 日前に更新
リポジトリ

component-template-generator について

Component Template Generatorは、デザイントークンを使うReact、Vue、Svelte向けのコンポーネントコードを生成します。デザインシステムの立ち上げや拡張に向け、バリエーションとアクセシビリティのパターンを備えたテンプレートを提供します。

主な機能

  1. 01React、Vue、Svelteのテンプレート
  2. 02セマンティックなデザイントークンの利用
  3. 03サイズ・色・状態のバリエーション
  4. 04アクセシビリティパターンの組み込み
  5. 05基本・レイアウト・操作系コンポーネント
  6. 06トレンド別コンポーネントパターン

活用シーン

  1. 01デザインシステムの部品ライブラリ構築
  2. 02トークン対応のボタンや入力欄の生成
  3. 03アクセシブルなダイアログやドロップダウンの追加
  4. 04コンポーネントのスタイル統一

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/curiositech/some_claude_skills --skill component-template-generator

インストール後、Claude Code で/component-template-generatorを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

.claude-plugin/
plugin.json
references/
component-catalog.md
component-patterns.md

詳細

コンポーネントテンプレートジェネレーター

デザイントークンを適切に使用した、本番環境に対応できるコンポーネントコードを生成します。バリアント、アクセシビリティ、トークン連携を備えた React、Vue、Svelte コンポーネントを生成します。

クイックスタート

最小限の例 — Button コンポーネントを生成します:

// Input: Trend ID + Component type
// Output: Complete component with token usage

// Button.tsx (neobrutalism)
import { cn } from '@/lib/utils';

interface ButtonProps {
  variant?: 'primary' | 'secondary' | 'ghost';
  size?: 'sm' | 'md' | 'lg';
  children: React.ReactNode;
}

export function Button({ variant = 'primary', size = 'md', children }: ButtonProps) {
  return (
    <button className={cn(
      'border-3 border-brutal-black font-display transition-all duration-100',
      'shadow-brutal hover:shadow-brutal-hover hover:-translate-x-0.5 hover:-translate-y-0.5',
      'active:shadow-brutal-active active:translate-x-0.5 active:translate-y-0.5',
      // Variants
      variant === 'primary' && 'bg-brutal-red text-white',
      variant === 'secondary' && 'bg-brutal-cream text-brutal-black',
      variant === 'ghost' && 'bg-transparent border-transparent shadow-none',
      // Sizes
      size === 'sm' && 'px-3 py-1.5 text-sm',
      size === 'md' && 'px-4 py-2 text-base',
      size === 'lg' && 'px-6 py-3 text-lg',
    )}>
      {children}
    </button>
  );
}

重要な原則:コンポーネントでは、ハードコードされた値ではなく、セマンティックなトークン名を使用します。

主な役割

次の条件を満たすコンポーネントテンプレートを生成します。

  1. デザイントークンを正しく使用する(16 進数値ではなく、セマンティックな名前を使用)
  2. 一般的なバリアントを含める(サイズ、色、状態)
  3. アクセシビリティを組み込む(ARIA、キーボード、フォーカス)
  4. 各フレームワークの慣習に沿う(React のフック、Vue のコンポジション、Svelte のストア)

使用する場面

✅ 次の場合に使用します:

  • 生成済みトークンを使ってコンポーネントライブラリを作成するとき
  • コンポーネント全体でトークンの使用方法を統一したいとき
  • アクセシビリティをテンプレートに組み込みたいとき
  • デザインシステムの実装をすぐに始めたいとき

❌ 次の場合は使用しないでください:

  • トークンのみが必要な場合(design-system-generator を使用してください)
  • UI ライブラリ全体が必要な場合(shadcn/ui などを使用してください)
  • 既存のコンポーネントをカスタマイズする場合(直接編集してください)

コンポーネントカタログ

コアコンポーネント
コンポーネントバリアントアクセシビリティ
Buttonprimary、secondary、ghost、destructive✅ フォーカスリング、無効状態
Inputdefault、error、disabled✅ ラベルの関連付け、エラーの通知
Carddefault、interactive、highlighted✅ article/section のセマンティクス
Badgedefault、success、warning、error✅ ステータスの通知
レイアウトコンポーネント
コンポーネントバリアント機能
Containerdefault、narrow、wide最大幅とパディング
Stackvertical、horizontalスペーシングトークンを使った間隔
Grid2 列、3 列、4 列、自動レスポンシブなブレークポイント
インタラクティブコンポーネント
コンポーネントバリアントアクセシビリティ
Dialogdefault、alert✅ フォーカストラップ、Escape キーで閉じる
Dropdowndefault✅ キーボード操作
Tabsdefault✅ 矢印キーによる操作
Toggledefault✅ switch ロール

テンプレートの構造

各コンポーネントテンプレートには、次の内容が含まれます:

// 1. Type definitions
interface ComponentProps {
  variant?: 'primary' | 'secondary';
  size?: 'sm' | 'md' | 'lg';
  // ... other props
}

// 2. Component implementation
export function Component({ variant, size, ...props }: ComponentProps) {
  // Token-based styling
  // Accessibility attributes
  // Event handlers
}

// 3. Subcomponents (if applicable)
Component.Header = function Header() { /* ... */ };
Component.Body = function Body() { /* ... */ };

// 4. Default export
export default Component;

フレームワーク別テンプレート

React + Tailwind
// Uses: className, cn() utility, React.forwardRef for refs
import { forwardRef } from 'react';
import { cn } from '@/lib/utils';

interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
  variant?: 'primary' | 'secondary';
}

export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
  ({ variant = 'primary', className, ...props }, ref) => (
    <button
      ref={ref}
      className={cn(
        'border-3 border-brutal-black shadow-brutal',
        variant === 'primary' && 'bg-brutal-red',
        className
      )}
      {...props}
    />
  )
);
React + CSS Variables
// Uses: style prop with CSS variables, CSS modules
import styles from './Button.module.css';

export function Button({ variant = 'primary', ...props }) {
  return (
    <button
      className={`${styles.button} ${styles[variant]}`}
      style={{
        '--button-shadow': 'var(--shadow-md)',
        '--button-border': 'var(--border-width) solid var(--color-border)',
      }}
      {...props}
    />
  );
}
Vue 3 + Composition API
<script setup lang="ts">
interface Props {
  variant?: 'primary' | 'secondary';
  size?: 'sm' | 'md' | 'lg';
}

const props = withDefaults(defineProps<Props>(), {
  variant: 'primary',
  size: 'md',
});

const classes = computed(() => [
  'border-3 border-brutal-black shadow-brutal',
  props.variant === 'primary' && 'bg-brutal-red',
  props.variant === 'secondary' && 'bg-brutal-cream',
]);
</script>

<template>
  <button :class="classes">
    <slot />
  </button>
</template>
Svelte
<script lang="ts">
  export let variant: 'primary' | 'secondary' = 'primary';
  export let size: 'sm' | 'md' | 'lg' = 'md';
</script>

<button
  class="border-3 border-brutal-black shadow-brutal"
  class:bg-brutal-red={variant === 'primary'}
  class:bg-brutal-cream={variant === 'secondary'}
  on:click
>
  <slot />
</button>

アクセシビリティのパターン

フォーカス管理
// All interactive components include visible focus
'focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2'
'focus-visible:ring-brutal-blue'
キーボード操作
// Dropdown with keyboard support
function handleKeyDown(e: KeyboardEvent) {
  switch (e.key) {
    case 'ArrowDown': focusNext(); break;
    case 'ArrowUp': focusPrev(); break;
    case 'Escape': close(); break;
    case 'Enter': select(); break;
  }
}
ARIA 属性
// Dialog with proper ARIA
<div
  role="dialog"
  aria-modal="true"
  aria-labelledby="dialog-title"
  aria-describedby="dialog-description"
>

トレンド別のパターン

ネオブルータリズムのコンポーネント
// Hard shadows, bold borders, transform on interaction
'border-3 border-black shadow-brutal'
'hover:shadow-brutal-hover hover:-translate-x-0.5 hover:-translate-y-0.5'
'active:shadow-brutal-active active:translate-x-0.5 active:translate-y-0.5'
グラスモーフィズムのコンポーネント
// Frosted glass, subtle borders, backdrop blur
'bg-glass-white/10 backdrop-blur-glass'
'border border-glass-white/20'
'shadow-glass'
ターミナルのコンポーネント
// Monospace, green-on-black, CRT effects
'font-mono bg-term-bg text-term-green'
'border border-term-green/30'
'shadow-term-glow'

生成ワークフロー

1. design-system-generator → tokens (Tailwind/CSS)
2. component-template-generator → component code
3. Customize variants and props as needed
4. design-system-documenter → component docs

関連項目

参考資料
  • references/component-patterns.md - ネオブルータリズム、グラスモーフィズム、ターミナル、Web3、スイススタイルの完全なパターン
  • references/component-catalog.md - 新規:21st.dev のコンポーネント数(1400 以上のコンポーネント)
    • マーケティングブロック:ヒーロー 73 種、CTA 34 種、ナビゲーションメニュー 11 種、機能紹介 36 種
    • UI コンポーネント:ボタン 130 種、入力 102 種、カード 79 種、アコーディオン 40 種
    • デザインシステムの参考資料:Elastic UI、HeroUI、Ariakit、shadcn
関連スキル
  • design-system-generator - まずトークンを生成します(24 のトレンド、31 のスタイル)
  • design-system-documenter - 生成したコンポーネントをドキュメント化します

コメント