Skip to content
component-scaffolding logo

Component Scaffolding

component-scaffolding

Generate Drupal/Twig component skeletons with web components and Miyagi validation. Use when user requests to create, scaffold, or add a new component at a specific path (e.g., "add component skeleton at patterns/share-button"), or when creating component files including Twig templates, CSS, Java...

SKILL.md

Full skill instructions

Component Scaffolding

Generate component skeletons for a Drupal theme using Twig, web components, and Miyagi for validation.

Trigger Phrases

  • "Add component skeleton at patterns/​..."
  • "Create new component..."
  • "Scaffold component..."
  • Creating/​updating schema.yaml or mocks.yaml files

Configuration

Component Library Root

This skill assumes it lives within a component library project, e.g.:

apps/​component-library/
├── .claude/
│   └── skills/
│       └── component-scaffolding/   ← this skill
├── src/
│   ├── components/
│   └── css/
└── <theme-name>.libraries.yml

The component library root is three levels up from this skill (i.e., ../​../​.. relative to this SKILL.md).

Theme Name Discovery

The <theme-name> placeholder must be replaced with the actual Drupal theme name. To determine it:

  1. Navigate to the component library root
  2. Find the *.libraries.yml file — the filename prefix is the theme name
  3. Example: circle_dot.libraries.yml → theme name is circle_dot

If the theme name cannot be determined from existing files, ask the user.

File Templates

1. Twig Template: <component-name>.twig

{{ attach_library("<theme-name>/​pattern-<component-name>") }}

<div class="<ComponentName>">
	{# Component implementation #}
</​div>
  • Library name: pattern-<component-name> (kebab-case)
  • CSS class: <ComponentName> (PascalCase)
  • Single tab indentation

2. CSS: <component-name>.css

/​** @define <ComponentName>; */

.<ComponentName > {
  /​* Component styles */
}
  • PascalCase in @define comment
  • Tab indentation

3. JavaScript: <component-name>.js

Only create if explicitly needed. Skip if user says "no JavaScript", "CSS only", etc.

// @ts-check

class <ComponentName> extends HTMLElement {
	constructor() {
		super();
	}

	connectedCallback() {
		this.#addEventListeners();
	}

	/​**
	 * Add event listeners
	 */
	#addEventListeners() {
		// Add event listeners here
	}
}

customElements.define("<component-name>", <ComponentName>);
  • PascalCase class name
  • NO prefix on custom element name (use kebab-case directly)
  • Only #addEventListeners() method in skeleton
  • NO #elements field or #getElements() method

4. Schema: schema.yaml

$schema: http://json-schema.org/​draft-07/​schema#
$id: /<tier>/<component-name>

type: object

required:
  - property1

additionalProperties: false
properties:
  • $id matches component tier path
  • Include required array with placeholder names
  • Leave properties: empty in skeleton
  • 2-space indentation (YAML standard)

For detailed schema patterns, see references/​schema-and-mocks.md.

5. Mocks: mocks.yaml

  • Single blank line only in skeleton
  • User adds their own mock data later

For mock data patterns, see references/​schema-and-mocks.md.

6. CSS Entry Point: src/​css/<component-name>.css

@import url("../​components/<tier>/<component-name>/<component-name>.css")
layer(components);

Note: If the component is an element, you can use the elements.css entry point instead.

7. Library Definition: <theme-name>.libraries.yml

Add entry alphabetically within the appropriate tier section:

pattern-<component-name>:
  header: true
  css:
    component:
      build/​assets/​css/<component-name>.css: {}
  js:
    build/​assets/​components/<tier>/<component-name>/<component-name>.js:
      attributes:
        type: module
  • Omit the js: block entirely if no JavaScript file is created
  • Maintain blank line between library definitions
  • Omit the css: block entirely if the component is an element

Naming Conventions

ItemFormatExample
Directory/​fileskebab-caseshare-button
CSS classPascalCaseShareButton
JS classPascalCaseclass ShareButton
Custom elementkebab-case, NO prefixshare-button
Library name<prefix>-<kebab>pattern-share-button
Schema $id/<tier>/<kebab>/​patterns/​share-button

Component Tiers

TierLocationLibrary Prefix
Elementssrc/​components/​elements/element-
Patternssrc/​components/​patterns/pattern-
Template Componentssrc/​components/​template-components/template-component-
Templatessrc/​components/​templates/template-

Workflow

  1. Create component directory: src/​components/<tier>/<component-name>/
  2. Create component files (twig, css, schema.yaml, mocks.yaml, and js only if needed)
  3. Create CSS entry point: src/​css/<component-name>.css
  4. Add library definition to <theme-name>.libraries.yml (alphabetically in tier section)
  5. Run linters to verify

Optional Files

Pay attention to user requests indicating which files to skip:

User saysAction
"no JavaScript" / "CSS only"Skip .js file, omit js: from library
"no CSS" / "JavaScript only"Skip .css files, omit css: from library
"schema only" / "just the schema"Create only schema.yaml

Notes

  • Skeletons provide structure, not functionality
  • All files use tabs except YAML (2 spaces)
  • Run linters after creation to verify

More skills from majiayu000

xiaohongshu logo
majiayu000/claude-arsenal

xiaohongshu

xiaohongshu

286 148
View
agent-task-conductor logo
majiayu000/claude-skill-registry

agent-task-conductor

Conduct multi-agent task orchestration and workflow coordination.

663 1
View
conductor-setup logo
majiayu000/claude-skill-registry

conductor-setup

Initialize project with Conductor artifacts (product definition,

663 1
View
animation-designer logo
majiayu000/claude-skill-registry

animation-designer

Expert in web animations, transitions, and motion design using Framer Motion and CSS

663 1
View
diagramming logo
majiayu000/claude-skill-registry

diagramming

Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...

663 1
View
h3-pg logo
majiayu000/claude-skill-registry-data

h3-pg

PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.

23 1
View
conductor-development logo
majiayu000/claude-skill-registry

conductor-development

Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...

663 1
View
conductor-status logo
majiayu000/claude-skill-registry

conductor-status

Display project status, active tracks, and next actions

663 1
View
dockerization logo
majiayu000/claude-skill-registry

dockerization

Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.

663 1
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View