import { AeroElement } from "./AeroElement.js"; import { AeroUtilities } from "./AeroUtilities.js"; import { Icon } from "./Icon.js"; import { WebPageV2 } from "./WebPageV2.js"; /* Turn this: { _type: "aero-slide-prime", theme: "dark", title: `The power of tomorrow`, subtitle: "Hi There", paragraph: `this is a very long text indeed that spread on multiple lines`, background : { _type : "pic", source : "assets/truc0002.jpg" } }, into this:

Say Hello to OCTOFAN

The world's first H2-powered multirole heavy duty drone with switchable nacelles

*/ export class SquareGridV2 extends AeroElement { /** @type {HTMLElement } */ sectionNode; type; /** * @type{List} */ cards = new Array(); /** @type {HTMLDivElement} */ deckNode; /** @type{boolean} */ hasBackgroundImage = false; /** @type{boolean} */ isBackgroundImageLoaded = false; /** @type{string} */ backgroundImagePath; /** * * @param {WebPageV2} page * @param {HTMLElement} sources * @returns */ constructor(page, sources) { super(); /* CSS requirements */ page.css_requireStylesheet("/aero/SquareGrid.css"); /* build nodes */ this.sectionNode = document.createElement("section"); this.sectionNode.classList.add("square-grid-wrapper"); let val; this.type = (val = sources.getAttribute("type")) ? val : "std"; this.sectionNode.setAttribute("type", this.type); this.theme = (val = sources.getAttribute("theme")) ? val : "light"; this.sectionNode.setAttribute("theme", this.theme); /* */ if (val = sources.getAttribute("backgroundImage")) { this.sectionNode.classList.add("background-pic"); AeroUtilities.loadBackgroundImage(this.sectionNode, val); } else if (val = sources.getAttribute("backgroundColor")) { this.sectionNode.classList.add("background-color"); this.sectionNode.style.backgroundColor = val; } /* */ /* */ this.deckNode = document.createElement("div"); this.deckNode.classList.add("square-grid-deck"); let node = sources.firstChild; while(node){ let type = node.nodeName.toLowerCase(); if(type == "card"){ this.cards.push(new SquareGridCard(node)); } node = node.nextSibling; } this.cards.forEach(card => this.deckNode.appendChild(card.html_getNode())); this.sectionNode.appendChild(this.deckNode); /* */ } html_getNode(){ return this.sectionNode; } render(state) { if (!this.isInitialized) { this.draw(); this.isInitialized = true; } } draw() { } } export class SquareGridCard extends AeroElement { /** @type {HTMLDivElement } */ cardNode; type; /** * @type{List} */ elements = new Array(); /** @type {HTMLDivElement} */ assetNode; /** @type{boolean} */ hasBackgroundImage = false; /** @type{boolean} */ isBackgroundImageLoaded = false; /** @type{string} */ backgroundImagePath; /** * * @param {HTMLElement} sources */ constructor(sources) { super(); this.cardNode = document.createElement("div"); this.cardNode.classList.add("square-grid-card"); let val; this.type = (val = sources.getAttribute("type")) ? val : "light"; this.cardNode.setAttribute("type", this.type); this.theme = (val = sources.getAttribute("theme")) ? val : "light"; this.cardNode.setAttribute("theme", this.theme); this.size = (val = sources.getAttribute("size")) ? val : "std"; this.cardNode.setAttribute("size", this.size); /* */ if (val = sources.getAttribute("backgroundImage")) { this.cardNode.classList.add("background-pic"); AeroUtilities.loadBackgroundImage(this.cardNode, val); } else if (val = sources.getAttribute("backgroundColor")) { this.cardNode.classList.add("background-color"); this.cardNode.style.backgroundColor = val; } /* */ /* */ let node = sources.firstChild; while(node){ let type = node.nodeName.toLowerCase(); switch(type){ case "hgroup" : { this.elements.push(new SquareGridCardGroup(node)); } break; case "h1" : { this.elements.push(new SquareGridCardH1(node)); } break; case "h2" : { this.elements.push(new SquareGridCardH2(node)); } break; case "p" : { this.elements.push(new SquareGridCardParagraph(node)); } break; case "a" : { this.elements.push(new SquareGridCardLink(node)); } break; case "li" : { this.elements.push(new SquareGridCardPoint(node)); } break; case "ul" : { this.elements.push(new SquareGridCardList(node)); } break; } node = node.nextSibling; } /* */ this.elements.forEach(element => { this.cardNode.appendChild(element.html_getNode()); }); } html_getNode(){ return this.cardNode; } } export class SquareGridCardElement { constructor(sources) { this.isMobileHideable = sources.hasAttribute("isMobileHideable"); } } export class SquareGridCardGroup extends SquareGridCardElement { constructor(sources) { super(sources); /* */ const groupNode = document.createElement("div"); groupNode.classList.add("square-grid-card-group"); groupNode.innerHTML = sources.innerHTML; /* */ this.groupNode = groupNode; } html_getNode(){ return this.groupNode; } } export class SquareGridCardH1 extends SquareGridCardElement { constructor(sources) { super(sources); const headerNode = document.createElement("h1"); if (this.isMobileHideable) { headerNode.classList.add("square-grid-mobile-hideable"); } headerNode.innerHTML = sources.innerHTML; this.headerNode = headerNode; } html_getNode(){ return this.headerNode; } } export class SquareGridCardH2 extends SquareGridCardElement { constructor(sources) { super(sources); const headerNode = document.createElement("h2"); if (this.isMobileHideable) { headerNode.classList.add("square-grid-mobile-hideable"); } headerNode.innerHTML = sources.innerHTML; this.headerNode = headerNode; } html_getNode(){ return this.headerNode; } } export class SquareGridCardParagraph extends SquareGridCardElement { constructor(sources) { super(sources); const pNode = document.createElement("p"); if (this.isMobileHideable) { pNode.classList.add("square-grid-mobile-hideable"); } /* */ let node = sources.firstChild, nextNode; while(node){ nextNode = node.nextSibling; pNode.appendChild(node); node = nextNode; } /* */ this.pNode = pNode; } html_getNode(){ return this.pNode; } } export class SquareGridCardPoint extends SquareGridCardElement { constructor(sources) { super(sources); this.iconPathname = sources.getAttribute("icon"); const pointNode = document.createElement("div"); pointNode.classList.add("square-grid-card-point"); if (this.isMobileHideable) { pointNode.classList.add("square-grid-mobile-hideable"); } const linkIcon = new Icon(this.iconPathname, { width: 32, height: 32 }); linkIcon.build(); linkIcon.getEnvelope().classList.add("square-grid-card-point-icon"); pointNode.appendChild(linkIcon.getEnvelope()); const textNode = document.createElement("span"); textNode.classList.add("square-grid-card-point-text"); textNode.innerHTML = sources.innerHTML; pointNode.appendChild(textNode); this.linkNode = pointNode; } html_getNode(){ return this.linkNode; } } export class SquareGridCardLink extends SquareGridCardElement { /** * * @param {HTMLElement} sources */ constructor(sources) { super(sources); this.iconPathname = sources.getAttribute("icon"); this.url = sources.getAttribute("href"); const linkNode = document.createElement("div"); linkNode.classList.add("square-grid-card-link"); if (this.isMobileHideable) { linkNode.classList.add("square-grid-mobile-hideable"); } const linkIcon = new Icon(this.iconPathname, { width: 24, height: 24 }); linkIcon.build(); linkIcon.getEnvelope().classList.add("square-grid-card-link-pic"); linkNode.appendChild(linkIcon.getEnvelope()); const spanNode = document.createElement("span"); spanNode.classList.add("square-grid-card-link-text"); spanNode.innerHTML = sources.innerHTML; linkNode.appendChild(spanNode); linkNode.addEventListener("click", () => {window.location = this.url; }, false); this.linkNode = linkNode; } html_getNode(){ return this.linkNode; } } export class SquareGridCardList extends SquareGridCardElement { constructor(sources) { super(sources); const listNode = document.createElement("ul"); if (this.isMobileHideable) { listNode.classList.add("square-grid-mobile-hideable"); } /* */ let node = sources.firstChild; while(node){ let type = node.nodeName.toLowerCase(); switch(type){ case "li" : { const itemNode = document.createElement("li") itemNode.innerHTML = node.innerHTML; listNode.appendChild(itemNode); } break; } node = node.nextSibling; } /* */ this.listNode = listNode; } html_getNode(){ return this.listNode; } }