Token导航 LogoToken导航TokenDH.com
前端设计external-servicegithub未标认证来源可访问clear审计提醒

create-element创建元素

Agent Skill

用于辅助前端页面、组件、样式和交互逻辑的开发与维护。它适合让 Agent 生成或审查 React、Next.js、Vue、Tailwind、CSS 等相关代码,整理组件结构,或定位布局和性能问题。使用时需要结合项目现有设计系统、路由和构建方式,避免只生成孤立片段;涉及页面改动时,应配合本地预览和构建检查确认视觉效果。

总安装

753

周安装

32

GitHub Stars

492

下载量

264
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

3

许可证

MIT

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:create-element(创建元素)
来源仓库:https://github.com/crafter-station/elements
仓库路径:skills/create-element
安装命令:
npx skills add https://github.com/crafter-station/elements --skill create-element
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。不同来源提供的安装方式可能略有差异;本站展示可直接复制的安装命令,安装前请核对来源页面。

skills.shnpx skills
npx skills add https://github.com/crafter-station/elements --skill create-element

简介

create-element 用于为 Elements 注册中心创建新组件,遵循 tryelements.dev 的设计规范。

  • 它集成 Context7 MCP 服务获取外部库文档(如 Radix UI),确保实现符合最新实践。
  • 适用于组件库维护和第三方集成,需先执行 bun run scaffold-element.ts 脚本初始化。
  • 实现后需运行 build:registry 更新注册表,并通过 bun run dev 验证组件可用性。
  • 适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

SKILL.md

Create Element

Creates new elements for the Elements registry (tryelements.dev).

Quick Start

Step 1: Scaffold
bun run .claude/skills/create-element/scripts/scaffold-element.ts <category> <name>

Step 2: Implement
Edit component following patterns in references/component-patterns.md

Step 3: Register
bun run build:registry && bun run dev

Context7 Integration (CRITICAL)

Before implementing any component with external dependencies, fetch the latest documentation:

Step 1: Resolve Library ID

mcp__context7__resolve-library-id
  libraryName: "radix-ui"
  query: "dialog component accessibility patterns"

Step 2: Query Specific Docs

mcp__context7__query-docs
  libraryId: "/radix-ui/primitives"
  query: "Dialog API controlled vs uncontrolled portal usage"

Common Libraries

LibraryQuery For
radix-uiPrimitives (Dialog, Dropdown, Tabs, Select)
next-themesTheme provider, useTheme hook, hydration
cmdkCommand palette patterns
class-variance-authorityCVA variant patterns
embla-carousel-reactCarousel implementation
lucide-reactIcon usage patterns

Element Types

TypeExampleWhen to Use
registry:uibutton, card, inputBase UI primitives
registry:blocktheme-switcher, polar-checkoutFeature-complete blocks
registry:examplebutton-demoUsage examples

References

Read these based on what you're doing:

Directory Structure

registry/default/blocks/{category}/{component-name}/
├── registry-item.json          # Metadata
├── components/
│   └── elements/
│       └── {component}.tsx     # Main component
└── routes/                     # Optional demo routes
    ├── layout.tsx
    └── page.tsx

Workflow Example: Theme Switcher Tabs

1. Scaffold

bun run .claude/skills/create-element/scripts/scaffold-element.ts theme theme-switcher-tabs

2. Fetch Docs

mcp__context7__resolve-library-id
  libraryName: "next-themes"
  query: "useTheme hook theme switching"

mcp__context7__query-docs
  libraryId: "/pacocoursey/next-themes"
  query: "useTheme setTheme resolvedTheme hydration"

3. Implement

Edit registry/default/blocks/theme/theme-switcher-tabs/components/elements/theme-switcher-tabs.tsx:

"use client";

import { useTheme } from "next-themes";
import { useEffect, useState } from "react";
import { cn } from "@/lib/utils";

export function ThemeSwitcherTabs({ className }: { className?: string }) {
  const { theme, setTheme } = useTheme();
  const [mounted, setMounted] = useState(false);

  useEffect(() => { setMounted(true); }, []);

  if (!mounted) return <div className="h-8 w-24 animate-pulse bg-muted rounded" />;

  return (
    <div data-slot="theme-switcher-tabs" className={cn("...", className)}>
      {/* Implementation */}
    </div>
  );
}

4. Update registry-item.json

{
  "name": "theme-switcher-tabs",
  "type": "registry:ui",
  "title": "Theme Switcher Tabs",
  "description": "Tab-based theme switcher with Light/Dark/System options",
  "registryDependencies": [],
  "dependencies": ["next-themes"],
  "files": [...],
  "docs": "Requires ThemeProvider. Tab-style theme switcher with system support."
}

5. Build & Test

bun run build:registry
bun run dev

Verification Checklist

  • registry-item.json has all required fields ($schema, name, type, title, description, files)
  • Component exports PascalCase function (e.g., export function ThemeSwitcherTabs)
  • Uses cn() for className merging
  • Has data-slot attribute on root element
  • Client components have "use client" directive
  • Hydration-safe if using theme/client state
  • bun run build:registry succeeds
  • Component renders correctly in dev
  • If new category: Provider grouping configured (see "Creating New Categories" section)

Commands

# Scaffold new element
bun run .claude/skills/create-element/scripts/scaffold-element.ts <category> <name>

# Build registry
bun run build:registry

# Development server
bun run dev

# Lint/format
bun run lint
bun run format

Common Patterns

Simple Component (No Dependencies)

import { cn } from "@/lib/utils";

interface BadgeProps extends React.ComponentProps<"span"> {}

export function Badge({ className, ...props }: BadgeProps) {
  return (
    <span
      data-slot="badge"
      className={cn("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold", className)}
      {...props}
    />
  );
}

With CVA Variants

import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";

const badgeVariants = cva("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold", {
  variants: {
    variant: {
      default: "bg-primary text-primary-foreground",
      secondary: "bg-secondary text-secondary-foreground",
      destructive: "bg-destructive text-white",
    },
  },
  defaultVariants: {
    variant: "default",
  },
});

interface BadgeProps extends React.ComponentProps<"span">, VariantProps<typeof badgeVariants> {}

export function Badge({ className, variant, ...props }: BadgeProps) {
  return (
    <span
      data-slot="badge"
      className={cn(badgeVariants({ variant, className }))}
      {...props}
    />
  );
}

export { badgeVariants };

With External Dependency (Radix)

"use client";

import * as DialogPrimitive from "@radix-ui/react-dialog";
import { cn } from "@/lib/utils";

export function Dialog({ children, ...props }: DialogPrimitive.DialogProps) {
  return <DialogPrimitive.Root {...props}>{children}</DialogPrimitive.Root>;
}

export function DialogTrigger({ className, ...props }: DialogPrimitive.DialogTriggerProps) {
  return <DialogPrimitive.Trigger data-slot="dialog-trigger" className={cn("", className)} {...props} />;
}

Pitfalls to Avoid

  • Don't forget "use client" for components using hooks
  • Don't hardcode colors - use CSS variables (text-foreground, bg-background)
  • Don't skip hydration handling for theme-dependent components
  • Don't use any types - properly type props
  • Don't forget to run build:registry after changes

Creating New Categories (Provider Grouping)

When creating a new category of components (not just a new component in an existing category), you must configure the provider system for proper landing page display. Otherwise, each component will appear as a separate "Coming Soon" card.

When This Applies

  • Creating a new integration (e.g., charts/, payments/, analytics/)
  • Adding multiple related components that should be grouped together
  • The category doesn't exist in the current provider list

Two-File Setup Required

1. src/lib/registry-loader.ts

Add grouping logic in getProviderFromName() (~line 53):

// Special case: chart components go to "charts" provider
if (
  name === "area-chart" ||
  name === "bar-chart-vertical" ||
  name === "heatmap-grid" ||
  name === "growth-stats"
) {
  return "charts";
}

Add provider metadata in getProviderMetadata() (~line 156):

charts: {
  displayName: "Charts",
  description: "Data visualization primitives - area charts, heatmaps, bar charts",
  category: "DATA VIZ",
  brandColor: "#14B8A6",
},

2. src/lib/providers.tsx

Add provider config in providerConfig (~line 46):

charts: {
  isEnabled: true,
  displayName: "Charts",
  description: "Data visualization primitives - area charts, heatmaps, bar charts",
  category: "Data Viz",
},

Add provider icon in ProviderIcon() (~line 196):

charts: <ChartIcon className="w-10 h-10" />,

Create the icon at src/components/icons/{provider}.tsx if needed.

Provider Metadata Fields

FieldExamplePurpose
displayName"Charts"Landing page card title
description"Data visualization..."Card description
category"DATA VIZ"Badge shown on card
brandColor"#14B8A6"Diagonal hatch pattern color

Existing Providers (Reference)

Provider KeyDisplay NameCategory
clerkClerkUSER MGMT
polarPolarMONETIZATION
themeTheme SwitcherUI
logosBrand LogosBRAND
uploadthingUploadThingFILES
tinteTinteTHEMING
chartsChartsDATA VIZ

Naming Convention

The default extraction uses the first part before hyphen:

  • clerk-sign-inclerk
  • polar-checkoutpolar

Add special cases when:

  • Components share a category but have different prefixes (e.g., area-chart, heatmap-grid)
  • You want a custom provider name (e.g., theme-switcher-*theme)

MDX Documentation Setup

New categories also need MDX documentation files for the docs pages to render properly:

1. Create Demo Components

For each component, create a demo in /registry/default/examples/{component}-demo.tsx:

"use client";

import { MyComponent } from "@/registry/default/blocks/{category}/{component}/components/elements/{component}";

export default function MyComponentDemo() {
  return (
    <div className="flex items-center justify-center p-4">
      <MyComponent />
    </div>
  );
}

2. Register in MDX Components

Add imports and mappings in /src/mdx-components.tsx:

// Add import
import MyComponentDemo from "@/registry/default/examples/my-component-demo";

// Add to getMDXComponents return object
MyComponent: MyComponentDemo,

3. Create Provider MDX

Create /src/content/providers/{provider}.mdx:

---
title: My Provider
description: Description of the category
category: CATEGORY TAG
brandColor: "#hexcolor"
---

## Overview

Brief description.

## Components

### Component Name

<ComponentPreviewItem
  componentKey="component-name"
  installUrl="@elements/component-name"
  category="Category"
  name="Component Name"
>
  <ComponentName />
</ComponentPreviewItem>

4. Create Component MDX Files

Create /src/content/components/{provider}/{component}.mdx for each component:

---
title: Component Name
description: Brief description
---

<ComponentPreviewItem
  componentKey="component-name"
  installUrl="@elements/component-name"
  category="Category"
  name="Component Name"
>
  <ComponentName />
</ComponentPreviewItem>

## Overview

## Installation

## Usage

## Props

## Features

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

04

需要参考平台分布和安装热度时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

补充不同宿主或平台的使用分布数据

能力 5

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Claude Code

32.37%
按下载量换算85

OpenCode

21.8%
按下载量换算58

windsurf

18.62%
按下载量换算49

Antigravity

12.04%
按下载量换算32

Codex

7.69%
按下载量换算20

Gemini CLI

3.56%
按下载量换算9

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

可疑

权限和风险

external-service

该 Skill 可能调用第三方服务、云服务或外部模型 API,使用前需要确认账号、额度、数据发送范围和服务条款。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。来源安全扫描存在 warning/failed 结果,不能写成本站确认安全。

来源信息

继续浏览同类 Skills