class GridKid extends HTMLElement {
static gridKidInitialized = false;
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.style.display = 'none';
if (!GridKid.gridKidInitialized) {
this.initializeGridKid();
GridKid.gridKidInitialized = true;
}
requestAnimationFrame(() => this.applyGridTemplate());
}
initializeGridKid() {
document.querySelectorAll('[area]').forEach(element => {
const areaValue = element.getAttribute('area');
element.style.gridArea = areaValue;
element.classList.add(areaValue); // Optionally add a class with the same name
});
}
applyGridTemplate() {
const parent = this.parentElement;
if (!parent) return;
const styles = [];
for (const attr of this.attributes) {
if (attr.name.startsWith("at-")) {
const breakpoint = attr.name === "at-default" ? null : attr.name.replace("at-", "") + "px";
const gridTemplateAreas = attr.value.replace(/'/g, '"'); // Convert single quotes to double quotes
if (breakpoint) {
styles.push(`
@media (min-width: ${breakpoint}) {
${this.getParentSelector(parent)} {
display: grid;
grid-template-areas: ${gridTemplateAreas};
}
}
`);
} else {
styles.push(`
${this.getParentSelector(parent)} {
display: grid;
grid-template-areas: ${gridTemplateAreas};
}
`);
}
}
}
if (styles.length > 0) {
const styleTag = document.createElement("style");
styleTag.textContent = styles.join("\n");
document.head.appendChild(styleTag);
}
}
getParentSelector(parent) {
if (!parent.dataset.gridId) {
parent.dataset.gridId = `grid-${Math.random().toString(36).substr(2, 9)}`;
parent.classList.add(parent.dataset.gridId);
}
return `.${parent.dataset.gridId}`;
}
}
customElements.define("grid-kid", GridKid);