Claude-skill-registry astro-components

UI component library for Astro lead generation sites. Buttons, forms, cards, badges. Requires design-tokens skill.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/astro-components" ~/.claude/skills/majiayu000-claude-skill-registry-astro-components && rm -rf "$T"
manifest: skills/data/astro-components/SKILL.md
source content

Astro Components Skill

Purpose

Provides reusable UI components. Does NOT handle sections, layouts, or business logic.

Scope

✅ Use For❌ NOT For
Marketing sitesWeb apps
Lead gen pagesDashboards
Service websitesE-commerce carts

Core Rules

  1. All styling via design-tokens — No hardcoded colors/spacing
  2. Token missing = build error — Never fallback to arbitrary values
  3. Mobile-first — Base styles for mobile,
    md:
    for larger
  4. 44px minimum touch targets — All interactive elements
  5. Zero external dependencies — Pure Astro + Tailwind only

Semantic HTML Rules

ElementUseNever
<button>
Actions, toggles
<div onclick>
<a>
Navigation
<span onclick>
<input>
Form dataContenteditable div

Rule: If it does something →

<button>
. If it goes somewhere →
<a>
.

Component Variants

Fixed variants only. Claude cannot invent new variants.

ComponentAllowed Variants
Button
primary
,
secondary
,
outline
,
ghost
Card
default
,
elevated
,
outlined
Badge
default
,
success
,
warning
,
error
,
info
Alert
info
,
success
,
warning
,
error

New variant needed? → Update this skill first, then use.

Props Pattern (All Components)

interface Props {
  variant?: 'primary' | 'secondary';  // Explicit union, no string
  size?: 'sm' | 'md' | 'lg';          // Fixed sizes only
  class?: string;                      // Allow extension
  // ... component-specific
}

const { variant = 'primary', size = 'md' } = Astro.props;

JavaScript Rules

AllowedForbidden
client:visible
islands
Inline
onclick
Astro actions
<script>
in component
Separate
.ts
files
Any DOM manipulation

Exception: None. If JS needed, use island architecture.

Icon Handling

// If icon name not found → render nothing + console.warn
const path = icons[name];
if (!path) {
  console.warn(`Icon "${name}" not found`);
  return null;
}

No silent failures. Missing icon = visible warning in dev.

Form Components

RuleRequirement
LabelAlways visible, linked via
for
PlaceholderHint only, never replaces label
ErrorBelow input,
role="alert"
RequiredVisual indicator (
*
) +
required
attr

Component Boundaries

Components must NOT:

  • Fetch data
  • Format/transform data
  • Access global state
  • Import other components (except Icon)
  • Contain business logic

Rule: Component receives props → renders UI. Nothing else.

File Structure

src/components/ui/
├── Button.astro
├── Input.astro
├── Card.astro
├── Badge.astro
├── Alert.astro
├── Icon.astro
└── index.ts

Forbidden

  • ❌ External UI libraries
  • ❌ Hardcoded colors/spacing
  • ❌ Touch targets under 44px
  • ❌ Missing focus states
  • ❌ Inline JavaScript
  • ❌ Inventing new variants
  • ❌ Silent failures

References

Definition of Done

  • Uses design-tokens only
  • All interactive: focus states + 44px touch
  • TypeScript Props interface
  • No inline JavaScript
  • Tested on mobile 375px