Every band of a landing page has a component. Your job is to choose the bands, write honest copy and render real product UI inside them, not to restyle containers.
Components
All components import from @lobehub/ui/awesome. Read each one's page before using a prop you
have not seen here: https://ui.lobehub.com/skills/components/awesome/<kebab-name>.md.
| Band | Component | Use it for |
|---|---|---|
| Opening | LandingHero |
Badge, title with gradient accent, description, up to two actions, optional aside column. |
| Beside the hero text | AgentSkillCard |
"I'm an Agent / I'm a Human" card: a prompt for coding agents and an install command for people. |
| Under the hero | LogoMarquee |
Integrations or supported providers. Icons from @lobehub/icons. |
| Any middle band | LandingSection |
Tag, title and description on the left, small actions on the right, content below. Wrap every middle band in it. |
| Live component gallery | BentoGrid + BentoCard |
Tiles that render real components; colSpan/rowSpan for emphasis; href to the docs page. |
| Code next to its result | CodeShowcase |
Two to four short snippets, each with a live preview. |
| Reasons to choose | FeatureGrid |
Three or six cards of icon, title and one-sentence description. |
| Closing call to action | InstallBanner |
Title, copyable install command, footnote with license and a docs link. |
| Background texture | FluidGradient |
Place it behind a positioned band when you want a texture. Needs a positioned parent. |
Page structure
Default order. Drop a band rather than filling it with filler.
LandingHerowithaside={<AgentSkillCard />}andchildren={<LogoMarquee />}.LandingSection+BentoGrid: the widest, most visual proof.LandingSection+CodeShowcase: how little code it takes.LandingSection+FeatureGrid: foundations such as theming, i18n, performance.InstallBanner.
import {
AgentSkillCard,
InstallBanner,
LandingHero,
LandingSection,
LogoMarquee,
} from '@lobehub/ui/awesome';
import { ArrowRight } from 'lucide-react';
export default function Home() {
return (
<>
<LandingHero
accent="UI Kit"
actions={[
{
href: '/docs',
icon: ArrowRight,
iconPlacement: 'end',
label: 'Get Started',
primary: true,
},
{ href: 'https://github.com/acme/kit', label: 'GitHub' },
]}
aside={
<AgentSkillCard
agent={{
code: 'Read https://kit.acme.dev/skills.md and follow it to build UI with @acme/kit.',
description: 'Send this prompt to your agent to pick the right components',
}}
human={{
code: 'npx skills add acme/kit',
description: 'Install the skills into your project',
}}
/>
}
description="One sentence on what it is and who it is for."
title="Acme"
>
<LogoMarquee items={[/* { icon: OpenAI, label: 'OpenAI' } */]} />
</LandingHero>
<LandingSection
actions={[{ href: '/components', label: 'Browse components' }]}
eyebrow="Components"
id="home-gallery"
title="Built for AI interfaces"
>
{/* BentoGrid of live tiles */}
</LandingSection>
<InstallBanner
command="pnpm add @acme/kit"
footnote="Open source · MIT license"
title="Start building"
/>
</>
);
}
Wiring
- lobedocs sites: set
homePage: './docs/home/home.tsx'indocs.config.ts. The default export receives{ description, getStartedPathname }; usegetStartedPathnamefor the primary action. - Client-side routing:
LandingHero,BentoCardandFeatureGridrender plain anchors. Pass one sharedrenderLinkso internal links use the router and absolute URLs open in a new tab:
import type { LandingLinkRender } from '@lobehub/ui/awesome';
import { Link } from 'react-router';
export const renderLink: LandingLinkRender = ({ external, href, ...props }) =>
external ? (
<a href={href} rel="noreferrer" target="_blank" {...props} />
) : (
<Link to={href} {...props} />
);
- Accent colour: the gradient on the hero accent, eyebrows, outlined action and install glow
reads
--lobe-landing-gradient. Set it once on:root(and per theme) instead of overriding component styles.FluidGradienttakes its three stops throughcolors. - Search indexing: wrap the title and description in
<span data-pagefind-meta="title">/"description"when the site uses Pagefind.
AgentSkillCard content
- The agent prompt must point at a URL that exists: the site's
skills.md(lobedocs generates it) orllms.txt. Say what the agent should do with it, in one sentence. - The human command must be runnable as written. If the project has no skills package, drop
humanand the card shows the prompt alone. agentsdefaults toDEFAULT_SKILL_AGENTS(Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, Windsurf, Cline, OpenCode). Replace it with the.Avatarcomponents from@lobehub/iconsthat the project actually supports, or[]to hide the row.- Use
footerfor secondary links such asskills.mdandllms.txt.
Copy and content rules
- Title: the product name, with the category or promise as
accent. No more than four words. - Description: one sentence, under 20 words, concrete ("React components for AIGC web apps"), never "powerful", "seamless" or "next-generation".
- At most two hero actions: one
primary, one secondary. - Bento tiles render real components with realistic data. A tile that cannot show something live
does not belong in the grid. Give the most expressive component
colSpan={2} rowSpan={2}. CodeShowcasesnippets fit in about ten lines and compile as written.FeatureGriduses three or six items; each description is one sentence.LandingSectionidvalues must be unique; they label the headings.eyebrowis a one- or two-word tag ("Components", "Foundations"); give each band its owneyebrowColorpreset (blue,green,orange…). Give a section at most oneactionsentry.- Only the hero's Get Started action is
primary. Every other action renders asBottomGradientButton; passonNavigate={useNavigate()}so internal ones route client-side.
Review checklist
- Every link resolves: primary action, bento
hrefs, prompt URL, footer links. - Light and dark mode both read well; the accent gradient is not the only thing carrying meaning.
- At 375px wide the hero stacks, actions fill the width, and the bento grid is one column.
- Nothing animates under
prefers-reduced-motion(the marquee stops, the texture freezes). - Copy passes the rules above; no placeholder text or lorem ipsum remains.