Creating, updating, editing, or deleting marketing/public pages in the Resend codebase. Covers page structure, component reuse rules, and the distinction between public and product design systems.
npx -y skills add resend/design-skills --skill marketing-pages --agent claude-codeInstalls into .claude/skills of the current project.
Marketing pages live in src/app/(website)/. Product pages live in src/app/(dashboard)/. This skill covers the (website) route group only.
Before writing any component, search for an existing one. The codebase has two separate component systems — never mix them.
| System | Path | Use for |
|---|---|---|
| Product UI | src/ui/ | Dashboard/authenticated pages only |
| Public primitives | src/website/ | Marketing pages typography, buttons |
| Public compositions | src/components/website/ | Marketing feature sections |
| Page structure | src/components/public-page.tsx | Every marketing page layout |
Every marketing page must follow this composition:
import * as PublicPage from '@/components/public-page';
export default function MyPage() {
return (
<>
<script type="application/ld+json" ... /> {/* SEO JSON-LD */}
<PublicPage.Root>
<PublicPage.Header />
<MyPageHero /> {/* or PublicPage.Hero */}
<PublicPage.Container>
{/* feature sections */}
<CallToAction />
</PublicPage.Container>
<PublicPage.Footer />
</PublicPage.Root>
</>
);
}
src/website/)Use these instead of src/ui/ equivalents on marketing pages:
PublicHeading — sizes 1–6, colors: white | gradientPublicText — sizes 1–5, colors: white | gray | gradient, weights: normal | medium | semibold | boldPublicButton — appearances: white (default) | black | black-fade | fade | red; sizes: 2 | 3 | 4; supports asChild, iconLeft, iconRightPublicPage.accordion — accordion sectionsPublicPage.avatar — avatar componentsSee references/components.md for full APIs and src/components/website/ inventory.
export const metadata: Metadata = {
alternates: { canonical: '/your-path' },
title: 'Page Title · Resend',
description: '...',
openGraph: { images: [{ url: '/static/cover-image.jpg' }] },
};
Always add JSON-LD structured data using getCompanyJsonLd() from @/utils/json-ld and getBaseUrl() from @/utils/base-url.
src/app/(website)/your-page/page.tsxPublicPage.Root/Header/Container/Footer structuresrc/components/product-pages/your-page/ or reuse from src/components/website/metadata export and JSON-LD scriptsrc/components/public-page.tsx if neededsrc/app/(website)/your-page/ directorysrc/components/product-pages/your-page/ if page-specificnext.config.ts if the URL was publicsrc/styles/website.css (loaded via (website)/layout.tsx)src/ui/ classes may conflict — always prefer src/website/ primitivesreferences/components.md — Full component inventory with props and import pathsmindrally/skills
giuseppe-trisciuoglio/developer-kit
syncfusion/react-ui-components-skills
supercent-io/skills-template
binjuhor/shadcn-lar