Launch Your MVP. Prove ROI. Scale Globally
00D
00H
00M
00S
Grab Deal Now!
← Back to Articles
Development / CMS

Step-by-step guide for create and implementing your header using Partial Design + Next.js (Headless).

SSaurav Kumar2 Min Read
Step-by-step guide for create and implementing your header using Partial Design + Next.js (Headless).
In This Article

PART 1: Create Header via Partial Design (SXA)

1. Go to Presentation β†’ Partial Designs

Navigate:

/sitecore/content/YourSite/Presentation/Partial Designs

  • Create a new Partial Design:
    Header

2. Add Header Rendering

Open the Header Partial Design:

  • Click Edit
  • Add rendering:
    • Your custom Header Rendering (or SXA Navigation + Image components)

Place it in a placeholder like:

headless-header

If using Image component:

  • Click the component
  • Click Edit Component Properties
  • Select image field or media item

3. Assign Data Source

For your header rendering:

  • Set Data Source to:

/sitecore/content/YourSite/Data/Header/Main Header

πŸ’‘ This keeps your header reusable and centralized.

4. Create a Page Design

Go to:

/sitecore/content/YourSite/Presentation/Page Designs

  • Create: Default Page Design

5. Attach Partial Design to Page Design

Inside Page Design:

  • Add your Header Partial Design
  • Also add:
    • Footer (optional)
    • Main content partial

Now your structure becomes:

Page Design

β”œβ”€β”€ Header (Partial Design)

β”œβ”€β”€ Main Content

└── Footer

6. Assign Page Design to Pages

Go to your page (e.g., Home):

  • Open Experience Editor
  • Assign:
    πŸ‘‰ Default Page Design
Now header is global across all pages using that design.

7: Save & Publish

Click:

  • βœ” Save
  • βœ” Publish

PART 2: Headless Layout Output

Future-Proof Your Sitecore + Next.js Architecture

When using Layout Service:

typescript
MSI Editor
/sitecore/api/layout/render/jss?item=/&sc_lang=en 

You’ll now see: 

{ 

  "route": { 

    "placeholders": { 

      "header": [ 

        { 

          "componentName": "Header", 

          "fields": { 

            "logo": {...}, 

            "navigationLinks": [...] 

          } 

        } 

      ] 

    } 

  } 

}

Partial Design content is merged automatically into layout output.

PART 3: Next.js Implementation

1. Header Component

typescript
MSI Editor
const Header = ({ fields }) => { 

  return ( 

    <header className="header"> 

      <img src={fields.logo?.value?.src} alt="logo" /> 

 

      <nav> 

        {fields.navigationLinks?.map((item, i) => ( 

          <a key={i} href={item.url}> 

            {item.title} 

          </a> 

        ))} 

      </nav> 

    </header> 

  ); 

};

2. Register Component

typescript
MSI Editor
import Header from './components/Header'; 
export const components = { 
  Header, 
}; 

3. Render Header Placeholder

In your main layout:

typescript
MSI Editor
<Placeholder name="header" rendering={rendering} />

4. PartialDesignDynamicPlaceholder Component

In SXA Headless:

  • Partial Designs use dynamic placeholders
  • Sitecore injects a system component:

PartialDesignDynamicPlaceholder

But your Next.js app doesn’t have this component registered

Create this file:

/src/components/PartialDesignDynamicPlaceholder.tsx

Add this code:

typescript
MSI Editor
const PartialDesignDynamicPlaceholder = ({ rendering }: any) => { 

  if (!rendering?.placeholders) return null; 

 

  return Object.keys(rendering.placeholders).map((name) => ( 

    <Placeholder key={name} name={name} rendering={rendering} /> 

  )); 

};

Register Component (VERY IMPORTANT)

Open:

typescript
MSI Editor
/src/lib/componentFactory.ts 

Add: 

import PartialDesignDynamicPlaceholder from '../components/PartialDesignDynamicPlaceholder'; 
 
export const components = { 
  PartialDesignDynamicPlaceholder, 
};

Name must EXACTLY match:

PartialDesignDynamicPlaceholder

Next.js + Sitecore JSS Project Structure

Here’s a real-world folder structure πŸ‘‡

/src
β”œβ”€β”€ components
β”‚ β”œβ”€β”€ Header.tsx
β”‚ β”œβ”€β”€ Footer.tsx
β”‚
β”œβ”€β”€ lib
β”‚ β”œβ”€β”€ componentFactory.ts
β”‚
β”œβ”€β”€ Layout.tsx
β”œβ”€β”€ pages
β”‚ β”œβ”€β”€ [[...path]].tsx
β”‚
β”œβ”€β”€ styles
β”‚ β”œβ”€β”€ global.css

Header Component

typescript
MSI Editor
// src/components/Header.tsx 
 
import Link from 'next/link'; 
 
const Header = ({ rendering }) => { 
  const fields = rendering?.fields; 
 
  return ( 
    <header className="header"> 
      <div className="logo"> 
        <img src={fields?.logo?.value?.src} /> 
      </div> 
 
      <nav> 
        {fields?.navigationLinks?.map((item, i) => ( 
          <Link key={i} href={item.url}> 
            {item.title} 
          </Link> 
        ))} 
      </nav> 
    </header> 
  ); 
}; 
 
export default Header;

Layout File

typescript
MSI Editor
// src/Layout.tsx 
 
import { Placeholder } from '@sitecore-jss/sitecore-jss-nextjs'; 
 
const Layout = ({ layoutData }) => { 
  const { route } = layoutData; 
 
  return ( 
    <> 
      <Placeholder name="headless-header" rendering={route} /> 
      <Placeholder name="main" rendering={route} /> 

      <Placeholder name="headless-footer" rendering={route} /> 
    </> 
  ); 
}; 
 
export default Layout;

Verify Layout Placeholder

Make sure your layout has:

typescript
MSI Editor
<Placeholder name="headless-header" rendering={route} /> 
<Placeholder name="headless-footer" rendering={route} />

Restart Next.js App

npm run dev

or

yarn dev

or

jss start:connected

WHAT THIS COMPONENT DOES

It dynamically renders nested placeholders like:

typescript
MSI Editor
"placeholders": { 
  "headless-footer": [ 
    { 
      "componentName": "Container", 
      "placeholders": { 
        "container-1": [...] 
      } 
    } 
  ] 
}

HOW THIS WORKS (IMPORTANT)

Without Partial Design:

  • Header added manually to each page

With Partial Design:

  • Header injected automatically via Page Design
  • Fully reusable and maintainable

KEY BENEFITS

βœ” One place to manage header
βœ” No duplication
βœ” Clean Helix architecture
βœ” Works perfectly with Headless + Next.js
βœ” Easy personalization later

PRO TIP (Very Important)

If you're using SXA Headless:

  • Always use:
    • Partial Design for global UI (Header/Footer)
    • Page Design for structure
    • Data folder for content

FINAL ARCHITECTURE

Data

└── Header Content

Presentation

β”œβ”€β”€ Partial Designs

β”‚ └── Header

β”‚

β”œβ”€β”€ Page Designs

β”‚ └── Default

β”‚

└── Renderings

└── Header Component

FINAL FLOW (SIMPLE)

  1. Create Header β†’ Partial Design
  2. Attach to Page Design
  3. Assign Page Design to pages
  4. Layout Service exposes header
  5. Next.js renders <Placeholder name="header" />

Common Mistakes (Avoid These)

  • Not assigning Page Design
  • Missing placeholder (header) in layout
  • Component not registered in factory
  • Wrong datasource path

Happy Coding!

Frequently Asked Questions

What is Step-by-step guide for create and implementing your header using Partial Design + Next.js (Headless).?

Learn how to create a global header in Sitecore SXA using Partial Design and render it in Next.js. Step-by-step guide with JSS, placeholders, and layout.

Reader Responses

Join the Conversation

Sitecore SXA Partial Design + Next.js Header Setup Guide