# Eject Components Reference Eject copies a built-in component's source code into your project for full customization. This is the heaviest approach — ejected components do not receive automatic updates when Rspress upgrades. Prefer CSS variables, BEM overrides, or Layout slots whenever possible. Official reference: --- ## Eject Command ```bash # List all available components rspress eject # Eject a specific component rspress eject ``` Ejected source is placed in `theme/components//`. ## Available Components | Component | Description | Consider wrapping first? | | ---------------- | ----------------------------------------- | ------------------------------------------------ | | `Layout` | Main layout container with all slot props | Yes — use Layout slots instead | | `Root` | Application root wrapper | Only eject for global providers | | `Banner` | Notification banner at top of page | Check `top` slot first | | `NavTitle` | Navigation logo and title | Check `navTitle` / `beforeNavTitle` slots | | `HomeLayout` | Complete home page layout | Check home page slots first | | `HomeHero` | Hero section on home page | Check `beforeHero` / `afterHero` slots | | `HomeFeature` | Feature grid cards | Check `beforeFeatures` / `afterFeatures` slots | | `HomeBackground` | Home page background effects | Try CSS variables first | | `HomeFooter` | Home page footer | Check `bottom` slot first | | `DocFooter` | Documentation page footer | Check `beforeDocFooter` / `afterDocFooter` slots | | `EditLink` | "Edit this page" link | Configure via `themeConfig.editLink` | | `LastUpdated` | Last updated timestamp | Usually config is enough | | `PrevNextPage` | Previous/next page navigation | Check `beforeDocFooter` slot | | `OverviewGroup` | Overview page group cards | — | | `Tag` | Tag/label component | — | ## Step-by-Step Eject Workflow 1. **Eject the component:** ```bash rspress eject DocFooter ``` 2. **Re-export in theme/index.tsx:** ```tsx // theme/index.tsx export * from '@rspress/core/theme-original'; export { DocFooter } from './components/DocFooter'; ``` The named export takes precedence over the wildcard re-export, so Rspress uses your custom version. 3. **Modify the ejected source** in `theme/components/DocFooter/`. ## Common Pattern: Root for Global Providers The most common eject use case is wrapping the entire app in a context provider (state management, analytics, auth, etc.): ```tsx // theme/components/Root/index.tsx import type { RootProps } from '@rspress/core/theme'; export function Root({ children }: RootProps) { return ( {children} ); } ``` ```tsx // theme/index.tsx export * from '@rspress/core/theme-original'; export { Root } from './components/Root'; ``` ## Common Pattern: Custom Home Page (HomeLayout) When the default home page structure (Hero + Features) doesn't meet the design requirements — for example, you need a completely different landing page with custom sections, animations, or a non-standard layout — write a custom `HomeLayout` component and re-export it directly: ```tsx // theme/components/HomeLayout/index.tsx import { useSite, useLang } from '@rspress/core/runtime'; export function HomeLayout() { const site = useSite(); const lang = useLang(); const { title, description } = site.siteData; return (

{title}

{description}

{/* Custom content: testimonials, stats, demos, etc. */}
); } ``` ```tsx // theme/index.tsx export * from '@rspress/core/theme-original'; export { HomeLayout } from './components/HomeLayout'; ``` The named export overrides the built-in `HomeLayout` from the wildcard re-export — no need to eject first. If you only need to add content before/after the Hero or Features sections (without replacing the entire home page), prefer Layout slots (`beforeHero`, `afterHero`, `beforeFeatures`, `afterFeatures`) instead — see `references/layout-slots.md`. ## Common Pattern: Custom Doc Footer ```tsx // theme/components/DocFooter/index.tsx import { useFrontmatter } from '@rspress/core/runtime'; export function DocFooter() { const frontmatter = useFrontmatter(); return ( ); } ``` ## Important Notes - Always import from `@rspress/core/theme-original` in `theme/` files, never from `@rspress/core/theme` (the latter resolves to your own `theme/index.tsx`, causing circular imports). - After ejecting, you own that component. Track Rspress changelogs for upstream changes you might want to incorporate manually. - Run `rspress eject` (no args) to see the up-to-date list of available components — the list above may change between Rspress versions.