--- name: react-bits-pro description: > Install and integrate React Bits Pro components, marketing blocks, App UI blocks, Agent Kit skills and landing-page templates into React/Next.js apps via the shadcn registry CLI with license-key auth. Use whenever the user wants animated components (WebGL/shader backgrounds, GSAP and Motion animation, 3D, cursor trails, text effects, cards, carousels, galleries), marketing sections (hero, features, pricing, navigation, footer, FAQ, CTA, auth, stats, blog, contact, social proof, about, waitlist, showcase, how-it-works, download, ecommerce, bento grids and Bento Builder), app interface blocks (app shells, sidebars, dashboards, data tables, analytics, command menus, settings, dialogs, kanban, billing, onboarding) or AI/agent surfaces (chat, prompt inputs, tool calls, agent plans, approvals, usage), landing-page templates, or Agent Kit design skills, page prompts and recipes. Also use when integrating these into an existing page or design system, or on "react bits", "reactbits", "@reactbits-starter", "@reactbits-pro", "app ui" or "agent kit". license: Proprietary compatibility: > React 18 or 19. Next.js 14+ (App Router recommended) or any React framework that supports client components. Tailwind CSS v4 strongly recommended for blocks (they use v4 utility names). Node.js 18+ for the shadcn CLI. metadata: author: reactbits version: "3.1" --- # React Bits Pro Integration You are integrating **React Bits Pro**, a premium shadcn-compatible registry of: - **150 animated components** (Starter tier and above) - **280 marketing blocks** in 22 categories (**Pro tier and above**), including 42 composable Bento tiles - **300 App UI blocks** in 38 categories (**Pro tier and above**) - **20 Agent Kit items**: design skills, page prompts, recipes and the setup skill (**Pro tier and above**, one free; setup skill available on Starter) - **15 landing-page templates** (**Ultimate tier**, one free) Items install as real source files into the user's project; the user owns and can edit them. **September 2026 adds 16 components, 42 Bento tiles, the Bento Builder, and four templates:** Agentframe, Cloudlight, Imageworks and Sparkdesign. The catalogs below include all of them. **Tier matters before you install anything.** Components are Starter. Marketing blocks, App UI blocks and the Agent Kit all require **Pro or Ultimate**. Included template downloads require **Ultimate**, with free and individual-purchase options described below. Installing a Pro item with a Starter key returns `403`, not a confusing build error, so check the tier first and tell the user plainly if their plan does not cover what they asked for. This document is the single source of truth. Follow it literally. Where it says "verify," verify: do not guess. --- ## Golden rules (read first, never break these) 1. **Check the tier before installing.** Components are Starter+. **Marketing blocks, App UI blocks and the Agent Kit are Pro+.** Included template downloads are Ultimate. A Starter key on a Pro item returns `403 Forbidden`. If the user's plan does not cover the request, say so directly rather than retrying the install. 2. **Never guess a marketing block's import statement.** Marketing block files use a _mix_ of `export default` and named `export` styles, and the identifier does **not** reliably follow the slug (`404-3` exports `NotFound3`; `cta-3` exports `CTA3` but `cta-4` exports `Cta4`). After installing one, read its `export` line and import accordingly. See [Importing installed items](#importing-installed-items). **App UI blocks are the exception: all 300 are `export default`.** 3. **Components use a `-tw` or `-css` suffix; every kind of block uses no suffix.** `silk-waves-tw` is a component; `hero-1` is a marketing block; `ai-chat-1` is an App UI block. Mismatched names return 404. 4. **The license key is a secret.** Put it in `.env.local`, never commit it, never hardcode it. 5. **Never delete the `"use client"` directive.** Every component and block is a client component. 6. **WebGL/shader components need an explicitly sized parent** (a container with width and height). 7. **App UI blocks need a height-bounded parent.** Their root is `h-full min-h-[Npx]`; drop one into a parent with no height and its scroll areas collapse. See [App UI blocks](#app-ui-blocks-pro-tier). 8. **Always harmonize.** A block is a starting point, not a finished section. When you add a block to an existing page, match the host's type scale, colours, spacing, container width and radii. When you stack several blocks, reconcile them into one system before showing the result. Editing the installed source is expected. See [Harmonizing blocks](#harmonizing-blocks-never-skip-this). 9. **Do not overwrite the user's existing `components.json` fields**: only merge in `registries`. 10. **Templates are downloads, not CLI installs.** Ultimate includes template downloads; some are also available free or through individual purchase. See [Templates](#templates-ultimate-tier). 11. **Bento tiles do not use the App UI theme.** Keep them outside `.rb-theme-scope` and do not apply App UI accent, base, font or radius overrides to them. They still follow the site's normal light/dark mode. Customize a tile by editing its own source. --- ## TL;DR: fastest correct path ```bash # 0. (once) Ensure the project is a shadcn project with the cn() helper. npx shadcn@latest init # only if components.json is missing # 1. Add the license key to .env.local (never commit it): # REACTBITS_LICENSE_KEY=rbp...-your-key # 2. Merge the two registries into components.json (see Step 3 below). # 3. Install items (components take -tw/-css; all blocks take no suffix): npx shadcn@latest add @reactbits-starter/silk-waves-tw # component (Starter+) npx shadcn@latest add @reactbits-pro/hero-1 # marketing block (Pro+) npx shadcn@latest add @reactbits-pro/ai-chat-1 # App UI block (Pro+) npx shadcn@latest add @reactbits-pro/skill-swiss-grid # Agent Kit skill (Pro+) # 4. Open the installed file, read its `export` line, then import it: # components/react-bits/silk-waves.tsx -> export default -> import SilkWaves from "@/components/react-bits/silk-waves" # components/blocks/hero-1.tsx -> export function Hero1 -> import { Hero1 } from "@/components/blocks/hero-1" # components/blocks/ai-chat-1.tsx -> export default -> import AiChat1 from "@/components/blocks/ai-chat-1" ``` If `components.json` already has the `@reactbits-starter` registry, you can also pull this skill into the project as a local file: ```bash npx shadcn@latest add @reactbits-starter/skill # writes ./SKILL.md to the project root ``` --- ## When to use this skill Use it when the user wants to: - Add React Bits Pro components, blocks, or templates to a project. - Add animated UI (shaders, particles, 3D, WebGL, cursor effects, text/Motion/GSAP animations). - Drop in pre-built marketing sections (hero, pricing, features, navigation, footer, FAQ, CTA, etc.). - Build signed-in product UI: app shells, sidebars, dashboards, data tables, analytics, command menus, settings, billing, onboarding, kanban boards. - Build AI or agent interfaces: chat, prompt inputs, tool calls, agent plans, approvals, usage. - Assemble a landing page quickly from premium blocks. - Compose an animated bento grid or use the Bento Builder's generated code or agent prompt. - Add a section to a page they already have, and make it match the existing design. - Install an Agent Kit design skill, page prompt or full-page recipe. - Mention "react bits", "reactbits", "@reactbits-starter", "@reactbits-pro", "app ui", or "agent kit". Do **not** use it to build generic shadcn/ui primitives (button, dialog, etc.). Those come from the standard shadcn registry, not React Bits Pro. --- ## Architecture overview React Bits Pro ships through the **shadcn registry protocol** over two license-authenticated registries: | Registry | Contains | Min. tier to install | Install prefix | | -------------------- | ---------------------------------------------------- | ------------------------ | ---------------------------------------- | | `@reactbits-starter` | 150 animated components (each in 2 variants) | Starter | `@reactbits-starter/-tw` or `-css` | | `@reactbits-pro` | 280 marketing blocks (22 categories) | **Pro** | `@reactbits-pro/` | | `@reactbits-pro` | 300 App UI blocks (38 categories) | **Pro** | `@reactbits-pro/` | | `@reactbits-pro` | 20 Agent Kit items (skills, prompts, recipes, setup) | **Pro** (setup: Starter) | `@reactbits-pro/skill-` etc. | Marketing blocks, App UI blocks and the Agent Kit all ship through the **same** `@reactbits-pro` registry and therefore share the same Pro entitlement. There is no separate purchase or registry for App UI or the Agent Kit. Tier hierarchy: **Starter → Pro → Ultimate** (each tier includes everything below it). | Tier | License prefix | Components | Marketing blocks | App UI blocks | Agent Kit | Templates | | -------- | -------------- | ---------- | ---------------- | ------------- | ------------- | ------------------ | | Starter | `rbps-` | ✅ 150 | ❌ | ❌ | 1 setup skill | free template only | | Pro | `rbpp-` | ✅ 150 | ✅ 280 | ✅ 300 | ✅ 20 | free template only | | Ultimate | `rbpu-` | ✅ 150 | ✅ 280 | ✅ 300 | ✅ 20 | ✅ all 15 | **Say this plainly to a Starter user who asks for an App UI block, a marketing block or an Agent Kit item: it requires Pro or Ultimate.** Do not attempt the install and let it fail with a 403. Items are written into the codebase as editable source files. They are **not** npm packages. ### Five product types: do not confuse them | Type | Source | Suffix | Delivery | Tier | | ------------------- | -------------------- | --------------------------------------- | -------------------------------- | ----------------- | | **Component** | `@reactbits-starter` | `-tw` / `-css` (required) | shadcn CLI | Starter+ | | **Marketing block** | `@reactbits-pro` | none | shadcn CLI | **Pro+** | | **App UI block** | `@reactbits-pro` | none | shadcn CLI | **Pro+** | | **Agent Kit item** | `@reactbits-pro` | `skill-` / `prompt-` / `recipe-` prefix | shadcn CLI | **Pro+** (1 free) | | **Template** | website download | n/a | `.zip` download (login required) | Ultimate (1 free) | **Marketing blocks vs App UI blocks.** Both are Pro, both install to the same directory, and both are full sections rather than primitives. The difference is what they are _for_: | | Marketing block | App UI block | | ----------- | -------------------------------------- | -------------------------------------------------- | | Purpose | Public landing/marketing page | Signed-in product interface | | Examples | hero, pricing, FAQ, testimonials | app shell, sidebar, data table, dashboard, AI chat | | Root height | Heroes may fill the viewport; content sections use `--rb-section-min-h`; Bento tiles fill grid cells | `h-full min-h-[Npx]` (fills its container) | | Density | Generous, large type | Dense, `text-[13px]` body scale | | Exports | **Mixed**: always verify | **Always `export default`** | If the user is building a landing page, reach for marketing blocks. If they are building a dashboard, admin panel, settings screen or an AI/agent surface, reach for App UI. ### Component variants (`-tw` vs `-css`) Every component exists in two functionally identical variants. **Pick exactly one per install.** - **`-tw` (Tailwind)**: styles via Tailwind utility classes and the `cn()` helper. **Default choice.** Use this whenever the project uses Tailwind. - **`-css` (vanilla CSS)**: ships a co-located `.css` file, no Tailwind required. Use only when the project does **not** use Tailwind. Blocks have **no variants**. They are Tailwind-only, single-file. ### Where files are installed Paths follow the user's `components.json` aliases (and `src/` dir if present). With defaults: | Item | On-disk path | Import alias | | ------------------ | ------------------------------------------------- | -------------------------------- | | Component (`-tw`) | `components/react-bits/.tsx` | `@/components/react-bits/` | | Component (`-css`) | `components/react-bits/.tsx` + `.css` | `@/components/react-bits/` | | Marketing block | `components/blocks/.tsx` | `@/components/blocks/` | | App UI block | `components/blocks/.tsx` | `@/components/blocks/` | | Agent Kit skill | `.claude/skills//SKILL.md` | n/a (read by the agent) | | Agent Kit prompt | `prompts//PROMPT.md` | n/a (read by the agent) | | Agent Kit recipe | `recipes//RECIPE.md` + `plan.json` | n/a (read by the agent) | | This skill file | `./SKILL.md` (project root) | n/a | App UI blocks and marketing blocks share `components/blocks/`. Category slugs are unique across both, so they never collide. The shadcn CLI auto-installs each item's npm dependencies and any registry dependencies. --- ## Step 1: Verify prerequisites Confirm the project has all of the following before installing: 1. **`components.json` at the project root.** If missing: ```bash npx shadcn@latest init ``` 2. **The `cn()` helper at `lib/utils.ts`** (required by every `-tw` component): ```typescript import { clsx, type ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } ``` If missing: `npm install clsx tailwind-merge`, then create the file above. 3. **Tailwind CSS configured** (for `-tw` components and all blocks). **Tailwind v4 is strongly recommended**: many blocks use v4-renamed utilities such as `bg-linear-to-br` (the v3 name is `bg-gradient-to-br`). 4. **A valid license key.** The user must have purchased a React Bits Pro plan. If they have not set one up, ask them for it (or point them to https://pro.reactbits.dev/pricing). --- ## Step 2: Configure the license key Add the key to `.env.local` at the project root: ```bash REACTBITS_LICENSE_KEY=rbpp-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ``` - **Never commit `.env.local`.** Ensure `.gitignore` includes it (shadcn's `init` does this by default). - The shadcn CLI reads this value to fill the `${REACTBITS_LICENSE_KEY}` placeholder in `components.json`. - If the CLI cannot find the variable, export it in the shell before running `add`: ```bash export REACTBITS_LICENSE_KEY=rbpp-... ``` - The license prefix reveals the tier: `rbps-` = Starter, `rbpp-` = Pro, `rbpu-` = Ultimate. --- ## Step 3: Configure `components.json` Merge the `registries` object into the existing `components.json`. **Add only this key: do not touch `$schema`, `style`, `tailwind`, `aliases`, or any other existing field.** ```json { "registries": { "@reactbits-starter": { "url": "https://pro.reactbits.dev/api/r/starter/{name}.json", "headers": { "Authorization": "Bearer ${REACTBITS_LICENSE_KEY}" } }, "@reactbits-pro": { "url": "https://pro.reactbits.dev/api/r/pro/{name}.json", "headers": { "Authorization": "Bearer ${REACTBITS_LICENSE_KEY}" } } } } ``` The `{name}` token is replaced by the slug you pass to `add`. `${REACTBITS_LICENSE_KEY}` is read from the environment / `.env.local`. Configure `@reactbits-starter` even if you only plan to use blocks. It is also how you install this skill file. --- ## Step 4: Install items > Components **require** a `-tw` or `-css` suffix. Every kind of block takes **no** suffix. ```bash # Component: Tailwind variant (default choice) [Starter+] npx shadcn@latest add @reactbits-starter/silk-waves-tw # Component: vanilla-CSS variant (non-Tailwind projects only) npx shadcn@latest add @reactbits-starter/silk-waves-css # Marketing block [Pro+] npx shadcn@latest add @reactbits-pro/hero-1 # App UI block [Pro+] npx shadcn@latest add @reactbits-pro/ai-chat-1 # Agent Kit: design skill / page prompt / full-page recipe [Pro+] npx shadcn@latest add @reactbits-pro/skill-swiss-grid npx shadcn@latest add @reactbits-pro/prompt-saas npx shadcn@latest add @reactbits-pro/recipe-saas-homepage # Several at once (all kinds can be mixed) npx shadcn@latest add @reactbits-starter/silk-waves-tw @reactbits-pro/hero-1 @reactbits-pro/dashboard-1 ``` If any of the `@reactbits-pro` commands above returns **403**, the key is a Starter key. That is an entitlement result, not a bug: App UI blocks, marketing blocks and the Agent Kit all require **Pro or Ultimate**. Tell the user rather than retrying. Optional, inspect an item before installing: ```bash npx shadcn@latest view @reactbits-starter/silk-waves-tw ``` --- ## Importing installed items This is the step agents most often get wrong. Get the export style right and the import follows. ### Components: always a default export **Every** `@reactbits-starter` component is `export default`. Import it with **any** local name you like (no braces): ```tsx import SilkWaves from "@/components/react-bits/silk-waves"; import AnimatedList from "@/components/react-bits/animated-list"; ``` ### App UI blocks: always a default export All **300** App UI blocks are `export default function`, without exception. The identifier is derived from the slug (`ai-chat-1` exports `AiChat1`, `data-table-3` exports `DataTable3`), but since it is a default export the local name is yours to choose: ```tsx import AiChat from "@/components/blocks/ai-chat-1"; import Dashboard from "@/components/blocks/dashboard-4"; ``` This is the one case where you do **not** need to read the export line first. ### Marketing blocks: mixed export styles, so verify every time Marketing block files are **not** consistent: some are `export default function X()` and some are `export function X()`. The identifier also does **not** reliably match the slug. **Always confirm the export line, then import accordingly.** One reliable command to reveal it: ```bash grep -E "^export (default )?function " components/blocks/.tsx ``` Apply this rule to the result: | Export line in the file | Import to write | | ------------------------------------ | -------------------------------------------------------------------------------------------- | | `export default function Anything()` | `import AnyName from "@/components/blocks/";` (default import: name is your choice) | | `export function Hero1()` | `import { Hero1 } from "@/components/blocks/";` (named import: **must** match exactly) | Examples: ```tsx // hero-1.tsx contains: export function Hero1() -> NAMED import, exact identifier import { Hero1 } from "@/components/blocks/hero-1"; // 404-3.tsx contains: export default function NotFound3() -> DEFAULT import, free name import ErrorPage from "@/components/blocks/404-3"; // pricing-2.tsx contains: export default function Pricing2() -> DEFAULT import import Pricing from "@/components/blocks/pricing-2"; ``` ### Marketing block import reference (verified) If you cannot open the file, use this table. **Named-export** blocks must be imported with the **exact** identifier in braces. **Default-export** blocks can be imported with any name (the listed identifier is the file's own name, shown for reference). Watch the irregular casing. **Named exports → `import { Identifier } from "@/components/blocks/"`:** | Category | Slugs | Identifiers | | ------------ | ---------------------------------------- | ------------------------------------------------------ | | Auth | `auth-1..6` | `Auth1` … `Auth6` | | Blog | `blog-1..5`, `blog-8..11` | `Blog1` … `Blog5`, `Blog8` … `Blog11` | | Download | `download-1..3`, `download-6..8` | `Download1` … `Download3`, `Download6` … `Download8` | | Features | `features-1..5`, `features-10..13` | `Features1` … `Features5`, `Features10` … `Features13` | | Footer | `footer-5`, `footer-6` | `Footer5`, `Footer6` | | Hero | `hero-1..24` | `Hero1` … `Hero24` (all heroes are named) | | How It Works | `how-it-works-1..3`, `how-it-works-7..9` | `HowItWorks1..3`, `HowItWorks7..9` | | Navigation | `navigation-2..8` | `Navigation2` … `Navigation8` | | Pricing | `pricing-5`, `pricing-6` | `Pricing5`, `Pricing6` | | Showcase | `showcase-1..3`, `showcase-6..8` | `Showcase1..3`, `Showcase6..8` | | Social Proof | `social-proof-7..9` | `SocialProof7`, `SocialProof8`, `SocialProof9` | **Default exports → `import AnyName from "@/components/blocks/"`:** | Category | Slugs | File identifiers | | ------------ | ------------------------------------------ | ---------------------------------------------------------------------- | | 404 | `404-1..8` | `NotFound1` … `NotFound8` ⚠️ not "404…" | | About | `about-1..12` | `About1` … `About12` | | Bento | `bento-1..42` | `Bento1` … `Bento42` (grid tiles, see Appendix B note) | | Blog | `blog-6`, `blog-7` | `Blog6`, `Blog7` | | Comparison | `comparison-1..8` | `Comparison1` … `Comparison8` | | Contact | `contact-1..12` | `Contact1` … `Contact12` | | CTA | `cta-1..14` | `CTA1..3`, then `Cta4` … `Cta10`, then `CTA11..14` ⚠️ irregular casing | | Download | `download-4`, `download-5` | `Download4`, `Download5` | | Ecommerce | `ecommerce-1..11` | `Ecommerce1` … `Ecommerce11` | | FAQ | `faq-1..9` | `FAQ1..3`, then `Faq4`, `Faq5`, then `FAQ6..9` ⚠️ irregular casing | | Features | `features-6..9` | `Features6` … `Features9` | | Footer | `footer-1..4`, `footer-7..12` | `Footer1` … `Footer4`, `Footer7` … `Footer12` | | How It Works | `how-it-works-4..6` | `HowItWorks4`, `HowItWorks5`, `HowItWorks6` | | Navigation | `navigation-1`, `navigation-9..15` | `Navigation1`, `Navigation9` … `Navigation15` | | Pricing | `pricing-1..4`, `pricing-7..15` | `Pricing1` … `Pricing4`, `Pricing7` … `Pricing15` | | Profile | `profile-1..6` | `Profile1` … `Profile6` | | Showcase | `showcase-4`, `showcase-5` | `Showcase4`, `Showcase5` | | Social Proof | `social-proof-1..6`, `social-proof-10..16` | `SocialProof1` … `SocialProof6`, `SocialProof10` … `SocialProof16` | | Stats | `stats-1..15` | `Stats1` … `Stats15` | | Waitlist | `waitlist-1..6` | `Waitlist1` … `Waitlist6` | > If this table ever disagrees with the installed file, **trust the file** and re-run the `grep` check above. ### Using an installed component ```tsx import SilkWaves from "@/components/react-bits/silk-waves"; export default function Page() { return ( // WebGL/shader components require a sized parent:
); } ``` ### Using an installed block ```tsx import { Hero1 } from "@/components/blocks/hero-1"; // named export → braces export default function LandingPage() { return (
); } ``` Marketing blocks render full-width sections, except Bento tiles, which fill a grid cell. Blocks take **no props**: customize them by editing the source file. --- ## Composing a landing page from blocks ```bash npx shadcn@latest add \ @reactbits-pro/navigation-1 \ @reactbits-pro/hero-1 \ @reactbits-pro/features-1 \ @reactbits-pro/social-proof-1 \ @reactbits-pro/pricing-1 \ @reactbits-pro/faq-1 \ @reactbits-pro/cta-1 \ @reactbits-pro/footer-1 ``` ```tsx // Imports below mix default and named: verified per the reference table above. import Navigation1 from "@/components/blocks/navigation-1"; // default export import { Hero1 } from "@/components/blocks/hero-1"; // named export import { Features1 } from "@/components/blocks/features-1"; // named export import SocialProof1 from "@/components/blocks/social-proof-1"; // default export import Pricing1 from "@/components/blocks/pricing-1"; // default export import Faq1 from "@/components/blocks/faq-1"; // default export (file identifier: FAQ1) import CTA1 from "@/components/blocks/cta-1"; // default export (file identifier: CTA1) import Footer1 from "@/components/blocks/footer-1"; // default export export default function LandingPage() { return ( <> ); } ``` Then edit each block's source to replace placeholder copy, images (`/svg/placeholder.svg`), and links, wire up forms and buttons, and **run the harmonization pass below**. Installing the blocks is the first half of the job; making them look like one page is the second. For a composed page, set `style={{ "--rb-section-min-h": "0px" } as React.CSSProperties}` on the page wrapper. Content blocks use `min-h-[var(--rb-section-min-h,100vh)]`, so this lets stacked sections take their natural height. Keep hero and navigation height rules intact. --- ## Harmonizing blocks (never skip this) **A block is a starting point, not a finished section.** Every block was authored independently, so each one carries its own design decisions. Stack several unchanged and you do not get a page, you get a stack of unrelated sections. Across the 280 marketing blocks the library ships: - **10 different section paddings** (`py-16` in 135 blocks, `py-12` in 105, `py-20` in 99, `py-24` in 90, and six more) - **7 different display type sizes** (`text-3xl` through `text-9xl`; 108 blocks reach `text-6xl`, 47 reach `text-7xl`) - **7 radius families** (`rounded-sm` through `rounded-3xl`, plus `rounded-full`) Each block is internally consistent. The inconsistency only appears when you combine them, which is exactly what the user is asking you to do. **Editing the installed source to reconcile these is expected work, not a workaround**: the files are the user's now, and they exist to be edited. There are two distinct jobs. Identify which one you are doing before you start. ### Job A: dropping a block into an existing page **The host codebase wins. Always.** The user has a design system already; a block that keeps its own is a foreign object on their page, and that is the most common way this goes wrong. Before editing, read the host and write down its actual values: | Read from the host | Where to look | | ------------------------------ | ------------------------------------------------------------------- | | Type scale and heading weights | An existing page section or heading component | | Colour tokens | `globals.css`, `tailwind.config`, or existing `bg-*`/`text-*` usage | | Section padding rhythm | The `
` wrappers already on the page | | Container width and gutters | The page's outer wrapper (`max-w-*`, `px-*`) | | Border radius vocabulary | Existing buttons and cards, or `--radius` | | Button styles | The project's `Button` component or existing CTAs | | Font families | `layout.tsx` or the font loader | Then rewrite the block to those values. In practice: 1. **Swap the colours first.** Replace the block's hardcoded `neutral-*` scale with the host's semantic tokens (`bg-background`, `text-foreground`, `text-muted-foreground`, `border-border`) if it uses them. This single step does most of the work of making a block look native. 2. **Match the container.** Blocks ship `max-w-[1400px] mx-auto px-4 sm:px-6 lg:px-8`. If the host page is `max-w-5xl`, change it, or the section will visibly bulge wider than everything around it. 3. **Match the section padding** to the neighbouring sections, not to the block's default. 4. **Demote the heading.** A block's `h2` is sized to lead a full-viewport section. Inside a denser existing page it usually needs to come down a step or two, and it must never out-size the page's existing `h1`. 5. **Reuse the host's button component** instead of the block's raw `