From 62cd9040723b3fc74a4e29ea0b916b47d04a3c6e Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 19 Dec 2023 22:20:15 +0100 Subject: [PATCH 01/59] #414986 --- blocks/example/example.js | 6 + blocks/footer/footer.js | 6 +- blocks/header/header.css | 275 -------------- blocks/header/header.js | 147 +------- head.html | 5 +- package-lock.json | 4 +- scripts/component-base.js | 32 ++ scripts/component-loader.js | 115 ++++++ scripts/init.js | 43 +++ scripts/lib-franklin.js | 690 +----------------------------------- scripts/scripts.js | 2 +- styles/styles.css | 254 +------------ 12 files changed, 224 insertions(+), 1355 deletions(-) create mode 100644 blocks/example/example.js create mode 100644 scripts/component-base.js create mode 100644 scripts/component-loader.js create mode 100644 scripts/init.js diff --git a/blocks/example/example.js b/blocks/example/example.js new file mode 100644 index 00000000..9d5a9d00 --- /dev/null +++ b/blocks/example/example.js @@ -0,0 +1,6 @@ + +export default class Example extends HTMLElement { + constructor() { + super(); + } +} \ No newline at end of file diff --git a/blocks/footer/footer.js b/blocks/footer/footer.js index ca8c7a68..d62e5c12 100644 --- a/blocks/footer/footer.js +++ b/blocks/footer/footer.js @@ -1,15 +1,19 @@ -import { readBlockConfig, decorateIcons } from '../../scripts/lib-franklin.js'; +import { readBlockConfig, decorateIcons, getMetadata } from '../../scripts/lib-franklin.js'; /** * loads and decorates the footer * @param {Element} block The footer block element */ export default async function decorate(block) { + console.log('decorating footer', block); const cfg = readBlockConfig(block); + const meta = getMetadata('footer'); + console.log('footer config', cfg, meta); block.textContent = ''; // fetch footer content const footerPath = cfg.footer || '/footer'; + console.log(`fetching footer from ${footerPath}`); const resp = await fetch(`${footerPath}.plain.html`, window.location.pathname.endsWith('/footer') ? { cache: 'reload' } : {}); if (resp.ok) { diff --git a/blocks/header/header.css b/blocks/header/header.css index 4c2b46d5..e69de29b 100644 --- a/blocks/header/header.css +++ b/blocks/header/header.css @@ -1,275 +0,0 @@ -/* header and nav layout */ -header .nav-wrapper { - background-color: var(--background-color); - width: 100%; - z-index: 2; - position: fixed; -} - -header nav { - box-sizing: border-box; - display: grid; - grid-template: - 'hamburger brand tools' var(--nav-height) - 'sections sections sections' 1fr / auto 1fr auto; - align-items: center; - gap: 0 2em; - margin: auto; - max-width: 1264px; - height: var(--nav-height); - padding: 0 1rem; - font-family: var(--body-font-family); -} - -header nav[aria-expanded="true"] { - grid-template: - 'hamburger brand' var(--nav-height) - 'sections sections' 1fr - 'tools tools' var(--nav-height) / auto 1fr; - overflow-y: auto; - min-height: 100vh; -} - -@media (min-width: 600px) { - header nav { - padding: 0 2rem; - } -} - -@media (min-width: 900px) { - header nav { - display: flex; - justify-content: space-between; - } - - header nav[aria-expanded="true"] { - min-height: 0; - overflow: visible; - } -} - -header nav p { - margin: 0; - line-height: 1; -} - -header nav a:any-link { - color: currentcolor; -} - -/* hamburger */ -header nav .nav-hamburger { - grid-area: hamburger; - height: 22px; - display: flex; - align-items: center; -} - -header nav .nav-hamburger button { - height: 22px; - margin: 0; - border: 0; - border-radius: 0; - padding: 0; - background-color: var(--background-color); - color: inherit; - overflow: initial; - text-overflow: initial; - white-space: initial; -} - -header nav .nav-hamburger-icon, -header nav .nav-hamburger-icon::before, -header nav .nav-hamburger-icon::after { - box-sizing: border-box; - display: block; - position: relative; - width: 20px; -} - -header nav .nav-hamburger-icon::before, -header nav .nav-hamburger-icon::after { - content: ''; - position: absolute; - background: currentcolor; -} - -header nav[aria-expanded="false"] .nav-hamburger-icon, -header nav[aria-expanded="false"] .nav-hamburger-icon::before, -header nav[aria-expanded="false"] .nav-hamburger-icon::after { - height: 2px; - border-radius: 2px; - background: currentcolor; -} - -header nav[aria-expanded="false"] .nav-hamburger-icon::before { - top: -6px; -} - -header nav[aria-expanded="false"] .nav-hamburger-icon::after { - top: 6px; -} - -header nav[aria-expanded="true"] .nav-hamburger-icon { - height: 22px; -} - -header nav[aria-expanded="true"] .nav-hamburger-icon::before, -header nav[aria-expanded="true"] .nav-hamburger-icon::after { - top: 3px; - left: 1px; - transform: rotate(45deg); - transform-origin: 2px 1px; - width: 24px; - height: 2px; - border-radius: 2px; -} - -header nav[aria-expanded="true"] .nav-hamburger-icon::after { - top: unset; - bottom: 3px; - transform: rotate(-45deg); -} - -@media (min-width: 900px) { - header nav .nav-hamburger { - display: none; - visibility: hidden; - } -} - -/* brand */ -header .nav-brand { - grid-area: brand; - flex-basis: 128px; - font-size: var(--heading-font-size-s); - font-weight: 700; - line-height: 1; -} - -header nav .nav-brand img { - width: 128px; - height: auto; -} - -/* sections */ -header nav .nav-sections { - grid-area: sections; - flex: 1 1 auto; - display: none; - visibility: hidden; - background-color: var(--overlay-color); -} - -header nav[aria-expanded="true"] .nav-sections { - display: block; - visibility: visible; - align-self: start; -} - -header nav .nav-sections ul { - list-style: none; - padding-left: 0; - font-size: var(--body-font-size-s); - font-weight: 500; -} - -header nav .nav-sections ul > li { - font-weight: 700; -} - -header nav .nav-sections ul > li > ul { - margin-top: 0; -} - -header nav .nav-sections ul > li > ul > li { - font-weight: 500; -} - -@media (min-width: 900px) { - header nav .nav-sections { - display: block; - visibility: visible; - white-space: nowrap; - } - - header nav[aria-expanded="true"] .nav-sections { - align-self: unset; - } - - header nav .nav-sections .nav-drop { - position: relative; - padding-right: 16px; - cursor: pointer; - } - - header nav .nav-sections .nav-drop::after { - content: ''; - display: inline-block; - position: absolute; - top: .5em; - right: 2px; - transform: rotate(135deg); - width: 6px; - height: 6px; - border: 2px solid currentcolor; - border-radius: 0 1px 0 0; - border-width: 2px 2px 0 0; - } - - header nav .nav-sections .nav-drop[aria-expanded="true"]::after { - top: unset; - bottom: .5em; - transform: rotate(315deg); - } - - header nav .nav-sections ul { - display: flex; - gap: 2em; - margin: 0; - font-size: var(--body-font-size-xs); - } - - header nav .nav-sections > ul > li { - flex: 0 1 auto; - position: relative; - font-weight: 500; - } - - header nav .nav-sections > ul > li > ul { - display: none; - position: relative; - } - - header nav .nav-sections > ul > li[aria-expanded="true"] > ul { - display: block; - position: absolute; - left: -1em; - width: 200px; - margin-top: 12px; - padding: 1em; - background-color: var(--highlight-background-color); - white-space: initial; - } - - header nav .nav-sections > ul > li > ul::before { - content: ''; - position: absolute; - top: -8px; - left: 8px; - width: 0; - height: 0; - border-left: 8px solid transparent; - border-right: 8px solid transparent; - border-bottom: 8px solid var(--highlight-background-color); - } - - header nav .nav-sections > ul > li > ul > li { - padding: 8px 0; - } -} - -/* tools */ -header nav .nav-tools { - grid-area: tools; -} diff --git a/blocks/header/header.js b/blocks/header/header.js index 9159e0d7..26682d0c 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -1,145 +1,10 @@ -import { getMetadata, decorateIcons } from '../../scripts/lib-franklin.js'; +// import { getMetadata, decorateIcons } from '../../scripts/lib-franklin.js'; -// media query match that indicates mobile/tablet width -const isDesktop = window.matchMedia('(min-width: 900px)'); +import { ComponentBase } from "../../scripts/component-base.js"; -function closeOnEscape(e) { - if (e.code === 'Escape') { - const nav = document.getElementById('nav'); - const navSections = nav.querySelector('.nav-sections'); - const navSectionExpanded = navSections.querySelector('[aria-expanded="true"]'); - if (navSectionExpanded && isDesktop.matches) { - // eslint-disable-next-line no-use-before-define - toggleAllNavSections(navSections); - navSectionExpanded.focus(); - } else if (!isDesktop.matches) { - // eslint-disable-next-line no-use-before-define - toggleMenu(nav, navSections); - nav.querySelector('button').focus(); +export default class Header extends ComponentBase { + external = '/header'; + constructor() { + super(); } - } -} - -function openOnKeydown(e) { - const focused = document.activeElement; - const isNavDrop = focused.className === 'nav-drop'; - if (isNavDrop && (e.code === 'Enter' || e.code === 'Space')) { - const dropExpanded = focused.getAttribute('aria-expanded') === 'true'; - // eslint-disable-next-line no-use-before-define - toggleAllNavSections(focused.closest('.nav-sections')); - focused.setAttribute('aria-expanded', dropExpanded ? 'false' : 'true'); - } -} - -function focusNavSection() { - document.activeElement.addEventListener('keydown', openOnKeydown); -} - -/** - * Toggles all nav sections - * @param {Element} sections The container element - * @param {Boolean} expanded Whether the element should be expanded or collapsed - */ -function toggleAllNavSections(sections, expanded = false) { - sections.querySelectorAll('.nav-sections > ul > li').forEach((section) => { - section.setAttribute('aria-expanded', expanded); - }); -} - -/** - * Toggles the entire nav - * @param {Element} nav The container element - * @param {Element} navSections The nav sections within the container element - * @param {*} forceExpanded Optional param to force nav expand behavior when not null - */ -function toggleMenu(nav, navSections, forceExpanded = null) { - const expanded = forceExpanded !== null ? !forceExpanded : nav.getAttribute('aria-expanded') === 'true'; - const button = nav.querySelector('.nav-hamburger button'); - document.body.style.overflowY = (expanded || isDesktop.matches) ? '' : 'hidden'; - nav.setAttribute('aria-expanded', expanded ? 'false' : 'true'); - toggleAllNavSections(navSections, expanded || isDesktop.matches ? 'false' : 'true'); - button.setAttribute('aria-label', expanded ? 'Open navigation' : 'Close navigation'); - // enable nav dropdown keyboard accessibility - const navDrops = navSections.querySelectorAll('.nav-drop'); - if (isDesktop.matches) { - navDrops.forEach((drop) => { - if (!drop.hasAttribute('tabindex')) { - drop.setAttribute('role', 'button'); - drop.setAttribute('tabindex', 0); - drop.addEventListener('focus', focusNavSection); - } - }); - } else { - navDrops.forEach((drop) => { - drop.removeAttribute('role'); - drop.removeAttribute('tabindex'); - drop.removeEventListener('focus', focusNavSection); - }); - } - // enable menu collapse on escape keypress - if (!expanded || isDesktop.matches) { - // collapse menu on escape press - window.addEventListener('keydown', closeOnEscape); - } else { - window.removeEventListener('keydown', closeOnEscape); - } -} - -/** - * decorates the header, mainly the nav - * @param {Element} block The header block element - */ -export default async function decorate(block) { - // fetch nav content - const navMeta = getMetadata('nav'); - const navPath = navMeta ? new URL(navMeta).pathname : '/nav'; - const resp = await fetch(`${navPath}.plain.html`); - - if (resp.ok) { - const html = await resp.text(); - - // decorate nav DOM - const nav = document.createElement('nav'); - nav.id = 'nav'; - nav.innerHTML = html; - - const classes = ['brand', 'sections', 'tools']; - classes.forEach((c, i) => { - const section = nav.children[i]; - if (section) section.classList.add(`nav-${c}`); - }); - - const navSections = nav.querySelector('.nav-sections'); - if (navSections) { - navSections.querySelectorAll(':scope > ul > li').forEach((navSection) => { - if (navSection.querySelector('ul')) navSection.classList.add('nav-drop'); - navSection.addEventListener('click', () => { - if (isDesktop.matches) { - const expanded = navSection.getAttribute('aria-expanded') === 'true'; - toggleAllNavSections(navSections); - navSection.setAttribute('aria-expanded', expanded ? 'false' : 'true'); - } - }); - }); - } - - // hamburger for mobile - const hamburger = document.createElement('div'); - hamburger.classList.add('nav-hamburger'); - hamburger.innerHTML = ``; - hamburger.addEventListener('click', () => toggleMenu(nav, navSections)); - nav.prepend(hamburger); - nav.setAttribute('aria-expanded', 'false'); - // prevent mobile nav behavior on window resize - toggleMenu(nav, navSections, isDesktop.matches); - isDesktop.addEventListener('change', () => toggleMenu(nav, navSections, isDesktop.matches)); - - decorateIcons(nav); - const navWrapper = document.createElement('div'); - navWrapper.className = 'nav-wrapper'; - navWrapper.append(nav); - block.append(navWrapper); - } } diff --git a/head.html b/head.html index 290a57f0..0ce1b879 100644 --- a/head.html +++ b/head.html @@ -1,4 +1,5 @@ - - + + + diff --git a/package-lock.json b/package-lock.json index 84797a11..c23bc9b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@adobe/helix-project-boilerplate", - "version": "1.0.0", + "version": "1.2.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@adobe/helix-project-boilerplate", - "version": "1.0.0", + "version": "1.2.2", "license": "Apache License 2.0", "devDependencies": { "@babel/core": "7.21.0", diff --git a/scripts/component-base.js b/scripts/component-base.js new file mode 100644 index 00000000..0a6692c7 --- /dev/null +++ b/scripts/component-base.js @@ -0,0 +1,32 @@ +import { init } from "./init.js"; + + +export class ComponentBase extends HTMLElement { + external = false; + constructor() { + super(); + } + async connectedCallback() { + console.log('connectedCallback', this.external); + if (this.external) { + await this.load(this.external); + } + this.render(); + } + + async load() { + const resp = await fetch(`${this.external}.plain.html`, window.location.pathname.endsWith(this.external) ? { cache: 'reload' } : {}); + + if (resp.ok) { + const html = await resp.text(); + console.log(this.innerHTML) + this.innerHTML = html; + init(this); + } + } + + render() { + + } +} + diff --git a/scripts/component-loader.js b/scripts/component-loader.js new file mode 100644 index 00000000..3cb7c045 --- /dev/null +++ b/scripts/component-loader.js @@ -0,0 +1,115 @@ + + +export class ComponentLoader { + constructor(blockName, element) { + window.raqnComponents = window.raqnComponents || {}; + this.block = element; + this.blockName = blockName; + this.setBlockPaths(); + this.setParams(); + this.content = this.block.children; + } + + /** + * Loads a CSS file. + * @param {string} href URL to the CSS file + */ + async loadCSS(href) { + return new Promise((resolve, reject) => { + if (!document.querySelector(`head > link[href="${href}"]`)) { + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.href = href; + link.onload = resolve; + link.onerror = reject; + document.head.append(link); + } else { + resolve(); + } + }); + } + + /** + * Parse extra params from classList + */ + setParams() { + this.params = Array.from(this.block.classList) + .filter((c) => { + console.log(c,this.blockName, c !== this.blockName && c !== 'block'); + return c !== this.blockName && c !== 'block'; + }) + .reduce((acc, c) => { + const values = c.split('-'); + const key = values.shift(); + if (acc[key] && Array.isArray(acc[key])) { + acc[key].push(values.join('-')); + } else if (acc[key]) { + acc[key] = [acc[key], values.join('-')]; + } else { + acc[key] = values.join('-'); + } + return acc; + }, {}); + } + + /** + * Set the configuration for the given block, and also passes + * the config through all custom patching helpers added to the project. + * + * @param {Element} block The block element + * @returns {Object} The block config (blockName, cssPath and jsPath) + */ + setBlockPaths() { + this.cssPath = `/blocks/${this.blockName}/${this.blockName}.css`; + this.jsPath = `/blocks/${this.blockName}/${this.blockName}.js`; + } + + + async decorate() { + const status = this.block.dataset.blockStatus; + if (status !== 'loading' && status !== 'loaded') { + this.block.dataset.blockStatus = 'loading'; + try { + const cssLoaded = this.loadCSS(this.cssPath); + const decorationComplete = new Promise((resolve) => { + (async () => { + try { + const mod = await import(this.jsPath); + if (mod.default && mod.default.name && mod.default.name !== 'decorate') { + const name = mod.default.name; + const elementName = `raqn-${name.toLowerCase()}`; + // define the custom element if it doesn't exist + if (!window.raqnComponents[name]) { + const elementName = `raqn-${name.toLowerCase()}`; + const Contructor = mod.default + customElements.define(elementName, Contructor); + window.raqnComponents[name] = Contructor; + } + const element = document.createElement(elementName); + element.innerHTML = this.block.innerHTML; + Object.keys(this.params).forEach((key) => { + // @TODO sanitize + const value = Array.isArray(this.params[key]) ? this.params[key].join(' ') : this.params[key]; + element.setAttribute(key, value); + }); + this.block.replaceWith(element); + } else if (mod.default) { + await mod.default(this.block); + } + } catch (error) { + // eslint-disable-next-line no-console + console.log(`failed to load module for ${this.blockName}`, error); + } + resolve(); + })(); + }); + + return await Promise.all([cssLoaded, decorationComplete]); + } catch (error) { + // eslint-disable-next-line no-console + console.log(`failed to load block ${this.blockName}`, error); + } + } + } +} + diff --git a/scripts/init.js b/scripts/init.js new file mode 100644 index 00000000..9bbbe74d --- /dev/null +++ b/scripts/init.js @@ -0,0 +1,43 @@ +import { ComponentLoader } from './component-loader.js'; + +export const config = { + elementBlocks: ['header', 'footer'], +}; + +export function retriveDataFrom(blocks) { + return blocks.map((block) => { + let element = block; + const tagName = element.tagName.toLowerCase(); + let blockName = tagName; + if (!config.elementBlocks.includes(tagName)) { + blockName = element.classList[0]; + element = document.createElement('div'); + block.append(element); + } + return { + blockName, + element, + }; + }); +} + +export function init(element = document) { + document.body.style.display = 'none'; + let blocks = Array.from(element.querySelectorAll('[class]')); + if (element === document) { + const header = element.querySelector('header'); + const footer = element.querySelector('footer'); + blocks = [header,...blocks,footer]; + } + + const data = retriveDataFrom(blocks); + Promise.all(data.map(({blockName, element}) => { + const loader = new ComponentLoader(blockName, element); + return loader.decorate(); + })).then(() => { + document.body.style.display = 'block'; + }); +} + +window.loaderData = config; +init(); \ No newline at end of file diff --git a/scripts/lib-franklin.js b/scripts/lib-franklin.js index 80b042e0..350b4fac 100644 --- a/scripts/lib-franklin.js +++ b/scripts/lib-franklin.js @@ -10,692 +10,6 @@ * governing permissions and limitations under the License. */ -/** - * log RUM if part of the sample. - * @param {string} checkpoint identifies the checkpoint in funnel - * @param {Object} data additional data for RUM sample - */ -export function sampleRUM(checkpoint, data = {}) { - sampleRUM.defer = sampleRUM.defer || []; - const defer = (fnname) => { - sampleRUM[fnname] = sampleRUM[fnname] - || ((...args) => sampleRUM.defer.push({ fnname, args })); - }; - sampleRUM.drain = sampleRUM.drain - || ((dfnname, fn) => { - sampleRUM[dfnname] = fn; - sampleRUM.defer - .filter(({ fnname }) => dfnname === fnname) - .forEach(({ fnname, args }) => sampleRUM[fnname](...args)); - }); - sampleRUM.always = sampleRUM.always || []; - sampleRUM.always.on = (chkpnt, fn) => { sampleRUM.always[chkpnt] = fn; }; - sampleRUM.on = (chkpnt, fn) => { sampleRUM.cases[chkpnt] = fn; }; - defer('observe'); - defer('cwv'); - try { - window.hlx = window.hlx || {}; - if (!window.hlx.rum) { - const usp = new URLSearchParams(window.location.search); - const weight = (usp.get('rum') === 'on') ? 1 : 100; // with parameter, weight is 1. Defaults to 100. - // eslint-disable-next-line no-bitwise - const hashCode = (s) => s.split('').reduce((a, b) => (((a << 5) - a) + b.charCodeAt(0)) | 0, 0); - const id = `${hashCode(window.location.href)}-${new Date().getTime()}-${Math.random().toString(16).substr(2, 14)}`; - const random = Math.random(); - const isSelected = (random * weight < 1); - const urlSanitizers = { - full: () => window.location.href, - origin: () => window.location.origin, - path: () => window.location.href.replace(/\?.*$/, ''), - }; - // eslint-disable-next-line object-curly-newline, max-len - window.hlx.rum = { weight, id, random, isSelected, sampleRUM, sanitizeURL: urlSanitizers[window.hlx.RUM_MASK_URL || 'path'] }; - } - const { weight, id } = window.hlx.rum; - if (window.hlx && window.hlx.rum && window.hlx.rum.isSelected) { - const sendPing = (pdata = data) => { - // eslint-disable-next-line object-curly-newline, max-len, no-use-before-define - const body = JSON.stringify({ weight, id, referer: window.hlx.rum.sanitizeURL(), checkpoint, ...data }); - const url = `https://rum.hlx.page/.rum/${weight}`; - // eslint-disable-next-line no-unused-expressions - navigator.sendBeacon(url, body); - // eslint-disable-next-line no-console - console.debug(`ping:${checkpoint}`, pdata); - }; - sampleRUM.cases = sampleRUM.cases || { - cwv: () => sampleRUM.cwv(data) || true, - lazy: () => { - // use classic script to avoid CORS issues - const script = document.createElement('script'); - script.src = 'https://rum.hlx.page/.rum/@adobe/helix-rum-enhancer@^1/src/index.js'; - document.head.appendChild(script); - return true; - }, - }; - sendPing(data); - if (sampleRUM.cases[checkpoint]) { sampleRUM.cases[checkpoint](); } - } - if (sampleRUM.always[checkpoint]) { sampleRUM.always[checkpoint](data); } - } catch (error) { - // something went wrong - } -} - -/** - * Loads a CSS file. - * @param {string} href URL to the CSS file - */ -export async function loadCSS(href) { - return new Promise((resolve, reject) => { - if (!document.querySelector(`head > link[href="${href}"]`)) { - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = href; - link.onload = resolve; - link.onerror = reject; - document.head.append(link); - } else { - resolve(); - } - }); -} - -/** - * Loads a non module JS file. - * @param {string} src URL to the JS file - * @param {Object} attrs additional optional attributes - */ - -export async function loadScript(src, attrs) { - return new Promise((resolve, reject) => { - if (!document.querySelector(`head > script[src="${src}"]`)) { - const script = document.createElement('script'); - script.src = src; - if (attrs) { - // eslint-disable-next-line no-restricted-syntax, guard-for-in - for (const attr in attrs) { - script.setAttribute(attr, attrs[attr]); - } - } - script.onload = resolve; - script.onerror = reject; - document.head.append(script); - } else { - resolve(); - } - }); -} - -/** - * Retrieves the content of metadata tags. - * @param {string} name The metadata name (or property) - * @returns {string} The metadata value(s) - */ -export function getMetadata(name) { - const attr = name && name.includes(':') ? 'property' : 'name'; - const meta = [...document.head.querySelectorAll(`meta[${attr}="${name}"]`)].map((m) => m.content).join(', '); - return meta || ''; -} - -/** - * Sanitizes a string for use as class name. - * @param {string} name The unsanitized string - * @returns {string} The class name - */ -export function toClassName(name) { - return typeof name === 'string' - ? name.toLowerCase().replace(/[^0-9a-z]/gi, '-').replace(/-+/g, '-').replace(/^-|-$/g, '') - : ''; -} - -/** - * Sanitizes a string for use as a js property name. - * @param {string} name The unsanitized string - * @returns {string} The camelCased name - */ -export function toCamelCase(name) { - return toClassName(name).replace(/-([a-z])/g, (g) => g[1].toUpperCase()); -} - -const ICONS_CACHE = {}; -/** - * Replace icons with inline SVG and prefix with codeBasePath. - * @param {Element} [element] Element containing icons - */ -export async function decorateIcons(element) { - // Prepare the inline sprite - let svgSprite = document.getElementById('franklin-svg-sprite'); - if (!svgSprite) { - const div = document.createElement('div'); - div.innerHTML = ''; - svgSprite = div.firstElementChild; - document.body.append(div.firstElementChild); - } - - // Download all new icons - const icons = [...element.querySelectorAll('span.icon')]; - await Promise.all(icons.map(async (span) => { - const iconName = Array.from(span.classList).find((c) => c.startsWith('icon-')).substring(5); - if (!ICONS_CACHE[iconName]) { - ICONS_CACHE[iconName] = true; - try { - const response = await fetch(`${window.hlx.codeBasePath}/icons/${iconName}.svg`); - if (!response.ok) { - ICONS_CACHE[iconName] = false; - return; - } - // Styled icons don't play nice with the sprite approach because of shadow dom isolation - // and same for internal references - const svg = await response.text(); - if (svg.match(/( + ` + + document.body.style.display = 'block'; + } + + async processExternal(response) { + if (response.ok) { + this.themeJson = await response.json(); + console.log(this); + this.createVariables() + this.styles(); + } + } +} \ No newline at end of file diff --git a/head.html b/head.html index f052d2d9..b58e3f51 100644 --- a/head.html +++ b/head.html @@ -1,7 +1,6 @@ - - + diff --git a/scripts/component-base.js b/scripts/component-base.js index 83b764d7..0e7e9387 100644 --- a/scripts/component-base.js +++ b/scripts/component-base.js @@ -1,12 +1,18 @@ import { init } from "./init.js"; export class ComponentBase extends HTMLElement { + static observedAttributes = ["position", "size"]; + static dependencies = []; + attributes = {}; external = false; + uuid = `gen${crypto.randomUUID().split('-')[0]}`; + constructor() { super(); } + async connectedCallback() { - console.log('connectedCallback', this.external); + this.setAttribute('id', this.uuid); if (this.external) { await this.load(this.external); } @@ -15,13 +21,17 @@ export class ComponentBase extends HTMLElement { } async load(block) { - const resp = await fetch(`${block}.plain.html`, window.location.pathname.endsWith(block) ? { cache: 'reload' } : {}); + const response = await fetch(`${block}`, window.location.pathname.endsWith(block) ? { cache: 'reload' } : {}); + return this.processExternal(response); + } - if (resp.ok) { - const html = await resp.text(); - console.log(this.innerHTML) + async processExternal(response) { + if (response.ok) { + const html = await response.text(); this.innerHTML = html; - init(this); + return init(this); + } else { + console.log(response); } } diff --git a/scripts/component-loader.js b/scripts/component-loader.js index 36aca92d..d08f24e6 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -2,7 +2,6 @@ export class ComponentLoader { constructor(blockName, element) { - console.log('ComponentLoader', blockName, element); window.raqnComponents = window.raqnComponents || {}; this.block = element; this.blockName = blockName; @@ -36,7 +35,6 @@ export class ComponentLoader { setParams() { this.params = Array.from(this.block.classList) .filter((c) => { - console.log(c,this.blockName, c !== this.blockName && c !== 'block'); return c !== this.blockName && c !== 'block'; }) .reduce((acc, c) => { @@ -49,7 +47,6 @@ export class ComponentLoader { } else { acc[key] = values.join('-'); } - console.log(acc, key, values); return acc; }, {}); } @@ -86,18 +83,17 @@ export class ComponentLoader { const Contructor = mod.default customElements.define(elementName, Contructor); window.raqnComponents[name] = Contructor; + console.log(elementName, Contructor); } + const element = document.createElement(elementName); element.innerHTML = this.block.innerHTML; - this.block.replaceWith(element); - console.log('decorate', this.params); Object.keys(this.params).forEach((key) => { // @TODO sanitize const value = Array.isArray(this.params[key]) ? this.params[key].join(' ') : this.params[key]; element.setAttribute(key, value); - console.log(key, value); }); - console.log('decorate', element); + this.block.replaceWith(element); } else if (mod.default) { await mod.default(this.block); diff --git a/scripts/init.js b/scripts/init.js index 6a32e341..812f8f3d 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -23,8 +23,8 @@ export function retriveDataFrom(blocks) { } export async function init(element = document) { - document.body.style.display = 'none'; - let blocks = Array.from(element.querySelectorAll('[class]')); + let blocks = Array.from(element.querySelectorAll('[class]:not([class^=raqn]')); + console.log(blocks); if (element === document) { const header = element.querySelector('header'); const footer = element.querySelector('footer'); @@ -33,11 +33,10 @@ export async function init(element = document) { const data = retriveDataFrom(blocks); Promise.all(data.map(({blockName, element}) => { + console.log(blockName, element); const loader = new ComponentLoader(blockName, element); return loader.decorate(); - })).then(() => { - document.body.style.display = 'block'; - }); + })) } window.loaderData = config; diff --git a/scripts/lib-franklin.js b/scripts/lib-franklin.js index 7b6cf0cf..c5a54d04 100644 --- a/scripts/lib-franklin.js +++ b/scripts/lib-franklin.js @@ -329,20 +329,6 @@ export function readBlockConfig(block) { return config; } -export function addCssVariables(element, variables) { - if (!element.id) { - const id = `gen${crypto.randomUUID().split('-')[0]}`; - element.id = id; - } - - const style = document.createElement('style'); - style.textContent = `#${element.id} { - ${Object.keys(variables).map((k) => variables[k] && `--${k}: ${variables[k]};`).join(' ')} - }`; - - element.parentNode.insertBefore(style, element); -} - export function decorateSection(section) { const wrappers = []; let defaultContent = false; diff --git a/styles/styles.css b/styles/styles.css index 8c3f54a5..08bc7020 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -1,47 +1,4 @@ -/* - * Copyright 2020 Adobe. All rights reserved. - * This file is licensed to you under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. You may obtain a copy - * of the License at http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under - * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS - * OF ANY KIND, either express or implied. See the License for the specific language - * governing permissions and limitations under the License. - */ - :root { - /* colors */ - --link-color: #035fe6; - --link-hover-color: #136ff6; - --background-color: #fff; - --overlay-background-color: #eee; - --highlight-background-color: #ccc; - --text-color: #000; - - /* fonts */ - --body-font-family: roboto, roboto-fallback; - --heading-font-family: var(--body-font-family); - --fixed-font-family: 'Roboto Mono', menlo, consolas, 'Liberation Mono', monospace; - - /* body sizes */ - --body-font-size-m: 22px; - --body-font-size-s: 18px; - --body-font-size-xs: 16px; - - /* heading sizes */ - --heading-font-size-xxl: 48px; - --heading-font-size-xl: 40px; - --heading-font-size-l: 32px; - --heading-font-size-m: 24px; - --heading-font-size-s: 20px; - --heading-font-size-xs: 18px; - - /* mind the gaps */ - --padding-horizontal: 32px; - --padding-vertical: 16px; - -} @font-face { font-family: roboto-fallback; @@ -50,191 +7,6 @@ src: local('Arial'); } - -@media (min-width: 900px) { - :root { - --heading-font-size-xxl: 60px; - --heading-font-size-xl: 48px; - --heading-font-size-l: 36px; - --heading-font-size-m: 30px; - --heading-font-size-s: 24px; - --heading-font-size-xs: 22px; - } -} - body { - font-size: var(--body-font-size-m); - margin: 0; - font-family: var(--body-font-family); - line-height: 1.6; - color: var(--text-color); - background-color: var(--background-color); display: none; } - -body.appear { - display: block; -} - -header { - height: var(--header-height, 120px); - background-color: var(--background-color); - color: var(--text-color); -} - -header svg { - fill: var(--text-color); -} - -h1, h2, h3, -h4, h5, h6 { - font-family: var(--heading-font-family); - font-weight: 600; - line-height: 1.25; - margin-top: 1em; - margin-bottom: .5em; -} - -h1 { font-size: var(--heading-font-size-xxl) } -h2 { font-size: var(--heading-font-size-xl) } -h3 { font-size: var(--heading-font-size-l) } -h4 { font-size: var(--heading-font-size-m) } -h5 { font-size: var(--heading-font-size-s) } -h6 { font-size: var(--heading-font-size-xs) } - -p, dl, ol, ul, pre, blockquote { - margin-top: 1em; - margin-bottom: 1em; -} - -hr { - margin-top: 1.5em; - margin-bottom: 1.5em; - border: 0; - border-bottom: 1px solid var(--overlay-background-color); -} - -code, pre, samp { - font-family: var(--fixed-font-family); - font-size: var(--body-font-size-s); -} - -code, samp { - padding: .125em; -} - -pre { - overflow: scroll; -} - -main pre { - background-color: var(--overlay-background-color); - padding: 1em; - border-radius: .25em; - overflow-x: auto; - white-space: pre; -} - -a:any-link { - color: var(--link-color); - text-decoration: none; -} - -a:hover { - text-decoration: underline; - color: var(--link-hover-color); -} - -/* buttons */ -a.button:any-link, button { - font-family: var(--body-font-family); - display: inline-block; - box-sizing: border-box; - text-decoration: none; - border: 2px solid transparent; - padding: 5px 30px; - text-align: center; - font-style: normal; - font-weight: 600; - cursor: pointer; - color: var(--background-color); - background-color: var(--link-color); - margin: 16px 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - border-radius: 30px; -} - -a.button:hover, a.button:focus, button:hover, button:focus { - background-color: var(--link-hover-color); - cursor: pointer; -} - -button:disabled, button:disabled:hover { - background-color: var(--overlay-background-color); - cursor: unset; -} - -a.button.secondary, button.secondary { - background-color: unset; - border: 2px solid currentcolor; - color: var(--text-color) -} - -main input { - font-size: 1.25rem; - width: 100%; - max-width: 50rem; - display: block; - margin-bottom: 1rem; - padding: 0.75rem 0.6rem; - border-radius: 0.25rem; - box-sizing: border-box; - border: 1px solid var(--text-color); - color: var(--text-color); - background-color: var(--background-color); -} - -main input:hover { - border: 1px solid var(--text-color); -} - -main blockquote { - font-style: italic; - margin: 3rem; - text-indent: -1rem; - hanging-punctuation: first; -} - -main blockquote p::before { - content: "“"; - line-height: 0; -} - -main blockquote p::after { - content: "”"; - line-height: 0; -} - -main img { - max-width: 100%; - width: auto; - height: auto; -} - -.icon { - display: inline-block; - height: 24px; - width: 24px; -} - -.icon svg { - height: 100%; - width: 100%; -} - -main .section { - background-color: var(--background-color, transparent); - color: var(--text-color); -} From 2d218a3b7802412e93bbd46003c67f66f057fab7 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 22 Dec 2023 17:28:24 +0100 Subject: [PATCH 04/59] #414986 > review mobile params --- blocks/button/button.css | 25 +++++ blocks/button/button.js | 8 ++ blocks/card/card.css | 5 + blocks/card/card.js | 9 ++ blocks/column/column.js | 14 ++- blocks/example/example.css | 3 - blocks/example/example.js | 7 -- blocks/footer/footer.js | 30 ++---- blocks/header/header.css | 23 +---- blocks/icon/icon.css | 25 +++++ blocks/icon/icon.js | 160 +++++++++++++++++++++++++++++++ blocks/navigation/navigation.css | 36 ++++++- blocks/navigation/navigation.js | 4 +- blocks/theme/theme.js | 20 ++-- head.html | 4 +- scripts/component-base.js | 15 ++- scripts/component-loader.js | 29 ++++-- scripts/config.js | 11 +++ scripts/init.js | 18 ++-- styles/styles.css | 54 +++++++++++ 20 files changed, 406 insertions(+), 94 deletions(-) create mode 100644 blocks/button/button.css create mode 100644 blocks/button/button.js create mode 100644 blocks/card/card.css create mode 100644 blocks/card/card.js delete mode 100644 blocks/example/example.css delete mode 100644 blocks/example/example.js create mode 100644 blocks/icon/icon.css create mode 100644 blocks/icon/icon.js create mode 100644 scripts/config.js diff --git a/blocks/button/button.css b/blocks/button/button.css new file mode 100644 index 00000000..1223ca63 --- /dev/null +++ b/blocks/button/button.css @@ -0,0 +1,25 @@ +raqn-button { + background-color: var(--scope-background, #000); + color: var(--scope-color, #fff); + text-transform: none; + border-radius: 20px; + border: 1px solid transparent; + overflow: hidden; +} +raqn-button:hover { + background-color: var(--scope-background-hover, #000); + color: var(--scope-color-hover, #fff); + border-color: currentColor; +} + +raqn-button a { + color: currentColor; + padding: 10px 20px; + text-decoration: none; +} +raqn-button a:hover, +raqn-button a:visited, +raqn-button a:active { + color: currentColor; + text-decoration: none; +} diff --git a/blocks/button/button.js b/blocks/button/button.js new file mode 100644 index 00000000..269f6d55 --- /dev/null +++ b/blocks/button/button.js @@ -0,0 +1,8 @@ +import { ComponentBase } from "../../scripts/component-base.js"; + +export default class Button extends ComponentBase { + connected() { + this.setAttribute('role', 'button'); + this.setAttribute('tabindex', '0'); + } +} \ No newline at end of file diff --git a/blocks/card/card.css b/blocks/card/card.css new file mode 100644 index 00000000..249022e5 --- /dev/null +++ b/blocks/card/card.css @@ -0,0 +1,5 @@ +raqn-card { + background-color: var(--scope-background, red); + display: grid; + grid-template-columns: var(--card-columns, 1fr); +} \ No newline at end of file diff --git a/blocks/card/card.js b/blocks/card/card.js new file mode 100644 index 00000000..af0d6111 --- /dev/null +++ b/blocks/card/card.js @@ -0,0 +1,9 @@ + +export default class Card extends HTMLElement { + constructor() { + super(); + this.columns = this.getAttribute('columns'); + this.style.setProperty('--card-columns', new Array(this.columns).map(() => '1fr').join(' ')); + } + +} \ No newline at end of file diff --git a/blocks/column/column.js b/blocks/column/column.js index bbb03744..0b86da97 100644 --- a/blocks/column/column.js +++ b/blocks/column/column.js @@ -1,6 +1,8 @@ import { ComponentBase } from "../../scripts/component-base.js"; export default class Column extends ComponentBase { + + static observedAttributes = ["position", "size"]; connected() { this.calculateGridTemplateColumns(); @@ -15,15 +17,14 @@ export default class Column extends ComponentBase { this.parentElement.classList.add('raqn-grid'); let parentGridTemplateColumns = parent.style.getPropertyValue('--grid-template-columns'); if (!parentGridTemplateColumns) { - console.log(children); + // we have no grid template columns yet parentGridTemplateColumns = children.map((child,index) => { - console.log(child, index, this.position); if (this.position == index + 1) { return this.size || 'auto'; } return 'auto'; }).join(' '); - console.log(parentGridTemplateColumns); + // set the new grid template columns parent.style.setProperty('--grid-template-columns', parentGridTemplateColumns); } else { const position = this.position @@ -36,19 +37,16 @@ export default class Column extends ComponentBase { // we are at a position before the prio const isBeforePrio = (i + 1) <= prio; // we have a non standard value for this position and we are at the position - if (!hasValue && isPosition) { - console.log('At position', position,'change ',size, 'for ', this.size); - } - // we have a value for this position and we are at the position if (!hasValue && isPosition) { return this.size || 'auto'; } + // we have a non standard value for this position and we are at a position before the prio if (hasValue && isPosition && isBeforePrio) { return this.size || size; } return size; }).join(' '); - console.log(parentGridTemplateColumns); + // set the new grid template columns parent.style.setProperty('--grid-template-columns', parentGridTemplateColumns); } this.style.gridColumn = this.position; diff --git a/blocks/example/example.css b/blocks/example/example.css deleted file mode 100644 index 01b237fa..00000000 --- a/blocks/example/example.css +++ /dev/null @@ -1,3 +0,0 @@ -raqn-example { - background-color: var(--scope-background, red); -} \ No newline at end of file diff --git a/blocks/example/example.js b/blocks/example/example.js deleted file mode 100644 index 4de0b81d..00000000 --- a/blocks/example/example.js +++ /dev/null @@ -1,7 +0,0 @@ - -export default class Example extends HTMLElement { - constructor() { - super(); - console.log('Example constructor',this); - } -} \ No newline at end of file diff --git a/blocks/footer/footer.js b/blocks/footer/footer.js index a2be8c7f..d41b9109 100644 --- a/blocks/footer/footer.js +++ b/blocks/footer/footer.js @@ -1,27 +1,9 @@ -import { readBlockConfig, decorateIcons, getMetadata } from '../../scripts/lib-franklin.js'; -/** - * loads and decorates the footer - * @param {Element} block The footer block element - */ -export default async function decorate(block) { +import { ComponentBase } from "../../scripts/component-base.js"; - const cfg = readBlockConfig(block); - const meta = getMetadata('footer'); - block.textContent = ''; - - // fetch footer content - const footerPath = cfg.footer || '/footer'; - const resp = await fetch(`${footerPath}.plain.html`, window.location.pathname.endsWith('/footer') ? { cache: 'reload' } : {}); - - if (resp.ok) { - const html = await resp.text(); - - // decorate footer DOM - const footer = document.createElement('div'); - footer.innerHTML = html; - - decorateIcons(footer); - block.append(footer); - } +export default class Footer extends ComponentBase { + external = '/footer.plain.html'; + constructor() { + super(); + } } diff --git a/blocks/header/header.css b/blocks/header/header.css index 09581712..07fc83d7 100644 --- a/blocks/header/header.css +++ b/blocks/header/header.css @@ -1,19 +1,4 @@ -header a:any-link { - color: inherit; -} - -header p, -header .section.grid .element p { - margin: 0; - padding: 0; -} - -a.button:any-link { - background-color: transparent; - color: inherit; - font-weight: normal; -} - -a.button:any-link .icon { - vertical-align: middle; -} +raqn-header { + margin: var(--scope-margin, 20px); + max-width: var(--scope-max-width, 100%); +} \ No newline at end of file diff --git a/blocks/icon/icon.css b/blocks/icon/icon.css new file mode 100644 index 00000000..89ef081d --- /dev/null +++ b/blocks/icon/icon.css @@ -0,0 +1,25 @@ +raqn-icon { + display: inline-flex; + font-size: 1em; + line-height: 1em; + min-width: var(--scope-icon-size, 1em); + min-height: var(--scope-icon-size, 1em); + text-align: center; + text-transform: none; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +raqn-icon:not(.loaded) { + animation: placeholder ease-in-out 1s infinite; +} + +raqn-icon svg { + display: inline-block; + max-height: 100%; + max-width: 100%; + fill: currentColor; + overflow: hidden; + vertical-align: middle; +} diff --git a/blocks/icon/icon.js b/blocks/icon/icon.js new file mode 100644 index 00000000..4d9b417e --- /dev/null +++ b/blocks/icon/icon.js @@ -0,0 +1,160 @@ +import { ComponentBase } from "../../scripts/component-base.js"; + +export default class Icon extends ComponentBase { + constructor() { + super(); + this.setupSprite(); + } + + setupSprite() { + this.svgSprite = document.getElementById('franklin-svg-sprite'); + if (!this.svgSprite) { + this.svgSprite = document.createElement('div'); + this.svgSprite.id ="franklin-svg-sprite"; + document.body.append(this.svgSprite); + } + } + get cache() { + window.ICONS_CACHE = window.ICONS_CACHE || {}; + return window.ICONS_CACHE; + } + + get iconUrl() { + return `assets/icons/${this.iconName}.svg`; + } + + async connected() { + this.iconName = this.getAttribute('icon'); + if (!this.cache[this.iconName]) { + this.cache[this.iconName] = { + loading: new Promise(async (resolve, reject) => { + resolve(await this.load(this.iconUrl)); + }) + } + + } else { + await this.cache[this.iconName].loading; + this.innerHTML = this.template(); + } + this.classList.add('loaded'); + } + + template() { + const {viewBox} = this.cache[this.iconName]; + const attributes = Object.keys({viewBox}).map((k) => this.cache[this.iconName][k] ? `${k}="${this.cache[this.iconName][k]}"` : '').join(' '); + return ``; + } + + async processExternal(response) { + if (response.ok) { + const {iconName} = this; + this.svg = await response.text(); + + if (this.svg.match(/( - ` - + ` document.body.style.display = 'block'; } diff --git a/head.html b/head.html index b58e3f51..365f65e3 100644 --- a/head.html +++ b/head.html @@ -1,4 +1,6 @@ - + + + diff --git a/scripts/component-base.js b/scripts/component-base.js index 0e7e9387..728bd351 100644 --- a/scripts/component-base.js +++ b/scripts/component-base.js @@ -1,8 +1,13 @@ import { init } from "./init.js"; export class ComponentBase extends HTMLElement { - static observedAttributes = ["position", "size"]; - static dependencies = []; + static breakpoints = { + 'S':0, + 'M':768, + 'L':1024, + 'XL':1280, + 'XXL': 1920 + }; attributes = {}; external = false; uuid = `gen${crypto.randomUUID().split('-')[0]}`; @@ -10,7 +15,7 @@ export class ComponentBase extends HTMLElement { constructor() { super(); } - + async connectedCallback() { this.setAttribute('id', this.uuid); if (this.external) { @@ -36,11 +41,11 @@ export class ComponentBase extends HTMLElement { } connected() { - console.log('connected', this); + // console.log('connected', this); } render() { - console.log('render', this); + // console.log('render', this); } } diff --git a/scripts/component-loader.js b/scripts/component-loader.js index d08f24e6..64abbaf0 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -1,6 +1,7 @@ - +import { config } from "./config.js"; export class ComponentLoader { + constructor(blockName, element) { window.raqnComponents = window.raqnComponents || {}; this.block = element; @@ -33,13 +34,28 @@ export class ComponentLoader { * Parse extra params from classList */ setParams() { - this.params = Array.from(this.block.classList) + const breakpoints = Object.keys(config.breakpoints); + const mediaParams = {}; + this.params = {...Array.from(this.block.classList) .filter((c) => { return c !== this.blockName && c !== 'block'; }) .reduce((acc, c) => { + console.log(c); const values = c.split('-'); - const key = values.shift(); + let key = values.shift(); + console.log(`(max-width: ${config.breakpoints[key]}px)`,matchMedia(`(mix-width: ${config.breakpoints[key]}px)`).matches) + console.log(key, breakpoints.includes(key), matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches); + if (breakpoints.includes(key)) { + if (!matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches) { + return acc; + } + key = values.shift(); + mediaParams[key] = mediaParams[key] || []; + mediaParams[key].push(values.join('-')); + return acc; + } + if (acc[key] && Array.isArray(acc[key])) { acc[key].push(values.join('-')); } else if (acc[key]) { @@ -48,7 +64,7 @@ export class ComponentLoader { acc[key] = values.join('-'); } return acc; - }, {}); + }, {}),...mediaParams}; } /** @@ -83,11 +99,10 @@ export class ComponentLoader { const Contructor = mod.default customElements.define(elementName, Contructor); window.raqnComponents[name] = Contructor; - console.log(elementName, Contructor); } - const element = document.createElement(elementName); - element.innerHTML = this.block.innerHTML; + element.append(...this.block.children); + console.log(this.params) Object.keys(this.params).forEach((key) => { // @TODO sanitize const value = Array.isArray(this.params[key]) ? this.params[key].join(' ') : this.params[key]; diff --git a/scripts/config.js b/scripts/config.js new file mode 100644 index 00000000..eb631909 --- /dev/null +++ b/scripts/config.js @@ -0,0 +1,11 @@ + +export const config = { + elementBlocks: ['header', 'footer'], + breakpoints: { + 's':0, + 'm':768, + 'l':1024, + 'xl':1280, + 'xxl': 1920 + } +}; \ No newline at end of file diff --git a/scripts/init.js b/scripts/init.js index 812f8f3d..e1af0440 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -1,8 +1,6 @@ import { ComponentLoader } from './component-loader.js'; +import { config } from './config.js'; -export const config = { - elementBlocks: ['header', 'footer'], -}; export function retriveDataFrom(blocks) { return blocks.map((block) => { @@ -24,7 +22,7 @@ export function retriveDataFrom(blocks) { export async function init(element = document) { let blocks = Array.from(element.querySelectorAll('[class]:not([class^=raqn]')); - console.log(blocks); + if (element === document) { const header = element.querySelector('header'); const footer = element.querySelector('footer'); @@ -32,12 +30,18 @@ export async function init(element = document) { } const data = retriveDataFrom(blocks); - Promise.all(data.map(({blockName, element}) => { - console.log(blockName, element); + const prio = data.slice(0,2); + const rest = data.slice(2); + Promise.all(prio.map(({blockName, element}) => { const loader = new ComponentLoader(blockName, element); return loader.decorate(); })) + setTimeout(() => { + Promise.all(rest.map(({blockName, element}) => { + const loader = new ComponentLoader(blockName, element); + return loader.decorate(); + })) + }) } -window.loaderData = config; init(); \ No newline at end of file diff --git a/styles/styles.css b/styles/styles.css index 08bc7020..34e3ef46 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -9,4 +9,58 @@ body { display: none; + background-color: var(--scope-background, #fff); + color: var(--scope-color, #000); + padding: 0; + margin: 0; + width: 100%; } + +main > * { + max-width: var(--scope-max-width, 100%); + margin: 0 auto; +} + +a { + display: inline-flex; + line-height: 1em; + text-align: center; + align-items: center; +} + +.raqn-grid { + width: var(--scope-max-width, 100%); + margin: 0 auto; + display: grid; + grid-template-columns: var(--grid-template-columns, 1fr); + align-items: center; + justify-items: start; +} + +picture, +img { + display: block; + max-width: 100%; + height: auto; +} + +@keyframes placeholder { + 0% { + background-color: var(--placeholder-primary, #fff); + } + 50% { + background-color: var(--placeholder-secondary, #ccc); + } + 100% { + background-color: var(--placeholder-primary, #fff); + } +} + +@keyframes fadeIn { + 0% { + opacity: 0%; + } + 100% { + opacity: 100%; + } +} \ No newline at end of file From 76b04675fa2a940fca49b794ef3ffda760819c52 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 22 Dec 2023 19:32:07 +0100 Subject: [PATCH 05/59] #414986 > updates of lib --- .eslintrc.js | 53 ++++++- blocks/card/card.css | 5 + blocks/card/card.js | 37 ++++- blocks/column/column.js | 98 ++++++------ blocks/footer/footer.css | 2 +- blocks/footer/footer.js | 9 +- blocks/grid/grid.css | 30 ---- blocks/grid/grid.js | 41 ----- blocks/header/header.css | 2 +- blocks/header/header.js | 9 +- blocks/hero/hero.css | 4 +- blocks/icon/icon.css | 34 ++--- blocks/icon/icon.js | 159 ++++++++++--------- blocks/navigation/navigation.css | 42 +++--- blocks/navigation/navigation.js | 7 +- blocks/theme/theme.js | 136 ++++++++++------- scripts/component-base.js | 82 +++++----- scripts/component-loader.js | 252 ++++++++++++++++--------------- scripts/config.js | 11 -- scripts/delayed.js | 7 - scripts/init.js | 86 ++++++----- scripts/lib-franklin.js | 14 ++ scripts/libs.js | 28 ++++ scripts/scripts.js | 2 +- styles/styles.css | 5 + 25 files changed, 624 insertions(+), 531 deletions(-) delete mode 100644 blocks/grid/grid.css delete mode 100644 blocks/grid/grid.js delete mode 100644 scripts/config.js delete mode 100644 scripts/delayed.js create mode 100644 scripts/libs.js diff --git a/.eslintrc.js b/.eslintrc.js index 76f220db..be46a481 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,21 +1,58 @@ module.exports = { root: true, - extends: 'airbnb-base', + extends: "airbnb-base", env: { browser: true, }, - parser: '@babel/eslint-parser', + parser: "@babel/eslint-parser", parserOptions: { allowImportExportEverywhere: true, - sourceType: 'module', + sourceType: "module", requireConfigFile: false, }, rules: { // allow reassigning param - 'no-param-reassign': [2, { props: false }], - 'linebreak-style': ['error', 'unix'], - 'import/extensions': ['error', { - js: 'always', - }], + "no-param-reassign": [2, { props: false }], + "linebreak-style": ["error", "unix"], + "import/extensions": [ + "error", + { + js: "always", + }, + ], + + "arrow-parens": ["off", "always"], + curly: "error", + "default-case": "error", + "deprecation/deprecation": "warn", + eqeqeq: ["error", "always", { null: "ignore" }], + "guard-for-in": "error", + "max-len": "off", + "max-lines": [ + "error", + { max: 300, skipBlankLines: true, skipComments: true }, + ], + "function-paren-newline": ["error", "never"], + "new-parens": ["error", "always"], + "no-alert": "error", + "no-console": ["error", { allow: ["error"] }], + "no-debugger": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": "error", + "no-else-return": "error", + "no-multiple-empty-lines": "error", + "no-new-wrappers": "error", + "no-plusplus": ["error", { allowForLoopAfterthoughts: true }], + "no-restricted-imports": ["error", { paths: ["rxjs/Rx"] }], + "no-restricted-syntax": ["error", "ForInStatement"], + "no-shadow": "off", + "no-sparse-arrays": "error", + "no-template-curly-in-string": "error", + "no-throw-literal": "error", + "no-void": "error", + "object-shorthand": "error", + "prefer-object-spread": "error", + "prefer-template": "error", + radix: "error", }, }; diff --git a/blocks/card/card.css b/blocks/card/card.css index 249022e5..db0d2da7 100644 --- a/blocks/card/card.css +++ b/blocks/card/card.css @@ -2,4 +2,9 @@ raqn-card { background-color: var(--scope-background, red); display: grid; grid-template-columns: var(--card-columns, 1fr); + gap: var(--scope-gap, 20px); +} + +raqn-card > picture { + grid-column: span var(--card-columns, 1fr); } \ No newline at end of file diff --git a/blocks/card/card.js b/blocks/card/card.js index af0d6111..96a69599 100644 --- a/blocks/card/card.js +++ b/blocks/card/card.js @@ -1,9 +1,32 @@ +import { ComponentBase } from "../../scripts/component-base.js"; -export default class Card extends HTMLElement { - constructor() { - super(); - this.columns = this.getAttribute('columns'); - this.style.setProperty('--card-columns', new Array(this.columns).map(() => '1fr').join(' ')); +export default class Card extends ComponentBase { + static get observedAttributes() { + return ["columns", "ratio"]; + } + + connected() { + this.setupColumns(this.getAttribute("columns")); + } + + setupColumns(columns) { + this.columns = parseInt(columns, 10); + this.area = Array.from(Array(parseInt(this.columns, 10))) + .map(() => "1fr") + .join(" "); + this.style.setProperty("--card-columns", this.area); + } + + attributeChangedCallback(name, oldValue, newValue) { + if (oldValue !== newValue) { + switch (name) { + case "columns": + this.setupColumns(newValue); + break; + case "ratio": + this.style.setProperty("--card-ratio", newValue); + break; + } } - -} \ No newline at end of file + } +} diff --git a/blocks/column/column.js b/blocks/column/column.js index 0b86da97..9f4a2daf 100644 --- a/blocks/column/column.js +++ b/blocks/column/column.js @@ -1,7 +1,6 @@ import { ComponentBase } from "../../scripts/component-base.js"; export default class Column extends ComponentBase { - static observedAttributes = ["position", "size"]; connected() { @@ -9,48 +8,61 @@ export default class Column extends ComponentBase { } calculateGridTemplateColumns() { - this.position = this.getAttribute('position'); - this.size = this.getAttribute('size'); + this.position = this.getAttribute("position"); + this.size = this.getAttribute("size"); if (this.position) { - const parent = this.parentElement; - const children = Array.from(parent.children); - this.parentElement.classList.add('raqn-grid'); - let parentGridTemplateColumns = parent.style.getPropertyValue('--grid-template-columns'); - if (!parentGridTemplateColumns) { - // we have no grid template columns yet - parentGridTemplateColumns = children.map((child,index) => { - if (this.position == index + 1) { - return this.size || 'auto'; - } - return 'auto'; - }).join(' '); - // set the new grid template columns - parent.style.setProperty('--grid-template-columns', parentGridTemplateColumns); - } else { - const position = this.position - const prio = children.indexOf(this) + 1; - parentGridTemplateColumns = parentGridTemplateColumns.split(' ').map((size, i) => { - // we have a non standard value for this position - const hasValue = size !== 'auto'; - // we are at the position - const isPosition = (i + 1) == position; - // we are at a position before the prio - const isBeforePrio = (i + 1) <= prio; - // we have a non standard value for this position and we are at the position - if (!hasValue && isPosition) { - return this.size || 'auto'; - } - // we have a non standard value for this position and we are at a position before the prio - if (hasValue && isPosition && isBeforePrio) { - return this.size || size; - } - return size; - }).join(' '); - // set the new grid template columns - parent.style.setProperty('--grid-template-columns', parentGridTemplateColumns); - } - this.style.gridColumn = this.position; - this.style.gridRow = 1; + const parent = this.parentElement; + const children = Array.from(parent.children); + this.parentElement.classList.add("raqn-grid"); + let parentGridTemplateColumns = parent.style.getPropertyValue( + "--grid-template-columns" + ); + if (!parentGridTemplateColumns) { + // we have no grid template columns yet + parentGridTemplateColumns = children + .map((child, index) => { + if (this.position == index + 1) { + return this.size || "auto"; + } + return "auto"; + }) + .join(" "); + // set the new grid template columns + parent.style.setProperty( + "--grid-template-columns", + parentGridTemplateColumns + ); + } else { + const position = this.position; + const prio = children.indexOf(this) + 1; + parentGridTemplateColumns = parentGridTemplateColumns + .split(" ") + .map((size, i) => { + // we have a non standard value for this position + const hasValue = size !== "auto"; + // we are at the position + const isPosition = i + 1 == position; + // we are at a position before the prio + const isBeforePrio = i + 1 <= prio; + // we have a non standard value for this position and we are at the position + if (!hasValue && isPosition) { + return this.size || "auto"; + } + // we have a non standard value for this position and we are at a position before the prio + if (hasValue && isPosition && isBeforePrio) { + return this.size || size; + } + return size; + }) + .join(" "); + // set the new grid template columns + parent.style.setProperty( + "--grid-template-columns", + parentGridTemplateColumns + ); + } + this.style.gridColumn = this.position; + this.style.gridRow = 1; } } -} \ No newline at end of file +} diff --git a/blocks/footer/footer.css b/blocks/footer/footer.css index 19fc5607..23d16ae2 100644 --- a/blocks/footer/footer.css +++ b/blocks/footer/footer.css @@ -11,4 +11,4 @@ footer .footer { footer .footer p { margin: 0; -} \ No newline at end of file +} diff --git a/blocks/footer/footer.js b/blocks/footer/footer.js index d41b9109..5aebf597 100644 --- a/blocks/footer/footer.js +++ b/blocks/footer/footer.js @@ -1,9 +1,8 @@ - import { ComponentBase } from "../../scripts/component-base.js"; export default class Footer extends ComponentBase { - external = '/footer.plain.html'; - constructor() { - super(); - } + external = "/footer.plain.html"; + constructor() { + super(); + } } diff --git a/blocks/grid/grid.css b/blocks/grid/grid.css deleted file mode 100644 index ba453ff5..00000000 --- a/blocks/grid/grid.css +++ /dev/null @@ -1,30 +0,0 @@ -.section.grid { - display: grid; - grid-template-columns: var(--grid-template-columns, unset); - grid-template-rows: var(--grid-template-rows, unset); -} - -.section.grid .element { - grid-column: var(--grid-column-start-position, auto) / var(--grid-column-end-position, auto); - grid-row: var(--grid-row-start-position, auto) / var(--grid-row-end-position, auto); - width: 100%; - max-width: unset; - background-color: var(--background-color, transparent); - color: var(--text-color); - margin: auto; -} - -.section.grid .element .image-wrapper { - margin: 0; - padding: 0; -} - -.section.grid .element img { - width: 100%; - height: auto; -} - -.section.grid .element p { - margin: 0; - padding: var(--padding-vertical) var(--padding-horizontal); -} diff --git a/blocks/grid/grid.js b/blocks/grid/grid.js deleted file mode 100644 index 9e6a1e4b..00000000 --- a/blocks/grid/grid.js +++ /dev/null @@ -1,41 +0,0 @@ -import { ComponentBase } from '../../scripts/component-base.js'; - -export default class Grid extends ComponentBase { - constructor() { - super(); - this.innerHTML = ''; - } - - connected() { - console.log('connected', this); - const elements = [...this.querySelectorAll(':scope > div')]; - console.log('grid',elements); - this.innerHTML = ''; - } -} - -// export default function decorate(block) { -// const elements = [...block.querySelectorAll(':scope > div')]; - -// const columnTemplate = elements.find((e) => e.dataset.gridColumns)?.dataset.gridColumns; -// const rowTemplate = elements.find((e) => e.dataset.gridRows)?.dataset.gridRows; -// if (columnTemplate || rowTemplate) { -// addCssVariables(block, { -// 'grid-template-columns': columnTemplate, -// 'grid-template-rows': rowTemplate, -// }); -// } - -// elements.forEach((e) => { -// e.classList.add('element'); - -// const [[startColumnPosition, startRowPosition], [endColumnPosition, endRowPosition]] = e.dataset.gridPosition.split(/\s*\/\s*/).map((p) => p.split(/\s*-\s*/)); - -// addCssVariables(e, { -// 'grid-column-start-position': startColumnPosition, -// 'grid-row-start-position': startRowPosition, -// 'grid-column-end-position': endColumnPosition, -// 'grid-row-end-position': endRowPosition, -// }); -// }); -// } diff --git a/blocks/header/header.css b/blocks/header/header.css index 07fc83d7..ef55e713 100644 --- a/blocks/header/header.css +++ b/blocks/header/header.css @@ -1,4 +1,4 @@ raqn-header { margin: var(--scope-margin, 20px); max-width: var(--scope-max-width, 100%); -} \ No newline at end of file +} diff --git a/blocks/header/header.js b/blocks/header/header.js index 5e3eb3cc..ea281c26 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -1,9 +1,8 @@ - import { ComponentBase } from "../../scripts/component-base.js"; export default class Header extends ComponentBase { - external = '/header.plain.html'; - constructor() { - super(); - } + external = "/header.plain.html"; + constructor() { + super(); + } } diff --git a/blocks/hero/hero.css b/blocks/hero/hero.css index cc5f4fa5..b263bcb5 100644 --- a/blocks/hero/hero.css +++ b/blocks/hero/hero.css @@ -3,11 +3,11 @@ main .hero-container > div { max-width: unset; } - + main .hero-container { padding: 0; } - + main .hero { position: relative; padding: 32px; diff --git a/blocks/icon/icon.css b/blocks/icon/icon.css index 89ef081d..1e5734ae 100644 --- a/blocks/icon/icon.css +++ b/blocks/icon/icon.css @@ -1,25 +1,25 @@ raqn-icon { - display: inline-flex; - font-size: 1em; - line-height: 1em; - min-width: var(--scope-icon-size, 1em); - min-height: var(--scope-icon-size, 1em); - text-align: center; - text-transform: none; - vertical-align: middle; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + display: inline-flex; + font-size: 1em; + line-height: 1em; + min-width: var(--scope-icon-size, 1em); + min-height: var(--scope-icon-size, 1em); + text-align: center; + text-transform: none; + vertical-align: middle; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } raqn-icon:not(.loaded) { - animation: placeholder ease-in-out 1s infinite; + animation: placeholder ease-in-out 1s infinite; } raqn-icon svg { - display: inline-block; - max-height: 100%; - max-width: 100%; - fill: currentColor; - overflow: hidden; - vertical-align: middle; + display: inline-block; + max-height: 100%; + max-width: 100%; + fill: currentColor; + overflow: hidden; + vertical-align: middle; } diff --git a/blocks/icon/icon.js b/blocks/icon/icon.js index 4d9b417e..342f6340 100644 --- a/blocks/icon/icon.js +++ b/blocks/icon/icon.js @@ -1,88 +1,99 @@ import { ComponentBase } from "../../scripts/component-base.js"; export default class Icon extends ComponentBase { - constructor() { - super(); - this.setupSprite(); - } + constructor() { + super(); + this.setupSprite(); + } - setupSprite() { - this.svgSprite = document.getElementById('franklin-svg-sprite'); - if (!this.svgSprite) { - this.svgSprite = document.createElement('div'); - this.svgSprite.id ="franklin-svg-sprite"; - document.body.append(this.svgSprite); - } - } - get cache() { - window.ICONS_CACHE = window.ICONS_CACHE || {}; - return window.ICONS_CACHE; + setupSprite() { + this.svgSprite = document.getElementById("franklin-svg-sprite"); + if (!this.svgSprite) { + this.svgSprite = document.createElement("div"); + this.svgSprite.id = "franklin-svg-sprite"; + document.body.append(this.svgSprite); } + } + get cache() { + window.ICONS_CACHE = window.ICONS_CACHE || {}; + return window.ICONS_CACHE; + } - get iconUrl() { - return `assets/icons/${this.iconName}.svg`; - } - - async connected() { - this.iconName = this.getAttribute('icon'); - if (!this.cache[this.iconName]) { - this.cache[this.iconName] = { - loading: new Promise(async (resolve, reject) => { - resolve(await this.load(this.iconUrl)); - }) - } - - } else { - await this.cache[this.iconName].loading; - this.innerHTML = this.template(); - } - this.classList.add('loaded'); - } + get iconUrl() { + return `assets/icons/${this.iconName}.svg`; + } - template() { - const {viewBox} = this.cache[this.iconName]; - const attributes = Object.keys({viewBox}).map((k) => this.cache[this.iconName][k] ? `${k}="${this.cache[this.iconName][k]}"` : '').join(' '); - return ``; + async connected() { + this.iconName = this.getAttribute("icon"); + if (!this.cache[this.iconName]) { + this.cache[this.iconName] = { + loading: new Promise(async (resolve, reject) => { + resolve(await this.load(this.iconUrl)); + }), + }; + } else { + await this.cache[this.iconName].loading; + this.innerHTML = this.template(); } + this.classList.add("loaded"); + } + + template() { + const { viewBox } = this.cache[this.iconName]; + const attributes = Object.keys({ viewBox }) + .map((k) => + this.cache[this.iconName][k] + ? `${k}="${this.cache[this.iconName][k]}"` + : "" + ) + .join(" "); + return ``; + } + + async processExternal(response) { + if (response.ok) { + const { iconName } = this; + this.svg = await response.text(); - async processExternal(response) { - if (response.ok) { - const {iconName} = this; - this.svg = await response.text(); + if (this.svg.match(/(` - document.body.style.display = 'block'; - } + ${this.tags}`; + document.body.style.display = "block"; + } - async processExternal(response) { - if (response.ok) { - this.themeJson = await response.json(); - console.log(this); - this.createVariables() - this.styles(); - } + async processExternal(response) { + if (response.ok) { + this.themeJson = await response.json(); + console.log(this); + this.createVariables(); + this.styles(); } -} \ No newline at end of file + } +} diff --git a/scripts/component-base.js b/scripts/component-base.js index 728bd351..f1025d39 100644 --- a/scripts/component-base.js +++ b/scripts/component-base.js @@ -1,51 +1,53 @@ import { init } from "./init.js"; export class ComponentBase extends HTMLElement { - static breakpoints = { - 'S':0, - 'M':768, - 'L':1024, - 'XL':1280, - 'XXL': 1920 - }; - attributes = {}; - external = false; - uuid = `gen${crypto.randomUUID().split('-')[0]}`; + static breakpoints = { + S: 0, + M: 768, + L: 1024, + XL: 1280, + XXL: 1920, + }; + attributes = {}; + external = false; + uuid = `gen${crypto.randomUUID().split("-")[0]}`; - constructor() { - super(); - } - - async connectedCallback() { - this.setAttribute('id', this.uuid); - if (this.external) { - await this.load(this.external); - } - this.connected(); - this.render(); - } + constructor() { + super(); + } - async load(block) { - const response = await fetch(`${block}`, window.location.pathname.endsWith(block) ? { cache: 'reload' } : {}); - return this.processExternal(response); + async connectedCallback() { + this.setAttribute("id", this.uuid); + if (this.external) { + await this.load(this.external); } + this.connected(); + this.render(); + } - async processExternal(response) { - if (response.ok) { - const html = await response.text(); - this.innerHTML = html; - return init(this); - } else { - console.log(response); - } - } + async load(block) { + const response = await fetch( + `${block}`, + window.location.pathname.endsWith(block) ? { cache: "reload" } : {} + ); + return this.processExternal(response); + } - connected() { - // console.log('connected', this); + async processExternal(response) { + if (response.ok) { + const html = await response.text(); + this.innerHTML = html; + return init(this); + } else { + console.log(response); } + } - render() { - // console.log('render', this); - } -} + connected() { + // console.log('connected', this); + } + render() { + // console.log('render', this); + } +} diff --git a/scripts/component-loader.js b/scripts/component-loader.js index 64abbaf0..609d562b 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -1,132 +1,146 @@ -import { config } from "./config.js"; +import { config } from "./libs.js"; export class ComponentLoader { + constructor(blockName, element) { + window.raqnComponents = window.raqnComponents || {}; + this.block = element; + this.blockName = blockName; + this.setBlockPaths(); + this.setParams(); + this.content = this.block.children; + } - constructor(blockName, element) { - window.raqnComponents = window.raqnComponents || {}; - this.block = element; - this.blockName = blockName; - this.setBlockPaths(); - this.setParams(); - this.content = this.block.children; - } + /** + * Loads a CSS file. + * @param {string} href URL to the CSS file + */ + async loadCSS(href) { + return new Promise((resolve, reject) => { + if (!document.querySelector(`head > link[href="${href}"]`)) { + const link = document.createElement("link"); + link.rel = "stylesheet"; + link.href = href; + link.onload = resolve; + link.onerror = reject; + document.head.append(link); + } else { + resolve(); + } + }); + } - /** - * Loads a CSS file. - * @param {string} href URL to the CSS file - */ - async loadCSS(href) { - return new Promise((resolve, reject) => { - if (!document.querySelector(`head > link[href="${href}"]`)) { - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = href; - link.onload = resolve; - link.onerror = reject; - document.head.append(link); - } else { - resolve(); - } - }); - } - - /** - * Parse extra params from classList - */ - setParams() { - const breakpoints = Object.keys(config.breakpoints); - const mediaParams = {}; - this.params = {...Array.from(this.block.classList) - .filter((c) => { - return c !== this.blockName && c !== 'block'; - }) - .reduce((acc, c) => { - console.log(c); - const values = c.split('-'); - let key = values.shift(); - console.log(`(max-width: ${config.breakpoints[key]}px)`,matchMedia(`(mix-width: ${config.breakpoints[key]}px)`).matches) - console.log(key, breakpoints.includes(key), matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches); - if (breakpoints.includes(key)) { - if (!matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches) { - return acc; - } - key = values.shift(); - mediaParams[key] = mediaParams[key] || []; - mediaParams[key].push(values.join('-')); - return acc; - } + /** + * Parse extra params from classList + */ + setParams() { + const breakpoints = Object.keys(config.breakpoints); + const mediaParams = {}; + this.params = { + ...Array.from(this.block.classList) + .filter((c) => { + return c !== this.blockName && c !== "block"; + }) + .reduce((acc, c) => { + console.log(c); + const values = c.split("-"); + let key = values.shift(); + console.log( + `(max-width: ${config.breakpoints[key]}px)`, + matchMedia(`(mix-width: ${config.breakpoints[key]}px)`).matches + ); + console.log( + key, + breakpoints.includes(key), + matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches + ); + if (breakpoints.includes(key)) { + if ( + !matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches + ) { + return acc; + } + key = values.shift(); + mediaParams[key] = mediaParams[key] || []; + mediaParams[key].push(values.join("-")); + return acc; + } - if (acc[key] && Array.isArray(acc[key])) { - acc[key].push(values.join('-')); - } else if (acc[key]) { - acc[key] = [acc[key], values.join('-')]; - } else { - acc[key] = values.join('-'); - } - return acc; - }, {}),...mediaParams}; - } + if (acc[key] && Array.isArray(acc[key])) { + acc[key].push(values.join("-")); + } else if (acc[key]) { + acc[key] = [acc[key], values.join("-")]; + } else { + acc[key] = values.join("-"); + } + return acc; + }, {}), + ...mediaParams, + }; + } - /** - * Set the configuration for the given block, and also passes - * the config through all custom patching helpers added to the project. - * - * @param {Element} block The block element - * @returns {Object} The block config (blockName, cssPath and jsPath) - */ - setBlockPaths() { - this.cssPath = `/blocks/${this.blockName}/${this.blockName}.css`; - this.jsPath = `/blocks/${this.blockName}/${this.blockName}.js`; - } - + /** + * Set the configuration for the given block, and also passes + * the config through all custom patching helpers added to the project. + * + * @param {Element} block The block element + * @returns {Object} The block config (blockName, cssPath and jsPath) + */ + setBlockPaths() { + this.cssPath = `/blocks/${this.blockName}/${this.blockName}.css`; + this.jsPath = `/blocks/${this.blockName}/${this.blockName}.js`; + } - async decorate() { - const status = this.block.dataset.blockStatus; - if (status !== 'loading' && status !== 'loaded') { - this.block.dataset.blockStatus = 'loading'; + async decorate() { + const status = this.block.dataset.blockStatus; + if (status !== "loading" && status !== "loaded") { + this.block.dataset.blockStatus = "loading"; + try { + const cssLoaded = this.loadCSS(this.cssPath); + const decorationComplete = new Promise((resolve) => { + (async () => { try { - const cssLoaded = this.loadCSS(this.cssPath); - const decorationComplete = new Promise((resolve) => { - (async () => { - try { - const mod = await import(this.jsPath); - if (mod.default && mod.default.name && mod.default.name !== 'decorate') { - const name = mod.default.name; - const elementName = `raqn-${name.toLowerCase()}`; - // define the custom element if it doesn't exist - if (!window.raqnComponents[name]) { - const elementName = `raqn-${name.toLowerCase()}`; - const Contructor = mod.default - customElements.define(elementName, Contructor); - window.raqnComponents[name] = Contructor; - } - const element = document.createElement(elementName); - element.append(...this.block.children); - console.log(this.params) - Object.keys(this.params).forEach((key) => { - // @TODO sanitize - const value = Array.isArray(this.params[key]) ? this.params[key].join(' ') : this.params[key]; - element.setAttribute(key, value); - }); - this.block.replaceWith(element); - - } else if (mod.default) { - await mod.default(this.block); - } - } catch (error) { - // eslint-disable-next-line no-console - console.log(`failed to load module for ${this.blockName}`, error); + const mod = await import(this.jsPath); + if ( + mod.default && + mod.default.name && + mod.default.name !== "decorate" + ) { + const name = mod.default.name; + const elementName = `raqn-${name.toLowerCase()}`; + // define the custom element if it doesn't exist + if (!window.raqnComponents[name]) { + const elementName = `raqn-${name.toLowerCase()}`; + const Contructor = mod.default; + customElements.define(elementName, Contructor); + window.raqnComponents[name] = Contructor; } - resolve(); - })(); - }); - - return await Promise.all([cssLoaded, decorationComplete]); + const element = document.createElement(elementName); + element.append(...this.block.children); + console.log(this.params); + Object.keys(this.params).forEach((key) => { + // @TODO sanitize + const value = Array.isArray(this.params[key]) + ? this.params[key].join(" ") + : this.params[key]; + element.setAttribute(key, value); + }); + this.block.replaceWith(element); + } else if (mod.default) { + await mod.default(this.block); + } } catch (error) { - // eslint-disable-next-line no-console - console.log(`failed to load block ${this.blockName}`, error); + // eslint-disable-next-line no-console + console.log(`failed to load module for ${this.blockName}`, error); } - } + resolve(); + })(); + }); + + return await Promise.all([cssLoaded, decorationComplete]); + } catch (error) { + // eslint-disable-next-line no-console + console.log(`failed to load block ${this.blockName}`, error); + } } + } } - diff --git a/scripts/config.js b/scripts/config.js deleted file mode 100644 index eb631909..00000000 --- a/scripts/config.js +++ /dev/null @@ -1,11 +0,0 @@ - -export const config = { - elementBlocks: ['header', 'footer'], - breakpoints: { - 's':0, - 'm':768, - 'l':1024, - 'xl':1280, - 'xxl': 1920 - } -}; \ No newline at end of file diff --git a/scripts/delayed.js b/scripts/delayed.js deleted file mode 100644 index 920b4ad8..00000000 --- a/scripts/delayed.js +++ /dev/null @@ -1,7 +0,0 @@ -// eslint-disable-next-line import/no-cycle -import { sampleRUM } from './lib-franklin.js'; - -// Core Web Vitals RUM collection -sampleRUM('cwv'); - -// add more delayed functionality here diff --git a/scripts/init.js b/scripts/init.js index e1af0440..d16efb22 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -1,47 +1,59 @@ -import { ComponentLoader } from './component-loader.js'; -import { config } from './config.js'; - +import { ComponentLoader } from "./component-loader.js"; +import { config, debounce } from "./libs.js"; export function retriveDataFrom(blocks) { - return blocks.map((block) => { - let element = block; - const tagName = element.tagName.toLowerCase(); - let blockName = tagName; - if (!config.elementBlocks.includes(tagName)) { - blockName = element.classList[0]; - } else { - element = document.createElement('div'); - block.append(element); - } - return { - blockName, - element, - }; - }); + return blocks.map((block) => { + let element = block; + const tagName = element.tagName.toLowerCase(); + let blockName = tagName; + if (!config.elementBlocks.includes(tagName)) { + blockName = element.classList[0]; + } else { + element = document.createElement("div"); + block.append(element); + } + return { + blockName, + element, + }; + }); } export async function init(element = document) { - let blocks = Array.from(element.querySelectorAll('[class]:not([class^=raqn]')); + let blocks = Array.from( + element.querySelectorAll("[class]:not([class^=raqn]") + ); + + if (element === document) { + const header = element.querySelector("header"); + const footer = element.querySelector("footer"); + blocks = [header, ...blocks, footer]; + } - if (element === document) { - const header = element.querySelector('header'); - const footer = element.querySelector('footer'); - blocks = [header,...blocks,footer]; - } - - const data = retriveDataFrom(blocks); - const prio = data.slice(0,2); - const rest = data.slice(2); - Promise.all(prio.map(({blockName, element}) => { + const data = retriveDataFrom(blocks); + const prio = data.slice(0, 2); + const rest = data.slice(2); + Promise.all( + prio.map(({ blockName, element }) => { + const loader = new ComponentLoader(blockName, element); + return loader.decorate(); + }) + ); + setTimeout(() => { + Promise.all( + rest.map(({ blockName, element }) => { const loader = new ComponentLoader(blockName, element); return loader.decorate(); - })) - setTimeout(() => { - Promise.all(rest.map(({blockName, element}) => { - const loader = new ComponentLoader(blockName, element); - return loader.decorate(); - })) - }) + }) + ); + }); + + window.addEventListener( + "resize", + debounce(() => { + location.reload(); + }, 300) + ); } -init(); \ No newline at end of file +init(); diff --git a/scripts/lib-franklin.js b/scripts/lib-franklin.js index c5a54d04..7b6cf0cf 100644 --- a/scripts/lib-franklin.js +++ b/scripts/lib-franklin.js @@ -329,6 +329,20 @@ export function readBlockConfig(block) { return config; } +export function addCssVariables(element, variables) { + if (!element.id) { + const id = `gen${crypto.randomUUID().split('-')[0]}`; + element.id = id; + } + + const style = document.createElement('style'); + style.textContent = `#${element.id} { + ${Object.keys(variables).map((k) => variables[k] && `--${k}: ${variables[k]};`).join(' ')} + }`; + + element.parentNode.insertBefore(style, element); +} + export function decorateSection(section) { const wrappers = []; let defaultContent = false; diff --git a/scripts/libs.js b/scripts/libs.js new file mode 100644 index 00000000..43b71edd --- /dev/null +++ b/scripts/libs.js @@ -0,0 +1,28 @@ +export const config = { + elementBlocks: ["header", "footer"], + breakpoints: { + s: 0, + m: 768, + l: 1024, + xl: 1280, + xxl: 1920, + }, +}; + +export const debounce = (func, wait, immediate) => { + let timeout; + return (...args) => { + const later = () => { + timeout = null; + if (!immediate) { + func(...args); + } + }; + const callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + func(...args); + } + }; +}; diff --git a/scripts/scripts.js b/scripts/scripts.js index 94de96f3..05fd988d 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -64,7 +64,6 @@ async function loadFonts() { * @param {Element} main The container element */ function buildAutoBlocks(main) { - console.log('building auto blocks', main); try { buildHeroBlock(main); } catch (error) { @@ -138,6 +137,7 @@ async function loadLazy(doc) { loadFooter(doc.querySelector('footer')); + loadCSS(`${window.hlx.codeBasePath}/styles/lazy-styles.css`); loadFonts(); sampleRUM('lazy'); diff --git a/styles/styles.css b/styles/styles.css index 34e3ef46..7512db34 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -39,11 +39,16 @@ a { picture, img { + display: block; max-width: 100%; height: auto; } +header { + height: var(--raqn-header-height, 180px); +} + @keyframes placeholder { 0% { background-color: var(--placeholder-primary, #fff); From e75c9437fdc37db2acd97b7b3c9c2dfef610d5e1 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 22 Dec 2023 19:37:44 +0100 Subject: [PATCH 06/59] #414986 > updates of lib --- .eslintrc.js | 58 ----- scripts/component-base.js | 17 +- scripts/component-loader.js | 11 - scripts/lib-franklin.js | 457 ++++++++++++++++++++++-------------- 4 files changed, 279 insertions(+), 264 deletions(-) delete mode 100644 .eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index be46a481..00000000 --- a/.eslintrc.js +++ /dev/null @@ -1,58 +0,0 @@ -module.exports = { - root: true, - extends: "airbnb-base", - env: { - browser: true, - }, - parser: "@babel/eslint-parser", - parserOptions: { - allowImportExportEverywhere: true, - sourceType: "module", - requireConfigFile: false, - }, - rules: { - // allow reassigning param - "no-param-reassign": [2, { props: false }], - "linebreak-style": ["error", "unix"], - "import/extensions": [ - "error", - { - js: "always", - }, - ], - - "arrow-parens": ["off", "always"], - curly: "error", - "default-case": "error", - "deprecation/deprecation": "warn", - eqeqeq: ["error", "always", { null: "ignore" }], - "guard-for-in": "error", - "max-len": "off", - "max-lines": [ - "error", - { max: 300, skipBlankLines: true, skipComments: true }, - ], - "function-paren-newline": ["error", "never"], - "new-parens": ["error", "always"], - "no-alert": "error", - "no-console": ["error", { allow: ["error"] }], - "no-debugger": "error", - "no-duplicate-case": "error", - "no-duplicate-imports": "error", - "no-else-return": "error", - "no-multiple-empty-lines": "error", - "no-new-wrappers": "error", - "no-plusplus": ["error", { allowForLoopAfterthoughts: true }], - "no-restricted-imports": ["error", { paths: ["rxjs/Rx"] }], - "no-restricted-syntax": ["error", "ForInStatement"], - "no-shadow": "off", - "no-sparse-arrays": "error", - "no-template-curly-in-string": "error", - "no-throw-literal": "error", - "no-void": "error", - "object-shorthand": "error", - "prefer-object-spread": "error", - "prefer-template": "error", - radix: "error", - }, -}; diff --git a/scripts/component-base.js b/scripts/component-base.js index f1025d39..d6a71d50 100644 --- a/scripts/component-base.js +++ b/scripts/component-base.js @@ -1,13 +1,7 @@ import { init } from "./init.js"; export class ComponentBase extends HTMLElement { - static breakpoints = { - S: 0, - M: 768, - L: 1024, - XL: 1280, - XXL: 1920, - }; + static breakpoints = { S: 0, M: 768, L: 1024, XL: 1280, XXL: 1920 }; attributes = {}; external = false; uuid = `gen${crypto.randomUUID().split("-")[0]}`; @@ -43,11 +37,6 @@ export class ComponentBase extends HTMLElement { } } - connected() { - // console.log('connected', this); - } - - render() { - // console.log('render', this); - } + connected() {} + render() {} } diff --git a/scripts/component-loader.js b/scripts/component-loader.js index 609d562b..ac1f8bf0 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -41,18 +41,8 @@ export class ComponentLoader { return c !== this.blockName && c !== "block"; }) .reduce((acc, c) => { - console.log(c); const values = c.split("-"); let key = values.shift(); - console.log( - `(max-width: ${config.breakpoints[key]}px)`, - matchMedia(`(mix-width: ${config.breakpoints[key]}px)`).matches - ); - console.log( - key, - breakpoints.includes(key), - matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches - ); if (breakpoints.includes(key)) { if ( !matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches @@ -116,7 +106,6 @@ export class ComponentLoader { } const element = document.createElement(elementName); element.append(...this.block.children); - console.log(this.params); Object.keys(this.params).forEach((key) => { // @TODO sanitize const value = Array.isArray(this.params[key]) diff --git a/scripts/lib-franklin.js b/scripts/lib-franklin.js index 7b6cf0cf..1787ea3f 100644 --- a/scripts/lib-franklin.js +++ b/scripts/lib-franklin.js @@ -18,44 +18,66 @@ export function sampleRUM(checkpoint, data = {}) { sampleRUM.defer = sampleRUM.defer || []; const defer = (fnname) => { - sampleRUM[fnname] = sampleRUM[fnname] - || ((...args) => sampleRUM.defer.push({ fnname, args })); + sampleRUM[fnname] = + sampleRUM[fnname] || + ((...args) => sampleRUM.defer.push({ fnname, args })); }; - sampleRUM.drain = sampleRUM.drain - || ((dfnname, fn) => { + sampleRUM.drain = + sampleRUM.drain || + ((dfnname, fn) => { sampleRUM[dfnname] = fn; sampleRUM.defer .filter(({ fnname }) => dfnname === fnname) .forEach(({ fnname, args }) => sampleRUM[fnname](...args)); }); sampleRUM.always = sampleRUM.always || []; - sampleRUM.always.on = (chkpnt, fn) => { sampleRUM.always[chkpnt] = fn; }; - sampleRUM.on = (chkpnt, fn) => { sampleRUM.cases[chkpnt] = fn; }; - defer('observe'); - defer('cwv'); + sampleRUM.always.on = (chkpnt, fn) => { + sampleRUM.always[chkpnt] = fn; + }; + sampleRUM.on = (chkpnt, fn) => { + sampleRUM.cases[chkpnt] = fn; + }; + defer("observe"); + defer("cwv"); try { window.hlx = window.hlx || {}; if (!window.hlx.rum) { const usp = new URLSearchParams(window.location.search); - const weight = (usp.get('rum') === 'on') ? 1 : 100; // with parameter, weight is 1. Defaults to 100. + const weight = usp.get("rum") === "on" ? 1 : 100; // with parameter, weight is 1. Defaults to 100. // eslint-disable-next-line no-bitwise - const hashCode = (s) => s.split('').reduce((a, b) => (((a << 5) - a) + b.charCodeAt(0)) | 0, 0); - const id = `${hashCode(window.location.href)}-${new Date().getTime()}-${Math.random().toString(16).substr(2, 14)}`; + const hashCode = (s) => + s.split("").reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0); + const id = `${hashCode( + window.location.href + )}-${new Date().getTime()}-${Math.random().toString(16).substr(2, 14)}`; const random = Math.random(); - const isSelected = (random * weight < 1); + const isSelected = random * weight < 1; const urlSanitizers = { full: () => window.location.href, origin: () => window.location.origin, - path: () => window.location.href.replace(/\?.*$/, ''), + path: () => window.location.href.replace(/\?.*$/, ""), }; // eslint-disable-next-line object-curly-newline, max-len - window.hlx.rum = { weight, id, random, isSelected, sampleRUM, sanitizeURL: urlSanitizers[window.hlx.RUM_MASK_URL || 'path'] }; + window.hlx.rum = { + weight, + id, + random, + isSelected, + sampleRUM, + sanitizeURL: urlSanitizers[window.hlx.RUM_MASK_URL || "path"], + }; } const { weight, id } = window.hlx.rum; if (window.hlx && window.hlx.rum && window.hlx.rum.isSelected) { const sendPing = (pdata = data) => { // eslint-disable-next-line object-curly-newline, max-len, no-use-before-define - const body = JSON.stringify({ weight, id, referer: window.hlx.rum.sanitizeURL(), checkpoint, ...data }); + const body = JSON.stringify({ + weight, + id, + referer: window.hlx.rum.sanitizeURL(), + checkpoint, + ...data, + }); const url = `https://rum.hlx.page/.rum/${weight}`; // eslint-disable-next-line no-unused-expressions navigator.sendBeacon(url, body); @@ -66,16 +88,21 @@ export function sampleRUM(checkpoint, data = {}) { cwv: () => sampleRUM.cwv(data) || true, lazy: () => { // use classic script to avoid CORS issues - const script = document.createElement('script'); - script.src = 'https://rum.hlx.page/.rum/@adobe/helix-rum-enhancer@^1/src/index.js'; + const script = document.createElement("script"); + script.src = + "https://rum.hlx.page/.rum/@adobe/helix-rum-enhancer@^1/src/index.js"; document.head.appendChild(script); return true; }, }; sendPing(data); - if (sampleRUM.cases[checkpoint]) { sampleRUM.cases[checkpoint](); } + if (sampleRUM.cases[checkpoint]) { + sampleRUM.cases[checkpoint](); + } + } + if (sampleRUM.always[checkpoint]) { + sampleRUM.always[checkpoint](data); } - if (sampleRUM.always[checkpoint]) { sampleRUM.always[checkpoint](data); } } catch (error) { // something went wrong } @@ -88,8 +115,8 @@ export function sampleRUM(checkpoint, data = {}) { export async function loadCSS(href) { return new Promise((resolve, reject) => { if (!document.querySelector(`head > link[href="${href}"]`)) { - const link = document.createElement('link'); - link.rel = 'stylesheet'; + const link = document.createElement("link"); + link.rel = "stylesheet"; link.href = href; link.onload = resolve; link.onerror = reject; @@ -109,10 +136,10 @@ export async function loadCSS(href) { export async function loadScript(src, attrs) { return new Promise((resolve, reject) => { if (!document.querySelector(`head > script[src="${src}"]`)) { - const script = document.createElement('script'); + const script = document.createElement("script"); script.src = src; if (attrs) { - // eslint-disable-next-line no-restricted-syntax, guard-for-in + // eslint-disable-next-line no-restricted-syntax, guard-for-in for (const attr in attrs) { script.setAttribute(attr, attrs[attr]); } @@ -132,9 +159,11 @@ export async function loadScript(src, attrs) { * @returns {string} The metadata value(s) */ export function getMetadata(name) { - const attr = name && name.includes(':') ? 'property' : 'name'; - const meta = [...document.head.querySelectorAll(`meta[${attr}="${name}"]`)].map((m) => m.content).join(', '); - return meta || ''; + const attr = name && name.includes(":") ? "property" : "name"; + const meta = [...document.head.querySelectorAll(`meta[${attr}="${name}"]`)] + .map((m) => m.content) + .join(", "); + return meta || ""; } /** @@ -143,9 +172,13 @@ export function getMetadata(name) { * @returns {string} The class name */ export function toClassName(name) { - return typeof name === 'string' - ? name.toLowerCase().replace(/[^0-9a-z]/gi, '-').replace(/-+/g, '-').replace(/^-|-$/g, '') - : ''; + return typeof name === "string" + ? name + .toLowerCase() + .replace(/[^0-9a-z]/gi, "-") + .replace(/-+/g, "-") + .replace(/^-|-$/g, "") + : ""; } /** @@ -164,66 +197,85 @@ const ICONS_CACHE = {}; */ export async function decorateIcons(element) { // Prepare the inline sprite - let svgSprite = document.getElementById('franklin-svg-sprite'); + let svgSprite = document.getElementById("franklin-svg-sprite"); if (!svgSprite) { - const div = document.createElement('div'); - div.innerHTML = ''; + const div = document.createElement("div"); + div.innerHTML = + ''; svgSprite = div.firstElementChild; document.body.append(div.firstElementChild); } // Download all new icons - const icons = [...element.querySelectorAll('span.icon')]; - await Promise.all(icons.map(async (span) => { - const iconName = Array.from(span.classList).find((c) => c.startsWith('icon-')).substring(5); - if (!ICONS_CACHE[iconName]) { - ICONS_CACHE[iconName] = true; - try { - const response = await fetch(`${window.hlx.iconsPath}/${iconName}.svg`); - if (!response.ok) { + const icons = [...element.querySelectorAll("span.icon")]; + await Promise.all( + icons.map(async (span) => { + const iconName = Array.from(span.classList) + .find((c) => c.startsWith("icon-")) + .substring(5); + if (!ICONS_CACHE[iconName]) { + ICONS_CACHE[iconName] = true; + try { + const response = await fetch( + `${window.hlx.iconsPath}/${iconName}.svg` + ); + if (!response.ok) { + ICONS_CACHE[iconName] = false; + return; + } + // Styled icons don't play nice with the sprite approach because of shadow dom isolation + // and same for internal references + const svg = await response.text(); + if (svg.match(/(`; - document.body.style.display = "block"; + document.body.style.display = 'block'; } async processExternal(response) { if (response.ok) { this.themeJson = await response.json(); - console.log(this); this.createVariables(); this.styles(); } diff --git a/package-lock.json b/package-lock.json index c23bc9b6..2a33b8af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,9 @@ "chai": "4.3.7", "eslint": "8.35.0", "eslint-config-airbnb-base": "15.0.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "2.27.5", + "prettier-eslint": "^16.2.0", "semantic-release": "21.0.5", "sinon": "15.0.1", "stylelint": "15.2.0", @@ -539,6 +541,18 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -1623,6 +1637,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@sinonjs/commons": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", @@ -1932,6 +1952,160 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/parser": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.16.0.tgz", + "integrity": "sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz", + "integrity": "sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.16.0.tgz", + "integrity": "sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz", + "integrity": "sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz", + "integrity": "sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.16.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@web/browser-logs": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.5.tgz", @@ -3027,6 +3201,15 @@ "node": ">=8" } }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -3574,6 +3757,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -4016,6 +4205,18 @@ "eslint-plugin-import": "^2.25.2" } }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", @@ -5057,6 +5258,27 @@ "node": ">= 0.4.0" } }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -6449,6 +6671,84 @@ "node": ">=8" } }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/loupe": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.3.tgz", @@ -10766,6 +11066,70 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-eslint": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.2.0.tgz", + "integrity": "sha512-GDTSKc62VaLceiaI/qMaKo2oco2CIWtbj4Zr6ckhbTgcBL/uR0d9jkMzh9OtBIT/Z7iBoCB4OHj/aJ5YuNgAuA==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^6.7.5", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", + "require-relative": "^0.8.7", + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" + }, + "engines": { + "node": ">=16.10.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10912,6 +11276,12 @@ "node": ">=0.10.0" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -11166,6 +11536,12 @@ "node": ">=0.10.0" } }, + "node_modules/require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -12658,6 +13034,18 @@ "node": ">=8" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -12751,6 +13139,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/typical": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", @@ -12926,6 +13327,82 @@ "node": ">= 0.8" } }, + "node_modules/vue-eslint-parser": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -13587,6 +14064,15 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, "@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -14341,6 +14827,12 @@ } } }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "@sinonjs/commons": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", @@ -14650,6 +15142,98 @@ "@types/node": "*" } }, + "@typescript-eslint/parser": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.16.0.tgz", + "integrity": "sha512-H2GM3eUo12HpKZU9njig3DF5zJ58ja6ahj1GoHEHOgQvYxzoFJJEvC1MQ7T2l9Ha+69ZSOn7RTxOdpC/y3ikMw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "6.16.0", + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/typescript-estree": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.16.0.tgz", + "integrity": "sha512-0N7Y9DSPdaBQ3sqSCwlrm9zJwkpOuc6HYm7LpzLAPqBL7dmzAUimr4M29dMkOP/tEwvOCC/Cxo//yOfJD3HUiw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0" + } + }, + "@typescript-eslint/types": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.16.0.tgz", + "integrity": "sha512-hvDFpLEvTJoHutVl87+MG/c5C8I6LOgEx05zExTSJDEVU7hhR3jhV8M5zuggbdFCw98+HhZWPHZeKS97kS3JoQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.16.0.tgz", + "integrity": "sha512-VTWZuixh/vr7nih6CfrdpmFNLEnoVBF1skfjdyGnNwXOH1SLeHItGdZDHhhAIzd3ACazyY2Fg76zuzOVTaknGA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.16.0", + "@typescript-eslint/visitor-keys": "6.16.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.16.0.tgz", + "integrity": "sha512-QSFQLruk7fhs91a/Ep/LqRdbJCZ1Rq03rqBdKT5Ky17Sz8zRLUksqIe9DW0pKtg/Z35/ztbLQ6qpOCN6rOC11A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.16.0", + "eslint-visitor-keys": "^3.4.1" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + } + } + }, "@web/browser-logs": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.5.tgz", @@ -15441,6 +16025,12 @@ } } }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, "compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -15845,6 +16435,12 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -16279,6 +16875,13 @@ "semver": "^6.3.0" } }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, "eslint-import-resolver-node": { "version": "0.3.7", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", @@ -16985,6 +17588,23 @@ "function-bind": "^1.1.1" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -18030,6 +18650,64 @@ } } }, + "loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "dev": true + }, + "loglevel-colored-level-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz", + "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, "loupe": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.3.tgz", @@ -20970,6 +21648,51 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, + "prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true + }, + "prettier-eslint": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.2.0.tgz", + "integrity": "sha512-GDTSKc62VaLceiaI/qMaKo2oco2CIWtbj4Zr6ckhbTgcBL/uR0d9jkMzh9OtBIT/Z7iBoCB4OHj/aJ5YuNgAuA==", + "dev": true, + "requires": { + "@typescript-eslint/parser": "^6.7.5", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", + "require-relative": "^0.8.7", + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" + } + }, + "pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -21080,6 +21803,12 @@ } } }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -21269,6 +21998,12 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==", + "dev": true + }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -22370,6 +23105,13 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, + "ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "requires": {} + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -22441,6 +23183,12 @@ "is-typed-array": "^1.1.9" } }, + "typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true + }, "typical": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", @@ -22567,6 +23315,54 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "vue-eslint-parser": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "dependencies": { + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index 4587406e..6d846dd2 100644 --- a/package.json +++ b/package.json @@ -21,19 +21,21 @@ }, "homepage": "https://github.com/adobe/helix-project-boilerplate#readme", "devDependencies": { + "@babel/core": "7.21.0", + "@babel/eslint-parser": "7.19.1", + "@esm-bundle/chai": "4.3.4-fix.0", "@semantic-release/changelog": "6.0.3", "@semantic-release/exec": "6.0.3", "@semantic-release/git": "10.0.1", - "semantic-release": "21.0.5", - "@babel/core": "7.21.0", - "@babel/eslint-parser": "7.19.1", + "@web/test-runner": "0.15.1", + "@web/test-runner-commands": "0.6.5", "chai": "4.3.7", "eslint": "8.35.0", "eslint-config-airbnb-base": "15.0.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "2.27.5", - "@esm-bundle/chai": "4.3.4-fix.0", - "@web/test-runner": "0.15.1", - "@web/test-runner-commands": "0.6.5", + "prettier-eslint": "^16.2.0", + "semantic-release": "21.0.5", "sinon": "15.0.1", "stylelint": "15.2.0", "stylelint-config-standard": "30.0.1" diff --git a/scripts/component-base.js b/scripts/component-base.js index d6a71d50..3b1086dd 100644 --- a/scripts/component-base.js +++ b/scripts/component-base.js @@ -1,17 +1,25 @@ -import { init } from "./init.js"; +import { init } from './init.js'; -export class ComponentBase extends HTMLElement { - static breakpoints = { S: 0, M: 768, L: 1024, XL: 1280, XXL: 1920 }; - attributes = {}; - external = false; - uuid = `gen${crypto.randomUUID().split("-")[0]}`; +export default class ComponentBase extends HTMLElement { + static get breakpoints() { + return { + S: 0, + M: 768, + L: 1024, + XL: 1280, + XXL: 1920, + }; + } constructor() { super(); + this.attributes = {}; + this.external = false; + this.uuid = `gen${crypto.randomUUID().split('-')[0]}`; } async connectedCallback() { - this.setAttribute("id", this.uuid); + this.setAttribute('id', this.uuid); if (this.external) { await this.load(this.external); } @@ -22,7 +30,7 @@ export class ComponentBase extends HTMLElement { async load(block) { const response = await fetch( `${block}`, - window.location.pathname.endsWith(block) ? { cache: "reload" } : {} + window.location.pathname.endsWith(block) ? { cache: 'reload' } : {}, ); return this.processExternal(response); } @@ -32,11 +40,11 @@ export class ComponentBase extends HTMLElement { const html = await response.text(); this.innerHTML = html; return init(this); - } else { - console.log(response); } + return response; } connected() {} + render() {} } diff --git a/scripts/component-loader.js b/scripts/component-loader.js index ac1f8bf0..da400637 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -1,6 +1,6 @@ -import { config } from "./libs.js"; +import { config } from './libs.js'; -export class ComponentLoader { +export default class ComponentLoader { constructor(blockName, element) { window.raqnComponents = window.raqnComponents || {}; this.block = element; @@ -17,8 +17,8 @@ export class ComponentLoader { async loadCSS(href) { return new Promise((resolve, reject) => { if (!document.querySelector(`head > link[href="${href}"]`)) { - const link = document.createElement("link"); - link.rel = "stylesheet"; + const link = document.createElement('link'); + link.rel = 'stylesheet'; link.href = href; link.onload = resolve; link.onerror = reject; @@ -37,11 +37,9 @@ export class ComponentLoader { const mediaParams = {}; this.params = { ...Array.from(this.block.classList) - .filter((c) => { - return c !== this.blockName && c !== "block"; - }) + .filter((c) => c !== this.blockName && c !== 'block') .reduce((acc, c) => { - const values = c.split("-"); + const values = c.split('-'); let key = values.shift(); if (breakpoints.includes(key)) { if ( @@ -51,16 +49,16 @@ export class ComponentLoader { } key = values.shift(); mediaParams[key] = mediaParams[key] || []; - mediaParams[key].push(values.join("-")); + mediaParams[key].push(values.join('-')); return acc; } if (acc[key] && Array.isArray(acc[key])) { - acc[key].push(values.join("-")); + acc[key].push(values.join('-')); } else if (acc[key]) { - acc[key] = [acc[key], values.join("-")]; + acc[key] = [acc[key], values.join('-')]; } else { - acc[key] = values.join("-"); + acc[key] = values.join('-'); } return acc; }, {}), @@ -82,8 +80,8 @@ export class ComponentLoader { async decorate() { const status = this.block.dataset.blockStatus; - if (status !== "loading" && status !== "loaded") { - this.block.dataset.blockStatus = "loading"; + if (status !== 'loading' && status !== 'loaded') { + this.block.dataset.blockStatus = 'loading'; try { const cssLoaded = this.loadCSS(this.cssPath); const decorationComplete = new Promise((resolve) => { @@ -93,13 +91,12 @@ export class ComponentLoader { if ( mod.default && mod.default.name && - mod.default.name !== "decorate" + mod.default.name !== 'decorate' ) { - const name = mod.default.name; + const { name } = mod.default; const elementName = `raqn-${name.toLowerCase()}`; // define the custom element if it doesn't exist if (!window.raqnComponents[name]) { - const elementName = `raqn-${name.toLowerCase()}`; const Contructor = mod.default; customElements.define(elementName, Contructor); window.raqnComponents[name] = Contructor; @@ -109,7 +106,7 @@ export class ComponentLoader { Object.keys(this.params).forEach((key) => { // @TODO sanitize const value = Array.isArray(this.params[key]) - ? this.params[key].join(" ") + ? this.params[key].join(' ') : this.params[key]; element.setAttribute(key, value); }); @@ -131,5 +128,6 @@ export class ComponentLoader { console.log(`failed to load block ${this.blockName}`, error); } } + return Promise.resolve(); } } diff --git a/scripts/init.js b/scripts/init.js index d16efb22..af97f603 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -1,5 +1,5 @@ -import { ComponentLoader } from "./component-loader.js"; -import { config, debounce } from "./libs.js"; +import ComponentLoader from './component-loader.js'; +import { config, debounce } from './libs.js'; export function retriveDataFrom(blocks) { return blocks.map((block) => { @@ -7,9 +7,9 @@ export function retriveDataFrom(blocks) { const tagName = element.tagName.toLowerCase(); let blockName = tagName; if (!config.elementBlocks.includes(tagName)) { - blockName = element.classList[0]; + [blockName] = Array.from(element.classList); } else { - element = document.createElement("div"); + element = document.createElement('div'); block.append(element); } return { @@ -21,12 +21,12 @@ export function retriveDataFrom(blocks) { export async function init(element = document) { let blocks = Array.from( - element.querySelectorAll("[class]:not([class^=raqn]") + element.querySelectorAll('[class]:not([class^=raqn]'), ); if (element === document) { - const header = element.querySelector("header"); - const footer = element.querySelector("footer"); + const header = element.querySelector('header'); + const footer = element.querySelector('footer'); blocks = [header, ...blocks, footer]; } @@ -34,25 +34,25 @@ export async function init(element = document) { const prio = data.slice(0, 2); const rest = data.slice(2); Promise.all( - prio.map(({ blockName, element }) => { - const loader = new ComponentLoader(blockName, element); + prio.map(({ blockName, el }) => { + const loader = new ComponentLoader(blockName, el); return loader.decorate(); - }) + }), ); setTimeout(() => { Promise.all( - rest.map(({ blockName, element }) => { - const loader = new ComponentLoader(blockName, element); + rest.map(({ blockName, el }) => { + const loader = new ComponentLoader(blockName, el); return loader.decorate(); - }) + }), ); }); window.addEventListener( - "resize", + 'resize', debounce(() => { - location.reload(); - }, 300) + window.location.reload(); + }, 300), ); } diff --git a/scripts/lib-franklin.js b/scripts/lib-franklin.js index 1787ea3f..d365f1bd 100644 --- a/scripts/lib-franklin.js +++ b/scripts/lib-franklin.js @@ -18,13 +18,11 @@ export function sampleRUM(checkpoint, data = {}) { sampleRUM.defer = sampleRUM.defer || []; const defer = (fnname) => { - sampleRUM[fnname] = - sampleRUM[fnname] || - ((...args) => sampleRUM.defer.push({ fnname, args })); + sampleRUM[fnname] = sampleRUM[fnname] + || ((...args) => sampleRUM.defer.push({ fnname, args })); }; - sampleRUM.drain = - sampleRUM.drain || - ((dfnname, fn) => { + sampleRUM.drain = sampleRUM.drain + || ((dfnname, fn) => { sampleRUM[dfnname] = fn; sampleRUM.defer .filter(({ fnname }) => dfnname === fnname) @@ -37,25 +35,24 @@ export function sampleRUM(checkpoint, data = {}) { sampleRUM.on = (chkpnt, fn) => { sampleRUM.cases[chkpnt] = fn; }; - defer("observe"); - defer("cwv"); + defer('observe'); + defer('cwv'); try { window.hlx = window.hlx || {}; if (!window.hlx.rum) { const usp = new URLSearchParams(window.location.search); - const weight = usp.get("rum") === "on" ? 1 : 100; // with parameter, weight is 1. Defaults to 100. + const weight = usp.get('rum') === 'on' ? 1 : 100; // with parameter, weight is 1. Defaults to 100. // eslint-disable-next-line no-bitwise - const hashCode = (s) => - s.split("").reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0); + const hashCode = (s) => s.split('').reduce((a, b) => ((a << 5) - a + b.charCodeAt(0)) | 0, 0); const id = `${hashCode( - window.location.href + window.location.href, )}-${new Date().getTime()}-${Math.random().toString(16).substr(2, 14)}`; const random = Math.random(); const isSelected = random * weight < 1; const urlSanitizers = { full: () => window.location.href, origin: () => window.location.origin, - path: () => window.location.href.replace(/\?.*$/, ""), + path: () => window.location.href.replace(/\?.*$/, ''), }; // eslint-disable-next-line object-curly-newline, max-len window.hlx.rum = { @@ -64,7 +61,7 @@ export function sampleRUM(checkpoint, data = {}) { random, isSelected, sampleRUM, - sanitizeURL: urlSanitizers[window.hlx.RUM_MASK_URL || "path"], + sanitizeURL: urlSanitizers[window.hlx.RUM_MASK_URL || 'path'], }; } const { weight, id } = window.hlx.rum; @@ -88,9 +85,8 @@ export function sampleRUM(checkpoint, data = {}) { cwv: () => sampleRUM.cwv(data) || true, lazy: () => { // use classic script to avoid CORS issues - const script = document.createElement("script"); - script.src = - "https://rum.hlx.page/.rum/@adobe/helix-rum-enhancer@^1/src/index.js"; + const script = document.createElement('script'); + script.src = 'https://rum.hlx.page/.rum/@adobe/helix-rum-enhancer@^1/src/index.js'; document.head.appendChild(script); return true; }, @@ -115,8 +111,8 @@ export function sampleRUM(checkpoint, data = {}) { export async function loadCSS(href) { return new Promise((resolve, reject) => { if (!document.querySelector(`head > link[href="${href}"]`)) { - const link = document.createElement("link"); - link.rel = "stylesheet"; + const link = document.createElement('link'); + link.rel = 'stylesheet'; link.href = href; link.onload = resolve; link.onerror = reject; @@ -136,7 +132,7 @@ export async function loadCSS(href) { export async function loadScript(src, attrs) { return new Promise((resolve, reject) => { if (!document.querySelector(`head > script[src="${src}"]`)) { - const script = document.createElement("script"); + const script = document.createElement('script'); script.src = src; if (attrs) { // eslint-disable-next-line no-restricted-syntax, guard-for-in @@ -159,11 +155,11 @@ export async function loadScript(src, attrs) { * @returns {string} The metadata value(s) */ export function getMetadata(name) { - const attr = name && name.includes(":") ? "property" : "name"; + const attr = name && name.includes(':') ? 'property' : 'name'; const meta = [...document.head.querySelectorAll(`meta[${attr}="${name}"]`)] .map((m) => m.content) - .join(", "); - return meta || ""; + .join(', '); + return meta || ''; } /** @@ -172,13 +168,13 @@ export function getMetadata(name) { * @returns {string} The class name */ export function toClassName(name) { - return typeof name === "string" + return typeof name === 'string' ? name - .toLowerCase() - .replace(/[^0-9a-z]/gi, "-") - .replace(/-+/g, "-") - .replace(/^-|-$/g, "") - : ""; + .toLowerCase() + .replace(/[^0-9a-z]/gi, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, '') + : ''; } /** @@ -197,27 +193,26 @@ const ICONS_CACHE = {}; */ export async function decorateIcons(element) { // Prepare the inline sprite - let svgSprite = document.getElementById("franklin-svg-sprite"); + let svgSprite = document.getElementById('franklin-svg-sprite'); if (!svgSprite) { - const div = document.createElement("div"); - div.innerHTML = - ''; + const div = document.createElement('div'); + div.innerHTML = ''; svgSprite = div.firstElementChild; document.body.append(div.firstElementChild); } // Download all new icons - const icons = [...element.querySelectorAll("span.icon")]; + const icons = [...element.querySelectorAll('span.icon')]; await Promise.all( icons.map(async (span) => { const iconName = Array.from(span.classList) - .find((c) => c.startsWith("icon-")) + .find((c) => c.startsWith('icon-')) .substring(5); if (!ICONS_CACHE[iconName]) { ICONS_CACHE[iconName] = true; try { const response = await fetch( - `${window.hlx.iconsPath}/${iconName}.svg` + `${window.hlx.iconsPath}/${iconName}.svg`, ); if (!response.ok) { ICONS_CACHE[iconName] = false; @@ -233,24 +228,24 @@ export async function decorateIcons(element) { // rescope ids and references to avoid clashes across icons; .replaceAll( / id="([^"]+)"/g, - (_, id) => ` id="${iconName}-${id}"` + (_, id) => ` id="${iconName}-${id}"`, ) .replaceAll( /="url\(#([^)]+)\)"/g, - (_, id) => `="url(#${iconName}-${id})"` + (_, id) => `="url(#${iconName}-${id})"`, ) .replaceAll( / xlink:href="#([^"]+)"/g, - (_, id) => ` xlink:href="#${iconName}-${id}"` + (_, id) => ` xlink:href="#${iconName}-${id}"`, ), }; } else { ICONS_CACHE[iconName] = { html: svg - .replace("", ""), + .replace('', ''), }; } } catch (error) { @@ -259,7 +254,7 @@ export async function decorateIcons(element) { console.error(error); } } - }) + }), ); const symbols = Object.keys(ICONS_CACHE) @@ -267,15 +262,14 @@ export async function decorateIcons(element) { .map((k) => ICONS_CACHE[k]) .filter((v) => !v.styled) .map((v) => v.html) - .join("\n"); + .join('\n'); svgSprite.innerHTML += symbols; icons.forEach((span) => { const iconName = Array.from(span.classList) - .find((c) => c.startsWith("icon-")) + .find((c) => c.startsWith('icon-')) .substring(5); - const parent = - span.firstElementChild?.tagName === "A" ? span.firstElementChild : span; + const parent = span.firstElementChild?.tagName === 'A' ? span.firstElementChild : span; // Styled icons need to be inlined as-is, while unstyled ones can leverage the sprite if (ICONS_CACHE[iconName].styled) { parent.innerHTML = ICONS_CACHE[iconName].html; @@ -290,12 +284,12 @@ export async function decorateIcons(element) { * @param {string} [prefix] Location of placeholders * @returns {object} Window placeholders object */ -export async function fetchPlaceholders(prefix = "default") { +export async function fetchPlaceholders(prefix = 'default') { window.placeholders = window.placeholders || {}; const loaded = window.placeholders[`${prefix}-loaded`]; if (!loaded) { window.placeholders[`${prefix}-loaded`] = new Promise((resolve, reject) => { - fetch(`${prefix === "default" ? "" : prefix}/placeholders.json`) + fetch(`${prefix === 'default' ? '' : prefix}/placeholders.json`) .then((resp) => { if (resp.ok) { return resp.json(); @@ -330,12 +324,12 @@ export async function fetchPlaceholders(prefix = "default") { export function decorateBlock(block) { const shortBlockName = block.classList[0]; if (shortBlockName) { - block.classList.add("block"); + block.classList.add('block'); block.dataset.blockName = shortBlockName; - block.dataset.blockStatus = "initialized"; + block.dataset.blockStatus = 'initialized'; const blockWrapper = block.parentElement; blockWrapper.classList.add(`${shortBlockName}-wrapper`); - const section = block.closest(".section"); + const section = block.closest('.section'); if (section) section.classList.add(`${shortBlockName}-container`); } } @@ -347,29 +341,29 @@ export function decorateBlock(block) { */ export function readBlockConfig(block) { const config = {}; - block.querySelectorAll(":scope > div").forEach((row) => { + block.querySelectorAll(':scope > div').forEach((row) => { if (row.children) { const cols = [...row.children]; if (cols[1]) { const col = cols[1]; const name = toClassName(cols[0].textContent); - let value = ""; - if (col.querySelector("a")) { - const as = [...col.querySelectorAll("a")]; + let value = ''; + if (col.querySelector('a')) { + const as = [...col.querySelectorAll('a')]; if (as.length === 1) { value = as[0].href; } else { value = as.map((a) => a.href); } - } else if (col.querySelector("img")) { - const imgs = [...col.querySelectorAll("img")]; + } else if (col.querySelector('img')) { + const imgs = [...col.querySelectorAll('img')]; if (imgs.length === 1) { value = imgs[0].src; } else { value = imgs.map((img) => img.src); } - } else if (col.querySelector("p")) { - const ps = [...col.querySelectorAll("p")]; + } else if (col.querySelector('p')) { + const ps = [...col.querySelectorAll('p')]; if (ps.length === 1) { value = ps[0].textContent; } else { @@ -385,15 +379,15 @@ export function readBlockConfig(block) { export function addCssVariables(element, variables) { if (!element.id) { - const id = `gen${crypto.randomUUID().split("-")[0]}`; + const id = `gen${crypto.randomUUID().split('-')[0]}`; element.id = id; } - const style = document.createElement("style"); + const style = document.createElement('style'); style.textContent = `#${element.id} { ${Object.keys(variables) - .map((k) => variables[k] && `--${k}: ${variables[k]};`) - .join(" ")} + .map((k) => variables[k] && `--${k}: ${variables[k]};`) + .join(' ')} }`; element.parentNode.insertBefore(style, element); @@ -403,27 +397,27 @@ export function decorateSection(section) { const wrappers = []; let defaultContent = false; [...section.children].forEach((e) => { - if (e.tagName === "DIV" || !defaultContent) { - const wrapper = document.createElement("div"); + if (e.tagName === 'DIV' || !defaultContent) { + const wrapper = document.createElement('div'); wrappers.push(wrapper); - defaultContent = e.tagName !== "DIV"; - if (defaultContent) wrapper.classList.add("default-content-wrapper"); + defaultContent = e.tagName !== 'DIV'; + if (defaultContent) wrapper.classList.add('default-content-wrapper'); } wrappers[wrappers.length - 1].append(e); }); wrappers.forEach((wrapper) => section.append(wrapper)); - section.classList.add("section"); - section.dataset.sectionStatus = "initialized"; - section.style.display = "none"; + section.classList.add('section'); + section.dataset.sectionStatus = 'initialized'; + section.style.display = 'none'; /* process section metadata */ - const sectionMeta = section.querySelector("div.section-metadata"); + const sectionMeta = section.querySelector('div.section-metadata'); if (sectionMeta) { const meta = readBlockConfig(sectionMeta); Object.keys(meta).forEach((key) => { - if (key === "style") { + if (key === 'style') { const styles = meta.style - .split(",") + .split(',') .map((style) => toClassName(style.trim())); styles.forEach((style) => section.classList.add(style)); } else { @@ -435,8 +429,8 @@ export function decorateSection(section) { if (section.dataset.textColor || section.dataset.background) { addCssVariables(section, { - "text-color": section.dataset.textColor, - "background-color": section.dataset.background, + 'text-color': section.dataset.textColor, + 'background-color': section.dataset.background, }); } } @@ -447,7 +441,7 @@ export function decorateSection(section) { */ export function decorateSections(main) { main - .querySelectorAll(":scope > div") + .querySelectorAll(':scope > div') .forEach((section) => decorateSection(section)); } @@ -456,19 +450,19 @@ export function decorateSections(main) { * @param {Element} main The container element */ export function updateSectionsStatus(main) { - const sections = [...main.querySelectorAll(":scope > div.section")]; + const sections = [...main.querySelectorAll(':scope > div.section')]; for (let i = 0; i < sections.length; i += 1) { const section = sections[i]; const status = section.dataset.sectionStatus; - if (status !== "loaded") { + if (status !== 'loaded') { const loadingBlock = section.querySelector( - '.block[data-block-status="initialized"], .block[data-block-status="loading"]' + '.block[data-block-status="initialized"], .block[data-block-status="loading"]', ); if (loadingBlock) { - section.dataset.sectionStatus = "loading"; + section.dataset.sectionStatus = 'loading'; break; } else { - section.dataset.sectionStatus = "loaded"; + section.dataset.sectionStatus = 'loaded'; section.style.display = null; } } @@ -480,7 +474,7 @@ export function updateSectionsStatus(main) { * @param {Element} main The container element */ export function decorateBlocks(main) { - main.querySelectorAll("div.section > div > div").forEach(decorateBlock); + main.querySelectorAll('div.section > div > div').forEach(decorateBlock); } /** @@ -490,17 +484,17 @@ export function decorateBlocks(main) { */ export function buildBlock(blockName, content) { const table = Array.isArray(content) ? content : [[content]]; - const blockEl = document.createElement("div"); + const blockEl = document.createElement('div'); // build image block nested div structure blockEl.classList.add(blockName); table.forEach((row) => { - const rowEl = document.createElement("div"); + const rowEl = document.createElement('div'); row.forEach((col) => { - const colEl = document.createElement("div"); + const colEl = document.createElement('div'); const vals = col.elems ? col.elems : [col]; vals.forEach((val) => { if (val) { - if (typeof val === "string") { + if (typeof val === 'string') { colEl.innerHTML += val; } else { colEl.appendChild(val); @@ -527,7 +521,7 @@ function getBlockConfig(block) { const jsPath = `${window.hlx.codeBasePath}/blocks/${blockName}/${blockName}.js`; const original = { blockName, cssPath, jsPath }; return window.hlx.patchBlockConfig - .filter((fn) => typeof fn === "function") + .filter((fn) => typeof fn === 'function') .reduce((config, fn) => fn(config, original), { blockName, cssPath, @@ -541,8 +535,8 @@ function getBlockConfig(block) { */ export async function loadBlock(block) { const status = block.dataset.blockStatus; - if (status !== "loading" && status !== "loaded") { - block.dataset.blockStatus = "loading"; + if (status !== 'loading' && status !== 'loaded') { + block.dataset.blockStatus = 'loading'; const { blockName, cssPath, jsPath } = getBlockConfig(block); try { const cssLoaded = loadCSS(cssPath); @@ -565,7 +559,7 @@ export async function loadBlock(block) { // eslint-disable-next-line no-console console.log(`failed to load block ${blockName}`, error); } - block.dataset.blockStatus = "loaded"; + block.dataset.blockStatus = 'loaded'; } } @@ -575,7 +569,7 @@ export async function loadBlock(block) { */ export async function loadBlocks(main) { updateSectionsStatus(main); - const blocks = [...main.querySelectorAll("div.block")]; + const blocks = [...main.querySelectorAll('div.block')]; for (let i = 0; i < blocks.length; i += 1) { // eslint-disable-next-line no-await-in-loop await loadBlock(blocks[i]); @@ -593,26 +587,26 @@ export async function loadBlocks(main) { */ export function createOptimizedPicture( src, - alt = "", + alt = '', eager = false, breakpoints = [ - { media: "(min-width: 600px)", width: "2000" }, - { width: "750" }, - ] + { media: '(min-width: 600px)', width: '2000' }, + { width: '750' }, + ], ) { const url = new URL(src, window.location.href); - const picture = document.createElement("picture"); + const picture = document.createElement('picture'); const { pathname } = url; - const ext = pathname.substring(pathname.lastIndexOf(".") + 1); + const ext = pathname.substring(pathname.lastIndexOf('.') + 1); // webp breakpoints.forEach((br) => { - const source = document.createElement("source"); - if (br.media) source.setAttribute("media", br.media); - source.setAttribute("type", "image/webp"); + const source = document.createElement('source'); + if (br.media) source.setAttribute('media', br.media); + source.setAttribute('type', 'image/webp'); source.setAttribute( - "srcset", - `${pathname}?width=${br.width}&format=webply&optimize=medium` + 'srcset', + `${pathname}?width=${br.width}&format=webply&optimize=medium`, ); picture.appendChild(source); }); @@ -620,21 +614,21 @@ export function createOptimizedPicture( // fallback breakpoints.forEach((br, i) => { if (i < breakpoints.length - 1) { - const source = document.createElement("source"); - if (br.media) source.setAttribute("media", br.media); + const source = document.createElement('source'); + if (br.media) source.setAttribute('media', br.media); source.setAttribute( - "srcset", - `${pathname}?width=${br.width}&format=${ext}&optimize=medium` + 'srcset', + `${pathname}?width=${br.width}&format=${ext}&optimize=medium`, ); picture.appendChild(source); } else { - const img = document.createElement("img"); - img.setAttribute("loading", eager ? "eager" : "lazy"); - img.setAttribute("alt", alt); + const img = document.createElement('img'); + img.setAttribute('loading', eager ? 'eager' : 'lazy'); + img.setAttribute('alt', alt); picture.appendChild(img); img.setAttribute( - "src", - `${pathname}?width=${br.width}&format=${ext}&optimize=medium` + 'src', + `${pathname}?width=${br.width}&format=${ext}&optimize=medium`, ); } }); @@ -649,7 +643,7 @@ export function createOptimizedPicture( */ export function normalizeHeadings(el, allowedHeadings) { const allowed = allowedHeadings.map((h) => h.toLowerCase()); - el.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach((tag) => { + el.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((tag) => { const h = tag.tagName.toLowerCase(); if (allowed.indexOf(h) === -1) { // current heading is not in the allowed list -> try first to "promote" the heading @@ -675,13 +669,13 @@ export function normalizeHeadings(el, allowedHeadings) { */ export function decorateTemplateAndTheme() { const addClasses = (element, classes) => { - classes.split(",").forEach((c) => { + classes.split(',').forEach((c) => { element.classList.add(toClassName(c.trim())); }); }; - const template = getMetadata("template"); + const template = getMetadata('template'); if (template) addClasses(document.body, template); - const theme = getMetadata("theme"); + const theme = getMetadata('theme'); if (theme) addClasses(document.body, theme); } @@ -690,36 +684,36 @@ export function decorateTemplateAndTheme() { * @param {Element} element container element */ export function decorateButtons(element) { - element.querySelectorAll("a").forEach((a) => { + element.querySelectorAll('a').forEach((a) => { a.title = a.title || a.textContent; if (a.href !== a.textContent) { const up = a.parentElement; const twoup = a.parentElement.parentElement; - if (!a.querySelector("img")) { + if (!a.querySelector('img')) { if ( - up.childNodes.length === 1 && - (up.tagName === "P" || up.tagName === "DIV") + up.childNodes.length === 1 + && (up.tagName === 'P' || up.tagName === 'DIV') ) { - a.className = "button primary"; // default - up.classList.add("button-container"); + a.className = 'button primary'; // default + up.classList.add('button-container'); } if ( - up.childNodes.length === 1 && - up.tagName === "STRONG" && - twoup.childNodes.length === 1 && - twoup.tagName === "P" + up.childNodes.length === 1 + && up.tagName === 'STRONG' + && twoup.childNodes.length === 1 + && twoup.tagName === 'P' ) { - a.className = "button primary"; - twoup.classList.add("button-container"); + a.className = 'button primary'; + twoup.classList.add('button-container'); } if ( - up.childNodes.length === 1 && - up.tagName === "EM" && - twoup.childNodes.length === 1 && - twoup.tagName === "P" + up.childNodes.length === 1 + && up.tagName === 'EM' + && twoup.childNodes.length === 1 + && twoup.tagName === 'P' ) { - a.className = "button secondary"; - twoup.classList.add("button-container"); + a.className = 'button secondary'; + twoup.classList.add('button-container'); } } } @@ -730,17 +724,17 @@ export function decorateButtons(element) { * Load LCP block and/or wait for LCP in default content. */ export async function waitForLCP(lcpBlocks) { - const block = document.querySelector(".block"); + const block = document.querySelector('.block'); const hasLCPBlock = block && lcpBlocks.includes(block.dataset.blockName); if (hasLCPBlock) await loadBlock(block); document.body.style.display = null; - const lcpCandidate = document.querySelector("main img"); + const lcpCandidate = document.querySelector('main img'); await new Promise((resolve) => { if (lcpCandidate && !lcpCandidate.complete) { - lcpCandidate.setAttribute("loading", "eager"); - lcpCandidate.addEventListener("load", resolve); - lcpCandidate.addEventListener("error", resolve); + lcpCandidate.setAttribute('loading', 'eager'); + lcpCandidate.addEventListener('load', resolve); + lcpCandidate.addEventListener('error', resolve); } else { resolve(); } @@ -753,20 +747,20 @@ export async function waitForLCP(lcpBlocks) { * @returns {Promise} */ export async function loadHeader(header) { - const navMeta = getMetadata("header"); - const navPath = navMeta ? new URL(navMeta).pathname : "/header"; + const navMeta = getMetadata('header'); + const navPath = navMeta ? new URL(navMeta).pathname : '/header'; const resp = await fetch(`${navPath}.plain.html`); addCssVariables(header, { - "background-color": getMetadata("header-background"), - "header-height": getMetadata("header-height"), - "text-color": getMetadata("header-text-color"), + 'background-color': getMetadata('header-background'), + 'header-height': getMetadata('header-height'), + 'text-color': getMetadata('header-text-color'), }); if (resp.ok) { const html = await resp.text(); header.innerHTML = html; - header.dataset.blockName = "header"; + header.dataset.blockName = 'header'; await loadBlock(header); } } @@ -777,7 +771,7 @@ export async function loadHeader(header) { * @returns {Promise} */ export function loadFooter(footer) { - const footerBlock = buildBlock("footer", ""); + const footerBlock = buildBlock('footer', ''); footer.append(footerBlock); decorateBlock(footerBlock); return loadBlock(footerBlock); @@ -788,18 +782,17 @@ export function loadFooter(footer) { */ export function setup() { window.hlx = window.hlx || {}; - window.hlx.RUM_MASK_URL = "full"; - window.hlx.codeBasePath = ""; - window.hlx.lighthouse = - new URLSearchParams(window.location.search).get("lighthouse") === "on"; + window.hlx.RUM_MASK_URL = 'full'; + window.hlx.codeBasePath = ''; + window.hlx.lighthouse = new URLSearchParams(window.location.search).get('lighthouse') === 'on'; window.hlx.patchBlockConfig = []; - window.hlx.iconsPath = "/assets/icons"; + window.hlx.iconsPath = '/assets/icons'; const scriptEl = document.querySelector('script[src$="/scripts/scripts.js"]'); if (scriptEl) { try { [window.hlx.codeBasePath] = new URL(scriptEl.src).pathname.split( - "/scripts/scripts.js" + '/scripts/scripts.js', ); } catch (error) { // eslint-disable-next-line no-console @@ -813,19 +806,19 @@ export function setup() { */ function init() { setup(); - sampleRUM("top"); + sampleRUM('top'); - window.addEventListener("load", () => sampleRUM("load")); + window.addEventListener('load', () => sampleRUM('load')); - window.addEventListener("unhandledrejection", (event) => { - sampleRUM("error", { + window.addEventListener('unhandledrejection', (event) => { + sampleRUM('error', { source: event.reason.sourceURL, target: event.reason.line, }); }); - window.addEventListener("error", (event) => { - sampleRUM("error", { source: event.filename, target: event.lineno }); + window.addEventListener('error', (event) => { + sampleRUM('error', { source: event.filename, target: event.lineno }); }); } diff --git a/scripts/libs.js b/scripts/libs.js index 43b71edd..9f6bec6b 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -1,5 +1,5 @@ export const config = { - elementBlocks: ["header", "footer"], + elementBlocks: ['header', 'footer'], breakpoints: { s: 0, m: 768, diff --git a/scripts/scripts.js b/scripts/scripts.js index 05fd988d..346bb88e 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -24,7 +24,12 @@ function buildHeroBlock(main) { const h1 = main.querySelector('h1'); const picture = main.querySelector('picture'); // eslint-disable-next-line no-bitwise - if (h1 && picture && (h1.compareDocumentPosition(picture) & Node.DOCUMENT_POSITION_PRECEDING)) { + if ( + h1 && + picture && + // eslint-disable-next-line no-bitwise + h1.compareDocumentPosition(picture) & Node.DOCUMENT_POSITION_PRECEDING + ) { const section = document.createElement('div'); section.append(buildBlock('hero', { elems: [picture, h1] })); main.prepend(section); @@ -53,7 +58,8 @@ function buildGrid(main) { async function loadFonts() { await loadCSS(`${window.hlx.codeBasePath}/styles/fonts.css`); try { - if (!window.location.hostname.includes('localhost')) sessionStorage.setItem('fonts-loaded', 'true'); + if (!window.location.hostname.includes('localhost')) + sessionStorage.setItem('fonts-loaded', 'true'); } catch (e) { // do nothing } @@ -74,7 +80,10 @@ function buildAutoBlocks(main) { function decorateImages(main) { main.querySelectorAll('picture').forEach((i) => { - if (i.parentElement.tagName === 'P' && i.parentElement.children.length === 1) { + if ( + i.parentElement.tagName === 'P' && + i.parentElement.children.length === 1 + ) { i.parentElement.classList.add('image-wrapper'); } }); @@ -145,20 +154,9 @@ async function loadLazy(doc) { sampleRUM.observe(main.querySelectorAll('picture > img')); } -/** - * Loads everything that happens a lot later, - * without impacting the user experience. - */ -function loadDelayed() { - // eslint-disable-next-line import/no-cycle - window.setTimeout(() => import('./delayed.js'), 3000); - // load anything that can be postponed to the latest here -} - async function loadPage() { await loadEager(document); await loadLazy(document); - loadDelayed(); } loadPage(); diff --git a/styles/styles.css b/styles/styles.css index 7512db34..2d3abec9 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -1,5 +1,3 @@ - - @font-face { font-family: roboto-fallback; size-adjust: 100.06%; @@ -39,7 +37,6 @@ a { picture, img { - display: block; max-width: 100%; height: auto; @@ -51,21 +48,24 @@ header { @keyframes placeholder { 0% { - background-color: var(--placeholder-primary, #fff); + background-color: var(--placeholder-primary, #fff); } + 50% { - background-color: var(--placeholder-secondary, #ccc); + background-color: var(--placeholder-secondary, #ccc); } + 100% { - background-color: var(--placeholder-primary, #fff); + background-color: var(--placeholder-primary, #fff); } } -@keyframes fadeIn { +@keyframes fade-in { 0% { - opacity: 0%; + opacity: 0; } + 100% { - opacity: 100%; + opacity: 1; } -} \ No newline at end of file +} From 5028cc826ab7f803ac4dc107ec400a012a985d66 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Wed, 27 Dec 2023 17:30:54 +0100 Subject: [PATCH 08/59] reviewing linter --- scripts/component-base.js | 1 - scripts/component-loader.js | 1 + scripts/init.js | 36 +++++++++++++++++------------------- 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/scripts/component-base.js b/scripts/component-base.js index 3b1086dd..31e73567 100644 --- a/scripts/component-base.js +++ b/scripts/component-base.js @@ -13,7 +13,6 @@ export default class ComponentBase extends HTMLElement { constructor() { super(); - this.attributes = {}; this.external = false; this.uuid = `gen${crypto.randomUUID().split('-')[0]}`; } diff --git a/scripts/component-loader.js b/scripts/component-loader.js index da400637..2682b302 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -3,6 +3,7 @@ import { config } from './libs.js'; export default class ComponentLoader { constructor(blockName, element) { window.raqnComponents = window.raqnComponents || {}; + console.log('raqnComponents', blockName, element); this.block = element; this.blockName = blockName; this.setBlockPaths(); diff --git a/scripts/init.js b/scripts/init.js index af97f603..beaa3915 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -3,30 +3,28 @@ import { config, debounce } from './libs.js'; export function retriveDataFrom(blocks) { return blocks.map((block) => { - let element = block; - const tagName = element.tagName.toLowerCase(); - let blockName = tagName; + let el = block; + const tagName = el.tagName.toLowerCase(); + let name = tagName; if (!config.elementBlocks.includes(tagName)) { - [blockName] = Array.from(element.classList); + [name] = Array.from(el.classList); } else { - element = document.createElement('div'); - block.append(element); + el = document.createElement('div'); + block.append(el); } return { - blockName, - element, + name, + el, }; }); } -export async function init(element = document) { - let blocks = Array.from( - element.querySelectorAll('[class]:not([class^=raqn]'), - ); +export async function init(node = document) { + let blocks = Array.from(node.querySelectorAll('[class]:not([class^=raqn]')); - if (element === document) { - const header = element.querySelector('header'); - const footer = element.querySelector('footer'); + if (node === document) { + const header = node.querySelector('header'); + const footer = node.querySelector('footer'); blocks = [header, ...blocks, footer]; } @@ -34,15 +32,15 @@ export async function init(element = document) { const prio = data.slice(0, 2); const rest = data.slice(2); Promise.all( - prio.map(({ blockName, el }) => { - const loader = new ComponentLoader(blockName, el); + prio.map(({ name, el }) => { + const loader = new ComponentLoader(name, el); return loader.decorate(); }), ); setTimeout(() => { Promise.all( - rest.map(({ blockName, el }) => { - const loader = new ComponentLoader(blockName, el); + rest.map(({ name, el }) => { + const loader = new ComponentLoader(name, el); return loader.decorate(); }), ); From 74e07b8ad557d319d5ae7fd244dd71904454a750 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Thu, 28 Dec 2023 16:39:14 +0100 Subject: [PATCH 09/59] reviewing lcp --- scripts/component-loader.js | 120 ++++++++++++++++++++---------------- scripts/init.js | 29 +++++++-- 2 files changed, 93 insertions(+), 56 deletions(-) diff --git a/scripts/component-loader.js b/scripts/component-loader.js index 2682b302..ac0ea085 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -2,13 +2,15 @@ import { config } from './libs.js'; export default class ComponentLoader { constructor(blockName, element) { + console.log('blockName', blockName, element); window.raqnComponents = window.raqnComponents || {}; - console.log('raqnComponents', blockName, element); - this.block = element; this.blockName = blockName; this.setBlockPaths(); - this.setParams(); - this.content = this.block.children; + this.block = element; + if (this.block) { + this.setParams(); + this.content = this.block.children; + } } /** @@ -65,6 +67,8 @@ export default class ComponentLoader { }, {}), ...mediaParams, }; + console.log('params', this.params); + console.log('mediaParams', mediaParams); } /** @@ -77,58 +81,70 @@ export default class ComponentLoader { setBlockPaths() { this.cssPath = `/blocks/${this.blockName}/${this.blockName}.css`; this.jsPath = `/blocks/${this.blockName}/${this.blockName}.js`; + console.log('cssPath', this.cssPath); + console.log('jsPath', this.jsPath); } - async decorate() { - const status = this.block.dataset.blockStatus; - if (status !== 'loading' && status !== 'loaded') { - this.block.dataset.blockStatus = 'loading'; - try { - const cssLoaded = this.loadCSS(this.cssPath); - const decorationComplete = new Promise((resolve) => { - (async () => { - try { - const mod = await import(this.jsPath); - if ( - mod.default && - mod.default.name && - mod.default.name !== 'decorate' - ) { - const { name } = mod.default; - const elementName = `raqn-${name.toLowerCase()}`; - // define the custom element if it doesn't exist - if (!window.raqnComponents[name]) { - const Contructor = mod.default; - customElements.define(elementName, Contructor); - window.raqnComponents[name] = Contructor; - } - const element = document.createElement(elementName); - element.append(...this.block.children); - Object.keys(this.params).forEach((key) => { - // @TODO sanitize - const value = Array.isArray(this.params[key]) - ? this.params[key].join(' ') - : this.params[key]; - element.setAttribute(key, value); - }); - this.block.replaceWith(element); - } else if (mod.default) { - await mod.default(this.block); - } - } catch (error) { - // eslint-disable-next-line no-console - console.log(`failed to load module for ${this.blockName}`, error); + setupElement() { + const elementName = `raqn-${this.blockName.toLowerCase()}`; + const element = document.createElement(elementName); + element.append(...this.block.children); + Object.keys(this.params).forEach((key) => { + // @TODO sanitize + const value = Array.isArray(this.params[key]) + ? this.params[key].join(' ') + : this.params[key]; + element.setAttribute(key, value); + }); + this.block.replaceWith(element); + } + + async loadWebComponent() { + return new Promise((resolve, reject) => { + (async () => { + try { + const mod = await import(this.jsPath); + if ( + mod.default && + mod.default.name && + mod.default.name !== 'decorate' + ) { + const { name } = mod.default; + const elementName = `raqn-${name.toLowerCase()}`; + // define the custom element if it doesn't exist + if (!window.raqnComponents[name]) { + const Contructor = mod.default; + customElements.define(elementName, Contructor); + window.raqnComponents[name] = Contructor; } - resolve(); - })(); - }); + if (this.block) { + this.setupElement(); + } + } else if (mod.default) { + await mod.default(this.block); + } + } catch (error) { + // eslint-disable-next-line no-console + console.log(`failed to load module for ${this.blockName}`, error); + return reject(error); + } + return resolve(); + })(); + }); + } - return await Promise.all([cssLoaded, decorationComplete]); - } catch (error) { - // eslint-disable-next-line no-console - console.log(`failed to load block ${this.blockName}`, error); - } + async decorate() { + if (window.raqnComponents[this.blockName]) { + return this.setupElement(); + } + try { + const cssLoaded = this.loadCSS(this.cssPath); + const decorationComplete = this.loadWebComponent(); + return Promise.all([cssLoaded, decorationComplete]); + } catch (error) { + // eslint-disable-next-line no-console + console.log(`failed to load module for ${this.blockName}`, error); + return Promise.resolve(); } - return Promise.resolve(); } } diff --git a/scripts/init.js b/scripts/init.js index beaa3915..d2af64f0 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -19,6 +19,20 @@ export function retriveDataFrom(blocks) { }); } +function lcpPriority() { + const lcp = document.querySelector('meta[name="lcp"]'); + if (!lcp) { + return window.raqnLCP || []; + } + window.raqnLCP = + window.raqnLCP || + lcp + .getAttribute('content') + .split(',') + .map((name) => ({ name })); + return window.raqnLCP; +} + export async function init(node = document) { let blocks = Array.from(node.querySelectorAll('[class]:not([class^=raqn]')); @@ -29,14 +43,19 @@ export async function init(node = document) { } const data = retriveDataFrom(blocks); + const lcp = window.raqnLCP; const prio = data.slice(0, 2); const rest = data.slice(2); - Promise.all( - prio.map(({ name, el }) => { + Promise.all([ + ...lcp.map(({ name, el }) => { const loader = new ComponentLoader(name, el); return loader.decorate(); }), - ); + ...prio.map(({ name, el }) => { + const loader = new ComponentLoader(name, el); + return loader.decorate(); + }), + ]); setTimeout(() => { Promise.all( rest.map(({ name, el }) => { @@ -53,5 +72,7 @@ export async function init(node = document) { }, 300), ); } - +// mechanism of retrieving lang to be used in the app +document.documentElement.lang = document.documentElement.lang || 'en'; +lcpPriority(); init(); From b1f89212bacf2e13c4ceb471f12d38110ead5916 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 29 Dec 2023 10:26:06 +0100 Subject: [PATCH 10/59] #414986 > improvements and lcp by metadata --- blocks/column/column.js | 1 + scripts/component-loader.js | 19 ++++--------------- scripts/init.js | 12 ++++++++---- scripts/libs.js | 10 ++++++++++ 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/blocks/column/column.js b/blocks/column/column.js index 0c626191..81389e42 100644 --- a/blocks/column/column.js +++ b/blocks/column/column.js @@ -12,6 +12,7 @@ export default class Column extends ComponentBase { calculateGridTemplateColumns() { this.position = parseInt(this.getAttribute('position'), 10); this.size = this.getAttribute('size'); + console.log('calculateGridTemplateColumns', this.position, this.size); if (this.position) { const parent = this.parentElement; const children = Array.from(parent.children); diff --git a/scripts/component-loader.js b/scripts/component-loader.js index ac0ea085..968e7634 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -1,8 +1,7 @@ -import { config } from './libs.js'; +import { getBreakPoint } from './libs.js'; export default class ComponentLoader { constructor(blockName, element) { - console.log('blockName', blockName, element); window.raqnComponents = window.raqnComponents || {}; this.blockName = blockName; this.setBlockPaths(); @@ -36,7 +35,6 @@ export default class ComponentLoader { * Parse extra params from classList */ setParams() { - const breakpoints = Object.keys(config.breakpoints); const mediaParams = {}; this.params = { ...Array.from(this.block.classList) @@ -44,15 +42,10 @@ export default class ComponentLoader { .reduce((acc, c) => { const values = c.split('-'); let key = values.shift(); - if (breakpoints.includes(key)) { - if ( - !matchMedia(`(min-width: ${config.breakpoints[key]}px)`).matches - ) { - return acc; - } + const breakpoints = getBreakPoint(); + if (breakpoints === key) { key = values.shift(); - mediaParams[key] = mediaParams[key] || []; - mediaParams[key].push(values.join('-')); + mediaParams[key] = values.join('-'); return acc; } @@ -67,8 +60,6 @@ export default class ComponentLoader { }, {}), ...mediaParams, }; - console.log('params', this.params); - console.log('mediaParams', mediaParams); } /** @@ -81,8 +72,6 @@ export default class ComponentLoader { setBlockPaths() { this.cssPath = `/blocks/${this.blockName}/${this.blockName}.css`; this.jsPath = `/blocks/${this.blockName}/${this.blockName}.js`; - console.log('cssPath', this.cssPath); - console.log('jsPath', this.jsPath); } setupElement() { diff --git a/scripts/init.js b/scripts/init.js index d2af64f0..ca031dd7 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -1,5 +1,5 @@ import ComponentLoader from './component-loader.js'; -import { config, debounce } from './libs.js'; +import { config, debounce, getBreakPoint } from './libs.js'; export function retriveDataFrom(blocks) { return blocks.map((block) => { @@ -64,12 +64,16 @@ export async function init(node = document) { }), ); }); - + // reload on breakpoint change + window.raqnBreakpoint = getBreakPoint(); window.addEventListener( 'resize', debounce(() => { - window.location.reload(); - }, 300), + // only on width changes + if (window.raqnBreakpoint !== getBreakPoint()) { + window.location.reload(); + } + }, 100), ); } // mechanism of retrieving lang to be used in the app diff --git a/scripts/libs.js b/scripts/libs.js index 9f6bec6b..4695d056 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -9,6 +9,16 @@ export const config = { }, }; +export function getBreakPoint() { + const breakpoints = Object.keys(config.breakpoints); + const currentBreakpoint = breakpoints + .filter( + (bp) => matchMedia(`(min-width: ${config.breakpoints[bp]}px)`).matches, + ) + .pop(); + return currentBreakpoint; +} + export const debounce = (func, wait, immediate) => { let timeout; return (...args) => { From 7e2c0f45fb50982d1b9377d13f756874c1119e27 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 29 Dec 2023 11:01:56 +0100 Subject: [PATCH 11/59] #414986 > improvements and lcp by metadata --- blocks/card/card.js | 3 +++ scripts/component-loader.js | 14 +++++++++++--- scripts/libs.js | 18 +++++++++++------- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/blocks/card/card.js b/blocks/card/card.js index d98ae83a..ebcff782 100644 --- a/blocks/card/card.js +++ b/blocks/card/card.js @@ -10,6 +10,9 @@ export default class Card extends ComponentBase { } setupColumns(columns) { + if (!columns) { + return; + } this.columns = parseInt(columns, 10); this.area = Array.from(Array(parseInt(this.columns, 10))) .map(() => '1fr') diff --git a/scripts/component-loader.js b/scripts/component-loader.js index 968e7634..d476d852 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -1,4 +1,4 @@ -import { getBreakPoint } from './libs.js'; +import { config, getBreakPoint, getBreakPoints } from './libs.js'; export default class ComponentLoader { constructor(blockName, element) { @@ -42,13 +42,21 @@ export default class ComponentLoader { .reduce((acc, c) => { const values = c.split('-'); let key = values.shift(); - const breakpoints = getBreakPoint(); - if (breakpoints === key) { + const breakpoint = getBreakPoint(); + if (breakpoint === key) { key = values.shift(); mediaParams[key] = values.join('-'); return acc; } + console.log(this.block, 'key', key, key, config.breakpoints[key]); + + if (config.breakpoints[key] !== undefined) { + return acc; + } + + console.log(this.block, 'key', key, 'values', values); + if (acc[key] && Array.isArray(acc[key])) { acc[key].push(values.join('-')); } else if (acc[key]) { diff --git a/scripts/libs.js b/scripts/libs.js index 4695d056..2811bd1d 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -9,14 +9,18 @@ export const config = { }, }; -export function getBreakPoint() { +export function getBreakPoints() { + window.raqnBreakpoints = window.raqnBreakpoints || {}; const breakpoints = Object.keys(config.breakpoints); - const currentBreakpoint = breakpoints - .filter( - (bp) => matchMedia(`(min-width: ${config.breakpoints[bp]}px)`).matches, - ) - .pop(); - return currentBreakpoint; + window.raqnBreakpoints = breakpoints.filter( + (bp) => matchMedia(`(min-width: ${config.breakpoints[bp]}px)`).matches, + ); + return window.raqnBreakpoints; +} + +export function getBreakPoint() { + const b = getBreakPoints(); + return b[b.length - 1]; } export const debounce = (func, wait, immediate) => { From 893c745b7d1c254d4c91d9b22d11beafcc599c60 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 29 Dec 2023 11:02:47 +0100 Subject: [PATCH 12/59] #414986 > improvements and lcp by metadata --- scripts/component-loader.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/component-loader.js b/scripts/component-loader.js index d476d852..d5227261 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -49,14 +49,10 @@ export default class ComponentLoader { return acc; } - console.log(this.block, 'key', key, key, config.breakpoints[key]); - if (config.breakpoints[key] !== undefined) { return acc; } - console.log(this.block, 'key', key, 'values', values); - if (acc[key] && Array.isArray(acc[key])) { acc[key].push(values.join('-')); } else if (acc[key]) { From 1d6c8dea4b567973ab65dc4cd5811b0082e2cb68 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 29 Dec 2023 11:12:15 +0100 Subject: [PATCH 13/59] #414986 > improvements and lcp by metadata --- blocks/card/card.js | 7 ++++++- scripts/libs.js | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/blocks/card/card.js b/blocks/card/card.js index ebcff782..cd9b1026 100644 --- a/blocks/card/card.js +++ b/blocks/card/card.js @@ -1,12 +1,17 @@ import ComponentBase from '../../scripts/component-base.js'; +import { eagerImage } from '../../scripts/libs.js'; export default class Card extends ComponentBase { static get observedAttributes() { - return ['columns', 'ratio']; + return ['columns', 'ratio', 'eager']; } connected() { + this.eager = parseInt(this.getAttribute('eager') || 0, 10); this.setupColumns(this.getAttribute('columns')); + if (this.eager) { + eagerImage(this, this.eager); + } } setupColumns(columns) { diff --git a/scripts/libs.js b/scripts/libs.js index 2811bd1d..8ee02448 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -40,3 +40,10 @@ export const debounce = (func, wait, immediate) => { } }; }; + +export const eagerImage = (block, length = 1) => { + const imgs = Array.from(block.querySelectorAll('img')).slice(0, length); + imgs.forEach((img) => { + img.setAttribute('loading', 'eager'); + }); +}; From 981df1fb162a71d266b2759e4129c9b6d09c72d7 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 29 Dec 2023 11:32:44 +0100 Subject: [PATCH 14/59] #414986 > improvements and lcp by metadata --- head.html | 8 ++++---- scripts/init.js | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/head.html b/head.html index 365f65e3..2e8862b8 100644 --- a/head.html +++ b/head.html @@ -1,8 +1,8 @@ - - - + + + - + diff --git a/scripts/init.js b/scripts/init.js index ca031dd7..f939dc0b 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -1,5 +1,5 @@ import ComponentLoader from './component-loader.js'; -import { config, debounce, getBreakPoint } from './libs.js'; +import { config, debounce, eagerImage, getBreakPoint } from './libs.js'; export function retriveDataFrom(blocks) { return blocks.map((block) => { @@ -33,6 +33,8 @@ function lcpPriority() { return window.raqnLCP; } +eagerImage(document, 2); + export async function init(node = document) { let blocks = Array.from(node.querySelectorAll('[class]:not([class^=raqn]')); From 5e8000cbed34f6d38fbd225e7d786060184bdcbf Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 29 Dec 2023 12:03:31 +0100 Subject: [PATCH 15/59] #414986 > improvements and lcp by metadata --- blocks/header/header.css | 1 - blocks/header/header.js | 7 +++++++ blocks/navigation/navigation.css | 4 ++-- blocks/navigation/navigation.js | 6 ++++++ scripts/component-loader.js | 2 +- scripts/libs.js | 1 + styles/styles.css | 2 +- 7 files changed, 18 insertions(+), 5 deletions(-) diff --git a/blocks/header/header.css b/blocks/header/header.css index ef55e713..e2dd2b97 100644 --- a/blocks/header/header.css +++ b/blocks/header/header.css @@ -1,4 +1,3 @@ raqn-header { - margin: var(--scope-margin, 20px); max-width: var(--scope-max-width, 100%); } diff --git a/blocks/header/header.js b/blocks/header/header.js index 222c113f..3dae874f 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -1,5 +1,12 @@ import ComponentBase from '../../scripts/component-base.js'; +import { eagerImage } from '../../scripts/libs.js'; export default class Header extends ComponentBase { external = '/header.plain.html'; + + async processExternal(response) { + await super.processExternal(response); + console.log(this); + eagerImage(this, 1); + } } diff --git a/blocks/navigation/navigation.css b/blocks/navigation/navigation.css index 46f6c23a..4336a592 100644 --- a/blocks/navigation/navigation.css +++ b/blocks/navigation/navigation.css @@ -21,7 +21,7 @@ raqn-navigation ul li a { transition: background-color 0.2s ease-in-out; } -raqn-navigation ul ul { +raqn-navigation div > div > ul > li > ul { display: none; position: absolute; top: 100%; @@ -32,6 +32,6 @@ raqn-navigation ul ul { box-shadow: var(--box-shadow); } -raqn-navigation ul li:hover > ul { +raqn-navigation div > div > ul > li:hover > ul { display: block; } diff --git a/blocks/navigation/navigation.js b/blocks/navigation/navigation.js index 48168b50..ff065c2a 100644 --- a/blocks/navigation/navigation.js +++ b/blocks/navigation/navigation.js @@ -1,6 +1,12 @@ import Column from '../column/column.js'; export default class Navigation extends Column { + constructor() { + super(); + this.compact = this.getAttribute('compact') || false; + this.icon = this.getAttribute('icon') || 'menu'; + console.log('Navigation', this.compact, this.icon); + } connected() { super.connected(); } diff --git a/scripts/component-loader.js b/scripts/component-loader.js index d5227261..22c40390 100644 --- a/scripts/component-loader.js +++ b/scripts/component-loader.js @@ -1,4 +1,4 @@ -import { config, getBreakPoint, getBreakPoints } from './libs.js'; +import { config, getBreakPoint } from './libs.js'; export default class ComponentLoader { constructor(blockName, element) { diff --git a/scripts/libs.js b/scripts/libs.js index 8ee02448..1061b18a 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -42,6 +42,7 @@ export const debounce = (func, wait, immediate) => { }; export const eagerImage = (block, length = 1) => { + console.log(block, block.querySelectorAll('img')); const imgs = Array.from(block.querySelectorAll('img')).slice(0, length); imgs.forEach((img) => { img.setAttribute('loading', 'eager'); diff --git a/styles/styles.css b/styles/styles.css index 2d3abec9..f27ea884 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -43,7 +43,7 @@ img { } header { - height: var(--raqn-header-height, 180px); + min-height: var(--raqn-header-height, 160px); } @keyframes placeholder { From f504526750610d7874d556fa6f54f3c60c31dd5f Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 13:02:09 +0100 Subject: [PATCH 16/59] #414986 > improvements and lcp by metadata --- blocks/navigation/navigation.css | 106 ++++++++++++++++++++++--------- blocks/navigation/navigation.js | 29 +++++++-- blocks/theme/theme.js | 22 ++++--- icons/search.svg | 6 -- scripts/init.js | 8 ++- scripts/libs.js | 6 +- styles/styles.css | 1 + 7 files changed, 124 insertions(+), 54 deletions(-) delete mode 100644 icons/search.svg diff --git a/blocks/navigation/navigation.css b/blocks/navigation/navigation.css index 4336a592..85cb4f84 100644 --- a/blocks/navigation/navigation.css +++ b/blocks/navigation/navigation.css @@ -1,37 +1,85 @@ raqn-navigation { margin: var(--scope-margin); -} + width: 100%; + display: grid; -raqn-navigation ul { - list-style: none; - display: flex; -} + /* mobile */ + & > div div { + ul, + p { + display: none; + } + } -raqn-navigation ul li { - position: relative; -} + div { + display: flex; + } -raqn-navigation ul li a { - display: inline-flex; - align-items: center; - text-decoration: none; - color: var(--scope-color, #000); - padding: var(--padding-vertical, 20px) var(--padding-horizontal, 20px); - border-radius: var(--border-radius); - transition: background-color 0.2s ease-in-out; -} + button { + display: inline-flex; + justify-self: end; + align-items: center; + justify-content: center; + background-color: var(--scope-background, #fff); + color: var(--scope-color, #000); + border: none; + border-radius: var(--border-radius); + padding: var(--padding-vertical, 20px) var(--padding-horizontal, 20px); + transition: background-color 0.2s ease-in-out; + } -raqn-navigation div > div > ul > li > ul { - display: none; - position: absolute; - top: 100%; - left: 0; - background-color: var(--scope-background, #fff); - padding: var(--padding-vertical) var(--padding-horizontal); - border-radius: var(--border-radius); - box-shadow: var(--box-shadow); -} + /* desktop */ + &:not([compact='true']) > div > div { + ul { + list-style: none; + display: flex; + } + + & > p { + display: inline-flex; + } + + ul li { + position: relative; + } + + ul li a { + display: inline-flex; + align-items: center; + text-decoration: none; + color: var(--scope-color, #000); + padding: var(--padding-vertical, 20px) var(--padding-horizontal, 20px); + border-radius: var(--border-radius); + transition: background-color 0.2s ease-in-out; + } + + ul > li > ul { + display: block; + padding: 0; + } + + ul > li > ul { + /* display: none; */ + position: absolute; + top: 100%; + left: 0; + background-color: var(--scope-background, #fff); + padding: var(--padding-vertical) var(--padding-horizontal); + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + } + + ul > li > ul::after { + /* display: none; */ + content: ' '; + position: absolute; + height: 100%; + width: 100vw; + inset-inline-start: 0; + } -raqn-navigation div > div > ul > li:hover > ul { - display: block; + ul > li:hover > ul { + display: block; + } + } } diff --git a/blocks/navigation/navigation.js b/blocks/navigation/navigation.js index ff065c2a..d397c75a 100644 --- a/blocks/navigation/navigation.js +++ b/blocks/navigation/navigation.js @@ -1,13 +1,28 @@ import Column from '../column/column.js'; export default class Navigation extends Column { - constructor() { - super(); - this.compact = this.getAttribute('compact') || false; - this.icon = this.getAttribute('icon') || 'menu'; - console.log('Navigation', this.compact, this.icon); + createButton() { + const button = document.createElement('button'); + button.setAttribute('aria-label', 'Menu'); + button.setAttribute('aria-expanded', 'false'); + button.setAttribute('aria-controls', 'navigation'); + button.setAttribute('aria-haspopup', 'true'); + button.setAttribute('type', 'button'); + button.setAttribute('tabindex', '0'); + button.innerHTML = ``; + button.addEventListener('click', () => { + this.classList.toggle('active'); + button.setAttribute('aria-expanded', this.classList.contains('active')); + }); + return button; } - connected() { - super.connected(); + + render() { + this.compact = this.getAttribute('compact') === 'true' || false; + this.icon = this.getAttribute('icon') || 'menu'; + console.log('render', this.compact, this.getAttribute('compact')); + if (this.compact) { + this.appendChild(this.createButton()); + } } } diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index 126d3bba..2b7e09a4 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -25,6 +25,18 @@ export default class Theme extends ComponentBase { this.headingVariables = ['font-size', 'font-weight', 'font-family']; } + fontTagsTemplate(item, keys) { + return `${item['font-tag']} {${keys + .map((key) => { + if (this.headingVariables.includes(key) && item[key]) { + return ` + ${key}: var(--scope-${key},${item[key]});`; + } + return ''; + }) + .join('')}}\n`; + } + createVariables() { const { data } = this.themeJson; const keys = Object.keys(data[0]).filter((key) => @@ -33,15 +45,7 @@ export default class Theme extends ComponentBase { this.tags = data .map((item) => { if (item['font-tag']) { - return `${item['font-tag']} {${keys - .map((key) => { - if (this.headingVariables.includes(key) && item[key]) { - return ` - ${key}: var(--scope-${key},${item[key]});`; - } - return ''; - }) - .join('')}}\n`; + return this.fontTagsTemplate(item, keys); } return ''; }) diff --git a/icons/search.svg b/icons/search.svg deleted file mode 100644 index 637c677b..00000000 --- a/icons/search.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/scripts/init.js b/scripts/init.js index f939dc0b..022a3450 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -20,6 +20,12 @@ export function retriveDataFrom(blocks) { } function lcpPriority() { + const eagerImages = document.querySelector('meta[name="lcp"]'); + if (eagerImages) { + const length = parseInt(eagerImages.getAttribute('content'), 10); + eagerImage(document, length); + } + const lcp = document.querySelector('meta[name="lcp"]'); if (!lcp) { return window.raqnLCP || []; @@ -33,8 +39,6 @@ function lcpPriority() { return window.raqnLCP; } -eagerImage(document, 2); - export async function init(node = document) { let blocks = Array.from(node.querySelectorAll('[class]:not([class^=raqn]')); diff --git a/scripts/libs.js b/scripts/libs.js index 1061b18a..8f6c936c 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -7,6 +7,11 @@ export const config = { xl: 1280, xxl: 1920, }, + fontWeights: { + regular: 400, + medium: 500, + bold: 700, + }, }; export function getBreakPoints() { @@ -42,7 +47,6 @@ export const debounce = (func, wait, immediate) => { }; export const eagerImage = (block, length = 1) => { - console.log(block, block.querySelectorAll('img')); const imgs = Array.from(block.querySelectorAll('img')).slice(0, length); imgs.forEach((img) => { img.setAttribute('loading', 'eager'); diff --git a/styles/styles.css b/styles/styles.css index f27ea884..7836260e 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -17,6 +17,7 @@ body { main > * { max-width: var(--scope-max-width, 100%); margin: 0 auto; + font-family: custom; } a { From 1e618b9353c18197f17b9ce9838e19969b5dfddf Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 15:55:46 +0100 Subject: [PATCH 17/59] Documentation and resoning --- blocks/button/button.css | 25 ++++++----- blocks/button/button.js | 6 +-- blocks/column/column.css | 4 +- blocks/column/column.js | 5 ++- blocks/navigation/navigation.css | 59 ++++++++++++++++++-------- docs/assets/doc-example.png | Bin 0 -> 119041 bytes docs/readme.md | 69 +++++++++++++++++++++++++++++++ scripts/libs.js | 1 + styles/styles.css | 21 +++++++++- 9 files changed, 155 insertions(+), 35 deletions(-) create mode 100644 docs/assets/doc-example.png create mode 100644 docs/readme.md diff --git a/blocks/button/button.css b/blocks/button/button.css index 78426ff9..b07cd814 100644 --- a/blocks/button/button.css +++ b/blocks/button/button.css @@ -1,27 +1,32 @@ raqn-button { + width: 100%; + display: grid; + + & > div { background-color: var(--scope-background, #000); color: var(--scope-color, #fff); text-transform: none; border-radius: 20px; border: 1px solid transparent; overflow: hidden; -} -raqn-button:hover { - background-color: var(--scope-background-hover, #000); - color: var(--scope-color-hover, #fff); - border-color: currentcolor; + &:hover { + background-color: var(--scope-background-hover, #000); + color: var(--scope-color-hover, #fff); + border-color: currentcolor; + } + } } raqn-button a { - color: currentcolor; - padding: 10px 20px; - text-decoration: none; + color: currentcolor; + padding: 10px 20px; + text-decoration: none; } raqn-button a:hover, raqn-button a:visited, raqn-button a:active { - color: currentcolor; - text-decoration: none; + color: currentcolor; + text-decoration: none; } diff --git a/blocks/button/button.js b/blocks/button/button.js index c701c666..227717d3 100644 --- a/blocks/button/button.js +++ b/blocks/button/button.js @@ -1,7 +1,7 @@ -import ComponentBase from '../../scripts/component-base.js'; +import Column from '../column/column.js'; -export default class Button extends ComponentBase { - connected() { +export default class Button extends Column { + render() { this.setAttribute('role', 'button'); this.setAttribute('tabindex', '0'); } diff --git a/blocks/column/column.css b/blocks/column/column.css index fd64b23b..1879b40e 100644 --- a/blocks/column/column.css +++ b/blocks/column/column.css @@ -1,3 +1,3 @@ -raqn-columns { - display: flex; +raqn-column { + margin: var(--scope-margin, 0); } diff --git a/blocks/column/column.js b/blocks/column/column.js index 81389e42..71fe8f81 100644 --- a/blocks/column/column.js +++ b/blocks/column/column.js @@ -12,7 +12,10 @@ export default class Column extends ComponentBase { calculateGridTemplateColumns() { this.position = parseInt(this.getAttribute('position'), 10); this.size = this.getAttribute('size'); - console.log('calculateGridTemplateColumns', this.position, this.size); + this.justify = this.getAttribute('justify') || 'stretch'; + if (this.justify) { + this.style.justifyContent = this.justify; + } if (this.position) { const parent = this.parentElement; const children = Array.from(parent.children); diff --git a/blocks/navigation/navigation.css b/blocks/navigation/navigation.css index 85cb4f84..e7db897c 100644 --- a/blocks/navigation/navigation.css +++ b/blocks/navigation/navigation.css @@ -2,6 +2,7 @@ raqn-navigation { margin: var(--scope-margin); width: 100%; display: grid; + justify-content: center; /* mobile */ & > div div { @@ -11,6 +12,15 @@ raqn-navigation { } } + ul li a { + display: inline-flex; + align-items: center; + text-decoration: none; + color: var(--scope-color, #000); + border-radius: var(--border-radius); + transition: background-color 0.2s ease-in-out; + } + div { display: flex; } @@ -24,10 +34,35 @@ raqn-navigation { color: var(--scope-color, #000); border: none; border-radius: var(--border-radius); - padding: var(--padding-vertical, 20px) var(--padding-horizontal, 20px); + padding: var(--padding-vertical, 10px) var(--padding-horizontal, 10px); transition: background-color 0.2s ease-in-out; } + &.active { + button { + background-color: var(--scope-background-hover, #000); + color: var(--scope-color-hover, #fff); + } + + & > div > div > ul { + position: fixed; + display: block; + list-style: none; + max-width: 0; + background-color: var(--scope-background, #fff); + min-width: var(--scope-max-width, 100%); + inset-inline-start: calc((100vw - var(--scope-max-width)) / 2); + inset-block-start: var(--scope-header-height, 64px); + min-height: 100%; + margin: 0 auto; + padding: 0; + + li { + padding-block: 1.2em; + } + } + } + /* desktop */ &:not([compact='true']) > div > div { ul { @@ -44,22 +79,12 @@ raqn-navigation { } ul li a { - display: inline-flex; - align-items: center; - text-decoration: none; - color: var(--scope-color, #000); padding: var(--padding-vertical, 20px) var(--padding-horizontal, 20px); - border-radius: var(--border-radius); - transition: background-color 0.2s ease-in-out; } - ul > li > ul { - display: block; + & > ul > li > ul { + display: none; padding: 0; - } - - ul > li > ul { - /* display: none; */ position: absolute; top: 100%; left: 0; @@ -69,6 +94,10 @@ raqn-navigation { box-shadow: var(--box-shadow); } + & > ul > li:hover > ul { + display: block; + } + ul > li > ul::after { /* display: none; */ content: ' '; @@ -77,9 +106,5 @@ raqn-navigation { width: 100vw; inset-inline-start: 0; } - - ul > li:hover > ul { - display: block; - } } } diff --git a/docs/assets/doc-example.png b/docs/assets/doc-example.png new file mode 100644 index 0000000000000000000000000000000000000000..95b8b2e56c4d687124a74962c7525ec85df557a7 GIT binary patch literal 119041 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�vV^pJway~QIQC}EyH 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 literal 0 HcmV?d00001 diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 00000000..29241feb --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,69 @@ +# Edge Delivery + +To introduce we're going to breafly talk about the current Edge Delivery Boilerplate / Out of the box (OOB) ways of doing and reasoning what we improve + +## Advantages + +- Simple document based authoring +- Fast server side delivery + +## Simple Document based authoring + +This simply resume into 2 things + +1 - docs into HTML +2 - Excel / spreadsheets into JSON + +### Docs into HTML + +A simple doc file with a Example text will be rendered into something like + +``` + + + + Name of the document + + + + + + + + + + + + + + +

+
+ +
+
+ + +``` + +That way we have a clean simple way to generate HTML and JSON based on documents and document trees + +With some OOB exceptions are also included like + +Spreadsheets metadata that +metadata.xls + +Requirements + +- Clientside Hidratation dom transformation "decoration" +- Manual focus on FCP and LCP +- blocking resources before render + +Boiler plate approach +1 - Performance +2 - Decoration by feature +3 - Manualy defining priority +4 - Eager and defered +5 - Semantical content used as component functional content (metadata) diff --git a/scripts/libs.js b/scripts/libs.js index 8f6c936c..522262d4 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -7,6 +7,7 @@ export const config = { xl: 1280, xxl: 1920, }, + joinParams: ['class'], fontWeights: { regular: 400, medium: 500, diff --git a/styles/styles.css b/styles/styles.css index 7836260e..08661815 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -1,10 +1,16 @@ @font-face { - font-family: roboto-fallback; + font-family: roboto-regular; size-adjust: 100.06%; ascent-override: 95%; src: local('Arial'); } +@media screen and (max-width: 768px) { + body { + --scope-max-width: 100vw; + } +} + body { display: none; background-color: var(--scope-background, #fff); @@ -12,6 +18,12 @@ body { padding: 0; margin: 0; width: 100%; + + --scope-header-height: 64px; + + @media screen and (min-width: 768px) { + --scope-header-height: 160px; + } } main > * { @@ -44,7 +56,12 @@ img { } header { - min-height: var(--raqn-header-height, 160px); + min-height: var(--scope-header-height, 64px); +} + +.hide { + display: none; + pointer-events: none; } @keyframes placeholder { From ca59b834c3516891b42e040fd8a0679411fcb741 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 15:59:07 +0100 Subject: [PATCH 18/59] Documentation and resoning --- docs/readme.md | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 29241feb..3f638bdf 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -14,7 +14,7 @@ This simply resume into 2 things 1 - docs into HTML 2 - Excel / spreadsheets into JSON -### Docs into HTML +### Docs into HTML - Server side render A simple doc file with a Example text will be rendered into something like @@ -48,6 +48,51 @@ A simple doc file with a Example text will be rendered into something like ``` +It renders the Docs into HTML like the example: + +Here's a example document +![Example doc](assets/doc-example.png) + +This will be transform into this apart from the HTML exampled above: + +``` +
+

Normal text

+

Title

+

Sub title

+

Heading 2 asdkjasdlkja asldkaslkdjasdlkasjd alksdj alksd aslk

+

Heading 3

+

Heading 4

+
Heading 5
+
Heading 6
+
+
+
Table row 1 col 1
+
Table row 1 col 2
+
Table row 1 col3
+
+
+
Table row 2 col 1
+
Table row 2 col 2-3
+
+
+

This is a link example

+
+``` + +So we can resume the server side render into this simple rules: + +1 - Title formating are H1 +2 - Sub title formating are h3 +3 - All other headings follows the proper name - element correlation +4 - All headings will be attached a ID based on it's content +5 - Tables will render one and only header as a classname, lowercase dash separated +6 - Tables rows will create one div per column +7 - Tables will be only rendered as when inside another table +8 - You can wrapp a div by adding a --- into the document +9 - Breaklines are

+10 - Links most of the time, are wrapped into

tags then a + That way we have a clean simple way to generate HTML and JSON based on documents and document trees With some OOB exceptions are also included like From df8787d12a7b687e8a1d837b52ccc06274f37478 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 15:59:34 +0100 Subject: [PATCH 19/59] Documentation and resoning --- docs/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 3f638bdf..9c8d3b8d 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -51,7 +51,7 @@ A simple doc file with a Example text will be rendered into something like It renders the Docs into HTML like the example: Here's a example document -![Example doc](assets/doc-example.png) +![Example doc](docs/assets/doc-example.png) This will be transform into this apart from the HTML exampled above: From 4b01410c2da82394d733af82ea7908ea176f9b69 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:00:37 +0100 Subject: [PATCH 20/59] Documentation and resoning --- docs/readme.md | 88 +++++++++++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 36 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index 9c8d3b8d..4ec36db9 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -18,23 +18,33 @@ This simply resume into 2 things A simple doc file with a Example text will be rendered into something like -``` - +```html + - Name of the document - - - - - - - - - + Name of the document + + + + + + + + + - +

@@ -55,29 +65,35 @@ Here's a example document This will be transform into this apart from the HTML exampled above: -``` - +```html +
+

Normal text

+

Title

+

Sub title

+

+ Heading 2 asdkjasdlkja asldkaslkdjasdlkasjd alksdj alksd aslk +

+

Heading 3

+

Heading 4

+
Heading 5
+
Heading 6
+
+
+
Table row 1 col 1
+
Table row 1 col 2
+
Table row 1 col3
+
+
+
Table row 2 col 1
+
Table row 2 col 2-3
+
+
+

+ This is a link example +

+
``` So we can resume the server side render into this simple rules: From 89257182e03b8681967ffa570c101ee65e9e29ea Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:01:02 +0100 Subject: [PATCH 21/59] Documentation and resoning --- docs/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 4ec36db9..a949c4d2 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -61,7 +61,7 @@ A simple doc file with a Example text will be rendered into something like It renders the Docs into HTML like the example: Here's a example document -![Example doc](docs/assets/doc-example.png) +[Example doc](docs/assets/doc-example.png) This will be transform into this apart from the HTML exampled above: From 6e28a124d2402f5cadadece9f4c27a1008573917 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:01:43 +0100 Subject: [PATCH 22/59] Documentation and resoning --- docs/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index a949c4d2..4ec36db9 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -61,7 +61,7 @@ A simple doc file with a Example text will be rendered into something like It renders the Docs into HTML like the example: Here's a example document -[Example doc](docs/assets/doc-example.png) +![Example doc](docs/assets/doc-example.png) This will be transform into this apart from the HTML exampled above: From 1ff4658603a71ca27220e00400056a2d0fee6a4a Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:01:59 +0100 Subject: [PATCH 23/59] Documentation and resoning --- docs/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 4ec36db9..120a8da4 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -61,7 +61,7 @@ A simple doc file with a Example text will be rendered into something like It renders the Docs into HTML like the example: Here's a example document -![Example doc](docs/assets/doc-example.png) +![Example doc](assets/doc-example.png) This will be transform into this apart from the HTML exampled above: From 6aae98ed969c070f89106dae2a2b80fdb7e93280 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:04:30 +0100 Subject: [PATCH 24/59] Documentation and resoning --- docs/assets/doc-example.png | Bin 119041 -> 117708 bytes docs/readme.md | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/assets/doc-example.png b/docs/assets/doc-example.png index 95b8b2e56c4d687124a74962c7525ec85df557a7..b71b6863fef873d6049139e03df4ccd7741be98a 100644 GIT binary patch literal 117708 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 literal 119041 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�vV^pJway~QIQC}EyH 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 diff --git a/docs/readme.md b/docs/readme.md index 120a8da4..c9184d70 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -70,8 +70,8 @@ This will be transform into this apart from the HTML exampled above:

Normal text

Title

Sub title

-

- Heading 2 asdkjasdlkja asldkaslkdjasdlkasjd alksdj alksd aslk +

+ Heading 2 more content to example

Heading 3

Heading 4

@@ -101,7 +101,7 @@ So we can resume the server side render into this simple rules: 1 - Title formating are H1 2 - Sub title formating are h3 3 - All other headings follows the proper name - element correlation -4 - All headings will be attached a ID based on it's content +4 - All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) 5 - Tables will render one and only header as a classname, lowercase dash separated 6 - Tables rows will create one div per column 7 - Tables will be only rendered as
when inside another table From b496bc41e6ec6e6c688869e90275af32f8e64ba3 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:11:12 +0100 Subject: [PATCH 25/59] Documentation and resoning --- docs/readme.md | 56 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index c9184d70..7cd18d7e 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -14,33 +14,40 @@ This simply resume into 2 things 1 - docs into HTML 2 - Excel / spreadsheets into JSON +That way we have a clean simple way to generate HTML and JSON based on documents and document trees + ### Docs into HTML - Server side render A simple doc file with a Example text will be rendered into something like -```html +```HTML Name of the document + href="https://main--henkel-raqn-guide--hlxsites.hlx.page/untitled-document" + /> + content="https://main--henkel-raqn-guide--hlxsites.hlx.page/untitled-document" + /> + content="https://main--henkel-raqn-guide--hlxsites.hlx.page/default-meta-image.png?width=1200&format=pjpg&optimize=medium" + /> + content="https://main--henkel-raqn-guide--hlxsites.hlx.page/default-meta-image.png?width=1200&format=pjpg&optimize=medium" + /> + content="https://main--henkel-raqn-guide--hlxsites.hlx.page/default-meta-image.png?width=1200&format=pjpg&optimize=medium" + /> @@ -65,7 +72,7 @@ Here's a example document This will be transform into this apart from the HTML exampled above: -```html +```HTML

Normal text

Title

@@ -89,9 +96,7 @@ This will be transform into this apart from the HTML exampled above:

- This is a link example + This is a link example

``` @@ -109,7 +114,36 @@ So we can resume the server side render into this simple rules: 9 - Breaklines are

10 - Links most of the time, are wrapped into

tags then a -That way we have a clean simple way to generate HTML and JSON based on documents and document trees +### SpreadSheets into JSON + +It also render any SpreadSheets into a simple JSON format +![Sheet example](assets/sheet-example.png) + +```json +{ + "total": 3, + "offset": 0, + "limit": 3, + "data": [ + { + "propertyName1": "value 2A", + "propertyName2": "value 2B", + "propertyName3": "value 2C" + }, + { + "propertyName1": "value 3A", + "propertyName2": "value 3B", + "propertyName3": "value 3C" + }, + { + "propertyName1": "value 4A", + "propertyName2": "", + "propertyName3": "value 4C" + } + ], + ":type": "sheet" +} +``` With some OOB exceptions are also included like From b91c6a9e0d65fadc7114960827bdf99ec1c5b168 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:11:49 +0100 Subject: [PATCH 26/59] Documentation and resoning --- docs/assets/sheet-example.png | Bin 0 -> 43140 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/sheet-example.png diff --git a/docs/assets/sheet-example.png b/docs/assets/sheet-example.png new file mode 100644 index 0000000000000000000000000000000000000000..93ca0e0f52061f00ccbb65543a70d2e30ca4a592 GIT binary patch literal 43140 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 +VQ6g8J4l_>h(LGCW=s~iMl?6mrHkoQ04XeMW2 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 literal 0 HcmV?d00001 From 1dd74661fc90a255c1a4d5d0f0878d3d8c9dc136 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:12:45 +0100 Subject: [PATCH 27/59] Documentation and resoning --- docs/readme.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index 7cd18d7e..52fd428e 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -11,8 +11,8 @@ To introduce we're going to breafly talk about the current Edge Delivery Boilerp This simply resume into 2 things -1 - docs into HTML -2 - Excel / spreadsheets into JSON +- docs into HTML +- Excel / spreadsheets into JSON That way we have a clean simple way to generate HTML and JSON based on documents and document trees @@ -103,16 +103,16 @@ This will be transform into this apart from the HTML exampled above: So we can resume the server side render into this simple rules: -1 - Title formating are H1 -2 - Sub title formating are h3 -3 - All other headings follows the proper name - element correlation -4 - All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) -5 - Tables will render one and only header as a classname, lowercase dash separated -6 - Tables rows will create one div per column -7 - Tables will be only rendered as

when inside another table -8 - You can wrapp a div by adding a --- into the document -9 - Breaklines are

-10 - Links most of the time, are wrapped into

tags then a +1- Title formating are H1 +2- Sub title formating are h3 +3- All other headings follows the proper name - element correlation +4- All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) +5- Tables will render one and only header as a classname, lowercase dash separated +6- Tables rows will create one div per column +7- Tables will be only rendered as

when inside another table +8- You can wrapp a div by adding a --- into the document +9- Breaklines are

+10- Links most of the time, are wrapped into

tags then a ### SpreadSheets into JSON From 04069da1e1950ab80d28002c162e384c5871e4e8 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:13:11 +0100 Subject: [PATCH 28/59] Documentation and resoning --- docs/readme.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index 52fd428e..2221c736 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -103,16 +103,16 @@ This will be transform into this apart from the HTML exampled above: So we can resume the server side render into this simple rules: -1- Title formating are H1 -2- Sub title formating are h3 -3- All other headings follows the proper name - element correlation -4- All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) -5- Tables will render one and only header as a classname, lowercase dash separated -6- Tables rows will create one div per column -7- Tables will be only rendered as

when inside another table -8- You can wrapp a div by adding a --- into the document -9- Breaklines are

-10- Links most of the time, are wrapped into

tags then a +1 - Title formating are H1 +2 - Sub title formating are h3 +3 - All other headings follows the proper name - element correlation +4 - All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) +5 - Tables will render one and only header as a classname, lowercase dash separated +6 - Tables rows will create one div per column +7 - Tables will be only rendered as

when inside another table +8 - You can wrapp a div by adding a --- into the document +9 - Breaklines are

+10 - Links most of the time, are wrapped into

tags then a ### SpreadSheets into JSON From 2b0b58a2eeb202adaa0675f70c02900c4edd704e Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:14:37 +0100 Subject: [PATCH 29/59] Documentation and resoning --- docs/readme.md | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index 2221c736..bb337e1f 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -103,16 +103,16 @@ This will be transform into this apart from the HTML exampled above: So we can resume the server side render into this simple rules: -1 - Title formating are H1 -2 - Sub title formating are h3 -3 - All other headings follows the proper name - element correlation -4 - All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) -5 - Tables will render one and only header as a classname, lowercase dash separated -6 - Tables rows will create one div per column -7 - Tables will be only rendered as

when inside another table -8 - You can wrapp a div by adding a --- into the document -9 - Breaklines are

-10 - Links most of the time, are wrapped into

tags then a +1. Title formating are H1 +2. Sub title formating are h3 +3. All other headings follows the proper name - element correlation +4. All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) +5. Tables will render one and only header as a classname, lowercase dash separated +6. Tables rows will create one div per column +7. Tables will be only rendered as

when inside another table +8. You can wrapp a div by adding a --- into the document +9. Breaklines are

+10. Links most of the time, are wrapped into

tags then a ### SpreadSheets into JSON @@ -157,8 +157,9 @@ Requirements - blocking resources before render Boiler plate approach -1 - Performance -2 - Decoration by feature -3 - Manualy defining priority -4 - Eager and defered -5 - Semantical content used as component functional content (metadata) + +1. Performance +2. Decoration by feature +3. Manualy defining priority +4. Eager and defered +5. Semantical content used as component functional content (metadata) From 97cfa5d092f5044e5dbfebf02ed226c2b43734df Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:15:36 +0100 Subject: [PATCH 30/59] Documentation and resoning --- docs/readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index bb337e1f..c73a35d4 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -109,10 +109,10 @@ So we can resume the server side render into this simple rules: 4. All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) 5. Tables will render one and only header as a classname, lowercase dash separated 6. Tables rows will create one div per column -7. Tables will be only rendered as

when inside another table -8. You can wrapp a div by adding a --- into the document -9. Breaklines are

-10. Links most of the time, are wrapped into

tags then a +7. Tables will be only rendered as `

` when inside another table +8. You can wrapp a div by adding a `---` into the document +9. Breaklines are `

` +10. Links most of the time, are wrapped into `

` tags then a `` ### SpreadSheets into JSON From 0dd6d1c48b9910cf44af786f6b3ac2d4bf0d90ac Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 16:16:25 +0100 Subject: [PATCH 31/59] Documentation and resoning --- docs/readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/readme.md b/docs/readme.md index c73a35d4..ab650181 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -114,6 +114,8 @@ So we can resume the server side render into this simple rules: 9. Breaklines are `

` 10. Links most of the time, are wrapped into `

` tags then a `` +those are briefly the main examples + ### SpreadSheets into JSON It also render any SpreadSheets into a simple JSON format From ac39bc496c313bc53c0c9a82a2ee18325f07f605 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 17:05:44 +0100 Subject: [PATCH 32/59] Documentation and resoning --- docs/readme.md | 176 ++++--------------------------------------------- 1 file changed, 12 insertions(+), 164 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index ab650181..a1336eb9 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1,167 +1,15 @@ -# Edge Delivery +# RAQN - Edge Delivery -To introduce we're going to breafly talk about the current Edge Delivery Boilerplate / Out of the box (OOB) ways of doing and reasoning what we improve +This project is a RAQN option for using edge deliver. -## Advantages +Summary -- Simple document based authoring -- Fast server side delivery - -## Simple Document based authoring - -This simply resume into 2 things - -- docs into HTML -- Excel / spreadsheets into JSON - -That way we have a clean simple way to generate HTML and JSON based on documents and document trees - -### Docs into HTML - Server side render - -A simple doc file with a Example text will be rendered into something like - -```HTML - - - - Name of the document - - - - - - - - - - - - - - -

-
- -
-
- - -``` - -It renders the Docs into HTML like the example: - -Here's a example document -![Example doc](assets/doc-example.png) - -This will be transform into this apart from the HTML exampled above: - -```HTML -
-``` - -So we can resume the server side render into this simple rules: - -1. Title formating are H1 -2. Sub title formating are h3 -3. All other headings follows the proper name - element correlation -4. All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) -5. Tables will render one and only header as a classname, lowercase dash separated -6. Tables rows will create one div per column -7. Tables will be only rendered as `
` when inside another table -8. You can wrapp a div by adding a `---` into the document -9. Breaklines are `

` -10. Links most of the time, are wrapped into `

` tags then a `` - -those are briefly the main examples - -### SpreadSheets into JSON - -It also render any SpreadSheets into a simple JSON format -![Sheet example](assets/sheet-example.png) - -```json -{ - "total": 3, - "offset": 0, - "limit": 3, - "data": [ - { - "propertyName1": "value 2A", - "propertyName2": "value 2B", - "propertyName3": "value 2C" - }, - { - "propertyName1": "value 3A", - "propertyName2": "value 3B", - "propertyName3": "value 3C" - }, - { - "propertyName1": "value 4A", - "propertyName2": "", - "propertyName3": "value 4C" - } - ], - ":type": "sheet" -} -``` - -With some OOB exceptions are also included like - -Spreadsheets metadata that -metadata.xls - -Requirements - -- Clientside Hidratation dom transformation "decoration" -- Manual focus on FCP and LCP -- blocking resources before render - -Boiler plate approach - -1. Performance -2. Decoration by feature -3. Manualy defining priority -4. Eager and defered -5. Semantical content used as component functional content (metadata) +1. Introduction + 1. Introdution to Edge Delivery Services + 2. [EDS - Server rendering](edge/server.md) + 3. [EDS - Client side features](edge/client.md) +2. RAQN EDS + 1. Reasoning + 2. Component loader + 3. Custom elements + 4. Defining Priority Components From 5b2e9298a0fa9cb79b5eb586ff1ae7147c8d34c3 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 17:06:11 +0100 Subject: [PATCH 33/59] Documentation and resoning --- docs/edge/client.md | 15 +++++++++++++++ docs/edge/server.md | 0 2 files changed, 15 insertions(+) create mode 100644 docs/edge/client.md create mode 100644 docs/edge/server.md diff --git a/docs/edge/client.md b/docs/edge/client.md new file mode 100644 index 00000000..b2d3fbd2 --- /dev/null +++ b/docs/edge/client.md @@ -0,0 +1,15 @@ +# Everything else as client side javascript + +Requirements + +- Clientside Hidratation dom transformation "decoration" +- Manual focus on FCP and LCP +- blocking resources before render + +Boiler plate approach + +1. Performance +2. Decoration by feature +3. Manualy defining priority +4. Eager and defered +5. Semantical content used as component functional content (metadata) diff --git a/docs/edge/server.md b/docs/edge/server.md new file mode 100644 index 00000000..e69de29b From 7c123d5831de93146e71c65928c674fa9a5dc77e Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 17:06:31 +0100 Subject: [PATCH 34/59] Documentation and resoning --- docs/edge/server.md | 158 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/docs/edge/server.md b/docs/edge/server.md index e69de29b..4dafe503 100644 --- a/docs/edge/server.md +++ b/docs/edge/server.md @@ -0,0 +1,158 @@ +# Edge Delivery + +To introduce we're going to breafly talk about the current Edge Delivery Boilerplate / Out of the box (OOB) ways of doing and reasoning what we improve + +## Advantages + +- Simple document based authoring +- Fast server side delivery + +## Simple Document based authoring + +This simply resume into 2 things + +- docs into HTML +- Excel / spreadsheets into JSON + +That way we have a clean simple way to generate HTML and JSON based on documents and document trees + +### Docs into HTML - Server side render + +A simple doc file with a Example text will be rendered into something like + +```HTML + + + + Name of the document + + + + + + + + + + + + + + +

+
+ +
+
+ + +``` + +It renders the Docs into HTML like the example: + +Here's a example document +![Example doc](assets/doc-example.png) + +This will be transform into this apart from the HTML exampled above: + +```HTML +
+``` + +So we can resume the server side render into this simple rules: + +1. Title formating are H1 +2. Sub title formating are h3 +3. All other headings follows the proper name - element correlation +4. All headings will be attached a ID based on it's content (example in the "asdkjasdlkja..." content) +5. Tables will render one and only header as a classname, lowercase dash separated +6. Tables rows will create one div per column +7. Tables will be only rendered as `
` when inside another table +8. You can wrapp a div by adding a `---` into the document +9. Breaklines are `

` +10. Links most of the time, are wrapped into `

` tags then a `` + +those are briefly the main examples + +### SpreadSheets into JSON + +It also render any SpreadSheets into a simple JSON format +![Sheet example](assets/sheet-example.png) + +```json +{ + "total": 3, + "offset": 0, + "limit": 3, + "data": [ + { + "propertyName1": "value 2A", + "propertyName2": "value 2B", + "propertyName3": "value 2C" + }, + { + "propertyName1": "value 3A", + "propertyName2": "value 3B", + "propertyName3": "value 3C" + }, + { + "propertyName1": "value 4A", + "propertyName2": "", + "propertyName3": "value 4C" + } + ], + ":type": "sheet" +} +``` + +### OOB exceptions + +### Metadata and robots.txt + +A spreadsheet called `metadata` will actually be rendered as HTML `` +and define robots.txt + +Please see more look into +https://experienceleague.adobe.com/docs/experience-manager-cloud-service/content/edge-delivery/publish/authoring.html?lang=en From b1598b4eded18f2b59cb6e68d2d4030ae1d2c6ae Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 18:49:34 +0100 Subject: [PATCH 35/59] Documentation and resoning --- docs/edge/server.md | 2 +- head.html | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/edge/server.md b/docs/edge/server.md index 4dafe503..67cc04c5 100644 --- a/docs/edge/server.md +++ b/docs/edge/server.md @@ -1,4 +1,4 @@ -# Edge Delivery +# Edge Delivery Server Rendering To introduce we're going to breafly talk about the current Edge Delivery Boilerplate / Out of the box (OOB) ways of doing and reasoning what we improve diff --git a/head.html b/head.html index 2e8862b8..ca74228b 100644 --- a/head.html +++ b/head.html @@ -1,4 +1,7 @@ + + + From 0dd1c43444b0619caf2bcb8d24910178139609f8 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 18:51:38 +0100 Subject: [PATCH 36/59] Documentation and resoning --- scripts/libs.js | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/libs.js b/scripts/libs.js index 522262d4..0ac7cd95 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -51,5 +51,6 @@ export const eagerImage = (block, length = 1) => { const imgs = Array.from(block.querySelectorAll('img')).slice(0, length); imgs.forEach((img) => { img.setAttribute('loading', 'eager'); + document.head.append(``); }); }; From 500e86ee0bf996f2418cd40d540fd5b46a96ef72 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 18:57:05 +0100 Subject: [PATCH 37/59] Documentation and resoning --- head.html | 1 - 1 file changed, 1 deletion(-) diff --git a/head.html b/head.html index ca74228b..13756887 100644 --- a/head.html +++ b/head.html @@ -1,5 +1,4 @@ - From b60d0376d8f2884295fcdd1e581e13622b0f424a Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:14:37 +0100 Subject: [PATCH 38/59] Documentation and resoning --- scripts/libs.js | 4 ++++ styles/styles.css | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/scripts/libs.js b/scripts/libs.js index 0ac7cd95..fdf9cb52 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -50,6 +50,10 @@ export const debounce = (func, wait, immediate) => { export const eagerImage = (block, length = 1) => { const imgs = Array.from(block.querySelectorAll('img')).slice(0, length); imgs.forEach((img) => { + const width = img.getAttribute('width'); + const height = img.getAttribute('height'); + const ratio = Math.floor((width / height) * 10) / 10; + img.style.aspectRatio = ratio; img.setAttribute('loading', 'eager'); document.head.append(``); }); diff --git a/styles/styles.css b/styles/styles.css index 08661815..20df3bc7 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -11,6 +11,10 @@ } } +img { + object-fit: cover; +} + body { display: none; background-color: var(--scope-background, #fff); From 978341b546ef5a0958a99cf6faea3940e4405394 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:17:21 +0100 Subject: [PATCH 39/59] Documentation and resoning --- scripts/libs.js | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/libs.js b/scripts/libs.js index fdf9cb52..135f9499 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -55,6 +55,5 @@ export const eagerImage = (block, length = 1) => { const ratio = Math.floor((width / height) * 10) / 10; img.style.aspectRatio = ratio; img.setAttribute('loading', 'eager'); - document.head.append(``); }); }; From a85233b9b8d3f3d366849dd8ffd200624ae08820 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:18:28 +0100 Subject: [PATCH 40/59] Documentation and resoning --- scripts/libs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/libs.js b/scripts/libs.js index 135f9499..3dc49ec2 100644 --- a/scripts/libs.js +++ b/scripts/libs.js @@ -52,7 +52,7 @@ export const eagerImage = (block, length = 1) => { imgs.forEach((img) => { const width = img.getAttribute('width'); const height = img.getAttribute('height'); - const ratio = Math.floor((width / height) * 10) / 10; + const ratio = Math.floor((width / height) * 100) / 100; img.style.aspectRatio = ratio; img.setAttribute('loading', 'eager'); }); From a1c8c10ef117f457536a3faedf1a1215866592df Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:23:39 +0100 Subject: [PATCH 41/59] Documentation and resoning --- blocks/theme/theme.js | 5 ++++- head.html | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index 2b7e09a4..f21e52f0 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -87,7 +87,10 @@ export default class Theme extends ComponentBase { .join('\n')} ${this.tags}`; - document.body.style.display = 'block'; + + setTimeout(() => { + document.body.style.display = 'block'; + }); } async processExternal(response) { diff --git a/head.html b/head.html index 13756887..a031814d 100644 --- a/head.html +++ b/head.html @@ -1,5 +1,7 @@ + + From d9f8e393c40e15eb8760ac598380f4016af853e6 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:25:27 +0100 Subject: [PATCH 42/59] Documentation and resoning --- head.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/head.html b/head.html index a031814d..95d1b9b2 100644 --- a/head.html +++ b/head.html @@ -1,8 +1,6 @@ - - - + From aad4cf2f1c2aaf0cb2d37cce1c693a2acb748b9a Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:28:22 +0100 Subject: [PATCH 43/59] Documentation and resoning --- head.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/head.html b/head.html index 95d1b9b2..2e8862b8 100644 --- a/head.html +++ b/head.html @@ -1,6 +1,4 @@ - - From 5be526199e7952a60fecbc45b371793c3b68b3f4 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:48:16 +0100 Subject: [PATCH 44/59] Documentation and resoning --- head.html | 2 +- styles/styles.css | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/head.html b/head.html index 2e8862b8..f97c9b4d 100644 --- a/head.html +++ b/head.html @@ -1,8 +1,8 @@ + - diff --git a/styles/styles.css b/styles/styles.css index 20df3bc7..de5b6645 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -12,6 +12,7 @@ } img { + width: 100%; object-fit: cover; } From 6a11b13cd3d97a612b903b1bf6254c9d9b76a1d3 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:52:20 +0100 Subject: [PATCH 45/59] Documentation and resoning --- scripts/init.js | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/scripts/init.js b/scripts/init.js index 022a3450..f884ebb5 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -52,22 +52,15 @@ export async function init(node = document) { const lcp = window.raqnLCP; const prio = data.slice(0, 2); const rest = data.slice(2); - Promise.all([ - ...lcp.map(({ name, el }) => { - const loader = new ComponentLoader(name, el); - return loader.decorate(); - }), - ...prio.map(({ name, el }) => { - const loader = new ComponentLoader(name, el); - return loader.decorate(); - }), - ]); + const start = ({ name, el }) => { + const loader = new ComponentLoader(name, el); + return loader.decorate(); + }; + Promise.all([...lcp.map(({ name, el }) => start({ name, el }))]); setTimeout(() => { Promise.all( - rest.map(({ name, el }) => { - const loader = new ComponentLoader(name, el); - return loader.decorate(); - }), + ...prio.map(({ name, el }) => start({ name, el })), + ...rest.map(({ name, el }) => setTimeout(() => start({ name, el }))), ); }); // reload on breakpoint change From 974794ed6a87319591d4c5622eafe43e9bfd2837 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:54:12 +0100 Subject: [PATCH 46/59] Documentation and resoning --- scripts/init.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/init.js b/scripts/init.js index f884ebb5..21d69862 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -56,10 +56,12 @@ export async function init(node = document) { const loader = new ComponentLoader(name, el); return loader.decorate(); }; - Promise.all([...lcp.map(({ name, el }) => start({ name, el }))]); + Promise.all([ + ...lcp.map(({ name, el }) => start({ name, el })), + ...prio.map(({ name, el }) => start({ name, el })), + ]); setTimeout(() => { Promise.all( - ...prio.map(({ name, el }) => start({ name, el })), ...rest.map(({ name, el }) => setTimeout(() => start({ name, el }))), ); }); From 8c83fcc22d42557885be23739b2af3d2bc14d3c3 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 19:56:59 +0100 Subject: [PATCH 47/59] Documentation and resoning --- head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/head.html b/head.html index f97c9b4d..5db92c68 100644 --- a/head.html +++ b/head.html @@ -1,8 +1,8 @@ + - From 133dc38553dcc72a8171f6ed8a6e478afb85a44a Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 20:02:38 +0100 Subject: [PATCH 48/59] Documentation and resoning --- scripts/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/init.js b/scripts/init.js index 21d69862..d5f1c50f 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -62,7 +62,7 @@ export async function init(node = document) { ]); setTimeout(() => { Promise.all( - ...rest.map(({ name, el }) => setTimeout(() => start({ name, el }))), + rest.map(({ name, el }) => setTimeout(() => start({ name, el }))), ); }); // reload on breakpoint change From bcc2ef78dee292ceae96f62e0af8ea3ba51cb7b0 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 20:04:47 +0100 Subject: [PATCH 49/59] Documentation and resoning --- head.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/head.html b/head.html index 5db92c68..6f07eff5 100644 --- a/head.html +++ b/head.html @@ -1,5 +1,11 @@ + From 643dfb6b62c7e0eac265375199ffdc35a5bd6898 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 20:07:59 +0100 Subject: [PATCH 50/59] Documentation and resoning --- blocks/header/header.js | 2 +- blocks/theme/theme.js | 6 ++---- styles/styles.css | 9 +++++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/blocks/header/header.js b/blocks/header/header.js index 3dae874f..39601b61 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -6,7 +6,7 @@ export default class Header extends ComponentBase { async processExternal(response) { await super.processExternal(response); - console.log(this); + this.parentElement.style.display = 'flex'; eagerImage(this, 1); } } diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index f21e52f0..78d63711 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -87,10 +87,8 @@ export default class Theme extends ComponentBase { .join('\n')} ${this.tags}`; - - setTimeout(() => { - document.body.style.display = 'block'; - }); + console.log(this.variables); + document.body.style.display = 'block'; } async processExternal(response) { diff --git a/styles/styles.css b/styles/styles.css index de5b6645..2d15c637 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -31,6 +31,11 @@ body { } } +header { + display: none; + min-height: var(--scope-header-height, 64px); +} + main > * { max-width: var(--scope-max-width, 100%); margin: 0 auto; @@ -60,10 +65,6 @@ img { height: auto; } -header { - min-height: var(--scope-header-height, 64px); -} - .hide { display: none; pointer-events: none; From d3d8fd09f67c742bd37fad226d24b5a4c7dbebba Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 20:10:40 +0100 Subject: [PATCH 51/59] Documentation and resoning --- blocks/header/header.js | 2 +- blocks/theme/theme.js | 1 - styles/styles.css | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/blocks/header/header.js b/blocks/header/header.js index 39601b61..1539db6c 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -6,7 +6,7 @@ export default class Header extends ComponentBase { async processExternal(response) { await super.processExternal(response); - this.parentElement.style.display = 'flex'; + this.parentElement.style.opacity = 1; eagerImage(this, 1); } } diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index 78d63711..2b7e09a4 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -87,7 +87,6 @@ export default class Theme extends ComponentBase { .join('\n')} ${this.tags}`; - console.log(this.variables); document.body.style.display = 'block'; } diff --git a/styles/styles.css b/styles/styles.css index 2d15c637..d0dbe2c9 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -32,7 +32,7 @@ body { } header { - display: none; + opacity: 0; min-height: var(--scope-header-height, 64px); } From b30ef46a2ead2c388a6f10d33adb3b65ae2689aa Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Tue, 2 Jan 2024 20:12:18 +0100 Subject: [PATCH 52/59] Documentation and resoning --- styles/styles.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/styles/styles.css b/styles/styles.css index d0dbe2c9..73a5d0f8 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -32,8 +32,11 @@ body { } header { - opacity: 0; min-height: var(--scope-header-height, 64px); + + > div { + display: none; + } } main > * { From 68a54caa5497961d6468b647c72974b326d4c787 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Wed, 3 Jan 2024 16:54:28 +0100 Subject: [PATCH 53/59] Documentation and resoning --- blocks/header/header.css | 5 +- blocks/header/header.js | 1 - blocks/hero/hero.css | 45 +++++------------- blocks/hero/hero.js | 12 +++++ blocks/icon/icon.css | 4 -- blocks/navigation/navigation.css | 82 ++++++++++++++++++++++---------- blocks/navigation/navigation.js | 37 +++++++++++++- blocks/theme/theme.js | 3 ++ styles/styles.css | 23 ++++++--- 9 files changed, 137 insertions(+), 75 deletions(-) diff --git a/blocks/header/header.css b/blocks/header/header.css index e2dd2b97..d669bae7 100644 --- a/blocks/header/header.css +++ b/blocks/header/header.css @@ -1,3 +1,6 @@ raqn-header { - max-width: var(--scope-max-width, 100%); + display: grid; + max-width: var(--scope-max-width, 90vw); + margin: 0 auto; + align-items: center; } diff --git a/blocks/header/header.js b/blocks/header/header.js index 1539db6c..5d373996 100644 --- a/blocks/header/header.js +++ b/blocks/header/header.js @@ -6,7 +6,6 @@ export default class Header extends ComponentBase { async processExternal(response) { await super.processExternal(response); - this.parentElement.style.opacity = 1; eagerImage(this, 1); } } diff --git a/blocks/hero/hero.css b/blocks/hero/hero.css index b263bcb5..60df96b1 100644 --- a/blocks/hero/hero.css +++ b/blocks/hero/hero.css @@ -1,39 +1,16 @@ /* block specific CSS goes here */ -main .hero-container > div { - max-width: unset; -} - -main .hero-container { - padding: 0; -} - -main .hero { - position: relative; - padding: 32px; - min-height: 300px; -} - -main .hero h1 { - max-width: 1200px; - margin-left: auto; - margin-right: auto; - color: white; -} +raqn-hero { + --raqn-background-color: var(--scope-background, transparent); + --raqn-color: var(--scope-color, transparent); + --raqn-grid-template-columns: 0.6fr 0.4fr; -main .hero picture { - position: absolute; - z-index: -1; - top: 0; - left: 0; - bottom: 0; - right: 0; - object-fit: cover; - box-sizing: border-box; -} + background-color: var(--raqn-background-color); + color: var(--raqn-color); + grid-template-columns: var(--raqn-grid-template-columns, 1fr); + align-items: center; -main .hero img { - object-fit: cover; - width: 100%; - height: 100%; + & > div:first-child { + max-width: 30vw; + } } diff --git a/blocks/hero/hero.js b/blocks/hero/hero.js index e69de29b..67c2f5e6 100644 --- a/blocks/hero/hero.js +++ b/blocks/hero/hero.js @@ -0,0 +1,12 @@ +import ComponentBase from '../../scripts/component-base.js'; + +export default class Hero extends ComponentBase { + connected() { + const child = this.children[0]; + child.replaceWith(...child.children); + this.classList.add('full-width'); + this.setAttribute('role', 'banner'); + this.setAttribute('aria-label', 'hero'); + this.style.setProperty('--hero-columns', this.getAttribute('height')); + } +} diff --git a/blocks/icon/icon.css b/blocks/icon/icon.css index 29149d81..bd707aa0 100644 --- a/blocks/icon/icon.css +++ b/blocks/icon/icon.css @@ -11,10 +11,6 @@ raqn-icon { -moz-osx-font-smoothing: grayscale; } -raqn-icon:not(.loaded) { - animation: placeholder ease-in-out 1s infinite; -} - raqn-icon svg { display: inline-block; max-height: 100%; diff --git a/blocks/navigation/navigation.css b/blocks/navigation/navigation.css index e7db897c..d9b52177 100644 --- a/blocks/navigation/navigation.css +++ b/blocks/navigation/navigation.css @@ -1,24 +1,35 @@ +/* stylelint-disable CssSyntaxError */ raqn-navigation { + --raqn-navigation-background: var(--scope-background, #fff); + --raqn-navigation-color: var(--scope-color, #000); + --raqn-navigation-level-1: var(--raqn-font-size-4, 1.25rem); + --raqn-navigation-level-2: var(--raqn-font-size-5, 1rem); + margin: var(--scope-margin); width: 100%; display: grid; justify-content: center; /* mobile */ - & > div div { + & > nav { ul, p { display: none; } } - ul li a { + a { display: inline-flex; align-items: center; text-decoration: none; - color: var(--scope-color, #000); + color: var(--raqn-navigation-color, #000); border-radius: var(--border-radius); transition: background-color 0.2s ease-in-out; + font-size: var(--raqn-navigation-level-1); + } + + .level-2 a { + font-size: var(--raqn-navigation-level-2); } div { @@ -44,7 +55,7 @@ raqn-navigation { color: var(--scope-color-hover, #fff); } - & > div > div > ul { + & > nav > ul { position: fixed; display: block; list-style: none; @@ -64,7 +75,11 @@ raqn-navigation { } /* desktop */ - &:not([compact='true']) > div > div { + &:not([compact='true']) > nav { + a { + line-height: var(--scope-icon-size, 24px); + } + ul { list-style: none; display: flex; @@ -74,37 +89,52 @@ raqn-navigation { display: inline-flex; } - ul li { - position: relative; + [icon='chevron-right'] { + transform: rotate(90deg); } - ul li a { + .level-1 a { padding: var(--padding-vertical, 20px) var(--padding-horizontal, 20px); } - & > ul > li > ul { - display: none; - padding: 0; + .level-1 > ul { + display: flex; + clip-path: inset(0% -100vw 100% -100vw); position: absolute; - top: 100%; - left: 0; - background-color: var(--scope-background, #fff); + padding: 0; + inset-block-start: var(--scope-header-height, 64px); + inset-inline-start: calc((100vw - var(--scope-max-width)) / 2); padding: var(--padding-vertical) var(--padding-horizontal); - border-radius: var(--border-radius); - box-shadow: var(--box-shadow); - } + transition: clip-path 0.4s ease-in-out; + overflow: visible; - & > ul > li:hover > ul { - display: block; + .level-2 { + padding-block: 1.2em; + opacity: 0; + transition: opacity 0.4s ease; + z-index: 2; + } + + &::after { + content: ' '; + margin-inline: calc(-1 * ((100vw - var(--scope-max-width)) / 2)); + position: absolute; + height: 100%; + width: 100vw; + inset-inline-start: 0; + background-color: var(--scope-background, #fff); + border-block-start: 1px solid var(--scope-color, #000); + box-shadow: 0px 0px 30px #000; + z-index: 1; + } } - ul > li > ul::after { - /* display: none; */ - content: ' '; - position: absolute; - height: 100%; - width: 100vw; - inset-inline-start: 0; + .level-1:hover > ul { + display: flex; + clip-path: inset(0 -100vw -100% -100vw); + & > li { + opacity: 1; + } } } } diff --git a/blocks/navigation/navigation.js b/blocks/navigation/navigation.js index d397c75a..210e2651 100644 --- a/blocks/navigation/navigation.js +++ b/blocks/navigation/navigation.js @@ -18,11 +18,44 @@ export default class Navigation extends Column { } render() { + this.list = this.querySelector('ul'); + this.nav = document.createElement('nav'); + this.nav.append(this.list); + this.setAttribute('role', 'navigation'); this.compact = this.getAttribute('compact') === 'true' || false; this.icon = this.getAttribute('icon') || 'menu'; - console.log('render', this.compact, this.getAttribute('compact')); if (this.compact) { - this.appendChild(this.createButton()); + this.nav.append(this.createButton()); + } + this.firstChild.replaceWith(this.nav); + this.setupClasses(this.list); + this.addEventListener('click', (e) => this.activate(e)); + } + + setupClasses(ul, level = 1) { + const children = Array.from(ul.children); + children.forEach((child) => { + child.classList.add(`level-${level}`); + const hasChildren = child.querySelector('ul'); + if (hasChildren) { + const anchor = child.querySelector('a'); + const icon = document.createElement('raqn-icon'); + icon.setAttribute('icon', 'chevron-right'); + anchor.append(icon); + child.classList.add('has-children'); + this.setupClasses(hasChildren, level + 1); + } + }); + } + + activate(e) { + if (e.target.tagName.toLowerCase() === 'a') { + const current = e.target.closest('li'); + if (this.active && this.active !== current) { + this.active.classList.remove('active'); + } + this.active = current; + this.active.classList.toggle('active'); } } } diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index 2b7e09a4..a73b6036 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -13,6 +13,9 @@ export default class Theme extends ComponentBase { 'font-family', 'icon-size', 'max-width', + 'header-height', + 'header-background', + 'header-color', 'gap', ]; this.defaultScope = [ diff --git a/styles/styles.css b/styles/styles.css index 73a5d0f8..d3de18de 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -33,10 +33,10 @@ body { header { min-height: var(--scope-header-height, 64px); - - > div { - display: none; - } + display: grid; + background-color: var(--raqn-header-background-1, #fff); + --scope-background: var(--raqn-header-background-1, #fff); + --scope-color: var(--raqn-header-color-1, #000); } main > * { @@ -45,6 +45,15 @@ main > * { font-family: custom; } +.full-width { + display: grid; + width: 100vw; + --scope-outer-gap: calc((var(--scope-max-width) - 100vw) / 2); + margin-inline-start: var(--scope-outer-gap); + padding-inline: calc(-1 * var(--scope-outer-gap)); + box-sizing: border-box; +} + a { display: inline-flex; line-height: 1em; @@ -75,15 +84,15 @@ img { @keyframes placeholder { 0% { - background-color: var(--placeholder-primary, #fff); + background-color: var(--scope-background, #fff); } 50% { - background-color: var(--placeholder-secondary, #ccc); + background-color: var(--scope-color, #999); } 100% { - background-color: var(--placeholder-primary, #fff); + background-color: var(--scope-background, #fff); } } From 71d47f7107b328f67296e2b39635efa708f1a0c0 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Wed, 3 Jan 2024 17:28:37 +0100 Subject: [PATCH 54/59] #414986 > review --- blocks/navigation/navigation.css | 4 ++-- styles/styles.css | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/blocks/navigation/navigation.css b/blocks/navigation/navigation.css index d9b52177..26f5ed24 100644 --- a/blocks/navigation/navigation.css +++ b/blocks/navigation/navigation.css @@ -104,7 +104,6 @@ raqn-navigation { padding: 0; inset-block-start: var(--scope-header-height, 64px); inset-inline-start: calc((100vw - var(--scope-max-width)) / 2); - padding: var(--padding-vertical) var(--padding-horizontal); transition: clip-path 0.4s ease-in-out; overflow: visible; @@ -124,7 +123,7 @@ raqn-navigation { inset-inline-start: 0; background-color: var(--scope-background, #fff); border-block-start: 1px solid var(--scope-color, #000); - box-shadow: 0px 0px 30px #000; + box-shadow: 0 0 30px #000; z-index: 1; } } @@ -132,6 +131,7 @@ raqn-navigation { .level-1:hover > ul { display: flex; clip-path: inset(0 -100vw -100% -100vw); + & > li { opacity: 1; } diff --git a/styles/styles.css b/styles/styles.css index d3de18de..225e08fc 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -32,23 +32,24 @@ body { } header { + --scope-background: var(--raqn-header-background-1, #fff); + --scope-color: var(--raqn-header-color-1, #000); + min-height: var(--scope-header-height, 64px); display: grid; background-color: var(--raqn-header-background-1, #fff); - --scope-background: var(--raqn-header-background-1, #fff); - --scope-color: var(--raqn-header-color-1, #000); } main > * { max-width: var(--scope-max-width, 100%); margin: 0 auto; - font-family: custom; } .full-width { + --scope-outer-gap: calc((var(--scope-max-width) - 100vw) / 2); + display: grid; width: 100vw; - --scope-outer-gap: calc((var(--scope-max-width) - 100vw) / 2); margin-inline-start: var(--scope-outer-gap); padding-inline: calc(-1 * var(--scope-outer-gap)); box-sizing: border-box; From bc5a7b8a2a2676f022f75d4897bfc3e56a6970e4 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Wed, 3 Jan 2024 20:38:09 +0100 Subject: [PATCH 55/59] font example --- blocks/theme/theme.js | 42 ++++++++++++++++++++++++++++++++----- fonts/segoe-ui-bold.woff | Bin 0 -> 20444 bytes fonts/segoe-ui-italic.woff | Bin 0 -> 24132 bytes fonts/segoe-ui.woff | Bin 0 -> 19904 bytes head.html | 3 +++ 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 fonts/segoe-ui-bold.woff create mode 100644 fonts/segoe-ui-italic.woff create mode 100644 fonts/segoe-ui.woff diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index a73b6036..8572860c 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -1,4 +1,5 @@ import ComponentBase from '../../scripts/component-base.js'; +import { config } from '../../scripts/libs.js'; export default class Theme extends ComponentBase { constructor() { @@ -23,17 +24,42 @@ export default class Theme extends ComponentBase { 'background', 'margin', 'icon-size', + 'font-family', 'max-width', ]; this.headingVariables = ['font-size', 'font-weight', 'font-family']; } + fontFaceTemplate(item) { + const { 'font-face': fontFace } = item; + + if (fontFace.indexOf('-') > -1) { + const [name, ...rest] = fontFace.split('-'); + const params = rest.pop().split('.'); + const format = params.pop(); + const lastBit = params.pop(); + const fontWeight = config.fontWeights[lastBit] || 'regular'; + const fontStyle = lastBit === 'italic' ? lastBit : 'normal'; + return ` +@font-face { + font-family: ${name}; + font-weight: ${fontWeight}; + font-style: ${fontStyle}; + src: url('/fonts/${fontFace}') format(${format}); +} +`; + } + return ''; + } + fontTagsTemplate(item, keys) { return `${item['font-tag']} {${keys .map((key) => { if (this.headingVariables.includes(key) && item[key]) { return ` - ${key}: var(--scope-${key},${item[key]});`; + ${key}: var(--scope-${key}, ${ + item[key].indexOf(',') > -1 ? `'${item[key]}'` : item[key] + });`; } return ''; }) @@ -47,10 +73,14 @@ export default class Theme extends ComponentBase { ); this.tags = data .map((item) => { + let tags = ''; + if (item['font-face']) { + tags += this.fontFaceTemplate(item); + } if (item['font-tag']) { - return this.fontTagsTemplate(item, keys); + tags += this.fontTagsTemplate(item, keys); } - return ''; + return tags; }) .join('') .trim(); @@ -69,7 +99,8 @@ export default class Theme extends ComponentBase { } styles() { - this.innerHTML = ``; + ${this.tags}`; + document.head.appendChild(style); document.body.style.display = 'block'; } diff --git a/fonts/segoe-ui-bold.woff b/fonts/segoe-ui-bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..a6b0a974f386597b18ba650e961e59880efe44d5 GIT binary patch literal 20444 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

|d!r;sYXG{sM=WaEFz*a!G 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 literal 0 HcmV?d00001 diff --git a/fonts/segoe-ui-italic.woff b/fonts/segoe-ui-italic.woff new file mode 100644 index 0000000000000000000000000000000000000000..1649115cef2ae4bddcba06a0d79120c089b97675 GIT binary patch literal 24132 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 Mb)HWD&x`#30Gtt=82|tP literal 0 HcmV?d00001 diff --git a/fonts/segoe-ui.woff b/fonts/segoe-ui.woff new file mode 100644 index 0000000000000000000000000000000000000000..a45efa328604a5e922cb6092c39a6fe73f22498d GIT binary patch literal 19904 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 literal 0 HcmV?d00001 diff --git a/head.html b/head.html index 6f07eff5..68292790 100644 --- a/head.html +++ b/head.html @@ -1,5 +1,8 @@ + + + Date: Fri, 5 Jan 2024 15:38:58 +0100 Subject: [PATCH 56/59] Improve theme excel format --- blocks/button/button.css | 8 +-- blocks/header/header.css | 2 + blocks/hero/hero.css | 13 +++- blocks/theme/theme.js | 137 ++++++++++++++++++--------------------- styles/styles.css | 20 +++--- 5 files changed, 89 insertions(+), 91 deletions(-) diff --git a/blocks/button/button.css b/blocks/button/button.css index b07cd814..7358e7cb 100644 --- a/blocks/button/button.css +++ b/blocks/button/button.css @@ -3,16 +3,16 @@ raqn-button { display: grid; & > div { - background-color: var(--scope-background, #000); - color: var(--scope-color, #fff); + background-color: var(--scope-accent-background, #000); + color: var(--scope-accent-color, #fff); text-transform: none; border-radius: 20px; border: 1px solid transparent; overflow: hidden; &:hover { - background-color: var(--scope-background-hover, #000); - color: var(--scope-color-hover, #fff); + background-color: var(--scope-accent-background-hover, #fff); + color: var(--scope-accent-color-hover, #fff); border-color: currentcolor; } } diff --git a/blocks/header/header.css b/blocks/header/header.css index d669bae7..87526d55 100644 --- a/blocks/header/header.css +++ b/blocks/header/header.css @@ -3,4 +3,6 @@ raqn-header { max-width: var(--scope-max-width, 90vw); margin: 0 auto; align-items: center; + border-block-end: var(--scope-border-color, #000) solid + var(--scope-border-width, 1px); } diff --git a/blocks/hero/hero.css b/blocks/hero/hero.css index 60df96b1..0483f623 100644 --- a/blocks/hero/hero.css +++ b/blocks/hero/hero.css @@ -7,10 +7,17 @@ raqn-hero { background-color: var(--raqn-background-color); color: var(--raqn-color); - grid-template-columns: var(--raqn-grid-template-columns, 1fr); align-items: center; - & > div:first-child { - max-width: 30vw; + @media screen and (max-width: 768px) { + --raqn-grid-template-columns: 1fr; + } + + grid-template-columns: var(--raqn-grid-template-columns, 1fr); + + @media screen and (min-width: 768px) { + & > div:first-child { + max-width: 30vw; + } } } diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index 8572860c..85d29470 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -5,34 +5,11 @@ export default class Theme extends ComponentBase { constructor() { super(); this.external = '/theme.json'; - this.allowedVariables = [ - 'color', - 'background', - 'margin', - 'font-size', - 'font-weight', - 'font-family', - 'icon-size', - 'max-width', - 'header-height', - 'header-background', - 'header-color', - 'gap', - ]; - this.defaultScope = [ - 'color', - 'background', - 'margin', - 'icon-size', - 'font-family', - 'max-width', - ]; - this.headingVariables = ['font-size', 'font-weight', 'font-family']; - } - fontFaceTemplate(item) { - const { 'font-face': fontFace } = item; + this.applyToTag = ['font-size', 'font-weight', 'font-family']; + } + fontFaceTemplate(fontFace) { if (fontFace.indexOf('-') > -1) { const [name, ...rest] = fontFace.split('-'); const params = rest.pop().split('.'); @@ -68,59 +45,73 @@ export default class Theme extends ComponentBase { createVariables() { const { data } = this.themeJson; - const keys = Object.keys(data[0]).filter((key) => - this.allowedVariables.includes(key), + const k = Object.keys; + const keys = data.map((item) => item.key); + const t = data.reduce( + (ac, item, i) => + keys.reduce((acc, key) => { + delete item.key; + const ind = keys.indexOf(key); + if (i === ind) { + acc[key] = item; + } + return acc; + }, ac), + {}, ); - this.tags = data - .map((item) => { - let tags = ''; - if (item['font-face']) { - tags += this.fontFaceTemplate(item); - } - if (item['font-tag']) { - tags += this.fontTagsTemplate(item, keys); - } - return tags; + + this.tags = k(t.tag) + .map((index) => { + const tag = t.tag[index]; + const values = this.applyToTag.reduce((acc, key) => { + if (t[key][index]) { + if (acc[tag]) { + acc[tag][key] = t[key][index]; + } else { + acc[tag] = { [key]: t[key][index] }; + } + } + return acc; + }, {}); + return k(values).map((value) => { + const val = values[value]; + return `${tag} {\n${k(val) + .map((v) => `${v}: ${val[v]};`) + .join('\n')}\n}`; + }); }) - .join('') - .trim(); - this.variables = {}; - data.reduce((acc, item, index) => { - keys.forEach((key) => { - if (item[key]) { - acc[`${key}-${index + 1}`] = { - value: item[key], - scope: key, - }; - } - }); - return acc; - }, this.variables); + .join('\n\n'); + this.fontFace = ''; + this.atomic = ''; + this.variables = k(t) + .map((key) => { + const rows = k(t[key]); + return rows + .map((row) => { + const value = t[key][row]; + let variable = ''; + if (value) { + if (key === 'font-face') { + this.fontFace += this.fontFaceTemplate(value); + } else { + variable = `\n--raqn-${key}-${row}: ${value};\n`; + if (row === 'default') { + variable += `\n--scope-${key}: ${value};\n`; + } + + this.atomic += `\n.${key}-${row} {\n--scope-${key}: var(--raqn-${key}-${row}, ${value}); \n}\n`; + } + } + return variable; + }) + .join(''); + }) + .join(''); } styles() { const style = document.createElement('style'); - style.innerHTML = `body { - ${Object.keys(this.variables) - .map((key) => { - const { scope, value } = this.variables[key]; - return `${ - key.indexOf(1) > -1 && this.defaultScope.includes(scope) - ? `--scope-${scope}: ${value};` - : '' - } - --raqn-${key}: ${value};`; - }) - .join('\n')} - } - ${Object.keys(this.variables) - .map( - (key) => `.${key} { - --scope-${this.variables[key].scope}: ${this.variables[key].value};\n}`, - ) - .join('\n')} - - ${this.tags}`; + style.innerHTML = `${this.fontFace}\n\nbody {\n${this.variables}\n}\n\n${this.tags}\n\n${this.atomic}`; document.head.appendChild(style); document.body.style.display = 'block'; } diff --git a/styles/styles.css b/styles/styles.css index 225e08fc..c48b923d 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -1,10 +1,3 @@ -@font-face { - font-family: roboto-regular; - size-adjust: 100.06%; - ascent-override: 95%; - src: local('Arial'); -} - @media screen and (max-width: 768px) { body { --scope-max-width: 100vw; @@ -32,12 +25,11 @@ body { } header { - --scope-background: var(--raqn-header-background-1, #fff); - --scope-color: var(--raqn-header-color-1, #000); - + --scope-background: var(--raqn-header-background-default, #fff); + --scope-color: var(--raqn-header-color-default, #000); min-height: var(--scope-header-height, 64px); display: grid; - background-color: var(--raqn-header-background-1, #fff); + background-color: var(--raqn-header-background-default, #fff); } main > * { @@ -55,6 +47,12 @@ main > * { box-sizing: border-box; } +main div > div { + background-color: var(--scope-background, #fff); + color: var(--scope-color, #000); + margin: var(--scope-margin, 0 auto); +} + a { display: inline-flex; line-height: 1em; From 440d209c8e1fc1a8aa83fca6e624916de707445d Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 5 Jan 2024 15:42:03 +0100 Subject: [PATCH 57/59] Improve theme excel format --- blocks/theme/theme.js | 1 + 1 file changed, 1 insertion(+) diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index 85d29470..1892ddb9 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -21,6 +21,7 @@ export default class Theme extends ComponentBase { @font-face { font-family: ${name}; font-weight: ${fontWeight}; + font-display: swap; font-style: ${fontStyle}; src: url('/fonts/${fontFace}') format(${format}); } From 08d6f530163c004592701a683ee23b0e2c04c545 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 5 Jan 2024 15:52:00 +0100 Subject: [PATCH 58/59] Improve theme excel format --- blocks/theme/theme.js | 112 ++++++++++++++++++------------------------ scripts/init.js | 2 +- 2 files changed, 48 insertions(+), 66 deletions(-) diff --git a/blocks/theme/theme.js b/blocks/theme/theme.js index 1892ddb9..c7ad257a 100644 --- a/blocks/theme/theme.js +++ b/blocks/theme/theme.js @@ -1,12 +1,15 @@ import ComponentBase from '../../scripts/component-base.js'; import { config } from '../../scripts/libs.js'; +// minify alias +const k = Object.keys; export default class Theme extends ComponentBase { constructor() { super(); this.external = '/theme.json'; - - this.applyToTag = ['font-size', 'font-weight', 'font-family']; + this.toTags = ['font-size', 'font-weight', 'font-family']; + this.fontFace = ''; + this.atomic = ''; } fontFaceTemplate(fontFace) { @@ -17,36 +20,52 @@ export default class Theme extends ComponentBase { const lastBit = params.pop(); const fontWeight = config.fontWeights[lastBit] || 'regular'; const fontStyle = lastBit === 'italic' ? lastBit : 'normal'; - return ` -@font-face { - font-family: ${name}; - font-weight: ${fontWeight}; - font-display: swap; - font-style: ${fontStyle}; - src: url('/fonts/${fontFace}') format(${format}); -} -`; + // eslint-disable-next-line max-len + return `\n@font-face {\nfont-family: ${name};\nfont-weight: ${fontWeight};\nfont-display: swap;\nfont-style: ${fontStyle};\nsrc: url('/fonts/${fontFace}') format(${format});\n}\n`; } return ''; } - fontTagsTemplate(item, keys) { - return `${item['font-tag']} {${keys - .map((key) => { - if (this.headingVariables.includes(key) && item[key]) { - return ` - ${key}: var(--scope-${key}, ${ - item[key].indexOf(',') > -1 ? `'${item[key]}'` : item[key] - });`; + fontTags(t, index) { + const tag = t.tag[index]; + const values = this.toTags.reduce((acc, key) => { + if (t[key][index]) { + if (acc[tag]) { + acc[tag][key] = t[key][index]; + } else { + acc[tag] = { [key]: t[key][index] }; } - return ''; - }) - .join('')}}\n`; + } + return acc; + }, {}); + return k(values).map((value) => { + const val = values[value]; + return `${tag} {\n${k(val) + .map((v) => `${v}: ${val[v]};`) + .join('\n')}\n}`; + }); + } + + renderVariables(key, row, t) { + const value = t[key][row]; + let variable = ''; + if (value) { + if (key === 'font-face') { + this.fontFace += this.fontFaceTemplate(value); + } else { + variable = `\n--raqn-${key}-${row}: ${value};\n`; + if (row === 'default') { + variable += `\n--scope-${key}: ${value};\n`; + } + + this.atomic += `\n.${key}-${row} {\n--scope-${key}: var(--raqn-${key}-${row}, ${value}); \n}\n`; + } + } + return variable; } - createVariables() { + readValue() { const { data } = this.themeJson; - const k = Object.keys; const keys = data.map((item) => item.key); const t = data.reduce( (ac, item, i) => @@ -62,50 +81,13 @@ export default class Theme extends ComponentBase { ); this.tags = k(t.tag) - .map((index) => { - const tag = t.tag[index]; - const values = this.applyToTag.reduce((acc, key) => { - if (t[key][index]) { - if (acc[tag]) { - acc[tag][key] = t[key][index]; - } else { - acc[tag] = { [key]: t[key][index] }; - } - } - return acc; - }, {}); - return k(values).map((value) => { - const val = values[value]; - return `${tag} {\n${k(val) - .map((v) => `${v}: ${val[v]};`) - .join('\n')}\n}`; - }); - }) + .map((index) => this.fontTags(t, index)) .join('\n\n'); - this.fontFace = ''; - this.atomic = ''; + this.variables = k(t) .map((key) => { const rows = k(t[key]); - return rows - .map((row) => { - const value = t[key][row]; - let variable = ''; - if (value) { - if (key === 'font-face') { - this.fontFace += this.fontFaceTemplate(value); - } else { - variable = `\n--raqn-${key}-${row}: ${value};\n`; - if (row === 'default') { - variable += `\n--scope-${key}: ${value};\n`; - } - - this.atomic += `\n.${key}-${row} {\n--scope-${key}: var(--raqn-${key}-${row}, ${value}); \n}\n`; - } - } - return variable; - }) - .join(''); + return rows.map((row) => this.renderVariables(key, row, t)).join(''); }) .join(''); } @@ -120,7 +102,7 @@ export default class Theme extends ComponentBase { async processExternal(response) { if (response.ok) { this.themeJson = await response.json(); - this.createVariables(); + this.readValue(); this.styles(); } } diff --git a/scripts/init.js b/scripts/init.js index d5f1c50f..ebc9b3d9 100644 --- a/scripts/init.js +++ b/scripts/init.js @@ -40,7 +40,7 @@ function lcpPriority() { } export async function init(node = document) { - let blocks = Array.from(node.querySelectorAll('[class]:not([class^=raqn]')); + let blocks = Array.from(node.querySelectorAll('[class]:not([class^=style]')); if (node === document) { const header = node.querySelector('header'); From ca0503886d43734796487c60fcd976c9c1eaf832 Mon Sep 17 00:00:00 2001 From: Felipe Simoes Date: Fri, 5 Jan 2024 15:54:42 +0100 Subject: [PATCH 59/59] Improve theme excel format --- styles/styles.css | 1 + 1 file changed, 1 insertion(+) diff --git a/styles/styles.css b/styles/styles.css index c48b923d..dd6e5f33 100644 --- a/styles/styles.css +++ b/styles/styles.css @@ -27,6 +27,7 @@ body { header { --scope-background: var(--raqn-header-background-default, #fff); --scope-color: var(--raqn-header-color-default, #000); + min-height: var(--scope-header-height, 64px); display: grid; background-color: var(--raqn-header-background-default, #fff);