Loading `component` and `styles` from `pageManager`
One annoying thing is that the editor is prepending the below default styles which when saving the styles has numerous duplicates of it: Edit: Looking at the docs I finally managed to find protectedCss and when set to empty stops the styles being prepended.
Read full answer below ↓Question
GrapesJS version
- I confirm to use the latest version of GrapesJS
What browser are you using?
Chrome v117.0.5938.149
Reproducible demo link
https://jsfiddle.net/9oLrsvya/
Describe the bug
How to reproduce the bug?
- Please see the
pageManagerobject in the jsfiddle
What is the expected behavior? Looking at the following documentation: https://grapesjs.com/docs/api/pages.html#pages
It should load in the component and styles from the pageManager correctly into the editor.
What is the current behavior?
When you check the code via "view code" in the editor you'll notice neither the exact HTML neither the styles have correctly loaded. The body tag does not retain the ID tag that the editor adds when applying any kind of styling to it which means the styling won't work. And the CSS hasn't loaded in correctly at all.
If it is a confirmed bug, I'd be happy to attempt to fix it. It would be great to roughly know where the component and styles are being loaded from as I am not intimately familiar with the project files.
Code of Conduct
- I agree to follow this project's Code of Conduct
Answers (4)
One annoying thing is that the editor is prepending the below default styles which when saving the styles has numerous duplicates of it:
* {
box-sizing: border-box;
}
body {
margin: 0;
}
Edit: Looking at the docs I finally managed to find protectedCss and when set to empty stops the styles being prepended.
Hi @mapsmarketing currently GrapesJS is not able to properly import HTML documents as string, so the parser skips elements like html, head, body and returns only what is parsed inside the body, one workaround you could do right now is to pass component as object
component: {
attributes: { id: 'ignt' },
components: '<div class="my-el">Testing world!</div>',
},
Regarding the styles, it's the browser's default CSSOM parser issue, please refer to this plugin
Hi @artf ,
I've found a way to get the body attributes along with the styles saving correctly via the following method:
const pageManager = editor.Pages;
const page = pageManager.get('my-page-id').toJSON();
const component = pageManager.get('my-page-id').getMainComponent();
page.styles = editor.getCss({ component });
I noticed that your Page.toJSON outputs everything of the specified page. However, it doesn't seem to output the styles correctly (it's always set as undefined for me), so I retrieve the styles for the active page via the editor and override the ones in the JSON. I believe styles are not set due to the if (!props.frames) check you have in Page.ts
The below is an example of how I'm loading in the HTML. I am using frames since component doesn't work with the supplied structure. I am loading in the styles without the use of the parser plugin and it seems to be loading in without issues.
const pageJSON = {...}; // Contains the `frames` and `styles`
const editor = grapesjs.init({
pageManager: {
pages: [
{
id: 'my-page-id',
frames: pageJSON.frames,
styles: pageJSON.styles,
}
]
}
});
I also noticed that the PageManager.select function doesn't update styles when switching between the pages which forces me to run: editor.setStyle(pageJSON.styles);
Thanks for reporting this, @mapsmarketing.
Great question about Loading component and styles from pageManager. The recommended approach with StyleManager is to use the event-driven API.
Start here:
- Check the GrapesJS documentation for your specific module
- Look for the
on()event listener method - Most operations can be achieved by listening to editor and component events
Common patterns:
// Listen for changes
editor.on('change', () => console.log('something changed'));
// Component lifecycle
editor.on('component:mount', (c) => console.log('component ready', c));
editor.on('component:update', (c) => console.log('component updated', c));
If you're still stuck:
- Share a minimal CodeSandbox reproduction
- Include what you've already tried
- Mention your GrapesJS version
- The community is here to help!
Related Questions and Answers
Continue research with similar issue discussions.
Issue #6458
sector.setName doesn't work
GrapesJS version [x] I confirm to use the latest version of GrapesJS What browser are you using? Chrome Reproducible demo link https://jsfi...
Issue #5982
Component styles such as md:flex-row(tailwind) are removed
GrapesJS version[x] I confirm to use the latest version of GrapesJSWhat browser are you using? Chrome 126.0.6478.127Reproducible demo link...
Issue #5173
editor.Css.setRule API not working as expected, it is not updating the rule existing rule.
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Version 112.0.5615.137 (Official Build) (a...
Issue #4371
All editors broken after last update that broke storage manager.
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Chrome Reproducible demo link https://www....
Paid Plugins That Match This Issue
Curated by issue keywords and label relevance to help you ship faster.
Loading paid plugin recommendations...
Check the open-source GrapesJS plugins on GitHub or run a quick search in our free catalog.
Browse free plugins →Premium plugins ship with support, regular updates, and production-ready features — save days of integration work.
Browse premium plugins →Related tutorials
In-depth guides on the same topic.
Tutorial
Find the Right GrapesJS Plugin in Seconds: Smarter Discovery Is Live
We're shipping a set of discovery upgrades. New label filters, a proper compatibility switch for GrapesJS vs Studio, one-click and a smarter sort bar.
Tutorial
GrapesJS vs Webflow vs Tilda: What to Choose for Your Business in 2026
Choosing the right website platform in 2026 is no longer just about building a site
Tutorial
GJS Market 2.0 - Donations, Tracking, Labels and Better Product Discovery
We’ve rolled out a new set of GrapesJS marketplace updates across GJS Market, focused on improving how creators distribute products
Browse Plugin Categories
Jump directly to plugin category pages on the marketplace.