Implement a reusable, accessible, typed component from a design spec.

MITAuto-check: notesFrontend & Design

Install Prism Component

skills CLI
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill prism-component -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jeremylongshore/tons-of-skills-marketplace prism-component --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/ai-agency/tonone/skills/prism-component .claude/skills/prism-component && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
prism-component
GitHub stars
2.8k
Token cost
~2.6k tokens
SKILL.md length
603 words
Files
2
Skills in repo
3,342
Repo updated
First seen
Licence
MIT

At a glance

Implement a reusable, accessible, typed component from a design spec.

  • Works in 6 steps: Read the Environment → Read the Spec → Define the Component API → …
  • Asked to create a component
  • SKILL.md covers Steps and Delivery
  • Calls python3; reaches w3.org

What it does

Prism Component is an agent skill from jeremylongshore/tons-of-skills-marketplace. Implement a reusable, accessible, typed component from a design spec. Use when asked to "create a component", "build a widget", "implement this design", or "reusable UI element".

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `.claude-plugin/plugin.json`).

It sits in Frontend & Design. It works with TypeScript. The repository describes itself as: Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com. The licence is MIT.

When your agent uses it

  • Asked to create a component
  • Implement this design
  • Reusable UI element

Example prompts

  • “create a component”
  • “build a widget”
  • “implement this design”
  • “/prism-component”

Requirements

  • Python 3
  • Pre-approved tools (allowed-tools): Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Read the Environment
  2. Read the Spec
  3. Define the Component API
  4. Write the Implementation
  5. Write the Tests
  6. Summarize

What it can do on your machine

Read from SKILL.md and the folder at commit cfae287. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Write
    • Edit
    • Bash
    • Glob
    • Grep
    • WebFetch
    • WebSearch
    • Task
    • TodoWrite

    …and 1 more on the same allowed-tools line.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • w3.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Prism Component loads about 2.6k tokens when it runs. Until then it costs about 49 tokens; SKILL.md has 603 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~49
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jeremylongshore/tons-of-skills-marketplace at commit cfae287, republished under its MIT licence (© jeremylongshore). 603 words, ~2,566 tokens.

Download SKILL.mdSave it as .claude/skills/prism-component/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
prism-component
description
Implement a reusable, accessible, typed component from a design spec. Use when asked to "create a component", "build a widget", "implement this design", or "reusable UI element".
allowed-tools
Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion
version
0.6.4
author
tonone-ai <hello@tonone.ai>
license
MIT

Implement a Component

You are Prism — the frontend and developer experience engineer from the Engineering Team. You implement what Form designs. Given a component description and design tokens, you write the component — not a spec about the component, not pseudo-code, the actual implementation that lands in the codebase.

Follow the output format defined in docs/output-kit.md — 40-line CLI max, box-drawing skeleton, unified severity indicators, compressed prose.

Steps

Step 0: Read the Environment

Before writing a line:

  1. Check package.json — framework, styling approach, existing component libraries, Radix/Headless UI presence
  2. Check for TypeScript: tsconfig.json
  3. Check for design tokens: tailwind.config.*, CSS custom property files, Form's token output
  4. Scan src/components/, components/, ui/ — adopt naming conventions, file structure, and patterns exactly
  5. Check for test setup: Vitest, Jest, Testing Library

If no existing components exist, use framework conventions. Default stack if greenfield: React + TypeScript + Tailwind + Radix primitives.

Stop if design tokens are missing. Ask Form for the token file before implementing. Do not invent color or spacing values.

Design Intelligence (via uiux)

After detecting the project framework (Step 0), load stack-specific guidelines and icon references:

bash
python3 -m prism_agent.uiux search --domain stacks --query "{detected_framework}" --limit 3
python3 -m prism_agent.uiux search --domain icons --query "{component_type}" --limit 5

Use results to:

  • Follow framework-specific component patterns (e.g., React composition vs Vue slots)
  • Select appropriate icons from the Phosphor Icons catalog
  • Apply stack-specific accessibility and performance guidelines
Step 1: Read the Spec

Identify what Form has specified:

  • Which tokens apply (color, spacing, radius, typography)
  • What variants exist (e.g., primary/secondary/destructive, sm/md/lg)
  • What the component looks like in default, hover, focus, active, disabled states
  • Any explicit behavior notes

If spec covers these, implement directly. If states are missing, implement reasonable defaults using the token system and flag what you assumed.

Clarify only if genuinely blocked — one targeted question, not a design review request. Don't ask "what should the hover state look like" if there's a --color-primary-hover token in the system.

Step 2: Define the Component API

Before writing the implementation, define the prop interface:

  • Small surface area — every prop earns its place
  • Discriminated unions for variants, not boolean flags: variant: 'primary' | 'secondary' | 'destructive', not isPrimary isPrimary isDestructive
  • Composition over configuration — children and slots over title/subtitle/icon/footer props
  • Sensible defaults — the component works with minimal props
  • Forward refs on components that wrap native elements
  • Typed callbacks for all user interactions
typescript
// Good
type ButtonProps = {
  variant?: "primary" | "secondary" | "destructive" | "ghost";
  size?: "sm" | "md" | "lg";
  loading?: boolean;
  disabled?: boolean;
  children: React.ReactNode;
} & React.ButtonHTMLAttributes<HTMLButtonElement>;

// Bad
type ButtonProps = {
  isPrimary?: boolean;
  isSecondary?: boolean;
  isDestructive?: boolean;
  isSmall?: boolean;
  showSpinner?: boolean;
  spinnerPosition?: "left" | "right";
};
Show full SKILL.md (235 more words)Show less
Step 3: Write the Implementation

Write the complete component file. Not an excerpt — the file that ships.

All required states:

  • Default — renders correctly with token values applied
  • Loading — skeleton or inline spinner; use aria-busy="true"
  • Error — inline error with descriptive text; don't just change color
  • Empty — helpful message, not silence
  • Disabled — disabled attribute + aria-disabled, visually distinct via token (not opacity alone)
  • Hover / Focus / Active — handled via Tailwind variants or CSS custom properties

Accessibility (non-negotiable):

  • Semantic HTML first — <button>, <a>, <input>, <select> before <div role="...">
  • ARIA roles only where semantic HTML is insufficient
  • All interactive elements keyboard-reachable and operable
  • Focus visible — never outline: none without a replacement ring
  • Screen reader text for icon-only controls: <span className="sr-only">Label</span>
  • aria-live regions for dynamic content updates
  • Follow WAI-ARIA Authoring Practices for the pattern (listbox, combobox, dialog, etc.)

Token discipline:

  • Every color, spacing, radius, and font value maps to a design token
  • No hardcoded hex values, raw pixel spacing, or ad hoc font sizes
  • Semantic names: bg-[--color-primary] not bg-blue-600

Example — Button (React + TypeScript + Tailwind):

tsx
import * as React from "react";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";

const buttonVariants = cva(
  "inline-flex items-center justify-center gap-2 rounded-[--radius-md] font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[--color-focus] focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
  {
    variants: {
      variant: {
        primary:
          "bg-[--color-primary] text-[--color-primary-fg] hover:bg-[--color-primary-hover]",
        secondary:
          "bg-[--color-surface-2] text-[--color-text] hover:bg-[--color-surface-3]",
        destructive:
          "bg-[--color-danger] text-[--color-danger-fg] hover:bg-[--color-danger-hover]",
        ghost: "hover:bg-[--color-surface-2] text-[--color-text]",
      },
      size: {
        sm: "h-8 px-3 text-sm",
        md: "h-9 px-4 text-sm",
        lg: "h-11 px-6 text-base",
      },
    },
    defaultVariants: { variant: "primary", size: "md" },
  },
);

export type ButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> &
  VariantProps<typeof buttonVariants> & {
    loading?: boolean;
  };

const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
  (
    { className, variant, size, loading, disabled, children, ...props },
    ref,
  ) => (
    <button
      ref={ref}
      className={cn(buttonVariants({ variant, size }), className)}
      disabled={disabled || loading}
      aria-busy={loading || undefined}
      {...props}
    >
      {loading && (
        <svg
          className="h-4 w-4 animate-spin"
          xmlns="http://www.w3.org/2000/svg"
          fill="none"
          viewBox="0 0 24 24"
          aria-hidden="true"
        >
          <circle
            className="opacity-25"
            cx="12"
            cy="12"
            r="10"
            stroke="currentColor"
            strokeWidth="4"
          />
          <path
            className="opacity-75"
            fill="currentColor"
            d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
          />
        </svg>
      )}
      {children}
    </button>
  ),
);
Button.displayName = "Button";

export { Button, buttonVariants };
Step 4: Write the Tests

Write tests using the project's test setup (default: Vitest + Testing Library):

typescript
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import { Button } from './Button'

describe('Button', () => {
  it('renders with required props', () => {
    render(<Button>Save</Button>)
    expect(screen.getByRole('button', { name: 'Save' })).toBeInTheDocument()
  })

  it('is disabled and aria-busy when loading', () => {
    render(<Button loading>Save</Button>)
    const btn = screen.getByRole('button')
    expect(btn).toBeDisabled()
    expect(btn).toHaveAttribute('aria-busy', 'true')
  })

  it('disabled button does not fire onClick', async () => {
    const user = userEvent.setup()
    const onClick = vi.fn()
    render(<Button disabled onClick={onClick}>Delete</Button>)
    await user.click(screen.getByRole('button'))
    expect(onClick).not.toHaveBeenCalled()
  })

  it('is keyboard operable', async () => {
    const user = userEvent.setup()
    const onClick = vi.fn()
    render(<Button onClick={onClick}>Save</Button>)
    await user.tab()
    await user.keyboard('{Enter}')
    expect(onClick).toHaveBeenCalledOnce()
  })
})

Cover: renders correctly, all states, keyboard interaction, accessibility assertions.

Step 5: Summarize
┌─ Component: [Name] ─────────────────────────────────────────┐
│ File: [path]                                                  │
│ Stack: [framework + styling approach]                         │
│                                                               │
│ API                                                           │
│   Variants: [list]                                           │
│   Key props: [list]                                          │
│   Composition: children / slots / compound                    │
│   Ref forwarding: yes / no                                    │
│                                                               │
│ States: default · loading · error · empty · disabled          │
│                                                               │
│ Tokens: [semantic token names used]                           │
│ Spec gaps filled: [assumed states — flag for Form if any]     │
│                                                               │
│ a11y: [keyboard model, ARIA roles/properties]                 │
│ Tests: [N] — [coverage summary]                               │
└──────────────────────────────────────────────────────────────┘

Delivery

If output exceeds the 40-line CLI budget, invoke /atlas-report with the full findings. The HTML report is the output. CLI is the receipt — box header, one-line verdict, top 3 findings, and the report path. Never dump analysis to CLI.

© jeremylongshore, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in plugins/ai-agency/tonone/skills/prism-component of jeremylongshore/tons-of-skills-marketplace.

  • SKILL.md
  • .claude-plugin/plugin.json

Open the folder on GitHubat commit cfae287

Compare with similar skills

Prism Component next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Prism Component compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Prism Component this skilljeremylongshore/tons-of-skills-marketplace2.8k—~2.6kAutomated safety check: NotesMIT
Web Artifacts Builderanthropics/skills180k40 repos~769Automated safety check: PassApache-2.0
Ink Tui Wizardnovuhq/novu40k—~1.9kAutomated safety check: PassMIT
Frontend Module Standardssiteboon/claudecodeui14k—~2.6kAutomated safety check: PassAGPL-3.0
Dify Component Writing Guidelanggenius/dify158k—~626Automated safety check: PassCustom licence
React Frontend Development Guidelinesdiet103/claude-code-infrastructure-showcase10k2 repos~2.9kAutomated safety check: PassMIT

Similar skills

  • Web Artifacts Builder

    anthropics/skills

    Official

    Builds multi-component claude.ai HTML artifacts as a small React, TypeScript and Tailwind project, then bundles it into one shareable HTML file.

    180k GitHub starsUsed in 40 repos~769 tokens
    Frontend & DesignAuto-check passed
  • Ink Tui Wizard

    novuhq/novu

    Build terminal user interfaces (TUIs) using Ink (React for CLIs) and @inkjs/ui with a reactive, session-driven wizard pattern.

    40k GitHub stars~1.9k tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • Frontend Module Standards

    siteboon/claudecodeui

    Enforces one repository's React and TypeScript module layout for code under src/: source-root imports, feature barrels, deliberate exports and no deep imports.

    14k GitHub stars~2.6k tokensUpdated 2 days ago
    Frontend & DesignAuto-check passed
  • Use when implementing or refactoring React/TypeScript components and the task requires decisions about component ownership, feature boundaries, state, data…

    158k GitHub stars~626 tokensUpdated today
    Frontend & DesignAuto-check passed
  • React Frontend Development Guidelines

    diet103/claude-code-infrastructure-showcase

    Guidelines for React 18 and TypeScript apps covering Suspense data fetching, lazy loading, feature folders, MUI v7 styling, TanStack Router and performance.

    10k GitHub starsUsed in 2 repos~2.9k tokens
    Frontend & DesignAuto-check passed
  • Formik Form Patterns

    ChrisWiles/claude-code-showcase

    Shows how to build forms with Formik and Yup validation, including conditional rules, field helpers, GraphQL submission, edit forms and multi-step flows.

    6.1k GitHub starsUsed in 3 repos~2.1k tokens
    Frontend & DesignAuto-check passed

More from jeremylongshore/tons-of-skills-marketplace

All 3,342 skills in this repo
  • Performing Security Code Review

    jeremylongshore/tons-of-skills-marketplace

    Execute this skill enables AI assistant to conduct a security-focused code review using the security-agent plugin.

    2.8k GitHub starsUsed in 2 repos~1.3k tokens
    Auto-check: notes
  • Adapting Transfer Learning Models

    jeremylongshore/tons-of-skills-marketplace

    Build this skill automates the adaptation of pre-trained machine learning models using transfer learning techniques.

    2.8k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Agent Context Loader

    jeremylongshore/tons-of-skills-marketplace

    Execute proactive auto-loading: automatically detects and loads agents.md files.

    2.8k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Aggregating Performance Metrics

    jeremylongshore/tons-of-skills-marketplace

    Aggregate and centralize performance metrics from applications, systems, databases, caches, and services.

    2.8k GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Analyzing Capacity Planning

    jeremylongshore/tons-of-skills-marketplace

    Execute this skill enables AI assistant to analyze capacity requirements and plan for future growth.

    2.8k GitHub stars~947 tokensUpdated today
    Auto-check passed
  • Analyzing Database Indexes

    jeremylongshore/tons-of-skills-marketplace

    Process use when you need to work with database indexing. An agent skill from jeremylongshore/tons-of-skills-marketplace.

    2.8k GitHub stars~2k tokensUpdated today
    Auto-check passed

Works with

Questions about Prism Component

What does Prism Component do?

Implement a reusable, accessible, typed component from a design spec. Prism Component is an agent skill from jeremylongshore/tons-of-skills-marketplace. Implement a reusable, accessible, typed component from a design spec.

When should I use Prism Component?

Prism Component fits situations like: asked to create a component; implement this design; reusable UI element.

How do I install Prism Component in Claude Code?

Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill prism-component -a claude-code`. Or copy the skill folder (plugins/ai-agency/tonone/skills/prism-component in jeremylongshore/tons-of-skills-marketplace) into .claude/skills/prism-component in your project. Claude Code loads it when a task matches its description.

How do I install Prism Component in Codex?

Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill prism-component -a codex`. Or copy the skill folder (plugins/ai-agency/tonone/skills/prism-component in jeremylongshore/tons-of-skills-marketplace) into .agents/skills/prism-component in your project. Codex loads it when a task matches its description.

Can I use Prism Component in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill prism-component -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/prism-component, .gemini/skills/prism-component, .github/skills/prism-component and .opencode/skills/prism-component in your project.

What does Prism Component need to run?

Going by SKILL.md and its folder, Prism Component needs the command-line tools its instructions call (python3). Our summary lists: Python 3. Its frontmatter pre-approves these tools: Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, Task, TodoWrite, AskUserQuestion.

Does Prism Component access the network?

SKILL.md names 1 domain. In commands or code: w3.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Prism Component safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Prism Component use?

Prism Component is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Prism Component use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Prism Component?

Skills that share tags, products or a category with Prism Component: Web Artifacts Builder (anthropics/skills, 180k stars), Ink Tui Wizard (novuhq/novu, 40k stars), Frontend Module Standards (siteboon/claudecodeui, 14k stars) and Dify Component Writing Guide (langgenius/dify, 158k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Prism Component?

jeremylongshore (a GitHub user) maintains it in jeremylongshore/tons-of-skills-marketplace, which has 2,827 GitHub stars. The repository holds 3,342 skills in this directory. The repository was last updated on October 10, 2026.

Source: jeremylongshore/tons-of-skills-marketplace on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.