Generates standalone HTML components and composes them into branded full pages from design systems, with embedded CSS, responsive design, and brand integration. Invoke via /html-page or /html-page-quick.
From brand-content-designnpx claudepluginhub camoa/claude-skills --plugin brand-content-designThis skill is limited to using the following tools:
references/html-components.mdreferences/html-design-guide.mdreferences/html-technical.mdreferences/web-style-constraints.mdProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Guides Payload CMS config (payload.config.ts), collections, fields, hooks, access control, APIs. Debugs validation errors, security, relationships, queries, transactions, hook behavior.
Create distinctive, branded HTML pages and standalone components from a design system.
HTML page creation is design-system-driven composition, not template filling. Each component is a standalone design artifact that works independently AND as part of a composed page. Every section should feel crafted by a senior designer — intentional, distinctive, unforgettable.
What you receive: A design system (canvas-philosophy.md + design-system.md) with design tokens, component catalog, and brand identity. What you create: Standalone HTML components + a composed single-file HTML page. The standard: Work that makes the viewer stop scrolling. Bold, distinctive, never generic.
This skill is invoked by /html-page and /html-page-quick commands. It receives:
components/ directoryreferences/web-style-constraints.mdGenerate individual standalone components. Each component:
<style>Assemble components into a single .html file:
:root<style> block (deduplicated from components)<script> when style requires it (scroll triggers, parallax)Before writing any HTML, internalize the design system:
design-system.md in the project, STOP and suggest /design-html first. If no brand-philosophy.md, suggest /brand-extract first. Never proceed with default/example values.references/web-style-constraints.mdBefore generating, ask: "Could this page belong to any brand?" If yes, push harder. Then ask: "What is the ONE thing someone will remember about this page?" — a dramatic type scale, a surprising color moment, an unexpected layout break. If you cannot name it, the design is not distinctive enough.
Incorporate:
Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and layered effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. The key is intentionality, not intensity — a Swiss design executed with mathematical precision is as powerful as a Memphis design executed with wild energy. Never apply "bold" uniformly; calibrate to the style.
Read the project's design-system.md and map ALL token sections to :root custom properties. This includes:
--color-primary, --color-secondary, --color-accent, --color-bg, --color-bg-alt, --color-text, --color-text-muted--font-heading, --font-body, --font-size-* scale--space-xs through --space-2xl--max-width, --border-radius, --min-tap-target--timing-fast, --timing-base, --timing-slow, --easing-default--color-error, --color-success, field/label/error stylingThe design-system.md is the single source of truth for all token values. Do not hardcode values — read them from the file.
Before generating any HTML, verify:
□ All colors use CSS custom properties from design-system.md (--color-primary, etc.)
□ No hardcoded hex values except #FFFFFF/#000000 for universal black/white
□ font-family from design-system.md, never "Inter", "Roboto", or "Arial" as defaults
□ If no design-system.md exists: STOP, suggest /design-html first
□ Background colors, accent colors, text colors all traced to design tokens
Never copy hex codes or font names from reference file examples into generated HTML. All visual values must flow from: design-system.md → CSS custom properties → component styles.
Dominant colors with sharp accents outperform timid, evenly-distributed palettes. Use --color-primary as the dominant voice (headings, CTAs, navigation active states), --color-accent as the sharp punctuation (links, hover states, highlights), and let --color-bg and --color-text do the quiet structural work. If the palette feels "even" — one color is not leading — push the primary harder or pull the secondary back.
Use Google Fonts via <link> with system font fallback stack:
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=FontName:wght@300;400;500;600;700&display=swap" rel="stylesheet">
Choose DISTINCTIVE fonts — never default to Inter, Roboto, or Arial. Every design system deserves fonts that match its personality.
{type}-{variant}.html (e.g., hero-centered.html)--min-tap-target size with adequate spacingEvery component MUST include conversion-ready metadata comments. These enable automated conversion to Drupal SDC, React, and other frameworks. Without them, the design-system-converter cannot identify components, props, or slots.
Component boundaries — wrap the entire component:
<!-- component: hero variant: centered -->
<section class="hero">
...
</section>
<!-- /component: hero -->
Props — place immediately BEFORE the element they annotate:
<!-- prop: headline type: string -->
<h1 class="hero__title">Your Headline</h1>
<!-- prop: show-badge type: boolean -->
Slots — wrap repeating or insertable content areas:
<!-- slot: features -->
<div class="feature-grid__list">
<div class="feature-grid__item">
<!-- prop: feature-title type: string -->
<h3>Feature Title</h3>
<!-- prop: feature-description type: string -->
<p>Description</p>
</div>
</div>
<!-- /slot: features -->
Icons — place before SVG elements:
<!-- icon: rocket -->
<svg>...</svg>
Supported prop types: string, boolean
These comments MUST appear in both standalone components AND composed pages. See Part 10 for preservation rules during page composition.
Each component scopes its styles using BEM-like class naming:
.hero { /* component root */ }
.hero__title { /* element */ }
.hero__title--large { /* modifier */ }
Components reference design tokens (not hardcoded values):
.hero {
background: var(--color-bg);
color: var(--color-text);
padding: var(--space-xl) var(--space-md);
font-family: var(--font-body);
}
Lucide icons (1,500+ icons) are available as inline SVG via a CLI script.
# Get inline SVG for one or more icons
node "$BRAND_CONTENT_DESIGN_DIR/scripts/html-icons.js" get rocket lightbulb shield
# Search by keyword
node "$BRAND_CONTENT_DESIGN_DIR/scripts/html-icons.js" search chart
# List icons in a category
node "$BRAND_CONTENT_DESIGN_DIR/scripts/html-icons.js" category business
# List all categories
node "$BRAND_CONTENT_DESIGN_DIR/scripts/html-icons.js" categories
The get command outputs each SVG on its own line prefixed with <!-- icon: {name} -->.
Icons use currentColor for stroke and inherit size from the parent container:
<div class="feature-grid__icon" aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<!-- paths from script output -->
</svg>
</div>
Control icon size and color through the container:
.feature-grid__icon {
width: 48px;
height: 48px;
color: var(--color-primary);
}
.feature-grid__icon svg {
width: 100%;
height: 100%;
}
aria-hidden="true" on the SVGrole="img" aria-label="Description" on the SVGRead references/web-style-constraints.md for the selected style and enforce:
Read the enforcement block and apply it to every component and composed page.
Mobile-first approach with 3 breakpoints:
/* Mobile: 375px (default) */
.component { /* base mobile styles */ }
/* Tablet: 768px */
@media (min-width: 768px) {
.component { /* tablet overrides */ }
}
/* Desktop: 1200px */
@media (min-width: 1200px) {
.component { /* desktop overrides */ }
}
Prefer CSS solutions. Use JS only when CSS cannot achieve the effect.
Focus the motion budget on one high-impact moment per page. One well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions on every element. Decide: is it the hero entrance, the stats counting up, or the card grid cascading in? Pick one, make it great, and keep the rest subtle.
transform, box-shadow, opacity transitions<details> + <summary> elementsscroll-snap-type for carousel-like sections@keyframes for loading, reveals, decorative motionscroll-behavior: smooth:focus-visible with custom outlinesSome styles (Kinetic, 3D/Immersive, Parallax effects) need vanilla JS:
// Intersection Observer for scroll reveals
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('revealed');
}
});
}, { threshold: 0.1 });
document.querySelectorAll('[data-reveal]').forEach(el => observer.observe(el));
Rules for JS:
prefers-reduced-motion — disable animations when setTypography is the primary design tool for HTML pages. Make bold choices:
NEVER converge on the same font choices across different page generations. If you generated a page with Space Grotesk last time, pick a different font this time. Each design system and page should feel independently designed. Vary display fonts, body fonts, weight distributions, and size scales between projects. The goal: if someone lined up 10 generated pages, they should look like they came from 10 different designers.
var(--space-xl) to var(--space-2xl) paddingbackground: linear-gradient(135deg, ...))box-shadow for elevationEvery generated page MUST pass these checks:
<header>, <nav>, <main>, <section>, <article>, <footer>:focus-visible on all interactive elements@media (prefers-reduced-motion: reduce) disables animations<html lang="en"><meta name="viewport" content="width=device-width, initial-scale=1">When using Neumorphism style, DOUBLE-CHECK contrast ratios. Soft shadows on similar backgrounds risk failing WCAG AA. Add explicit borders or increase shadow contrast if needed.
When assembling components into a full page, every component section MUST retain its metadata comments. This is the most critical requirement for framework convertibility.
Rules:
<!-- component: type variant: variant --> BEFORE the component's outermost HTML element<!-- /component: type --> AFTER the component's closing tag<!-- prop: name type: type --> immediately BEFORE the element it annotates<!-- slot: name --> / <!-- /slot: name --> around slot content areas<!-- Navigation --> or <!-- ====== HERO ====== -->Complete composed page structure:
<body>
<a href="#main" class="skip-link">Skip to main content</a>
<!-- component: nav variant: sticky -->
<header class="nav" role="banner">
<!-- prop: site-name type: string -->
<span class="nav__name">Site Name</span>
<!-- slot: menu -->
<nav role="navigation" aria-label="Main navigation">
<a href="#">Home</a>
</nav>
<!-- /slot: menu -->
</header>
<!-- /component: nav -->
<main id="main">
<!-- component: hero variant: centered -->
<section class="hero">
<!-- prop: headline type: string -->
<h1 class="hero__title">Page Title</h1>
<!-- prop: subheadline type: string -->
<p class="hero__subtitle">Subtitle text</p>
</section>
<!-- /component: hero -->
<!-- component: article-card-grid variant: 3-col -->
<section class="card-grid">
<!-- prop: section-title type: string -->
<h2>Latest Articles</h2>
<!-- slot: cards -->
<div class="card-grid__list">
<article class="card">
<!-- prop: card-image type: string -->
<img src="image.jpg" alt="Article">
<!-- prop: card-title type: string -->
<h3>Card Title</h3>
<!-- prop: card-excerpt type: string -->
<p>Excerpt text</p>
</article>
</div>
<!-- /slot: cards -->
</section>
<!-- /component: article-card-grid -->
</main>
<!-- component: footer variant: simple -->
<footer class="footer" role="contentinfo">
<!-- prop: copyright type: string -->
<p>© 2026 Brand Name</p>
</footer>
<!-- /component: footer -->
</body>
Every component in the page must have opening and closing component markers. No exceptions.
Also see references/html-technical.md for the full HTML boilerplate and additional technical specs.
:root custom properties.container, .sr-only, .skip-linkvar(--space-xl) 0 (desktop), var(--space-lg) 0 (mobile)Since Claude cannot generate actual images, use smart placeholders:
.hero__image-placeholder {
background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent) 100%);
aspect-ratio: 16/9;
border-radius: var(--border-radius);
/* Replace with actual image:
background: url('your-image.jpg') center/cover; */
}
aspect-ratio to maintain proportionsDesign components for future conversion to Drupal SDC, React, Canvas, and other frameworks. The metadata comments from Part 3 and Part 10 are what make conversion possible.
| HTML Metadata | Drupal SDC | React | Twig |
|---|---|---|---|
<!-- component: hero --> | Component directory name | Component file name | Template name |
<!-- prop: headline type: string --> | props.headline in schema | props.headline | {{ headline }} |
<!-- prop: featured type: boolean --> | Boolean prop | Conditional render | {% if featured %} |
<!-- slot: content --> | {% block content %} | children | {% block content %} |
<!-- /component: hero --> | Template boundary | Component boundary | Template boundary |
| CSS custom properties | SCSS variables | Theme tokens | Twig with attach_library |
hero, feature-grid, testimonials, cta.hero__title, .feature-grid__itemdata-reveal, data-parallax<img src="missing.jpg"><style> block (except CSS custom property overrides)<link> onlyLoad these reference files when generating:
references/html-design-guide.md — Design system philosophy and content type guidereferences/web-style-constraints.md — 21 style enforcement blocks for webreferences/html-components.md — 15 component types with HTML/CSS patternsreferences/html-technical.md — Technical specs, boilerplate, file formatFor design system fundamentals beyond this plugin's visual styles, use the dev-guides-navigator plugin:
Invoke /dev-guides-navigator with keywords like "design system recognition", "Bootstrap mapping", "Radix SDC", or "component classification". The navigator handles caching and disambiguation — never fetch dev-guides URLs directly.