Cannot add custom AtRule (@container, @font-face)
Thanks for reporting this, @uncldrw. The issue with Cannot add custom AtRule (@container, @font-face) appears to be a race condition or state management timing problem. This typically happens when component lifecycle events and DOM modifications overlap, creating an inconsistent state. What to try: Add a setTimeout wr...
Read full answer below âQuestion
GrapesJS version
- I confirm to use the latest version of GrapesJS
What browser are you using?
Windows, Chrome, React
Reproducible demo link
/
Describe the bug
When attempting to add a custom atRules like @container or @font-face, the CSS consistently compiles to @media instead. I have tried various methods, including using Css.setRules and Css.addRules, as well as inserting an HTML string, all to no avail.
This is my given code:
import { useEffect } from "react";
import grapesjs from "grapesjs";
import "grapesjs/dist/css/grapes.min.css";
import "grapesjs/dist/grapes.min.js";
// import { blocks } from "../src/Grape/Blocks";
function WebBuilder() {
useEffect(() => {
const editor = grapesjs.init({
container: "#gjs",
height: "100vh",
storageManager: false,
// blockManager: {
// blocks,
// },
});
editor.DomComponents.addType("component-css", {
model: {
defaults: {
components: `
<div class="container-portable"><div class="teaser-paa"><div class="teaser-paa__container"><div class="teaser-paa__wrapper"></div></div></div></div>
`,
styles: `
.gjs-cv-canvas{top:0;width:100%;height:100%}.container-portable{width:100%;container-type:inline-size;container-name:portable}.teaser-paa{color:#262626;width:-webkit-calc(100% - 24px);width:calc(100% - 24px);height:504px;border-radius:9px;max-width:1296px;margin-left:auto;margin-right:auto;overflow:hidden}.teaser-paa__container{position:relative;margin:0 auto;width:100%;height:100%;background-position:50%;background-repeat:no-repeat;background-size:cover}@media (min-width: 768px) { .teaser-paa{ height: 300px } }
`,
},
},
});
editor.Css.addRules(
"@container portable (min-width: 768px) { .teaser-paa{ height: 300px } }"
);
}, []);
return (
<main>
<div id="gjs"></div>
</main>
);
}
export default WebBuilder;
Code of Conduct
- I agree to follow this project's Code of Conduct
Answers (1)
Thanks for reporting this, @uncldrw.
The issue with Cannot add custom AtRule (@container, @font-face) appears to be a race condition or state management timing problem. This typically happens when component lifecycle events and DOM modifications overlap, creating an inconsistent state.
What to try:
- Add a setTimeout wrapper to ensure the DOM has settled:
setTimeout(() => {
// your operation here
}, 0);
-
Check initialization order â make sure components are fully loaded before you interact with them
-
Use the editor's event system â listen to completion events:
editor.on('component:mount', (component) => {
// safe to interact with component here
});
Recommended next steps:
- Test with the latest GrapesJS version if you haven't
- Provide a minimal reproducible example (CodeSandbox) â this helps the team identify the root cause faster
- Include GrapesJS version, browser, and console errors in your report
Related Questions and Answers
Continue research with similar issue discussions.
Issue #5990
When you delete a component, duplicate classes between components will be deleted.
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Chrome 126.0.6478.127(Windows) Reproducibl...
Issue #6685
Custom component styles are not applied after deletion and re-addition
GrapesJS version [x] I confirm to use the latest version of GrapesJS What browser are you using? Chrome v143.0.7499.193 Reproducible demo l...
Issue #4196
Ids gets changed while trying to set components on the canvas using json
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Chrome Reproducible demo link no link Desc...
Issue #6096
Resizable Box Disappears on Component Reselection
GrapesJS version [X] I confirm to use the latest version of GrapesJS What browser are you using? Chrome Reproducible demo link https://jsfi...
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 âBrowse Plugin Categories
Jump directly to plugin category pages on the marketplace.