From Figma Design to Sitecore Rendering in a Few Minutes

Anton Tishchenko
Anton Tishchenko
Cover Image for From Figma Design to Sitecore Rendering in a Few Minutes

What is the most popular Sitecore development task in 2025? My answer will be: creating components. Sitecore clients move to XM Cloud, and it causes fewer and fewer Sitecore customizations. It may be changed over time with the ability to extend Sitecore via the marketplace. But now the biggest amount of work is related to component creation. Let’s figure out how AI can speed up this process!

Prerequisites

Figma

Figma is the de facto standard for web design. It has many AI capabilities by itself. We are not interested in them here. All that we need is the Figma MCP server. It is available starting from the Dev Seat subscription, 15$/month.

Chrome

AI agents work better when they have a feedback loop. Do something, check, improve if required, check again, and continue till the result is achieved. Previously, it was required to run non-official MCP servers for browser tools. But Google introduced Chrome DevTools MCP in September 2025. It is free and works great!

Sitecore

Of course, you will need Sitecore. It is possible to have the source code locally and run a headless Next.js(or Astro) server on the development machine and work with XM Cloud.

But for our case, we will run the fork of the latest official Sitecore Demo website: Verticals. It is probably a little bit dated, but that is the best free open-source Sitecore project that we can use.

AI Agents

Now, we need to glue everything together. This approach will likely work with all modern AI tools and agents. I tried it with Claude Code and Cursor, and both work well. Here, we will be using a Cursor Pro with 20$/month subscription. The only reason for Cursor selection is: ability to provide better screenshots that explain how it works.

Setup

We configure everything together in Cursor. First of all, I cloned the repository and started Sitecore.

The repository already comes with and running MCP server. After starting Sitecore, we have the Sitecore and the MCP server that make Sitecore available to AI Agents. Item service tools and PowerShell tools for working with presentations should be enabled. All other tools could be disabled to improve AI agents quality and performance.

Google Chrome DevTools MCP server could be started via one command: npx chrome-devtools-mcp@latest.

We will need to run Figma Desktop to start the MCP server. It starts from the menu:

Figma MCP menu showing how to start the MCP server

Once it is started, it should be available on the port 3485

Our mcp.json configuration will be next:

{
  "mcpServers": {
    "Sitecore Local": {
      "url": "http://127.0.0.1:5001/mcp"
    },
    "Figma": {
      "url": "http://127.0.0.1:3845/mcp"
    },
    "Chrome DevTools": {
      "command": "npx",
      "args": ["chrome-devtools-mcp@latest"]
    }
  }
}

After proper configuration, we should see all three servers enabled in Cursor:

Cursor showing all three MCP servers enabled: Sitecore Local, Figma, and Chrome DevTools

Another important thing for generating content is Rules and Memories. We will include CLAUDE.md in the Agent’s context when relevant.

Cursor Rules and Memories configuration with CLAUDE.md file

It is important because we don’t want to repeat the same things in all prompts.

CLAUDE.md contains:

  • Constants: Site path, templates paths, etc. Anything valuable.
  • URLs for your projects to let AI know what to compare in Chrome DevTools
  • Rules to create templates, renderings, and other content
  • Rules for styling
  • Rules for serialization

Actually, everything works even without additional specification in CLAUDE.md. But in that case, you need to provide more details in your prompts. Also, you can use User Rules or Project Rules if you think that they fit better for your needs. The reason for my selection on CLAUDE.md is: write it once, use it in both Claude Code and Cursor.

Process

Now, we should go to Figma and select the component that we want to create. It is possible to either use the selected Figma context or specify how to find it in the document. We will use the first one.

Figma interface showing selected frame for the new SectionCard component

Then we need to go to the Cursor and start a new chat with our Agent.

  1. Get Figma selected frame, it will be new component: SectionCard
  2. Analyze it: what content fields do we need
  3. Create Sitecore datasource template and rendering
  4. Create Astro rendering for it
  5. Create test page under the home item of Services website
  6. Add this rendering to the test page
  7. Use Chrome MCP Dev tools to verify if component was added to the page. Check if looks correctly, if not - fix it

You should see that Cursor prepared the plan and started to work on it.

Cursor AI agent showing the execution plan for creating the Sitecore component

It took a Figma screenshot:

Figma screenshot of the selected component design

Analyzed the Figma Context:

Figma context analysis showing component structure and properties

And started to work on Sitecore items. We can follow it in chat or check the action results in Sitecore.

Template was created:

Sitecore template created with all necessary fields for the component

Rendering as well:

Sitecore rendering created and configured for the new component

Rendering source file was created:

@ -0,0 +1,61 @@
---
import {
  Field,
  ImageField,
  RichTextField,
  LinkField,
  AstroImage,
  Text,
  RichText,
  Link,
  SitecoreContextMap,
} from "@astro-sitecore-jss/astro-sitecore-jss";

interface Fields {
  Title: Field<string>;
  Description: RichTextField;
  Image: ImageField;
  Link: LinkField;
  CTAText: Field<string>;
}

export type SectionCardProps = {
  params: { [key: string]: string };
  fields: Fields;
};

const props: SectionCardProps = Astro.props.route;
const id = props?.params?.RenderingIdentifier;
const sitecoreContext = SitecoreContextMap.get()["scContext"];
const isPageEditing = sitecoreContext.pageEditing;
---

<div
  class={`component section-card ${props?.params?.styles.trimEnd()}`}
  id={id ? id : undefined}
>
  <div class="container">
    <div class="section-card-content">
      <div class="section-card-image">
        <AstroImage field={props.fields.Image} class="hero-image" />
      </div>
      <div class="section-card-text">
        <div class="section-card-title">
          <Text field={props.fields.Title} />
        </div>
        <div class="section-card-description">
          <RichText field={props.fields.Description} />
        </div>
        {
          (isPageEditing || props.fields?.Link?.value?.href) && (
            <div class="section-card-cta">
              <Link field={props.fields.Link} class="cta-button">
                <Text field={props.fields.CTAText} />
              </Link>
            </div>
          )
        }
      </div>
    </div>
  </div>
</div>

Styles for rendering were also created:

.component.section-card {
  width: 100%;
  margin: 0 auto;
  padding: 2rem 0;

  .container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 1rem;
  }

  .section-card-content {
    display: flex;
    align-items: center;
    gap: 2rem;
    min-height: 330px;

    @media (max-width: 768px) {
      flex-direction: column;
      gap: 1.5rem;
    }
  }

  .section-card-image {
    flex: 0 0 588px;
    height: 330px;
    overflow: hidden;
    border-radius: 8px;

    @media (max-width: 768px) {
      flex: none;
      width: 100%;
      height: 250px;
    }

    .hero-image {
      width: 100%;
      height: 100%;
      object-fit: cover;
    }
  }

  .section-card-text {
    flex: 1;
    padding: 0 1rem;

    @media (max-width: 768px) {
      padding: 0;
    }
  }

  .section-card-title {
    margin-bottom: 1rem;

    h1, h2, h3, h4, h5, h6 {
      font-family: Arial, sans-serif;
      font-size: 32px;
      font-weight: normal;
      color: #002346;
      line-height: 40px;
      margin: 0;

      @media (max-width: 768px) {
        font-size: 28px;
        line-height: 36px;
      }
    }
  }

  .section-card-description {
    margin-bottom: 1.5rem;

    p {
      font-family: Arial, sans-serif;
      font-size: 15.9px;
      color: #002346;
      line-height: 24px;
      margin: 0 0 0.5rem 0;

      &:last-child {
        margin-bottom: 0;
      }
    }
  }

  .section-card-cta {
    .cta-button {
      display: inline-block;
      background-color: #0a5ef0;
      color: white;
      text-decoration: none;
      padding: 12px 24px;
      border-radius: 50px;
      border: 1px solid #0a5ef0;
      font-family: Arial, sans-serif;
      font-size: 16px;
      font-weight: normal;
      line-height: 17.6px;
      text-align: center;
      transition: all 0.3s ease;

      &:hover {
        background-color: #0847c7;
        border-color: #0847c7;
        color: white;
        text-decoration: none;
      }

      &:focus {
        outline: 2px solid #0a5ef0;
        outline-offset: 2px;
      }
    }
  }
}

And it was added to the newly created test page:

Sitecore test page with the new component added and displaying correctly

And the component on the page looks ok. Everything is inline editable: Image, Title, Description, Button link. There are some issues with styles: wrong corner radius for the image, font sizing, etc. Now, we can ask the AI agent to adjust styles or make manual changes.

Code Review

There are a bunch of files that are ready to commit: serialization for template, rendering, test data, styles, and rendering itself.

Code review showing all generated files ready for commit

Let me review them. They are not production-ready. They are more like a good starting point for development. You have all the required items in place, you have all the files in place, and you need only to improve them. You can do it manually or using AI agents.

Sitecore Items

They look ok. Template, Rendering, Test Items. Everything is present. All fields are in place. Nothing is missed. The better is Figma design naming, the better the result. And everything is according to the rules. And it is possible to achieve a different result depending on your rules in CLAUDE.md file.

Only minor improvements could be required, like rendering location and items icons.

Rendering

The rendering code looks great and does not require any changes. It is simple and does everything that is required.

Styles

Styles has some problems. They require changes to be pixel-perfect according to the design. And they need code improvements. Colors and sizes should be moved to variables. Things like buttons should be reusable on the project level. But I can forgive these problems in this case. The new component doesn’t follow the whole design system; there is nothing to reuse. It works much better if the components that you add to Sitecore follow existing styling. It is capable of finding and reusing required things.

Conclusion

AI Agents equipped with Sitecore MCP, Figma MCP, and Chrome DevTools MCP servers could be a powerful tool in your day-to-day work. Now, everyone can create Sitecore components. Even if you are a non-technical person(designer, author, project manager), you can create a new rendering that could be used for some temporary promo or campaign. You don’t need to know Sitecore, Next.js, Astro, HTML, JavaScript, TypeScript, CSS, SCSS, or Tailwind. But it should be used only as a temporary(at least for now) solution.

If you are a developer, you get a great companion that does all the boring work for you. You save your time for interesting and challenging tasks.

This approach could be very beneficial at the project start. You can get all the rendering and data structure in a week, and the content team can start their work. Components creation is not a bottleneck anymore. You can scaffold them using an AI agent and work on improvement.

Also, this approach makes Sitecore a competitor for low-code CMS-like services: Figma Sites, Framer, or Webflow.

Every project is different, and every AI setup should fit your project's needs. Contact us if you need guidance in AI usage for your daily work. We will be glad to help!