From 1defa8fe39f174fd98aeb9d71c8fb403ae6b2ea4 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 10 Feb 2021 17:37:51 +0100 Subject: [PATCH 001/649] feat(templates): Picker improvements --- tools/templates/picker.html | 136 ++++++++++++++++++++++++++---------- 1 file changed, 101 insertions(+), 35 deletions(-) diff --git a/tools/templates/picker.html b/tools/templates/picker.html index 90f4717..e0dd6f3 100644 --- a/tools/templates/picker.html +++ b/tools/templates/picker.html @@ -171,22 +171,6 @@ let nbSelected = 0; const templateSelection = {}; - const find = async (q) => { - const params = { - q, - filters: 'branchURL:*', - } - const urlParams = new URLSearchParams(Object.entries(params)); - const res = await fetch(`https://spark-search.adobe.io/v2/content?${urlParams}`, { - headers: { - 'x-api-key': 'Helix_Spark_Content_Search' - }, - }); - - const json = await res.json(); - return json._embedded && json._embedded.results ? json._embedded.results : []; - } - const unselect = (id) => { delete templateSelection[id]; nbSelected--; @@ -214,13 +198,15 @@ let html = ''; for(let p in templateSelection) { const t = templateSelection[p]; - if (t.animation) { + if (t.animated) { html += `
-
`; } else { html += `
- +
`; } }; @@ -235,19 +221,75 @@ } } + const API_ROOT = 'https://spark-search.adobe.io'; + + async function asyncForEach(array, callback) { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index, array); + } + } + const search = async () => { + const resultContainer = document.querySelector('#results'); + resultContainer.innerHTML = ''; + const q = document.getElementById('search'); - const array = await find(q.value || ''); - if (array) { - const resultContainer = document.querySelector('#results'); - resultContainer.innerHTML = ''; - array.forEach(t => { - let href = t.rendition.href + + if (window.history.pushState) { + const searchParams = new URLSearchParams(window.location.search); + searchParams.set('q', q.value); + + const url = new URL(window.location.href); + url.search = searchParams.toString(); + window.history.pushState({ + path: url.href + }, '', url.href); + } + + const params = { + q: q.value, + filters: 'branchURL:*', + limit: 100, + }; + + const options = { + headers: { + 'x-api-key': 'Helix_Spark_Content_Search' + }, + }; + + const urlParams = new URLSearchParams(Object.entries(params)); + + let res = await fetch(`${API_ROOT}/v2/content?${urlParams}`, options); + + let json = await res.json(); + let results = json && json._embedded && json._embedded.results ? json._embedded.results : []; + + const allResults = []; + let duplicates = 0; + const searchTotal = json._embedded.total; + let total = 0; + while (results.length > 0) { + await asyncForEach(results, async t => { + // API seems to return duplicates + + if (allResults.indexOf(t.id) !== -1) { + return; + } else { + allResults.push(t.id); + } + + total++; + + let asset = t.rendition.href .replace('\{format\}', 'jpg') .replace('\{dimension\}', 'width') .replace('\{size\}', t.rendition.maxWidth || 1200); - const img = href; + const thumbnail = t.rendition.href + .replace('\{format\}', 'jpg') + .replace('\{dimension\}', 'width') + .replace('\{size\}', 240); const template = document.createElement('div'); template.classList.add('template'); @@ -256,11 +298,13 @@ if (t.animated) { const animationRoot = t.rendition.href.split('rendition')[0]; const version = t.rendition.href.split('/version/')[1].split('/')[0]; - href = animationRoot + "dcx/" + t.id + "/content/videoRendition.mp4/version/" + version; + asset = animationRoot + "dcx/" + t.id + "/content/videoRendition.mp4/version/" + version; template.innerHTML += `
-
${t.title}
@@ -268,7 +312,7 @@ } else { template.innerHTML += `
- +
${t.title}
@@ -284,10 +328,11 @@ unselect(t.branchURL); } else { select(t.branchURL, { - img, + asset, + thumbnail, title: t.title, branchURL: t.branchURL, - animation: t.animated ? href : null, + animated: t.animated, }); } @@ -301,7 +346,18 @@ resultContainer.append(template); }); - } + + if (json._links && json._links.next && json._links.next.href) { + res = await fetch(`${API_ROOT}${json._links.next.href}`, options); + + json = await res.json(); + results = json && json._embedded && json._embedded.results ? json._embedded.results : []; + } else { + results = []; + } + } + + console.log(`Showing a total of ${total}/${searchTotal} templates`); } const IMG_EXPORT_WIDTH = 180; @@ -319,16 +375,16 @@ row.append(imgCell); const img = document.createElement('img'); - img.src = template.img; + img.src = template.animated ? template.thumbnail : template.asset; img.alt = template.title; img.width = IMG_EXPORT_WIDTH; imgCell.append(img); - if (template.animation) { + if (template.animated) { imgCell.append(document.createElement('br')); const link = document.createElement('a'); - link.href = template.animation; + link.href = template.asset; link.innerHTML = 'Animation'; imgCell.append(link); } @@ -406,5 +462,15 @@

Pick your templates

+ \ No newline at end of file From 3955b6b0f3b766b6c7e01adaeee53b1a9353d4ff Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 10 Feb 2021 14:07:19 -0800 Subject: [PATCH 002/649] feat: implement simple make inheritance --- scripts/scripts.js | 70 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/scripts/scripts.js b/scripts/scripts.js index 3c1312b..de057ae 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -57,8 +57,72 @@ function tableToDivs($table, cols) { return ($cards); } -function decorateTables() { - document.querySelectorAll('main div>table').forEach(($table) => { +function getLocale(url) { + const locale=url.pathname.split('/')[1]; + if (/^[a-z-]{2}(-[a-zA-Z-]*)?-[A-Z]{2}$/.test(locale)) { + return locale; + } + return 'en-US'; +} + +async function fetchBlueprint(pathname) { + if (window.spark.$blueprint) { + return (window.spark.$blueprint) + } + + const bpPath = pathname.substr(pathname.indexOf('/',1)).split('.')[0]; + const resp = await fetch(`${bpPath}.plain.html`); + console.log ('fetching...'); + const body = await resp.text(); + const $main=createTag('main'); + $main.innerHTML = body; + decorateTables($main); + window.spark.$blueprint = $main; + return ($main); +} + +async function decorateTemplateLists() { + const $templateLists=Array.from(document.querySelectorAll('main .template-list')); + for (let i = 0; i < $templateLists.length; i+=1) { + const $block = $templateLists[i]; + console.log('template-lists'); + const rows = $block.children.length; + const locale = getLocale(window.location); + if (rows == 0 && locale !== 'en-US') { + const $blueprint = await fetchBlueprint(window.location.pathname); + $block.innerHTML = $blueprint.querySelectorAll(`.template-list`)[i].innerHTML; + } + } + + /* --- inherit hero image, this should go somewhere else --- */ + const $heroPicture = document.querySelector('.hero-bg'); + console.log($heroPicture); + console.log(window.spark.$blueprint); + + if (!$heroPicture && window.spark.$blueprint) { + const $bpHeroImage = window.spark.$blueprint.querySelector('div:first-of-type img'); + console.log($bpHeroImage); + if ($bpHeroImage) { + const $heroSection = document.querySelector('main .hero'); + const $heroDiv = document.querySelector('main .hero > div'); + const $p = createTag('p'); + const $pic = createTag('picture', {class: 'hero-bg'}); + $pic.appendChild($bpHeroImage); + $p.append($pic); + + $heroSection.classList.remove('hero-noimage'); + $heroDiv.prepend($p); + } + } +} + +function decorateTables($root) { + let prefix = '' + if (!$root) { + prefix = 'main'; + $root = document; + } + $root.querySelectorAll(`${prefix} div>table`).forEach(($table) => { const $cols = $table.querySelectorAll('thead tr th'); let cols = Array.from($cols).map((e) => toClassName(e.textContent)).filter((e) => (!!e)); let $div = {}; @@ -331,6 +395,7 @@ function postLCP() { loadLazyFooter(); if (window.location.search === '?martech') loadScript('/scripts/martech.js'); decorateBlogPosts(); + decorateTemplateLists(); } function decorateHero() { @@ -865,6 +930,7 @@ async function decoratePage() { decorateDoMoreEmbed(); } +window.spark={}; decoratePage(); export { loadScript as default }; From 4cb2835f0490222bd25bd5d5aa796f3858db9e4c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 10 Feb 2021 14:58:24 -0800 Subject: [PATCH 003/649] chore: breaking march branch --- helix-version.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 helix-version.txt diff --git a/helix-version.txt b/helix-version.txt new file mode 100644 index 0000000..c816c96 --- /dev/null +++ b/helix-version.txt @@ -0,0 +1 @@ +breaking-202103 From 78ffafe1d84f5f4193f14c22e5996b16730c8ca0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 11 Feb 2021 08:52:15 -0800 Subject: [PATCH 004/649] chore: enable martech by default --- scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/scripts.js b/scripts/scripts.js index de057ae..ca898b7 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -393,7 +393,7 @@ function postLCP() { decorateAnimations(); loadCSS('/styles/lazy-styles.css'); loadLazyFooter(); - if (window.location.search === '?martech') loadScript('/scripts/martech.js'); + if (window.location.search !== '?nomartech') loadScript('/scripts/martech.js'); decorateBlogPosts(); decorateTemplateLists(); } From a502def78472eb81f8493386a270b9e2d01f2ba2 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 11 Feb 2021 09:05:35 -0800 Subject: [PATCH 005/649] fix: martech inclusion after module migration --- scripts/martech.js | 2 +- scripts/scripts.js | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/martech.js b/scripts/martech.js index 4340b75..ef06c0e 100644 --- a/scripts/martech.js +++ b/scripts/martech.js @@ -11,7 +11,7 @@ */ /* global window */ -import loadScript from './scripts'; +import loadScript from './scripts.js'; function handleConsentSettings() { try { diff --git a/scripts/scripts.js b/scripts/scripts.js index ca898b7..4a5490f 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -273,9 +273,12 @@ function loadCSS(href) { document.head.appendChild(link); } -function loadScript(url, callback) { +function loadScript(url, callback, type) { const $head = document.querySelector('head'); const $script = createTag('script', { src: url }); + if (type) { + $script.setAttribute('type',type); + } $head.append($script); $script.onload = callback; } @@ -393,7 +396,7 @@ function postLCP() { decorateAnimations(); loadCSS('/styles/lazy-styles.css'); loadLazyFooter(); - if (window.location.search !== '?nomartech') loadScript('/scripts/martech.js'); + if (window.location.search !== '?nomartech') loadScript('/scripts/martech.js', null, 'module'); decorateBlogPosts(); decorateTemplateLists(); } From 4a82e6a1bba7198fe1c7d7477455a00f4c38307a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 11 Feb 2021 09:49:11 -0800 Subject: [PATCH 006/649] chore: testing more async --- scripts/scripts.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/scripts.js b/scripts/scripts.js index 4a5490f..d8ace11 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -396,7 +396,11 @@ function postLCP() { decorateAnimations(); loadCSS('/styles/lazy-styles.css'); loadLazyFooter(); - if (window.location.search !== '?nomartech') loadScript('/scripts/martech.js', null, 'module'); + if (window.location.search !== '?nomartech') { + setTimeout(() => { + loadScript('/scripts/martech.js', null, 'module'); + }, 2000); + } decorateBlogPosts(); decorateTemplateLists(); } From 243ef36b9444300a67edac4520c9ed6711cf1ef2 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 11 Feb 2021 10:40:38 -0800 Subject: [PATCH 007/649] chore: typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab07bdd..5c1f50e 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,6 @@ Outer CDN: 1. Install the [Helix CLI](https://github.com/adobe/helix-cli): `npm install -g @adobe/helix-cli` 1. Clone this repository locally: `git clone https://github.com/adobe/spark-website.git` -1. Go to the `fedpub` directory: `cd spark-website` +1. Go to the `spark-website` directory: `cd spark-website` 1. Start Helix Simulator: `hlx up` (opens your browser at `http://localhost:3000`) 1. Open the `spark-website` directory in your favorite IDE and start coding :) From 9fb950987d325155a2eb498011beafc39085af8a Mon Sep 17 00:00:00 2001 From: Benjamin Bytheway Date: Thu, 11 Feb 2021 11:53:48 -0700 Subject: [PATCH 008/649] fix: remove martech warning in console --- scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/martech.js b/scripts/martech.js index ef06c0e..f35dc0b 100644 --- a/scripts/martech.js +++ b/scripts/martech.js @@ -41,7 +41,7 @@ window.marketingtech = { adobe: { launch: { property: 'global', - environment: 'prod', + environment: 'production', }, analytics: { additionalAccounts: 'adbemmarvelweb.prod', From 709433f5e9c852b925bc0c7f437be3c28d56af57 Mon Sep 17 00:00:00 2001 From: Benjamin Bytheway Date: Thu, 11 Feb 2021 12:29:40 -0700 Subject: [PATCH 009/649] feat: enabled adobe target without flicker --- scripts/martech.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/martech.js b/scripts/martech.js index f35dc0b..a5249fe 100644 --- a/scripts/martech.js +++ b/scripts/martech.js @@ -46,8 +46,12 @@ window.marketingtech = { analytics: { additionalAccounts: 'adbemmarvelweb.prod', }, + target: true, }, }; +window.targetGlobalSettings = { + bodyHidingEnabled: false, +}; loadScript('https://www.adobe.com/marketingtech/main.min.js'); loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); From 157a34a48a627fa46b26570f32cef1148c8dd4c0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 15 Feb 2021 15:55:17 -0800 Subject: [PATCH 010/649] feat: test martech load delay --- scripts/scripts.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/scripts.js b/scripts/scripts.js index d8ace11..9954bbe 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -397,9 +397,13 @@ function postLCP() { loadCSS('/styles/lazy-styles.css'); loadLazyFooter(); if (window.location.search !== '?nomartech') { + let ms=2000; + const usp=new URLSearchParams(window.location.search); + const delay=usp.get('delay'); + if (delay) ms=+delay; setTimeout(() => { loadScript('/scripts/martech.js', null, 'module'); - }, 2000); + }, ms); } decorateBlogPosts(); decorateTemplateLists(); @@ -455,7 +459,7 @@ async function fetchFullIndex(indices) { // eslint-disable-next-line no-console console.log(`${url}: ${json.data.length}`); json.data.sort((e1, e2) => e1.path.localeCompare(e2.path)); - fullIndex.push(...json.data); + fullIndex.push(...json.data.filter((e) => !!e.path)); } })); return (fullIndex); From 1913eb463def027e11cbcf0a3279cfbb7b4f1699 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Feb 2021 16:09:23 -0800 Subject: [PATCH 011/649] feat: rush martech on specific test URLs --- package-lock.json | 7304 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- scripts/scripts.js | 147 +- 3 files changed, 7386 insertions(+), 67 deletions(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..509ede3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7304 @@ +{ + "name": "@adobe/spark-website", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@adobe/spark-website", + "version": "1.0.0", + "license": "Apache License 2.0", + "devDependencies": { + "@adobe/eslint-config-helix": "1.1.3", + "chai": "4.2.0", + "eslint": "^7.15.0", + "eslint-plugin-header": "3.1.0", + "eslint-plugin-import": "2.22.1", + "fs-extra": "9.0.1", + "karma": "5.2.3", + "karma-chai": "0.1.0", + "karma-chrome-launcher": "3.1.0", + "karma-mocha": "2.0.1", + "karma-mocha-reporter": "2.2.5", + "mocha": "8.2.1", + "puppeteer": "5.5.0", + "shelljs": "0.8.4" + } + }, + "node_modules/@adobe/eslint-config-helix": { + "version": "1.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "eslint-config-airbnb-base": "14.2.0" + }, + "engines": { + "node": ">= 8" + }, + "peerDependencies": { + "eslint": "^6.1.0 || ^7.0.0", + "eslint-plugin-header": "^3.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "14.14.31", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.9.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/after": { + "version": "0.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.slice": { + "version": "0.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.4", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blob": { + "version": "0.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "dev": true, + "license": "ISC" + }, + "node_modules/cliui": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/component-bind": { + "version": "1.0.0", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/component-inherit": { + "version": "0.0.3", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.10", + "dev": true, + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/contains-path": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/date-format": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.818844", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/di": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io-client": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/engine.io-parser": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0-next.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.21.2" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-header": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=7.7.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.22.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.13.2", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "9.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "dev": true, + "license": "ISC" + }, + "node_modules/growl": { + "version": "1.10.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-binary2": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "2.0.1" + } + }, + "node_modules/has-cors": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.8", + "dev": true, + "license": "ISC" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indexof": { + "version": "0.0.1", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/karma": { + "version": "5.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.4.2", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.19", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", + "source-map": "^0.6.1", + "tmp": "0.2.1", + "ua-parser-js": "0.7.22", + "yargs": "^15.3.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chai": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "chai": "*", + "karma": ">=0.10.9" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-mocha": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.3" + } + }, + "node_modules/karma-mocha-reporter": { + "version": "2.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "strip-ansi": "^4.0.0" + }, + "peerDependencies": { + "karma": ">=0.13" + } + }, + "node_modules/karma-mocha-reporter/node_modules/ansi-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/karma-mocha-reporter/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/karma-mocha-reporter/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/karma-mocha-reporter/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log4js": { + "version": "6.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/flatted": { + "version": "2.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.46.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.29", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.46.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "dev": true, + "license": "MIT" + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha": { + "version": "8.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.3", + "debug": "4.2.0", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "nanoid": "3.1.12", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "7.2.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.2", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-regex": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/mocha/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/mocha/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/fsevents": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "3.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/log-symbols": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mocha/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "13.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/mocha/node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.1.12", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || >=13.7" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parseqs": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/parseuri": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "5.5.0", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0", + "devtools-protocol": "0.0.818844", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "node-fetch": "^2.6.1", + "pkg-dir": "^4.2.0", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/puppeteer/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/puppeteer/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.20.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rfdc": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.3.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/socket.io": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/socket.io-client": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/socket.io-client/node_modules/socket.io-parser": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser": { + "version": "3.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser/node_modules/component-emitter": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "2.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/date-format": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.6" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table": { + "version": "5.4.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-array": { + "version": "0.1.4", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.22", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/universalify": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/wide-align": { + "version": "1.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.0.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "7.4.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "1.5.5", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "4.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "15.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yeast": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@adobe/eslint-config-helix": { + "version": "1.1.3", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "14.2.0" + } + }, + "@babel/code-frame": { + "version": "7.12.13", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.2.2", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@types/json5": { + "version": "0.0.29", + "dev": true + }, + "@types/node": { + "version": "14.14.31", + "dev": true, + "optional": true + }, + "@types/yauzl": { + "version": "2.9.1", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "dev": true, + "requires": {} + }, + "after": { + "version": "0.8.2", + "dev": true + }, + "agent-base": { + "version": "5.1.1", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.1", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-includes": { + "version": "3.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array.prototype.flat": { + "version": "1.2.4", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "arraybuffer.slice": { + "version": "0.0.7", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.4", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "dev": true + }, + "bl": { + "version": "4.1.0", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "blob": { + "version": "0.0.5", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "dev": true + }, + "buffer": { + "version": "5.7.1", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "dev": true + }, + "chai": { + "version": "4.2.0", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.0", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "dev": true + }, + "chokidar": { + "version": "3.5.1", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "1.1.4", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "dev": true + }, + "colors": { + "version": "1.4.0", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "dev": true + }, + "confusing-browser-globals": { + "version": "1.0.10", + "dev": true + }, + "connect": { + "version": "3.7.0", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "contains-path": { + "version": "0.1.0", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "dev": true + }, + "cookie": { + "version": "0.4.1", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "dev": true + }, + "date-format": { + "version": "3.0.0", + "dev": true + }, + "debug": { + "version": "4.3.1", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "depd": { + "version": "1.1.2", + "dev": true + }, + "devtools-protocol": { + "version": "0.0.818844", + "dev": true + }, + "di": { + "version": "0.0.1", + "dev": true + }, + "diff": { + "version": "4.0.2", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serialize": { + "version": "2.2.1", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.5.0", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "engine.io-client": { + "version": "3.5.0", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.2.1", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enquirer": { + "version": "2.3.6", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "ent": { + "version": "2.2.0", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.0-next.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "dev": true + }, + "eslint": { + "version": "7.15.0", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.0", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.0", + "dev": true, + "requires": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "eslint-plugin-header": { + "version": "3.1.0", + "dev": true, + "requires": {} + }, + "eslint-plugin-import": { + "version": "2.22.1", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "dev": true + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "dev": true + }, + "espree": { + "version": "7.3.1", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "dev": true + }, + "extend": { + "version": "3.0.2", + "dev": true + }, + "extract-zip": { + "version": "2.0.1", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "dev": true + }, + "fd-slicer": { + "version": "1.1.0", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + } + } + }, + "find-up": { + "version": "5.0.0", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.1", + "dev": true + }, + "follow-redirects": { + "version": "1.13.2", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "dev": true + }, + "fs-extra": { + "version": "9.0.1", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "5.2.0", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "graceful-fs": { + "version": "4.2.6", + "dev": true + }, + "growl": { + "version": "1.10.5", + "dev": true + }, + "has": { + "version": "1.0.3", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-binary2": { + "version": "1.0.3", + "dev": true, + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "dev": true + }, + "he": { + "version": "1.2.0", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.8", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "https-proxy-agent": { + "version": "4.0.0", + "dev": true, + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "dev": true + }, + "interpret": { + "version": "1.4.0", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-callable": { + "version": "1.2.3", + "dev": true + }, + "is-core-module": { + "version": "2.2.0", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.2", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "dev": true + }, + "is-regex": { + "version": "1.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + } + }, + "is-string": { + "version": "1.0.5", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "isarray": { + "version": "2.0.1", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.6", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true + }, + "json5": { + "version": "1.0.1", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "dev": true + } + } + }, + "karma": { + "version": "5.2.3", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.4.2", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.19", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", + "source-map": "^0.6.1", + "tmp": "0.2.1", + "ua-parser-js": "0.7.22", + "yargs": "^15.3.1" + } + }, + "karma-chai": { + "version": "0.1.0", + "dev": true, + "requires": {} + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "dev": true, + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-mocha": { + "version": "2.0.1", + "dev": true, + "requires": { + "minimist": "^1.2.3" + } + }, + "karma-mocha-reporter": { + "version": "2.2.5", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "levn": { + "version": "0.4.1", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "log4js": { + "version": "6.3.0", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "flatted": { + "version": "2.0.2", + "dev": true + } + } + }, + "lru-cache": { + "version": "6.0.0", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "dev": true + }, + "mime": { + "version": "2.5.2", + "dev": true + }, + "mime-db": { + "version": "1.46.0", + "dev": true + }, + "mime-types": { + "version": "2.1.29", + "dev": true, + "requires": { + "mime-db": "1.46.0" + } + }, + "minimatch": { + "version": "3.0.4", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "dev": true + }, + "mocha": { + "version": "8.2.1", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.4.3", + "debug": "4.2.0", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.2", + "nanoid": "3.1.12", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "7.2.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.2", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chokidar": { + "version": "3.4.3", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "cliui": { + "version": "5.0.0", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "dev": true + }, + "debug": { + "version": "4.2.0", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fsevents": { + "version": "2.1.3", + "dev": true, + "optional": true + }, + "js-yaml": { + "version": "3.14.0", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "log-symbols": { + "version": "4.0.0", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + } + } + } + } + }, + "ms": { + "version": "2.1.2", + "dev": true + }, + "nanoid": { + "version": "3.1.12", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "dev": true + }, + "node-fetch": { + "version": "2.6.1", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "dev": true + }, + "object-inspect": { + "version": "1.9.0", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.3", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, + "object.values": { + "version": "1.1.2", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-try": { + "version": "1.0.0", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parseqs": { + "version": "0.0.6", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pathval": { + "version": "1.1.1", + "dev": true + }, + "pend": { + "version": "1.2.0", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "dev": true + }, + "pify": { + "version": "2.3.0", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "dev": true + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "dev": true + }, + "progress": { + "version": "2.0.3", + "dev": true + }, + "proxy-from-env": { + "version": "1.1.0", + "dev": true + }, + "pump": { + "version": "3.0.0", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "dev": true + }, + "puppeteer": { + "version": "5.5.0", + "dev": true, + "requires": { + "debug": "^4.1.0", + "devtools-protocol": "0.0.818844", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", + "node-fetch": "^2.6.1", + "pkg-dir": "^4.2.0", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "qjobs": { + "version": "1.2.0", + "dev": true + }, + "qs": { + "version": "6.7.0", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.5.0", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regexpp": { + "version": "3.1.0", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "dev": true + }, + "rfdc": { + "version": "1.2.0", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "dev": true + }, + "semver": { + "version": "7.3.4", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "5.0.1", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "slice-ansi": { + "version": "2.1.0", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "dev": true + } + } + }, + "socket.io": { + "version": "2.4.1", + "dev": true, + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "dev": true + }, + "socket.io-client": { + "version": "2.4.0", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.2", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "dev": true + }, + "debug": { + "version": "4.1.1", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "dev": true + }, + "streamroller": { + "version": "2.2.4", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.3.0", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "3.1.0", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "5.4.6", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "text-table": { + "version": "0.2.0", + "dev": true + }, + "through": { + "version": "2.3.8", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-array": { + "version": "0.1.4", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "dev": true + }, + "tsconfig-paths": { + "version": "3.9.0", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "ua-parser-js": { + "version": "0.7.22", + "dev": true + }, + "unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "universalify": { + "version": "1.0.0", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "dev": true + }, + "v8-compile-cache": { + "version": "2.2.0", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "void-elements": { + "version": "2.0.1", + "dev": true + }, + "which": { + "version": "2.0.2", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "dev": true + }, + "workerpool": { + "version": "6.0.2", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "dev": true + }, + "ws": { + "version": "7.4.3", + "dev": true, + "requires": {} + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs-parser": { + "version": "18.1.3", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "2.0.0", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "dev": true + } + } + }, + "yauzl": { + "version": "2.10.0", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "dev": true + } + } +} diff --git a/package.json b/package.json index 185a182..8f693f2 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@adobe/eslint-config-helix": "1.1.3", "chai": "4.2.0", - "eslint": "7.15.0", + "eslint": "^7.15.0", "eslint-plugin-header": "3.1.0", "eslint-plugin-import": "2.22.1", "fs-extra": "9.0.1", diff --git a/scripts/scripts.js b/scripts/scripts.js index 9954bbe..ef73167 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -58,68 +58,18 @@ function tableToDivs($table, cols) { } function getLocale(url) { - const locale=url.pathname.split('/')[1]; + const locale = url.pathname.split('/')[1]; if (/^[a-z-]{2}(-[a-zA-Z-]*)?-[A-Z]{2}$/.test(locale)) { return locale; } return 'en-US'; } -async function fetchBlueprint(pathname) { - if (window.spark.$blueprint) { - return (window.spark.$blueprint) - } - - const bpPath = pathname.substr(pathname.indexOf('/',1)).split('.')[0]; - const resp = await fetch(`${bpPath}.plain.html`); - console.log ('fetching...'); - const body = await resp.text(); - const $main=createTag('main'); - $main.innerHTML = body; - decorateTables($main); - window.spark.$blueprint = $main; - return ($main); -} - -async function decorateTemplateLists() { - const $templateLists=Array.from(document.querySelectorAll('main .template-list')); - for (let i = 0; i < $templateLists.length; i+=1) { - const $block = $templateLists[i]; - console.log('template-lists'); - const rows = $block.children.length; - const locale = getLocale(window.location); - if (rows == 0 && locale !== 'en-US') { - const $blueprint = await fetchBlueprint(window.location.pathname); - $block.innerHTML = $blueprint.querySelectorAll(`.template-list`)[i].innerHTML; - } - } - - /* --- inherit hero image, this should go somewhere else --- */ - const $heroPicture = document.querySelector('.hero-bg'); - console.log($heroPicture); - console.log(window.spark.$blueprint); - - if (!$heroPicture && window.spark.$blueprint) { - const $bpHeroImage = window.spark.$blueprint.querySelector('div:first-of-type img'); - console.log($bpHeroImage); - if ($bpHeroImage) { - const $heroSection = document.querySelector('main .hero'); - const $heroDiv = document.querySelector('main .hero > div'); - const $p = createTag('p'); - const $pic = createTag('picture', {class: 'hero-bg'}); - $pic.appendChild($bpHeroImage); - $p.append($pic); - - $heroSection.classList.remove('hero-noimage'); - $heroDiv.prepend($p); - } - } -} - function decorateTables($root) { - let prefix = '' + let prefix = ''; if (!$root) { prefix = 'main'; + // eslint-disable-next-line no-param-reassign $root = document; } $root.querySelectorAll(`${prefix} div>table`).forEach(($table) => { @@ -159,6 +109,23 @@ function decoratePictures() { } } +async function fetchBlueprint(pathname) { + if (window.spark.$blueprint) { + return (window.spark.$blueprint); + } + + const bpPath = pathname.substr(pathname.indexOf('/', 1)).split('.')[0]; + const resp = await fetch(`${bpPath}.plain.html`); + // eslint-disable-next-line no-console + console.log('fetching...'); + const body = await resp.text(); + const $main = createTag('main'); + $main.innerHTML = body; + decorateTables($main); + window.spark.$blueprint = $main; + return ($main); +} + function decorateDoMoreEmbed() { document.querySelectorAll('div.embed-internal-domore > div').forEach(($domore) => { const $ps = $domore.querySelectorAll(':scope>p'); @@ -277,7 +244,7 @@ function loadScript(url, callback, type) { const $head = document.querySelector('head'); const $script = createTag('script', { src: url }); if (type) { - $script.setAttribute('type',type); + $script.setAttribute('type', type); } $head.append($script); $script.onload = callback; @@ -392,15 +359,48 @@ function decorateBlogPosts() { }); } +async function decorateTemplateLists() { + const $templateLists = Array.from(document.querySelectorAll('main .template-list')); + for (let i = 0; i < $templateLists.length; i += 1) { + const $block = $templateLists[i]; + const rows = $block.children.length; + const locale = getLocale(window.location); + if (rows === 0 && locale !== 'en-US') { + // eslint-disable-next-line no-await-in-loop + const $blueprint = await fetchBlueprint(window.location.pathname); + $block.innerHTML = $blueprint.querySelectorAll('.template-list')[i].innerHTML; + } + } + + /* --- inherit hero image, this should go somewhere else --- */ + const $heroPicture = document.querySelector('.hero-bg'); + + if (!$heroPicture && window.spark.$blueprint) { + const $bpHeroImage = window.spark.$blueprint.querySelector('div:first-of-type img'); + if ($bpHeroImage) { + const $heroSection = document.querySelector('main .hero'); + const $heroDiv = document.querySelector('main .hero > div'); + const $p = createTag('p'); + const $pic = createTag('picture', { class: 'hero-bg' }); + $pic.appendChild($bpHeroImage); + $p.append($pic); + + $heroSection.classList.remove('hero-noimage'); + $heroDiv.prepend($p); + } + } +} + function postLCP() { + const martechUrl = '/scripts/martech.js'; decorateAnimations(); loadCSS('/styles/lazy-styles.css'); loadLazyFooter(); - if (window.location.search !== '?nomartech') { - let ms=2000; - const usp=new URLSearchParams(window.location.search); - const delay=usp.get('delay'); - if (delay) ms=+delay; + if (!(window.location.search === '?nomartech' || document.querySelector(`head script[src="${martechUrl}"]`))) { + let ms = 2000; + const usp = new URLSearchParams(window.location.search); + const delay = usp.get('delay'); + if (delay) ms = +delay; setTimeout(() => { loadScript('/scripts/martech.js', null, 'module'); }, ms); @@ -433,9 +433,6 @@ function decorateHero() { if ($heroPicture) { $heroPicture.classList.add('hero-bg'); const $heroImage = $heroPicture.querySelector('img'); - // eslint-disable-next-line no-console - console.log($heroImage); - if ($heroImage.complete) { postLCP(); } else { @@ -613,10 +610,28 @@ function decorateHowTo() { }); } -async function decorateABTests() { +async function checkTesting(url) { + const pathname = new URL(url).pathname.split('.')[0]; + const resp = await fetch('/testing.json'); + const json = await resp.json(); + const matches = json.data.filter((test) => { + const testPath = new URL(test['Test URLs']).pathname.split('.')[0]; + return testPath === pathname; + }); + + return (!!matches.length); +} + +async function decorateTesting() { let runTest = true; let reason = ''; + if (await checkTesting(window.location.href)) { + // eslint-disable-next-line no-console + console.log('rushing martech'); + loadScript('/scripts/martech.js', null, 'module'); + } + if (!window.location.host.includes('adobe.com')) { runTest = false; reason = 'not prod host'; @@ -677,7 +692,7 @@ async function decorateABTests() { } } else { // eslint-disable-next-line no-console - console.log(`Test is not run => ${reason}`); + // console.log(`Test is not run => ${reason}`); } } function playYouTubeVideo(vid, $element) { @@ -923,7 +938,7 @@ function decorateMetaData() { } async function decoratePage() { - await decorateABTests(); + await decorateTesting(); decoratePictures(); decorateTables(); wrapSections('main>div'); @@ -941,7 +956,7 @@ async function decoratePage() { decorateDoMoreEmbed(); } -window.spark={}; +window.spark = {}; decoratePage(); export { loadScript as default }; From 942757095f07f297929751190eda4ccfd4e521b7 Mon Sep 17 00:00:00 2001 From: rofe Date: Mon, 1 Mar 2021 15:38:37 +0100 Subject: [PATCH 012/649] chore: linting --- scripts/scripts.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/scripts.js b/scripts/scripts.js index ef73167..58833dc 100644 --- a/scripts/scripts.js +++ b/scripts/scripts.js @@ -624,7 +624,7 @@ async function checkTesting(url) { async function decorateTesting() { let runTest = true; - let reason = ''; + // let reason = ''; if (await checkTesting(window.location.href)) { // eslint-disable-next-line no-console @@ -634,18 +634,18 @@ async function decorateTesting() { if (!window.location.host.includes('adobe.com')) { runTest = false; - reason = 'not prod host'; + // reason = 'not prod host'; } if (window.location.hash) { runTest = false; - reason = 'suppressed by #'; + // reason = 'suppressed by #'; } if (window.location.search === '?test') { runTest = true; } if (navigator.userAgent.match(/bot|crawl|spider/i)) { runTest = false; - reason = 'bot detected'; + // reason = 'bot detected'; } if (runTest) { From 813cc539ad5aca1b8023002014e801ad0ecdbbbc Mon Sep 17 00:00:00 2001 From: rofe Date: Mon, 1 Mar 2021 17:26:32 +0100 Subject: [PATCH 013/649] refactor: wip --- express/blocks/animation/animation.js | 67 ++++++++++ {icons => express/icons}/spark.svg | 0 {icons => express/icons}/user.svg | 0 {scripts => express/scripts}/filter.js | 0 {scripts => express/scripts}/martech.js | 0 {scripts => express/scripts}/scripts.js | 143 +++------------------ {styles => express/styles}/lazy-styles.css | 0 {styles => express/styles}/styles.css | 0 head.html | 6 +- 9 files changed, 91 insertions(+), 125 deletions(-) create mode 100644 express/blocks/animation/animation.js rename {icons => express/icons}/spark.svg (100%) rename {icons => express/icons}/user.svg (100%) rename {scripts => express/scripts}/filter.js (100%) rename {scripts => express/scripts}/martech.js (100%) rename {scripts => express/scripts}/scripts.js (87%) rename {styles => express/styles}/lazy-styles.css (100%) rename {styles => express/styles}/styles.css (100%) diff --git a/express/blocks/animation/animation.js b/express/blocks/animation/animation.js new file mode 100644 index 0000000..6039506 --- /dev/null +++ b/express/blocks/animation/animation.js @@ -0,0 +1,67 @@ +/* + * Copyright 2021 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. + */ +/* global document */ + +import { + createTag, + loadCSS, +} from '../../scripts/scripts'; + +export default function decorate($block) { + document.querySelectorAll('.animation a[href], .video a[href]').forEach(($a) => { + const href = $a.getAttribute('href'); + const url = new URL(href); + const helixId = url.pathname.split('/')[2]; + const $parent = $a.parentNode; + + if (href.endsWith('.mp4')) { + const isAnimation = !!$a.closest('.animation'); + // const isAnimation = true; + + let attribs = { controls: '' }; + if (isAnimation) { + attribs = { + playsinline: '', autoplay: '', loop: '', muted: '', + }; + } + const $poster = $a.closest('div').querySelector('img'); + if ($poster) { + attribs.poster = $poster.src; + $poster.remove(); + } + + const $video = createTag('video', attribs); + /* + if (href.startsWith('https://hlx.blob.core.windows.net/external/')) { + href='/hlx_'+href.split('/')[4].replace('#image',''); + } + */ + $video.innerHTML = ``; + $a.parentNode.replaceChild($video, $a); + if (isAnimation) { + $video.addEventListener('canplay', () => { + $video.muted = true; + $video.play(); + }); + } + } + + if (href.endsWith('.gif')) { + $a.parentNode.replaceChild(createTag('img', { src: `/hlx_${helixId}.gif` }), $a); + } + + const $next = $parent.nextElementSibling; + if ($next && $next.tagName === 'P' && $next.innerHTML.trim().startsWith('')) { + $next.classList.add('legend'); + } + }); +} diff --git a/icons/spark.svg b/express/icons/spark.svg similarity index 100% rename from icons/spark.svg rename to express/icons/spark.svg diff --git a/icons/user.svg b/express/icons/user.svg similarity index 100% rename from icons/user.svg rename to express/icons/user.svg diff --git a/scripts/filter.js b/express/scripts/filter.js similarity index 100% rename from scripts/filter.js rename to express/scripts/filter.js diff --git a/scripts/martech.js b/express/scripts/martech.js similarity index 100% rename from scripts/martech.js rename to express/scripts/martech.js diff --git a/scripts/scripts.js b/express/scripts/scripts.js similarity index 87% rename from scripts/scripts.js rename to express/scripts/scripts.js index 58833dc..2432cf6 100644 --- a/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -15,7 +15,7 @@ function toClassName(name) { return (name.toLowerCase().replace(/[^0-9a-z]/gi, '-')); } -function createTag(name, attrs) { +export function createTag(name, attrs) { const el = document.createElement(name); if (typeof attrs === 'object') { for (const [key, value] of Object.entries(attrs)) { @@ -35,28 +35,6 @@ function wrapSections(element) { }); } -function tableToDivs($table, cols) { - const $rows = $table.querySelectorAll('tbody tr'); - const $cards = createTag('div', { class: `${cols.join('-')} block` }); - $rows.forEach(($tr) => { - const $card = createTag('div'); - $tr.querySelectorAll('td').forEach(($td, i) => { - const $div = createTag('div', cols.length > 1 ? { class: cols[i] } : {}); - $div.innerHTML = $td.innerHTML; - $div.childNodes.forEach(($child) => { - if ($child.nodeName === '#text') { - const $p = createTag('p'); - $p.innerHTML = $child.nodeValue; - $child.parentElement.replaceChild($p, $child); - } - }); - $card.append($div); - }); - $cards.append($card); - }); - return ($cards); -} - function getLocale(url) { const locale = url.pathname.split('/')[1]; if (/^[a-z-]{2}(-[a-zA-Z-]*)?-[A-Z]{2}$/.test(locale)) { @@ -65,24 +43,6 @@ function getLocale(url) { return 'en-US'; } -function decorateTables($root) { - let prefix = ''; - if (!$root) { - prefix = 'main'; - // eslint-disable-next-line no-param-reassign - $root = document; - } - $root.querySelectorAll(`${prefix} div>table`).forEach(($table) => { - const $cols = $table.querySelectorAll('thead tr th'); - let cols = Array.from($cols).map((e) => toClassName(e.textContent)).filter((e) => (!!e)); - let $div = {}; - /* workaround for import */ - if (cols.length === 0) cols = ['template-list']; - $div = tableToDivs($table, cols); - $table.parentNode.replaceChild($div, $table); - }); -} - function addDivClasses($element, selector, classes) { const $children = $element.querySelectorAll(selector); $children.forEach(($div, i) => { @@ -97,18 +57,6 @@ function decorateHeader() { $header.querySelector('.susi a').classList.add('button'); } -function decoratePictures() { - if (!document.querySelector('picture')) { - const helixImages = document.querySelectorAll('main img[src^="/hlx_"'); - helixImages.forEach(($img) => { - const $pic = createTag('picture'); - const $parent = $img.parentNode; - $pic.appendChild($img); - $parent.appendChild($pic); - }); - } -} - async function fetchBlueprint(pathname) { if (window.spark.$blueprint) { return (window.spark.$blueprint); @@ -121,7 +69,6 @@ async function fetchBlueprint(pathname) { const body = await resp.text(); const $main = createTag('main'); $main.innerHTML = body; - decorateTables($main); window.spark.$blueprint = $main; return ($main); } @@ -157,9 +104,9 @@ function decorateCheckerBoards() { } function decorateBlocks() { - document.querySelectorAll('div.block').forEach(($block) => { + document.querySelectorAll('main > div > div').forEach(async ($block) => { const classes = Array.from($block.classList.values()); - const blockName = classes[0]; + let blockName = classes[0]; const $section = $block.closest('.section-wrapper'); if ($section) { $section.classList.add(`${blockName}-container`); @@ -167,61 +114,15 @@ function decorateBlocks() { const blocksWithOptions = ['checker-board']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { + blockName = b; const options = blockName.substring(b.length + 1).split('-'); $block.classList.add(b); $block.classList.add(...options); } }); - }); -} - -function decorateAnimations() { - document.querySelectorAll('.animation a[href], .video a[href]').forEach(($a) => { - const href = $a.getAttribute('href'); - const url = new URL(href); - const helixId = url.pathname.split('/')[2]; - const $parent = $a.parentNode; - - if (href.endsWith('.mp4')) { - const isAnimation = !!$a.closest('.animation'); - // const isAnimation = true; - - let attribs = { controls: '' }; - if (isAnimation) { - attribs = { - playsinline: '', autoplay: '', loop: '', muted: '', - }; - } - const $poster = $a.closest('div').querySelector('img'); - if ($poster) { - attribs.poster = $poster.src; - $poster.remove(); - } - - const $video = createTag('video', attribs); - /* - if (href.startsWith('https://hlx.blob.core.windows.net/external/')) { - href='/hlx_'+href.split('/')[4].replace('#image',''); - } - */ - $video.innerHTML = ``; - $a.parentNode.replaceChild($video, $a); - if (isAnimation) { - $video.addEventListener('canplay', () => { - $video.muted = true; - $video.play(); - }); - } - } - - if (href.endsWith('.gif')) { - $a.parentNode.replaceChild(createTag('img', { src: `/hlx_${helixId}.gif` }), $a); - } - - const $next = $parent.nextElementSibling; - if ($next && $next.tagName === 'P' && $next.innerHTML.trim().startsWith('')) { - $next.classList.add('legend'); - } + $block.classList.add('block'); + import(`/express/blocks/${blockName}/${blockName}`).then((fn) => fn($block, blockName)); + loadCSS(`/express/blocks/${blockName}/${blockName}.css`); }); } @@ -229,18 +130,20 @@ function decorateAnimations() { * Loads a CSS file. * @param {string} href The path to the CSS file */ -function loadCSS(href) { - const link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('href', href); - link.onload = () => { - }; - link.onerror = () => { - }; - document.head.appendChild(link); -} - -function loadScript(url, callback, type) { +export function loadCSS(href) { + if (!document.querySelector(`head > link[href="${href}"]`)) { + const link = document.createElement('link'); + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('href', href); + link.onload = () => { + }; + link.onerror = () => { + }; + document.head.appendChild(link); + } +} + +export function loadScript(url, callback, type) { const $head = document.querySelector('head'); const $script = createTag('script', { src: url }); if (type) { @@ -939,8 +842,6 @@ function decorateMetaData() { async function decoratePage() { await decorateTesting(); - decoratePictures(); - decorateTables(); wrapSections('main>div'); decorateHeader(); decorateHero(); @@ -958,5 +859,3 @@ async function decoratePage() { window.spark = {}; decoratePage(); - -export { loadScript as default }; diff --git a/styles/lazy-styles.css b/express/styles/lazy-styles.css similarity index 100% rename from styles/lazy-styles.css rename to express/styles/lazy-styles.css diff --git a/styles/styles.css b/express/styles/styles.css similarity index 100% rename from styles/styles.css rename to express/styles/styles.css diff --git a/head.html b/head.html index cf5c52f..e99af15 100644 --- a/head.html +++ b/head.html @@ -1,4 +1,4 @@ - + - - + + From bbdac6e5c3c6e1e895764dd5114e5cdac438fb03 Mon Sep 17 00:00:00 2001 From: rofe Date: Mon, 1 Mar 2021 18:02:11 +0100 Subject: [PATCH 014/649] refactor: working checker-board --- .../blocks/checker-board/checker-board.css | 38 ++++++++++++++++++ express/blocks/checker-board/checker-board.js | 23 +++++++++++ express/scripts/scripts.js | 32 ++++++--------- express/styles/lazy-styles.css | 39 ++++++------------- 4 files changed, 84 insertions(+), 48 deletions(-) create mode 100644 express/blocks/checker-board/checker-board.css create mode 100644 express/blocks/checker-board/checker-board.js diff --git a/express/blocks/checker-board/checker-board.css b/express/blocks/checker-board/checker-board.css new file mode 100644 index 0000000..a2df37a --- /dev/null +++ b/express/blocks/checker-board/checker-board.css @@ -0,0 +1,38 @@ +/* + * Copyright 2021 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. + */ + +main .checker-board-dark-container { + background-color: black; + color: white; +} + +@media (min-width: 800px) { + + main .checker-board { + max-width: 900px; + } + + main .checker-board > div { + display: flex; + } + + main .checker-board > div:nth-child(odd) { + flex-direction: row-reverse; + } + + main .checker-board > div > div{ + width: 50%; + padding: 20px; + text-align: left; + } +} + diff --git a/express/blocks/checker-board/checker-board.js b/express/blocks/checker-board/checker-board.js new file mode 100644 index 0000000..1557c29 --- /dev/null +++ b/express/blocks/checker-board/checker-board.js @@ -0,0 +1,23 @@ +/* + * Copyright 2021 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. + */ +/* global window */ + +export default function decorateCheckerBoards($block) { + const blobPrefix = 'https://hlx.blob.core.windows.net/external/'; + const $a = $block.querySelector(`a[href^="${blobPrefix}`); + if ($a.href.endsWith('.mp4')) { + const hostPrefix = window.location.hostname.includes('localhost') ? 'https://spark-website--adobe.hlx.live' : ''; + const $cell = $a.closest('div'); + const vid = $a.href.substring(blobPrefix.length).split('#')[0]; + $cell.innerHTML = ``; + } +} diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 2432cf6..54124ad 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -91,20 +91,8 @@ function decorateDoMoreEmbed() { }); } -function decorateCheckerBoards() { - const blobPrefix = 'https://hlx.blob.core.windows.net/external/'; - document.querySelectorAll(`div.checker-board a[href^="${blobPrefix}`).forEach(($a) => { - if ($a.href.endsWith('.mp4')) { - const hostPrefix = window.location.hostname.includes('localhost') ? 'https://spark-website--adobe.hlx.live' : ''; - const $cell = $a.closest('div'); - const vid = $a.href.substring(blobPrefix.length).split('#')[0]; - $cell.innerHTML = ``; - } - }); -} - function decorateBlocks() { - document.querySelectorAll('main > div > div').forEach(async ($block) => { + document.querySelectorAll('main div.section-wrapper > div > div').forEach(async ($block) => { const classes = Array.from($block.classList.values()); let blockName = classes[0]; const $section = $block.closest('.section-wrapper'); @@ -114,14 +102,20 @@ function decorateBlocks() { const blocksWithOptions = ['checker-board']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { - blockName = b; const options = blockName.substring(b.length + 1).split('-'); + blockName = b; $block.classList.add(b); $block.classList.add(...options); } }); $block.classList.add('block'); - import(`/express/blocks/${blockName}/${blockName}`).then((fn) => fn($block, blockName)); + import(`/express/blocks/${blockName}/${blockName}.js`) + .then((mod) => { + console.log(blockName, mod); + mod.default($block, blockName); + }) + .catch((err) => console.log('failed to load module', err)); + loadCSS(`/express/blocks/${blockName}/${blockName}.css`); }); } @@ -295,9 +289,9 @@ async function decorateTemplateLists() { } function postLCP() { - const martechUrl = '/scripts/martech.js'; - decorateAnimations(); - loadCSS('/styles/lazy-styles.css'); + const martechUrl = '/express/scripts/martech.js'; + loadCSS('/express/styles/lazy-styles.css'); + decorateBlocks(); loadLazyFooter(); if (!(window.location.search === '?nomartech' || document.querySelector(`head script[src="${martechUrl}"]`))) { let ms = 2000; @@ -845,7 +839,6 @@ async function decoratePage() { wrapSections('main>div'); decorateHeader(); decorateHero(); - decorateBlocks(); decorateTemplate(); decorateButtons(); decorateHowTo(); @@ -853,7 +846,6 @@ async function decoratePage() { decorateBlogPage(); decorateTutorials(); decorateMetaData(); - decorateCheckerBoards(); decorateDoMoreEmbed(); } diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index 65e68c1..9714402 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -1,3 +1,14 @@ +/* + * Copyright 2021 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. + */ @import "/hlx_fonts/pnv6nym.css"; /* below the fold */ @@ -272,11 +283,6 @@ main .steps > div { align-items: center; } -main .checker-board-dark-container { - background-color: black; - color: white; -} - main .embed-internal-domore h2::after { content: ' \25BC'; } @@ -299,29 +305,6 @@ main .embed-internal-domore .actions.open { flex-wrap: wrap; } - - -@media (min-width: 800px) { - - main .checker-board { - max-width: 900px; - } - - main .checker-board > div { - display: flex; - } - - main .checker-board > div:nth-child(odd) { - flex-direction: row-reverse; - } - - main .checker-board > div > div{ - width: 50%; - padding: 20px; - text-align: left; - } -} - main .blog-posts .card { display: flex; flex-direction: column; From e656b2fc9cfef34fbd604b10f7ce86db6448f470 Mon Sep 17 00:00:00 2001 From: rofe Date: Mon, 1 Mar 2021 18:17:44 +0100 Subject: [PATCH 015/649] chore: eslint config --- .eslintrc.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.js b/.eslintrc.js index bd0fdb3..a4af3b1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,6 +16,7 @@ module.exports = { rules: { // allow reassigning param 'no-param-reassign': [2, { props: false }], + allowImportExportEverywhere: true, }, parserOptions: { sourceType: 'module', From cf9e1d1360b2a0e68a0a992f31da831e6460da3e Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 2 Mar 2021 14:37:16 -0800 Subject: [PATCH 016/649] chore: remove header.md --- header.md | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 header.md diff --git a/header.md b/header.md deleted file mode 100644 index ef58dc8..0000000 --- a/header.md +++ /dev/null @@ -1,3 +0,0 @@ -:spark: Adobe Spark - -[Start now for free](https://adobesparkpost.app.link/g8sk4xb8AV) \ No newline at end of file From cc8e8f289aec276090b8a86affe6f4ce5186747b Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 2 Mar 2021 17:00:01 -0800 Subject: [PATCH 017/649] feat: add gnav placeholder --- express/gnav-placeholder/adobe-logo.svg | 1 + express/scripts/scripts.js | 38 +++++- express/styles/styles.css | 172 ++++++++++++++++++++++-- 3 files changed, 194 insertions(+), 17 deletions(-) create mode 100644 express/gnav-placeholder/adobe-logo.svg diff --git a/express/gnav-placeholder/adobe-logo.svg b/express/gnav-placeholder/adobe-logo.svg new file mode 100644 index 0000000..4ff23be --- /dev/null +++ b/express/gnav-placeholder/adobe-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 54124ad..55b6aff 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -52,9 +52,41 @@ function addDivClasses($element, selector, classes) { function decorateHeader() { const $header = document.querySelector('header'); - const classes = ['logo', 'susi']; - addDivClasses($header, ':scope>p', classes); - $header.querySelector('.susi a').classList.add('button'); + + /* init header with placeholder */ + + $header.innerHTML = ` + - \ No newline at end of file + diff --git a/test/unit/blocks/expected/template-list.linkwithtext.block.html b/test/unit/blocks/expected/template-list.linkwithtext.block.html index 043b687..970accf 100644 --- a/test/unit/blocks/expected/template-list.linkwithtext.block.html +++ b/test/unit/blocks/expected/template-list.linkwithtext.block.html @@ -3,11 +3,11 @@
- +
- \ No newline at end of file + diff --git a/test/unit/blocks/input/link-image.basic.doc.html b/test/unit/blocks/input/link-image.basic.doc.html index ca22230..b23db8f 100644 --- a/test/unit/blocks/input/link-image.basic.doc.html +++ b/test/unit/blocks/input/link-image.basic.doc.html @@ -5,9 +5,9 @@

+ srcset="./media_35ddae1c71c67d8605c37871b8881af5d29c6acc.png?width=750&auto=webp&format=pjpg&optimize=medium">

@@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/test/unit/blocks/input/link-image.nolinebreaks.doc.html b/test/unit/blocks/input/link-image.nolinebreaks.doc.html index 27c26c7..310ece3 100644 --- a/test/unit/blocks/input/link-image.nolinebreaks.doc.html +++ b/test/unit/blocks/input/link-image.nolinebreaks.doc.html @@ -4,13 +4,13 @@
+ srcset="./media_35ddae1c71c67d8605c37871b8881af5d29c6acc.png?width=750&auto=webp&format=pjpg&optimize=medium">

https://spark.adobe.com/video/FZXqFDNFog5qY

- \ No newline at end of file + diff --git a/test/unit/blocks/input/template-list.linkedimage.doc.html b/test/unit/blocks/input/template-list.linkedimage.doc.html index df9425b..2b26fdb 100644 --- a/test/unit/blocks/input/template-list.linkedimage.doc.html +++ b/test/unit/blocks/input/template-list.linkedimage.doc.html @@ -4,8 +4,8 @@ - \ No newline at end of file + diff --git a/test/unit/blocks/input/template-list.linknotext.doc.html b/test/unit/blocks/input/template-list.linknotext.doc.html index 70a1903..6d52615 100644 --- a/test/unit/blocks/input/template-list.linknotext.doc.html +++ b/test/unit/blocks/input/template-list.linknotext.doc.html @@ -5,9 +5,9 @@

+ srcset="./media_ce75b319cd2e8be003380efa8d1328cd487b5147.jpeg?width=750&auto=webp&format=pjpg&optimize=medium"> fashion blogging pinterest

@@ -19,13 +19,13 @@
+ srcset="./media_eb57d2ec8a43fec8eced3954657c789dca7ed3ec.png?width=750&auto=webp&format=pjpg&optimize=medium"> Edit this Template https://adobesparkvideo.app.link/NdKoobyZJ5
- \ No newline at end of file + diff --git a/test/unit/blocks/input/template-list.linkwithtext.doc.html b/test/unit/blocks/input/template-list.linkwithtext.doc.html index 8ff5e8c..336c8e2 100644 --- a/test/unit/blocks/input/template-list.linkwithtext.doc.html +++ b/test/unit/blocks/input/template-list.linkwithtext.doc.html @@ -4,13 +4,13 @@
+ srcset="./media_db4475e541730b568d5f2017d1fb173810aee768.png?width=750&auto=webp&format=pjpg&optimize=medium">
- \ No newline at end of file + diff --git a/test/unit/blocks/input/template-list.video.doc.html b/test/unit/blocks/input/template-list.video.doc.html index 1932a8b..7f15380 100644 --- a/test/unit/blocks/input/template-list.video.doc.html +++ b/test/unit/blocks/input/template-list.video.doc.html @@ -4,9 +4,9 @@
+ srcset="./media_d03b8151a4aec84e5a9471e80a333804fe6f896f.jpeg?width=750&auto=webp&format=pjpg&optimize=medium"> Gray Mens Fashion Store Ad Instagram Story with Fashion Model Animation @@ -14,4 +14,4 @@
- \ No newline at end of file + From dadf7e71760ecea430348f62685ec45230dfc8a8 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Sat, 27 Mar 2021 10:23:34 +0900 Subject: [PATCH 266/649] chore(doc): Update express/styles/styles.css Co-authored-by: Alexandre Capt --- express/styles/styles.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 22a4f97..fffba00 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -189,7 +189,7 @@ a.button:any-link { text-decoration: none; border-radius: 18px; padding: 5px 1.2em 7px 1.2em; - /*outline: none; (keep outline for a11n */ + /*outline: none; (keep outline for a11n) */ text-align: center; line-height: 20px; font-size: 1rem; @@ -667,4 +667,3 @@ main .page-list-container, main .page-list { height: 100vh; transition: opacity 100ms; } - From 21c8c0ebba797d49dc7d3b7e92193c2673ce1ac6 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Sat, 27 Mar 2021 13:04:37 +0900 Subject: [PATCH 267/649] fix(a11y): ensure that templates are keyboard selectable fixes #36 fixes #64 --- .../blocks/template-list/template-list.css | 45 +++++++++---------- express/blocks/template-list/template-list.js | 32 ++++++++++++- express/scripts/scripts.js | 15 ++++--- 3 files changed, 60 insertions(+), 32 deletions(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index b2157ed..a1c98bf 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -8,7 +8,7 @@ main .template-list { text-align: left; } -main .template-list a:any-link { +main .template-list .template-link { text-decoration: none; color: #1473E6; padding-left: 16px; @@ -16,11 +16,7 @@ main .template-list a:any-link { display: flex; } -main .template-list > div > div:first-child > a:any-link { - padding-left: 0; -} - -main .template-list div > div:nth-child(2) a:any-link::after { +main .template-list .template-link::after { display: flex; width: 6px; height: 6px; @@ -38,11 +34,11 @@ main .template-list div > div:nth-child(2) a:any-link::after { margin-right: 2.25px; } -main .template-list > div p { +main .template-list .template p { margin: 0; } -main .template-list > div { +main .template-list .template { display: flex; flex-direction: column; width: 300px; @@ -51,25 +47,29 @@ main .template-list > div { -webkit-column-break-inside: avoid; page-break-inside: avoid; break-inside: avoid; + text-decoration: unset; } +main .template-list .template > div:first-child > a:any-link { + padding-left: 0; +} -main .template-list > div img, main .template-list > div video { +main .template-list .template img, main .template-list .template video { border-radius: 10px; width: 300px; } -main .template-list.large > div { +main .template-list.large .template { width: 100%; margin: 0; border: 0; } -main .template-list.large > div > div { +main .template-list.large .template > div { margin: auto; } -main .template-list.large > div img { +main .template-list.large .template img { width: 100%; } @@ -78,23 +78,22 @@ main .template-list + .button-container > a { } -main .template-list.masonry > div { - margin-top: 0px; +main .template-list.masonry .template { + margin-top: 0; + margin-bottom: 32px; padding: 0; - margin-bottom: 0; - padding-bottom: 32px; } @media (min-width: 600px) { - main .template-list > div { + main .template-list .template { width: 240px; margin: 12px; } - - main .template-list > div img { + + main .template-list .template img { width: 240px; } - + main .template-list.masonry { display: block; columns: 240px 2; @@ -148,13 +147,13 @@ main .template-list.masonry > div { flex-wrap: nowrap; } - main .columns .template-list > div { + main .columns .template-list .template { justify-content: flex-start; min-width: 132px; } - main .columns .template-list a:any-link { + main .columns .template-list .template-link { font-size: 0.875rem; font-weight: 500;; } -} \ No newline at end of file +} diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 472e280..d847842 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -51,8 +51,8 @@ async function decorateTemplateList($block) { } const $heroPicture = document.querySelector('.hero-bg'); - if (!$heroPicture && window.spark.$blueprint) { - const $bpHeroImage = window.spark.$blueprint.querySelector('div:first-of-type img'); + if (!$heroPicture && $blueprint) { + const $bpHeroImage = $blueprint.querySelector('div:first-of-type img'); if ($bpHeroImage) { const $heroSection = document.querySelector('main .hero'); const $heroDiv = document.querySelector('main .hero > div'); @@ -77,6 +77,34 @@ async function decorateTemplateList($block) { $block.classList.add('large'); } + // find the edit link and turn the template DIV into the A + // A + // +- DIV + // +- PICTURE + // +- DIV + // +- SPAN + // +- "Edit this template" + // + // make copy of children to avoid modifying list while looping + for (const $tmplt of Array.from($block.children)) { + const $link = $tmplt.querySelector(':scope > div:last-of-type > a'); + if ($link) { + const $a = createTag('a', { + href: $link.href || '#', + class: 'template', + }); + $a.append(...$tmplt.childNodes); + $block.append($a); + + // convert A to SPAN + const $newLink = createTag('span', { class: 'template-link' }); + $newLink.append(...$link.childNodes); + $link.parentNode.append($newLink); + $link.remove(); + } + } + + // wrap "linked images" with link $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { const $parent = $a.closest('div'); if (!$a.href.includes('.mp4')) { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 9084c36..85a98c4 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -63,13 +63,14 @@ export function getIconElement(icon) { export function linkImage($elem) { const $a = $elem.querySelector('a'); - const $parent = $a.closest('div'); - $a.remove(); - const picture = $parent.innerHTML; - $parent.innerHTML = ''; - $parent.appendChild($a); - $a.innerHTML = picture; - $a.className = ''; + if ($a) { + const $parent = $a.closest('div'); + $a.remove(); + $a.className = ''; + $a.innerHTML = ''; + $a.append(...$parent.childNodes); + $parent.append($a); + } } function wrapSections(element) { From 1de45c7b8f2445b7553432a99285e26cb9b609d1 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Sat, 27 Mar 2021 13:36:51 +0900 Subject: [PATCH 268/649] chore: fix video cards and adjust tests --- express/blocks/template-list/template-list.js | 54 +++++++++++-------- test/unit/blocks/blocks.test.js | 2 +- .../template-list.linkwithtext.block.html | 6 +-- .../expected/template-list.video.block.html | 6 +-- 4 files changed, 38 insertions(+), 30 deletions(-) diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index d847842..379febf 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -86,7 +86,7 @@ async function decorateTemplateList($block) { // +- "Edit this template" // // make copy of children to avoid modifying list while looping - for (const $tmplt of Array.from($block.children)) { + for (let $tmplt of Array.from($block.children)) { const $link = $tmplt.querySelector(':scope > div:last-of-type > a'); if ($link) { const $a = createTag('a', { @@ -94,6 +94,8 @@ async function decorateTemplateList($block) { class: 'template', }); $a.append(...$tmplt.childNodes); + $tmplt.remove(); + $tmplt = $a; $block.append($a); // convert A to SPAN @@ -102,30 +104,36 @@ async function decorateTemplateList($block) { $link.parentNode.append($newLink); $link.remove(); } - } - // wrap "linked images" with link - $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { - const $parent = $a.closest('div'); - if (!$a.href.includes('.mp4')) { - linkImage($parent); - } else { - const $picture = $parent.querySelector('picture'); - const $video = createTag('video', { - playsinline: '', - autoplay: '', - loop: '', - muted: '', - }); - $video.innerHTML = ``; - $parent.replaceChild($video, $picture); - $a.remove(); - $video.addEventListener('canplay', () => { - $video.muted = true; - $video.play(); - }); + // wrap "linked images" with link + const $imgLink = $tmplt.querySelector(':scope > div:first-of-type a'); + if ($imgLink) { + const $parent = $imgLink.closest('div'); + if (!$imgLink.href.includes('.mp4')) { + linkImage($parent); + } else { + const $picture = $tmplt.querySelector('picture'); + if ($picture) { + const $video = createTag('video', { + playsinline: '', + autoplay: '', + loop: '', + muted: '', + }); + $video.append(createTag('source', { + src: $imgLink.href, + type: 'video/mp4', + })); + $parent.replaceChild($video, $picture); + $imgLink.remove(); + $video.addEventListener('canplay', () => { + $video.muted = true; + $video.play(); + }); + } + } } - }); + } } export default function decorate($block) { diff --git a/test/unit/blocks/blocks.test.js b/test/unit/blocks/blocks.test.js index f9765b3..2b09474 100644 --- a/test/unit/blocks/blocks.test.js +++ b/test/unit/blocks/blocks.test.js @@ -67,7 +67,7 @@ describe('Block tests', () => { const mod = await import(`/express/blocks/${blockName}/${blockName}.js`); mod.default(block, blockName, doc); - expect(fragmentToString(expected)).to.be.equal(fragmentToString(block)); + expect(fragmentToString(block)).to.be.equal(fragmentToString(expected)); }); }); }); diff --git a/test/unit/blocks/expected/template-list.linkwithtext.block.html b/test/unit/blocks/expected/template-list.linkwithtext.block.html index 970accf..b092cf2 100644 --- a/test/unit/blocks/expected/template-list.linkwithtext.block.html +++ b/test/unit/blocks/expected/template-list.linkwithtext.block.html @@ -1,5 +1,5 @@
- +
Edit this template
+
diff --git a/test/unit/blocks/expected/template-list.video.block.html b/test/unit/blocks/expected/template-list.video.block.html index 17861ff..901b28b 100644 --- a/test/unit/blocks/expected/template-list.video.block.html +++ b/test/unit/blocks/expected/template-list.video.block.html @@ -1,10 +1,10 @@
- +
Edit this template
+
From 711ab833688ee730a7e8d73149e922ed47445aaf Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 09:21:14 -0700 Subject: [PATCH 269/649] feat: remove gnav jank --- express/scripts/martech.js | 41 ++++++++------ express/scripts/scripts.js | 46 +++++++++++---- express/styles/styles.css | 113 +++++++++++++++++++++++-------------- 3 files changed, 132 insertions(+), 68 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 8789de4..1123225 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -140,19 +140,6 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { // set some global and persistent data layer properties //------------------------------------------------------------------------------------ - w.fedsConfig = { - ...w.fedsConfig, - locale: language, - content: { - experience: 'cc-express/spark-gnav', - }, - profile: { - customSignIn: () => { - w.location.href = 'https://spark.adobe.com/sp'; - }, - }, - }; - w.adobeid = { client_id: 'spark-helix', scope: 'AdobeID,openid', @@ -439,8 +426,30 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); -loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js').id = 'feds-script'; +const locale = getLocale(window.location); -loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); +console.log(locale); -loadScript('https://www.adobe.com/marketingtech/main.min.js'); +window.fedsConfig = { + ...window.fedsConfig, + // locale, + content: { + experience: 'cc-express/spark-gnav', + }, + profile: { + customSignIn: () => { + window.location.href = 'https://spark.adobe.com/sp'; + }, + }, +}; + +loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js', () => { + setTimeout(() => { + const gnav = document.getElementById('feds-header'); + const placeholder = document.getElementById('header-placeholder'); + gnav.classList.add('appear'); + placeholder.classList.add('disappear'); + }, 500); +}).id = 'feds-script'; + +loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 9084c36..b7a2e2a 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -255,10 +255,14 @@ export function addBlockClasses($block, classNames) { function decorateHeaderAndFooter() { const $header = document.querySelector('header'); - /* init header with placeholder */ + /* init header */ + const locale = getLocale(window.location); - $header.innerHTML = ` -
+ if (locale === 'us') { + $header.innerHTML = ` +
+
+
@@ -269,12 +273,13 @@ function decorateHeaderAndFooter() {
- Creativity & Design -
-
- Spark - Learn & Support - Choose a plan + Adobe Spark + Features + Create + Discover + Learn + Compare plans + Start now
@@ -284,8 +289,29 @@ function decorateHeaderAndFooter() {
Sign In
+
`; + } else { + $header.innerHTML = ` +
- `; +
+
+
+ + +
+
+
+
+ +
+
+
+
+
+
+
`; + } document.querySelector('footer').innerHTML = ` diff --git a/express/styles/styles.css b/express/styles/styles.css index fffba00..6a1cd0e 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -14,7 +14,6 @@ body.appear { /* gnav placeholder */ header { - height: 64px; box-sizing: border-box; border-bottom: 1px solid #EAEAEA; height: 135px; @@ -22,13 +21,39 @@ header { background-repeat: no-repeat; background-size: auto 24px; background-position: bottom 24px center; + position: relative; +} + +#feds-header { + opacity: 0; +} + +#feds-header.appear { + opacity: 1; +} + +#header-placeholder { + height: 64px; + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 10; + -webkit-font-smoothing: antialiased; + border-bottom: 1px solid #EAEAEA; + transition: opacity 0.1s; + background-color: white; +} + +#header-placeholder.disappear { + display: none; } -header .desktop { +#header-placeholder .desktop { display: none; } -header .mobile { +#header-placeholder .mobile { display: flex; justify-content: space-between; align-items: center; @@ -38,50 +63,52 @@ header .mobile { color: #2c2c2c; } -header .mobile .hamburger { +#header-placeholder .mobile .hamburger { font-size: 19px; } -header .mobile .signin { +#header-placeholder .mobile .signin { font-size: 14px; } -header .mobile .logo img { - height: 24px; - width: 24px; - padding-left: 15px; +#header-placeholder .mobile .logo img { + height: 26px; + width: 26px; + padding-left: 17px; + transform: translate(0,3px); } -header .mobile .hamburger::before { +#header-placeholder .mobile .hamburger::before { content: "\2630"; } @media (min-width: 1200px) { - header .mobile { + #header-placeholder .mobile { display: none; } - header .desktop { + #header-placeholder .desktop { display: block; color: #2c2c2c; font-size: 14px; + max-width: 1440px; + margin: auto; } - header .desktop .top { + #header-placeholder .desktop .top { display: flex; justify-content: space-between; align-items: center; height: 64px; - border-bottom: 1px solid #EAEAEA; } - header .desktop .top .left { + #header-placeholder .desktop .top .left { display: flex; align-items: center; } - header .desktop .logo { + #header-placeholder .desktop .logo { width: 124px; box-sizing: border-box; padding-left: 21px; @@ -89,72 +116,74 @@ header .mobile .hamburger::before { font-weight: 600; } - header .desktop .logo img { + #header-placeholder .desktop .logo img { height: 24px; width: 24px; - padding-top: 4px; } - header .desktop .logo span { + #header-placeholder .desktop .logo span { color: #fa0f00; font-size: 18px; - padding-left: 12px; + padding-left: 10px; display: block; - padding-top: 3px; + padding-top: 0px; } - header .desktop .top .section { + #header-placeholder .desktop .top .section { border-left: 1px solid #EAEAEA; height: 64px; - padding: 0 8px; + padding: 0 8px 1px 7px; } - header .desktop .top .section span { + #header-placeholder .desktop .top .section span { padding: 0 12px; } - header .desktop .top .button { + #header-placeholder .desktop .top .button { font-size: 14px; - margin-left: 0; - padding: 5px 20px 7px 20px; - } + margin-left: 0px; + font-weight: 700; + padding: 6px 16px 6px 16px; + background-color: #1473e6; + } - header .desktop .top .selected { + #header-placeholder .desktop .top .selected { font-weight: 600; } - header .desktop .top .right { + #header-placeholder .desktop .top .right { padding: 0 10px; } - header .desktop .top .right > div { - padding: 0 5px; + #header-placeholder .desktop .top .right > div { + padding: 0px 6px 1px 6px; } - header .desktop .top .right > div.search { - padding: 2px 10px; + #header-placeholder .desktop .top .right > div.search { + padding: 6px 10px 2px 12px; + fill: currentColor; } - header .desktop .bottom { + #header-placeholder .desktop .bottom { color: #707070; padding: 10px 12px; font-size: 12px; } - header .desktop .bottom > span { + #header-placeholder .desktop .bottom > span { padding: 0 8px; } - header .desktop .drop { + #header-placeholder .desktop .drop { display: flex; align-items: center; } - header .desktop .drop::after { + #header-placeholder .desktop .drop::after { display: flex; - width: 6px; - height: 6px; + width: 5px; + height: 5px; border-top-width: 0; border-left-width: 0; border-bottom-width: 1px; @@ -169,12 +198,12 @@ header .mobile .hamburger::before { margin-right: 2.25px; } - header .desktop .top .right { + #header-placeholder .desktop .top .right { display: flex; align-items: center; } - header .desktop .top .left .section { + #header-placeholder .desktop .top .left .section { display: flex; align-items: center; } From 8d28085fb5bdf7a9279c11c6cc4fb1f78993ef13 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 11:47:57 -0700 Subject: [PATCH 270/649] fix: icon handler regression --- express/scripts/scripts.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index b7a2e2a..99bd879 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -42,6 +42,7 @@ function getMeta(name) { } export function getIcon(icon, alt = icon) { + console.log(icon); const symbols = ['adobe', 'adobe-red', 'facebook', 'instagram', 'pinterest', 'linkedin', 'twitter', 'youtube', 'discord', 'behance', 'creative-cloud', 'hamburger', 'adchoices', 'play', 'not-found', 'snapchat', 'learn', 'magicwand', @@ -58,7 +59,7 @@ export function getIcon(icon, alt = icon) { export function getIconElement(icon) { const $div = createTag('div'); $div.innerHTML = getIcon(icon); - return ($div.children[0]); + return ($div.firstChild); } export function linkImage($elem) { @@ -754,7 +755,7 @@ function fixIcons() { if (alt) { const lowerAlt = alt.toLowerCase(); if (lowerAlt.includes('icon:')) { - const icon = lowerAlt.split('icon:')[1].trim().split(' '); + const icon = lowerAlt.split('icon:')[1].trim().split(' ')[0]; const $picture = $img.closest('picture'); $picture.parentElement.replaceChild(getIconElement(icon), $picture); } From b33776f637742a40e01dc606017d3f5053658708 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 11:55:26 -0700 Subject: [PATCH 271/649] fix(pricing): remove jank from pricing --- express/blocks/pricing/pricing.css | 5 +++++ express/blocks/pricing/pricing.js | 2 ++ express/styles/styles.css | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index 89f40a9..3e6245b 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -16,6 +16,11 @@ flex-wrap: wrap; } + main .pricing.appear { + opacity: 1; + height: unset; + } + main .pricing .pricing-header { text-align: left!important; color: rgb(40, 70, 96); diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 9ac7f7c..9a62fd0 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -491,6 +491,8 @@ async function decoratePricing($block) { decorateHeader($block, header); decoratePlans($block, plans, planOptions); decorateTable($block, features); + + $block.classList.add('appear'); } export default function decorate($block) { diff --git a/express/styles/styles.css b/express/styles/styles.css index 6a1cd0e..381c432 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -696,3 +696,9 @@ main .page-list-container, main .page-list { height: 100vh; transition: opacity 100ms; } + +main .page-list-container, main .pricing { + opacity: 0; + height: 100vh; + transition: opacity 100ms; +} From b04f5b28676c2f34e40a5ba74259733b5cb3775c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 12:22:32 -0700 Subject: [PATCH 272/649] fix: parallel requests --- express/blocks/pricing/pricing.css | 10 +++++----- express/blocks/pricing/pricing.js | 28 ++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index 3e6245b..f73faea 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -1,3 +1,8 @@ +main .pricing.appear { + opacity: 1; + height: unset; +} + @media (min-width: 1200px) { main .pricing-container { @@ -16,11 +21,6 @@ flex-wrap: wrap; } - main .pricing.appear { - opacity: 1; - height: unset; - } - main .pricing .pricing-header { text-align: left!important; color: rgb(40, 70, 96); diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 9a62fd0..1ab213f 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -45,6 +45,13 @@ async function fetchFeatures(sheet) { return json.data; } +async function fetchPricingTab(sheet, tab) { + const url = `./${sheet}.json?sheet=${tab}`; + const resp = await fetch(url); + const json = await resp.json(); + return json.data; +} + function buildWordList(header) { const words = []; header.forEach((row) => { @@ -477,14 +484,27 @@ function decorateTable($block, features) { }); } +async function fetchPricingSheet(sheet) { + const data = {}; + const tabs = ['header', 'plans', 'plan-options', 'table']; + const names = ['header', 'plans', 'planOptions', 'features']; + await Promise.all(tabs.map(async (tab, i) => { + try { + data[names[i]] = await fetchPricingTab(sheet, tab); + } catch (e) { + // something went wrong + } + })); + return data; +} + async function decoratePricing($block) { const config = readBlockConfig($block); const { sheet } = config; - const header = await fetchHeader(sheet); - const plans = await fetchPlans(sheet); - const planOptions = await fetchPlanOptions(sheet); - const features = await fetchFeatures(sheet); + const { + header, plans, planOptions, features, + } = await fetchPricingSheet(sheet); $block.innerHTML = ''; From 9d3786c0cee01e34653123f240fe9dbe847ac737 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 15:49:09 -0700 Subject: [PATCH 273/649] feat: initial region picker --- express/scripts/martech.js | 45 ++++++++++++++++++++++++++++++---- express/scripts/scripts.js | 14 ++++++++++- express/styles/lazy-styles.css | 29 ++++++++++++++++++++++ express/styles/styles.css | 3 +-- 4 files changed, 83 insertions(+), 8 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 1123225..5e15164 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -9,9 +9,9 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window document digitalData _satellite */ +/* global window document digitalData _satellite fetch */ -import { loadScript, getLocale } from './scripts.js'; +import { loadScript, getLocale, createTag } from './scripts.js'; // this saves on file size when this file gets minified... const w = window; @@ -424,14 +424,49 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { decorateAnalyticsEvents(); }); -loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); +async function showRegionPicker() { + const $body = document.body; + const $regionPicker = createTag('div', { id: 'region-picker' }); + $body.appendChild($regionPicker); + const locale = getLocale(window.location); + const host = window.location.hostname === 'localhost' ? 'https://www.adobe.com/' : ''; + const resp = await fetch(`${host}${locale === 'us' ? '' : locale}/`); + const html = await resp.text(); + const $div = createTag('div'); + $div.innerHTML = html; + const $regionNav = $div.querySelector('nav.language-Navigation'); + $regionPicker.appendChild($regionNav); + $regionPicker.addEventListener('click', (event) => { + if (event.target === $regionPicker || event.target === $regionNav) { + $regionPicker.remove(); + } + }); + $regionPicker.querySelectorAll('li a').forEach(($a) => { + $a.addEventListener('click', (event) => { + const pathSplits = new URL($a.href).pathname.split('/'); + const prefix = pathSplits[1] ? `/${pathSplits[1]}` : ''; + const destLocale = pathSplits[1] ? `${pathSplits[1]}` : 'us'; + const off = locale !== 'us' ? locale.length + 1 : 0; + const gPath = window.location.pathname.substr(off); + document.cookie = `international=${destLocale}; path=/`; + event.preventDefault(); + window.location.href = prefix + gPath; + }); + }); +} -const locale = getLocale(window.location); +loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); -console.log(locale); +// const locale = getLocale(window.location); window.fedsConfig = { ...window.fedsConfig, + + footer: { + regionModal: () => { + showRegionPicker(); + }, + }, // locale, content: { experience: 'cc-express/spark-gnav', diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 99bd879..521a826 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -76,7 +76,6 @@ export function linkImage($elem) { function wrapSections(element) { document.querySelectorAll(element).forEach(($div) => { if (!$div.id) { - console.log('wrap section', $div); const $wrapper = createTag('div', { class: 'section-wrapper' }); $div.parentNode.appendChild($wrapper); $wrapper.appendChild($div); @@ -824,6 +823,19 @@ async function decoratePage() { window.spark = {}; decoratePage(); +if (document.referrer) { + const referrer = new URL(document.referrer); + const redirectingHosts = ['www.adobe.com', 'www.stage.adobe.com', 'spark-website--adobe.hlx.live']; + if (redirectingHosts.includes(referrer.hostname) + && getLocale(referrer) !== getLocale(window.location)) { + if (!getCookie('international')) { + const refLocale = getLocale(referrer); + console.log(`setting international based on redirect to: ${refLocale}`); + document.cookie = `international=${refLocale}; path=/`; + } + } +} + /* performance instrumentation */ function stamp(message) { diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index d51a858..680599a 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -146,3 +146,32 @@ main .blog-posts .card .card-body { main .blog-posts .card .card-body p { font-size: 1rem; } + +#region-picker { + background-color: #00000080; + z-index: 20; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + align-items: center; + justify-content: center; + overflow-y: scroll; +} + +#region-picker nav { + background-color: white; + color: black; + margin: auto; + max-width: 1024px; + width: 90%; + padding: 32px; +} + +#region-picker ul { + display: block; + columns: 280px auto; +} + diff --git a/express/styles/styles.css b/express/styles/styles.css index 381c432..bd562dc 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -130,9 +130,8 @@ header { } #header-placeholder .desktop .top .section { - border-left: 1px solid #EAEAEA; height: 64px; - padding: 0 8px 1px 7px; + padding: 0 8px 1px 8px; } #header-placeholder .desktop .top .section span { From 5f003f3e69188e590de5ceab7393a81e6150d682 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 16:16:54 -0700 Subject: [PATCH 274/649] chore: update icon paths --- express/blocks/pricing/pricing.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 1ab213f..6e83658 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -199,7 +199,7 @@ function decoratePlans($block, plans, planOptions) { const title = plan['Plan Title']; const description = plan['Plan Description']; const imageName = plan['Plan Image']; - const imagePath = `icons/${imageName}.svg`; + const imagePath = `/express/icons/${imageName}.svg`; const $plan = createTag('div', { class: 'plan' }); const options = getPlanOptions(title, planOptions); const promotion = plan['Plan Special']; @@ -423,7 +423,7 @@ function decorateTable($block, features) { const columnThreeCheck = feature['Column 3']; if (!categories.includes(Category)) { const imageName = toClassName(Category); - const categoryImage = `icons/${imageName}.svg`; + const categoryImage = `/express/icons/${imageName}.svg`; const $categoryRow = createTag('tr', { class: 'category' }); $featuresTable.append($categoryRow); const $featureLogoColumn = createTag('td'); @@ -456,28 +456,28 @@ function decorateTable($block, features) { $featureRow.append($featureColumnOne); const $columnOneImage = createTag('img'); if (columnOneCheck === 'Y') { - $columnOneImage.src = 'icons/checkmark.svg'; + $columnOneImage.src = '/express/icons/checkmark.svg'; $columnOneImage.alt = 'Yes'; } else { - $columnOneImage.src = 'icons/crossmark.svg'; + $columnOneImage.src = '/express/icons/crossmark.svg'; $columnOneImage.alt = ''; } $featureColumnOne.append($columnOneImage); const $featureColumnTwo = createTag('td', { class: 'feature-column' }); const $columnTwoImage = createTag('img'); if (columnTwoCheck === 'Y') { - $columnTwoImage.src = 'icons/checkmark.svg'; + $columnTwoImage.src = '/express/icons/checkmark.svg'; } else { - $columnTwoImage.src = 'icons/crossmark.svg'; + $columnTwoImage.src = '/express/icons/crossmark.svg'; } $featureColumnTwo.append($columnTwoImage); $featureRow.append($featureColumnTwo); const $featureColumnThree = createTag('td', { class: 'feature-column' }); const $columnThreeImage = createTag('img'); if (columnThreeCheck === 'Y') { - $columnThreeImage.src = 'icons/checkmark.svg'; + $columnThreeImage.src = '/express/icons/checkmark.svg'; } else { - $columnThreeImage.src = 'icons/crossmark.svg'; + $columnThreeImage.src = '/express/icons/crossmark.svg'; } $featureColumnThree.append($columnThreeImage); $featureRow.append($featureColumnThree); From 06731d6d975d0570bf8c8bbe01269e598a5311c5 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 16:17:53 -0700 Subject: [PATCH 275/649] chore: linting cleanup --- express/blocks/pricing/pricing.js | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 6e83658..b381338 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -17,34 +17,6 @@ import { toClassName, } from '../../scripts/scripts.js'; -async function fetchHeader(sheet) { - const url = `./${sheet}.json?sheet=header`; - const resp = await fetch(url); - const json = await resp.json(); - return json.data; -} - -async function fetchPlans(sheet) { - const url = `./${sheet}.json?sheet=plans`; - const resp = await fetch(url); - const json = await resp.json(); - return json.data; -} - -async function fetchPlanOptions(sheet) { - const url = `./${sheet}.json?sheet=plan-options`; - const resp = await fetch(url); - const json = await resp.json(); - return json.data; -} - -async function fetchFeatures(sheet) { - const url = `./${sheet}.json?sheet=table`; - const resp = await fetch(url); - const json = await resp.json(); - return json.data; -} - async function fetchPricingTab(sheet, tab) { const url = `./${sheet}.json?sheet=${tab}`; const resp = await fetch(url); From de6bee5a5793127dad2e366de922be7b26449531 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 16:42:13 -0700 Subject: [PATCH 276/649] feat: initial pricing lookup --- express/blocks/pricing/pricing.js | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index b381338..a14b827 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -13,6 +13,7 @@ import { createTag, + getOffer, readBlockConfig, toClassName, } from '../../scripts/scripts.js'; @@ -124,16 +125,26 @@ function buildUrl(optionUrl, optionPlan) { return planUrl.href; } -function selectPlanOption($plan, option) { +async function selectPlanOption($plan, option) { const priceString = option['Option Price'].split('/'); const fullPriceString = option['Option Full Price'].split('/'); - const price = priceString[0]; + let price = priceString[0]; const priceUnit = priceString[1]; - const fullPrice = fullPriceString[0]; + let fullPrice = fullPriceString[0]; const fullPriceUnit = fullPriceString[1]; const text = option['Option Text']; const cta = option['Option CTA']; - const ctaUrl = buildUrl(option['Option Url'], option['Option Plan']); + const offerId = option['OfferID']; + let ctaUrl = buildUrl(option['Option Url'], option['Option Plan']); + let currency = '$'; + + if (offerId) { + const offer = await getOffer(offerId); + currency = offer.currency; + price = offer.unitPrice; + ctaUrl = offer.commerceURL; + console.log (offer); + } const $pricing = $plan.querySelector('.plan-pricing'); const $pricingText = $plan.querySelector('.plan-secondary'); @@ -142,9 +153,9 @@ function selectPlanOption($plan, option) { if (price === 'Free') { $pricing.innerHTML = 'Free'; } else { - $pricing.innerHTML = `US $${price}/${priceUnit}`; + $pricing.innerHTML = `${currency}${price}/${priceUnit}`; if (price !== fullPrice) { - $pricing.innerHTML += `US $${fullPrice}/${fullPriceUnit}`; + $pricing.innerHTML += `${currency}${fullPrice}/${fullPriceUnit}`; } } if (text) { From da311b1639d83a4f8707da7c8619a8d700e5c071 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 16:51:48 -0700 Subject: [PATCH 277/649] chore: typo --- express/scripts/martech.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 5e15164..e0cdf95 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -429,8 +429,8 @@ async function showRegionPicker() { const $regionPicker = createTag('div', { id: 'region-picker' }); $body.appendChild($regionPicker); const locale = getLocale(window.location); - const host = window.location.hostname === 'localhost' ? 'https://www.adobe.com/' : ''; - const resp = await fetch(`${host}${locale === 'us' ? '' : locale}/`); + const host = window.location.hostname === 'localhost' ? 'https://www.adobe.com' : ''; + const resp = await fetch(`${host}/${locale === 'us' ? '' : locale}/`); const html = await resp.text(); const $div = createTag('div'); $div.innerHTML = html; From 0d9bfc0625fa14a820645ac1dba3db501789c6e8 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 16:56:39 -0700 Subject: [PATCH 278/649] feat: country split --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 521a826..0dba5ea 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -212,7 +212,7 @@ function getCountry() { if (!country) { country = getLocale(window.location); } - return (country); + return (country.split('_')[0]); } export async function getOffer(offerId) { From a721ee7a096c3492c97a32e2ede5e87d5b65bbf2 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 27 Mar 2021 17:17:22 -0700 Subject: [PATCH 279/649] fix: better region fetch --- express/scripts/martech.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index e0cdf95..700e770 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -429,8 +429,10 @@ async function showRegionPicker() { const $regionPicker = createTag('div', { id: 'region-picker' }); $body.appendChild($regionPicker); const locale = getLocale(window.location); + const regionpath = locale === 'us' ? '/' : `/${locale}/`; const host = window.location.hostname === 'localhost' ? 'https://www.adobe.com' : ''; - const resp = await fetch(`${host}/${locale === 'us' ? '' : locale}/`); + const url = `${host}${regionpath}`; + const resp = await fetch(url); const html = await resp.text(); const $div = createTag('div'); $div.innerHTML = html; From 1e3871be76d07c6ab5a2cae3add3c57e47dc309f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 28 Mar 2021 09:12:00 -0700 Subject: [PATCH 280/649] feat: currency formatting --- express/blocks/pricing/pricing.js | 21 ++++++++++++++++----- express/scripts/scripts.js | 11 ++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index a14b827..7f6b18b 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -134,16 +134,27 @@ async function selectPlanOption($plan, option) { const fullPriceUnit = fullPriceString[1]; const text = option['Option Text']; const cta = option['Option CTA']; + // eslint-disable-next-line dot-notation const offerId = option['OfferID']; + const fullPriceOfferId = option['Full Price OfferID']; let ctaUrl = buildUrl(option['Option Url'], option['Option Plan']); let currency = '$'; + const countryOverride = new URLSearchParams(window.location.search).get('country'); if (offerId) { - const offer = await getOffer(offerId); + const offer = await getOffer(offerId, countryOverride); currency = offer.currency; - price = offer.unitPrice; + price = offer.unitPriceCurrencyFormatted; ctaUrl = offer.commerceURL; - console.log (offer); + if (!fullPriceOfferId) { + fullPrice = offer.unitPriceCurrencyFormatted; + } + } + + if (fullPriceOfferId) { + const fpOffer = await getOffer(fullPriceOfferId, countryOverride); + fullPrice = fpOffer.unitPriceCurrencyFormatted; + console.log (fpOffer); } const $pricing = $plan.querySelector('.plan-pricing'); @@ -153,9 +164,9 @@ async function selectPlanOption($plan, option) { if (price === 'Free') { $pricing.innerHTML = 'Free'; } else { - $pricing.innerHTML = `${currency}${price}/${priceUnit}`; + $pricing.innerHTML = `${price}/${priceUnit}`; if (price !== fullPrice) { - $pricing.innerHTML += `${currency}${fullPrice}/${fullPriceUnit}`; + $pricing.innerHTML += `${fullPrice}/${fullPriceUnit}`; } } if (text) { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 0dba5ea..3bf6201 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -215,8 +215,9 @@ function getCountry() { return (country.split('_')[0]); } -export async function getOffer(offerId) { - const country = getCountry(); +export async function getOffer(offerId, countryOverride) { + let country = getCountry(); + if (countryOverride) country = countryOverride; console.log(country); const currency = getCurrency(country); const resp = await fetch('/express/system/offers.json'); @@ -226,16 +227,16 @@ export async function getOffer(offerId) { if (offer) { const unitPrice = offer.p; + const currencyFormatter = new Intl.NumberFormat(navigator.lang, { style: 'currency', currency }); + const unitPriceCurrencyFormatted = currencyFormatter.format(unitPrice); const commerceURL = `https://commerce.adobe.com/checkout?cli=spark&co=${country}&items%5B0%5D%5Bid%5D=${offerId}&items%5B0%5D%5Bcs%5D=0&rUrl=https%3A%2F%2Fspark.adobe.com%2Fsp%2F`; return { - country, currency, unitPrice, commerceURL, + country, currency, unitPrice, unitPriceCurrencyFormatted, commerceURL, }; } return {}; } -window.getOffer = getOffer; - export function addBlockClasses($block, classNames) { const $rows = Array.from($block.children); $rows.forEach(($row) => { From 6455a78f141c339635b8ebd17b3aad119843b08f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 28 Mar 2021 10:48:40 -0700 Subject: [PATCH 281/649] fix(feature-list): touch up --- express/blocks/feature-list/feature-list.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/feature-list/feature-list.css b/express/blocks/feature-list/feature-list.css index fbb8dd1..7bdd09e 100644 --- a/express/blocks/feature-list/feature-list.css +++ b/express/blocks/feature-list/feature-list.css @@ -1,7 +1,6 @@ main .feature-list { display: flex; flex-wrap: wrap; - align-items: center; justify-content: center; margin: auto; } @@ -18,4 +17,5 @@ main .feature-list > div { main .feature-list h3 { font-size: 22px; + line-height: 26px; } \ No newline at end of file From 7f3286f91fd769385c6b6626ddddca890f586021 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 28 Mar 2021 11:50:25 -0700 Subject: [PATCH 282/649] feat(hero): icon support --- express/styles/styles.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index bd562dc..6f30347 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -334,6 +334,11 @@ main .icon { color: currentColor; } +main .hero .icon { + height: 2em; + width: 2em; +} + main .hero .hero-bg { position: absolute; top: 0; From 63fecfdc631cd58dd7f74dc8c45dddcdf4aa72ca Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 28 Mar 2021 11:53:37 -0700 Subject: [PATCH 283/649] fix: uk -> gb country map --- express/scripts/scripts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 3bf6201..761505c 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -212,6 +212,7 @@ function getCountry() { if (!country) { country = getLocale(window.location); } + if (country === 'uk') country = 'gb'; return (country.split('_')[0]); } From c6c24509c3722a1159a12ee946c64570932265a9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 28 Mar 2021 15:16:43 -0700 Subject: [PATCH 284/649] fix: tighter linked image guar --- express/blocks/columns/columns.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/express/blocks/columns/columns.js b/express/blocks/columns/columns.js index 3e4697c..3b76f3a 100644 --- a/express/blocks/columns/columns.js +++ b/express/blocks/columns/columns.js @@ -38,8 +38,11 @@ export default function decorate($block) { $cell.innerHTML = `${num}${$cell.innerHTML}`; } /* this probably needs to be tighter and possibly earlier */ - if ($cell.querySelector('img') && $cell.querySelector('a')) { - linkImage($cell); + const $a = $cell.querySelector('a'); + if ($cell.querySelector('img') && $a) { + if ($a.textContent.startsWith('https://')) { + linkImage($cell); + } } }); }); From aab2c50583a2822d133483c3f786e16ead58c7a1 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 28 Mar 2021 15:29:19 -0700 Subject: [PATCH 285/649] fix: more inclusive button adds for links by themselves --- express/scripts/scripts.js | 40 +++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 761505c..3ddbcd6 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -585,23 +585,31 @@ function decorateHero() { } function decorateButtons() { + const noButtonBlocks = ['template-list']; document.querySelectorAll('main a').forEach(($a) => { - const $up = $a.parentElement; - const $twoup = $a.parentElement.parentElement; - if (!$a.querySelector('img')) { - if ($up.childNodes.length === 1 && $up.tagName === 'P') { - $a.className = 'button primary'; - $up.classList.add('button-container'); - } - if ($up.childNodes.length === 1 && $up.tagName === 'STRONG' - && $twoup.childNodes.length === 1 && $twoup.tagName === 'P') { - $a.className = 'button primary'; - $twoup.classList.add('button-container'); - } - if ($up.childNodes.length === 1 && $up.tagName === 'EM' - && $twoup.childNodes.length === 1 && $twoup.tagName === 'P') { - $a.className = 'button secondary'; - $twoup.classList.add('button-container'); + const $block = $a.closest('div.section-wrapper > div > div'); + let blockName; + if ($block) { + blockName = $block.className; + } + if (!noButtonBlocks.includes(blockName)) { + const $up = $a.parentElement; + const $twoup = $a.parentElement.parentElement; + if (!$a.querySelector('img')) { + if ($up.childNodes.length === 1 && ($up.tagName === 'P' || $up.tagName === 'DIV')) { + $a.className = 'button primary'; + $up.classList.add('button-container'); + } + if ($up.childNodes.length === 1 && $up.tagName === 'STRONG' + && $twoup.childNodes.length === 1 && $twoup.tagName === 'P') { + $a.className = 'button primary'; + $twoup.classList.add('button-container'); + } + if ($up.childNodes.length === 1 && $up.tagName === 'EM' + && $twoup.childNodes.length === 1 && $twoup.tagName === 'P') { + $a.className = 'button secondary'; + $twoup.classList.add('button-container'); + } } } }); From 71475415500ab783babde8d2d68ddf49c20c5ad2 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 28 Mar 2021 16:08:03 -0700 Subject: [PATCH 286/649] fix: untangle cards from vards block --- express/blocks/blog-posts/blog-posts.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index 8574673..5e872d2 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -12,6 +12,7 @@ main .blog-posts .cards { flex-wrap: wrap; justify-content: center; margin: 16px; + width: unset; } main .blog-posts .hero-card { From ec8b0c6f9f9df8a9a9160272660f75227a42dfc3 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 28 Mar 2021 16:21:34 -0700 Subject: [PATCH 287/649] chore: make width more responsive --- express/styles/styles.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 6f30347..86296e7 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -409,7 +409,9 @@ main .hero a:any-link { main>.hero h1 { font-size: 3.5em; } - + main .hero>div { + max-width: 950px; + } } From 544f468262602e49510a036e14699a9aa5cb4864 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Mon, 29 Mar 2021 11:05:54 +0200 Subject: [PATCH 288/649] fix(blog-posts): compute max nb items to show --- express/blocks/blog-posts/blog-posts.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 94defa7..b919349 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -108,7 +108,9 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { $blogPosts.appendChild($cards); } - for (let i = offset; i < offset + limit; i += 1) { + const pageEnd = offset + limit; + const max = pageEnd > posts.length ? posts.length : pageEnd; + for (let i = offset; i < max; i += 1) { const post = posts[i]; const { path, title, teaser, tags, image, @@ -140,14 +142,14 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { if (isHero) $blogPosts.prepend($card); else $cards.append($card); } - if (posts.length > offset + limit) { + if (posts.length > pageEnd) { const $loadMore = createTag('a', { class: 'load-more button secondary', href: '#' }); $loadMore.innerHTML = 'Load more articles'; $blogPosts.append($loadMore); $loadMore.addEventListener('click', (event) => { event.preventDefault(); $loadMore.remove(); - decorateBlogPosts($blogPosts, config, offset + limit); + decorateBlogPosts($blogPosts, config, pageEnd); }); } } From ab515e911e3dfd6e54f4ec8ecf809d55ae362aa9 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Mon, 29 Mar 2021 11:08:33 +0200 Subject: [PATCH 289/649] chore(lint): linting... --- express/blocks/pricing/pricing.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 7f6b18b..b4d7f80 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -138,12 +138,12 @@ async function selectPlanOption($plan, option) { const offerId = option['OfferID']; const fullPriceOfferId = option['Full Price OfferID']; let ctaUrl = buildUrl(option['Option Url'], option['Option Plan']); - let currency = '$'; + // let currency = '$'; const countryOverride = new URLSearchParams(window.location.search).get('country'); if (offerId) { const offer = await getOffer(offerId, countryOverride); - currency = offer.currency; + // currency = offer.currency; price = offer.unitPriceCurrencyFormatted; ctaUrl = offer.commerceURL; if (!fullPriceOfferId) { @@ -154,7 +154,7 @@ async function selectPlanOption($plan, option) { if (fullPriceOfferId) { const fpOffer = await getOffer(fullPriceOfferId, countryOverride); fullPrice = fpOffer.unitPriceCurrencyFormatted; - console.log (fpOffer); + console.log(fpOffer); } const $pricing = $plan.querySelector('.plan-pricing'); From 81ed6a708a5ce27e964e9c57f7e6ef7e2fe5917d Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 29 Mar 2021 12:01:52 -0700 Subject: [PATCH 290/649] chore: header size update --- express/styles/styles.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 86296e7..c5a9d93 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -16,10 +16,10 @@ body.appear { header { box-sizing: border-box; border-bottom: 1px solid #EAEAEA; - height: 135px; + height: 153px; background-image: url(/express/icons/adobe-spark.png); background-repeat: no-repeat; - background-size: auto 24px; + background-size: auto 42px; background-position: bottom 24px center; position: relative; } From 381bd8dc80c17bb9bf592fa9655b3d19d9d7a728 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 29 Mar 2021 15:01:14 -0700 Subject: [PATCH 291/649] fix: correct prefix for query index --- express/blocks/page-list/page-list.js | 2 +- express/scripts/scripts.js | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 2710aeb..75ed29f 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -50,7 +50,7 @@ function showHide($block, $ptl) { async function fetchIndex() { const locale = getLocale(window.location); - const indexURL = locale === 'us' ? '/express/query-index.json' : `/${locale}/query-index.json`; + const indexURL = locale === 'us' ? '/express/query-index.json' : `/express/${locale}/query-index.json`; try { const resp = await fetch(indexURL); const json = await resp.json(); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 3ddbcd6..8fa203d 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -805,6 +805,17 @@ function splitSections() { }); } +function webpPolyfill() { + let webpSupport = true; + const $canvas = document.createElement('canvas'); + if ($canvas.getContext && $canvas.getContext('2d')) { + // was able or not to get WebP representation + webpSupport = $canvas.toDataURL('image/webp').indexOf('data:image/webp') == 0; + } else { + webpSupport = false; + } +} + function setTheme() { const theme = getMeta('theme'); if (theme) { @@ -824,6 +835,7 @@ async function decoratePage() { decorateHero(); decorateButtons(); fixIcons(); + //webpPolyfill(); decorateBlocks(); decorateDoMoreEmbed(); setLCPTrigger(); From d18268938434126a2bdf0095f8d2a5e13556bbf3 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 29 Mar 2021 15:02:53 -0700 Subject: [PATCH 292/649] fix: correct prefix for query index --- express/blocks/page-list/page-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 75ed29f..83cfa4b 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -50,7 +50,7 @@ function showHide($block, $ptl) { async function fetchIndex() { const locale = getLocale(window.location); - const indexURL = locale === 'us' ? '/express/query-index.json' : `/express/${locale}/query-index.json`; + const indexURL = locale === 'us' ? '/express/query-index.json' : `/${locale}/express/query-index.json`; try { const resp = await fetch(indexURL); const json = await resp.json(); From 867b36815ad8b5a4d425bc5b1b34cbca7a868371 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Tue, 30 Mar 2021 09:23:34 +0900 Subject: [PATCH 293/649] chore: fix linting --- express/blocks/pricing/pricing.js | 1 + express/scripts/scripts.js | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index b4d7f80..7998832 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -154,6 +154,7 @@ async function selectPlanOption($plan, option) { if (fullPriceOfferId) { const fpOffer = await getOffer(fullPriceOfferId, countryOverride); fullPrice = fpOffer.unitPriceCurrencyFormatted; + // eslint-disable-next-line no-console console.log(fpOffer); } diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 29ae678..8a1b278 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -806,16 +806,16 @@ function splitSections() { }); } -function webpPolyfill() { - let webpSupport = true; - const $canvas = document.createElement('canvas'); - if ($canvas.getContext && $canvas.getContext('2d')) { - // was able or not to get WebP representation - webpSupport = $canvas.toDataURL('image/webp').indexOf('data:image/webp') == 0; - } else { - webpSupport = false; - } -} +// function webpPolyfill() { +// let webpSupport = true; +// const $canvas = document.createElement('canvas'); +// if ($canvas.getContext && $canvas.getContext('2d')) { +// // was able or not to get WebP representation +// webpSupport = $canvas.toDataURL('image/webp').indexOf('data:image/webp') === 0; +// } else { +// webpSupport = false; +// } +// } function setTheme() { const theme = getMeta('theme'); @@ -836,7 +836,7 @@ async function decoratePage() { decorateHero(); decorateButtons(); fixIcons(); - //webpPolyfill(); + // webpPolyfill(); decorateBlocks(); decorateDoMoreEmbed(); setLCPTrigger(); From fac2e91cf4ecd2e013661daf6f06a5af9649dfc5 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 29 Mar 2021 17:52:19 -0700 Subject: [PATCH 294/649] chore: merge --- express/scripts/scripts.js | 69 ++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 8a1b278..9345867 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -806,16 +806,63 @@ function splitSections() { }); } -// function webpPolyfill() { -// let webpSupport = true; -// const $canvas = document.createElement('canvas'); -// if ($canvas.getContext && $canvas.getContext('2d')) { -// // was able or not to get WebP representation -// webpSupport = $canvas.toDataURL('image/webp').indexOf('data:image/webp') === 0; -// } else { -// webpSupport = false; -// } -// } +function supportsWebp() { + if (window.webpSupport === undefined) { + window.webpSupport = true; + const $canvas = document.createElement('canvas'); + if ($canvas.getContext && $canvas.getContext('2d')) { + window.webpSupport = $canvas.toDataURL('image/webp').startsWith('data:image/webp'); + } else { + window.webpSupport = false; + } + } + return (window.webpSupport); +} + +function getOptimizedImageURL(src) { + console.log(src); + const url = new URL(src, window.location.href); + let result = src; + const { pathname, search } = url; + if (pathname.includes('media_')) { + const usp = new URLSearchParams(search); + usp.delete('auto'); + if (!supportsWebp) { + if (pathname.endsWith('.png')) { + usp.set('format', 'png'); + } else if (pathname.endsWith('.gif')) { + usp.set('format', 'gif'); + } else { + usp.set('format', 'pjpg'); + } + } else { + usp.set('format', 'webply'); + } + result = `${src.split('?')[0]}?${usp.toString()}`; + } + return (result); +} + +function resetAttribute($elem, attrib) { + const src = $elem.getAttribute(attrib); + if (src) { + const oSrc = getOptimizedImageURL(src); + if (oSrc !== src) { + console.log($elem); + console.log(`${src} => ${oSrc}`); + $elem.setAttribute(attrib, oSrc); + } + } +} + +function webpPolyfill() { + document.querySelectorAll('img').forEach(($img) => { + resetAttribute($img, 'src'); + }); + document.querySelectorAll('picture source').forEach(($source) => { + resetAttribute($source, 'srcset'); + }); +} function setTheme() { const theme = getMeta('theme'); @@ -836,7 +883,7 @@ async function decoratePage() { decorateHero(); decorateButtons(); fixIcons(); - // webpPolyfill(); + webpPolyfill(); decorateBlocks(); decorateDoMoreEmbed(); setLCPTrigger(); From 62a652463f95b1dc9da3cdc78571b4fa79495d93 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 29 Mar 2021 18:04:16 -0700 Subject: [PATCH 295/649] chore: webpsupport testing --- express/scripts/scripts.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 9345867..7b1ffa1 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -807,6 +807,9 @@ function splitSections() { } function supportsWebp() { + if (window.name.includes('nowebpsupport')) return false; + if (window.name.includes('webpsupport')) return true; + if (window.webpSupport === undefined) { window.webpSupport = true; const $canvas = document.createElement('canvas'); From bde5d57c89865b4ca4045aee68b8667b896c692d Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 29 Mar 2021 18:16:51 -0700 Subject: [PATCH 296/649] chore: webpsupport testing --- express/scripts/scripts.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 7b1ffa1..2132928 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -807,8 +807,8 @@ function splitSections() { } function supportsWebp() { - if (window.name.includes('nowebpsupport')) return false; - if (window.name.includes('webpsupport')) return true; + if (window.name.includes('nowebp')) return false; + if (window.name.includes('webp')) return true; if (window.webpSupport === undefined) { window.webpSupport = true; @@ -830,7 +830,7 @@ function getOptimizedImageURL(src) { if (pathname.includes('media_')) { const usp = new URLSearchParams(search); usp.delete('auto'); - if (!supportsWebp) { + if (!supportsWebp()) { if (pathname.endsWith('.png')) { usp.set('format', 'png'); } else if (pathname.endsWith('.gif')) { From b13455eccffaab3cf8b39dbc97e6cf78fa27d1fb Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Tue, 30 Mar 2021 03:23:50 -0400 Subject: [PATCH 297/649] feat(pricing): plan analytics --- express/blocks/pricing/pricing.js | 327 ++++++++++++++---------------- express/scripts/martech.js | 53 +---- 2 files changed, 163 insertions(+), 217 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index b4d7f80..c31156d 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -10,6 +10,7 @@ * governing permissions and limitations under the License. */ /* global window, fetch, digitalData, _satellite */ +/* eslint-disable no-underscore-dangle */ import { createTag, @@ -71,10 +72,13 @@ function decorateHeader($block, header) { function getPlanOptions(planTitle, planOptions) { const options = []; + let optionId = 0; planOptions.forEach((option) => { const optionPlan = option['Option Plan']; if (planTitle === optionPlan) { + option.optionId = optionId; options.push(option); + optionId += 1; } }); return options; @@ -125,7 +129,118 @@ function buildUrl(optionUrl, optionPlan) { return planUrl.href; } -async function selectPlanOption($plan, option) { +function selectPlanAnalytics($plan, options) { + const $cta = $plan.querySelector('.button'); + $cta.addEventListener('click', (e) => { + const $optionPlan = e.target.closest('.plan'); + const $plans = $optionPlan.closest('.pricing-plans'); + const { optionId } = $optionPlan.dataset; + const optionData = options[optionId]; + const option = { + id: optionData.id, + position: Array.prototype.slice.call($plans.children).indexOf($plan) + 1, + plan: optionData.plan, + name: optionData.name, + price: optionData.priceUnformatted, + frequency: optionData.frequency, + currency: optionData.currency, + }; + let adobeEventName; + let sparkEventName; + // determine whether individual | starter | etc. + // Buy Now + if ($cta.hostname.includes('commerce.adobe.com')) { + // individual + if ($cta.search.includes('spark.adobe.com')) { + adobeEventName += `pricing:individual:${option.position}:buyNow:Click`; + // team + } else if ($cta.search.includes('adminconsole.adobe.com')) { + adobeEventName += `pricing:team:${option.position}:buyNow:Click`; + } + sparkEventName = 'beginPurchaseFlow'; + // anything else + } else { + adobeEventName += `pricing:starter:${option.position}:getStarted:Click`; + sparkEventName = 'pricing:ctaPressed'; + } + + digitalData._set('primaryEvent.eventInfo.eventName', adobeEventName); + digitalData._set('spark.eventData.eventName', sparkEventName); + digitalData._set('primaryProduct.productInfo.amountWithoutTax', option.price); + digitalData._set('primaryProduct.productInfo.billingFrequency', option.frequency); + digitalData._set('primaryProduct.productInfo.cardPosition', option.position); + digitalData._set('primaryProduct.productInfo.commitmentType', option.frequency); + digitalData._set('primaryProduct.productInfo.currencyCode', option.currency); + digitalData._set('primaryProduct.productInfo.offerId', option.id); + digitalData._set('primaryProduct.productInfo.price', option.price); + digitalData._set('primaryProduct.productInfo.productName', `${option.plan} - ${option.name}`); + digitalData._set('primaryProduct.productInfo.quantity', 1); + // primaryProduct: { + // productInfo: { + // amountWithoutTax:'79.99', + // billingFrequency:'MONTHLY', + // cardPosition:'1', + // commitmentType:'YEAR', + // currencyCode:'USD', + // label:'ccle_direct_indirect_team',// + // offerId:'08A2CD1688E89927614A5F402329DB5B', + // price:'59.99', + // productCode:'ccle_direct_indirect_team', + // productName: '', //product Name -> 'Creative Cloud All Apps' + // or as per the details available of the product + // sku:'65296994', + // quantity:''//Number of licenses + // } + // } + digitalData._set('spark.eventData.contextualData4', `billingFrequency:${option.frequency}`); + digitalData._set('spark.eventData.contextualData5', `cardPosition:${option.position}`); + digitalData._set('spark.eventData.contextualData6', `commitmentType:${option.frequency}`); + digitalData._set('spark.eventData.contextualData7', `currencyCode:${option.currency}`); + digitalData._set('spark.eventData.contextualData9', `offerId:${option.id}`); + digitalData._set('spark.eventData.contextualData10', `price:${option.price}`); + digitalData._set('spark.eventData.contextualData12', `productName:${option.plan} - ${option.name}`); + digitalData._set('spark.eventData.contextualData14', 'quantity:1'); + // spark.eventData.contextualData3: 'amountWithoutTax:79.99' or + // whatever is set in primaryProduct.productInfo.amountWithoutTax + // spark.eventData.contextualData4: 'billingFrequency:MONTHLY' + // spark.eventData.contextualData5: 'cardPosition:1' + // spark.eventData.contextualData6: 'commitmentType:YEAR' + // spark.eventData.contextualData7: 'currencyCode:USD' + // spark.eventData.contextualData8: 'label:ccle_direct_indirect_team' + // spark.eventData.contextualData9: 'offerId:08A2CD1688E89927614A5F402329DB5B' + // spark.eventData.contextualData10: 'price:59.99' + // spark.eventData.contextualData11: 'productCode:ccle_direct_indirect_team' + // spark.eventData.contextualData12: 'productName: '', //product Name -> + // 'Creative Cloud All Apps' or as per the details available of the product + // spark.eventData.contextualData13: 'sku:65296994' + // spark.eventData.contextualData14: 'quantity:''//Number of licenses" + _satellite.track('event', { digitalData: digitalData._snapshot() }); + digitalData._delete('primaryEvent.eventInfo.eventName'); + digitalData._delete('spark.eventData.eventName'); + digitalData._delete('primaryEvent.eventInfo.eventName'); + digitalData._delete('spark.eventData.eventName'); + digitalData._delete('primaryProduct.productInfo.amountWithoutTax'); + digitalData._delete('primaryProduct.productInfo.billingFrequency'); + digitalData._delete('primaryProduct.productInfo.cardPosition'); + digitalData._delete('primaryProduct.productInfo.commitmentType'); + digitalData._delete('primaryProduct.productInfo.currencyCode'); + digitalData._delete('primaryProduct.productInfo.offerId'); + digitalData._delete('primaryProduct.productInfo.price'); + digitalData._delete('primaryProduct.productInfo.productName'); + digitalData._delete('primaryProduct.productInfo.quantity'); + digitalData._delete('spark.eventData.contextualData3'); + digitalData._delete('spark.eventData.contextualData4'); + digitalData._delete('spark.eventData.contextualData5'); + digitalData._delete('spark.eventData.contextualData6'); + digitalData._delete('spark.eventData.contextualData7'); + digitalData._delete('spark.eventData.contextualData9'); + digitalData._delete('spark.eventData.contextualData10'); + digitalData._delete('spark.eventData.contextualData12'); + digitalData._delete('spark.eventData.contextualData14'); + }); +} + +async function rebuildOptionWithOffer(option) { const priceString = option['Option Price'].split('/'); const fullPriceString = option['Option Full Price'].split('/'); let price = priceString[0]; @@ -137,14 +252,16 @@ async function selectPlanOption($plan, option) { // eslint-disable-next-line dot-notation const offerId = option['OfferID']; const fullPriceOfferId = option['Full Price OfferID']; + let priceUnformatted = parseFloat(price); let ctaUrl = buildUrl(option['Option Url'], option['Option Plan']); - // let currency = '$'; + let currency = 'USD'; const countryOverride = new URLSearchParams(window.location.search).get('country'); if (offerId) { const offer = await getOffer(offerId, countryOverride); - // currency = offer.currency; + currency = offer.currency; price = offer.unitPriceCurrencyFormatted; + priceUnformatted = offer.unitPrice; ctaUrl = offer.commerceURL; if (!fullPriceOfferId) { fullPrice = offer.unitPriceCurrencyFormatted; @@ -154,27 +271,47 @@ async function selectPlanOption($plan, option) { if (fullPriceOfferId) { const fpOffer = await getOffer(fullPriceOfferId, countryOverride); fullPrice = fpOffer.unitPriceCurrencyFormatted; - console.log(fpOffer); } + option.id = offerId; + option.price = price; + option.priceUnformatted = priceUnformatted; + option.unit = priceUnit; + option.fullPrice = fullPrice; + option.fullPriceUnit = fullPriceUnit; + option.text = text; + option.url = ctaUrl; + option.cta = cta; + option.currency = currency; + option.frequency = option['Analytics Frequency do-not-translate']; + option.plan = option['Analytics Plan do-not-translate']; + option.name = option['Analytics Name do-not-translate']; + + return option; +} + +async function selectPlanOption($plan, option) { + $plan.dataset.optionId = option.optionId; + if (typeof option.id === 'undefined') { + // eslint-disable-next-line no-param-reassign + option = await rebuildOptionWithOffer(option); + } const $pricing = $plan.querySelector('.plan-pricing'); const $pricingText = $plan.querySelector('.plan-secondary'); const $cta = $plan.querySelector('.button.primary'); - - if (price === 'Free') { + if (option.price === 'Free') { $pricing.innerHTML = 'Free'; } else { - $pricing.innerHTML = `${price}/${priceUnit}`; - if (price !== fullPrice) { - $pricing.innerHTML += `${fullPrice}/${fullPriceUnit}`; + $pricing.innerHTML = `${option.price}/${option.unit}`; + if (option.price !== option.fullPrice) { + $pricing.innerHTML += `${option.fullPrice}/${option.fullPriceUnit}`; } } - if (text) { - $pricingText.innerHTML = text; + if (option.text) { + $pricingText.innerHTML = option.text; } - - $cta.innerHTML = cta; - $cta.href = ctaUrl; + $cta.innerHTML = option.cta; + $cta.href = option.url; } function addDropdownEventListener($plan, options) { @@ -240,168 +377,8 @@ function decoratePlans($block, plans, planOptions) { } const $cta = createTag('a', { class: 'button primary' }); $footer.append($cta); - - $cta.addEventListener('click', () => { - let adobeEventName; - let sparkEventName; - const option = {}; - // get the position of the card in the plans - const cardPosition = Array.prototype.slice.call($plans.children).indexOf($plan) + 1; - // determine whether individual | starter | etc. - // Buy Now - if ($cta.hostname.includes('commerce.adobe.com')) { - // individual - if ($cta.search.includes('spark.adobe.com')) { - adobeEventName += `pricing:individual:${cardPosition}:buyNow:Click`; - // team - } else if ($cta.search.includes('adminconsole.adobe.com')) { - adobeEventName += `pricing:team:${cardPosition}:buyNow:Click`; - } - sparkEventName = 'beginPurchaseFlow'; - // anything else - } else { - adobeEventName += `pricing:starter:${cardPosition}:getStarted:Click`; - sparkEventName = 'pricing:ctaPressed'; - } - - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryEvent.eventInfo.eventName', adobeEventName); - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.eventName', sparkEventName); - // TODO: option.priceWithoutTax - price withou tax if you have it, otherwise ignore this - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.amountWithoutTax', option.priceWithoutTax); - // TODO: option.billingFrequency - Set to Monthly or whatever is in the drop-down - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.billingFrequency', option.billingFrequency); - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.cardPosition', cardPosition); - // TODO: option.commitmentType - Month, year, or whatever - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.commitmentType', option.commitmentType); - // TODO: option.currencyCode - USD or whatever currency type is being used - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.currencyCode', option.currencyCode); - // TODO: option.offerId - 08A2CD1688E89927614A5F402329DB5B or whatever the offer is - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.offerId', option.offerId); - // TODO: option.price - the price with tax or whatever price - // value you have if non-distinguishable - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.price', option.price); - // TODO: option.productName - If there is a user friendly product name, put it here - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.productName', option.productName); - // eslint-disable-next-line no-underscore-dangle - digitalData._set('primaryProduct.productInfo.quantity', 1); - // primaryProduct: { - // productInfo: { - // amountWithoutTax:'79.99', - // billingFrequency:'MONTHLY', - // cardPosition:'1', - // commitmentType:'YEAR', - // currencyCode:'USD', - // label:'ccle_direct_indirect_team',// - // offerId:'08A2CD1688E89927614A5F402329DB5B', - // price:'59.99', - // productCode:'ccle_direct_indirect_team', - // productName: '', //product Name -> 'Creative Cloud All Apps' - // or as per the details available of the product - // sku:'65296994', - // quantity:''//Number of licenses - // } - // } - // TODO: option.priceWithoutTax - price withou tax if you have it, otherwise ignore this - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData3', `amountWithoutTax:${option.priceWithoutTax}`); - // TODO: option.billingFrequency - Set to Monthly or whatever is in the drop-down - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData4', `billingFrequency:${option.billingFrequency}`); - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData5', `cardPosition:${cardPosition}`); - // TODO: option.commitmentType - Month, year, or whatever - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData6', `commitmentType:${option.commitmentType}`); - // TODO: option.currencyCode - USD or whatever currency type is being used - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData7', `currencyCode:${option.currencyCode}`); - // TODO: option.offerId - 08A2CD1688E89927614A5F402329DB5B or whatever the offer is - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData9', `offerId:${option.offerId}`); - // TODO: option.price - the price with tax or whatever price - // value you have if non-distinguishable - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData10', `price:${option.price}`); - // TODO: option.productName - If there is a user friendly product name, put it here - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData12', `productName:${option.productName}`); - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData14', 'quantity:1'); - // spark.eventData.contextualData3: 'amountWithoutTax:79.99' or - // whatever is set in primaryProduct.productInfo.amountWithoutTax - // spark.eventData.contextualData4: 'billingFrequency:MONTHLY' - // spark.eventData.contextualData5: 'cardPosition:1' - // spark.eventData.contextualData6: 'commitmentType:YEAR' - // spark.eventData.contextualData7: 'currencyCode:USD' - // spark.eventData.contextualData8: 'label:ccle_direct_indirect_team' - // spark.eventData.contextualData9: 'offerId:08A2CD1688E89927614A5F402329DB5B' - // spark.eventData.contextualData10: 'price:59.99' - // spark.eventData.contextualData11: 'productCode:ccle_direct_indirect_team' - // spark.eventData.contextualData12: 'productName: '', //product Name -> - // 'Creative Cloud All Apps' or as per the details available of the product - // spark.eventData.contextualData13: 'sku:65296994' - // spark.eventData.contextualData14: 'quantity:''//Number of licenses" - - // eslint-disable-next-line no-underscore-dangle - _satellite.track('event', { digitalData: digitalData._snapshot() }); - - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryEvent.eventInfo.eventName'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.eventName'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryEvent.eventInfo.eventName'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.eventName'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.amountWithoutTax'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.billingFrequency'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.cardPosition'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.commitmentType'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.currencyCode'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.offerId'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.price'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.productName'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('primaryProduct.productInfo.quantity'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData3'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData4'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData5'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData6'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData7'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData9'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData10'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData12'); - // eslint-disable-next-line no-underscore-dangle - digitalData._delete('spark.eventData.contextualData14'); - }); - selectPlanOption($plan, options[0]); + selectPlanAnalytics($plan, options); }); } diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 700e770..55eb10c 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -318,55 +318,24 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { adobeEventName = appendLinkText(`${adobeEventName}hero:`, $a); sparkEventName = 'landing:ctaPressed'; - // Click in the pricing block - } else if ($a.closest('.pricing')) { - // allow the pricing block to handle this analytics - return; - - // // get the position of the card in the plans - // cardPosition = Array.prototype.slice.call(document.querySelectorAll('.plan')) - // .indexOf($a.closest('.plan')) + 1; - - // // Buy Now - // if ($a.hostname.includes('commerce.adobe.com')) { - // // individual - // if ($a.search.includes('spark.adobe.com')) { - // adobeEventName += `pricing:individual:${cardPosition}:buyNow:Click`; - // // team - // } else if ($a.search.includes('adminconsole.adobe.com')) { - // adobeEventName += `pricing:team:${cardPosition}:buyNow:Click`; - // } - - // sparkEventName = 'beginPurchaseFlow'; - - // // anything else - // } else { - // adobeEventName += `pricing:starter:${cardPosition}:getStarted:Click`; - // sparkEventName = 'pricing:ctaPressed'; - // } - - // // eslint-disable-next-line no-underscore-dangle - // digitalData._set('spark.eventData.contextualData5', `cardPosition:${cardPosition}`); - // Click in the pricing block } else if (sparkLandingPageType === 'pricing') { // edu link - if ( - $a.pathname.includes('/edu') - ) { - adobeEventName += 'pricing:eduLink:Click'; + if ($a.pathname.includes('/edu')) { + adobeEventName += 'pricing:education:Click'; sparkEventName = 'landing:eduSeoPagePressed'; - // business enterprise link - } else if ( - $a.pathname.includes('business/enterprise') - ) { - adobeEventName += 'pricing:enterpriseLink:Click'; + } else if ($a.pathname.includes('business/enterprise')) { + adobeEventName += 'pricing:enterprise:Click'; sparkEventName = 'landing:businessSeoPagePressed'; - // all other links + // Creative cloud learn more + } else if ($a.parentElement.id === 'adobe-spark-is-a-part-of-most-creative-cloud-paid-plans-learn-more') { + adobeEventName += 'pricing:creativeCloud:learnMore'; + sparkEventName = 'landing:creativeCloudLearnMorePressed'; + // View plans } else { - adobeEventName = appendLinkText(adobeEventName, $a); - sparkEventName = 'pricing:ctaPressed'; + adobeEventName = 'pricing:viewPlans:Click'; + sparkEventName = 'landing:viewPlansPressed'; } // Default clicks From d19e6606a1814b9e973a6c08d5bb9f0ce777e6fd Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 30 Mar 2021 12:06:07 +0200 Subject: [PATCH 298/649] chore(icon): more icons --- express/icons/browser.svg | 24 ++++++++++++++++++++++++ express/icons/easy-to-use.svg | 28 ++++++++++++++++++++++++++++ express/icons/learning-outcomes.svg | 23 +++++++++++++++++++++++ express/icons/security.svg | 14 ++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 express/icons/browser.svg create mode 100644 express/icons/easy-to-use.svg create mode 100644 express/icons/learning-outcomes.svg create mode 100644 express/icons/security.svg diff --git a/express/icons/browser.svg b/express/icons/browser.svg new file mode 100644 index 0000000..a5b89ef --- /dev/null +++ b/express/icons/browser.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/express/icons/easy-to-use.svg b/express/icons/easy-to-use.svg new file mode 100644 index 0000000..7fc742c --- /dev/null +++ b/express/icons/easy-to-use.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/express/icons/learning-outcomes.svg b/express/icons/learning-outcomes.svg new file mode 100644 index 0000000..10a6a0d --- /dev/null +++ b/express/icons/learning-outcomes.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/express/icons/security.svg b/express/icons/security.svg new file mode 100644 index 0000000..524da97 --- /dev/null +++ b/express/icons/security.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + From ed766b5b1f9ab2273d4e6bfa3e5a81d38548f26c Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 30 Mar 2021 12:06:25 +0200 Subject: [PATCH 299/649] feat(icon-list): accept images and h3 --- express/blocks/icon-list/icon-list.css | 10 +++++++++- express/blocks/icon-list/icon-list.js | 4 +++- express/scripts/scripts.js | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/express/blocks/icon-list/icon-list.css b/express/blocks/icon-list/icon-list.css index 6fe1194..b0e23af 100644 --- a/express/blocks/icon-list/icon-list.css +++ b/express/blocks/icon-list/icon-list.css @@ -4,6 +4,7 @@ main .icon-list { width: 300px; margin: 0 auto; padding-bottom: 80px; + margin-top: 40px; } main .icon-list > div { @@ -26,11 +27,18 @@ main .icon-list .icon { height: 40px; } +main .icon-list h3 { + font-size: 22px; + line-height: 26px; + text-align: left; +} + @media (min-width:600px) { main .icon-list { columns: 2; - column-gap: 32px; + column-gap: 18px; width: 588px; + margin-top: 56px; } } diff --git a/express/blocks/icon-list/icon-list.js b/express/blocks/icon-list/icon-list.js index f14a4dc..78906af 100644 --- a/express/blocks/icon-list/icon-list.js +++ b/express/blocks/icon-list/icon-list.js @@ -20,7 +20,9 @@ export default function decorate($block) { $block.querySelectorAll(':scope>div').forEach(($row) => { if ($row.children && $row.children[1]) { const iconName = toClassName($row.children[0].textContent); - $row.children[0].innerHTML = iconName ? getIcon(iconName) : ''; + if (iconName) { + $row.children[0].innerHTML = iconName ? getIcon(iconName) : ''; + } } }); } diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 2132928..723ce4d 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -765,7 +765,7 @@ function fixIcons() { if (alt) { const lowerAlt = alt.toLowerCase(); if (lowerAlt.includes('icon:')) { - const icon = lowerAlt.split('icon:')[1].trim().split(' ')[0]; + const icon = lowerAlt.split('icon:')[1].trim().replace(/\s/gm, '-'); const $picture = $img.closest('picture'); $picture.parentElement.replaceChild(getIconElement(icon), $picture); } From 8de952baa0d670e3dfa53cdc4260699b87da8a1c Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 30 Mar 2021 14:19:58 +0200 Subject: [PATCH 300/649] feat(image-list): new image list component based on columns --- express/blocks/image-list/image-list.css | 65 ++++++++++++++++++++++++ express/blocks/image-list/image-list.js | 18 +++++++ 2 files changed, 83 insertions(+) create mode 100644 express/blocks/image-list/image-list.css create mode 100644 express/blocks/image-list/image-list.js diff --git a/express/blocks/image-list/image-list.css b/express/blocks/image-list/image-list.css new file mode 100644 index 0000000..a896177 --- /dev/null +++ b/express/blocks/image-list/image-list.css @@ -0,0 +1,65 @@ +main .image-list { + margin-top: 70px; +} + +main .image-list > div { + display: flex; + flex-direction: column; + align-items: center; +} + +main .image-list.table > div { + align-items: center; +} + +main .image-list-container > div { + max-width: 1024px; +} + +main .image-list a > p:empty { + display: none; +} + +main .image-list > div span.num { + position:relative; + font-weight: 800; + font-size: 36px; + line-height: 39px; + top:0; + margin-right: 12px; +} + +main .image-list > div span.num + * { + display:inline; +} + +main .image-list img { + max-height: 50px; + max-width: 100%; +} + +main .image-list > div > div { + text-align: center; + padding: 20px; +} + +@media (min-width:900px) { + main .image-list > div { + flex-direction: row; + text-align: left; + } + + main .section-wrapper div.image-list > div > div { + width: 50%; + } + + main .section-wrapper div.image-list > div > div * { + text-align: left; + } + + main .image-list > div span.num { + font-size: 22px; + line-height: 29px; + display: block; + } +} \ No newline at end of file diff --git a/express/blocks/image-list/image-list.js b/express/blocks/image-list/image-list.js new file mode 100644 index 0000000..4f75e89 --- /dev/null +++ b/express/blocks/image-list/image-list.js @@ -0,0 +1,18 @@ +/* + * Copyright 2021 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. + */ +/* global */ + +import columns from '../columns/columns.js'; + +export default function dec($block) { + return columns($block); +} From 3999e9d06f8780e907db47013b72f325dcef87ba Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 30 Mar 2021 16:12:05 +0200 Subject: [PATCH 301/649] feat(quotes): inverted quotes --- express/blocks/quotes/quotes.css | 8 +++++--- express/styles/styles.css | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/express/blocks/quotes/quotes.css b/express/blocks/quotes/quotes.css index 6105cfc..2b7b1a6 100644 --- a/express/blocks/quotes/quotes.css +++ b/express/blocks/quotes/quotes.css @@ -19,7 +19,7 @@ main .quotes .quote { main .quotes .quote .content { padding-top: 28px; - font-size: 1.125rem; + font-size: 1rem; text-align: left; flex-grow: 1; } @@ -45,9 +45,12 @@ main .quotes .quote .author { align-self: baseline; } +main .quotes .quote .author .image { + padding-right: 16px; +} + main .quotes .quote .author .image picture { width: 42px; - padding-right: 16px; } main .quotes .quote .author .summary p { @@ -70,5 +73,4 @@ main .quotes .quote .author .summary p { main .quotes .quote { width: 230px; } - } diff --git a/express/styles/styles.css b/express/styles/styles.css index c5a9d93..593b1f4 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -537,6 +537,11 @@ main .section-wrapper.quotes-dark-container { background-color: #000; } +main .section-wrapper.quotes-inverted-container .quote { + background-color: #000; + color: #FFF; +} + main .section-wrapper.quotes-dark-container h2, main .section-wrapper.quotes-dark-container h3, main .section-wrapper.quotes-dark-container h4, From df8c9dbb255a1366d073ec5deea3cdfd267fedb1 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 30 Mar 2021 17:12:17 +0200 Subject: [PATCH 302/649] chore(css): cards and icon list --- express/blocks/cards/cards.css | 3 ++- express/blocks/icon-list/icon-list.css | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index 4e90d61..7b56275 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -77,10 +77,11 @@ main .cards.large .card .content p { @media (min-width:900px) { main .cards { - width: 800px; + width: 850px; margin: 0 auto; padding: 80px 0 80px 0; flex-direction: row; + flex-wrap: wrap; } main .cards .card { diff --git a/express/blocks/icon-list/icon-list.css b/express/blocks/icon-list/icon-list.css index b0e23af..13feaa3 100644 --- a/express/blocks/icon-list/icon-list.css +++ b/express/blocks/icon-list/icon-list.css @@ -27,9 +27,8 @@ main .icon-list .icon { height: 40px; } -main .icon-list h3 { - font-size: 22px; - line-height: 26px; +main .icon-list h3, main .icon-list h4 { + margin-top: 0; text-align: left; } From 9d40a5bdead60369fae25af962acbfca1a6b4262 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 30 Mar 2021 17:26:08 +0200 Subject: [PATCH 303/649] chore(css): fixed misplaced card --- express/blocks/cards/cards.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index 7b56275..56ed043 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -77,7 +77,7 @@ main .cards.large .card .content p { @media (min-width:900px) { main .cards { - width: 850px; + width: 870px; margin: 0 auto; padding: 80px 0 80px 0; flex-direction: row; @@ -89,6 +89,7 @@ main .cards.large .card .content p { margin-right: 32px; background-color: #FFF; box-shadow: 0 4px 8px 2px rgba(102, 102, 102, 0.1); + margin: 0 20px 16px 20px; } main .cards .card .hero { From 552bd268087c36c020067cb2d4559676c9a63fd7 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 30 Mar 2021 18:17:14 +0200 Subject: [PATCH 304/649] chore(css): style list --- express/blocks/cards/cards.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index 56ed043..d5a364e 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -70,7 +70,7 @@ main .cards.large .card .content h2 { margin-bottom: 32px; } -main .cards.large .card .content p { +main .cards.large .card .content p, main .cards.large .card .content li { text-align: left; font-size: 1.125rem; } @@ -107,7 +107,7 @@ main .cards.large .card .content p { margin-bottom: 8px; } - main .cards .card .content p { + main .cards .card .content p, main .cards .card .content li { font-size: 0.9rem; } From a31735c8f8c2c3ec8cf66561a2e4a0b36973f177 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 13:26:59 -0700 Subject: [PATCH 305/649] feat: centered column --- express/blocks/columns/columns.css | 11 ++++++++++- express/blocks/columns/columns.js | 7 +++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 5492c5e..84689eb 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -2,18 +2,27 @@ main .columns { margin-top: 70px; } +main .columns.width-3-columns h3 { + font-size: 28px; + line-height: 32px; +} + main .columns > div { display: flex; flex-direction: column; align-items: center; } +main .columns.centered > div > div { + text-align: center; +} + main .columns.table > div { align-items: flex-start; } main .columns.top > div { - align-items: top; + align-items: flex-start; } main .columns-container > div { diff --git a/express/blocks/columns/columns.js b/express/blocks/columns/columns.js index 3b76f3a..29a6abf 100644 --- a/express/blocks/columns/columns.js +++ b/express/blocks/columns/columns.js @@ -15,9 +15,16 @@ import { linkImage } from '../../scripts/scripts.js'; export default function decorate($block) { const $rows = Array.from($block.children); + console.log('columns'); if ($rows.length > 1) { $block.classList.add('table'); } + + let numCols = 0; + if ($rows[0]) numCols = $rows[0].children.length; + + if (numCols) $block.classList.add(`width-${numCols}-columns`); + $rows.forEach(($row, rowNum) => { const $cells = Array.from($row.children); $cells.forEach(($cell, cellNum) => { From b4dab900d35bcc67f6f2555c4c7e716fee129096 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 13:40:00 -0700 Subject: [PATCH 306/649] fix: image-list --- express/blocks/image-list/image-list.css | 61 +++--------------------- 1 file changed, 6 insertions(+), 55 deletions(-) diff --git a/express/blocks/image-list/image-list.css b/express/blocks/image-list/image-list.css index a896177..eb087e0 100644 --- a/express/blocks/image-list/image-list.css +++ b/express/blocks/image-list/image-list.css @@ -1,65 +1,16 @@ main .image-list { margin-top: 70px; -} - -main .image-list > div { - display: flex; - flex-direction: column; - align-items: center; -} - -main .image-list.table > div { + display: flex; align-items: center; -} - -main .image-list-container > div { - max-width: 1024px; -} - -main .image-list a > p:empty { - display: none; -} - -main .image-list > div span.num { - position:relative; - font-weight: 800; - font-size: 36px; - line-height: 39px; - top:0; - margin-right: 12px; -} - -main .image-list > div span.num + * { - display:inline; + flex-wrap: wrap; + justify-content: center; } main .image-list img { - max-height: 50px; - max-width: 100%; -} - -main .image-list > div > div { - text-align: center; + height: 48px; padding: 20px; } -@media (min-width:900px) { - main .image-list > div { - flex-direction: row; - text-align: left; - } - - main .section-wrapper div.image-list > div > div { - width: 50%; - } - - main .section-wrapper div.image-list > div > div * { - text-align: left; - } - - main .image-list > div span.num { - font-size: 22px; - line-height: 29px; - display: block; - } +main .image-list-container > div { + max-width: 1024px; } \ No newline at end of file From 46c7c8a893fcde45e025374948cd6e1dbc0cb6f8 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 13:50:22 -0700 Subject: [PATCH 307/649] fix: image-list --- express/blocks/image-list/image-list.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/express/blocks/image-list/image-list.js b/express/blocks/image-list/image-list.js index 4f75e89..219696b 100644 --- a/express/blocks/image-list/image-list.js +++ b/express/blocks/image-list/image-list.js @@ -11,8 +11,6 @@ */ /* global */ -import columns from '../columns/columns.js'; - -export default function dec($block) { - return columns($block); +export default function decorate($block) { + return $block; } From 53121910a19a30c4b0dbef573be7a97409c26a3f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 13:55:36 -0700 Subject: [PATCH 308/649] fix: quotes image --- express/blocks/quotes/quotes.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/express/blocks/quotes/quotes.css b/express/blocks/quotes/quotes.css index 2b7b1a6..6b0868e 100644 --- a/express/blocks/quotes/quotes.css +++ b/express/blocks/quotes/quotes.css @@ -49,8 +49,12 @@ main .quotes .quote .author .image { padding-right: 16px; } -main .quotes .quote .author .image picture { +main .quotes .quote .author .image img { width: 42px; + height: 42px; + max-width: unset; + border-radius: 21px; + box-sizing: border-box; } main .quotes .quote .author .summary p { From 7db0d3412ed491c184108d2dd7976a46c3b9e8c4 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 14:43:51 -0700 Subject: [PATCH 309/649] fix: cards layout --- express/blocks/cards/cards.css | 53 +++++++++++++++++++------------ express/blocks/cards/cards.js | 21 +++++++++--- express/blocks/columns/columns.js | 1 - 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index d5a364e..03546e9 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -1,3 +1,7 @@ +main .cards-container > div, main .cards-dark-container > div { + max-width: 1024px; +} + main .cards { padding: 16px 0 56px 0; display: flex; @@ -13,25 +17,28 @@ main .cards .card { flex-direction: column; } -main .cards .card .hero { +main .cards .card .card-image { box-sizing: border-box; - padding: 32px 32px 0 32px; - border-top-left-radius: 20px; - border-top-right-radius: 20px; + border-radius: 20px 20px 0 0; min-height: 136px; } -main .cards .card .content { +main .cards .card .card-image img { + border-radius: 20px 20px 0 0; +} + + +main .cards .card .card-content { padding: 32px 32px 8px 32px; color: #232323; } -main .cards .card .content h2 { +main .cards .card .card-content h2 { text-align: center; margin-bottom: 32px; } -main .cards .card .content p { +main .cards .card .card-content p { margin-top: 0; } @@ -39,11 +46,11 @@ main .cards.dark .card { background-color: #000; } -main .cards.dark .card .content { +main .cards.dark .card .card-content { color: #FFF; } -main .cards.dark .card .hero { +main .cards.dark .card .card-image { background-color: #343434; } @@ -59,29 +66,35 @@ main .cards.large .card .hero { min-height: 198px; } -main .cards.large .card .content { +main .cards.large .card .card-content { padding: 32px 32px 8px 32px; } -main .cards.large .card .content h2 { +main .cards.large .card .card-content h2 { text-align: left; font-size: 1.375rem; line-height: 1.1; margin-bottom: 32px; } -main .cards.large .card .content p, main .cards.large .card .content li { +main .cards.large .card .card-content p, main .cards.large .card .card-content li { text-align: left; font-size: 1.125rem; } @media (min-width:900px) { main .cards { - width: 870px; + max-width: 1024px; + width: unset; margin: 0 auto; padding: 80px 0 80px 0; flex-direction: row; flex-wrap: wrap; + justify-content: center; + } + + main .cards a.card { + text-decoration: none; } main .cards .card { @@ -89,25 +102,25 @@ main .cards.large .card .content p, main .cards.large .card .content li { margin-right: 32px; background-color: #FFF; box-shadow: 0 4px 8px 2px rgba(102, 102, 102, 0.1); - margin: 0 20px 16px 20px; + margin: 0 20px 32px 20px; } - main .cards .card .hero { + main .cards .card .card-image { background-color: #F1F3F4; } - main .cards .card .content { + main .cards .card .card-content { padding: 16px 16px 8px 16px; } - main .cards .card .content h2 { + main .cards .card .card-content h2 { text-align: center; font-size: 1.25rem; line-height: 1.2; margin-bottom: 8px; } - main .cards .card .content p, main .cards .card .content li { + main .cards .card .card-content p, main .cards .card .card-content li { font-size: 0.9rem; } @@ -126,7 +139,7 @@ main .cards.large .card .content p, main .cards.large .card .content li { flex-direction: row; } - main .cards.featured .card:first-of-type .hero { + main .cards.featured .card:first-of-type .card-image { border-top-left-radius: 20px; border-top-right-radius: 0; border-bottom-left-radius: 20px; @@ -134,7 +147,7 @@ main .cards.large .card .content p, main .cards.large .card .content li { min-width: 342px; } - main .cards.featured .card:first-of-type .content { + main .cards.featured .card:first-of-type .card-content { padding: 32px 40px 8px 40px; min-height: 294px; } diff --git a/express/blocks/cards/cards.js b/express/blocks/cards/cards.js index 4c1f713..9c40c28 100644 --- a/express/blocks/cards/cards.js +++ b/express/blocks/cards/cards.js @@ -11,12 +11,25 @@ */ /* global */ +import { createTag } from '../../scripts/scripts.js'; + export default function decorate($block) { $block.querySelectorAll(':scope>div').forEach(($card) => { $card.classList.add('card'); - if ($card.children.length > 1) { - $card.children[0].classList.add('hero'); - } - $card.lastElementChild.classList.add('content'); + const $cardDivs = [...$card.children]; + $cardDivs.forEach(($div) => { + if ($div.querySelector('img')) { + $div.classList.add('card-image'); + } else { + $div.classList.add('card-content'); + } + const $a = $div.querySelector('a'); + if ($a && $a.textContent.startsWith('https://')) { + const $wrapper = createTag('a', { href: $a.href, class: 'card' }); + $a.remove(); + $wrapper.innerHTML = $card.innerHTML; + $block.replaceChild($wrapper, $card); + } + }); }); } diff --git a/express/blocks/columns/columns.js b/express/blocks/columns/columns.js index 29a6abf..173e72c 100644 --- a/express/blocks/columns/columns.js +++ b/express/blocks/columns/columns.js @@ -15,7 +15,6 @@ import { linkImage } from '../../scripts/scripts.js'; export default function decorate($block) { const $rows = Array.from($block.children); - console.log('columns'); if ($rows.length > 1) { $block.classList.add('table'); } From a02206d0fe81d790232734b1b812792aae4c4001 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 15:24:51 -0700 Subject: [PATCH 310/649] fix: icon lists and blog-card refactor --- express/blocks/blog-posts/blog-posts.css | 38 ++++++++++++------------ express/blocks/blog-posts/blog-posts.js | 10 +++---- express/blocks/cards/cards.css | 10 +++---- express/blocks/icon-list/icon-list.css | 22 +++++++------- express/blocks/icon-list/icon-list.js | 2 ++ 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index 5e872d2..3f2fc02 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -7,7 +7,7 @@ main .blog-posts-container > div { padding: 0; } -main .blog-posts .cards { +main .blog-posts .blog-cards { display: flex; flex-wrap: wrap; justify-content: center; @@ -15,7 +15,7 @@ main .blog-posts .cards { width: unset; } -main .blog-posts .hero-card { +main .blog-posts .blog-hero-card { width: 100%; box-sizing: border-box; margin: 0; @@ -24,13 +24,13 @@ main .blog-posts .hero-card { color: unset; } -main .blog-posts .hero-card .card-image { +main .blog-posts .blog-hero-card .blog-card-image { width: 100%; padding-bottom: 66.67%; position: relative; } -main .blog-posts .hero-card .card-image img { +main .blog-posts .blog-hero-card .blog-card-image img { object-fit: cover; position: absolute; top: 0; @@ -45,11 +45,11 @@ main .blog-posts .hero-card .card-image img { main .blog-posts { text-align: center; } -main .blog-posts .card, main .blog-posts .hero-card { +main .blog-posts .blog-card, main .blog-posts .blog-hero-card { cursor: pointer; } -main .blog-posts .card { +main .blog-posts .blog-card { display: flex; flex-direction: column; width: 350px; @@ -59,36 +59,36 @@ main .blog-posts .card { color: unset; } - main .blog-posts .card .card-image { + main .blog-posts .blog-card .blog-card-image { line-height: 0; } - main .blog-posts .card .card-image img { + main .blog-posts .blog-card .blog-card-image img { height: 200px; object-fit: cover; width: 100%; border-radius: 10px 10px 0 0; } - main .blog-posts .hero-card .card-body { + main .blog-posts .blog-hero-card .blog-card-body { max-width: 700px; margin: auto; text-align: center; margin: 16px; } - main .blog-posts .hero-card .card-body p { + main .blog-posts .blog-hero-card .blog-card-body p { margin: 12px 0; } - main .blog-posts .hero-card .card-body h3 { + main .blog-posts .blog-hero-card .blog-card-body h3 { text-align: center; font-size: 28px; line-height: 32px; } - main .blog-posts .card-body h3 { + main .blog-posts .blog-card-body h3 { font-size: 18px; line-height: 22px; margin-top: 0; @@ -96,12 +96,12 @@ main .blog-posts .card { } - main .blog-posts .card .card-body p { + main .blog-posts .blog-card .blog-card-body p { font-size: 1rem; margin: 12px 0; } - main .blog-posts .card-body p.eyebrow { + main .blog-posts .blog-card-body p.eyebrow { text-transform: uppercase; margin: 0; margin-bottom: 12px; @@ -112,7 +112,7 @@ main .blog-posts .card { letter-spacing: .1em; } - main .blog-posts .card .card-body { + main .blog-posts .blog-card .blog-card-body { padding: 16px; border: 1px solid lightgrey; border-radius: 0 0 10px 10px; @@ -121,21 +121,21 @@ main .blog-posts .card { } @media (min-width: 600px) { - main .blog-posts .hero-card { + main .blog-posts .blog-hero-card { display: flex; flex-direction: row; align-items: center; } - main .blog-posts .hero-card .card-image { + main .blog-posts .blog-hero-card .blog-card-image { height: 320px; padding-bottom: 0; } - main .blog-posts .hero-card .card-body { + main .blog-posts .blog-hero-card .blog-card-body { text-align: left; } - main .blog-posts .hero-card .card-body h3 { + main .blog-posts .blog-hero-card .blog-card-body h3 { text-align: left; } diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index b919349..1b34a3a 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -102,9 +102,9 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { const limit = hasHero ? 13 : 12; - let $cards = $blogPosts.querySelector('.cards'); + let $cards = $blogPosts.querySelector('.blog-cards'); if (!$cards) { - $cards = createTag('div', { class: 'cards' }); + $cards = createTag('div', { class: 'blog-cards' }); $blogPosts.appendChild($cards); } @@ -128,13 +128,13 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { `; } const $card = createTag('a', { - class: `${isHero ? 'hero-card' : 'card'}`, + class: `${isHero ? 'blog-hero-card' : 'blog-card'}`, href: path, }); - $card.innerHTML = `
+ $card.innerHTML = `
${pictureTag}
-
+

${eyebrow}

${title}

${teaser}

diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index 03546e9..d896f18 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -1,5 +1,5 @@ main .cards-container > div, main .cards-dark-container > div { - max-width: 1024px; + max-width: 870px; } main .cards { @@ -46,6 +46,10 @@ main .cards.dark .card { background-color: #000; } +main .cards a.card { + text-decoration: none; +} + main .cards.dark .card .card-content { color: #FFF; } @@ -93,10 +97,6 @@ main .cards.large .card .card-content p, main .cards.large .card .card-content l justify-content: center; } - main .cards a.card { - text-decoration: none; - } - main .cards .card { width: 248px; margin-right: 32px; diff --git a/express/blocks/icon-list/icon-list.css b/express/blocks/icon-list/icon-list.css index 13feaa3..152dc64 100644 --- a/express/blocks/icon-list/icon-list.css +++ b/express/blocks/icon-list/icon-list.css @@ -1,27 +1,29 @@ main .icon-list { text-align: left; font-size: 1.125rem; - width: 300px; - margin: 0 auto; padding-bottom: 80px; margin-top: 40px; + display: flex; + justify-content: center; + flex-wrap: wrap; } main .icon-list > div { display: flex; - flex-direction: row; margin-bottom: 32px; + width: 350px; + margin: 16px; } -main .icon-list > div > div:first-child { - min-width: 64px; +main .icon-list p { + margin: 8px 0; } -main .icon-list > div > div:last-child { - flex-grow: 1; +main .icon-list .icon-list-image { + flex: 0 0 48px; } -main .icon-list .icon { +main .icon-list .icon, main .icon-list .icon-list-image img { fill: currentColor; width: 40px; height: 40px; @@ -34,16 +36,12 @@ main .icon-list h3, main .icon-list h4 { @media (min-width:600px) { main .icon-list { - columns: 2; - column-gap: 18px; - width: 588px; margin-top: 56px; } } @media (min-width:900px) { main .icon-list { - width: 792px; padding-bottom: 0; } } diff --git a/express/blocks/icon-list/icon-list.js b/express/blocks/icon-list/icon-list.js index 78906af..ec3d987 100644 --- a/express/blocks/icon-list/icon-list.js +++ b/express/blocks/icon-list/icon-list.js @@ -14,9 +14,11 @@ import { toClassName, getIcon, + addBlockClasses, } from '../../scripts/scripts.js'; export default function decorate($block) { + addBlockClasses($block, ['icon-list-image', 'icon-list-description']); $block.querySelectorAll(':scope>div').forEach(($row) => { if ($row.children && $row.children[1]) { const iconName = toClassName($row.children[0].textContent); From b9135b6ce09e4dbd69a4bf7287cc0ac9eee0a7a2 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 16:14:06 -0700 Subject: [PATCH 311/649] feat: dark columns and linked picture in default content --- express/blocks/columns/columns.css | 6 ++++++ express/scripts/scripts.js | 26 +++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 84689eb..31f2b43 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -1,3 +1,9 @@ +main .columns-dark-container { + background-color: black; + padding-bottom: 120px; + color: white; +} + main .columns { margin-top: 70px; } diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 723ce4d..7972ad3 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -62,6 +62,20 @@ export function getIconElement(icon) { return ($div.firstChild); } +export function linkPicture($picture) { + const $nextSib = $picture.parentNode.nextElementSibling; + if ($nextSib) { + console.log($nextSib); + const $a = $nextSib.querySelector('a'); + if ($a && $a.textContent.startsWith('https://')) { + console.log($a); + $a.innerHTML = ''; + $a.className = ''; + $a.appendChild($picture); + } + } +} + export function linkImage($elem) { const $a = $elem.querySelector('a'); if ($a) { @@ -876,12 +890,21 @@ function setTheme() { } } +function decorateLinkedPictures() { + /* thanks to word online */ + document.querySelectorAll('main picture').forEach(($picture) => { + if (!$picture.closest('div.block')) { + linkPicture($picture); + } + }); +} + async function decoratePage() { setTemplate(); setTheme(); await decorateTesting(); splitSections(); - wrapSections('main>div'); + wrapSections('main > div'); decorateHeaderAndFooter(); decorateHero(); decorateButtons(); @@ -889,6 +912,7 @@ async function decoratePage() { webpPolyfill(); decorateBlocks(); decorateDoMoreEmbed(); + decorateLinkedPictures(); setLCPTrigger(); document.body.classList.add('appear'); } From 8f91a359874f45d341860a221434c173bf0990bf Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 16:24:21 -0700 Subject: [PATCH 312/649] feat: legal block --- express/blocks/legal/legal.css | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 express/blocks/legal/legal.css diff --git a/express/blocks/legal/legal.css b/express/blocks/legal/legal.css new file mode 100644 index 0000000..648391e --- /dev/null +++ b/express/blocks/legal/legal.css @@ -0,0 +1,4 @@ +main .legal { + font-size: 12px; + line-height: 16px; +} \ No newline at end of file From 53d156827dedb99dfb693af7a850bd1e6fc82eb3 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 17:06:00 -0700 Subject: [PATCH 313/649] fix(icon-list): support new icons --- express/blocks/icon-list/icon-list.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/blocks/icon-list/icon-list.js b/express/blocks/icon-list/icon-list.js index ec3d987..4f170b1 100644 --- a/express/blocks/icon-list/icon-list.js +++ b/express/blocks/icon-list/icon-list.js @@ -21,8 +21,9 @@ export default function decorate($block) { addBlockClasses($block, ['icon-list-image', 'icon-list-description']); $block.querySelectorAll(':scope>div').forEach(($row) => { if ($row.children && $row.children[1]) { + const iconName = toClassName($row.children[0].textContent); - if (iconName) { + if (iconName && !iconName.startsWith('-')) { $row.children[0].innerHTML = iconName ? getIcon(iconName) : ''; } } From 6c7ea4d3c08627d87c430b08f024ea5bf6b50e9d Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 17:27:34 -0700 Subject: [PATCH 314/649] fix(cards): margin vs. padding --- express/blocks/cards/cards.css | 3 ++- express/blocks/icon-list/icon-list.js | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index d896f18..8b4e5ed 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -3,9 +3,10 @@ main .cards-container > div, main .cards-dark-container > div { } main .cards { - padding: 16px 0 56px 0; + padding: 16px 0 0 0; display: flex; flex-direction: column; + margin-bottom: 56px; } main .cards .card { diff --git a/express/blocks/icon-list/icon-list.js b/express/blocks/icon-list/icon-list.js index 4f170b1..d20e3b4 100644 --- a/express/blocks/icon-list/icon-list.js +++ b/express/blocks/icon-list/icon-list.js @@ -21,7 +21,6 @@ export default function decorate($block) { addBlockClasses($block, ['icon-list-image', 'icon-list-description']); $block.querySelectorAll(':scope>div').forEach(($row) => { if ($row.children && $row.children[1]) { - const iconName = toClassName($row.children[0].textContent); if (iconName && !iconName.startsWith('-')) { $row.children[0].innerHTML = iconName ? getIcon(iconName) : ''; From 70732bd5b3018e84594f442cb48df9b548c116b8 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 17:48:20 -0700 Subject: [PATCH 315/649] fix(cards): margin/padding --- express/blocks/cards/cards.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index 8b4e5ed..5a10bf8 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -3,7 +3,7 @@ main .cards-container > div, main .cards-dark-container > div { } main .cards { - padding: 16px 0 0 0; + padding: 56px 0 0 0; display: flex; flex-direction: column; margin-bottom: 56px; @@ -91,8 +91,7 @@ main .cards.large .card .card-content p, main .cards.large .card .card-content l main .cards { max-width: 1024px; width: unset; - margin: 0 auto; - padding: 80px 0 80px 0; + margin: 80px auto; flex-direction: row; flex-wrap: wrap; justify-content: center; From c07a4fd2cd47e5041b4cc39ef95413772d85bcad Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 18:02:46 -0700 Subject: [PATCH 316/649] feat: new icons --- express/icons.svg | 53 ++++++++++++++++++++++++++++++++++++-- express/scripts/scripts.js | 2 +- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/express/icons.svg b/express/icons.svg index 5db7633..6aed15c 100644 --- a/express/icons.svg +++ b/express/icons.svg @@ -161,8 +161,8 @@ Download Download - - + + @@ -172,4 +172,53 @@ + + Shapes + Shapes + + + + + Users + Users + + + + + + + + + + Color + Color + + + + + + + + + + + + Stickers + Stickers + + + + + + + + + Landscape + Landscape + + + + + + diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 7972ad3..e5687c4 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -46,7 +46,7 @@ export function getIcon(icon, alt = icon) { const symbols = ['adobe', 'adobe-red', 'facebook', 'instagram', 'pinterest', 'linkedin', 'twitter', 'youtube', 'discord', 'behance', 'creative-cloud', 'hamburger', 'adchoices', 'play', 'not-found', 'snapchat', 'learn', 'magicwand', - 'upload', 'resize', 'download', 'creativecloud']; + 'upload', 'resize', 'download', 'creativecloud', 'shapes', 'users', 'color', 'stickers', 'landscape']; if (symbols.includes(icon)) { return ` From 66e962f94cd4a8d944c44ec72bcc1cccfdb75b98 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 18:11:56 -0700 Subject: [PATCH 317/649] fix: link on banner --- express/blocks/banner/banner.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/blocks/banner/banner.css b/express/blocks/banner/banner.css index 2b229b4..4e0150c 100644 --- a/express/blocks/banner/banner.css +++ b/express/blocks/banner/banner.css @@ -6,6 +6,10 @@ main .banner { margin: 32px auto; } +main .banner a:any-link { + color: white; +} + @media (min-width:900px) { main .banner { margin: 40px auto; From ddb539dc1fe24548ddf40211bec693b904ee8c49 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 19:29:14 -0700 Subject: [PATCH 318/649] chore: initial full-width block --- express/blocks/full-width/full-width.css | 156 +++++++++++++++++++++++ express/blocks/full-width/full-width.js | 22 ++++ 2 files changed, 178 insertions(+) create mode 100644 express/blocks/full-width/full-width.css create mode 100644 express/blocks/full-width/full-width.js diff --git a/express/blocks/full-width/full-width.css b/express/blocks/full-width/full-width.css new file mode 100644 index 0000000..ed225a3 --- /dev/null +++ b/express/blocks/full-width/full-width.css @@ -0,0 +1,156 @@ +main .full-width { + color: white; + position: relative; + padding: 120px 32px; +} + +main .full-width.full-width-noimage { + color: black; + padding-top: 64px; + padding-bottom: 0; +} + +main .full-width-container { + margin: 0; + padding: 0; +} + +main .full-width-container > div { + margin: 0; + padding: 0; + width: 100%; + max-width: unset; + } + +main .full-width-container.full-width-noimage > div { + max-width: 1024px; +} + +main .full-width-container.full-width-noimage a.button:any-link { + color: white; +} + +main .full-width-container.full-width-noimage a:any-link{ + color: black; +} + +main .full-width h1 { + font-size: 45px; + font-weight: 900; + margin: 0; + line-height: 49px; +} + +main .full-width h2 { + font-size: 20px; + line-height: 28px; + margin: 32px 32px; + font-weight: 400; +} + +main .full-width h5 { + font-size: 18px; + font-weight: 500; + max-width: 672px; + margin: auto; + margin-top: 32px; +} + +main .full-width-container.full-width-noimage p { + font-size: 14px; +} + +main .full-width p { + margin: 16px 0; + font-size: 1.25rem; +} + +main .full-width a.button:any-link { + text-shadow: none; +} + +main .icon { + height: 1em; + width: 1em; + color: currentColor; +} + +main .full-width .icon { + height: 2em; + width: 2em; +} + +main .full-width .full-width-bg { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + box-sizing: border-box; + z-index: -1; +} + +main .full-width .full-width-bg img { + height: 100%; + width: 100%; + object-fit: cover; +} + +main .full-width > div { + padding: 0; +} + +main .full-width a:any-link { + color: currentColor; +} + +@media (min-width:600px) { + main .full-width h1 { + font-size: 60px; + line-height: 64px; + } + + main .full-width h2 { + font-size: 24px; + line-height: 28px; + margin-bottom: 40px; + } + + main .full-width h5 { + font-size: 22px; + font-weight: 500; + max-width: 672px; + margin: auto; + margin-top: 32px; + } + + main .full-width.full-width-noimage p { + font-size: 14px; + } + + + main .full-width { + padding: 80px 0; + } + + main .full-width>div { + max-width: 672px; + margin: auto; + } + + main .full-width .columns > div { + display: flex; + margin: auto; + justify-content: center; + } + +} + +@media (min-width:900px) { + main>.full-width h1 { + font-size: 3.5em; + } + main .full-width>div { + max-width: 950px; + } +} diff --git a/express/blocks/full-width/full-width.js b/express/blocks/full-width/full-width.js new file mode 100644 index 0000000..ee634c5 --- /dev/null +++ b/express/blocks/full-width/full-width.js @@ -0,0 +1,22 @@ +/* + * Copyright 2021 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. + */ +/* global */ + +export default function decorate($block) { + const $fullWidthPicture = $block.querySelector('picture'); + const $section = $block.closest('.section-wrapper'); + if ($fullWidthPicture) { + $fullWidthPicture.classList.add('full-width-bg'); + } else { + $section.classList.add('full-width-noimage'); + } +} From 8eb19e991cb5fe41269449c246b910f24f0fcec4 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 30 Mar 2021 19:34:41 -0700 Subject: [PATCH 319/649] chore: initial full-width block --- express/blocks/full-width/full-width.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/express/blocks/full-width/full-width.css b/express/blocks/full-width/full-width.css index ed225a3..28f37c4 100644 --- a/express/blocks/full-width/full-width.css +++ b/express/blocks/full-width/full-width.css @@ -130,7 +130,7 @@ main .full-width a:any-link { main .full-width { - padding: 80px 0; + padding: 120px 0; } main .full-width>div { @@ -153,4 +153,9 @@ main .full-width a:any-link { main .full-width>div { max-width: 950px; } + + main .full-width { + padding: 200px 0; + } + } From b8be883ff36fdcb13dddc167d275193e6479cf75 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 31 Mar 2021 14:17:44 +0200 Subject: [PATCH 320/649] fix(fragments): fragments only works if left cell has no text --- express/scripts/scripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index e5687c4..64c4701 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -373,7 +373,8 @@ function decorateDoMoreEmbed() { function resolveFragments() { Array.from(document.querySelectorAll('main > div div')) - .filter(($cell) => /^\[[A-Za-z0-9 -_]+\]$/mg.test($cell.textContent)) + .filter(($cell) => $cell.childElementCount === 0) + .filter(($cell) => /^\[[A-Za-z0-9 -_—]+\]$/mg.test($cell.textContent)) .forEach(($cell) => { const marker = $cell.textContent .substring(1, $cell.textContent.length - 1) From 4a017629213af9bcdc646cfdafa5077cc0c67f25 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 31 Mar 2021 14:22:10 +0200 Subject: [PATCH 321/649] fix(test): adjust column tests --- test/unit/blocks/expected/columns.singlerow.block.html | 2 +- test/unit/blocks/expected/columns.table.3.block.html | 2 +- test/unit/blocks/expected/columns.table.numbered.10.block.html | 2 +- test/unit/blocks/expected/columns.table.numbered.3.block.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/unit/blocks/expected/columns.singlerow.block.html b/test/unit/blocks/expected/columns.singlerow.block.html index a7738fd..a5c91dd 100644 --- a/test/unit/blocks/expected/columns.singlerow.block.html +++ b/test/unit/blocks/expected/columns.singlerow.block.html @@ -1,4 +1,4 @@ -
+

Resize your image for free.

diff --git a/test/unit/blocks/expected/columns.table.3.block.html b/test/unit/blocks/expected/columns.table.3.block.html index 3406b26..a0afc57 100644 --- a/test/unit/blocks/expected/columns.table.3.block.html +++ b/test/unit/blocks/expected/columns.table.3.block.html @@ -1,4 +1,4 @@ -
+

Resize your image for free.

diff --git a/test/unit/blocks/expected/columns.table.numbered.10.block.html b/test/unit/blocks/expected/columns.table.numbered.10.block.html index 1fdf719..77460af 100644 --- a/test/unit/blocks/expected/columns.table.numbered.10.block.html +++ b/test/unit/blocks/expected/columns.table.numbered.10.block.html @@ -1,4 +1,4 @@ -
+
01/10 — diff --git a/test/unit/blocks/expected/columns.table.numbered.3.block.html b/test/unit/blocks/expected/columns.table.numbered.3.block.html index 8266566..42293ee 100644 --- a/test/unit/blocks/expected/columns.table.numbered.3.block.html +++ b/test/unit/blocks/expected/columns.table.numbered.3.block.html @@ -1,4 +1,4 @@ -
+
1. From 23f878d228d4fc8a6cd0b23b0b2e0782a602e653 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 31 Mar 2021 17:25:23 +0200 Subject: [PATCH 322/649] feat(column): allow unterminated lists --- express/blocks/columns/columns.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/express/blocks/columns/columns.js b/express/blocks/columns/columns.js index 173e72c..c353cce 100644 --- a/express/blocks/columns/columns.js +++ b/express/blocks/columns/columns.js @@ -24,15 +24,25 @@ export default function decorate($block) { if (numCols) $block.classList.add(`width-${numCols}-columns`); + let total = $rows.length; + const isNumberedList = $block.classList.contains('numbered'); + if (isNumberedList && $block.classList.length > 4) { + const i = parseInt($block.classList[3], 10); + // eslint-disable-next-line no-restricted-globals + if (!isNaN(i)) { + total = i; + } + } + $rows.forEach(($row, rowNum) => { const $cells = Array.from($row.children); $cells.forEach(($cell, cellNum) => { - if (cellNum === 0 && $block.classList.contains('numbered')) { + if (cellNum === 0 && isNumberedList) { // add number to first cell let num = rowNum + 1; - if ($rows.length > 9) { + if (total > 9) { // stylize with total for 10 or more items - num = `${num}/${$rows.length} —`; + num = `${num}/${total} —`; if (rowNum < 9) { // pad number with 0 num = `0${num}`; From d99df7775cb2035ee8e27fcc0f69eebeed1c098d Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Wed, 31 Mar 2021 12:51:36 -0400 Subject: [PATCH 323/649] fix(pricing): fixing broken category icons --- express/blocks/pricing/pricing.js | 5 +++-- .../icons/{starter-features.svg => feature-category-0.svg} | 0 .../icons/{complete-features.svg => feature-category-1.svg} | 0 express/icons/{admin-features.svg => feature-category-2.svg} | 0 4 files changed, 3 insertions(+), 2 deletions(-) rename express/icons/{starter-features.svg => feature-category-0.svg} (100%) rename express/icons/{complete-features.svg => feature-category-1.svg} (100%) rename express/icons/{admin-features.svg => feature-category-2.svg} (100%) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index c31156d..9d1fffd 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -384,6 +384,7 @@ function decoratePlans($block, plans, planOptions) { function decorateTable($block, features) { const categories = []; + let categoryId = 0; const $featuresTable = createTag('table', { class: 'features' }); let odd = false; $block.append($featuresTable); @@ -393,8 +394,7 @@ function decorateTable($block, features) { const columnTwoCheck = feature['Column 2']; const columnThreeCheck = feature['Column 3']; if (!categories.includes(Category)) { - const imageName = toClassName(Category); - const categoryImage = `/express/icons/${imageName}.svg`; + const categoryImage = `/express/icons/feature-category-${categoryId}.svg`; const $categoryRow = createTag('tr', { class: 'category' }); $featuresTable.append($categoryRow); const $featureLogoColumn = createTag('td'); @@ -406,6 +406,7 @@ function decorateTable($block, features) { $categoryRow.append($categoryHeaderColumn); categories.push(Category); odd = false; + categoryId += 1; } const $featureRow = createTag('tr', { class: 'feature' }); if (odd) { diff --git a/express/icons/starter-features.svg b/express/icons/feature-category-0.svg similarity index 100% rename from express/icons/starter-features.svg rename to express/icons/feature-category-0.svg diff --git a/express/icons/complete-features.svg b/express/icons/feature-category-1.svg similarity index 100% rename from express/icons/complete-features.svg rename to express/icons/feature-category-1.svg diff --git a/express/icons/admin-features.svg b/express/icons/feature-category-2.svg similarity index 100% rename from express/icons/admin-features.svg rename to express/icons/feature-category-2.svg From cbd3c1a7eca78c5c4de85f05d64e00086ea72c31 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 10:23:13 -0700 Subject: [PATCH 324/649] feat(pricing): refactor getCountry/getLanguage, add default and lang --- express/scripts/martech.js | 27 +++++++-------------------- express/scripts/scripts.js | 38 +++++++++++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 55eb10c..64e6bdd 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -11,7 +11,12 @@ */ /* global window document digitalData _satellite fetch */ -import { loadScript, getLocale, createTag } from './scripts.js'; +import { + loadScript, + getLocale, + createTag, + getLanguage, +} from './scripts.js'; // this saves on file size when this file gets minified... const w = window; @@ -71,26 +76,8 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { const pathSegments = pathname.substr(1).split('/'); if (locale !== 'us') pathSegments.shift(); const pageName = `adobe.com:${pathSegments.join(':')}`; - const langs = { - us: 'en-US', - fr: 'fr-FR', - de: 'de-DE', - it: 'it-IT', - dk: 'da-DK', - es: 'es-ES', - fi: 'fi-FI', - jp: 'ja-JP', - kr: 'ko-KR', - no: 'nb-NO', - nl: 'nl-NL', - br: 'pt-BR', - se: 'sv-SE', - tw: 'zh-Hant-TW', - cn: 'zh-Hans-CN', - }; - let language = langs[locale]; - if (!language) language = 'en-US'; + const language = getLanguage(getLocale(window.location)); const langSplits = language.split('-'); langSplits.pop(); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 64c4701..34dd4c7 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -231,21 +231,53 @@ function getCountry() { return (country.split('_')[0]); } +export function getLanguage(locale) { + const langs = { + us: 'en-US', + fr: 'fr-FR', + de: 'de-DE', + it: 'it-IT', + dk: 'da-DK', + es: 'es-ES', + fi: 'fi-FI', + jp: 'ja-JP', + kr: 'ko-KR', + no: 'nb-NO', + nl: 'nl-NL', + br: 'pt-BR', + se: 'sv-SE', + tw: 'zh-Hant-TW', + cn: 'zh-Hans-CN', + }; + + let language = langs[locale]; + if (!language) language = 'en-US'; + + return language; +} + export async function getOffer(offerId, countryOverride) { let country = getCountry(); if (countryOverride) country = countryOverride; console.log(country); - const currency = getCurrency(country); + if (!country) country = 'us'; + let currency = getCurrency(country); + if (!currency) { + country = 'us'; + currency = 'USD'; + } const resp = await fetch('/express/system/offers.json'); const json = await resp.json(); const upperCountry = country.toUpperCase(); - const offer = json.data.find((e) => (e.o === offerId) && (e.c === upperCountry)); + let offer = json.data.find((e) => (e.o === offerId) && (e.c === upperCountry)); + if (!offer) offer = json.data.find((e) => (e.o === offerId) && (e.c === 'US')); if (offer) { + const lang = getLanguage(getLocale(window.location)).split('-')[0]; const unitPrice = offer.p; const currencyFormatter = new Intl.NumberFormat(navigator.lang, { style: 'currency', currency }); const unitPriceCurrencyFormatted = currencyFormatter.format(unitPrice); - const commerceURL = `https://commerce.adobe.com/checkout?cli=spark&co=${country}&items%5B0%5D%5Bid%5D=${offerId}&items%5B0%5D%5Bcs%5D=0&rUrl=https%3A%2F%2Fspark.adobe.com%2Fsp%2F`; + const commerceURL = `https://commerce.adobe.com/checkout?cli=spark&co=${country}&items%5B0%5D%5Bid%5D=${offerId}&items%5B0%5D%5Bcs%5D=0&rUrl=https%3A%2F%2Fspark.adobe.com%2Fsp%2F&lang=${lang}`; return { country, currency, unitPrice, unitPriceCurrencyFormatted, commerceURL, }; From 787141f7804d8ad80a81bd446f8402db5f98a6fc Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Wed, 31 Mar 2021 13:26:26 -0400 Subject: [PATCH 325/649] feat(pricing): dropdown analytic event --- express/blocks/pricing/pricing.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 9d1fffd..388496e 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -314,12 +314,16 @@ async function selectPlanOption($plan, option) { $cta.href = option.url; } -function addDropdownEventListener($plan, options) { +async function addDropdownEventListener($plan, options) { const $dropdown = $plan.querySelector('.plan-dropdown'); - $dropdown.addEventListener('change', (e) => { + $dropdown.addEventListener('change', async (e) => { const option = options[e.target.selectedIndex]; - selectPlanOption($plan, option); + await selectPlanOption($plan, option); + + digitalData._set('primaryEvent.eventInfo.eventName', `adobe.com:express:CTA:pricing:${option.frequency}:dropDown:Click`); + _satellite.track('event', { digitalData: digitalData._snapshot() }); + digitalData._delete('primaryEvent.eventInfo.eventName'); }); } From 9d13c952fa1df702ba4dfebf7b5b197800b211cd Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 10:29:49 -0700 Subject: [PATCH 326/649] chore: enable localized gnav --- express/scripts/martech.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 64e6bdd..b52aee1 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -415,7 +415,7 @@ async function showRegionPicker() { loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); -// const locale = getLocale(window.location); +const locale = getLocale(window.location); window.fedsConfig = { ...window.fedsConfig, @@ -425,7 +425,7 @@ window.fedsConfig = { showRegionPicker(); }, }, - // locale, + locale, content: { experience: 'cc-express/spark-gnav', }, From dfc75f6dcfe49cfd3df45e4494e6762a1d683f93 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Wed, 31 Mar 2021 13:39:25 -0400 Subject: [PATCH 327/649] fix(pricing): removing local caching on offers --- express/blocks/pricing/pricing.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 388496e..c7c7e90 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -292,10 +292,8 @@ async function rebuildOptionWithOffer(option) { async function selectPlanOption($plan, option) { $plan.dataset.optionId = option.optionId; - if (typeof option.id === 'undefined') { - // eslint-disable-next-line no-param-reassign - option = await rebuildOptionWithOffer(option); - } + // eslint-disable-next-line no-param-reassign + option = await rebuildOptionWithOffer(option); const $pricing = $plan.querySelector('.plan-pricing'); const $pricingText = $plan.querySelector('.plan-secondary'); const $cta = $plan.querySelector('.button.primary'); From 5df0949ca00b63090d14efebebc255fb12c7c091 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 11:31:35 -0700 Subject: [PATCH 328/649] feat: social icons --- express/blocks/columns/columns.css | 6 ++++ express/icons.svg | 8 +++++ express/scripts/scripts.js | 48 ++++++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 31f2b43..a4915ed 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -56,6 +56,12 @@ main .columns.center > div { align-items: center; } +main .columns .social.icon { + width: 32px; + height: 32px; + margin-right: 24px; +} + @media (min-width:900px) { main .columns > div { flex-direction: row; diff --git a/express/icons.svg b/express/icons.svg index 6aed15c..447062f 100644 --- a/express/icons.svg +++ b/express/icons.svg @@ -221,4 +221,12 @@ + + Globe + Globe + + + + + diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 34dd4c7..84e03d8 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -46,7 +46,7 @@ export function getIcon(icon, alt = icon) { const symbols = ['adobe', 'adobe-red', 'facebook', 'instagram', 'pinterest', 'linkedin', 'twitter', 'youtube', 'discord', 'behance', 'creative-cloud', 'hamburger', 'adchoices', 'play', 'not-found', 'snapchat', 'learn', 'magicwand', - 'upload', 'resize', 'download', 'creativecloud', 'shapes', 'users', 'color', 'stickers', 'landscape']; + 'upload', 'resize', 'download', 'creativecloud', 'shapes', 'users', 'color', 'stickers', 'landscape', 'globe']; if (symbols.includes(icon)) { return ` @@ -640,7 +640,7 @@ function decorateButtons() { if ($block) { blockName = $block.className; } - if (!noButtonBlocks.includes(blockName)) { + if (!noButtonBlocks.includes(blockName) && ($a.href !== $a.textContent)) { const $up = $a.parentElement; const $twoup = $a.parentElement.parentElement; if (!$a.querySelector('img')) { @@ -932,6 +932,49 @@ function decorateLinkedPictures() { }); } +function decorateSocialIcons() { + document.querySelectorAll('main a').forEach(($a) => { + if ($a.href === $a.textContent) { + let icon = ''; + if ($a.href.startsWith('https://www.instagram.com')) { + icon = 'instagram'; + } + if ($a.href.startsWith('https://twitter.com')) { + icon = 'twitter'; + } + if ($a.href.startsWith('https://www.pinterest.')) { + icon = 'pinterest'; + } + if ($a.href.startsWith('https://www.facebook.')) { + icon = 'facebook'; + } + if ($a.href.startsWith('https://www.linkedin.com')) { + icon = 'linkedin'; + } + if ($a.href.startsWith('https://www.youtube.com')) { + icon = 'youtube'; + } + const $parent = $a.parentElement; + if (!icon && $parent.previousElementSibling.classList.contains('social-links')) { + icon = 'globe'; + } + + if (icon) { + $a.innerHTML = ''; + const $icon = getIconElement(icon); + $icon.classList.add('social'); + $a.appendChild($icon); + if ($parent.previousElementSibling.classList.contains('social-links')) { + $parent.previousElementSibling.appendChild($a); + $parent.remove(); + } else { + $parent.classList.add('social-links'); + } + } + } + }); +} + async function decoratePage() { setTemplate(); setTheme(); @@ -946,6 +989,7 @@ async function decoratePage() { decorateBlocks(); decorateDoMoreEmbed(); decorateLinkedPictures(); + decorateSocialIcons(); setLCPTrigger(); document.body.classList.add('appear'); } From 795bcb339e37a758bf57eeb148ea54ece9e3fcda Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 11:40:00 -0700 Subject: [PATCH 329/649] fix: better guard --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 84e03d8..55753cb 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -955,7 +955,7 @@ function decorateSocialIcons() { icon = 'youtube'; } const $parent = $a.parentElement; - if (!icon && $parent.previousElementSibling.classList.contains('social-links')) { + if (!icon && $parent.previousElementSibling && $parent.previousElementSibling.classList.contains('social-links')) { icon = 'globe'; } From bd5a9361866641f685c74b4bfbc87319c1a7ed34 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 15:59:08 -0700 Subject: [PATCH 330/649] chore(getOffer): return lang --- express/scripts/scripts.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 55753cb..f1293a0 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -279,7 +279,7 @@ export async function getOffer(offerId, countryOverride) { const unitPriceCurrencyFormatted = currencyFormatter.format(unitPrice); const commerceURL = `https://commerce.adobe.com/checkout?cli=spark&co=${country}&items%5B0%5D%5Bid%5D=${offerId}&items%5B0%5D%5Bcs%5D=0&rUrl=https%3A%2F%2Fspark.adobe.com%2Fsp%2F&lang=${lang}`; return { - country, currency, unitPrice, unitPriceCurrencyFormatted, commerceURL, + country, currency, unitPrice, unitPriceCurrencyFormatted, commerceURL, lang, }; } return {}; @@ -975,6 +975,12 @@ function decorateSocialIcons() { }); } +function displayEnvs() { + const usp = new URLSearchParams(window.location.search); + if (usp.has('helix-env')) { + } +} + async function decoratePage() { setTemplate(); setTheme(); From b2793f1dc463e377fd6332646893ed03808d051f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 16:33:06 -0700 Subject: [PATCH 331/649] feat: env support --- express/scripts/scripts.js | 38 ++++++++++++++++++++++++++++++++++++-- express/styles/styles.css | 10 ++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index f1293a0..ddeda8b 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window, navigator, document, fetch, performance, PerformanceObserver */ +/* global window, navigator, document, fetch, performance, PerformanceObserver, localStorage */ /* eslint-disable no-console */ export function toClassName(name) { @@ -975,9 +975,42 @@ function decorateSocialIcons() { }); } -function displayEnvs() { +function getHelixEnv() { + let envName = localStorage.getItem('helix-env'); + if (!envName) envName = 'prod'; + const envs = { + stage: { + commerce: 'commerce-stg.adobe.com', + adminconsole: 'stage.adminconsole.adobe.com', + spark: 'stage.adobeprojectm.com', + }, + prod: { + + }, + }; + const env = envs[envName]; + if (env) { + env.name = envName; + } + return env; +} + +function displayEnv() { const usp = new URLSearchParams(window.location.search); if (usp.has('helix-env')) { + const env = usp.get('helix-env'); + if (env) { + localStorage.setItem('helix-env', env); + } else { + localStorage.removeItem('helix-env'); + } + } + + const env = localStorage.getItem('helix-env'); + if (env) { + const $helixEnv = createTag('div', { class: 'helix-env' }); + $helixEnv.innerHTML = env + (getHelixEnv(env) ? '' : ' [not found]'); + document.body.appendChild($helixEnv); } } @@ -997,6 +1030,7 @@ async function decoratePage() { decorateLinkedPictures(); decorateSocialIcons(); setLCPTrigger(); + displayEnv(); document.body.classList.add('appear'); } diff --git a/express/styles/styles.css b/express/styles/styles.css index 593b1f4..090ae54 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -713,3 +713,13 @@ main .page-list-container, main .pricing { height: 100vh; transition: opacity 100ms; } + +.helix-env { + position: fixed; + display: inline-block; + padding: 5px 20px; + color: white; + background-color: #ff000080; + bottom: 0; + right: 0; +} \ No newline at end of file From 3bb562eb138566e68323f1be8b071874c23e5e1e Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 17:35:33 -0700 Subject: [PATCH 332/649] fix(column): centered --- express/blocks/columns/columns.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index a4915ed..3bdf086 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -77,6 +77,11 @@ main .columns .social.icon { text-align: left; } + main .section-wrapper div.columns.centered > div > div * { + text-align: center; + } + + main .columns > div span.num { font-size: 22px; line-height: 29px; From 22d5b06225fcbc82dc9c01ec5391c1608f360511 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 17:49:43 -0700 Subject: [PATCH 333/649] fix(sticky-promo): minor layout --- express/blocks/sticky-promo-bar/sticky-promo-bar.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/blocks/sticky-promo-bar/sticky-promo-bar.css b/express/blocks/sticky-promo-bar/sticky-promo-bar.css index b223528..19716d1 100644 --- a/express/blocks/sticky-promo-bar/sticky-promo-bar.css +++ b/express/blocks/sticky-promo-bar/sticky-promo-bar.css @@ -8,7 +8,6 @@ main .sticky-promo-bar { padding: 12px; padding-right: 36px; font-weight: 800; - line-height: 2em; z-index: 10; } @@ -22,6 +21,8 @@ main .sticky-promo-bar a:any-link { font-weight: 500; font-size: 0.9em; white-space: nowrap; + display: inline-block; + margin-top: 5px; } main .sticky-promo-bar .close { From e5f803111e874cc3f58f1dab10dadf85c19c566d Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Wed, 31 Mar 2021 20:55:34 -0400 Subject: [PATCH 334/649] fix(pricing): add language and country support to generated urls --- express/blocks/pricing/pricing.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index c7c7e90..8db0cd7 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -91,8 +91,14 @@ function replaceUrlParam(url, paramName, paramValue) { return url.toString(); } -function buildUrl(optionUrl, optionPlan) { - const planUrl = new URL(optionUrl); +function buildUrl(optionUrl, optionPlan, country, language) { + let planUrl = new URL(optionUrl); + + planUrl = replaceUrlParam(planUrl, 'co', country); + planUrl = new URL(planUrl); + planUrl = replaceUrlParam(planUrl, 'lang', language); + planUrl = new URL(planUrl); + const currentUrl = new URL(window.location.href); let rUrl = planUrl.searchParams.get('rUrl'); if (currentUrl.searchParams.has('host')) { @@ -121,6 +127,7 @@ function buildUrl(optionUrl, optionPlan) { if (currentUrl.searchParams.has('code')) { planUrl.searchParams.set('code', currentUrl.searchParams.get('code')); } + if (currentUrl.searchParams.get('rUrl')) { rUrl = currentUrl.searchParams.get('rUrl'); } @@ -253,8 +260,10 @@ async function rebuildOptionWithOffer(option) { const offerId = option['OfferID']; const fullPriceOfferId = option['Full Price OfferID']; let priceUnformatted = parseFloat(price); - let ctaUrl = buildUrl(option['Option Url'], option['Option Plan']); + let language = 'en'; + let country = 'us'; let currency = 'USD'; + const ctaUrl = option['Option Url']; const countryOverride = new URLSearchParams(window.location.search).get('country'); if (offerId) { @@ -262,7 +271,8 @@ async function rebuildOptionWithOffer(option) { currency = offer.currency; price = offer.unitPriceCurrencyFormatted; priceUnformatted = offer.unitPrice; - ctaUrl = offer.commerceURL; + country = offer.country; + language = offer.lang; if (!fullPriceOfferId) { fullPrice = offer.unitPriceCurrencyFormatted; } @@ -280,7 +290,7 @@ async function rebuildOptionWithOffer(option) { option.fullPrice = fullPrice; option.fullPriceUnit = fullPriceUnit; option.text = text; - option.url = ctaUrl; + option.url = buildUrl(ctaUrl, option['Option Plan'], country, language); option.cta = cta; option.currency = currency; option.frequency = option['Analytics Frequency do-not-translate']; From 837c90ca567be2421c674d4702f19f5dd7a0754a Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Wed, 31 Mar 2021 21:13:11 -0400 Subject: [PATCH 335/649] fix(pricing): fix replace parameter issue --- express/blocks/pricing/pricing.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 8db0cd7..de45b20 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -88,16 +88,14 @@ function replaceUrlParam(url, paramName, paramValue) { const params = url.searchParams; params.set(paramName, paramValue); url.search = params.toString(); - return url.toString(); + return url; } function buildUrl(optionUrl, optionPlan, country, language) { let planUrl = new URL(optionUrl); planUrl = replaceUrlParam(planUrl, 'co', country); - planUrl = new URL(planUrl); planUrl = replaceUrlParam(planUrl, 'lang', language); - planUrl = new URL(planUrl); const currentUrl = new URL(window.location.href); let rUrl = planUrl.searchParams.get('rUrl'); @@ -115,6 +113,9 @@ function buildUrl(optionUrl, optionPlan, country, language) { rUrl = rUrl.replace('spark.adobe.com', hostParam); } } + + rUrl = new URL(rUrl); + if (currentUrl.searchParams.has('touchpointName')) { rUrl = replaceUrlParam(rUrl, 'touchpointName', currentUrl.searchParams.get('touchpointName')); } @@ -132,7 +133,7 @@ function buildUrl(optionUrl, optionPlan, country, language) { rUrl = currentUrl.searchParams.get('rUrl'); } - planUrl.searchParams.set('rUrl', rUrl); + planUrl.searchParams.set('rUrl', rUrl.toString()); return planUrl.href; } From 6c1fdf49c68f49df88b7f552396e68adc2f53f72 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 18:44:36 -0700 Subject: [PATCH 336/649] fix: better guard --- express/blocks/pricing/pricing.js | 32 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index de45b20..545346e 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -16,7 +16,6 @@ import { createTag, getOffer, readBlockConfig, - toClassName, } from '../../scripts/scripts.js'; async function fetchPricingTab(sheet, tab) { @@ -103,28 +102,31 @@ function buildUrl(optionUrl, optionPlan, country, language) { const hostParam = currentUrl.searchParams.get('host'); if (hostParam === 'spark.adobe.com') { planUrl.hostname = 'commerce.adobe.com'; - rUrl = rUrl.replace('spark.adobe.com', hostParam); + if (rUrl) rUrl = rUrl.replace('spark.adobe.com', hostParam); } else if (hostParam.includes('qa.adobeprojectm.com')) { planUrl.hostname = 'commerce.adobe.com'; - rUrl = rUrl.replace('spark.adobe.com', hostParam); + if (rUrl) rUrl = rUrl.replace('spark.adobe.com', hostParam); } else if (hostParam.includes('.adobeprojectm.com')) { planUrl.hostname = 'commerce-stg.adobe.com'; - rUrl = rUrl.replace('adminconsole.adobe.com', 'stage.adminconsole.adobe.com'); - rUrl = rUrl.replace('spark.adobe.com', hostParam); + if (rUrl) rUrl = rUrl.replace('adminconsole.adobe.com', 'stage.adminconsole.adobe.com'); + if (rUrl) rUrl = rUrl.replace('spark.adobe.com', hostParam); } } - rUrl = new URL(rUrl); + if (rUrl) { + rUrl = new URL(rUrl); - if (currentUrl.searchParams.has('touchpointName')) { - rUrl = replaceUrlParam(rUrl, 'touchpointName', currentUrl.searchParams.get('touchpointName')); - } - if (currentUrl.searchParams.has('destinationUrl') && optionPlan === 'Individual') { - rUrl = replaceUrlParam(rUrl, 'destinationUrl', currentUrl.searchParams.get('destinationUrl')); - } - if (currentUrl.searchParams.has('srcUrl')) { - rUrl = replaceUrlParam(rUrl, 'srcUrl', currentUrl.searchParams.get('srcUrl')); + if (currentUrl.searchParams.has('touchpointName')) { + rUrl = replaceUrlParam(rUrl, 'touchpointName', currentUrl.searchParams.get('touchpointName')); + } + if (currentUrl.searchParams.has('destinationUrl') && optionPlan === 'Individual') { + rUrl = replaceUrlParam(rUrl, 'destinationUrl', currentUrl.searchParams.get('destinationUrl')); + } + if (currentUrl.searchParams.has('srcUrl')) { + rUrl = replaceUrlParam(rUrl, 'srcUrl', currentUrl.searchParams.get('srcUrl')); + } } + if (currentUrl.searchParams.has('code')) { planUrl.searchParams.set('code', currentUrl.searchParams.get('code')); } @@ -133,7 +135,7 @@ function buildUrl(optionUrl, optionPlan, country, language) { rUrl = currentUrl.searchParams.get('rUrl'); } - planUrl.searchParams.set('rUrl', rUrl.toString()); + if (rUrl) planUrl.searchParams.set('rUrl', rUrl.toString()); return planUrl.href; } From 78564e651d21459cfb3326e15d858a4c3e53a156 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 19:08:55 -0700 Subject: [PATCH 337/649] feat: add basic env support --- express/blocks/pricing/pricing.js | 4 ++++ express/scripts/scripts.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 545346e..54cb897 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -16,6 +16,7 @@ import { createTag, getOffer, readBlockConfig, + getHelixEnv, } from '../../scripts/scripts.js'; async function fetchPricingTab(sheet, tab) { @@ -113,6 +114,9 @@ function buildUrl(optionUrl, optionPlan, country, language) { } } + const env = getHelixEnv(); + if (env && env.commerce && planUrl.hostname.includes('commerce')) planUrl.hostname = env.commerce; + if (rUrl) { rUrl = new URL(rUrl); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index ddeda8b..010490a 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -975,7 +975,7 @@ function decorateSocialIcons() { }); } -function getHelixEnv() { +export function getHelixEnv() { let envName = localStorage.getItem('helix-env'); if (!envName) envName = 'prod'; const envs = { From b80c3b8fd1f2a141ad4a9e1513041663c98f1528 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 20:34:02 -0700 Subject: [PATCH 338/649] feat: alternate homepage layout --- express/blocks/full-width/full-width.css | 4 ++++ express/blocks/full-width/full-width.js | 7 ++++++- express/blocks/image-list/image-list.css | 8 ++++++-- express/blocks/image-list/image-list.js | 10 +++++++++- .../show-section-only/show-section-only.css | 19 +++++++++++++++++++ .../show-section-only/show-section-only.js | 0 express/scripts/scripts.js | 2 +- 7 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 express/blocks/show-section-only/show-section-only.css create mode 100644 express/blocks/show-section-only/show-section-only.js diff --git a/express/blocks/full-width/full-width.css b/express/blocks/full-width/full-width.css index 28f37c4..6185ba5 100644 --- a/express/blocks/full-width/full-width.css +++ b/express/blocks/full-width/full-width.css @@ -4,6 +4,10 @@ main .full-width { padding: 120px 32px; } +main .full-width.image-only { + padding-bottom: 0; +} + main .full-width.full-width-noimage { color: black; padding-top: 64px; diff --git a/express/blocks/full-width/full-width.js b/express/blocks/full-width/full-width.js index ee634c5..7ff9bd0 100644 --- a/express/blocks/full-width/full-width.js +++ b/express/blocks/full-width/full-width.js @@ -15,7 +15,12 @@ export default function decorate($block) { const $fullWidthPicture = $block.querySelector('picture'); const $section = $block.closest('.section-wrapper'); if ($fullWidthPicture) { - $fullWidthPicture.classList.add('full-width-bg'); + if ($fullWidthPicture.parentNode.tagName === 'DIV') { + $fullWidthPicture.classList.add('full-width-imageonly'); + $block.classList.add('image-only'); + } else { + $fullWidthPicture.classList.add('full-width-bg'); + } } else { $section.classList.add('full-width-noimage'); } diff --git a/express/blocks/image-list/image-list.css b/express/blocks/image-list/image-list.css index eb087e0..8fd2f5b 100644 --- a/express/blocks/image-list/image-list.css +++ b/express/blocks/image-list/image-list.css @@ -6,9 +6,13 @@ main .image-list { justify-content: center; } +main .image-list.app { + margin-top: 20px; +} + main .image-list img { - height: 48px; - padding: 20px; + height: 54px; + padding: 10px; } main .image-list-container > div { diff --git a/express/blocks/image-list/image-list.js b/express/blocks/image-list/image-list.js index 219696b..1c25c02 100644 --- a/express/blocks/image-list/image-list.js +++ b/express/blocks/image-list/image-list.js @@ -12,5 +12,13 @@ /* global */ export default function decorate($block) { - return $block; + const $rows = Array.from($block.children); + $rows.forEach(($row) => { + const $cells = Array.from($row.children); + if ($cells[1]) { + const $a = $cells[1].querySelector('a'); + $a.innerHTML = $cells[0].innerHTML; + $cells[0].remove(); + } + }); } diff --git a/express/blocks/show-section-only/show-section-only.css b/express/blocks/show-section-only/show-section-only.css new file mode 100644 index 0000000..bc72881 --- /dev/null +++ b/express/blocks/show-section-only/show-section-only.css @@ -0,0 +1,19 @@ +main .show-section-only-desktop-container { + display: none; +} + +@media (min-width: 600px) { + main .show-section-only-desktop-container { + display: block; + } +} + +main .show-section-only-mobile-container { + display: block; +} + +@media (min-width: 600px) { + main .show-section-only-mobile-container { + display: none; + } +} diff --git a/express/blocks/show-section-only/show-section-only.js b/express/blocks/show-section-only/show-section-only.js new file mode 100644 index 0000000..e69de29 diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 010490a..8ccac1a 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -448,7 +448,7 @@ function decorateBlocks() { if ($section) { $section.classList.add(`${blockName}-container`.replaceAll('--', '-')); } - const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards', 'quotes', 'page-list', 'columns']; + const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards', 'quotes', 'page-list', 'columns', 'show-section-only', 'image-list']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { const options = blockName.substring(b.length + 1).split('-').filter((opt) => !!opt); From a8deab36fc4fb94274a98e1244788e3d03f96949 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 31 Mar 2021 20:35:06 -0700 Subject: [PATCH 339/649] feat: alternate homepage layout --- express/blocks/full-width/full-width.css | 2 +- express/blocks/image-list/image-list.css | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/express/blocks/full-width/full-width.css b/express/blocks/full-width/full-width.css index 6185ba5..f8d7e1c 100644 --- a/express/blocks/full-width/full-width.css +++ b/express/blocks/full-width/full-width.css @@ -5,7 +5,7 @@ main .full-width { } main .full-width.image-only { - padding-bottom: 0; + padding: 120px 0 0 0; } main .full-width.full-width-noimage { diff --git a/express/blocks/image-list/image-list.css b/express/blocks/image-list/image-list.css index 8fd2f5b..3912783 100644 --- a/express/blocks/image-list/image-list.css +++ b/express/blocks/image-list/image-list.css @@ -11,10 +11,16 @@ main .image-list.app { } main .image-list img { - height: 54px; - padding: 10px; + height: 48px; + padding: 20px; } +main .image-list.app img { + height: 48px; + padding: 8px; +} + + main .image-list-container > div { max-width: 1024px; } \ No newline at end of file From 8591b36cdd3bfb8b7a6b9fd54d746c41de235f39 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 07:29:28 -0700 Subject: [PATCH 340/649] fix(feature-list): layout adjustments --- express/blocks/feature-list/feature-list.css | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/express/blocks/feature-list/feature-list.css b/express/blocks/feature-list/feature-list.css index 7bdd09e..f3e8896 100644 --- a/express/blocks/feature-list/feature-list.css +++ b/express/blocks/feature-list/feature-list.css @@ -3,11 +3,12 @@ main .feature-list { flex-wrap: wrap; justify-content: center; margin: auto; + margin-top: 56px; } main .feature-list img { - width: 32px; + height: 48px; } main .feature-list > div { @@ -16,6 +17,16 @@ main .feature-list > div { } main .feature-list h3 { + font-size: 26px; + line-height: 30px; +} + +main .feature-list h4 { font-size: 22px; line-height: 26px; + margin-top: 20px; +} + +main .feature-list p { + margin-top: 20px; } \ No newline at end of file From e97424b10e09fce014124cb6831822bca118196c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 07:33:04 -0700 Subject: [PATCH 341/649] fix(quotes): design adjustment --- express/blocks/quotes/quotes.css | 17 +++++++++++++++++ express/styles/styles.css | 16 ---------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/express/blocks/quotes/quotes.css b/express/blocks/quotes/quotes.css index 6b0868e..07e58a3 100644 --- a/express/blocks/quotes/quotes.css +++ b/express/blocks/quotes/quotes.css @@ -64,6 +64,23 @@ main .quotes .quote .author .summary p { line-height: 1.2; } +main .section-wrapper.quotes-dark-container { + margin-top: 120px; + background-color: #000; +} + +main .section-wrapper.quotes-inverted-container .quote { + background-color: #000; + color: #FFF; +} + +main .section-wrapper.quotes-dark-container h2, +main .section-wrapper.quotes-dark-container h3, +main .section-wrapper.quotes-dark-container h4, +main .section-wrapper.quotes-dark-container h5 { + color: #FFF; +} + @media (min-width:900px) { main .quotes { diff --git a/express/styles/styles.css b/express/styles/styles.css index 090ae54..d712660 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -533,22 +533,6 @@ main .section-wrapper.cards-container { padding-top: 0; } -main .section-wrapper.quotes-dark-container { - background-color: #000; -} - -main .section-wrapper.quotes-inverted-container .quote { - background-color: #000; - color: #FFF; -} - -main .section-wrapper.quotes-dark-container h2, -main .section-wrapper.quotes-dark-container h3, -main .section-wrapper.quotes-dark-container h4, -main .section-wrapper.quotes-dark-container h5 { - color: #FFF; -} - main .section-wrapper .hero { color: initial; } From be011bb3f13b604f149fbac9b2601f2397afa5b5 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 09:27:12 -0700 Subject: [PATCH 342/649] chore: liniting --- .../show-section-only/show-section-only.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/express/blocks/show-section-only/show-section-only.js b/express/blocks/show-section-only/show-section-only.js index e69de29..e86a842 100644 --- a/express/blocks/show-section-only/show-section-only.js +++ b/express/blocks/show-section-only/show-section-only.js @@ -0,0 +1,16 @@ +/* + * Copyright 2021 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. + */ + +export default function decorate() { + // eslint-disable-next-line no-useless-return + return; +} From 24ab7100824838d1b9c5c0a171de4b51c073a6ac Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 10:04:19 -0700 Subject: [PATCH 343/649] fix(fragments): remove marker h3 --- express/scripts/scripts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 8ccac1a..0580c3b 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -434,6 +434,7 @@ function resolveFragments() { setTimeout(() => { $cell.innerHTML = ''; Array.from($fragment.children).forEach(($elem) => $cell.appendChild($elem)); + $marker.remove(); $fragment.remove(); console.log(`fragment "${marker}" resolved`); }, 500); From ec4158e7a48cad2c8ebda7e3c1d40b36be29bb58 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 11:39:54 -0700 Subject: [PATCH 344/649] chore: add initial linkchecker --- express/scripts/scripts.js | 13 +++++++++++++ express/styles/styles.css | 10 ---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 0580c3b..c3b55a7 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -996,6 +996,18 @@ export function getHelixEnv() { return env; } +function displayOldLinkWarning() { + if (window.location.hostname.includes('localhost') || window.location.hostname.includes('.hlx.page')) { + document.querySelectorAll('main a[href^="https://spark.adobe.com/"]').forEach(($a) => { + const url = new URL($a.href); + if (!(url.pathname.startsWith('/sp') || url.pathname.startsWith('/tools/'))) { + console.log(`old link: ${$a}`); + $a.style.border = '10px solid red'; + } + }); + } +} + function displayEnv() { const usp = new URLSearchParams(window.location.search); if (usp.has('helix-env')) { @@ -1032,6 +1044,7 @@ async function decoratePage() { decorateSocialIcons(); setLCPTrigger(); displayEnv(); + displayOldLinkWarning(); document.body.classList.add('appear'); } diff --git a/express/styles/styles.css b/express/styles/styles.css index d712660..81074d7 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -697,13 +697,3 @@ main .page-list-container, main .pricing { height: 100vh; transition: opacity 100ms; } - -.helix-env { - position: fixed; - display: inline-block; - padding: 5px 20px; - color: white; - background-color: #ff000080; - bottom: 0; - right: 0; -} \ No newline at end of file From 0aeb09a19f889fcf9292f496e10c28eadb93a83a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 11:40:19 -0700 Subject: [PATCH 345/649] chore: add initial linkchecker --- express/styles/lazy-styles.css | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index 680599a..a933228 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -175,3 +175,19 @@ main .blog-posts .card .card-body p { columns: 280px auto; } + +.helix-env { + position: fixed; + display: inline-block; + padding: 5px 20px; + color: white; + background-color: #ff000080; + bottom: 0; + right: 0; +} + + +.helix-link-warning { + border-color: red !important; + border-width: 3px; +} \ No newline at end of file From 6f7f06961e1f9139e075dec934d98ca55b1b9a37 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 12:12:27 -0700 Subject: [PATCH 346/649] fix: oldLinkChecker and social --- express/scripts/scripts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index c3b55a7..ccf3520 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -965,7 +965,7 @@ function decorateSocialIcons() { const $icon = getIconElement(icon); $icon.classList.add('social'); $a.appendChild($icon); - if ($parent.previousElementSibling.classList.contains('social-links')) { + if ($parent.previousElementSibling && $parent.previousElementSibling.classList.contains('social-links')) { $parent.previousElementSibling.appendChild($a); $parent.remove(); } else { @@ -1000,7 +1000,7 @@ function displayOldLinkWarning() { if (window.location.hostname.includes('localhost') || window.location.hostname.includes('.hlx.page')) { document.querySelectorAll('main a[href^="https://spark.adobe.com/"]').forEach(($a) => { const url = new URL($a.href); - if (!(url.pathname.startsWith('/sp') || url.pathname.startsWith('/tools/'))) { + if (!(url.pathname.startsWith('/sp') || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/'))) { console.log(`old link: ${$a}`); $a.style.border = '10px solid red'; } From ca62571604f8bee2f542d3fb3863ae899d94f1ea Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 12:17:39 -0700 Subject: [PATCH 347/649] fix: oldLinkChecker --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index ccf3520..8b4d3de 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1000,7 +1000,7 @@ function displayOldLinkWarning() { if (window.location.hostname.includes('localhost') || window.location.hostname.includes('.hlx.page')) { document.querySelectorAll('main a[href^="https://spark.adobe.com/"]').forEach(($a) => { const url = new URL($a.href); - if (!(url.pathname.startsWith('/sp') || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/'))) { + if (!(url.pathname.startsWith('/sp') || url.pathname === '/' || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/'))) { console.log(`old link: ${$a}`); $a.style.border = '10px solid red'; } From 12a5875601e3a28cfda52be32b930bbbe9a826e1 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 12:21:54 -0700 Subject: [PATCH 348/649] fix: oldLinkChecker --- express/scripts/scripts.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 8b4d3de..7af6e3a 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1000,7 +1000,9 @@ function displayOldLinkWarning() { if (window.location.hostname.includes('localhost') || window.location.hostname.includes('.hlx.page')) { document.querySelectorAll('main a[href^="https://spark.adobe.com/"]').forEach(($a) => { const url = new URL($a.href); - if (!(url.pathname.startsWith('/sp') || url.pathname === '/' || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/'))) { + if (!(url.pathname.startsWith('/sp') || url.pathname === '/' + || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/') + || url.pathname.startsWith('/post/'))) { console.log(`old link: ${$a}`); $a.style.border = '10px solid red'; } From 8d6530595ba9f5afd44ad50e004e13ca8ca37369 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 12:32:43 -0700 Subject: [PATCH 349/649] feat: update blog to index --- express/blocks/blog-posts/blog-posts.js | 15 +++++++++------ express/scripts/scripts.js | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 1b34a3a..1cf6924 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -15,10 +15,11 @@ import { createTag, readBlockConfig, + getOptimizedImageURL, } from '../../scripts/scripts.js'; async function fetchBlogIndex() { - const resp = await fetch('/express/learn/blog/dev-query-index.json'); + const resp = await fetch('/express/learn/blog/query-index.json'); const json = await resp.json(); const byPath = {}; json.data.forEach((post) => { @@ -113,18 +114,20 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { for (let i = offset; i < max; i += 1) { const post = posts[i]; const { - path, title, teaser, tags, image, + path, title, teaser, tags, image, category, } = post; const tagsArr = JSON.parse(tags); - const eyebrow = tagsArr[0] ? tagsArr[0].replace('-', ' ') : ''; + const eyebrow = category; const isHero = hasHero && !i; const imagePath = image.split('?')[0].split('_')[1]; - let pictureTag = ``; + const imageSrc = getOptimizedImageURL(`./media_${imagePath}?format=webply&optimize=medium&width=750`); + const heroSrc = getOptimizedImageURL(`./media_${imagePath}?format=webply&optimize=medium&width=2000`); + let pictureTag = ``; if (isHero) { pictureTag = ` - - + + `; } const $card = createTag('a', { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 7af6e3a..6631868 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -590,7 +590,7 @@ function decorateHero() { const tagString = getMeta('article:tag'); // eslint-disable-next-line no-unused-vars const tags = tagString.split(','); - $eyebrow.innerHTML = 'Content & Social Marketing'; + $eyebrow.innerHTML = getMeta('category'); // $eyebrow.innerHTML = tags[0]; $blogHeader.append($eyebrow); $blogHeader.append($h1); @@ -870,7 +870,7 @@ function supportsWebp() { return (window.webpSupport); } -function getOptimizedImageURL(src) { +export function getOptimizedImageURL(src) { console.log(src); const url = new URL(src, window.location.href); let result = src; From 1e9a5043c8ffc9857ed557b56a92282f822520b7 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 12:39:00 -0700 Subject: [PATCH 350/649] feat: update blog to index --- express/blocks/blog-posts/blog-posts.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 1cf6924..eafa301 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -114,10 +114,9 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { for (let i = offset; i < max; i += 1) { const post = posts[i]; const { - path, title, teaser, tags, image, category, + path, title, teaser, image, category, } = post; - const tagsArr = JSON.parse(tags); const eyebrow = category; const isHero = hasHero && !i; const imagePath = image.split('?')[0].split('_')[1]; From bd3c3ac0bd8c411ebbd331599860b9c1cf2a37e3 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 12:41:18 -0700 Subject: [PATCH 351/649] chore: add video to old link exclusion list --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 6631868..9aa750c 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1002,7 +1002,7 @@ function displayOldLinkWarning() { const url = new URL($a.href); if (!(url.pathname.startsWith('/sp') || url.pathname === '/' || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/') - || url.pathname.startsWith('/post/'))) { + || url.pathname.startsWith('/post/') || url.pathname.startsWith('/video/'))) { console.log(`old link: ${$a}`); $a.style.border = '10px solid red'; } From a84cb9872a4a26ad52fc0881d3eded1846715284 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 12:52:51 -0700 Subject: [PATCH 352/649] feat: controlled hero font loading --- express/scripts/scripts.js | 20 +++++++++++++++++++- express/styles/styles.css | 10 ++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 9aa750c..236633d 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -9,7 +9,8 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window, navigator, document, fetch, performance, PerformanceObserver, localStorage */ +/* global window, navigator, document, fetch, performance, PerformanceObserver, + localStorage, FontFace */ /* eslint-disable no-console */ export function toClassName(name) { @@ -1029,10 +1030,27 @@ function displayEnv() { } } +async function loadFont(name, url) { + const font = new FontFace(name, url); + const fontLoaded = await font.load(); + return (fontLoaded); +} + +async function loadFonts() { + try { + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")'); + } catch (err) { + /* something went wrong */ + console.log(err); + } + document.body.classList.add('font-loaded'); +} + async function decoratePage() { setTemplate(); setTheme(); await decorateTesting(); + loadFonts(); splitSections(); wrapSections('main > div'); decorateHeaderAndFooter(); diff --git a/express/styles/styles.css b/express/styles/styles.css index 81074d7..5291766 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -293,6 +293,16 @@ main .hero.hero-noimage a:any-link{ color: black; } +main h1 { + opacity: 0; + transition: opacity 0.2s; +} + +.font-loaded main h1 { + opacity: 1; +} + + main .hero h1 { font-size: 45px; font-weight: 900; From e0c8f447fbcfd215e74d91a9a43599a63ccb00c1 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 13:52:34 -0700 Subject: [PATCH 353/649] chore: add classroom to old link exclusion list --- express/scripts/scripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 236633d..8411a9b 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1003,7 +1003,8 @@ function displayOldLinkWarning() { const url = new URL($a.href); if (!(url.pathname.startsWith('/sp') || url.pathname === '/' || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/') - || url.pathname.startsWith('/post/') || url.pathname.startsWith('/video/'))) { + || url.pathname.startsWith('/post/') || url.pathname.startsWith('/video/') + || url.pathname.startsWith('/classroom/'))) { console.log(`old link: ${$a}`); $a.style.border = '10px solid red'; } From 3b5c85b3718148b1c309774dbf3ab12ce751c77d Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 14:25:49 -0700 Subject: [PATCH 354/649] feat: controlled font loading --- express/blocks/columns/columns.css | 2 +- express/blocks/contact/contact.css | 2 +- express/blocks/filter-pages/filter-pages.css | 6 ++-- .../sticky-promo-bar/sticky-promo-bar.css | 4 +-- .../blocks/template-list/template-list.css | 4 +-- express/scripts/scripts.js | 9 ++++-- express/styles/lazy-styles.css | 8 ++++++ express/styles/styles.css | 28 +++++++++---------- 8 files changed, 37 insertions(+), 26 deletions(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 3bdf086..3be2558 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -41,7 +41,7 @@ main .columns a > p:empty { main .columns > div span.num { position:relative; - font-weight: 800; + font-weight: 900; font-size: 36px; line-height: 39px; top:0; diff --git a/express/blocks/contact/contact.css b/express/blocks/contact/contact.css index 6733f49..0572f45 100644 --- a/express/blocks/contact/contact.css +++ b/express/blocks/contact/contact.css @@ -22,7 +22,7 @@ main .contact .contact-title { width: 200px; font-size: 18px; color: black; - font-weight: 600; + font-weight: 700; margin-right: 80px; } diff --git a/express/blocks/filter-pages/filter-pages.css b/express/blocks/filter-pages/filter-pages.css index 1be1efb..f171759 100644 --- a/express/blocks/filter-pages/filter-pages.css +++ b/express/blocks/filter-pages/filter-pages.css @@ -34,7 +34,7 @@ main .filter-pages { color: lightgrey; padding: 10px 0; font-size: 16px; - font-weight: bold; + font-weight: 700; } @@ -48,7 +48,7 @@ main .filter-pages { margin: 0; font-size: 16px; color: #1473E6; - font-weight: 600; + font-weight: 700; text-align: left; line-height: 1.1em; margin-bottom: 3px; @@ -69,7 +69,7 @@ main .filter-pages { border: none; width: 100%; border-bottom: 1px solid lightgray; - font-weight: 800; + font-weight: 900; font-family: adobe-clean; } \ No newline at end of file diff --git a/express/blocks/sticky-promo-bar/sticky-promo-bar.css b/express/blocks/sticky-promo-bar/sticky-promo-bar.css index 19716d1..8dda723 100644 --- a/express/blocks/sticky-promo-bar/sticky-promo-bar.css +++ b/express/blocks/sticky-promo-bar/sticky-promo-bar.css @@ -7,7 +7,7 @@ main .sticky-promo-bar { color: white; padding: 12px; padding-right: 36px; - font-weight: 800; + font-weight: 900; z-index: 10; } @@ -18,7 +18,7 @@ main .sticky-promo-bar a:any-link { padding: 3px 10px 5px 10px; text-decoration: none; margin-left: 20px; - font-weight: 500; + font-weight: 400; font-size: 0.9em; white-space: nowrap; display: inline-block; diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index a1c98bf..2019c3c 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -4,7 +4,7 @@ main .template-list { justify-content: center; margin: 40px 0; font-size: 16px; - font-weight: bold; + font-weight: 700; text-align: left; } @@ -154,6 +154,6 @@ main .template-list.masonry .template { main .columns .template-list .template-link { font-size: 0.875rem; - font-weight: 500;; + font-weight: 400;; } } diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 8411a9b..31a615a 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1031,15 +1031,18 @@ function displayEnv() { } } -async function loadFont(name, url) { - const font = new FontFace(name, url); +async function loadFont(name, url, weight) { + const font = new FontFace(name, url, { weight }); const fontLoaded = await font.load(); + document.fonts.add(fontLoaded); return (fontLoaded); } async function loadFonts() { try { - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")'); + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3")', 400); + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")', 900); + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")', 700); } catch (err) { /* something went wrong */ console.log(err); diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index a933228..1abc447 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -11,6 +11,11 @@ */ /* fonts */ + +/* + +preloaded in js + @font-face { font-family:"adobe-clean"; src:url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff2"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("opentype"); @@ -28,6 +33,9 @@ src:url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff2"),url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff"),url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("opentype"); font-display:swap;font-style:normal;font-weight:700; } + + */ + @font-face { diff --git a/express/styles/styles.css b/express/styles/styles.css index 5291766..1711729 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -113,7 +113,7 @@ header { box-sizing: border-box; padding-left: 21px; display: flex; - font-weight: 600; + font-weight: 700; } #header-placeholder .desktop .logo img { @@ -147,7 +147,7 @@ header { } #header-placeholder .desktop .top .selected { - font-weight: 600; + font-weight: 700; } #header-placeholder .desktop .top .right { @@ -222,7 +222,7 @@ a.button:any-link { line-height: 20px; font-size: 1rem; background-color: #1473e6; - font-weight: 600; + font-weight: 700; cursor: pointer; color: #fff; transition: background-color .4s; @@ -319,7 +319,7 @@ main .hero h2 { main .hero h5 { font-size: 18px; - font-weight: 500; + font-weight: 400; max-width: 672px; margin: auto; margin-top: 32px; @@ -387,7 +387,7 @@ main .hero a:any-link { main .hero h5 { font-size: 22px; - font-weight: 500; + font-weight: 400; max-width: 672px; margin: auto; margin-top: 32px; @@ -453,14 +453,14 @@ main .section-wrapper h1 { font-size: 45px; line-height: 49px; margin: 0; - font-weight: 800; + font-weight: 900; } main .section-wrapper h2 { font-size: 36px; line-height: 40px; margin: 0; - font-weight: 800; + font-weight: 900; } main .section-wrapper > div > h2 { @@ -476,7 +476,7 @@ main .section-wrapper h3 { font-size: 28px; line-height: 32px; margin: 0; - font-weight: 800; + font-weight: 900; } main .section-wrapper > div > h3 { @@ -496,7 +496,7 @@ main .section-wrapper h4 { font-size: 22px; line-height: 26px; margin: 0; - font-weight: 800; + font-weight: 900; } main .section-wrapper * + h4 { @@ -506,7 +506,7 @@ main .section-wrapper * + h4 { main .section-wrapper h5 { font-size: 22px; line-height: 26px; - font-weight: bold; + font-weight: 700; } main .section-wrapper h1 + h5 { @@ -569,7 +569,7 @@ main .section-wrapper .hero { text-transform: uppercase; margin: 0; margin-bottom: 12px; - font-weight: 600; + font-weight: 700; color: #696969; font-size: 16px; line-height: 20px; @@ -583,7 +583,7 @@ main .section-wrapper .hero { .blog main .hero .blog-header .author .name { margin-top: 10px; - font-weight: 600; + font-weight: 700; } .blog main .hero .blog-header img { @@ -643,7 +643,7 @@ main .section-wrapper .hero { main .section-wrapper h1 + h5 { font-size: 24px; line-height: 29px; - font-weight: normal; + font-weight: 400; margin-top: 32px; margin-bottom: 16px; } @@ -664,7 +664,7 @@ main .section-wrapper .hero { main .section-wrapper a.button:any-link { margin-left: 0; font-size: 13px; - font-weight: 500; + font-weight: 400; } main .section-wrapper.cards-container { From a079d09f781ceba2f91488b63e56a8f261c99c71 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 15:20:23 -0700 Subject: [PATCH 355/649] feat: controlled font loading --- express/scripts/scripts.js | 40 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 31a615a..ea62ef8 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -543,6 +543,7 @@ export function readBlockConfig($block) { } function postLCP() { + loadFonts(); const martechUrl = '/express/scripts/martech.js'; loadCSS('/express/styles/lazy-styles.css'); loadBlocks(); @@ -634,6 +635,25 @@ function decorateHero() { } } +async function loadFont(name, url, weight) { + const font = new FontFace(name, url, { weight }); + const fontLoaded = await font.load(); + document.fonts.add(fontLoaded); + return (fontLoaded); +} + +async function loadFonts() { + try { + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3")', 400); + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")', 900); + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")', 700); + } catch (err) { + /* something went wrong */ + console.log(err); + } + document.body.classList.add('font-loaded'); +} + function decorateButtons() { const noButtonBlocks = ['template-list']; document.querySelectorAll('main a').forEach(($a) => { @@ -1031,30 +1051,10 @@ function displayEnv() { } } -async function loadFont(name, url, weight) { - const font = new FontFace(name, url, { weight }); - const fontLoaded = await font.load(); - document.fonts.add(fontLoaded); - return (fontLoaded); -} - -async function loadFonts() { - try { - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3")', 400); - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")', 900); - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")', 700); - } catch (err) { - /* something went wrong */ - console.log(err); - } - document.body.classList.add('font-loaded'); -} - async function decoratePage() { setTemplate(); setTheme(); await decorateTesting(); - loadFonts(); splitSections(); wrapSections('main > div'); decorateHeaderAndFooter(); From 36a59840b15cef5d14c71f335c2228cd3171624e Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Thu, 1 Apr 2021 18:46:34 -0400 Subject: [PATCH 356/649] fix(pricing): only buildUrl on commerce links --- express/blocks/pricing/pricing.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 54cb897..18c1ccd 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -92,12 +92,14 @@ function replaceUrlParam(url, paramName, paramValue) { } function buildUrl(optionUrl, optionPlan, country, language) { + const currentUrl = new URL(window.location.href); let planUrl = new URL(optionUrl); + if (!planUrl.hostname.includes('commerce')) { + return planUrl.href; + } planUrl = replaceUrlParam(planUrl, 'co', country); planUrl = replaceUrlParam(planUrl, 'lang', language); - - const currentUrl = new URL(window.location.href); let rUrl = planUrl.searchParams.get('rUrl'); if (currentUrl.searchParams.has('host')) { const hostParam = currentUrl.searchParams.get('host'); From 1a8733979643900002e886dc812e1b8128e009e5 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 15:58:30 -0700 Subject: [PATCH 357/649] chore: more font cleanup --- express/blocks/full-width/full-width.css | 4 +-- express/blocks/how-to-steps/how-to-steps.css | 6 ++-- express/blocks/layouts/layouts.css | 2 +- express/blocks/list/list.css | 2 +- express/blocks/page-list/page-list.css | 2 +- express/blocks/pricing/pricing.css | 10 +++--- express/blocks/quotes/quotes.css | 2 +- express/scripts/scripts.js | 38 ++++++++++---------- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/express/blocks/full-width/full-width.css b/express/blocks/full-width/full-width.css index f8d7e1c..c4f92f9 100644 --- a/express/blocks/full-width/full-width.css +++ b/express/blocks/full-width/full-width.css @@ -54,7 +54,7 @@ main .full-width h2 { main .full-width h5 { font-size: 18px; - font-weight: 500; + font-weight: 400; max-width: 672px; margin: auto; margin-top: 32px; @@ -122,7 +122,7 @@ main .full-width a:any-link { main .full-width h5 { font-size: 22px; - font-weight: 500; + font-weight: 400; max-width: 672px; margin: auto; margin-top: 32px; diff --git a/express/blocks/how-to-steps/how-to-steps.css b/express/blocks/how-to-steps/how-to-steps.css index 9e30722..730b743 100644 --- a/express/blocks/how-to-steps/how-to-steps.css +++ b/express/blocks/how-to-steps/how-to-steps.css @@ -4,7 +4,7 @@ main .how-to-steps > div { } main .how-to-steps .tip > p { color: #82919b; - font-weight: 300; + font-weight: 400; font-size: 1.2em; } @@ -12,7 +12,7 @@ main .how-to-steps > div { margin-top: 40px; font-size: 28px; line-height: 32px; - font-weight: 800; + font-weight: 900; text-align: left; margin-bottom: 20px; } @@ -22,7 +22,7 @@ main .how-to-steps > div { border-radius: 50%; color: #fff; font-size: 1.25rem; - font-weight: bold; + font-weight: 700; height: 2.25rem; width: 2.25rem; display: inline-block; diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 7a30135..3db888b 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -37,7 +37,7 @@ main .layouts .layout:hover { main .layouts .layout-icon { font-size: 23px; - font-weight: 800; + font-weight: 900; color: #484848; position: absolute; top: 50%; diff --git a/express/blocks/list/list.css b/express/blocks/list/list.css index 8d4e41b..055a713 100644 --- a/express/blocks/list/list.css +++ b/express/blocks/list/list.css @@ -14,7 +14,7 @@ main .list .item { main .list .item-title { font-size: 16px; line-height: 1.2; - font-weight: 600; + font-weight: 700; } main .list .item-text { diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 6de9f5d..21f4d9a 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -31,7 +31,7 @@ main .page-list-browse-button { color: #333; outline: none; background-color: transparent; - font-weight: 600; + font-weight: 700; cursor: pointer; transition: background-color .4s; display: inline-block; diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index f73faea..4e97059 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -64,7 +64,7 @@ main .pricing.appear { height: 30px; width: 250px; top: -32px; - font-weight: 600; + font-weight: 700; font-size: 12px; color: black; border-radius: 7px 7px 0 0; @@ -88,7 +88,7 @@ main .pricing.appear { } main .pricing .plan-header>div>span { - font-weight: 900; + font-weight: 700; font-size: 20px; color: rgb(53,65,76); text-transform: uppercase; @@ -167,7 +167,7 @@ main .pricing.appear { padding: 25px 0 10px 10px; font-size: 21px; color: rgb(53, 65, 76); - font-weight: 600; + font-weight: 700; text-align: left; } @@ -189,7 +189,7 @@ main .pricing.appear { main .pricing .feature-special span { background-color: rgba(15,196,89,1); border-radius: 3px; - font-weight: bolder; + font-weight: 700; font-size: 10px; color: rgb(255, 255, 255); padding: 2px 6px; @@ -230,7 +230,7 @@ main .pricing-container .icon-creativecloud { } main .pricing-container>div>h5 { - font-weight: normal; + font-weight: 400; font-size: 16px; color: #82919c; } diff --git a/express/blocks/quotes/quotes.css b/express/blocks/quotes/quotes.css index 07e58a3..3606633 100644 --- a/express/blocks/quotes/quotes.css +++ b/express/blocks/quotes/quotes.css @@ -32,7 +32,7 @@ main .quotes .quote .content::before { width: 36px; text-align: left; font-size: 72px; - font-weight: 800; + font-weight: 900; } main .quotes .quote .author { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index ea62ef8..a6b9e5c 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -542,6 +542,25 @@ export function readBlockConfig($block) { return config; } +async function loadFont(name, url, weight) { + const font = new FontFace(name, url, { weight }); + const fontLoaded = await font.load(); + document.fonts.add(fontLoaded); + return (fontLoaded); +} + +async function loadFonts() { + try { + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3")', 400); + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")', 900); + await loadFont('adobe-clean', 'url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")', 700); + } catch (err) { + /* something went wrong */ + console.log(err); + } + document.body.classList.add('font-loaded'); +} + function postLCP() { loadFonts(); const martechUrl = '/express/scripts/martech.js'; @@ -635,25 +654,6 @@ function decorateHero() { } } -async function loadFont(name, url, weight) { - const font = new FontFace(name, url, { weight }); - const fontLoaded = await font.load(); - document.fonts.add(fontLoaded); - return (fontLoaded); -} - -async function loadFonts() { - try { - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3")', 400); - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")', 900); - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")', 700); - } catch (err) { - /* something went wrong */ - console.log(err); - } - document.body.classList.add('font-loaded'); -} - function decorateButtons() { const noButtonBlocks = ['template-list']; document.querySelectorAll('main a').forEach(($a) => { From f4f65f62d0a4dadc3f2f0f0430ef1e8009d89e73 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 16:01:19 -0700 Subject: [PATCH 358/649] chore: enable referrer logging --- express/scripts/scripts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index a6b9e5c..a90f7e6 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1076,6 +1076,7 @@ window.spark = {}; decoratePage(); if (document.referrer) { + console.log (`referrer: {$document.referrer}`); const referrer = new URL(document.referrer); const redirectingHosts = ['www.adobe.com', 'www.stage.adobe.com', 'spark-website--adobe.hlx.live']; if (redirectingHosts.includes(referrer.hostname) From 06c6de7fdf5494b09d63fe5a827ffedcfd08d4a6 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 16:01:47 -0700 Subject: [PATCH 359/649] chore: enable referrer logging --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index a90f7e6..6e3a726 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1076,7 +1076,7 @@ window.spark = {}; decoratePage(); if (document.referrer) { - console.log (`referrer: {$document.referrer}`); + console.log(`referrer: ${document.referrer}`); const referrer = new URL(document.referrer); const redirectingHosts = ['www.adobe.com', 'www.stage.adobe.com', 'spark-website--adobe.hlx.live']; if (redirectingHosts.includes(referrer.hostname) From 9c37967dba51fed6b1576578a823a11843a0a029 Mon Sep 17 00:00:00 2001 From: Solene Date: Thu, 1 Apr 2021 19:04:55 -0400 Subject: [PATCH 360/649] FAQ Block --- express/blocks/faq/faq.css | 109 +++++++++++++++++++++++++++++++++++++ express/blocks/faq/faq.js | 88 ++++++++++++++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 express/blocks/faq/faq.css create mode 100644 express/blocks/faq/faq.js diff --git a/express/blocks/faq/faq.css b/express/blocks/faq/faq.css new file mode 100644 index 0000000..a56f9b4 --- /dev/null +++ b/express/blocks/faq/faq.css @@ -0,0 +1,109 @@ +@import "https://use.fontawesome.com/releases/v5.0.13/css/all.css"; + + +main .faq-container { + background-color: #f2f4f5; +} + +main .faq { + text-align: left; +} + +main .faq .faq-accordion { + position: relative; + width: 100%; + height: auto; +} + +main .faq .faq-question { + display: block; + padding: 18px 0px 18px 4px; + text-decoration: none; + color: #252426; + font-size: 18px; + font-weight: 700; + -webkit-transition: all .25s ease-in-out; + transition: all .25s ease-in-out; + overflow-anchor: none; + cursor: pointer; +} + +main .faq .faq-question:active { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +main .faq .faq-question:focus { + outline: none; +} + +main .faq .faq-question .chevron { + font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", "FontAwesome"; + float: left; + margin-top: 2px; + margin-right: 6px; + color: #1473E6; + pointer-events: none; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); +} + +main .faq .faq-answer { + color: #707070; + padding: 8px 10px 8px 14px; + font-size: 18px; + line-height: 28px; + font-weight: 400; + padding-bottom: 30px; + display: none; +} + +main .faq .active .faq-question { + color: #252426; +} + +main .faq .active .faq-answer { + display: block; +} + +main .faq .active .chevron { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); +} + +main .faq .faq-answer ul { + margin: 0 0 8px 20px; +} + +main .faq .faq-answer ul li { + font-size: 18px; + line-height: 28px; + list-style: disc; +} + +main .faq .faq-answer ul li ul li { + font-size: 18px; + line-height: 28px; +} + +main .faq .faq-answer p { + color: #707070; + font-size: 18px; + line-height: 28px; + font-weight: 400; + margin-top: 0; + margin-bottom: 10px; +} + +@media (max-width: 600px) { + main .faq .faq-question, + main .faq .faq-answer { + font-size: 18px; + line-height: 28px; + } + main .faq .faq-question .chevron { + margin-top: 4px; + } +} \ No newline at end of file diff --git a/express/blocks/faq/faq.js b/express/blocks/faq/faq.js new file mode 100644 index 0000000..b6a630c --- /dev/null +++ b/express/blocks/faq/faq.js @@ -0,0 +1,88 @@ +/* + * Copyright 2021 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. + */ +import { + createTag, +} from '../../scripts/scripts.js'; + +function decorateFAQBlocks($block) { + const faqs = []; + const $rows = Array.from($block.children); + $rows.forEach(($row) => { + const $cells = Array.from($row.children); + const $question = $cells[0]; + const $answer = $cells[1]; + const question = $question.textContent; + const answer = $answer.innerHTML; + faqs.push({ + question, answer, + }); + }); + + $block.innerHTML = ''; + faqs.forEach((faq) => { + const { question, answer } = faq; + console.log(question); + console.log(answer); + + const $accordion = createTag('div', { class: 'faq-accordion' }); + $block.append($accordion); + console.log($accordion); + + const $questionDiv = createTag('div', { class: 'faq-question', tabindex: '0' }); + $accordion.append($questionDiv); + $questionDiv.innerHTML = question; + + const $chevron = createTag('i', { class: 'chevron fa fa-chevron-down' }); + $questionDiv.prepend($chevron); + + const $answerDiv = createTag('div', { class: 'faq-answer' }); + $accordion.append($answerDiv); + $answerDiv.innerHTML = answer; + + }); + + addFaqEventListeners(); +} + +function addFaqEventListeners() { + const faqs = document.getElementsByClassName("faq-question"); + for (let i = 0; i < faqs.length; i++) { + faqs[i].addEventListener("click", toggleFaq); + faqs[i].addEventListener("keydown", event => { + if (event.keyCode === 32 || event.keyCode === 13 ) { + toggleFaq(event); + } + }); + } +} + +function toggleFaq(e) { + const faq = e.target.parentElement; + closeAllOtherFaqs(faq); + faq.classList.toggle("active"); +} + +function closeAllOtherFaqs(faq) { + const accs = document.getElementsByClassName('faq-accordion'); + for (let i = 0; i < accs.length; i++) { + if (accs[i] == faq) { + continue; + } + if (accs[i].classList.contains('active')) { + accs[i].classList.remove('active'); + } + } +} + +export default function decorate($block) { + decorateFAQBlocks($block); +} From dbb3e9e0f1208c5827d70396471e2ed29c183826 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 16:05:44 -0700 Subject: [PATCH 361/649] chore: referrer logging --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 6e3a726..d43ecd7 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1075,8 +1075,8 @@ async function decoratePage() { window.spark = {}; decoratePage(); +console.log(`referrer: ${document.referrer}`); if (document.referrer) { - console.log(`referrer: ${document.referrer}`); const referrer = new URL(document.referrer); const redirectingHosts = ['www.adobe.com', 'www.stage.adobe.com', 'spark-website--adobe.hlx.live']; if (redirectingHosts.includes(referrer.hostname) From 7f7be9911dc53f9378d9f8827c7bc5834e8f7176 Mon Sep 17 00:00:00 2001 From: Solene Date: Thu, 1 Apr 2021 19:19:23 -0400 Subject: [PATCH 362/649] fix: refactor faq block with eslint --- express/blocks/faq/faq.css | 2 ++ express/blocks/faq/faq.js | 66 +++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 36 deletions(-) diff --git a/express/blocks/faq/faq.css b/express/blocks/faq/faq.css index a56f9b4..f9c7f02 100644 --- a/express/blocks/faq/faq.css +++ b/express/blocks/faq/faq.css @@ -3,10 +3,12 @@ main .faq-container { background-color: #f2f4f5; + padding-bottom: 80px; } main .faq { text-align: left; + padding: 20px 0; } main .faq .faq-accordion { diff --git a/express/blocks/faq/faq.js b/express/blocks/faq/faq.js index b6a630c..51af34e 100644 --- a/express/blocks/faq/faq.js +++ b/express/blocks/faq/faq.js @@ -13,6 +13,34 @@ import { createTag, } from '../../scripts/scripts.js'; +function closeAllOtherFaqs($faq) { + const $block = $faq.parentElement; + const accs = $block.getElementsByClassName('faq-accordion'); + for (let i = 0; i < accs.length; i += 1) { + if (accs[i] !== $faq && accs[i].classList.contains('active')) { + accs[i].classList.remove('active'); + } + } +} + +function toggleFaq(e) { + const $faq = e.target.parentElement; + closeAllOtherFaqs($faq); + $faq.classList.toggle('active'); +} + +function addFaqEventListeners($block) { + const faqs = $block.getElementsByClassName('faq-question'); + for (let i = 0; i < faqs.length; i += 1) { + faqs[i].addEventListener('click', toggleFaq); + faqs[i].addEventListener('keydown', (event) => { + if (event.keyCode === 32 || event.keyCode === 13) { + toggleFaq(event); + } + }); + } +} + function decorateFAQBlocks($block) { const faqs = []; const $rows = Array.from($block.children); @@ -26,16 +54,13 @@ function decorateFAQBlocks($block) { question, answer, }); }); - + $block.innerHTML = ''; faqs.forEach((faq) => { const { question, answer } = faq; - console.log(question); - console.log(answer); const $accordion = createTag('div', { class: 'faq-accordion' }); $block.append($accordion); - console.log($accordion); const $questionDiv = createTag('div', { class: 'faq-question', tabindex: '0' }); $accordion.append($questionDiv); @@ -47,40 +72,9 @@ function decorateFAQBlocks($block) { const $answerDiv = createTag('div', { class: 'faq-answer' }); $accordion.append($answerDiv); $answerDiv.innerHTML = answer; - }); - addFaqEventListeners(); -} - -function addFaqEventListeners() { - const faqs = document.getElementsByClassName("faq-question"); - for (let i = 0; i < faqs.length; i++) { - faqs[i].addEventListener("click", toggleFaq); - faqs[i].addEventListener("keydown", event => { - if (event.keyCode === 32 || event.keyCode === 13 ) { - toggleFaq(event); - } - }); - } -} - -function toggleFaq(e) { - const faq = e.target.parentElement; - closeAllOtherFaqs(faq); - faq.classList.toggle("active"); -} - -function closeAllOtherFaqs(faq) { - const accs = document.getElementsByClassName('faq-accordion'); - for (let i = 0; i < accs.length; i++) { - if (accs[i] == faq) { - continue; - } - if (accs[i].classList.contains('active')) { - accs[i].classList.remove('active'); - } - } + addFaqEventListeners($block); } export default function decorate($block) { From 43d90987186aac7b53f24ed390dd58a66b53531c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 16:36:37 -0700 Subject: [PATCH 363/649] chore: add chevron --- express/icons.svg | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/express/icons.svg b/express/icons.svg index 447062f..d767ee3 100644 --- a/express/icons.svg +++ b/express/icons.svg @@ -229,4 +229,13 @@ + + Chevron + Chevron + + + + From 55912173d9adf314f0a760bdafd176dd2862dae3 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 16:41:05 -0700 Subject: [PATCH 364/649] chore: adding chevron icon --- express/scripts/scripts.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index d43ecd7..7da1180 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -47,7 +47,8 @@ export function getIcon(icon, alt = icon) { const symbols = ['adobe', 'adobe-red', 'facebook', 'instagram', 'pinterest', 'linkedin', 'twitter', 'youtube', 'discord', 'behance', 'creative-cloud', 'hamburger', 'adchoices', 'play', 'not-found', 'snapchat', 'learn', 'magicwand', - 'upload', 'resize', 'download', 'creativecloud', 'shapes', 'users', 'color', 'stickers', 'landscape', 'globe']; + 'upload', 'resize', 'download', 'creativecloud', 'shapes', 'users', 'color', 'stickers', 'landscape', + 'globe', 'chevron']; if (symbols.includes(icon)) { return ` From 894e0f30fe794eb48a0cd86d4897818ca2676fa5 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 1 Apr 2021 16:56:55 -0700 Subject: [PATCH 365/649] chore: linting --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 7da1180..4543ec9 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -47,7 +47,7 @@ export function getIcon(icon, alt = icon) { const symbols = ['adobe', 'adobe-red', 'facebook', 'instagram', 'pinterest', 'linkedin', 'twitter', 'youtube', 'discord', 'behance', 'creative-cloud', 'hamburger', 'adchoices', 'play', 'not-found', 'snapchat', 'learn', 'magicwand', - 'upload', 'resize', 'download', 'creativecloud', 'shapes', 'users', 'color', 'stickers', 'landscape', + 'upload', 'resize', 'download', 'creativecloud', 'shapes', 'users', 'color', 'stickers', 'landscape', 'globe', 'chevron']; if (symbols.includes(icon)) { return ` From a5c3c92cc56b4a95e74bd68b80d0e69e350026d4 Mon Sep 17 00:00:00 2001 From: Solene Date: Thu, 1 Apr 2021 20:03:46 -0400 Subject: [PATCH 366/649] fix: attempt fix on faq block chevron icon --- express/blocks/faq/faq.css | 9 ++++----- express/blocks/faq/faq.js | 4 +++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/express/blocks/faq/faq.css b/express/blocks/faq/faq.css index f9c7f02..13ae924 100644 --- a/express/blocks/faq/faq.css +++ b/express/blocks/faq/faq.css @@ -1,6 +1,3 @@ -@import "https://use.fontawesome.com/releases/v5.0.13/css/all.css"; - - main .faq-container { background-color: #f2f4f5; padding-bottom: 80px; @@ -42,11 +39,13 @@ main .faq .faq-question:focus { } main .faq .faq-question .chevron { - font-family: "Font Awesome 5 Pro", "Font Awesome 5 Free", "FontAwesome"; - float: left; + display: inline-block; + height: 18px; + width: 18px; margin-top: 2px; margin-right: 6px; color: #1473E6; + fill: #1473E6; pointer-events: none; -webkit-transform: rotate(-90deg); transform: rotate(-90deg); diff --git a/express/blocks/faq/faq.js b/express/blocks/faq/faq.js index 51af34e..ead0d85 100644 --- a/express/blocks/faq/faq.js +++ b/express/blocks/faq/faq.js @@ -66,8 +66,10 @@ function decorateFAQBlocks($block) { $accordion.append($questionDiv); $questionDiv.innerHTML = question; - const $chevron = createTag('i', { class: 'chevron fa fa-chevron-down' }); + const $chevron = createTag('svg', { class: 'chevron', xmlns: 'http://www.w3.org/2000/svg' }); $questionDiv.prepend($chevron); + const $use = createTag('use', { href: '/express/icons.svg#chevron'}) + $chevron.prepend($use); const $answerDiv = createTag('div', { class: 'faq-answer' }); $accordion.append($answerDiv); From 407eb5ef9503255ee757ed29817b1e6c64754ceb Mon Sep 17 00:00:00 2001 From: Solene Date: Thu, 1 Apr 2021 20:16:20 -0400 Subject: [PATCH 367/649] fix: faq mobile responsiveness --- express/blocks/faq/faq.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/faq/faq.css b/express/blocks/faq/faq.css index 13ae924..f4562c7 100644 --- a/express/blocks/faq/faq.css +++ b/express/blocks/faq/faq.css @@ -25,6 +25,7 @@ main .faq .faq-question { transition: all .25s ease-in-out; overflow-anchor: none; cursor: pointer; + display: flex; } main .faq .faq-question:active { From 9e9749284a5710cd75d189f6c30a15c6e231413e Mon Sep 17 00:00:00 2001 From: Solene Date: Thu, 1 Apr 2021 20:37:33 -0400 Subject: [PATCH 368/649] fix: faq block chevron now working --- express/blocks/faq/faq.css | 6 ++---- express/blocks/faq/faq.js | 9 ++++----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/express/blocks/faq/faq.css b/express/blocks/faq/faq.css index f4562c7..575ee88 100644 --- a/express/blocks/faq/faq.css +++ b/express/blocks/faq/faq.css @@ -48,8 +48,6 @@ main .faq .faq-question .chevron { color: #1473E6; fill: #1473E6; pointer-events: none; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); } main .faq .faq-answer { @@ -71,8 +69,8 @@ main .faq .active .faq-answer { } main .faq .active .chevron { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); + -webkit-transform: rotate(90deg); + transform: rotate(90deg); } main .faq .faq-answer ul { diff --git a/express/blocks/faq/faq.js b/express/blocks/faq/faq.js index ead0d85..b4abfbe 100644 --- a/express/blocks/faq/faq.js +++ b/express/blocks/faq/faq.js @@ -10,7 +10,7 @@ * governing permissions and limitations under the License. */ import { - createTag, + createTag, getIconElement, } from '../../scripts/scripts.js'; function closeAllOtherFaqs($faq) { @@ -34,7 +34,7 @@ function addFaqEventListeners($block) { for (let i = 0; i < faqs.length; i += 1) { faqs[i].addEventListener('click', toggleFaq); faqs[i].addEventListener('keydown', (event) => { - if (event.keyCode === 32 || event.keyCode === 13) { + if (event.keyCode === 13) { toggleFaq(event); } }); @@ -66,10 +66,9 @@ function decorateFAQBlocks($block) { $accordion.append($questionDiv); $questionDiv.innerHTML = question; - const $chevron = createTag('svg', { class: 'chevron', xmlns: 'http://www.w3.org/2000/svg' }); + const $chevron = getIconElement('chevron'); + $chevron.classList.add('chevron'); $questionDiv.prepend($chevron); - const $use = createTag('use', { href: '/express/icons.svg#chevron'}) - $chevron.prepend($use); const $answerDiv = createTag('div', { class: 'faq-answer' }); $accordion.append($answerDiv); From c82f16a422a5d11f1841792db6af1a34dc74c80a Mon Sep 17 00:00:00 2001 From: Solene Date: Thu, 1 Apr 2021 21:00:10 -0400 Subject: [PATCH 369/649] fix: faq block missing css prefixes added --- express/blocks/faq/faq.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/express/blocks/faq/faq.css b/express/blocks/faq/faq.css index 575ee88..60ba96b 100644 --- a/express/blocks/faq/faq.css +++ b/express/blocks/faq/faq.css @@ -25,6 +25,8 @@ main .faq .faq-question { transition: all .25s ease-in-out; overflow-anchor: none; cursor: pointer; + display: -webkit-box; + display: -ms-flexbox; display: flex; } From c1bcb40dc8c58bb19bc460dc60e80cd79860a7b0 Mon Sep 17 00:00:00 2001 From: Solene Date: Thu, 1 Apr 2021 22:03:14 -0400 Subject: [PATCH 370/649] fix(individual-plan): faq small styling fix --- express/blocks/faq/faq.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/faq/faq.css b/express/blocks/faq/faq.css index 60ba96b..076d4c1 100644 --- a/express/blocks/faq/faq.css +++ b/express/blocks/faq/faq.css @@ -37,7 +37,7 @@ main .faq .faq-question:active { user-select: none; } -main .faq .faq-question:focus { +main .faq .faq-question:focus:not(:focus-visible) { outline: none; } From 6f739ad29e8945682b653ad038b3a051e5cfcce6 Mon Sep 17 00:00:00 2001 From: Solene Date: Thu, 1 Apr 2021 23:55:09 -0400 Subject: [PATCH 371/649] fix(individual-plan): faq block removed redundant css --- express/blocks/faq/faq.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/express/blocks/faq/faq.css b/express/blocks/faq/faq.css index 076d4c1..9cf92b6 100644 --- a/express/blocks/faq/faq.css +++ b/express/blocks/faq/faq.css @@ -85,11 +85,6 @@ main .faq .faq-answer ul li { list-style: disc; } -main .faq .faq-answer ul li ul li { - font-size: 18px; - line-height: 28px; -} - main .faq .faq-answer p { color: #707070; font-size: 18px; From 09248eade54a1c0c132431d0630827f26764b4a2 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 08:22:06 -0700 Subject: [PATCH 372/649] fix(international): cookie scope --- express/blocks/blog-posts/blog-posts.css | 2 +- express/scripts/scripts.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index 3f2fc02..ce56d78 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -105,7 +105,7 @@ main .blog-posts .blog-card { text-transform: uppercase; margin: 0; margin-bottom: 12px; - font-weight: 600; + font-weight: 700; color: #696969; font-size: 12px; line-height: 16px; diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 4543ec9..b7b96e3 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1085,7 +1085,9 @@ if (document.referrer) { if (!getCookie('international')) { const refLocale = getLocale(referrer); console.log(`setting international based on redirect to: ${refLocale}`); - document.cookie = `international=${refLocale}; path=/`; + let domain = ''; + if (window.location.hostname === 'www.adobe.com') domain = ' domain=adobe.com;'; + document.cookie = `international=${refLocale};${domain} path=/`; } } } From 584332cc1ee34df0fe73ee3f5875607d6c7be431 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 08:29:05 -0700 Subject: [PATCH 373/649] fix(international): cookie scope --- express/scripts/martech.js | 7 ++++++- express/scripts/scripts.js | 16 ---------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index b52aee1..b914849 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -406,7 +406,12 @@ async function showRegionPicker() { const destLocale = pathSplits[1] ? `${pathSplits[1]}` : 'us'; const off = locale !== 'us' ? locale.length + 1 : 0; const gPath = window.location.pathname.substr(off); - document.cookie = `international=${destLocale}; path=/`; + + let domain = ''; + if (window.location.hostname.endsWith('.adobe.com')) domain = ' domain=adobe.com;'; + const cookieValue = `international=${destLocale};${domain} path=/`; + console.log(`setting international based on language switch to: ${cookieValue}`); + document.cookie = cookieValue; event.preventDefault(); window.location.href = prefix + gPath; }); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index b7b96e3..18ed619 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1076,22 +1076,6 @@ async function decoratePage() { window.spark = {}; decoratePage(); -console.log(`referrer: ${document.referrer}`); -if (document.referrer) { - const referrer = new URL(document.referrer); - const redirectingHosts = ['www.adobe.com', 'www.stage.adobe.com', 'spark-website--adobe.hlx.live']; - if (redirectingHosts.includes(referrer.hostname) - && getLocale(referrer) !== getLocale(window.location)) { - if (!getCookie('international')) { - const refLocale = getLocale(referrer); - console.log(`setting international based on redirect to: ${refLocale}`); - let domain = ''; - if (window.location.hostname === 'www.adobe.com') domain = ' domain=adobe.com;'; - document.cookie = `international=${refLocale};${domain} path=/`; - } - } -} - /* performance instrumentation */ function stamp(message) { From 11408c990f076c90c7e5bc519abc3721e12d77de Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 10:11:04 -0700 Subject: [PATCH 374/649] feat(redirects): setting up redirects --- helix-redirects.yaml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 helix-redirects.yaml diff --git a/helix-redirects.yaml b/helix-redirects.yaml new file mode 100644 index 0000000..b82df0e --- /dev/null +++ b/helix-redirects.yaml @@ -0,0 +1,2 @@ +redirects: + - https://main--spark-website--adobe.hlx.page/redirects.json \ No newline at end of file From aea6cfad61dbee54a71b2c29e3611b6ad4442158 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 10:46:09 -0700 Subject: [PATCH 375/649] chore: reduce hero jank --- express/styles/lazy-styles.css | 4 ---- express/styles/styles.css | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index 1abc447..9c332fe 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -73,10 +73,6 @@ preloaded in js /* below the fold */ -main p { - line-height: 1.5em; -} - main .list { list-style: none; diff --git a/express/styles/styles.css b/express/styles/styles.css index 1711729..d6746a3 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -373,6 +373,11 @@ main .hero a:any-link { color: currentColor; } +main p { + line-height: 1.5em; +} + + @media (min-width:600px) { main .hero h1 { font-size: 60px; From f1920d189cf56dffde652244c4549498b611bff0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 11:28:46 -0700 Subject: [PATCH 376/649] chore: console log cleanup --- express/scripts/martech.js | 1 + express/scripts/scripts.js | 6 ------ 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index b914849..0d00878 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -410,6 +410,7 @@ async function showRegionPicker() { let domain = ''; if (window.location.hostname.endsWith('.adobe.com')) domain = ' domain=adobe.com;'; const cookieValue = `international=${destLocale};${domain} path=/`; + // eslint-disable-next-line no-console console.log(`setting international based on language switch to: ${cookieValue}`); document.cookie = cookieValue; event.preventDefault(); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 18ed619..fe55302 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -43,7 +43,6 @@ function getMeta(name) { } export function getIcon(icon, alt = icon) { - console.log(icon); const symbols = ['adobe', 'adobe-red', 'facebook', 'instagram', 'pinterest', 'linkedin', 'twitter', 'youtube', 'discord', 'behance', 'creative-cloud', 'hamburger', 'adchoices', 'play', 'not-found', 'snapchat', 'learn', 'magicwand', @@ -67,10 +66,8 @@ export function getIconElement(icon) { export function linkPicture($picture) { const $nextSib = $picture.parentNode.nextElementSibling; if ($nextSib) { - console.log($nextSib); const $a = $nextSib.querySelector('a'); if ($a && $a.textContent.startsWith('https://')) { - console.log($a); $a.innerHTML = ''; $a.className = ''; $a.appendChild($picture); @@ -893,7 +890,6 @@ function supportsWebp() { } export function getOptimizedImageURL(src) { - console.log(src); const url = new URL(src, window.location.href); let result = src; const { pathname, search } = url; @@ -921,8 +917,6 @@ function resetAttribute($elem, attrib) { if (src) { const oSrc = getOptimizedImageURL(src); if (oSrc !== src) { - console.log($elem); - console.log(`${src} => ${oSrc}`); $elem.setAttribute(attrib, oSrc); } } From 8113a8fac3c409e9b0e3fab1a5eac5ff8df0d06d Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 12:00:47 -0700 Subject: [PATCH 377/649] chore: gnav placeholder adjustment --- express/styles/styles.css | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index d6746a3..718fbc3 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -111,14 +111,14 @@ header { #header-placeholder .desktop .logo { width: 124px; box-sizing: border-box; - padding-left: 21px; + padding-left: 20px; display: flex; font-weight: 700; } #header-placeholder .desktop .logo img { height: 24px; - width: 24px; + width: 25px; } #header-placeholder .desktop .logo span { @@ -131,7 +131,7 @@ header { #header-placeholder .desktop .top .section { height: 64px; - padding: 0 8px 1px 8px; + padding: 0 8.5px 1px 8.5px; } #header-placeholder .desktop .top .section span { @@ -142,9 +142,9 @@ header { font-size: 14px; margin-left: 0px; font-weight: 700; - padding: 6px 16px 6px 16px; + padding: 6px 16px 5px 16px; background-color: #1473e6; - } + } #header-placeholder .desktop .top .selected { font-weight: 700; @@ -194,7 +194,7 @@ header { transition: transform .1s ease; content: ""; margin-left: 5px; - margin-right: 2.25px; + margin-right: 2px; } #header-placeholder .desktop .top .right { @@ -216,7 +216,7 @@ footer { a.button:any-link { text-decoration: none; border-radius: 18px; - padding: 5px 1.2em 7px 1.2em; + padding: 5px 1.2em 6px 1.2em; /*outline: none; (keep outline for a11n) */ text-align: center; line-height: 20px; From e77f28c20640eeb49397e1589fa153ef3fafc59d Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 13:03:54 -0700 Subject: [PATCH 378/649] feat(gnav): placeholder customizable --- express/scripts/scripts.js | 120 +++++++++++++++++++++------------ express/styles/lazy-styles.css | 6 +- express/styles/styles.css | 21 +++++- 3 files changed, 97 insertions(+), 50 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index fe55302..81b965b 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -300,65 +300,94 @@ export function addBlockClasses($block, classNames) { // }); // } -function decorateHeaderAndFooter() { - const $header = document.querySelector('header'); - - /* init header */ - const locale = getLocale(window.location); - - if (locale === 'us') { - $header.innerHTML = ` -
+function getGnavPlaceholder(nav) { + let html = `
- +
-
- Adobe Spark - Features - Create - Discover - Learn - Compare plans - Start now -
+
`; + + nav.top.forEach((e) => { + const selected = e.selected ? 'selected' : ''; + if (e.type === 'nodrop') { + html += `${e.text}`; + } else if (e.type === 'button') { + html += `${e.text}`; + } else { + html += `${e.text}`; + } + }); + + html += `
-
Sign In
+
${nav.signIn}
`; + return (html); +} + +function decorateHeaderAndFooter() { + const $header = document.querySelector('header'); + + /* init header */ + const locale = getLocale(window.location); + + if (locale === 'us') { + const nav = { + signIn: 'Sign In', + top: [ + { + text: 'Adobe Spark', + type: 'nodrop', + }, + { + text: 'Features', + }, + { + text: 'Create', + }, + { + text: 'Discover', + }, + { + text: 'Learn', + }, + { + text: 'Compare Plans', + type: 'nodrop', + }, + { + text: 'Start now', + type: 'button', + }, + ], + }; + if (window.location.pathname === '/express/') nav.top[0].selected = true; + if (window.location.pathname.startsWith('/express/feature')) nav.top[1].selected = true; + if (window.location.pathname.startsWith('/express/create')) nav.top[2].selected = true; + if (window.location.pathname.startsWith('/express/discover')) nav.top[3].selected = true; + if (window.location.pathname.startsWith('/express/learn')) nav.top[4].selected = true; + if (window.location.pathname.startsWith('/express/pricing')) nav.top[5].selected = true; + const html = getGnavPlaceholder(nav); + $header.innerHTML = html; } else { - $header.innerHTML = ` -
-
-
-
-
- - -
-
-
-
- -
-
-
-
-
-
-
`; + $header.innerHTML = getGnavPlaceholder({ + signIn: 'Sign In', + top: [], + }); } document.querySelector('footer').innerHTML = ` @@ -543,15 +572,18 @@ export function readBlockConfig($block) { async function loadFont(name, url, weight) { const font = new FontFace(name, url, { weight }); const fontLoaded = await font.load(); - document.fonts.add(fontLoaded); return (fontLoaded); } async function loadFonts() { try { - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3")', 400); - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")', 900); - await loadFont('adobe-clean', 'url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")', 700); + /* todo promise.All */ + const f900 = await loadFont('adobe-clean', 'url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3")', 400); + const f400 = await loadFont('adobe-clean', 'url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3")', 900); + const f700 = await loadFont('adobe-clean', 'url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3")', 700); + document.fonts.add(f900); + document.fonts.add(f400); + document.fonts.add(f700); } catch (err) { /* something went wrong */ console.log(err); diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index 9c332fe..afd27f0 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -16,6 +16,7 @@ preloaded in js +*/ @font-face { font-family:"adobe-clean"; src:url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff2"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("opentype"); @@ -34,10 +35,9 @@ preloaded in js font-display:swap;font-style:normal;font-weight:700; } - */ - - + /* no js treatment */ + @font-face { font-family:"adobe-clean"; src:url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff2"),url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff"),url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("opentype"); diff --git a/express/styles/styles.css b/express/styles/styles.css index 718fbc3..1da0ac5 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -135,7 +135,17 @@ header { } #header-placeholder .desktop .top .section span { - padding: 0 12px; + margin: 0 12px; + } + + #header-placeholder .desktop .top .section .selected { + border-bottom: 2px solid #2c2c2c; + padding-top: 2px; + font-weight: 700; + display: inline-flex; + height: 100%; + box-sizing: border-box; + align-items: center; } #header-placeholder .desktop .top .button { @@ -144,7 +154,7 @@ header { font-weight: 700; padding: 6px 16px 5px 16px; background-color: #1473e6; - } + } #header-placeholder .desktop .top .selected { font-weight: 700; @@ -172,6 +182,7 @@ header { #header-placeholder .desktop .bottom > span { padding: 0 8px; + align-items: center; } #header-placeholder .desktop .drop { @@ -179,6 +190,10 @@ header { align-items: center; } + #header-placeholder .desktop .selected.drop::after { + margin-left: 4px; + } + #header-placeholder .desktop .drop::after { display: flex; width: 5px; @@ -194,7 +209,7 @@ header { transition: transform .1s ease; content: ""; margin-left: 5px; - margin-right: 2px; + margin-right: 3px; } #header-placeholder .desktop .top .right { From 978ac553501f7d6c48571d2d56182c0e53e2d441 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 16:48:48 -0700 Subject: [PATCH 379/649] feat(templatelist): new masonry --- .../blocks/template-list/template-list.css | 11 +++ express/blocks/template-list/template-list.js | 68 ++++++++++++++++++- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 2019c3c..352682a 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -77,6 +77,17 @@ main .template-list + .button-container > a { margin: 0; } +main .template-list.flex-masonry { + display: flex; + margin-top: 0; +} + +main .template-list.flex-masonry .template { + margin-top: 0; + margin-bottom: 32px; + padding: 0; +} + main .template-list.masonry .template { margin-top: 0; diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 379febf..9cb899b 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -19,6 +19,60 @@ import { linkImage, } from '../../scripts/scripts.js'; +function masonrize($cells, $masonry, force) { + const colWidth = 264; + const maxWidth = 2000; + + const width = $masonry.offsetWidth > maxWidth ? maxWidth : $masonry.offsetWidth; + // console.log($masonry.offsetWidth); + let numCols = Math.floor(width / colWidth); + if (numCols < 1) numCols = 1; + if ((numCols !== $masonry.children.length) || force) { + $masonry.innerHTML = ''; + const columns = []; + for (let i = 0; i < numCols; i += 1) { + const $column = createTag('div', { class: 'masonry-col' }); + columns.push({ + outerHeight: 0, + $column, + }); + $masonry.appendChild($column); + } + + let incomplete = false; + $cells.forEach(($cell) => { + const minOuterHeight = Math.min(...columns.map((column) => column.outerHeight)); + const column = columns.find((col) => col.outerHeight === minOuterHeight); + column.$column.append($cell); + + const $image = $cell.querySelector('img'); + if ($image) { + if (!$image.complete) { + incomplete = true; + } + } + const $video = $cell.querySelector('video'); + if ($video) { + // console.log(`video ready state ${$video.readyState}`); + if ($video.readyState === 0) { + incomplete = true; + } + } + + // console.log(`cell offset height: ${$cell.offsetHeight}`); + column.outerHeight += $cell.offsetHeight; + }); + + if (incomplete) { + // console.log ('incomplete retrying in 500ms'); + + setTimeout(() => { + masonrize($cells, $masonry, true); + }, 500); + } + } +} + async function fetchBlueprint(pathname) { if (window.spark.$blueprint) { return (window.spark.$blueprint); @@ -27,7 +81,7 @@ async function fetchBlueprint(pathname) { const bpPath = pathname.substr(pathname.indexOf('/', 1)).split('.')[0]; const resp = await fetch(`${bpPath}.plain.html`); // eslint-disable-next-line no-console - console.log(`fetching...${bpPath}`); + // console.log(`fetching...${bpPath}`); const body = await resp.text(); const $main = createTag('main'); $main.innerHTML = body; @@ -134,6 +188,18 @@ async function decorateTemplateList($block) { } } } + + /* flex masonry */ + if (rows > 6) { + // console.log(`masonry-rows: ${rows}`); + const $masonryCells = Array.from($block.children); + $block.classList.remove('masonry'); + $block.classList.add('flex-masonry'); + masonrize($masonryCells, $block); + window.addEventListener('resize', () => { + masonrize($masonryCells, $block); + }); + } } export default function decorate($block) { From ef0feafaa4c10669e149c19e5e941ae17aa5f57e Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 17:05:57 -0700 Subject: [PATCH 380/649] feat(page-list): refactor --- express/blocks/page-list/page-list.css | 16 +++------------- express/blocks/page-list/page-list.js | 9 --------- express/blocks/template-list/template-list.js | 3 +-- 3 files changed, 4 insertions(+), 24 deletions(-) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 21f4d9a..2e13835 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -1,6 +1,5 @@ main .page-list-container.appear, main .page-list.appear { opacity: 1; - height: unset; } main .page-list { @@ -49,17 +48,12 @@ main .page-list-browse-button { main .page-list-container > div { - height: 500px; max-width: 100%; display: flex; margin: 0; box-sizing: border-box; } -main .page-list-container > div > div { - overflow-y: scroll; - } - main .page-list-container > div .template-list { width: 100%; box-sizing: border-box; @@ -86,19 +80,15 @@ main .hero-short { main .page-list-left { flex: 0 0 auto; - overflow: scroll; - height: 100%; + overflow-y: scroll; } main .page-list-right { flex: 1 1 auto; padding-left: 20px; - overflow: scroll; - height: 100%; } -main .page-template-list > .template-list.masonry { - columns: 260px auto; - column-gap: 0; +main .page-template-list > .template-list.flex-masonry { + justify-content: flex-start; } diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 83cfa4b..a5c0169 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -31,13 +31,6 @@ function addPages(index, config, $block) { $block.appendChild($ul); } -function setSize($cols, $flex, $hero) { - const minWidth = 260; - const w = $cols.parentNode.offsetWidth; - $cols.style.width = `${Math.floor(w / minWidth) * minWidth}px`; - $flex.style.height = `${(window.innerHeight - $hero.offsetHeight)}px`; -} - function showHide($block, $ptl) { if (window.innerWidth < 600) { $block.classList.add('hidden'); @@ -109,10 +102,8 @@ async function decoratePageList($block) { }); showHide($block, $ptl); - setSize($ptl, $flex, $hero); window.addEventListener('resize', () => { showHide($block, $ptl); - setSize($ptl, $flex, $hero); }); const index = await fetchIndex(); diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 9cb899b..a6e6ada 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -21,9 +21,8 @@ import { function masonrize($cells, $masonry, force) { const colWidth = 264; - const maxWidth = 2000; - const width = $masonry.offsetWidth > maxWidth ? maxWidth : $masonry.offsetWidth; + const width = $masonry.offsetWidth; // console.log($masonry.offsetWidth); let numCols = Math.floor(width / colWidth); if (numCols < 1) numCols = 1; From 272f7f6aa3ddc7aa3dd9f1731dfbc2c833aff8c3 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 17:13:21 -0700 Subject: [PATCH 381/649] chore: unset height --- express/blocks/page-list/page-list.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 2e13835..86552e1 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -1,5 +1,6 @@ main .page-list-container.appear, main .page-list.appear { opacity: 1; + height: unset; } main .page-list { From 73cb563310f5571f18abc0ec59369ec7215667d6 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 2 Apr 2021 17:30:36 -0700 Subject: [PATCH 382/649] chore: unset height --- express/blocks/page-list/page-list.css | 6 +++++- express/blocks/page-list/page-list.js | 7 +++++++ express/styles/styles.css | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 86552e1..839201f 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -1,8 +1,12 @@ -main .page-list-container.appear, main .page-list.appear { +main .page-list-container.appear { opacity: 1; height: unset; } +main .page-list.appear { + opacity: 1; +} + main .page-list { text-align: left; box-sizing: border-box; diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index a5c0169..0dc57e9 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -30,6 +30,11 @@ function addPages(index, config, $block) { }); $block.appendChild($ul); } +function setSize($container) { + const $left = $container.querySelector('.page-list'); + const $right = $container.querySelector('.page-list-right'); + $left.style.height = `${$right.offsetHeight}px`; +} function showHide($block, $ptl) { if (window.innerWidth < 600) { @@ -102,8 +107,10 @@ async function decoratePageList($block) { }); showHide($block, $ptl); + setSize($flex); window.addEventListener('resize', () => { showHide($block, $ptl); + setSize($flex); }); const index = await fetchIndex(); diff --git a/express/styles/styles.css b/express/styles/styles.css index 1da0ac5..642503d 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -716,7 +716,7 @@ main .section-wrapper > div { /* jank protection for async sections */ -main .page-list-container, main .page-list { +main .page-list-container { opacity: 0; height: 100vh; transition: opacity 100ms; From ce48ed93a5a28add48b901e1e20bc2d2628bad2a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 3 Apr 2021 07:32:20 -0700 Subject: [PATCH 383/649] fix: remove trailing .html --- express/blocks/blog-posts/blog-posts.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index eafa301..aec1fbb 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -114,9 +114,11 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { for (let i = offset; i < max; i += 1) { const post = posts[i]; const { - path, title, teaser, image, category, + title, teaser, image, category, } = post; + const path = post.path.split('.')[0]; + const eyebrow = category; const isHero = hasHero && !i; const imagePath = image.split('?')[0].split('_')[1]; From ca32513465cf6e9ab68be8c580270326622d5a9c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 3 Apr 2021 07:49:54 -0700 Subject: [PATCH 384/649] feat: internationalized custom signin --- express/scripts/martech.js | 4 +++- express/scripts/scripts.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 0d00878..ac05c2e 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -437,7 +437,9 @@ window.fedsConfig = { }, profile: { customSignIn: () => { - window.location.href = 'https://spark.adobe.com/sp'; + const sparkLang = getLanguage(getLocale(window.location)); + const sparkPrefix = sparkLang === 'en-US' ? '' : `/${sparkLang}`; + window.location.href = `https://spark.adobe.com${sparkPrefix}/sp/`; }, }, }; diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 81b965b..225c269 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1048,7 +1048,7 @@ function displayOldLinkWarning() { if (window.location.hostname.includes('localhost') || window.location.hostname.includes('.hlx.page')) { document.querySelectorAll('main a[href^="https://spark.adobe.com/"]').forEach(($a) => { const url = new URL($a.href); - if (!(url.pathname.startsWith('/sp') || url.pathname === '/' + if (!(url.pathname.endsWith('/sp/') || url.pathname === '/' || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/') || url.pathname.startsWith('/post/') || url.pathname.startsWith('/video/') || url.pathname.startsWith('/classroom/'))) { From 9af6820238f7ca20828c9a34e05393d44140cf61 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 3 Apr 2021 08:23:05 -0700 Subject: [PATCH 385/649] chore(page-list): mobile touch up --- express/blocks/page-list/page-list.css | 38 ++++++++++++++++++-------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 839201f..703e336 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -42,16 +42,6 @@ main .page-list-browse-button { font-family: 'adobe-clean', 'Adobe Clean', sans-serif; } -@media (min-width: 600px) { - main .page-list-browse-button { - display: none; - } - main .page-list { - width: 260px; - } -} - - main .page-list-container > div { max-width: 100%; display: flex; @@ -85,13 +75,37 @@ main .hero-short { main .page-list-left { flex: 0 0 auto; - overflow-y: scroll; } main .page-list-right { flex: 1 1 auto; - padding-left: 20px; } +main div.section-wrapper.page-list-container > div { + padding-left: 6px; +} + + +@media (min-width: 600px) { + main .page-list-left { + overflow-y: scroll; + } + + main .page-list-browse-button { + display: none; + } + main .page-list { + width: 260px; + } + + main .page-list-right { + padding-left: 20px; + } + +} + + + + main .page-template-list > .template-list.flex-masonry { justify-content: flex-start; } From 2018f16e30a59e2a97c4f8a30f45083dcd8a3585 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 3 Apr 2021 11:40:53 -0700 Subject: [PATCH 386/649] fix(page-list): safari layout --- express/blocks/page-list/page-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 0dc57e9..7ff8c32 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -32,7 +32,7 @@ function addPages(index, config, $block) { } function setSize($container) { const $left = $container.querySelector('.page-list'); - const $right = $container.querySelector('.page-list-right'); + const $right = $container.querySelector('.page-list-right .template-list'); $left.style.height = `${$right.offsetHeight}px`; } From 8ba120070c8e6df7dfdd9831a18c07b9fa5a8802 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 3 Apr 2021 11:59:54 -0700 Subject: [PATCH 387/649] fix(page-list): safari layout --- express/blocks/page-list/page-list.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 7ff8c32..003bceb 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -107,7 +107,9 @@ async function decoratePageList($block) { }); showHide($block, $ptl); - setSize($flex); + setTimeout(() => { + setSize($flex); + }, 500); window.addEventListener('resize', () => { showHide($block, $ptl); setSize($flex); From 7db44a45abdea79dfbd17641c5b4c094baedd050 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 3 Apr 2021 12:42:08 -0700 Subject: [PATCH 388/649] feat(fonts): load fonts earlier in same session --- express/scripts/scripts.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 225c269..45baf63 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -10,7 +10,7 @@ * governing permissions and limitations under the License. */ /* global window, navigator, document, fetch, performance, PerformanceObserver, - localStorage, FontFace */ + localStorage, FontFace, sessionStorage */ /* eslint-disable no-console */ export function toClassName(name) { @@ -584,6 +584,7 @@ async function loadFonts() { document.fonts.add(f900); document.fonts.add(f400); document.fonts.add(f700); + sessionStorage.setItem('helix-fonts', 'loaded'); } catch (err) { /* something went wrong */ console.log(err); @@ -1082,6 +1083,9 @@ async function decoratePage() { setTemplate(); setTheme(); await decorateTesting(); + if (sessionStorage.getItem('helix-font') === 'loaded') { + loadFonts(); + } splitSections(); wrapSections('main > div'); decorateHeaderAndFooter(); From eb8199e5f90b7b5f0e71af1042c59876a9a4e3bf Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 3 Apr 2021 13:25:00 -0700 Subject: [PATCH 389/649] feat(martech): proper martech control --- express/scripts/scripts.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 45baf63..f48b811 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -598,10 +598,13 @@ function postLCP() { loadCSS('/express/styles/lazy-styles.css'); loadBlocks(); resolveFragments(); + + const usp = new URLSearchParams(window.location.search); + const martech = usp.get('martech'); + // loadLazyFooter(); - if (!(window.location.search === '?nomartech' || document.querySelector(`head script[src="${martechUrl}"]`))) { + if (!(martech === 'off' || document.querySelector(`head script[src="${martechUrl}"]`))) { let ms = 2000; - const usp = new URLSearchParams(window.location.search); const delay = usp.get('delay'); if (delay) ms = +delay; setTimeout(() => { @@ -753,8 +756,9 @@ async function checkTesting(url) { async function decorateTesting() { let runTest = true; // let reason = ''; - - if (await checkTesting(window.location.href)) { + const usp = new URLSearchParams(window.location.search); + const martech = usp.get('martech'); + if ((await checkTesting(window.location.href) && (martech !== 'off') && (martech !== 'delay')) || martech === 'rush') { // eslint-disable-next-line no-console console.log('rushing martech'); loadScript('/express/scripts/martech.js', null, 'module'); From 8706fa7e53e521a6ea3f24c75bbea04dbbfd3dae Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 4 Apr 2021 09:17:57 -0700 Subject: [PATCH 390/649] feat: make logo clickable --- express/scripts/scripts.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index f48b811..6554c3d 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -342,6 +342,13 @@ function getGnavPlaceholder(nav) { function decorateHeaderAndFooter() { const $header = document.querySelector('header'); + $header.addEventListener('click', (event) => { + if (event.target.id === 'feds-topnav') { + const root = window.location.href.split('/express/')[0]; + window.location.href = `${root}/express/`; + } + }); + /* init header */ const locale = getLocale(window.location); From 815b4ae5f1e77eb2a8a88efbcc2d08b2627d5dac Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 4 Apr 2021 09:29:40 -0700 Subject: [PATCH 391/649] feat(gnav): adjust link with hero primarye --- express/scripts/martech.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index ac05c2e..e6285a8 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -446,6 +446,15 @@ window.fedsConfig = { loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js', () => { setTimeout(() => { + /* attempt to switch link */ + if (window.location.pathname.includes('/create/') || window.location.pathname.includes('/discover/')) { + const $aNav = document.querySelector('header a.feds-navLink--primaryCta'); + const $aHero = document.querySelector('main .hero a.button.primary'); + if ($aNav && $aHero) { + $aNav.href = $aHero.href; + } + } + const gnav = document.getElementById('feds-header'); const placeholder = document.getElementById('header-placeholder'); gnav.classList.add('appear'); From 8082638f0905e094b26c84634f33101eca2d000a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 5 Apr 2021 09:17:18 -0700 Subject: [PATCH 392/649] fix(theme): move theme to body --- express/scripts/scripts.js | 4 ++-- express/styles/styles.css | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 6554c3d..36e90a3 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -979,8 +979,8 @@ function setTheme() { const theme = getMeta('theme'); if (theme) { const themeClass = toClassName(theme); - const $main = document.querySelector('main'); - $main.classList.add(themeClass); + const $body = document.body; + $body.classList.add(themeClass); } } diff --git a/express/styles/styles.css b/express/styles/styles.css index 642503d..7c53cd1 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -22,6 +22,7 @@ header { background-size: auto 42px; background-position: bottom 24px center; position: relative; + background-color: white; } #feds-header { @@ -268,7 +269,7 @@ a.button > svg > use { /* make page : hero */ -main.light-grey { +body.light-grey { background-color: #f4f4f4; } From 37ccff1b1ef2ee60fe8559397c9f686a99d413c0 Mon Sep 17 00:00:00 2001 From: Solene Date: Mon, 5 Apr 2021 13:48:17 -0400 Subject: [PATCH 393/649] feature(individual-plan): created the pricing-plan block --- express/blocks/pricing-plan/pricing-plan.css | 46 ++++++++++++++++++++ express/blocks/pricing-plan/pricing-plan.js | 35 +++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 express/blocks/pricing-plan/pricing-plan.css create mode 100644 express/blocks/pricing-plan/pricing-plan.js diff --git a/express/blocks/pricing-plan/pricing-plan.css b/express/blocks/pricing-plan/pricing-plan.css new file mode 100644 index 0000000..1758407 --- /dev/null +++ b/express/blocks/pricing-plan/pricing-plan.css @@ -0,0 +1,46 @@ +main .pricing-plan .gradient-border { + background: -moz-linear-gradient(135deg, #ffda00 0%, #ff9800 25%, #fd2d00 50%, #d20b48 75%, #8403d1 100%); + background: -webkit-linear-gradient(135deg, #ffda00 0%, #ff9800 25%, #fd2d00 50%, #d20b48 75%, #8403d1 100%); + background: linear-gradient(135deg, #ffda00 0%, #ff9800 25%, #fd2d00 50%, #d20b48 75%, #8403d1 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffda00",endColorstr="#d10384",GradientType=1); + padding: 3px; + border-radius: 21px; + max-width: 400px; + margin: 0 auto; +} + +main .pricing-plan .inner-rectangle { + background: white; + border-radius: 18px; + padding: 32px 64px; + text-align: center; +} + +main .pricing-plan .inner-rectangle * { + text-align: center !important; +} + +main .pricing-plan .inner-rectangle hr { + border: 1px solid #efeff0; +} + +main .pricing-plan p:last-child { + margin-bottom: 0; +} + +main .pricing-plan .button-container { + margin: 16px 0 0 0; +} + +main .pricing-plan .button-container .button { + margin: 0; +} + +main .pricing-plan .price { + margin-bottom: 4px; +} + +main .pricing-plan .price strong { + font-weight: 900; + font-size: 36px; +} \ No newline at end of file diff --git a/express/blocks/pricing-plan/pricing-plan.js b/express/blocks/pricing-plan/pricing-plan.js new file mode 100644 index 0000000..b8020b8 --- /dev/null +++ b/express/blocks/pricing-plan/pricing-plan.js @@ -0,0 +1,35 @@ +/* + * Copyright 2021 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. + */ +import { + createTag, +} from '../../scripts/scripts.js'; + +function decoratePricingPlan($block) { + const blockContent = $block.firstElementChild.innerHTML; + $block.innerHTML = ` +
+
+
+
+ `; + const $innerRectangle = $block.querySelector('.inner-rectangle'); + $innerRectangle.innerHTML = blockContent; + const paragraphs = Array.from($block.querySelectorAll('p')); + const prices = paragraphs.filter(p => /\$/.test(p.innerHTML)); + prices.forEach(($price) => { + $price.classList.add('price') + }); +} + +export default function decorate($block) { + decoratePricingPlan($block); +} From 2c8cf9f257cbf2b58e7e6a6436680c474a9ad5a8 Mon Sep 17 00:00:00 2001 From: Solene Date: Mon, 5 Apr 2021 13:53:36 -0400 Subject: [PATCH 394/649] fix(individual-plan): pricing-plan block mobile responsiveness --- express/blocks/pricing-plan/pricing-plan.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/express/blocks/pricing-plan/pricing-plan.css b/express/blocks/pricing-plan/pricing-plan.css index 1758407..aac65af 100644 --- a/express/blocks/pricing-plan/pricing-plan.css +++ b/express/blocks/pricing-plan/pricing-plan.css @@ -9,6 +9,12 @@ main .pricing-plan .gradient-border { margin: 0 auto; } +@media (min-width: 900px) { + main .pricing-plan .gradient-border { + margin-right: 40px; + } +} + main .pricing-plan .inner-rectangle { background: white; border-radius: 18px; @@ -16,6 +22,12 @@ main .pricing-plan .inner-rectangle { text-align: center; } +@media (max-width: 450px) { + main .pricing-plan .inner-rectangle { + padding: 32px; + } +} + main .pricing-plan .inner-rectangle * { text-align: center !important; } From 476714aed41ab5100e0dbcf425c78492b3b4d893 Mon Sep 17 00:00:00 2001 From: Solene Date: Mon, 5 Apr 2021 13:56:33 -0400 Subject: [PATCH 395/649] fix(individual-plan): pricing-plan block mobile padding --- express/blocks/pricing-plan/pricing-plan.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/express/blocks/pricing-plan/pricing-plan.css b/express/blocks/pricing-plan/pricing-plan.css index aac65af..008281d 100644 --- a/express/blocks/pricing-plan/pricing-plan.css +++ b/express/blocks/pricing-plan/pricing-plan.css @@ -7,11 +7,13 @@ main .pricing-plan .gradient-border { border-radius: 21px; max-width: 400px; margin: 0 auto; + margin-bottom: 56px; } @media (min-width: 900px) { main .pricing-plan .gradient-border { margin-right: 40px; + margin-bottom: 0; } } From 474f4f037dc4a5f94829daac82b0350d99cb6cb1 Mon Sep 17 00:00:00 2001 From: Solene Date: Mon, 5 Apr 2021 13:58:12 -0400 Subject: [PATCH 396/649] fix(individual-plan): pricing-plan block mobile margin --- express/blocks/pricing-plan/pricing-plan.css | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/express/blocks/pricing-plan/pricing-plan.css b/express/blocks/pricing-plan/pricing-plan.css index 008281d..1cc3bbd 100644 --- a/express/blocks/pricing-plan/pricing-plan.css +++ b/express/blocks/pricing-plan/pricing-plan.css @@ -7,13 +7,17 @@ main .pricing-plan .gradient-border { border-radius: 21px; max-width: 400px; margin: 0 auto; - margin-bottom: 56px; } @media (min-width: 900px) { main .pricing-plan .gradient-border { margin-right: 40px; - margin-bottom: 0; + } +} + +@media (max-width: 600) { + main .pricing-plan .gradient-border { + margin-bottom: 56px; } } From 0393f444b1739edd7e5cb953e3b7ad915dc1bc16 Mon Sep 17 00:00:00 2001 From: Solene Date: Mon, 5 Apr 2021 13:59:24 -0400 Subject: [PATCH 397/649] fix(individual-plan): pricing-plan block typo in style --- express/blocks/pricing-plan/pricing-plan.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/pricing-plan/pricing-plan.css b/express/blocks/pricing-plan/pricing-plan.css index 1cc3bbd..58c32ea 100644 --- a/express/blocks/pricing-plan/pricing-plan.css +++ b/express/blocks/pricing-plan/pricing-plan.css @@ -15,7 +15,7 @@ main .pricing-plan .gradient-border { } } -@media (max-width: 600) { +@media (max-width: 600px) { main .pricing-plan .gradient-border { margin-bottom: 56px; } From 11f3b7a6b6f27150cd9075cd21fc9e32ab4cb9f7 Mon Sep 17 00:00:00 2001 From: Solene Date: Mon, 5 Apr 2021 14:16:10 -0400 Subject: [PATCH 398/649] fix(individual-plan): refactoring pricing-plan block --- express/blocks/pricing-plan/pricing-plan.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/express/blocks/pricing-plan/pricing-plan.js b/express/blocks/pricing-plan/pricing-plan.js index b8020b8..65b6f5f 100644 --- a/express/blocks/pricing-plan/pricing-plan.js +++ b/express/blocks/pricing-plan/pricing-plan.js @@ -15,18 +15,16 @@ import { function decoratePricingPlan($block) { const blockContent = $block.firstElementChild.innerHTML; - $block.innerHTML = ` -
-
-
-
- `; - const $innerRectangle = $block.querySelector('.inner-rectangle'); + $block.innerHTML = ''; + const $gradientBorder = createTag('div', { class: 'gradient-border' }); + $block.append($gradientBorder); + const $innerRectangle = createTag('div', { class: 'inner-rectangle' }); + $gradientBorder.append($innerRectangle); $innerRectangle.innerHTML = blockContent; - const paragraphs = Array.from($block.querySelectorAll('p')); - const prices = paragraphs.filter(p => /\$/.test(p.innerHTML)); + const paragraphs = Array.from($innerRectangle.querySelectorAll('p')); + const prices = paragraphs.filter((p) => /\$/.test(p.innerHTML)); prices.forEach(($price) => { - $price.classList.add('price') + $price.classList.add('price'); }); } From aa95fdc92844585ac4b226f1537f3c43d0a11908 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 5 Apr 2021 16:46:45 -0700 Subject: [PATCH 399/649] fix(tutorials): design touch up --- express/blocks/tutorials/tutorials.css | 29 +++++++++++++++++++------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/express/blocks/tutorials/tutorials.css b/express/blocks/tutorials/tutorials.css index 24dfb99..f993323 100644 --- a/express/blocks/tutorials/tutorials.css +++ b/express/blocks/tutorials/tutorials.css @@ -2,12 +2,18 @@ main .tutorials .filters { margin-top: 25px; } +main .tutorials .filters .tag-filter:hover { + background-color: #eee; +} + main .tutorials .filters .tag-filter { - border: 1px solid lightgray; + border: 2px solid black; border-radius: 20px; - padding: 4px 20px 6px 20px; - margin: 5px; + padding: 6px 20px 6px 20px; + margin: 8px; display: inline-block; + font-weight: 700; + cursor: pointer; } main .tutorials-container .hidden { @@ -19,9 +25,11 @@ main .tutorials .filters .tag-filter { } main .tutorials .filters .tag-filter.selected { - background-color: #1473e6; - color: white; + background-color: #ccc; + color: black; font-weight: 700; + padding: 8px 22px 8px 22px; + border: 0; } main .tutorials-container .results { @@ -38,7 +46,7 @@ main .tutorials .filters .tag-filter { display: flex; flex-direction: column; width: 350px; - margin: 10px; + margin: 20px; text-align: left; } @@ -47,6 +55,8 @@ main .tutorials .filters .tag-filter { position: relative; border-radius: 10px 10px 0 0; overflow: hidden; + border-width: 1px 0 1px 1px; + border: 1px solid grey; } main .tutorials-container .results .tutorial-card h3 { @@ -71,6 +81,7 @@ main .tutorials .filters .tag-filter { border: 1px solid grey; border-width: 0 1px 0 1px; padding: 10px; + height: 50px; } main .tutorial-card .tutorial-card-tags { @@ -78,6 +89,7 @@ main .tutorials .filters .tag-filter { border: 1px solid grey; border-width: 0 1px 1px 1px; padding: 10px; + height: 92px; } main .tutorials-container .results .tutorial-card-img .badge { @@ -120,11 +132,12 @@ main .tutorials .filters .tag-filter { main .tutorials-container .results .tutorial-card-tags span { - border: 1px solid #444; + border: 2px solid #444; border-radius: 20px; color: #444; display: inline-block; - padding: 2px 10px 4px 10px; + padding: 6px 20px 6px 20px; margin: 5px; + font-size: 14px; } \ No newline at end of file From 2518dedf29b324e482f3a0455b3edac9055cfa0a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 5 Apr 2021 19:21:34 -0700 Subject: [PATCH 400/649] fix(analytics): wrong trigger for photo category --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index e6285a8..f53f18c 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -91,7 +91,7 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { || pathname.includes('/feature/') ) { category = 'design'; - if (pathname.includes('/photo')) category = 'photo'; + if (pathname.includes('/image')) category = 'photo'; if (pathname.includes('/video')) category = 'video'; } let sparkLandingPageType; From b3adf152e942d23ac45be48822b54d3c505544f9 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Tue, 6 Apr 2021 11:50:19 +0900 Subject: [PATCH 401/649] fix(template): ensure correct class w/o link --- express/blocks/template-list/template-list.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index a6e6ada..9a0e74f 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -186,6 +186,11 @@ async function decorateTemplateList($block) { } } } + + // ensure the template div has the template class if not a linked image and no template link + if (!$link && !$imgLink) { + $tmplt.classList.add('template'); + } } /* flex masonry */ From 7972db0345e516363443f5552e2047bbe0240fb9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 5 Apr 2021 20:22:04 -0700 Subject: [PATCH 402/649] chore: default link color --- express/styles/styles.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 7c53cd1..8ef01b5 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -277,6 +277,10 @@ main { text-align: center; } +main a:any-link { + color: black; +} + main img { max-width: 100%; } From 16f154935d6bdb1386e4cbd0dc87d465c0c5540a Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Tue, 6 Apr 2021 12:22:39 +0900 Subject: [PATCH 403/649] fix(template): always add template class --- express/blocks/template-list/template-list.js | 7 +------ .../blocks/expected/template-list.linkedimage.block.html | 2 +- .../blocks/expected/template-list.linknotext.block.html | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 9a0e74f..9497187 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -144,7 +144,6 @@ async function decorateTemplateList($block) { if ($link) { const $a = createTag('a', { href: $link.href || '#', - class: 'template', }); $a.append(...$tmplt.childNodes); $tmplt.remove(); @@ -157,6 +156,7 @@ async function decorateTemplateList($block) { $link.parentNode.append($newLink); $link.remove(); } + $tmplt.classList.add('template'); // wrap "linked images" with link const $imgLink = $tmplt.querySelector(':scope > div:first-of-type a'); @@ -186,11 +186,6 @@ async function decorateTemplateList($block) { } } } - - // ensure the template div has the template class if not a linked image and no template link - if (!$link && !$imgLink) { - $tmplt.classList.add('template'); - } } /* flex masonry */ diff --git a/test/unit/blocks/expected/template-list.linkedimage.block.html b/test/unit/blocks/expected/template-list.linkedimage.block.html index 52e49b4..14af85a 100644 --- a/test/unit/blocks/expected/template-list.linkedimage.block.html +++ b/test/unit/blocks/expected/template-list.linkedimage.block.html @@ -1,5 +1,5 @@
-
+
-
+ -
+
Date: Mon, 5 Apr 2021 21:22:01 -0700 Subject: [PATCH 404/649] chore: add login links --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 36e90a3..819872a 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -1060,7 +1060,7 @@ function displayOldLinkWarning() { if (window.location.hostname.includes('localhost') || window.location.hostname.includes('.hlx.page')) { document.querySelectorAll('main a[href^="https://spark.adobe.com/"]').forEach(($a) => { const url = new URL($a.href); - if (!(url.pathname.endsWith('/sp/') || url.pathname === '/' + if (!(url.pathname.endsWith('/sp/') || url.pathname.endsWith('/sp/login') || url.pathname === '/' || url.pathname.startsWith('/tools/') || url.pathname.startsWith('/page/') || url.pathname.startsWith('/post/') || url.pathname.startsWith('/video/') || url.pathname.startsWith('/classroom/'))) { From f5376ece7b3545e351a899926a05dff698e0a439 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 6 Apr 2021 11:22:42 +0200 Subject: [PATCH 405/649] chore: horizontal spacing for centered columns --- express/blocks/columns/columns.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 3be2558..4de7040 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -81,6 +81,9 @@ main .columns .social.icon { text-align: center; } + main .section-wrapper div.columns.centered > div > div { + padding: 10px 24px; + } main .columns > div span.num { font-size: 22px; From cb843fc6b430c4a3edaeba9a1aab66d0919c8db5 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 6 Apr 2021 11:24:01 +0200 Subject: [PATCH 406/649] chore: whitespace and cleanup --- express/blocks/columns/columns.css | 39 ++++++++++++++---------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 4de7040..515721e 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -63,27 +63,24 @@ main .columns .social.icon { } @media (min-width:900px) { - main .columns > div { - flex-direction: row; - text-align: left; - } - - main .section-wrapper div.columns > div > div { - width: 50%; - padding: 10px; - } - - main .section-wrapper div.columns > div > div * { - text-align: left; - } - - main .section-wrapper div.columns.centered > div > div * { - text-align: center; - } - - main .section-wrapper div.columns.centered > div > div { - padding: 10px 24px; - } + main .columns > div { + flex-direction: row; + text-align: left; + } + + main .section-wrapper div.columns > div > div { + width: 50%; + padding: 10px; + } + + main .section-wrapper div.columns > div > div * { + text-align: left; + } + + main .section-wrapper div.columns.centered > div > div * { + text-align: center; + padding: 10px 24px; + } main .columns > div span.num { font-size: 22px; From 79a8b47ac9c2260a6ebdf2ee4effd5c24f9ee848 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 6 Apr 2021 11:27:53 +0200 Subject: [PATCH 407/649] chore: too much cleanup --- express/blocks/columns/columns.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 515721e..25ffd55 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -79,6 +79,9 @@ main .columns .social.icon { main .section-wrapper div.columns.centered > div > div * { text-align: center; + } + + main .section-wrapper div.columns.centered > div > div { padding: 10px 24px; } From 995dbb994b267d634c544916ab8050ec877c49a0 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 6 Apr 2021 12:18:10 +0200 Subject: [PATCH 408/649] chore: horizontal spacing for columns --- express/blocks/columns/columns.css | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 25ffd55..c261567 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -70,7 +70,7 @@ main .columns .social.icon { main .section-wrapper div.columns > div > div { width: 50%; - padding: 10px; + padding: 10px 24px; } main .section-wrapper div.columns > div > div * { @@ -81,10 +81,6 @@ main .columns .social.icon { text-align: center; } - main .section-wrapper div.columns.centered > div > div { - padding: 10px 24px; - } - main .columns > div span.num { font-size: 22px; line-height: 29px; From 4af8dfba345fd96a3689ba7fcd7885be1c5e2534 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 6 Apr 2021 12:29:10 +0200 Subject: [PATCH 409/649] chore: reduced padding between buttons --- express/styles/styles.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 8ef01b5..5d10eb7 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -555,8 +555,9 @@ main .section-wrapper p { } main .section-wrapper p.button-container { - text-align: center; - margin-bottom: 0; + text-align: center; + margin-top: 16px; + margin-bottom: 0; } main .section-wrapper.steps-dark-container > div > h2 { From c5c83086f2a5840b3222f1f2304d0e5a0a4b2647 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 6 Apr 2021 13:46:02 +0200 Subject: [PATCH 410/649] chore: left-align template lists inside columns --- express/blocks/template-list/template-list.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 352682a..7f33ddb 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -156,6 +156,7 @@ main .template-list.masonry .template { main .columns .template-list { flex-direction: row; flex-wrap: nowrap; + justify-content: flex-start; } main .columns .template-list .template { @@ -165,6 +166,6 @@ main .template-list.masonry .template { main .columns .template-list .template-link { font-size: 0.875rem; - font-weight: 400;; + font-weight: 400; } } From b2b77af3ce571dea9a8138dd056fac1232dbbf55 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 6 Apr 2021 15:46:36 +0200 Subject: [PATCH 411/649] feat(picker): add premium marker to selection (#84) --- tools/templates/picker.html | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/tools/templates/picker.html b/tools/templates/picker.html index 4cea700..f9407ac 100644 --- a/tools/templates/picker.html +++ b/tools/templates/picker.html @@ -166,6 +166,18 @@ float: left; } + #selectionPanel .premium { + background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iNDAuNTA5IiBoZWlnaHQ9IjU1LjgxOSIgdmlld0JveD0iMCAwIDQwLjUwOSA1NS44MTkiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDI9IjEiIHkyPSIxLjA0NyIgZ3JhZGllbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZGEwMCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2Y0YjMwMCIvPjwvbGluZWFyR3JhZGllbnQ+PGZpbHRlciBpZD0iYiIgeD0iMC4xOTUiIHk9IjEuNjg4IiB3aWR0aD0iNDAuMTMzIiBoZWlnaHQ9IjU0LjEzMSIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48ZmVPZmZzZXQgZHk9IjIiIGlucHV0PSJTb3VyY2VBbHBoYSIvPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjAuNSIgcmVzdWx0PSJjIi8+PGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMC4xNjEiLz48ZmVDb21wb3NpdGUgb3BlcmF0b3I9ImluIiBpbjI9ImMiLz48ZmVDb21wb3NpdGUgaW49IlNvdXJjZUdyYXBoaWMiLz48L2ZpbHRlcj48L2RlZnM+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCkiIGZpbHRlcj0idXJsKCNiKSI+PHBhdGggZD0iTS0zNDQuMzM0LDEwODguOGwxMS41NDYsMy43MDhhNC4zMyw0LjMzLDAsMCwwLDIuNjUyLDBsMTEuNTQ2LTMuNzA4YTQuMzQyLDQuMzQyLDAsMCwxLDMuOS42NDEsNC40MTMsNC40MTMsMCwwLDEsMS43OTEsMy41NTN2MjcuNTE3YTE4LjYzOSwxOC42MzksMCwwLDEtMTguNTY2LDE4LjcxMmgwYTE4LjYzOSwxOC42MzksMCwwLDEtMTguNTY2LTE4LjcxMlYxMDkyLjk5YTQuNDEzLDQuNDEzLDAsMCwxLDEuNzkxLTMuNTUzQTQuMzQyLDQuMzQyLDAsMCwxLTM0NC4zMzQsMTA4OC44WiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzUxLjcyIC0xMDg2LjkpIiBmaWxsPSJ1cmwoI2EpIi8+PC9nPjxwYXRoIGQ9Ik0tMzMwLjc3NCwxMTQxLjZhMjAuMjc2LDIwLjI3NiwwLDAsMS0yMC4yNTQtMjAuMjU1di0yOC4xM2E1LjU3MSw1LjU3MSwwLDAsMSwyLjMwNy00LjU0LDUuNTYxLDUuNTYxLDAsMCwxLDUuMDI3LS44MTdsMTEuODk0LDMuNzg5YTMuMzU0LDMuMzU0LDAsMCwwLDIuMDUsMGwxMS45LTMuNzg5YTUuNTYyLDUuNTYyLDAsMCwxLDUuMDI4LjgxNyw1LjU3LDUuNTcsMCwwLDEsMi4zMDcsNC41NHYyOC4xM0EyMC4yNzYsMjAuMjc2LDAsMCwxLTMzMC43NzQsMTE0MS42Wm0tMTQuNjM5LTUxLjc2YTMuMzM4LDMuMzM4LDAsMCwwLTEuOTguNjU0LDMuMzQxLDMuMzQxLDAsMCwwLTEuMzg0LDIuNzI1djI4LjEzMWExOC4wMjQsMTguMDI0LDAsMCwwLDE4LDE4LDE4LjAyNCwxOC4wMjQsMCwwLDAsMTgtMTh2LTI4LjEzMWEzLjM0NCwzLjM0NCwwLDAsMC0xLjM4NC0yLjcyNSwzLjMzOSwzLjMzOSwwLDAsMC0zLjAxOC0uNDkybC0xMS44OTQsMy43OWE1LjU4MSw1LjU4MSwwLDAsMS0zLjQxNiwwbC0xMS45LTMuNzlhMy40MTUsMy40MTUsMCwwLDAtMS4wMzUtLjE1N1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDM1MS4wMjggLTEwODcuNTgyKSIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg=="); + background-repeat: no-repeat; + background-size: contain; + display: block; + height: 18px; + position: absolute; + right: 1px; + top: -2px; + width: 16px; + } + + - +
-
-
-

-

-
+
+
+ + +
+
+ +
+ Home / Adobe Creative Cloud +
+
+ `; } async function fetchBlueprint(pathname) { diff --git a/express/styles/styles.css b/express/styles/styles.css index 61916d2..9a2e9e1 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -5,27 +5,171 @@ body { } header { height: 64px; + box-sizing: border-box; + border-bottom: 1px solid #EAEAEA; +} + +header .desktop { + display: none; +} + +header .mobile { display: flex; justify-content: space-between; + align-items: center; + height: 64px; box-sizing: border-box; - margin: 20px; + padding: 20px 16px 20px 21px; + color: #2c2c2c; } -header .icon { - height: 35px; - width: 35px; - position: relative; - top: 0; - margin-right: 10px; +header .mobile .hamburger { + font-size: 19px; } -header .logo { - display: inline-flex; - align-self: center; - font-size: 27px; - font-weight: 200; - margin: 5px; - color: #888; +header .mobile .signin { + font-size: 14px; +} + +header .mobile .logo img { + height: 24px; + width: 24px; + padding-left: 15px; +} + +header .mobile .hamburger::before { + content: "\2630"; +} + +@media (min-width: 1200px) { + + header { + height: 98px; + background-size: 1201px auto; + b_ackground-image: url(/express/gnav-placeholder/backdrop2.png); + } + + header .mobile { + display: none; + } + + header .desktop { + display: block; + color: #2c2c2c; + font-size: 14px; + } + + header .desktop .top { + display: flex; + justify-content: space-between; + align-items: center; + height: 64px; + border-bottom: 1px solid #EAEAEA; + } + + header .desktop .top .left { + display: flex; + align-items: center; + } + + header .desktop .logo { + width: 124px; + box-sizing: border-box; + padding-left: 21px; + display: flex; + font-weight: 600; + } + + header .desktop .logo img { + height: 24px; + width: 24px; + padding-top: 4px; + } + + header .desktop .logo span { + color: #fa0f00; + font-size: 18px; + padding-left: 12px; + display: block; + padding-top: 3px; + } + + header .desktop .top .section { + border-left: 1px solid #EAEAEA; + height: 64px; + padding: 0 8px; + } + + header .desktop .top .section span { + padding: 0 12px; + } + + header .desktop .top .button { + font-size: 14px; + height: 32px; + margin-left: 0; + padding: 0px 20px 3px 20px; + } + + header .desktop .top .selected { + font-weight: 600; + } + + header .desktop .top .right { + padding: 0 10px; + } + + header .desktop .top .right > div { + padding: 0 5px; + } + + header .desktop .top .right > div.search { + padding: 2px 10px; + + } + + header .desktop .bottom { + color: #707070; + padding: 10px 12px; + font-size: 12px; + } + + header .desktop .bottom > span { + padding: 0 8px; + } + + header .desktop .drop { + display: flex; + align-items: center; + } + + header .desktop .drop::after { + display: flex; + width: 6px; + height: 6px; + border-top-width: 0; + border-left-width: 0; + border-bottom-width: 1px; + border-right-width: 1px; + border-style: solid; + border-color: #2c2c2c; + transform-origin: 75% 75%; + transform: rotate( 45deg ); + transition: transform .1s ease; + content: ""; + margin-left: 5px; + margin-right: 2.25px; + } + + header .desktop .top .right { + display: flex; + align-items: center; + } + + header .desktop .top .left .section { + display: flex; + align-items: center; + } } a.button:any-link { From 5f55fb4c095c235f3881533673637b41a4fd65ca Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 3 Mar 2021 21:01:11 -0800 Subject: [PATCH 018/649] feat: video maker design --- express/blocks/how-to-steps/how-to-steps.css | 34 +++++ express/blocks/how-to-steps/how-to-steps.js | 51 +++++++ express/blocks/linked-image/linked-image.css | 0 express/blocks/linked-image/linked-image.js | 23 +++ .../blocks/template-list/template-list.css | 25 ++++ express/blocks/template-list/template-list.js | 91 ++++++++++++ express/scripts/scripts.js | 99 +------------ express/styles/lazy-styles.css | 50 +------ express/styles/styles.css | 137 ++++++++++++++---- 9 files changed, 342 insertions(+), 168 deletions(-) create mode 100644 express/blocks/how-to-steps/how-to-steps.css create mode 100644 express/blocks/how-to-steps/how-to-steps.js create mode 100644 express/blocks/linked-image/linked-image.css create mode 100644 express/blocks/linked-image/linked-image.js create mode 100644 express/blocks/template-list/template-list.css create mode 100644 express/blocks/template-list/template-list.js diff --git a/express/blocks/how-to-steps/how-to-steps.css b/express/blocks/how-to-steps/how-to-steps.css new file mode 100644 index 0000000..2bcc2b0 --- /dev/null +++ b/express/blocks/how-to-steps/how-to-steps.css @@ -0,0 +1,34 @@ +main .how-to-steps > div { + display: flex; + text-align: left; + } + main .how-to-steps .tip > p { + color: #82919b; + font-weight: 300; + font-size: 1.2em; + } + + main .how-to-steps .tip > h3 { + margin-top: 40px; + font-size: 28px; + line-height: 32px; + font-weight: 800; + } + + main .how-to-steps .number span { + background-color: #fcce00; + border-radius: 50%; + color: #fff; + font-size: 1.25rem; + font-weight: bold; + height: 2.25rem; + width: 2.25rem; + display: inline-block; + line-height: 2rem; + padding-top: 0.1rem; + width: 2.25rem; + padding-left: 0.8rem; + box-sizing: border-box; + margin-right: 16px; + } + \ No newline at end of file diff --git a/express/blocks/how-to-steps/how-to-steps.js b/express/blocks/how-to-steps/how-to-steps.js new file mode 100644 index 0000000..6e74613 --- /dev/null +++ b/express/blocks/how-to-steps/how-to-steps.js @@ -0,0 +1,51 @@ +/* + * Copyright 2021 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. + */ +/* global window */ + +import { + getLocale, + createTag, + } from '../../scripts/scripts.js'; + +export default function decorate($block) { + const $howto = $block; + const $heading = $howto.previousElementSibling; + const $rows = Array.from($howto.children); + const $schema = createTag('script', { type: 'application/ld+json' }); + const schema = { + '@context': 'http://schema.org', + '@type': 'HowTo', + name: $heading.textContent, + step: [], + }; + + $rows.forEach(($row, i) => { + const $cells = Array.from($row.children); + schema.step.push({ + '@type': 'HowToStep', + position: i + 1, + name: $cells[0].textContent, + itemListElement: { + '@type': 'HowToDirection', + text: $cells[1].textContent, + }, + }); + const $h3 = createTag('h3'); + $h3.innerHTML = `${i+1}. ${$cells[0].textContent}`; + $cells[1].prepend($h3); + $cells[1].classList.add('tip'); + $cells[0].remove(); + }); + $schema.innerHTML = JSON.stringify(schema); + const $head = document.head; + $head.append($schema); +} \ No newline at end of file diff --git a/express/blocks/linked-image/linked-image.css b/express/blocks/linked-image/linked-image.css new file mode 100644 index 0000000..e69de29 diff --git a/express/blocks/linked-image/linked-image.js b/express/blocks/linked-image/linked-image.js new file mode 100644 index 0000000..f726649 --- /dev/null +++ b/express/blocks/linked-image/linked-image.js @@ -0,0 +1,23 @@ +/* + * Copyright 2021 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. + */ +/* global window */ + +export default function decorate($block) { + const $a = $block.querySelector('a'); + const $parent = $a.closest('div'); + $a.remove(); + const picture = $parent.innerHTML; + $parent.innerHTML = ''; + $parent.appendChild($a); + $a.innerHTML = picture; + $a.className = ''; +} \ No newline at end of file diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css new file mode 100644 index 0000000..31274af --- /dev/null +++ b/express/blocks/template-list/template-list.css @@ -0,0 +1,25 @@ +main .template-list { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin: 40px 0; +} + +main .template-list > div p { + margin: 0; +} + +main .template-list > div { + display: flex; + flex-direction: column; + width: 250px; + margin: 20px; + justify-content: flex-end; + border: 1px solid #ccc; +} + +main .template-list.large > div { + width: 100%; + margin: 0; + border: 0; +} \ No newline at end of file diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js new file mode 100644 index 0000000..046400f --- /dev/null +++ b/express/blocks/template-list/template-list.js @@ -0,0 +1,91 @@ +/* + * Copyright 2021 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. + */ +/* global window */ + +import { + getLocale, + createTag, + } from '../../scripts/scripts.js'; + + +async function fetchBlueprint(pathname) { + if (window.spark.$blueprint) { + return (window.spark.$blueprint); + } + + const bpPath = pathname.substr(pathname.indexOf('/', 1)).split('.')[0]; + const resp = await fetch(`${bpPath}.plain.html`); + // eslint-disable-next-line no-console + console.log(`fetching...${bpPath}`); + const body = await resp.text(); + const $main = createTag('main'); + $main.innerHTML = body; + window.spark.$blueprint = $main; + console.log($main); + return ($main); +} + +async function decorateTemplateList($block) { + const rows = $block.children.length; + const locale = getLocale(window.location); + + $block.querySelectorAll('div > div:first-of-type a').forEach(($a) => { + const $parent = $a.closest('div'); + $a.remove(); + const picture = $parent.innerHTML; + $parent.innerHTML = ''; + $parent.appendChild($a); + $a.innerHTML = picture; + $a.className = ''; + + console.log($a); + }) + + if (rows === 0 && locale !== 'en-US') { + const tls = Array.from($block.closest('main').querySelectorAll('.template-list')); + const i = tls.indexOf($block); + + console.log(i); + + // eslint-disable-next-line no-await-in-loop + const $blueprint = await fetchBlueprint(window.location.pathname); + + const $bpBlock = $blueprint.querySelectorAll('.template-list')[i]; + if ($bpBlock) { + $block.innerHTML = $bpBlock.innerHTML; + } + + const $heroPicture = document.querySelector('.hero-bg'); + + if (!$heroPicture && window.spark.$blueprint) { + console.log ('replace hero') + const $bpHeroImage = window.spark.$blueprint.querySelector('div:first-of-type img'); + if ($bpHeroImage) { + const $heroSection = document.querySelector('main .hero'); + const $heroDiv = document.querySelector('main .hero > div'); + const $p = createTag('p'); + const $pic = createTag('picture', { class: 'hero-bg' }); + $pic.appendChild($bpHeroImage); + $p.append($pic); + + $heroSection.classList.remove('hero-noimage'); + $heroDiv.prepend($p); + } + } + } +} + +export default function decorate($block) { + decorateTemplateList($block); +} + + \ No newline at end of file diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 55b6aff..61f18c1 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -35,7 +35,7 @@ function wrapSections(element) { }); } -function getLocale(url) { +export function getLocale(url) { const locale = url.pathname.split('/')[1]; if (/^[a-z-]{2}(-[a-zA-Z-]*)?-[A-Z]{2}$/.test(locale)) { return locale; @@ -89,22 +89,6 @@ function decorateHeader() { `; } -async function fetchBlueprint(pathname) { - if (window.spark.$blueprint) { - return (window.spark.$blueprint); - } - - const bpPath = pathname.substr(pathname.indexOf('/', 1)).split('.')[0]; - const resp = await fetch(`${bpPath}.plain.html`); - // eslint-disable-next-line no-console - console.log('fetching...'); - const body = await resp.text(); - const $main = createTag('main'); - $main.innerHTML = body; - window.spark.$blueprint = $main; - return ($main); -} - function decorateDoMoreEmbed() { document.querySelectorAll('div.embed-internal-domore > div').forEach(($domore) => { const $ps = $domore.querySelectorAll(':scope>p'); @@ -131,7 +115,7 @@ function decorateBlocks() { if ($section) { $section.classList.add(`${blockName}-container`); } - const blocksWithOptions = ['checker-board']; + const blocksWithOptions = ['checker-board', 'template-list']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { const options = blockName.substring(b.length + 1).split('-'); @@ -288,43 +272,11 @@ function decorateBlogPosts() { }); } -async function decorateTemplateLists() { - const $templateLists = Array.from(document.querySelectorAll('main .template-list')); - for (let i = 0; i < $templateLists.length; i += 1) { - const $block = $templateLists[i]; - const rows = $block.children.length; - const locale = getLocale(window.location); - if (rows === 0 && locale !== 'en-US') { - // eslint-disable-next-line no-await-in-loop - const $blueprint = await fetchBlueprint(window.location.pathname); - $block.innerHTML = $blueprint.querySelectorAll('.template-list')[i].innerHTML; - } - } - - /* --- inherit hero image, this should go somewhere else --- */ - const $heroPicture = document.querySelector('.hero-bg'); - - if (!$heroPicture && window.spark.$blueprint) { - const $bpHeroImage = window.spark.$blueprint.querySelector('div:first-of-type img'); - if ($bpHeroImage) { - const $heroSection = document.querySelector('main .hero'); - const $heroDiv = document.querySelector('main .hero > div'); - const $p = createTag('p'); - const $pic = createTag('picture', { class: 'hero-bg' }); - $pic.appendChild($bpHeroImage); - $p.append($pic); - - $heroSection.classList.remove('hero-noimage'); - $heroDiv.prepend($p); - } - } -} - function postLCP() { const martechUrl = '/express/scripts/martech.js'; loadCSS('/express/styles/lazy-styles.css'); decorateBlocks(); - loadLazyFooter(); + //loadLazyFooter(); if (!(window.location.search === '?nomartech' || document.querySelector(`head script[src="${martechUrl}"]`))) { let ms = 2000; const usp = new URLSearchParams(window.location.search); @@ -335,7 +287,6 @@ function postLCP() { }, ms); } decorateBlogPosts(); - decorateTemplateLists(); } function decorateHero() { @@ -346,7 +297,7 @@ function decorateHero() { if ($h1) { const $main = document.querySelector('main'); if ($main.children.length === 1) { - $heroSection = createTag('div', { class: 'section-wrapper hero' }); + $heroSection = createTag('div', { class: 'hero' }); const $div = createTag('div'); $heroSection.append($div); if ($heroPicture) { @@ -357,6 +308,7 @@ function decorateHero() { } else { $heroSection = $h1.closest('.section-wrapper'); $heroSection.classList.add('hero'); + $heroSection.classList.remove('section-wrapper'); } } if ($heroPicture) { @@ -453,10 +405,12 @@ function decorateButtons() { if (!$a.querySelector('img')) { if ($up.childNodes.length === 1 && $up.tagName === 'P') { $a.className = 'button secondary'; + $up.classList.add('button-container'); } if ($up.childNodes.length === 1 && $up.tagName === 'STRONG' && $twoup.childNodes.length === 1 && $twoup.tagName === 'P') { $a.className = 'button primary'; + $twoUp.classList.add('button-container'); } } }); @@ -501,44 +455,6 @@ function decorateBlogPage() { } } -function decorateHowTo() { - const $head = document.head; - document.querySelectorAll('main .how-to-steps').forEach(($howto) => { - const $heading = $howto.previousElementSibling; - const $rows = Array.from($howto.children); - const $schema = createTag('script', { type: 'application/ld+json' }); - const schema = { - '@context': 'http://schema.org', - '@type': 'HowTo', - name: $heading.textContent, - step: [], - }; - - $rows.forEach(($row, i) => { - const $cells = Array.from($row.children); - const $number = createTag('div', { class: 'number' }); - $number.innerHTML = `${i + 1}`; - $row.prepend($number); - schema.step.push({ - '@type': 'HowToStep', - position: i + 1, - name: $cells[0].textContent, - itemListElement: { - '@type': 'HowToDirection', - text: $cells[1].textContent, - }, - }); - const $h3 = createTag('h3'); - $h3.innerHTML = $cells[0].textContent; - $cells[1].prepend($h3); - $cells[1].classList.add('tip'); - $cells[0].remove(); - }); - $schema.innerHTML = JSON.stringify(schema); - $head.append($schema); - }); -} - async function checkTesting(url) { const pathname = new URL(url).pathname.split('.')[0]; const resp = await fetch('/testing.json'); @@ -873,7 +789,6 @@ async function decoratePage() { decorateHero(); decorateTemplate(); decorateButtons(); - decorateHowTo(); decorateMigratedPages(); decorateBlogPage(); decorateTutorials(); diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index 9714402..66046e9 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -@import "/hlx_fonts/pnv6nym.css"; +@import "https://use.typekit.net/aaz7dvd.css"; /* below the fold */ @@ -17,54 +17,6 @@ main p { line-height: 1.5em; } -main .template-list { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - - -main .template-list > div { - display: flex; - flex-direction: column; - width: 250px; - margin: 20px; - justify-content: flex-end; - border: 1px solid #ccc; -} - -main .how-to-steps > div { - display: flex; - text-align: left; -} -main .how-to-steps .tip > p { - color: #82919b; - font-weight: 300; - font-size: 1.2em; -} - -main .how-to-steps .tip > h3 { - margin-top: 6px; -} - -main .how-to-steps .number span { - background-color: #fcce00; - border-radius: 50%; - color: #fff; - font-size: 1.25rem; - font-weight: bold; - height: 2.25rem; - width: 2.25rem; - display: inline-block; - line-height: 2rem; - padding-top: 0.1rem; - width: 2.25rem; - padding-left: 0.8rem; - box-sizing: border-box; - margin-right: 16px; -} - - main .list { list-style: none; diff --git a/express/styles/styles.css b/express/styles/styles.css index 9a2e9e1..757987b 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -3,6 +3,9 @@ body { margin: 0; padding: 0; } + +/* gnav placeholder */ + header { height: 64px; box-sizing: border-box; @@ -190,6 +193,8 @@ a.button:any-link { display: inline-block; } +/* make page : hero */ + main { text-align: center; } @@ -198,17 +203,11 @@ main img { max-width: 100%; } -main .section-wrapper>div { - margin: auto; - max-width: 950px; - padding: 64px 32px; -} - main .hero { color: white; text-shadow: 1px 1px 2px rgba(0,0,0,.25); position: relative; - padding: 64px 32px; + padding: 120px 0; } main .hero.hero-noimage { @@ -216,10 +215,24 @@ main .hero.hero-noimage { } main .hero h1 { - font-size: 2em; + font-size: 45px; font-weight: 900; + margin: 0 16px; + line-height: 49px; +} + +main .hero h2 { + font-size: 20px; + line-height: 28px; + margin: 32px 32px; + font-weight: 400; +} + +main .hero p, main .hero a.button:any-link { + margin: 0; } + main .hero .hero-bg { position: absolute; top: 0; @@ -236,31 +249,32 @@ main .hero .hero-bg img { object-fit: cover; } -.blog-page main .byline { - font-size: 0.8em; - color: #888; +main .hero > div { + padding: 0; } -.blog-page main .byline img { - height: 1em; - width: 1em; - display: inline-block; - margin-bottom: -3px; - opacity: 0.5; -} +@media (min-width:600px) { + main .hero h1 { + font-size: 60px; + line-height: 64px; + } -main .section-wrapper.hero > div { - padding: 0; -} + main .hero h2 { + font-size: 24px; + line-height: 28px; + margin-bottom: 40px; + } -.hidden { - display: none; -} + main .hero { + padding: 80px 0; + } -@media (min-width:600px) { - main>.hero h1 { - font-size: 3em; + main .hero>div { + max-width: 672px; + margin: auto; } + + } @media (min-width:900px) { @@ -268,3 +282,72 @@ main .section-wrapper.hero > div { font-size: 3.5em; } } + + +/* make page : default content */ + +main .section-wrapper > div { + margin: auto; + max-width: 672px; + padding: 0 32px; +} + +main .section-wrapper h2 { + font-size: 36px; + line-height: 40px; + margin: 0; + margin-top: 120px; + text-align: left; + font-weight: 800; +} + + +main .section-wrapper h2:first-of-type { + text-align: center; +} + +main .section-wrapper p { + font-size: 20px; + line-height: 24px; + margin: 32px 0; + text-align: left; +} + +main .section-wrapper p:first-of-type { + text-align: center; +} + +main .section-wrapper p.button-container { + text-align: center; +} + +@media (min-width:600px) { + main .section-wrapper h2 { + font-size: 45px; + line-height: 49px; + margin-top: 80px; + text-align: center; + } + + main .section-wrapper p { + font-size: 18px; + line-height: 22px; + } + +} + + +/* blog page */ + +.blog-page main .byline { + font-size: 0.8em; + color: #888; +} + +.blog-page main .byline img { + height: 1em; + width: 1em; + display: inline-block; + margin-bottom: -3px; + opacity: 0.5; +} From f22475766bf2f569f29900bc2b2a94eba3e4bad3 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 3 Mar 2021 21:17:18 -0800 Subject: [PATCH 019/649] chore: cleanup eslint --- express/blocks/how-to-steps/how-to-steps.js | 68 +++++++++---------- express/blocks/linked-image/linked-image.js | 4 +- express/blocks/template-list/template-list.js | 21 ++---- 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/express/blocks/how-to-steps/how-to-steps.js b/express/blocks/how-to-steps/how-to-steps.js index 6e74613..80d0737 100644 --- a/express/blocks/how-to-steps/how-to-steps.js +++ b/express/blocks/how-to-steps/how-to-steps.js @@ -9,43 +9,43 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window */ + +/* global document */ import { - getLocale, - createTag, - } from '../../scripts/scripts.js'; + createTag, +} from '../../scripts/scripts.js'; export default function decorate($block) { - const $howto = $block; - const $heading = $howto.previousElementSibling; - const $rows = Array.from($howto.children); - const $schema = createTag('script', { type: 'application/ld+json' }); - const schema = { - '@context': 'http://schema.org', - '@type': 'HowTo', - name: $heading.textContent, - step: [], - }; + const $howto = $block; + const $heading = $howto.previousElementSibling; + const $rows = Array.from($howto.children); + const $schema = createTag('script', { type: 'application/ld+json' }); + const schema = { + '@context': 'http://schema.org', + '@type': 'HowTo', + name: $heading.textContent, + step: [], + }; - $rows.forEach(($row, i) => { - const $cells = Array.from($row.children); - schema.step.push({ - '@type': 'HowToStep', - position: i + 1, - name: $cells[0].textContent, - itemListElement: { - '@type': 'HowToDirection', - text: $cells[1].textContent, - }, - }); - const $h3 = createTag('h3'); - $h3.innerHTML = `${i+1}. ${$cells[0].textContent}`; - $cells[1].prepend($h3); - $cells[1].classList.add('tip'); - $cells[0].remove(); + $rows.forEach(($row, i) => { + const $cells = Array.from($row.children); + schema.step.push({ + '@type': 'HowToStep', + position: i + 1, + name: $cells[0].textContent, + itemListElement: { + '@type': 'HowToDirection', + text: $cells[1].textContent, + }, }); - $schema.innerHTML = JSON.stringify(schema); - const $head = document.head; - $head.append($schema); -} \ No newline at end of file + const $h3 = createTag('h3'); + $h3.innerHTML = `${i + 1}. ${$cells[0].textContent}`; + $cells[1].prepend($h3); + $cells[1].classList.add('tip'); + $cells[0].remove(); + }); + $schema.innerHTML = JSON.stringify(schema); + const $head = document.head; + $head.append($schema); +} diff --git a/express/blocks/linked-image/linked-image.js b/express/blocks/linked-image/linked-image.js index f726649..72b6f7a 100644 --- a/express/blocks/linked-image/linked-image.js +++ b/express/blocks/linked-image/linked-image.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window */ +/* global */ export default function decorate($block) { const $a = $block.querySelector('a'); @@ -20,4 +20,4 @@ export default function decorate($block) { $parent.appendChild($a); $a.innerHTML = picture; $a.className = ''; -} \ No newline at end of file +} diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 046400f..b37a25a 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -9,13 +9,12 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window */ +/* global window fetch document */ import { - getLocale, - createTag, - } from '../../scripts/scripts.js'; - + getLocale, + createTag, +} from '../../scripts/scripts.js'; async function fetchBlueprint(pathname) { if (window.spark.$blueprint) { @@ -30,9 +29,8 @@ async function fetchBlueprint(pathname) { const $main = createTag('main'); $main.innerHTML = body; window.spark.$blueprint = $main; - console.log($main); return ($main); -} +} async function decorateTemplateList($block) { const rows = $block.children.length; @@ -46,16 +44,12 @@ async function decorateTemplateList($block) { $parent.appendChild($a); $a.innerHTML = picture; $a.className = ''; - - console.log($a); - }) + }); if (rows === 0 && locale !== 'en-US') { const tls = Array.from($block.closest('main').querySelectorAll('.template-list')); const i = tls.indexOf($block); - console.log(i); - // eslint-disable-next-line no-await-in-loop const $blueprint = await fetchBlueprint(window.location.pathname); @@ -67,7 +61,6 @@ async function decorateTemplateList($block) { const $heroPicture = document.querySelector('.hero-bg'); if (!$heroPicture && window.spark.$blueprint) { - console.log ('replace hero') const $bpHeroImage = window.spark.$blueprint.querySelector('div:first-of-type img'); if ($bpHeroImage) { const $heroSection = document.querySelector('main .hero'); @@ -87,5 +80,3 @@ async function decorateTemplateList($block) { export default function decorate($block) { decorateTemplateList($block); } - - \ No newline at end of file From b9688945dbe346d0fdfae3179b2d7a308b3a306e Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 3 Mar 2021 21:20:06 -0800 Subject: [PATCH 020/649] fix: add martech --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 61f18c1..33bee71 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -283,7 +283,7 @@ function postLCP() { const delay = usp.get('delay'); if (delay) ms = +delay; setTimeout(() => { - loadScript('/scripts/martech.js', null, 'module'); + loadScript(martechUrl, null, 'module'); }, ms); } decorateBlogPosts(); From a326d227205a9ededf75b6e4ee9d5af865113eda Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 3 Mar 2021 21:24:11 -0800 Subject: [PATCH 021/649] fix: add martech --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 33bee71..e5311d2 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -474,7 +474,7 @@ async function decorateTesting() { if (await checkTesting(window.location.href)) { // eslint-disable-next-line no-console console.log('rushing martech'); - loadScript('/scripts/martech.js', null, 'module'); + loadScript('/express/scripts/martech.js', null, 'module'); } if (!window.location.host.includes('adobe.com')) { From fb02c1740d050960332d1b9d9646aeb9cf84b9b3 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 3 Mar 2021 21:27:20 -0800 Subject: [PATCH 022/649] fix: add martech --- express/scripts/martech.js | 51 ++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index a5249fe..56cb3cc 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -30,28 +30,31 @@ function handleConsentSettings() { window.sprk_full_consent = false; } } -window.addEventListener('adobePrivacy:PrivacyConsent', handleConsentSettings); -window.addEventListener('adobePrivacy:PrivacyReject', handleConsentSettings); -window.addEventListener('adobePrivacy:PrivacyCustom', handleConsentSettings); -window.fedsConfig = window.fedsConfig || {}; -window.fedsConfig.privacy = window.fedsConfig.privacy || {}; -window.fedsConfig.privacy.otDomainId = '7a5eb705-95ed-4cc4-a11d-0cc5760e93db'; -window.fedsConfig.privacy.footerLinkSelector = '#openCookieModal'; -window.marketingtech = { - adobe: { - launch: { - property: 'global', - environment: 'production', - }, - analytics: { - additionalAccounts: 'adbemmarvelweb.prod', - }, - target: true, - }, -}; -window.targetGlobalSettings = { - bodyHidingEnabled: false, -}; -loadScript('https://www.adobe.com/marketingtech/main.min.js'); -loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); +export default function addMarTech() { + window.addEventListener('adobePrivacy:PrivacyConsent', handleConsentSettings); + window.addEventListener('adobePrivacy:PrivacyReject', handleConsentSettings); + window.addEventListener('adobePrivacy:PrivacyCustom', handleConsentSettings); + window.fedsConfig = window.fedsConfig || {}; + window.fedsConfig.privacy = window.fedsConfig.privacy || {}; + window.fedsConfig.privacy.otDomainId = '7a5eb705-95ed-4cc4-a11d-0cc5760e93db'; + window.fedsConfig.privacy.footerLinkSelector = '#openCookieModal'; + window.marketingtech = { + adobe: { + launch: { + property: 'global', + environment: 'production', + }, + analytics: { + additionalAccounts: 'adbemmarvelweb.prod', + }, + target: true, + }, + }; + window.targetGlobalSettings = { + bodyHidingEnabled: false, + }; + + loadScript('https://www.adobe.com/marketingtech/main.min.js'); + loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); +} From 9912370c1d587a8f9571198efebd3af76ed47d8e Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 3 Mar 2021 21:28:59 -0800 Subject: [PATCH 023/649] fix: add martech --- express/scripts/martech.js | 52 ++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 56cb3cc..5128018 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -11,7 +11,7 @@ */ /* global window */ -import loadScript from './scripts.js'; +import { loadScript } from './scripts.js'; function handleConsentSettings() { try { @@ -31,30 +31,28 @@ function handleConsentSettings() { } } -export default function addMarTech() { - window.addEventListener('adobePrivacy:PrivacyConsent', handleConsentSettings); - window.addEventListener('adobePrivacy:PrivacyReject', handleConsentSettings); - window.addEventListener('adobePrivacy:PrivacyCustom', handleConsentSettings); - window.fedsConfig = window.fedsConfig || {}; - window.fedsConfig.privacy = window.fedsConfig.privacy || {}; - window.fedsConfig.privacy.otDomainId = '7a5eb705-95ed-4cc4-a11d-0cc5760e93db'; - window.fedsConfig.privacy.footerLinkSelector = '#openCookieModal'; - window.marketingtech = { - adobe: { - launch: { - property: 'global', - environment: 'production', - }, - analytics: { - additionalAccounts: 'adbemmarvelweb.prod', - }, - target: true, +window.addEventListener('adobePrivacy:PrivacyConsent', handleConsentSettings); +window.addEventListener('adobePrivacy:PrivacyReject', handleConsentSettings); +window.addEventListener('adobePrivacy:PrivacyCustom', handleConsentSettings); +window.fedsConfig = window.fedsConfig || {}; +window.fedsConfig.privacy = window.fedsConfig.privacy || {}; +window.fedsConfig.privacy.otDomainId = '7a5eb705-95ed-4cc4-a11d-0cc5760e93db'; +window.fedsConfig.privacy.footerLinkSelector = '#openCookieModal'; +window.marketingtech = { + adobe: { + launch: { + property: 'global', + environment: 'production', }, - }; - window.targetGlobalSettings = { - bodyHidingEnabled: false, - }; - - loadScript('https://www.adobe.com/marketingtech/main.min.js'); - loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); -} + analytics: { + additionalAccounts: 'adbemmarvelweb.prod', + }, + target: true, + }, +}; +window.targetGlobalSettings = { + bodyHidingEnabled: false, +}; + +loadScript('https://www.adobe.com/marketingtech/main.min.js'); +loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); From c6321170eddc4a2dc916ec9312a932310b6d9604 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 4 Mar 2021 16:17:26 -0800 Subject: [PATCH 024/649] feat: seo page layout --- .../blocks/template-list/template-list.css | 62 ++++++++++++++++++- express/blocks/template-list/template-list.js | 3 +- express/styles/styles.css | 1 - 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 31274af..51ab02e 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -3,6 +3,35 @@ main .template-list { flex-wrap: wrap; justify-content: center; margin: 40px 0; + font-size: 16px; + font-weight: bold; + text-align: left; +} + +main .template-list a:any-link { + text-decoration: none; + color: #1473E6; + padding-left: 16px; + padding-top: 6px; + display: flex; +} + +main .template-list div > div:nth-child(2) a:any-link::after { + display: flex; + width: 6px; + height: 6px; + border-top-width: 0; + border-left-width: 0; + border-bottom-width: 2px; + border-right-width: 2px; + border-style: solid; + border-color: #1473E6; + transform-origin: 75% 75%; + transform: rotate( -45deg ); + content: ""; + margin-top: 5px; + margin-left: 5px; + margin-right: 2.25px; } main .template-list > div p { @@ -12,14 +41,41 @@ main .template-list > div p { main .template-list > div { display: flex; flex-direction: column; - width: 250px; - margin: 20px; + width: 300px; + margin: 32px; justify-content: flex-end; - border: 1px solid #ccc; +} + + +main .template-list > div img { + border-radius: 10px; + width: 300px; } main .template-list.large > div { width: 100%; margin: 0; border: 0; +} + +main .template-list.large > div img { + width: 100%; +} + + +@media (min-width: 600px) { + main .template-list > div { + width: 240px; + margin: 12px; + } + + main .template-list > div img { + width: 240px; + } +} + +@media (min-width: 900px) { + main .template-list-container > div { + max-width: 1000px; + } } \ No newline at end of file diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index b37a25a..6d2ca35 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -36,7 +36,8 @@ async function decorateTemplateList($block) { const rows = $block.children.length; const locale = getLocale(window.location); - $block.querySelectorAll('div > div:first-of-type a').forEach(($a) => { + $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { + console.log($a); const $parent = $a.closest('div'); $a.remove(); const picture = $parent.innerHTML; diff --git a/express/styles/styles.css b/express/styles/styles.css index 757987b..91267b2 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -49,7 +49,6 @@ header .mobile .hamburger::before { header { height: 98px; background-size: 1201px auto; - b_ackground-image: url(/express/gnav-placeholder/backdrop2.png); } header .mobile { From 60f7c0817c981ac02ef83249d4525f6a6f595bc7 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 4 Mar 2021 17:21:34 -0800 Subject: [PATCH 025/649] feat: pages filter update --- express/blocks/filter-pages/filter-pages.css | 70 +++++++++++++++ express/blocks/filter-pages/filter-pages.js | 94 ++++++++++++++++++++ express/scripts/scripts.js | 74 +-------------- express/styles/lazy-styles.css | 48 ---------- 4 files changed, 165 insertions(+), 121 deletions(-) create mode 100644 express/blocks/filter-pages/filter-pages.css create mode 100644 express/blocks/filter-pages/filter-pages.js diff --git a/express/blocks/filter-pages/filter-pages.css b/express/blocks/filter-pages/filter-pages.css new file mode 100644 index 0000000..0d2af76 --- /dev/null +++ b/express/blocks/filter-pages/filter-pages.css @@ -0,0 +1,70 @@ +main .filter-pages { + margin-top: 64px; + text-align: left; + } + + main .filter-pages-container > div { + max-width: 100%; + } + + + main .filter-pages .results { + display: flex; + flex-wrap: wrap; + justify-content: center; + } + + main .filter-pages .results .card { + display: flex; + flex-direction: column; + width: 240px; + margin: 16px; + } + + main .filter-pages .results .card img { + height: 240px; + width: 240px; + object-fit: cover; + object-position: center center; + border-radius: 10px; + } + + main .filter-pages .stats { + color: lightgrey; + padding: 10px 0; + font-size: 16px; + font-weight: bold; + } + + + main .filter-pages .results .card-body { + padding: 0 15px; + + } + + main .filter-pages .results .card-body h3 { + padding: 0; + margin: 0; + font-size: 16px; + color: #1473E6; + } + + main .filter-pages .results .card-body p { + font-size: 0.7em; + margin: 0; + text-align: left; + line-height: normal; + } + main .filter-pages .results .card-body p b { + background-color: lightsalmon; + } + + main .filter-pages input { + font-size: 30px; + border: none; + width: 100%; + border-bottom: 1px solid lightgray; + font-weight: 800; + font-family: adobe-clean; + } + \ No newline at end of file diff --git a/express/blocks/filter-pages/filter-pages.js b/express/blocks/filter-pages/filter-pages.js new file mode 100644 index 0000000..2c1bc72 --- /dev/null +++ b/express/blocks/filter-pages/filter-pages.js @@ -0,0 +1,94 @@ +/* + * Copyright 2021 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. + */ +/* global window fetch document */ + +import { + createTag, + readBlockConfig, +} from '../../scripts/scripts.js'; + +function filterMigratedPages(filter) { + const $results = document.getElementById('page-filter-results'); + const $stats = document.getElementById('page-filter-stats'); + $results.innerHTML = ''; + const index = window.fullIndex; + let counter = 0; + if (index) { + index.forEach((page) => { + if (page.path.includes(filter)) { + counter += 1; + let { path } = page; + if (!path.startsWith(' ')) path = path.substr(1); + path = path.replace('.html', ''); + let markedUpPath = path; + if (filter) markedUpPath = path.split(filter).join(`${filter}`); + const $card = createTag('div', { class: 'card' }); + $card.innerHTML = `
+ +
+
+

${page.title}

+

${markedUpPath}

+
`; + $card.addEventListener('click', () => { + window.location.href = path; + }); + $results.appendChild($card); + } + }); + } + $stats.innerHTML = `${counter} page${counter !== 1 ? 's' : ''} found`; +} + +async function fetchFullIndex(indices) { + const fullIndex = []; + + await Promise.all(indices.map(async (url) => { + if (url) { + const resp = await fetch(url); + const json = await resp.json(); + // eslint-disable-next-line no-console + console.log(`${url}: ${json.data.length}`); + fullIndex.push(...json.data.filter((e) => !!e.path)); + } + })); + fullIndex.forEach((e) => { + if (e.path.startsWith('/make') || e.path.startsWith('/templates')) { + e.path = ` ${e.path}`; + } + fullIndex.sort((e1, e2) => e1.path.localeCompare(e2.path)); + }); + return (fullIndex); +} + +async function decorateFilterPages($filterPages) { + const config = readBlockConfig($filterPages); + + $filterPages.innerHTML = ` +
+
`; + + const $pageFilter = document.getElementById('page-filter'); + $pageFilter.addEventListener('keyup', () => { + filterMigratedPages($pageFilter.value); + }); + + const indices = config.indices.split('.json').map((e) => (e ? `${e}.json` : undefined)); + + window.fullIndex = await fetchFullIndex(indices); + + filterMigratedPages($pageFilter.value); +} + +export default function decorate($block) { + decorateFilterPages($block); +} diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index e5311d2..c9b86ad 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -191,7 +191,7 @@ async function loadLazyFooter() { }); } -function readBlockConfig($block) { +export function readBlockConfig($block) { const config = {}; $block.querySelectorAll(':scope>div').forEach(($row) => { if ($row.children && $row.children[1]) { @@ -327,77 +327,6 @@ function decorateHero() { } } -async function fetchFullIndex(indices) { - const fullIndex = []; - - await Promise.all(indices.map(async (url) => { - if (url) { - const resp = await fetch(url); - const json = await resp.json(); - // eslint-disable-next-line no-console - console.log(`${url}: ${json.data.length}`); - json.data.sort((e1, e2) => e1.path.localeCompare(e2.path)); - fullIndex.push(...json.data.filter((e) => !!e.path)); - } - })); - return (fullIndex); -} - -function filterMigratedPages(filter) { - const $results = document.getElementById('page-filter-results'); - const $stats = document.getElementById('page-filter-stats'); - $results.innerHTML = ''; - const index = window.fullIndex; - let counter = 0; - if (index) { - index.forEach((page) => { - if (page.path.includes(filter)) { - counter += 1; - let { path } = page; - if (!path.startsWith('/')) path = `/${path}`; - path = path.replace('.html', ''); - let markedUpPath = path; - if (filter) markedUpPath = path.split(filter).join(`${filter}`); - const $card = createTag('div', { class: 'card' }); - $card.innerHTML = `
- -
-
-

${page.title}

-

${markedUpPath}

-
`; - $card.addEventListener('click', () => { - window.location.href = path; - }); - $results.appendChild($card); - } - }); - } - $stats.innerHTML = `${counter} page${counter !== 1 ? 's' : ''} found`; -} - -async function decorateMigratedPages() { - const $filterPages = document.querySelector('main .filter-pages'); - if ($filterPages) { - const config = readBlockConfig($filterPages); - - $filterPages.innerHTML = ` -
-
`; - - const $pageFilter = document.getElementById('page-filter'); - $pageFilter.addEventListener('keyup', () => { - filterMigratedPages($pageFilter.value); - }); - - const indices = config.indices.split('.json').map((e) => (e ? `${e}.json` : undefined)); - - window.fullIndex = await fetchFullIndex(indices); - - filterMigratedPages($pageFilter.value); - } -} - function decorateButtons() { document.querySelectorAll('main a').forEach(($a) => { const $up = $a.parentElement; @@ -789,7 +718,6 @@ async function decoratePage() { decorateHero(); decorateTemplate(); decorateButtons(); - decorateMigratedPages(); decorateBlogPage(); decorateTutorials(); decorateMetaData(); diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index 66046e9..337ac83 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -164,54 +164,6 @@ main .tutorials-container .results .tutorial-card-tags span { margin: 5px; } -main .filter-pages { - text-align: left; -} - -main .filter-pages .results { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -main .filter-pages .results .card { - display: flex; - flex-direction: column; - width: 217px; - margin: 10px; - background-color: #eee; -} - -main .filter-pages .results .card img { - height: 140px; - width: 100%; - object-fit: cover; - object-position: center center; -} - -main .filter-pages .stats { - color: grey; - padding: 10px 0; -} - - -main .filter-pages .results .card-body { - padding: 0 10px; - -} -main .filter-pages .results .card-body p { - font-size: 0.7em; -} -main .filter-pages .results .card-body p b { - background-color: lightsalmon; -} - -main .filter-pages input { - font-size: 30px; - border: none; - width: 100%; - border-bottom: 1px solid lightgray -} main video { max-width: 100%; From 75ed0511feebc6f259d72918d2f5ca62599738dc Mon Sep 17 00:00:00 2001 From: rofe Date: Fri, 5 Mar 2021 16:08:09 +0100 Subject: [PATCH 026/649] feat(styles): load template specific css --- express/scripts/scripts.js | 17 +++++++++++++++++ express/styles/blog.css | 0 express/styles/default.css | 0 express/styles/home.css | 0 express/styles/make.css | 0 5 files changed, 17 insertions(+) create mode 100644 express/styles/blog.css create mode 100644 express/styles/default.css create mode 100644 express/styles/home.css create mode 100644 express/styles/make.css diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index c9b86ad..e25f5fd 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -711,7 +711,24 @@ function decorateMetaData() { } } +function loadtemplateCSS() { + // todo: read from page metadata + const path = window.location.pathname; + let template = 'default'; + if (path.includes('/make/')) { + template = 'make'; + } else if (path.includes('/20')) { + tenplate = 'blog'; + } else if (path.endsWith('/') + || path.endsWith('/index.html') + || path.endsWith('/index')) { + template = 'home'; + } + loadCSS(`/express/styles/${template}.css`); +} + async function decoratePage() { + loadtemplateCSS(); await decorateTesting(); wrapSections('main>div'); decorateHeader(); diff --git a/express/styles/blog.css b/express/styles/blog.css new file mode 100644 index 0000000..e69de29 diff --git a/express/styles/default.css b/express/styles/default.css new file mode 100644 index 0000000..e69de29 diff --git a/express/styles/home.css b/express/styles/home.css new file mode 100644 index 0000000..e69de29 diff --git a/express/styles/make.css b/express/styles/make.css new file mode 100644 index 0000000..e69de29 From 51561f3e2be199dfb7637b28cc1e11e159b53bce Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 07:11:42 -0800 Subject: [PATCH 027/649] chore: test alternate font handling --- express/styles/lazy-styles.css | 54 +++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index 337ac83..78af90f 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -9,7 +9,59 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -@import "https://use.typekit.net/aaz7dvd.css"; + +/* fonts */ + + @font-face { + font-family:"adobe-clean"; + src:url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("woff2"),url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("woff"),url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("opentype"); + font-display:swap;font-style:normal;font-weight:400; + } + + @font-face { + font-family:"adobe-clean"; + src:url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff2"),url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff"),url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("opentype"); + font-display:swap;font-style:italic;font-weight:400; + } + + @font-face { + font-family:"adobe-clean"; + src:url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff2"),url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff"),url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("opentype"); + font-display:swap;font-style:normal;font-weight:700; + } + + @font-face { + font-family:"adobe-clean"; + src:url("https://use.typekit.net/af/37eaae/00000000000000003b9b3f83/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("woff2"),url("https://use.typekit.net/af/37eaae/00000000000000003b9b3f83/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("woff"),url("https://use.typekit.net/af/37eaae/00000000000000003b9b3f83/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("opentype"); + font-display:swap;font-style:normal;font-weight:300; + } + + @font-face { + font-family:"adobe-clean"; + src:url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff2"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("opentype"); + font-display:swap;font-style:normal;font-weight:900; + } + + @font-face { + font-family:"adobe-clean"; + src:url("https://use.typekit.net/af/a0c22f/00000000000000003b9b3f84/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i3&v=3") format("woff2"),url("https://use.typekit.net/af/a0c22f/00000000000000003b9b3f84/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i3&v=3") format("woff"),url("https://use.typekit.net/af/a0c22f/00000000000000003b9b3f84/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i3&v=3") format("opentype"); + font-display:swap;font-style:italic;font-weight:300; + } + + @font-face { + font-family:"adobe-clean-serif"; + src:url("https://use.typekit.net/af/e09494/00000000000000003b9aee45/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("woff2"),url("https://use.typekit.net/af/e09494/00000000000000003b9aee45/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("woff"),url("https://use.typekit.net/af/e09494/00000000000000003b9aee45/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("opentype"); + font-display:swap;font-style:normal;font-weight:400; + } + + @font-face { + font-family:"adobe-clean-serif"; + src:url("https://use.typekit.net/af/c8f445/00000000000000003b9aee47/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n5&v=3") format("woff2"),url("https://use.typekit.net/af/c8f445/00000000000000003b9aee47/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n5&v=3") format("woff"),url("https://use.typekit.net/af/c8f445/00000000000000003b9aee47/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n5&v=3") format("opentype"); + font-display:swap;font-style:normal;font-weight:500; + } + + .tk-adobe-clean { font-family: "adobe-clean",sans-serif; } + .tk-adobe-clean-serif { font-family: "adobe-clean-serif",sans-serif; } /* below the fold */ From 196159ed00cb5c2ca0d6b0989d7c09c5d69bc5ef Mon Sep 17 00:00:00 2001 From: rofe Date: Fri, 5 Mar 2021 17:17:37 +0100 Subject: [PATCH 028/649] feat(styles): set template as html class --- express/scripts/scripts.js | 8 ++++---- express/styles/blog.css | 0 express/styles/default.css | 0 express/styles/home.css | 0 express/styles/make.css | 0 5 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 express/styles/blog.css delete mode 100644 express/styles/default.css delete mode 100644 express/styles/home.css delete mode 100644 express/styles/make.css diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index e25f5fd..2f76bd8 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -711,8 +711,7 @@ function decorateMetaData() { } } -function loadtemplateCSS() { - // todo: read from page metadata +function setTemplate() { const path = window.location.pathname; let template = 'default'; if (path.includes('/make/')) { @@ -724,11 +723,12 @@ function loadtemplateCSS() { || path.endsWith('/index')) { template = 'home'; } - loadCSS(`/express/styles/${template}.css`); + // todo: read template from page metadata + document.documentElement.classList.add(template); } async function decoratePage() { - loadtemplateCSS(); + setTemplate(); await decorateTesting(); wrapSections('main>div'); decorateHeader(); diff --git a/express/styles/blog.css b/express/styles/blog.css deleted file mode 100644 index e69de29..0000000 diff --git a/express/styles/default.css b/express/styles/default.css deleted file mode 100644 index e69de29..0000000 diff --git a/express/styles/home.css b/express/styles/home.css deleted file mode 100644 index e69de29..0000000 diff --git a/express/styles/make.css b/express/styles/make.css deleted file mode 100644 index e69de29..0000000 From abba75eadfb4156a92b31f7d1f04d7d9ce65f355 Mon Sep 17 00:00:00 2001 From: rofe Date: Fri, 5 Mar 2021 17:24:11 +0100 Subject: [PATCH 029/649] chore: fix error and remove home --- express/scripts/scripts.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 2f76bd8..2c7ff6f 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -717,11 +717,7 @@ function setTemplate() { if (path.includes('/make/')) { template = 'make'; } else if (path.includes('/20')) { - tenplate = 'blog'; - } else if (path.endsWith('/') - || path.endsWith('/index.html') - || path.endsWith('/index')) { - template = 'home'; + template = 'blog'; } // todo: read template from page metadata document.documentElement.classList.add(template); From da7d4d988c6db37ad8284597f0d80a02bd5e1715 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 08:29:38 -0800 Subject: [PATCH 030/649] chore: fix linting --- .eslintrc.js | 2 +- express/blocks/filter-pages/filter-pages.js | 1 + express/blocks/how-to-steps/how-to-steps.js | 1 + express/blocks/template-list/template-list.js | 2 ++ 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.eslintrc.js b/.eslintrc.js index a4af3b1..35c693c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,9 +16,9 @@ module.exports = { rules: { // allow reassigning param 'no-param-reassign': [2, { props: false }], - allowImportExportEverywhere: true, }, parserOptions: { + allowImportExportEverywhere: true, sourceType: 'module', }, }; diff --git a/express/blocks/filter-pages/filter-pages.js b/express/blocks/filter-pages/filter-pages.js index 2c1bc72..3a7ad18 100644 --- a/express/blocks/filter-pages/filter-pages.js +++ b/express/blocks/filter-pages/filter-pages.js @@ -10,6 +10,7 @@ * governing permissions and limitations under the License. */ /* global window fetch document */ +/* eslint-disable import/named, import/extensions */ import { createTag, diff --git a/express/blocks/how-to-steps/how-to-steps.js b/express/blocks/how-to-steps/how-to-steps.js index 80d0737..b8f41a8 100644 --- a/express/blocks/how-to-steps/how-to-steps.js +++ b/express/blocks/how-to-steps/how-to-steps.js @@ -11,6 +11,7 @@ */ /* global document */ +/* eslint-disable import/named, import/extensions */ import { createTag, diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 6d2ca35..ea663c2 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -9,7 +9,9 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ + /* global window fetch document */ +/* eslint-disable import/named, import/extensions */ import { getLocale, From b569559c706f1eb8448b8da04c1b0ff212f207bf Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 09:55:05 -0800 Subject: [PATCH 031/649] feat: add masonry for larger template lists --- express/blocks/checker-board/checker-board.js | 1 + .../blocks/template-list/template-list.css | 22 ++++++++++++++++++- express/blocks/template-list/template-list.js | 10 ++++++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/express/blocks/checker-board/checker-board.js b/express/blocks/checker-board/checker-board.js index 1557c29..81ed92b 100644 --- a/express/blocks/checker-board/checker-board.js +++ b/express/blocks/checker-board/checker-board.js @@ -10,6 +10,7 @@ * governing permissions and limitations under the License. */ /* global window */ +/* eslint-disable import/named, import/extensions */ export default function decorateCheckerBoards($block) { const blobPrefix = 'https://hlx.blob.core.windows.net/external/'; diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 51ab02e..8c7f12c 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -44,6 +44,9 @@ main .template-list > div { width: 300px; margin: 32px; justify-content: flex-end; + -webkit-column-break-inside: avoid; + page-break-inside: avoid; + break-inside: avoid; } @@ -71,11 +74,28 @@ main .template-list.large > div img { main .template-list > div img { width: 240px; - } + } + + main .template-list.masonry { + display: block; + columns: 240px 2; + margin: auto; + column-gap: 32px; + width: 528px; + } + } @media (min-width: 900px) { main .template-list-container > div { max-width: 1000px; } + + main .template-list.masonry { + display: block; + columns: 240px 3; + margin: auto; + column-gap: 32px; + width: 792px; + } } \ No newline at end of file diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index ea663c2..fdd1435 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -35,11 +35,8 @@ async function fetchBlueprint(pathname) { } async function decorateTemplateList($block) { - const rows = $block.children.length; - const locale = getLocale(window.location); $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { - console.log($a); const $parent = $a.closest('div'); $a.remove(); const picture = $parent.innerHTML; @@ -49,6 +46,13 @@ async function decorateTemplateList($block) { $a.className = ''; }); + const rows = $block.children.length; + const locale = getLocale(window.location); + + if (rows > 6) { + $block.classList.add('masonry'); + } + if (rows === 0 && locale !== 'en-US') { const tls = Array.from($block.closest('main').querySelectorAll('.template-list')); const i = tls.indexOf($block); From a3f2964af5cb14bc970c7b0bc383f1c73373695e Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 10:23:15 -0800 Subject: [PATCH 032/649] fix: add h3 --- express/styles/styles.css | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 91267b2..cf90631 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -300,6 +300,16 @@ main .section-wrapper h2 { font-weight: 800; } +main .section-wrapper h3 { + font-size: 28px; + line-height: 32px; + margin: 0; + margin-top: 64px; + text-align: left; + font-weight: 800; +} + + main .section-wrapper h2:first-of-type { text-align: center; @@ -328,6 +338,13 @@ main .section-wrapper p.button-container { text-align: center; } + main .section-wrapper h2 { + font-size: 36px; + line-height: 40px; + margin-top: 64px; + text-align: center; + } + main .section-wrapper p { font-size: 18px; line-height: 22px; From afffd2082691518511a97ba5255c0778c1bce4f4 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 10:25:03 -0800 Subject: [PATCH 033/649] fix: add h3 --- express/styles/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index cf90631..136ef83 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -338,7 +338,7 @@ main .section-wrapper p.button-container { text-align: center; } - main .section-wrapper h2 { + main .section-wrapper h3 { font-size: 36px; line-height: 40px; margin-top: 64px; From 03da4e975d7f140801acc9355bdbb800a36d2682 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 10:30:22 -0800 Subject: [PATCH 034/649] chore: h3 fix for how-to-list --- express/blocks/how-to-steps/how-to-steps.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/how-to-steps/how-to-steps.css b/express/blocks/how-to-steps/how-to-steps.css index 2bcc2b0..dc243f8 100644 --- a/express/blocks/how-to-steps/how-to-steps.css +++ b/express/blocks/how-to-steps/how-to-steps.css @@ -13,6 +13,7 @@ main .how-to-steps > div { font-size: 28px; line-height: 32px; font-weight: 800; + text-align: left; } main .how-to-steps .number span { From e1f927e82969e6af2a81eea5be70dd144c1f29c0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 14:56:03 -0800 Subject: [PATCH 035/649] chore: minor cleanup --- express/blocks/filter-pages/filter-pages.css | 4 + express/blocks/template-list/template-list.js | 1 - express/scripts/filter.js | 58 ------------- express/styles/lazy-styles.css | 82 ------------------- express/styles/styles.css | 16 ---- 5 files changed, 4 insertions(+), 157 deletions(-) delete mode 100644 express/scripts/filter.js diff --git a/express/blocks/filter-pages/filter-pages.css b/express/blocks/filter-pages/filter-pages.css index 0d2af76..eb8faa0 100644 --- a/express/blocks/filter-pages/filter-pages.css +++ b/express/blocks/filter-pages/filter-pages.css @@ -47,6 +47,10 @@ main .filter-pages { margin: 0; font-size: 16px; color: #1473E6; + font-weight: 600; + text-align: left; + line-height: 1.1em; + margin-bottom: 3px; } main .filter-pages .results .card-body p { diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index fdd1435..d3974c9 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -35,7 +35,6 @@ async function fetchBlueprint(pathname) { } async function decorateTemplateList($block) { - $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { const $parent = $a.closest('div'); $a.remove(); diff --git a/express/scripts/filter.js b/express/scripts/filter.js deleted file mode 100644 index b2492ea..0000000 --- a/express/scripts/filter.js +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2021 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. - */ -/* global window, fetch */ - -async function fetchBlogIndex() { - const resp = await fetch('/blog-index.json'); - const json = await resp.json(); - return (json.data); -} - -async function filterBlogPosts(locale, filters) { - if (!window.blogIndex) { - window.blogIndex = await fetchBlogIndex(); - } - const index = window.blogIndex; - - const f = {}; - for (const name of Object.keys(filters)) { - const vals = filters[name]; - let v = vals; - if (!Array.isArray(vals)) { - v = [vals]; - } - // eslint-disable-next-line no-console - console.log(v); - f[name] = v.map((e) => e.toLowerCase().trim()); - } - - const result = index.filter((post) => { - let matchedAll = true; - for (const name of Object.keys(f)) { - let matched = false; - f[name].forEach((val) => { - if (post[name].toLowerCase().includes(val)) { - matched = true; - } - }); - if (!matched) { - matchedAll = false; - break; - } - } - return (matchedAll); - }); - - return (result); -} - -export { filterBlogPosts as default }; diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index 78af90f..a3320d6 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -290,85 +290,3 @@ main .blog-posts .card .card-body { main .blog-posts .card .card-body p { font-size: 1rem; } -/* blog page */ - -.blog-page main .section-wrapper:not(.hero) { - text-align: left; -} - -.blog-page main > .section-wrapper:not(.hero) > div { - background-color: white; - max-width: 900px; -} - -.blog-page main > .section-wrapper:not(.hero) { - background-color: #ddd; -} - -.blog-page main h2 { - font-size: 2.4rem; -} - -.blog-page main h3 { - font-size: 1.8rem; -} - - footer div.grey { - color: #82919b; - background-color: #35414c; - padding: 20px; - } - - footer div.grey p { - font-size: 0.9em; - } - - footer div.dark { - background-color: #242c33; - color: #fff; - text-align: center; - padding: 20px; -} - -footer > div > div { - max-width: 800px; - margin: auto; -} -footer div.grey a:any-link { - color: white; - text-decoration: none; -} - - footer div.dark a:any-link { - color: white; - text-decoration: none; - } - - footer div.dark ul { - list-style: none; - padding: 0 10px; - display: flex; - flex-wrap: wrap; - justify-content: center; - align-items: center; - font-size: 0.9em; - } - - footer div.dark ul li { - margin: 0; - padding: 0; - width: 250px; - padding: 5px; - } - @media (min-width: 600px) { - p, ul, ol { - font-size: 1.2rem; - } - } - -@media (min-width: 900px) { - p, ul, ol { - font-size: 1.4rem; - } - -} diff --git a/express/styles/styles.css b/express/styles/styles.css index 136ef83..cb85f4f 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -351,19 +351,3 @@ main .section-wrapper p.button-container { } } - - -/* blog page */ - -.blog-page main .byline { - font-size: 0.8em; - color: #888; -} - -.blog-page main .byline img { - height: 1em; - width: 1em; - display: inline-block; - margin-bottom: -3px; - opacity: 0.5; -} From e544f28d1afe1ec68114db981fa5e9cb729940de Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 16:30:47 -0800 Subject: [PATCH 036/649] feat: add blog skeleton --- express/blocks/blog-posts/blog-posts.css | 31 +++++++ express/blocks/blog-posts/blog-posts.js | 102 +++++++++++++++++++++++ express/scripts/scripts.js | 67 --------------- 3 files changed, 133 insertions(+), 67 deletions(-) create mode 100644 express/blocks/blog-posts/blog-posts.css create mode 100644 express/blocks/blog-posts/blog-posts.js diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css new file mode 100644 index 0000000..eddf188 --- /dev/null +++ b/express/blocks/blog-posts/blog-posts.css @@ -0,0 +1,31 @@ + +main .blog-posts .card { + display: flex; + flex-direction: column; + width: 290px; + margin: 10px; + text-align: left; + cursor: pointer; + } + main .blog-posts .card .card-image { + line-height: 0; + } + + main .blog-posts .card .card-image img { + height: 200px; + object-fit: cover; + width: 100%; + } + + main .blog-posts .card .card-body { + padding: 20px; + border: 1px solid lightgrey; + border-radius: 0 0 5px 5px; + border-top: none; + height: 300px; + } + + main .blog-posts .card .card-body p { + font-size: 1rem; + } + \ No newline at end of file diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js new file mode 100644 index 0000000..3cf5925 --- /dev/null +++ b/express/blocks/blog-posts/blog-posts.js @@ -0,0 +1,102 @@ +/* + * Copyright 2021 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. + */ +/* global window fetch document */ +/* eslint-disable import/named, import/extensions */ + +import { + createTag, + readBlockConfig, +} from '../../scripts/scripts.js'; + +async function fetchBlogIndex() { + const resp = await fetch('/blog-index.json'); + const json = await resp.json(); + return (json.data); +} + +async function filterBlogPosts(locale, filters) { + if (!window.blogIndex) { + window.blogIndex = await fetchBlogIndex(); + } + const index = window.blogIndex; + + const f = {}; + for (const name of Object.keys(filters)) { + const vals = filters[name]; + let v = vals; + if (!Array.isArray(vals)) { + v = [vals]; + } + // eslint-disable-next-line no-console + console.log(v); + f[name] = v.map((e) => e.toLowerCase().trim()); + } + + const result = index.filter((post) => { + let matchedAll = true; + for (const name of Object.keys(f)) { + let matched = false; + f[name].forEach((val) => { + if (post[name].toLowerCase().includes(val)) { + matched = true; + } + }); + if (!matched) { + matchedAll = false; + break; + } + } + return (matchedAll); + }); + + return (result); +} + +async function decorateBlogPosts($blogPosts) { + let posts = []; + + if ($blogPosts.querySelector('a')) { + /* handle links */ + + const links = []; + $blogPosts.querySelectorAll('a').forEach(($a) => { + links.push($a.href); + }); + + $blogPosts.innerHTML = ''; + + /* needs fixing to work with links */ + posts = await filterBlogPosts('en-US', { path: links }); + } else { + const config = readBlockConfig($blogPosts); + posts = await filterBlogPosts('en-US', config); + } + $blogPosts.innerHTML = ''; + posts.forEach((post) => { + const $card = createTag('div', { class: 'card' }); + $card.innerHTML = `
+ +
+
+

${post.title}

+

${post.teaser}

+
`; + $card.addEventListener('click', () => { + window.location.href = `/${post.path}`; + }); + $blogPosts.appendChild($card); + }); +} + +export default function decorate($block) { + decorateBlogPosts($block); +} diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 2c7ff6f..93c78be 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -206,72 +206,6 @@ export function readBlockConfig($block) { return config; } -async function fetchBlogIndex() { - const resp = await fetch('/blog-index.json'); - const json = await resp.json(); - return (json.data); -} - -async function filterBlogPosts(locale, filters) { - if (!window.blogIndex) { - window.blogIndex = await fetchBlogIndex(); - } - const index = window.blogIndex; - - const f = {}; - for (const name of Object.keys(filters)) { - const vals = filters[name]; - let v = vals; - if (!Array.isArray(vals)) { - v = [vals]; - } - // eslint-disable-next-line no-console - console.log(v); - f[name] = v.map((e) => e.toLowerCase().trim()); - } - - const result = index.filter((post) => { - let matchedAll = true; - for (const name of Object.keys(f)) { - let matched = false; - f[name].forEach((val) => { - if (post[name].toLowerCase().includes(val)) { - matched = true; - } - }); - if (!matched) { - matchedAll = false; - break; - } - } - return (matchedAll); - }); - - return (result); -} - -function decorateBlogPosts() { - document.querySelectorAll('main .blog-posts').forEach(async ($blogPosts) => { - const config = readBlockConfig($blogPosts); - const posts = await filterBlogPosts('en-US', config); - $blogPosts.innerHTML = ''; - posts.forEach((post) => { - const $card = createTag('div', { class: 'card' }); - $card.innerHTML = `
- -
-
-

${post.title}

-

${post.teaser}

-
`; - $card.addEventListener('click', () => { - window.location.href = `/${post.path}`; - }); - $blogPosts.appendChild($card); - }); - }); -} - function postLCP() { const martechUrl = '/express/scripts/martech.js'; loadCSS('/express/styles/lazy-styles.css'); @@ -286,7 +220,6 @@ function postLCP() { loadScript(martechUrl, null, 'module'); }, ms); } - decorateBlogPosts(); } function decorateHero() { From 863ba2cae834340491f1717687a6a1924d0afc56 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 5 Mar 2021 16:34:19 -0800 Subject: [PATCH 037/649] feat: add blog skeleton --- express/scripts/scripts.js | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 93c78be..010a371 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -297,26 +297,6 @@ function decorateLegacyLinks() { }); } -function decorateBlogPage() { - if (document.body.classList.contains('blog-page')) { - const $sections = document.querySelectorAll('main>div.section-wrapper>div'); - const $body = $sections[1]; - let $by; - let $postedOn; - $body.querySelectorAll('p').forEach(($p) => { - if (!$by && $p.textContent.toLowerCase().startsWith('by ')) $by = $p; - if (!$postedOn && $p.textContent.toLowerCase().startsWith('posted on ')) $postedOn = $p; - }); - const by = $by.textContent.substring(3); - const posted = $postedOn.textContent.substring(10).split('-'); - const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', - 'August', 'September', 'October', 'November', 'December']; - $by.innerHTML = ``; - $postedOn.remove(); - decorateLegacyLinks(); - } -} - async function checkTesting(url) { const pathname = new URL(url).pathname.split('.')[0]; const resp = await fetch('/testing.json'); @@ -664,7 +644,6 @@ async function decoratePage() { decorateHero(); decorateTemplate(); decorateButtons(); - decorateBlogPage(); decorateTutorials(); decorateMetaData(); decorateDoMoreEmbed(); From 4cf42a49d040e9cf9118875a71338c9757589759 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 9 Mar 2021 09:48:50 +0100 Subject: [PATCH 038/649] chore: linting --- tools/sidekick/plugins.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tools/sidekick/plugins.js b/tools/sidekick/plugins.js index 25a29d5..72934ae 100644 --- a/tools/sidekick/plugins.js +++ b/tools/sidekick/plugins.js @@ -1,3 +1,16 @@ +/* + * Copyright 2021 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. + */ +/* global window */ + // This file contains the spark-specific plugins for the sidekick. (() => { const sk = window.hlx && window.hlx.sidekick ? window.hlx.sidekick : window.hlxSidekick; @@ -7,14 +20,13 @@ sk.add({ id: 'templates', - condition: (sk) => sk.isEditor() && (sk.location.search.includes('.docx&') || sk.location.search.includes('doc.aspx?') || sk.location.search.includes('.md&')), + condition: (s) => s.isEditor() && (s.location.search.includes('.docx&') || s.location.search.includes('doc.aspx?') || s.location.search.includes('.md&')), button: { text: 'Templates', action: () => { - const { config, location } = sk; + const { config } = sk; window.open(`https://${config.host || config.innerHost}/tools/templates/picker.html`, 'hlx-sidekick-spark-templates'); }, }, }); - })(); From 5dd082df1a3501d87eeb49bfa5a8e4db9c359c87 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 9 Mar 2021 09:50:00 +0100 Subject: [PATCH 039/649] feat(card): pointer cursor --- express/blocks/filter-pages/filter-pages.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/filter-pages/filter-pages.css b/express/blocks/filter-pages/filter-pages.css index eb8faa0..1be1efb 100644 --- a/express/blocks/filter-pages/filter-pages.css +++ b/express/blocks/filter-pages/filter-pages.css @@ -19,6 +19,7 @@ main .filter-pages { flex-direction: column; width: 240px; margin: 16px; + cursor: pointer; } main .filter-pages .results .card img { From e286c4376c9c618849990fbc5c83c9b4a1a86e33 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 9 Mar 2021 10:10:06 +0100 Subject: [PATCH 040/649] chore: remove debug output --- express/scripts/scripts.js | 1 - 1 file changed, 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 010a371..dceec55 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -127,7 +127,6 @@ function decorateBlocks() { $block.classList.add('block'); import(`/express/blocks/${blockName}/${blockName}.js`) .then((mod) => { - console.log(blockName, mod); mod.default($block, blockName); }) .catch((err) => console.log('failed to load module', err)); From cabc6804bb11d445e63b901656733f5c8884f780 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 9 Mar 2021 14:55:21 +0100 Subject: [PATCH 041/649] chore(lint): linting clean up --- .eslintrc.js | 2 + express/blocks/animation/animation.js | 3 +- express/blocks/blog-posts/blog-posts.js | 2 +- express/scripts/martech.js | 2 +- express/scripts/scripts.js | 123 +- package-lock.json | 6298 +++++++---------------- package.json | 6 +- test/mocha/scripts.test.js | 27 + 8 files changed, 2008 insertions(+), 4455 deletions(-) create mode 100644 test/mocha/scripts.test.js diff --git a/.eslintrc.js b/.eslintrc.js index 35c693c..1c3d2ff 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -17,8 +17,10 @@ module.exports = { // allow reassigning param 'no-param-reassign': [2, { props: false }], }, + parser: '@babel/eslint-parser', parserOptions: { allowImportExportEverywhere: true, sourceType: 'module', + requireConfigFile: false, }, }; diff --git a/express/blocks/animation/animation.js b/express/blocks/animation/animation.js index 6039506..72becee 100644 --- a/express/blocks/animation/animation.js +++ b/express/blocks/animation/animation.js @@ -13,10 +13,9 @@ import { createTag, - loadCSS, } from '../../scripts/scripts'; -export default function decorate($block) { +export default function decorate() { document.querySelectorAll('.animation a[href], .video a[href]').forEach(($a) => { const href = $a.getAttribute('href'); const url = new URL(href); diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 3cf5925..9058381 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window fetch document */ +/* global window fetch */ /* eslint-disable import/named, import/extensions */ import { diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 5128018..97b26ba 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -11,7 +11,7 @@ */ /* global window */ -import { loadScript } from './scripts.js'; +import { loadScript } from './scripts'; function handleConsentSettings() { try { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index dceec55..7ab8731 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -10,6 +10,7 @@ * governing permissions and limitations under the License. */ /* global window, navigator, document, fetch */ +/* eslint-disable no-console */ function toClassName(name) { return (name.toLowerCase().replace(/[^0-9a-z]/gi, '-')); @@ -43,18 +44,18 @@ export function getLocale(url) { return 'en-US'; } -function addDivClasses($element, selector, classes) { - const $children = $element.querySelectorAll(selector); - $children.forEach(($div, i) => { - $div.classList.add(classes[i]); - }); -} +// function addDivClasses($element, selector, classes) { +// const $children = $element.querySelectorAll(selector); +// $children.forEach(($div, i) => { +// $div.classList.add(classes[i]); +// }); +// } function decorateHeader() { const $header = document.querySelector('header'); /* init header with placeholder */ - + $header.innerHTML = `
@@ -89,6 +90,23 @@ function decorateHeader() { `; } +/** + * Loads a CSS file. + * @param {string} href The path to the CSS file + */ +export function loadCSS(href) { + if (!document.querySelector(`head > link[href="${href}"]`)) { + const link = document.createElement('link'); + link.setAttribute('rel', 'stylesheet'); + link.setAttribute('href', href); + link.onload = () => { + }; + link.onerror = () => { + }; + document.head.appendChild(link); + } +} + function decorateDoMoreEmbed() { document.querySelectorAll('div.embed-internal-domore > div').forEach(($domore) => { const $ps = $domore.querySelectorAll(':scope>p'); @@ -135,23 +153,6 @@ function decorateBlocks() { }); } -/** - * Loads a CSS file. - * @param {string} href The path to the CSS file - */ -export function loadCSS(href) { - if (!document.querySelector(`head > link[href="${href}"]`)) { - const link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); - link.setAttribute('href', href); - link.onload = () => { - }; - link.onerror = () => { - }; - document.head.appendChild(link); - } -} - export function loadScript(url, callback, type) { const $head = document.querySelector('head'); const $script = createTag('script', { src: url }); @@ -162,33 +163,33 @@ export function loadScript(url, callback, type) { $script.onload = callback; } -async function loadLazyFooter() { - const resp = await fetch('/lazy-footer.plain.html'); - const inner = await resp.text(); - const $footer = document.querySelector('footer'); - $footer.innerHTML = inner; - $footer.querySelectorAll('a').forEach(($a) => { - const url = new URL($a.href); - if (url.hostname === 'spark.adobe.com') { - const slash = url.pathname.endsWith('/') ? 1 : 0; - $a.href = url.pathname.substr(0, url.pathname.length - slash); - } - }); - wrapSections('footer>div'); - addDivClasses($footer, 'footer > div', ['dark', 'grey', 'grey']); - const $div = createTag('div', { class: 'hidden' }); - const $dark = document.querySelector('footer .dark>div'); - - Array.from($dark.children).forEach(($e, i) => { - if (i) $div.append($e); - }); - - $dark.append($div); - - $dark.addEventListener('click', () => { - $div.classList.toggle('hidden'); - }); -} +// async function loadLazyFooter() { +// const resp = await fetch('/lazy-footer.plain.html'); +// const inner = await resp.text(); +// const $footer = document.querySelector('footer'); +// $footer.innerHTML = inner; +// $footer.querySelectorAll('a').forEach(($a) => { +// const url = new URL($a.href); +// if (url.hostname === 'spark.adobe.com') { +// const slash = url.pathname.endsWith('/') ? 1 : 0; +// $a.href = url.pathname.substr(0, url.pathname.length - slash); +// } +// }); +// wrapSections('footer>div'); +// addDivClasses($footer, 'footer > div', ['dark', 'grey', 'grey']); +// const $div = createTag('div', { class: 'hidden' }); +// const $dark = document.querySelector('footer .dark>div'); + +// Array.from($dark.children).forEach(($e, i) => { +// if (i) $div.append($e); +// }); + +// $dark.append($div); + +// $dark.addEventListener('click', () => { +// $div.classList.toggle('hidden'); +// }); +// } export function readBlockConfig($block) { const config = {}; @@ -209,7 +210,7 @@ function postLCP() { const martechUrl = '/express/scripts/martech.js'; loadCSS('/express/styles/lazy-styles.css'); decorateBlocks(); - //loadLazyFooter(); + // loadLazyFooter(); if (!(window.location.search === '?nomartech' || document.querySelector(`head script[src="${martechUrl}"]`))) { let ms = 2000; const usp = new URLSearchParams(window.location.search); @@ -271,7 +272,7 @@ function decorateButtons() { if ($up.childNodes.length === 1 && $up.tagName === 'STRONG' && $twoup.childNodes.length === 1 && $twoup.tagName === 'P') { $a.className = 'button primary'; - $twoUp.classList.add('button-container'); + $twoup.classList.add('button-container'); } } }); @@ -287,14 +288,14 @@ function decorateTemplate() { } } -function decorateLegacyLinks() { - const legacy = 'https://blog.adobespark.com/'; - document.querySelectorAll(`a[href^="${legacy}"]`).forEach(($a) => { - // eslint-disable-next-line no-console - console.log($a); - $a.href = $a.href.substring(0, $a.href.length - 1).substring(legacy.length - 1); - }); -} +// function decorateLegacyLinks() { +// const legacy = 'https://blog.adobespark.com/'; +// document.querySelectorAll(`a[href^="${legacy}"]`).forEach(($a) => { +// // eslint-disable-next-line no-console +// console.log($a); +// $a.href = $a.href.substring(0, $a.href.length - 1).substring(legacy.length - 1); +// }); +// } async function checkTesting(url) { const pathname = new URL(url).pathname.split('.')[0]; diff --git a/package-lock.json b/package-lock.json index 509ede3..e84ae20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4433 +1,275 @@ { "name": "@adobe/spark-website", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "@adobe/spark-website", - "version": "1.0.0", - "license": "Apache License 2.0", - "devDependencies": { - "@adobe/eslint-config-helix": "1.1.3", - "chai": "4.2.0", - "eslint": "^7.15.0", - "eslint-plugin-header": "3.1.0", - "eslint-plugin-import": "2.22.1", - "fs-extra": "9.0.1", - "karma": "5.2.3", - "karma-chai": "0.1.0", - "karma-chrome-launcher": "3.1.0", - "karma-mocha": "2.0.1", - "karma-mocha-reporter": "2.2.5", - "mocha": "8.2.1", - "puppeteer": "5.5.0", - "shelljs": "0.8.4" - } - }, - "node_modules/@adobe/eslint-config-helix": { - "version": "1.1.3", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "eslint-config-airbnb-base": "14.2.0" - }, - "engines": { - "node": ">= 8" - }, - "peerDependencies": { - "eslint": "^6.1.0 || ^7.0.0", - "eslint-plugin-header": "^3.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight": { - "version": "7.12.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "14.14.31", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.9.1", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "dev": true, - "license": "ISC" - }, - "node_modules/accepts": { - "version": "1.3.7", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/after": { - "version": "0.8.2", - "dev": true, - "license": "MIT" - }, - "node_modules/agent-base": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-includes": { - "version": "3.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.slice": { - "version": "0.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/backo2": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-arraybuffer": { - "version": "0.1.4", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blob": { - "version": "0.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "1.19.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "dev": true, - "license": "ISC" - }, - "node_modules/buffer": { - "version": "5.7.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/bytes": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/chai": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.1" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "dev": true, - "license": "ISC" - }, - "node_modules/cliui": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/colors": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/component-bind": { - "version": "1.0.0", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/component-inherit": { - "version": "0.0.3", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.10", - "dev": true, - "license": "MIT" - }, - "node_modules/connect": { - "version": "3.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/contains-path": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/content-type": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/custom-event": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/date-format": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/debug": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/define-properties": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.818844", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/di": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io": { - "version": "3.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/engine.io-client": { - "version": "3.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/engine.io-client/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/engine.io-parser": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/ent": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.18.0-next.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.1", - "object-inspect": "^1.9.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.3", - "string.prototype.trimstart": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "7.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "14.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "confusing-browser-globals": "^1.0.9", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", - "eslint-plugin-import": "^2.21.2" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-module-utils": { - "version": "2.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-plugin-header": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=7.7.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.22.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "dev": true, - "dependencies": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.13.2", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "9.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "12.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.6", - "dev": true, - "license": "ISC" - }, - "node_modules/growl": { - "version": "1.10.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.x" - } - }, - "node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-binary2": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "2.0.1" - } - }, - "node_modules/has-cors": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.8", - "dev": true, - "license": "ISC" - }, - "node_modules/http-errors": { - "version": "1.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "5", - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indexof": { - "version": "0.0.1", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/interpret": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/isbinaryfile": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/karma": { - "version": "5.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.4.2", - "colors": "^1.4.0", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.19", - "log4js": "^6.2.1", - "mime": "^2.4.5", - "minimatch": "^3.0.4", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^2.3.0", - "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "0.7.22", - "yargs": "^15.3.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/karma-chai": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "chai": "*", - "karma": ">=0.10.9" - } - }, - "node_modules/karma-chrome-launcher": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "which": "^1.2.1" - } - }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/karma-mocha": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.3" - } - }, - "node_modules/karma-mocha-reporter": { - "version": "2.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.1.0", - "log-symbols": "^2.1.0", - "strip-ansi": "^4.0.0" - }, - "peerDependencies": { - "karma": ">=0.13" - } - }, - "node_modules/karma-mocha-reporter/node_modules/ansi-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/karma-mocha-reporter/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/karma-mocha-reporter/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/karma-mocha-reporter/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/karma-mocha-reporter/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/karma-mocha-reporter/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/karma-mocha-reporter/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/karma-mocha-reporter/node_modules/strip-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/karma-mocha-reporter/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log4js": { - "version": "6.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/log4js/node_modules/flatted": { - "version": "2.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.46.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.29", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.46.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "dev": true, - "license": "MIT" - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha": { - "version": "8.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 10.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/chokidar": { - "version": "3.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/mocha/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/mocha/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/fsevents": { - "version": "2.1.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "3.14.0", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/log-symbols": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "13.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.1.12", - "dev": true, - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || >=13.7" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parseqs": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/parseuri": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/picomatch": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "5.5.0", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0", - "devtools-protocol": "0.0.818844", - "extract-zip": "^2.0.0", - "https-proxy-agent": "^4.0.0", - "node-fetch": "^2.6.1", - "pkg-dir": "^4.2.0", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^3.0.2", - "tar-fs": "^2.0.0", - "unbzip2-stream": "^1.3.3", - "ws": "^7.2.3" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/puppeteer/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/puppeteer/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qjobs": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.7.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regexpp": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.20.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/rfdc": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.3.4", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.4", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/socket.io": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "~4.1.0", - "engine.io": "~3.5.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.4.0", - "socket.io-parser": "~3.4.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/socket.io-client": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "engine.io-client": "~3.5.0", - "has-binary2": "~1.0.2", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "socket.io-parser": "~3.3.0", - "to-array": "0.1.4" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/socket.io-client/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/socket.io-client/node_modules/socket.io-parser": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "component-emitter": "~1.3.0", - "debug": "~3.1.0", - "isarray": "2.0.1" - } - }, - "node_modules/socket.io-parser": { - "version": "3.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" - } - }, - "node_modules/socket.io-parser/node_modules/component-emitter": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.7", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/streamroller": { - "version": "2.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/streamroller/node_modules/date-format": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/streamroller/node_modules/fs-extra": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/streamroller/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.6" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/streamroller/node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table": { - "version": "5.4.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-array": { - "version": "0.1.4", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.22", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/universalify": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/void-elements": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerpool": { - "version": "6.0.2", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "7.4.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "1.5.5", + "dependencies": { + "@adobe/eslint-config-helix": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@adobe/eslint-config-helix/-/eslint-config-helix-1.1.3.tgz", + "integrity": "sha512-APXGcaDHmZwRcx6tUiWYFkHlBGRc8o5ZaA8ke0XY+nb/+XyblQJI9lHJ6A+YQXPf1S6n7Uj1vimKDV/WyKUDJw==", "dev": true, - "engines": { - "node": ">=0.4.0" + "requires": { + "eslint-config-airbnb-base": "14.2.0" } }, - "node_modules/y18n": { - "version": "4.0.1", + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "license": "ISC" + "requires": { + "@babel/highlight": "^7.12.13" + } }, - "node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" + "@babel/compat-data": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.8.tgz", + "integrity": "sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog==", + "dev": true }, - "node_modules/yargs": { - "version": "15.4.1", + "@babel/core": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", + "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.10", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.10", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^6.3.0", + "source-map": "^0.5.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "dev": true, - "license": "ISC", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", + "@babel/eslint-parser": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.13.10.tgz", + "integrity": "sha512-/I1HQ3jGPhIpeBFeI3wO9WwWOnBYpuR0pX0KlkdGcRQAVX9prB/FCS2HBpL7BiFbzhny1YCiBH8MTZD2jJa7Hg==", "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "requires": { + "eslint-scope": "5.1.0", + "eslint-visitor-keys": "^1.3.0", + "semver": "^6.3.0" }, - "engines": { - "node": ">=10" + "dependencies": { + "eslint-scope": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", + "@babel/helper-compilation-targets": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", + "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "node_modules/yargs/node_modules/locate-path": { - "version": "5.0.0", + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "requires": { + "@babel/types": "^7.12.13" } }, - "node_modules/yargs/node_modules/p-locate": { - "version": "4.1.0", + "@babel/helper-member-expression-to-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz", + "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==", "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "requires": { + "@babel/types": "^7.13.0" } }, - "node_modules/yargs/node_modules/p-try": { - "version": "2.2.0", + "@babel/helper-module-imports": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "requires": { + "@babel/types": "^7.12.13" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.0", + "@babel/helper-module-transforms": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz", + "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==", "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0", + "lodash": "^4.17.19" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "requires": { + "@babel/types": "^7.12.13" } }, - "node_modules/yauzl": { - "version": "2.10.0", + "@babel/helper-replace-supers": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz", + "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==", "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, - "node_modules/yeast": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@adobe/eslint-config-helix": { - "version": "1.1.3", + "@babel/helper-simple-access": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", "dev": true, "requires": { - "eslint-config-airbnb-base": "14.2.0" + "@babel/types": "^7.12.13" } }, - "@babel/code-frame": { + "@babel/helper-split-export-declaration": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", "dev": true }, + "@babel/helpers": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, "@babel/highlight": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -4437,6 +279,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -4444,6 +288,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -4453,6 +299,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -4460,18 +308,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -4479,8 +335,63 @@ } } }, + "@babel/parser": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.10.tgz", + "integrity": "sha512-0s7Mlrw9uTWkYua7xWr99Wpk2bnGa0ANleKfksYAES8LpWH4gW1OUr42vqKNf0us5UQNfru2wPqMqRITzq/SIQ==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", + "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.0", + "@babel/types": "^7.13.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz", + "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, "@eslint/eslintrc": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -4497,15 +408,21 @@ }, "@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", "dev": true }, "@types/node": { "version": "14.14.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz", + "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==", "dev": true, "optional": true }, "@types/yauzl": { "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", "dev": true, "optional": true, "requires": { @@ -4514,10 +431,20 @@ }, "@ungap/promise-all-settled": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", "dev": true }, "accepts": { "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "dev": true, "requires": { "mime-types": "~2.1.24", @@ -4526,23 +453,48 @@ }, "acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, "acorn-jsx": { "version": "5.3.1", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true }, "after": { "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "dev": true }, "agent-base": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", "dev": true }, "ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -4553,14 +505,20 @@ }, "ansi-colors": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, "ansi-regex": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" @@ -4568,6 +526,8 @@ }, "anymatch": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -4576,6 +536,8 @@ }, "argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" @@ -4583,6 +545,8 @@ }, "array-includes": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -4594,6 +558,8 @@ }, "array.prototype.flat": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { "call-bind": "^1.0.0", @@ -4603,46 +569,110 @@ }, "arraybuffer.slice": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assertion-error": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "astral-regex": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "backo2": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "dev": true }, "balanced-match": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "base64-arraybuffer": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, "base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "base64id": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "binary-extensions": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "requires": { "buffer": "^5.5.0", @@ -4652,10 +682,14 @@ }, "blob": { "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, "body-parser": { "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { "bytes": "3.1.0", @@ -4672,6 +706,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -4679,12 +715,16 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -4693,17 +733,42 @@ }, "braces": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browser-stdout": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, "buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -4712,14 +777,20 @@ }, "buffer-crc32": { "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, "bytes": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, "call-bind": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -4728,14 +799,32 @@ }, "callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001197", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001197.tgz", + "integrity": "sha512-8aE+sqBqtXz4G8g35Eg/XEaFr2N7rd/VQ6eABGBmNtcB8cN6qNJhMi6oSFy4UWWZgqgL3filHT8Nha4meu3tsw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "chai": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { "assertion-error": "^1.1.0", @@ -4748,6 +837,8 @@ }, "chalk": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4756,10 +847,14 @@ }, "check-error": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, "chokidar": { "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -4774,10 +869,14 @@ }, "chownr": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -4787,14 +886,20 @@ "dependencies": { "emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -4806,6 +911,8 @@ }, "color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" @@ -4813,34 +920,65 @@ }, "color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, "colors": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "component-bind": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", "dev": true }, "component-emitter": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, "component-inherit": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", "dev": true }, "concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "confusing-browser-globals": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz", + "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==", "dev": true }, "connect": { "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "requires": { "debug": "2.6.9", @@ -4851,6 +989,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -4858,41 +998,123 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "contains-path": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, "content-type": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, "cookie": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" } }, - "custom-event": { - "version": "1.0.1", - "dev": true - }, "date-format": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", "dev": true }, "debug": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -4900,10 +1122,20 @@ }, "decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", "dev": true }, "deep-eql": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -4911,33 +1143,53 @@ }, "deep-is": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "define-properties": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, "depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, "devtools-protocol": { "version": "0.0.818844", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz", + "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==", "dev": true }, "di": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, "diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" @@ -4945,6 +1197,8 @@ }, "dom-serialize": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { "custom-event": "~1.0.0", @@ -4953,20 +1207,61 @@ "void-elements": "^2.0.0" } }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.683", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.683.tgz", + "integrity": "sha512-8mFfiAesXdEdE0DhkMKO7W9U6VU/9T3VTWwZ+4g84/YMP4kgwgFtQgUxuu7FUMcvSeKSNhFQNU+WZ68BQTLT5A==", "dev": true }, "emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "encodeurl": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, "end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -4974,6 +1269,8 @@ }, "engine.io": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -4986,6 +1283,8 @@ "dependencies": { "debug": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -4995,6 +1294,8 @@ }, "engine.io-client": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", + "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", "dev": true, "requires": { "component-emitter": "~1.3.0", @@ -5012,6 +1313,8 @@ "dependencies": { "debug": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -5019,12 +1322,16 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "engine.io-parser": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", "dev": true, "requires": { "after": "0.8.2", @@ -5036,6 +1343,8 @@ }, "enquirer": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { "ansi-colors": "^4.1.1" @@ -5043,10 +1352,14 @@ }, "ent": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, "error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" @@ -5054,6 +1367,8 @@ }, "es-abstract": { "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -5074,6 +1389,8 @@ }, "es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -5081,16 +1398,88 @@ "is-symbol": "^1.0.2" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, "escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, "escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "eslint": { "version": "7.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz", + "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5134,6 +1523,8 @@ }, "eslint-config-airbnb-base": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", + "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", "dev": true, "requires": { "confusing-browser-globals": "^1.0.9", @@ -5143,6 +1534,8 @@ }, "eslint-import-resolver-node": { "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, "requires": { "debug": "^2.6.9", @@ -5151,6 +1544,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5158,12 +1553,16 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "eslint-module-utils": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "dev": true, "requires": { "debug": "^2.6.9", @@ -5172,6 +1571,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5179,17 +1580,22 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "eslint-plugin-header": { "version": "3.1.0", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.0.tgz", + "integrity": "sha512-jKKcwMsB0/ftBv3UVmuQir1f8AmXzTS9rdzPkileW8/Nz9ivdea8vOU1ZrMbX+WH6CpwnHEo3403baSHk40Mag==", + "dev": true }, "eslint-plugin-import": { "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -5209,6 +1615,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5216,6 +1624,8 @@ }, "doctrine": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { "esutils": "^2.0.2", @@ -5224,16 +1634,22 @@ }, "isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -5242,6 +1658,8 @@ }, "eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" @@ -5249,16 +1667,22 @@ "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "eslint-visitor-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", "dev": true }, "espree": { "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", @@ -5268,16 +1692,22 @@ "dependencies": { "eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -5285,12 +1715,16 @@ "dependencies": { "estraverse": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } }, "esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" @@ -5298,28 +1732,40 @@ "dependencies": { "estraverse": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } }, "estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "eventemitter3": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extract-zip": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "requires": { "@types/yauzl": "^2.9.1", @@ -5328,20 +1774,34 @@ "yauzl": "^2.10.0" } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "fd-slicer": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", "dev": true, "requires": { "pend": "~1.2.0" @@ -5349,6 +1809,8 @@ }, "file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { "flat-cache": "^3.0.4" @@ -5356,6 +1818,8 @@ }, "fill-range": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -5363,6 +1827,8 @@ }, "finalhandler": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", @@ -5376,6 +1842,8 @@ "dependencies": { "debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -5383,12 +1851,16 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { "locate-path": "^6.0.0", @@ -5397,10 +1869,14 @@ }, "flat": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, "flat-cache": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { "flatted": "^3.1.0", @@ -5409,18 +1885,43 @@ }, "flatted": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "follow-redirects": { "version": "1.13.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.2.tgz", + "integrity": "sha512-6mPTgLxYm3r6Bkkg0vNM0HTjfGrOEtsfbhagQvbxDEsEkpNhw582upBaoRZylzen6krEmxXJgt9Ju6HiI4O7BA==", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "fs-constants": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, "fs-extra": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -5431,31 +1932,51 @@ }, "fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "functional-red-black-tree": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-func-name": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, "get-intrinsic": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -5465,13 +1986,26 @@ }, "get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "requires": { "pump": "^3.0.0" } }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -5484,6 +2018,8 @@ }, "glob-parent": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -5491,6 +2027,8 @@ }, "globals": { "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" @@ -5498,14 +2036,36 @@ }, "graceful-fs": { "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "growl": { "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" @@ -5513,6 +2073,8 @@ }, "has-binary2": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "dev": true, "requires": { "isarray": "2.0.1" @@ -5520,26 +2082,47 @@ }, "has-cors": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", "dev": true }, "has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-symbols": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "he": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "hosted-git-info": { "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, "http-errors": { "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "dev": true, "requires": { "depd": "~1.1.2", @@ -5551,12 +2134,16 @@ "dependencies": { "inherits": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true } } }, "http-proxy": { "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { "eventemitter3": "^4.0.0", @@ -5564,8 +2151,21 @@ "requires-port": "^1.0.0" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "https-proxy-agent": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { "agent-base": "5", @@ -5574,6 +2174,8 @@ }, "iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -5581,14 +2183,20 @@ }, "ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "ignore": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -5597,14 +2205,20 @@ }, "imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "indexof": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, "inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -5613,18 +2227,26 @@ }, "inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "requires": { "binary-extensions": "^2.0.0" @@ -5632,10 +2254,14 @@ }, "is-callable": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-core-module": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -5643,18 +2269,26 @@ }, "is-date-object": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, "is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-glob": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -5662,18 +2296,32 @@ }, "is-negative-zero": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", "dev": true }, "is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-plain-obj": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", "dev": true }, "is-regex": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -5682,49 +2330,153 @@ }, "is-string": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", "dev": true }, "is-symbol": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { "has-symbols": "^1.0.1" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "isarray": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true }, "isbinaryfile": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", "dev": true }, "isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.5.0.tgz", + "integrity": "sha512-QxZH0nmDTnTTVI0YDm4RUlaUPl5dcyn62G5TMDNfMmTW+J1u1v9gCR8WR+WZ6UghAa7nKJjDOFaI00eMMWvJFQ==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.0.5", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.9", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.4.4", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz", + "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==", + "dev": true + }, + "ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "json5": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -5732,6 +2484,8 @@ }, "jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", @@ -5740,12 +2494,28 @@ "dependencies": { "universalify": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "karma": { "version": "5.2.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", + "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", "dev": true, "requires": { "body-parser": "^1.19.0", @@ -5775,11 +2545,14 @@ }, "karma-chai": { "version": "0.1.0", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=", + "dev": true }, "karma-chrome-launcher": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", "dev": true, "requires": { "which": "^1.2.1" @@ -5787,6 +2560,8 @@ "dependencies": { "which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -5796,6 +2571,8 @@ }, "karma-mocha": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", "dev": true, "requires": { "minimist": "^1.2.3" @@ -5803,6 +2580,8 @@ }, "karma-mocha-reporter": { "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", + "integrity": "sha1-FRIAlejtgZGG5HoLAS8810GJVWA=", "dev": true, "requires": { "chalk": "^2.1.0", @@ -5812,10 +2591,14 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -5823,6 +2606,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -5832,6 +2617,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -5839,18 +2626,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -5858,6 +2653,8 @@ }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -5867,6 +2664,8 @@ }, "levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { "prelude-ls": "^1.2.1", @@ -5875,6 +2674,8 @@ }, "load-json-file": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -5885,6 +2686,8 @@ }, "locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { "p-locate": "^5.0.0" @@ -5892,10 +2695,20 @@ }, "lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, "log-symbols": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { "chalk": "^2.0.1" @@ -5903,6 +2716,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -5910,6 +2725,8 @@ }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -5919,6 +2736,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -5926,18 +2745,26 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -5947,6 +2774,8 @@ }, "log4js": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", "dev": true, "requires": { "date-format": "^3.0.0", @@ -5958,12 +2787,16 @@ "dependencies": { "flatted": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true } } }, "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -5971,18 +2804,26 @@ }, "media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, "mime": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true }, "mime-db": { "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", "dev": true }, "mime-types": { "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", "dev": true, "requires": { "mime-db": "1.46.0" @@ -5990,6 +2831,8 @@ }, "minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -5997,14 +2840,20 @@ }, "minimist": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mkdirp-classic": { "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, "mocha": { "version": "8.2.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", @@ -6036,10 +2885,14 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -6047,6 +2900,8 @@ }, "chokidar": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "dev": true, "requires": { "anymatch": "~3.1.1", @@ -6061,6 +2916,8 @@ }, "cliui": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", @@ -6070,6 +2927,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -6077,10 +2936,14 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "debug": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { "ms": "2.1.2" @@ -6088,11 +2951,15 @@ }, "fsevents": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, "js-yaml": { "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -6101,6 +2968,8 @@ }, "locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -6109,6 +2978,8 @@ }, "log-symbols": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { "chalk": "^4.0.0" @@ -6116,6 +2987,8 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -6123,6 +2996,8 @@ }, "p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -6130,14 +3005,20 @@ }, "p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -6145,6 +3026,8 @@ }, "wrap-ansi": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -6154,6 +3037,8 @@ }, "yargs": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -6170,6 +3055,8 @@ "dependencies": { "find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -6181,26 +3068,44 @@ }, "ms": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "nanoid": { "version": "3.1.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", "dev": true }, "natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "negotiator": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", "dev": true }, "node-fetch": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "dev": true + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", "dev": true }, "normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -6211,24 +3116,46 @@ "dependencies": { "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-inspect": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", "dev": true }, "object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { "call-bind": "^1.0.0", @@ -6239,6 +3166,8 @@ }, "object.entries": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz", + "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==", "dev": true, "requires": { "call-bind": "^1.0.0", @@ -6249,6 +3178,8 @@ }, "object.values": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", "dev": true, "requires": { "call-bind": "^1.0.0", @@ -6259,6 +3190,8 @@ }, "on-finished": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { "ee-first": "1.1.1" @@ -6266,6 +3199,8 @@ }, "once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -6273,6 +3208,8 @@ }, "optionator": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { "deep-is": "^0.1.3", @@ -6285,6 +3222,8 @@ }, "p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" @@ -6292,6 +3231,8 @@ }, "p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { "p-limit": "^3.0.2" @@ -6299,10 +3240,14 @@ }, "p-try": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" @@ -6310,41 +3255,65 @@ }, "parse-json": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { "error-ex": "^1.2.0" } }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "parseqs": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", "dev": true }, "parseuri": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", "dev": true }, "parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, "path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { "pify": "^2.0.0" @@ -6352,22 +3321,38 @@ }, "pathval": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, "pend": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "picomatch": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pkg-dir": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { "find-up": "^2.1.0" @@ -6375,6 +3360,8 @@ "dependencies": { "find-up": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" @@ -6382,6 +3369,8 @@ }, "locate-path": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", @@ -6390,6 +3379,8 @@ }, "p-limit": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" @@ -6397,6 +3388,8 @@ }, "p-locate": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" @@ -6404,24 +3397,40 @@ }, "path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -6430,10 +3439,14 @@ }, "punycode": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "puppeteer": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz", + "integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==", "dev": true, "requires": { "debug": "^4.1.0", @@ -6452,6 +3465,8 @@ "dependencies": { "find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -6460,6 +3475,8 @@ }, "locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -6467,6 +3484,8 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -6474,6 +3493,8 @@ }, "p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -6481,10 +3502,14 @@ }, "p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" @@ -6494,14 +3519,20 @@ }, "qjobs": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true }, "qs": { "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", "dev": true }, "randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -6509,10 +3540,14 @@ }, "range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true }, "raw-body": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "dev": true, "requires": { "bytes": "3.1.0", @@ -6523,6 +3558,8 @@ }, "read-pkg": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { "load-json-file": "^2.0.0", @@ -6532,6 +3569,8 @@ }, "read-pkg-up": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { "find-up": "^2.0.0", @@ -6540,6 +3579,8 @@ "dependencies": { "find-up": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" @@ -6547,6 +3588,8 @@ }, "locate-path": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", @@ -6555,6 +3598,8 @@ }, "p-limit": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" @@ -6562,6 +3607,8 @@ }, "p-locate": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" @@ -6569,12 +3616,16 @@ }, "path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true } } }, "readable-stream": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -6584,6 +3635,8 @@ }, "readdirp": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -6591,6 +3644,8 @@ }, "rechoir": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { "resolve": "^1.1.6" @@ -6598,22 +3653,110 @@ }, "regexpp": { "version": "3.1.0", - "dev": true + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } }, "require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "requires-port": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, "resolve": { "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { "is-core-module": "^2.2.0", @@ -6622,14 +3765,20 @@ }, "resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "rfdc": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.2.0.tgz", + "integrity": "sha512-ijLyszTMmUrXvjSooucVQwimGUk84eRcmCuLV8Xghe3UO85mjUtRAHRyoMM6XtyqbECaXuBWx18La3523sXINA==", "dev": true }, "rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -6637,14 +3786,29 @@ }, "safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "semver": { "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -6652,6 +3816,8 @@ }, "serialize-javascript": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -6659,14 +3825,20 @@ }, "set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "setprototypeof": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "dev": true }, "shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -6674,10 +3846,14 @@ }, "shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shelljs": { "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", "dev": true, "requires": { "glob": "^7.0.0", @@ -6687,6 +3863,8 @@ }, "slice-ansi": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -6696,6 +3874,8 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -6703,6 +3883,8 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -6710,12 +3892,16 @@ }, "color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true } } }, "socket.io": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", + "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", "dev": true, "requires": { "debug": "~4.1.0", @@ -6728,6 +3914,8 @@ "dependencies": { "debug": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -6737,10 +3925,14 @@ }, "socket.io-adapter": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", "dev": true }, "socket.io-client": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", "dev": true, "requires": { "backo2": "1.0.2", @@ -6758,6 +3950,8 @@ "dependencies": { "debug": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -6765,10 +3959,14 @@ }, "ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "socket.io-parser": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", "dev": true, "requires": { "component-emitter": "~1.3.0", @@ -6780,6 +3978,8 @@ }, "socket.io-parser": { "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "dev": true, "requires": { "component-emitter": "1.2.1", @@ -6789,10 +3989,14 @@ "dependencies": { "component-emitter": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, "debug": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" @@ -6802,10 +4006,14 @@ }, "source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "spdx-correct": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -6814,10 +4022,14 @@ }, "spdx-exceptions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -6826,18 +4038,49 @@ }, "spdx-license-ids": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, "streamroller": { "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", "dev": true, "requires": { "date-format": "^2.1.0", @@ -6847,10 +4090,14 @@ "dependencies": { "date-format": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", "dev": true }, "fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { "graceful-fs": "^4.2.0", @@ -6860,6 +4107,8 @@ }, "jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { "graceful-fs": "^4.1.6" @@ -6867,19 +4116,16 @@ }, "universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true } } }, - "string_decoder": { - "version": "1.3.0", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -6889,10 +4135,14 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -6902,6 +4152,8 @@ }, "string.prototype.trimend": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", "dev": true, "requires": { "call-bind": "^1.0.0", @@ -6910,14 +4162,27 @@ }, "string.prototype.trimstart": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "strip-ansi": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" @@ -6925,21 +4190,35 @@ }, "strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "table": { "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -6950,6 +4229,8 @@ }, "tar-fs": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", "dev": true, "requires": { "chownr": "^1.1.1", @@ -6960,6 +4241,8 @@ }, "tar-stream": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "requires": { "bl": "^4.0.3", @@ -6971,14 +4254,20 @@ }, "text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "tmp": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { "rimraf": "^3.0.0" @@ -6986,10 +4275,20 @@ }, "to-array": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -6997,10 +4296,42 @@ }, "toidentifier": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "dependencies": { + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, "tsconfig-paths": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", "dev": true, "requires": { "@types/json5": "^0.0.29", @@ -7009,8 +4340,25 @@ "strip-bom": "^3.0.0" } }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" @@ -7018,14 +4366,20 @@ }, "type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "requires": { "media-typer": "0.3.0", @@ -7034,10 +4388,14 @@ }, "ua-parser-js": { "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", "dev": true }, "unbzip2-stream": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, "requires": { "buffer": "^5.2.1", @@ -7046,14 +4404,20 @@ }, "universalify": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, "unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, "uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -7061,30 +4425,109 @@ }, "util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "utils-merge": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "v8-compile-cache": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "void-elements": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, + "whatwg-url": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + } + }, "which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -7092,10 +4535,14 @@ }, "which-module": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { "string-width": "^1.0.2 || 2" @@ -7103,10 +4550,14 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -7115,6 +4566,8 @@ }, "strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -7124,14 +4577,20 @@ }, "word-wrap": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "workerpool": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", + "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", "dev": true }, "wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -7141,14 +4600,20 @@ "dependencies": { "emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -7160,27 +4625,50 @@ }, "wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "ws": { "version": "7.4.3", - "dev": true, - "requires": {} + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", + "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==", + "dev": true + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true }, "xmlhttprequest-ssl": { "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true }, "y18n": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -7198,10 +4686,14 @@ "dependencies": { "emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -7210,10 +4702,14 @@ }, "is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -7221,6 +4717,8 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -7228,6 +4726,8 @@ }, "p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -7235,10 +4735,14 @@ }, "p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "string-width": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { "emoji-regex": "^8.0.0", @@ -7248,6 +4752,8 @@ }, "yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -7258,6 +4764,8 @@ }, "yargs-parser": { "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -7266,6 +4774,8 @@ }, "yargs-unparser": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, "requires": { "camelcase": "^6.0.0", @@ -7276,16 +4786,22 @@ "dependencies": { "camelcase": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "decamelize": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true } } }, "yauzl": { "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "requires": { "buffer-crc32": "~0.2.3", @@ -7294,10 +4810,14 @@ }, "yeast": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", "dev": true }, "yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true } } diff --git a/package.json b/package.json index 8f693f2..92ad9a4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "Adobe Spark Website", "scripts": { "test": "karma start karma.config.js", - "integration-test": "mocha integration/*.test.js" + "integration-test": "mocha integration/*.test.js", + "lint": "eslint ." }, "repository": { "type": "git", @@ -18,11 +19,14 @@ "homepage": "https://github.com/adobe/spark-website#readme", "devDependencies": { "@adobe/eslint-config-helix": "1.1.3", + "@babel/core": "7.13.10", + "@babel/eslint-parser": "7.13.10", "chai": "4.2.0", "eslint": "^7.15.0", "eslint-plugin-header": "3.1.0", "eslint-plugin-import": "2.22.1", "fs-extra": "9.0.1", + "jsdom": "16.5.0", "karma": "5.2.3", "karma-chai": "0.1.0", "karma-chrome-launcher": "3.1.0", diff --git a/test/mocha/scripts.test.js b/test/mocha/scripts.test.js new file mode 100644 index 0000000..8437746 --- /dev/null +++ b/test/mocha/scripts.test.js @@ -0,0 +1,27 @@ +/* + * Copyright 2021 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. + */ +/* eslint-env mocha */ +import { JSDOM } from 'jsdom'; +import { readBlockConfig } from '../../express/scripts/scripts'; + +describe('scripts#readBlockConfig', () => { + it('readBlockConfig', () => { + const dom = JSDOM.fragment( + '', + ); + + readBlockConfig(dom.window.document); + + // eslint-disable-next-line no-console + console.log(dom.window.document.body.innerHTML); + }); +}); From e5a98642a4ac624842edfd740e6f72c62fdd89c8 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 9 Mar 2021 16:18:53 -0800 Subject: [PATCH 042/649] chore: add blog heading and h4 --- express/scripts/scripts.js | 2 +- express/styles/styles.css | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 7ab8731..1e22f45 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -629,7 +629,7 @@ function setTemplate() { let template = 'default'; if (path.includes('/make/')) { template = 'make'; - } else if (path.includes('/20')) { + } else if (path.includes('/20') || path.includes('/blog/')) { template = 'blog'; } // todo: read template from page metadata diff --git a/express/styles/styles.css b/express/styles/styles.css index cb85f4f..481b87c 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -309,7 +309,14 @@ main .section-wrapper h3 { font-weight: 800; } - +main .section-wrapper h4 { + font-size: 22px; + line-height: 26px; + margin: 0; + margin-top: 56px; + text-align: left; + font-weight: 800; +} main .section-wrapper h2:first-of-type { text-align: center; @@ -345,9 +352,29 @@ main .section-wrapper p.button-container { text-align: center; } + main .section-wrapper h4 { + font-size: 28px; + line-height: 32px; + margin-top: 56px; + text-align: center; + } + + main .section-wrapper p { font-size: 18px; line-height: 22px; } } + + +.blog main .section-wrapper h3 { + font-size: 36px; + line-height: 40px; + margin-top: 64px; + text-align: left; +} + +.blog main .section-wrapper h4 { + text-align: left; +} From 423d697fe2e049742ca806eb19223b5f1bc70295 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 9 Mar 2021 17:22:59 -0800 Subject: [PATCH 043/649] feat: add toc block --- .../table-of-contents/table-of-contents.css | 21 ++++++++++ .../table-of-contents/table-of-contents.js | 40 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 express/blocks/table-of-contents/table-of-contents.css create mode 100644 express/blocks/table-of-contents/table-of-contents.js diff --git a/express/blocks/table-of-contents/table-of-contents.css b/express/blocks/table-of-contents/table-of-contents.css new file mode 100644 index 0000000..6c54e37 --- /dev/null +++ b/express/blocks/table-of-contents/table-of-contents.css @@ -0,0 +1,21 @@ + +main .table-of-contents { + margin-top: 32px; +} + +main .table-of-contents .toc { + text-align: left; +} + +main .table-of-contents .toc .toc-level-h2 { + margin: 8px; +} + +main .table-of-contents .toc .toc-level-h3 { + margin: 4px; + padding-left: 20px; +} + +main .table-of-contents .toc .toc-level-h4 { + padding-left: 40px; +} \ No newline at end of file diff --git a/express/blocks/table-of-contents/table-of-contents.js b/express/blocks/table-of-contents/table-of-contents.js new file mode 100644 index 0000000..74f3e4e --- /dev/null +++ b/express/blocks/table-of-contents/table-of-contents.js @@ -0,0 +1,40 @@ +/* + * Copyright 2021 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. + */ +/* global window fetch document */ +/* eslint-disable import/named, import/extensions */ + +import { + createTag, + readBlockConfig, + } from '../../scripts/scripts.js'; + + export default function decorate($block) { + const config = readBlockConfig($block); + const $headings = document.querySelectorAll('main h2, main h3, main h4, main .table-of-contents'); + let skip = true; + const $toc = createTag('div', { class: 'toc' }); + $headings.forEach(($h) => { + if (!skip && $h.tagName.startsWith('H')) { + const hLevel = +$h.tagName.substring(1); + if (hLevel <= +config.levels+1) { + const $entry = createTag('div', {class: `toc-entry toc-level-h${hLevel}` }); + $entry.innerHTML = `${$h.innerHTML}` + $toc.appendChild($entry); + } + } + if ($h === $block) skip = false; + }) + $block.innerHTML = ''; + $block.appendChild($toc); + } + + \ No newline at end of file From 58a3a8831d507eb74211e00c97da0b14b28c0365 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 10 Mar 2021 18:11:32 +0100 Subject: [PATCH 044/649] fix(testing): catch error and express context path (#14) --- express/scripts/scripts.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 1e22f45..2bc0be6 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -299,14 +299,17 @@ function decorateTemplate() { async function checkTesting(url) { const pathname = new URL(url).pathname.split('.')[0]; - const resp = await fetch('/testing.json'); - const json = await resp.json(); - const matches = json.data.filter((test) => { - const testPath = new URL(test['Test URLs']).pathname.split('.')[0]; - return testPath === pathname; - }); + const resp = await fetch('/express/testing.json'); + if (resp.ok) { + const json = await resp.json(); + const matches = json.data.filter((test) => { + const testPath = new URL(test['Test URLs']).pathname.split('.')[0]; + return testPath === pathname; + }); + return (!!matches.length); + } - return (!!matches.length); + return false; } async function decorateTesting() { From d9e900eb4ff341dc4c35275ba6647875e3032d6f Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 10 Mar 2021 18:11:53 +0100 Subject: [PATCH 045/649] chore(lint): fix linting (#15) --- .eslintrc.js | 3 ++ express/blocks/animation/animation.js | 2 +- .../table-of-contents/table-of-contents.js | 50 +++++++++---------- express/scripts/martech.js | 2 +- test/mocha/scripts.test.js | 2 +- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 1c3d2ff..93f94ed 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,6 +16,9 @@ module.exports = { rules: { // allow reassigning param 'no-param-reassign': [2, { props: false }], + 'import/extensions': ['error', { + js: 'always', + }], }, parser: '@babel/eslint-parser', parserOptions: { diff --git a/express/blocks/animation/animation.js b/express/blocks/animation/animation.js index 72becee..c9fde33 100644 --- a/express/blocks/animation/animation.js +++ b/express/blocks/animation/animation.js @@ -13,7 +13,7 @@ import { createTag, -} from '../../scripts/scripts'; +} from '../../scripts/scripts.js'; export default function decorate() { document.querySelectorAll('.animation a[href], .video a[href]').forEach(($a) => { diff --git a/express/blocks/table-of-contents/table-of-contents.js b/express/blocks/table-of-contents/table-of-contents.js index 74f3e4e..f06a471 100644 --- a/express/blocks/table-of-contents/table-of-contents.js +++ b/express/blocks/table-of-contents/table-of-contents.js @@ -9,32 +9,30 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window fetch document */ +/* global document */ /* eslint-disable import/named, import/extensions */ import { - createTag, - readBlockConfig, - } from '../../scripts/scripts.js'; - - export default function decorate($block) { - const config = readBlockConfig($block); - const $headings = document.querySelectorAll('main h2, main h3, main h4, main .table-of-contents'); - let skip = true; - const $toc = createTag('div', { class: 'toc' }); - $headings.forEach(($h) => { - if (!skip && $h.tagName.startsWith('H')) { - const hLevel = +$h.tagName.substring(1); - if (hLevel <= +config.levels+1) { - const $entry = createTag('div', {class: `toc-entry toc-level-h${hLevel}` }); - $entry.innerHTML = `${$h.innerHTML}` - $toc.appendChild($entry); - } - } - if ($h === $block) skip = false; - }) - $block.innerHTML = ''; - $block.appendChild($toc); - } - - \ No newline at end of file + createTag, + readBlockConfig, +} from '../../scripts/scripts.js'; + +export default function decorate($block) { + const config = readBlockConfig($block); + const $headings = document.querySelectorAll('main h2, main h3, main h4, main .table-of-contents'); + let skip = true; + const $toc = createTag('div', { class: 'toc' }); + $headings.forEach(($h) => { + if (!skip && $h.tagName.startsWith('H')) { + const hLevel = +$h.tagName.substring(1); + if (hLevel <= +config.levels + 1) { + const $entry = createTag('div', { class: `toc-entry toc-level-h${hLevel}` }); + $entry.innerHTML = `${$h.innerHTML}`; + $toc.appendChild($entry); + } + } + if ($h === $block) skip = false; + }); + $block.innerHTML = ''; + $block.appendChild($toc); +} diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 97b26ba..5128018 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -11,7 +11,7 @@ */ /* global window */ -import { loadScript } from './scripts'; +import { loadScript } from './scripts.js'; function handleConsentSettings() { try { diff --git a/test/mocha/scripts.test.js b/test/mocha/scripts.test.js index 8437746..2715437 100644 --- a/test/mocha/scripts.test.js +++ b/test/mocha/scripts.test.js @@ -11,7 +11,7 @@ */ /* eslint-env mocha */ import { JSDOM } from 'jsdom'; -import { readBlockConfig } from '../../express/scripts/scripts'; +import { readBlockConfig } from '../../express/scripts/scripts.js'; describe('scripts#readBlockConfig', () => { it('readBlockConfig', () => { From cdf3f5d273a82d0afe7a5adc410a439ac18d488b Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 10 Mar 2021 10:59:41 -0800 Subject: [PATCH 046/649] feat: try CLS suppression --- express/scripts/scripts.js | 1 + express/styles/styles.css | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 2bc0be6..1023194 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -650,6 +650,7 @@ async function decoratePage() { decorateTutorials(); decorateMetaData(); decorateDoMoreEmbed(); + document.body.classList.add('appear'); } window.spark = {}; diff --git a/express/styles/styles.css b/express/styles/styles.css index 481b87c..95fc678 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -2,6 +2,11 @@ body { font-family: 'adobe-clean', 'Adobe Clean'; margin: 0; padding: 0; + display: none; +} + +body.appear { + display: block; } /* gnav placeholder */ From 117f3cf6e63285dfbb2102d9e87c5b762a4bb0ab Mon Sep 17 00:00:00 2001 From: Raphael Wegmueller Date: Wed, 10 Mar 2021 20:24:30 +0100 Subject: [PATCH 047/649] chore: switch to main branch --- .github/workflows/purge-code.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/purge-code.yaml b/.github/workflows/purge-code.yaml index 14a57bd..4668298 100644 --- a/.github/workflows/purge-code.yaml +++ b/.github/workflows/purge-code.yaml @@ -1,7 +1,7 @@ on: push: branches: - - master + - main jobs: ci_trigger: From 114a6d7bc0ffbeb72d8e83b577687b73f72b871f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 10 Mar 2021 17:42:34 -0800 Subject: [PATCH 048/649] feat: resize update --- express/blocks/columns/columns.css | 4 +++ express/blocks/columns/columns.js | 17 ++++++++++++ express/blocks/steps/steps.css | 42 ++++++++++++++++++++++++++++++ express/blocks/steps/steps.js | 22 ++++++++++++++++ express/scripts/scripts.js | 40 ++++++++++++++++------------ express/styles/lazy-styles.css | 40 ---------------------------- express/styles/styles.css | 18 ++++++++----- 7 files changed, 121 insertions(+), 62 deletions(-) create mode 100644 express/blocks/columns/columns.css create mode 100644 express/blocks/columns/columns.js create mode 100644 express/blocks/steps/steps.css create mode 100644 express/blocks/steps/steps.js diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css new file mode 100644 index 0000000..0b11bec --- /dev/null +++ b/express/blocks/columns/columns.css @@ -0,0 +1,4 @@ +main .columns > div { + display: flex; + flex-direction: column; +} \ No newline at end of file diff --git a/express/blocks/columns/columns.js b/express/blocks/columns/columns.js new file mode 100644 index 0000000..1d0d458 --- /dev/null +++ b/express/blocks/columns/columns.js @@ -0,0 +1,17 @@ +/* + * Copyright 2021 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. + */ +/* global */ + +export default function decorate($block) { + const numRows = $block.children.length; + return (numRows); +} diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css new file mode 100644 index 0000000..5757e44 --- /dev/null +++ b/express/blocks/steps/steps.css @@ -0,0 +1,42 @@ +main .steps { + margin-top: 56px; + text-align: left; + margin-bottom: 120px; +} + +main .steps h3 { + font-size: 22px; + line-height: 26px; + margin-top: 0; +} + +main .steps p { + font-size: 18px; + line-height: 22px; + margin: 0; + text-align: left; +} + +main .steps > div { + display: flex; + margin: 16px 0; + padding: 12px; + border-radius: 12px; + background-color: #292929; +} + +main .steps .step-image { + width: 32px; + margin-right: 8px; +} + +main .steps .step-description { + width: 100%; +} + +main .steps-dark-container { + background-color: black; + padding: 1px 0; + color: white; + margin: 120px 0; +} diff --git a/express/blocks/steps/steps.js b/express/blocks/steps/steps.js new file mode 100644 index 0000000..ee057cb --- /dev/null +++ b/express/blocks/steps/steps.js @@ -0,0 +1,22 @@ +/* + * Copyright 2021 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. + */ +/* global */ + +export default function decorate($block) { + const $rows = Array.from($block.children); + const classNames = ['step-image', 'step-description']; + $rows.forEach(($row) => { + classNames.forEach((className, i) => { + $row.children[i].className = className; + }); + }); +} diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 1023194..52eae1e 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -133,7 +133,7 @@ function decorateBlocks() { if ($section) { $section.classList.add(`${blockName}-container`); } - const blocksWithOptions = ['checker-board', 'template-list']; + const blocksWithOptions = ['checker-board', 'template-list', 'steps']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { const options = blockName.substring(b.length + 1).split('-'); @@ -224,10 +224,11 @@ function postLCP() { function decorateHero() { const $h1 = document.querySelector('main h1'); - const $heroPicture = $h1.parentElement.querySelector('picture'); - let $heroSection; + // check if h1 is inside a block - if ($h1) { + if ($h1 && !$h1.closest('.section-wrapper > div > div ')) { + const $heroPicture = $h1.parentElement.querySelector('picture'); + let $heroSection; const $main = document.querySelector('main'); if ($main.children.length === 1) { $heroSection = createTag('div', { class: 'hero' }); @@ -243,20 +244,11 @@ function decorateHero() { $heroSection.classList.add('hero'); $heroSection.classList.remove('section-wrapper'); } - } - if ($heroPicture) { - $heroPicture.classList.add('hero-bg'); - const $heroImage = $heroPicture.querySelector('img'); - if ($heroImage.complete) { - postLCP(); + if ($heroPicture) { + $heroPicture.classList.add('hero-bg'); } else { - $heroImage.addEventListener('load', () => { - postLCP(); - }); + $heroSection.classList.add('hero-noimage'); } - } else { - $heroSection.classList.add('hero-noimage'); - postLCP(); } } @@ -639,6 +631,21 @@ function setTemplate() { document.documentElement.classList.add(template); } +function setLCPTrigger() { + const $lcpCandidate = document.querySelector('main img'); + if ($lcpCandidate) { + if ($lcpCandidate.complete) { + postLCP(); + } else { + $lcpCandidate.addEventListener('load', () => { + postLCP(); + }); + } + } else { + postLCP(); + } +} + async function decoratePage() { setTemplate(); await decorateTesting(); @@ -650,6 +657,7 @@ async function decoratePage() { decorateTutorials(); decorateMetaData(); decorateDoMoreEmbed(); + setLCPTrigger(); document.body.classList.add('appear'); } diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index a3320d6..bdbf6fb 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -221,46 +221,6 @@ main video { max-width: 100%; } -main .steps-container { - background-color: #eee; -} - -main .steps { - display: flex; - flex-direction: column; - justify-content: center; - max-width: 600px; - margin: auto; -} - -main .steps > div { - display: flex; - text-align: left; - align-items: center; -} - -main .embed-internal-domore h2::after { - content: ' \25BC'; -} - -main .embed-internal-domore h2.open::after { - content: ' \25B2'; -} - -main .embed-internal-domore .actions { - display: none; - justify-content: center; -} - -main .embed-internal-domore .actions > p { - margin: 2px 0; -} - -main .embed-internal-domore .actions.open { - display: flex; - flex-wrap: wrap; -} - main .blog-posts .card { display: flex; flex-direction: column; diff --git a/express/styles/styles.css b/express/styles/styles.css index 95fc678..bd9cc76 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -296,6 +296,14 @@ main .section-wrapper > div { padding: 0 32px; } +main .section-wrapper h1 { + font-size: 45px; + line-height: 49px; + margin: 0; + margin-top: 64px; + font-weight: 800; +} + main .section-wrapper h2 { font-size: 36px; line-height: 40px; @@ -323,8 +331,10 @@ main .section-wrapper h4 { font-weight: 800; } -main .section-wrapper h2:first-of-type { - text-align: center; +main .section-wrapper h5 { + font-size: 22px; + line-height: 26px; + font-weight: bold; } main .section-wrapper p { @@ -334,10 +344,6 @@ main .section-wrapper p { text-align: left; } -main .section-wrapper p:first-of-type { - text-align: center; -} - main .section-wrapper p.button-container { text-align: center; } From 3211678f7871100df7f48f9d9fbf3f36d7653987 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 10 Mar 2021 21:16:49 -0800 Subject: [PATCH 049/649] feat: resize design update --- express/blocks/columns/columns.css | 7 ++ express/blocks/layouts/layouts.css | 100 +++++++++++++++++++ express/blocks/layouts/layouts.js | 57 +++++++++++ express/blocks/steps/steps.css | 13 +++ express/blocks/steps/steps.js | 12 +-- express/icons.svg | 153 +++++++++++++++++++++++++++++ express/scripts/scripts.js | 9 ++ 7 files changed, 344 insertions(+), 7 deletions(-) create mode 100644 express/blocks/layouts/layouts.css create mode 100644 express/blocks/layouts/layouts.js create mode 100644 express/icons.svg diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 0b11bec..2110bd2 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -1,4 +1,11 @@ main .columns > div { display: flex; flex-direction: column; + align-items: center; +} + +@media (min-width:900px) { + main .columns > div { + flex-direction: row; + } } \ No newline at end of file diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css new file mode 100644 index 0000000..2e0e6a0 --- /dev/null +++ b/express/blocks/layouts/layouts.css @@ -0,0 +1,100 @@ +main .layouts { + padding-top: 64px; +} + +main .layouts div:first-of-type { + margin-top: 0; +} + +main .layouts .layout { + height: 0; + overflow: hidden; + background: white; + position: relative; + border: 2px dashed #D9D9D9; + border-radius: 10px; + margin: 32px auto; + cursor: pointer; + background-color: #F4F4F4; + width: 311px; + -webkit-column-break-inside: avoid; + page-break-inside: avoid; + break-inside: avoid; + } + +main .layouts .layout-inside { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + padding: 16px; + box-sizing: border-box; + display: flex; + align-items: stretch; + justify-content: center; + } + +main .layouts .layout:hover { + border-color: #1473E6; +} + +main .layouts .layout-icon { + font-size: 36px; + font-weight: 800; + color: #484848; + position: absolute; + top: 50%; + transform: translateY(-50%); + margin: auto; + left: 0; + right: 0; +} + +main .layouts .layout-icon svg { + height: 38px; + width: 38px; + fill: #484848; +} + +main .layouts .layout-description { + color: #1473E6; + position: absolute; + bottom: 0px; + left: 0; + right: 0; +} + +main .layouts .layout-content { + position: relative; + width: 100%; + height: 100%; +} + +@media (min-width:600px) { + main .layouts .layout { + width: 250px; + } + + main .layouts { + display: block; + columns: 240px 2; + margin: auto; + column-gap: 32px; + width: 528px; + } +} + +@media (min-width:900px) { + main .layouts .layout { + width: 240px; + } + + main .layouts { + display: block; + columns: 240px 3; + margin: auto; + column-gap: 32px; + width: 792px; + } +} diff --git a/express/blocks/layouts/layouts.js b/express/blocks/layouts/layouts.js new file mode 100644 index 0000000..e343f46 --- /dev/null +++ b/express/blocks/layouts/layouts.js @@ -0,0 +1,57 @@ +/* + * Copyright 2021 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. + */ +/* global window */ + +import { + createTag, +} from '../../scripts/scripts.js'; + + +export default function decorate($block) { + const $layouts = Array.from($block.children); + const layouts = []; + $layouts.forEach($layout => { + const row = Array.from($layout.children).map($e => $e.textContent); + const layout = { + name: row[0], + res: row[1], + icon: row[2], + link: row[3], + }; + const sep = layout.res.includes(':') ? ':' : 'x'; + const ratios = layout.res.split(sep).map((e) => +e); + if (ratios[1]) layout.ratio = ratios[1] / ratios[0]; + layouts.push(layout); + }); + $block.innerHTML = ''; + const knownIcons = ["instagram", "youtube", "facebook", "twitter"]; + layouts.forEach((layout) => { + const $layout = createTag('div', { class: 'layout', style: `padding-top: ${layout.ratio * 100}%` }); + let iconString = layout.icon; + if (knownIcons.includes(iconString)) { + iconString = ` + + `; + } + $layout.innerHTML = `
+
+
${iconString}
+
${layout.name} - ${layout.res}
+
+
`; + $layout.addEventListener('click', () => { + window.location.href = layout.link; + }); + $block.append($layout); + console.log($layout); + }); +} diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 5757e44..e37266c 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -8,6 +8,7 @@ main .steps h3 { font-size: 22px; line-height: 26px; margin-top: 0; + text-align: left; } main .steps p { @@ -40,3 +41,15 @@ main .steps-dark-container { color: white; margin: 120px 0; } + +@media (min-width:900px) { + main .steps { + display: flex; + } + + main .steps > div { + display: flex; + margin: 0 16px; + width: 30%; + } +} \ No newline at end of file diff --git a/express/blocks/steps/steps.js b/express/blocks/steps/steps.js index ee057cb..95f14c7 100644 --- a/express/blocks/steps/steps.js +++ b/express/blocks/steps/steps.js @@ -11,12 +11,10 @@ */ /* global */ +import { + addBlockClasses, +} from '../../scripts/scripts.js'; + export default function decorate($block) { - const $rows = Array.from($block.children); - const classNames = ['step-image', 'step-description']; - $rows.forEach(($row) => { - classNames.forEach((className, i) => { - $row.children[i].className = className; - }); - }); + addBlockClasses($block, ['step-image', 'step-description']); } diff --git a/express/icons.svg b/express/icons.svg new file mode 100644 index 0000000..7bfaf7c --- /dev/null +++ b/express/icons.svg @@ -0,0 +1,153 @@ + + + + + Adobe + Adobe Logo + + + + + + + Adobe + Adobe Logo + + + + + + + Facebook + Facebook Logo + + + + + Instagram + Instagram Logo + + + + + Pinterest + Pinterest Logo + + + + + LinkedIn + LinkedIn Logo + + + + + Twitter + Twitter Logo + + + + + YouTube + YouTube Logo + + + + + Discord + Discord Logo + + + + + + Behance + Behance Logo + + + + + + + + + + + Menu + Hamburger Menu + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 52eae1e..3928125 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -44,6 +44,15 @@ export function getLocale(url) { return 'en-US'; } +export function addBlockClasses($block, classNames) { + const $rows = Array.from($block.children); + $rows.forEach(($row) => { + classNames.forEach((className, i) => { + $row.children[i].className = className; + }); + }); +} + // function addDivClasses($element, selector, classes) { // const $children = $element.querySelectorAll(selector); // $children.forEach(($div, i) => { From ba2400d0b00a6f0949d93e8cc9069110cd0cf672 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 10 Mar 2021 21:24:15 -0800 Subject: [PATCH 050/649] chore: linting --- express/blocks/layouts/layouts.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/express/blocks/layouts/layouts.js b/express/blocks/layouts/layouts.js index e343f46..288bbb4 100644 --- a/express/blocks/layouts/layouts.js +++ b/express/blocks/layouts/layouts.js @@ -15,12 +15,11 @@ import { createTag, } from '../../scripts/scripts.js'; - export default function decorate($block) { const $layouts = Array.from($block.children); const layouts = []; - $layouts.forEach($layout => { - const row = Array.from($layout.children).map($e => $e.textContent); + $layouts.forEach(($layout) => { + const row = Array.from($layout.children).map(($e) => $e.textContent); const layout = { name: row[0], res: row[1], @@ -33,7 +32,7 @@ export default function decorate($block) { layouts.push(layout); }); $block.innerHTML = ''; - const knownIcons = ["instagram", "youtube", "facebook", "twitter"]; + const knownIcons = ['instagram', 'youtube', 'facebook', 'twitter']; layouts.forEach((layout) => { const $layout = createTag('div', { class: 'layout', style: `padding-top: ${layout.ratio * 100}%` }); let iconString = layout.icon; From b2ddb97f7ec2580772d72f4cdc251662cea3714a Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Thu, 11 Mar 2021 11:17:52 +0100 Subject: [PATCH 051/649] feat(index): align indexes with new content structure (#16) --- helix-query.yaml | 79 +++++++++++++++--------------------------------- 1 file changed, 25 insertions(+), 54 deletions(-) diff --git a/helix-query.yaml b/helix-query.yaml index 9bee19f..adb55d7 100644 --- a/helix-query.yaml +++ b/helix-query.yaml @@ -3,12 +3,12 @@ version: 1 indices: blog: source: html - fetch: https://{repo}-{owner}.project-helix.page/{path} + fetch: https://{repo}-{owner}.hlx.page/{path} include: - - '20[1-3][0-9]/[01][0-9]/[0-3][0-9]/*.(docx|md)' + - 'express/learn/blog/*.(docx|md)' exclude: - '**/Document.*' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/blog-index.xlsx?d=w2f1369f931484d648bcc30968d83cded&csf=1&web=1&e=fg63wS + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/express/learn/blog/query-index.xlsx?d=w24dec97b02f04be084a8ccc8c02382bf&csf=1&web=1&e=aybVc5 properties: author: select: main > div:nth-of-type(1) > p:nth-of-type(2) @@ -45,12 +45,13 @@ indices: website: &default source: html - fetch: https://{repo}-{owner}.project-helix.page/{path} + fetch: https://{repo}-{owner}.hlx.page/{path} include: - - '(make|templates)/**/*.(docx|md)' + - 'express/**/*.(docx|md)' exclude: - '**/Document.*' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/query-index.xlsx?d=w894f33df61b343bf94859b3ec87ed012&csf=1&web=1&e=JJcnUD + - 'express/learn/blog/**' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/express/query-index.xlsx?d=wc39f807e76884c2eb5b9e5181329ac6e&csf=1&web=1&e=WFpcpD properties: title: select: head > meta[property="og:title"] @@ -69,86 +70,56 @@ indices: value: | match(attribute(el, 'content'), 'https:\/\/[^/]+(\/.*)') - denmark: - <<: *default - include: - - 'da-DK/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/da-DK/query-index.xlsx?d=w34ec316202704023ae4921e142817af9&csf=1&web=1&e=qeBh1t - germany: <<: *default include: - - 'de-DE/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/de-DE/query-index.xlsx?d=waf21c362e52e4b0884549e99a94559dc&csf=1&web=1&e=Fdk30c + - 'de/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/de/express/query-index.xlsx?d=wd6f7543049cf4838a6b617d706b25d12&csf=1&web=1&e=bgQp9g spain: <<: *default include: - - 'es-ES/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/es-ES/query-index.xlsx?d=w6ba5c3d25e2d415096f918f9b0d16449&csf=1&web=1&e=oEMrGf - - finland: - <<: *default - include: - - 'fi-FI/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/fi-FI/query-index.xlsx?d=wbcd10f9ff54e4383879118af4c138e50&csf=1&web=1&e=e5NDmm + - 'es/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/es/express/query-index.xlsx?d=w0f26b5bbff824048bb64d25abdec6542&csf=1&web=1&e=59vIYN france: <<: *default include: - - 'fr-FR/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/fr-FR/query-index.xlsx?d=w9b22eda6e56448afa50f5a6f32e13667&csf=1&web=1&e=vh9QFh + - 'fr/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/fr/express/query-index.xlsx?d=w224c7112bb3c4f1ca61d474471692e26&csf=1&web=1&e=tNGQpC italy: <<: *default include: - - 'it-IT/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/it-IT/query-index.xlsx?d=w96cd087a998c4398b64f7a0fd02f9d23&csf=1&web=1&e=bzFIT6 + - 'it/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/it/express/query-index.xlsx?d=wf5fe76ac74c84137bc971ddb26c4c025&csf=1&web=1&e=iCAPc1 japan: <<: *default include: - - 'ja-JP/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/ja-JP/query-index.xlsx?d=w4a9640dc295b436198e93cd41dda88f0&csf=1&web=1&e=dsJW31 + - 'jp/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/jp/express/query-index.xlsx?d=wbb195af834f14eb893a69fb45c8647b7&csf=1&web=1&e=7HQUIf korea: <<: *default include: - - 'ko-KR/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/ko-KR/query-index.xlsx?d=w5f70bfa2846f4b32bd494515f16a1a1c&csf=1&web=1&e=5BYelj - - norway: - <<: *default - include: - - 'nb-NO/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/nb-NO/query-index.xlsx?d=w91e0ce70cc8b4eb9b96f998357678df1&csf=1&web=1&e=RoQbEY + - 'kr/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/kr/express/query-index.xlsx?d=w6eb6c21b8313419ab341631c55901a7d&csf=1&web=1&e=3m9As0 netherlands: <<: *default include: - - 'nl-NL/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/nl-NL/query-index.xlsx?d=wf708becba51b46b2a8ee22d0fc2d1235&csf=1&web=1&e=didBoW + - 'nl/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/nl/express/query-index.xlsx?d=wfd7830086887453aa33a6567e3bbea21&csf=1&web=1&e=3eJ9xU brasil: <<: *default include: - - 'pt-BR/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/pt-BR/query-index.xlsx?d=w3dbeff4403034f3a9bc03dfb28c8da65&csf=1&web=1&e=1VpwLM - - sweden: - <<: *default - include: - - 'sv-SE/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/sv-SE/query-index.xlsx?d=w34788cef298e4153a53114321d90cadd&csf=1&web=1&e=dGRvwC - - china: - <<: *default - include: - - 'zh-Hans-CN/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/zh-Hans-CN/query-index.xlsx?d=w217d1db4ba2847278e5eaa3bae6dbb4e&csf=1&web=1&e=vkTQAw + - 'br/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/br/express/query-index.xlsx?d=wcd1a04cc66824c01860b79578357f48f&csf=1&web=1&e=GgwHs3 taiwan: <<: *default include: - - 'zh-Hant-TW/(make|templates)/**/*.(docx|md)' - target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/zh-Hant-TW/query-index.xlsx?d=w8873df701f1c4962983d41516d8400ce&csf=1&web=1&e=8fvaGg + - 'tw/express/**/*.(docx|md)' + target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/tw/express/query-index.xlsx?d=wda3497ec33844e609aacbaaf66e05893&csf=1&web=1&e=vg6Emc From b75e88e5299aa2549a2712b7949499642ba8b28f Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 11 Mar 2021 15:04:09 +0100 Subject: [PATCH 052/649] refactor: remove metadata block handling --- express/scripts/scripts.js | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 3928125..306a418 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -599,35 +599,6 @@ function decorateTutorials() { }); } -function decorateMetaData() { - const $meta = document.querySelector('main .metadata'); - if ($meta) { - const metaconfig = readBlockConfig($meta); - const mapping = { - title: ['og:title', 'twitter:title'], - description: ['og:description', 'twitter:description', 'description'], - }; - if (metaconfig.title) document.title = metaconfig.title; - - for (const a of Object.keys(mapping)) { - if (metaconfig[a]) { - mapping[a].forEach((b) => { - let $elem; - if (b.includes(':')) { - $elem = document.querySelector(`head meta[property="${b}"]`); - } else { - $elem = document.querySelector(`head meta[name="${b}"]`); - } - if ($elem) { - $elem.setAttribute('content', metaconfig[a]); - } - }); - } - } - $meta.remove(); - } -} - function setTemplate() { const path = window.location.pathname; let template = 'default'; @@ -664,7 +635,6 @@ async function decoratePage() { decorateTemplate(); decorateButtons(); decorateTutorials(); - decorateMetaData(); decorateDoMoreEmbed(); setLCPTrigger(); document.body.classList.add('appear'); From c527e1482fcc693dd129b77455bd991674eec728 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 11 Mar 2021 15:11:37 +0100 Subject: [PATCH 053/649] chore: move icons.svg back to root --- express/icons.svg => icons.svg | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename express/icons.svg => icons.svg (100%) diff --git a/express/icons.svg b/icons.svg similarity index 100% rename from express/icons.svg rename to icons.svg From 890da5649027bd90316cf586a45051ce6f083705 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 11 Mar 2021 15:21:02 +0100 Subject: [PATCH 054/649] feat: marketing page header and icon finetuning --- express/styles/styles.css | 51 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index bd9cc76..cb628ee 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -189,7 +189,7 @@ a.button:any-link { line-height: 34px; font-size: 1rem; background-color: #1473e6; - font-weight: 500; + font-weight: 600; cursor: pointer; color: #fff; transition: background-color .4s; @@ -197,6 +197,21 @@ a.button:any-link { display: inline-block; } +a.button > svg { + float: left; + display: inline; + width: 20px; + height: 20px; + margin: 8px 8px 8px 0; + fill: currentColor; + color: currentColor; +} + +a.button > svg > use { + fill: currentColor; + color: currentColor; +} + /* make page : hero */ main { @@ -290,6 +305,10 @@ main .hero > div { /* make page : default content */ +main { + margin-top: 106px; +} + main .section-wrapper > div { margin: auto; max-width: 672px; @@ -300,7 +319,6 @@ main .section-wrapper h1 { font-size: 45px; line-height: 49px; margin: 0; - margin-top: 64px; font-weight: 800; } @@ -337,6 +355,20 @@ main .section-wrapper h5 { font-weight: bold; } +main .section-wrapper h1 + h5 { + font-size: 20px; + line-height: 28px; + font-weight: normal; + margin-top: 32px; + margin-bottom: 16px; +} + +main .section-wrapper h5 + p { + font-size: 16px; + text-align: center; + margin: 0; +} + main .section-wrapper p { font-size: 20px; line-height: 24px; @@ -348,7 +380,11 @@ main .section-wrapper p.button-container { text-align: center; } -@media (min-width:600px) { +@media (min-width:376px) { + main { + margin-top: 66px; + } + main .section-wrapper h2 { font-size: 45px; line-height: 49px; @@ -370,7 +406,14 @@ main .section-wrapper p.button-container { text-align: center; } - + main .section-wrapper h1 + h5 { + font-size: 24px; + line-height: 29px; + font-weight: normal; + margin-top: 32px; + margin-bottom: 16px; + } + main .section-wrapper p { font-size: 18px; line-height: 22px; From 534f7359f8557ceb20abd268ec153a7eb4ec7b40 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 11 Mar 2021 16:19:54 +0100 Subject: [PATCH 055/649] feat: marketing page header and icon finetuning --- express/styles/styles.css | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index cb628ee..d32d148 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -418,7 +418,33 @@ main .section-wrapper p.button-container { font-size: 18px; line-height: 22px; } +} + +@media (min-width:1200px) { + main .section-wrapper > div { + max-width: 1024px; + } + main .section-wrapper div.columns > div > div { + width: 50%; + text-align: left; + } + + main .section-wrapper h1 { + font-size: 60px; + line-height: 64px; + } + + main .section-wrapper h5 + p, + main .section-wrapper p.button-container { + text-align: unset; + } + + main .section-wrapper a.button:any-link { + margin-left: 0; + font-size: 13px; + font-weight: 500; + } } From 26fde3cc758080be40a60e16bfa06b01a0450252 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 11 Mar 2021 17:21:01 +0100 Subject: [PATCH 056/649] feat: marketing page hero and steps container tinetuning --- express/blocks/columns/columns.css | 7 +++++- express/blocks/steps/steps.css | 10 +++++++-- express/styles/styles.css | 36 ++++++++++++++++++++---------- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 2110bd2..382337a 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -8,4 +8,9 @@ main .columns > div { main .columns > div { flex-direction: row; } -} \ No newline at end of file + + main .section-wrapper div.columns > div > div { + width: 50%; + text-align: left; + } + } \ No newline at end of file diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index e37266c..7bfe057 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -42,6 +42,12 @@ main .steps-dark-container { margin: 120px 0; } +@media (min-width:376px) { + main .steps { + margin-bottom: 80px; + } +} + @media (min-width:900px) { main .steps { display: flex; @@ -49,7 +55,7 @@ main .steps-dark-container { main .steps > div { display: flex; - margin: 0 16px; + margin: 0 16px 0 0; width: 30%; - } + } } \ No newline at end of file diff --git a/express/styles/styles.css b/express/styles/styles.css index d32d148..f935ae6 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -380,6 +380,14 @@ main .section-wrapper p.button-container { text-align: center; } +main .section-wrapper.steps-dark-container > div { + padding: 120px 32px 0 32px; +} + +main .section-wrapper.steps-dark-container > div > h2 { + margin: 0; +} + @media (min-width:376px) { main { margin-top: 66px; @@ -418,23 +426,17 @@ main .section-wrapper p.button-container { font-size: 18px; line-height: 22px; } -} + + main .section-wrapper.steps-dark-container > div { + padding: 80px 32px 0 32px; + } + } -@media (min-width:1200px) { +@media (min-width:900px) { main .section-wrapper > div { max-width: 1024px; } - main .section-wrapper div.columns > div > div { - width: 50%; - text-align: left; - } - - main .section-wrapper h1 { - font-size: 60px; - line-height: 64px; - } - main .section-wrapper h5 + p, main .section-wrapper p.button-container { text-align: unset; @@ -447,6 +449,16 @@ main .section-wrapper p.button-container { } } +@media(min-width:1200px) { + main .section-wrapper h1 { + font-size: 60px; + line-height: 64px; + } + + main .section-wrapper.steps-dark-container > div > h2 { + text-align: left; + } +} .blog main .section-wrapper h3 { font-size: 36px; From 7e8fd3cdf62862c34224fdfcfa4e8aa765ff28a7 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 11 Mar 2021 10:24:53 -0800 Subject: [PATCH 057/649] feat: instrument performance measurements --- express/scripts/scripts.js | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 306a418..33f7586 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window, navigator, document, fetch */ +/* global window, navigator, document, fetch, performance, PerformanceObserver */ /* eslint-disable no-console */ function toClassName(name) { @@ -642,3 +642,31 @@ async function decoratePage() { window.spark = {}; decoratePage(); + +/* performance instrumentation */ + +function stamp(message) { + console.log(`${new Date() - performance.timing.navigationStart}ms: ${message}`); +} + +function registerPerformanceLogger() { + try { + const polcp = new PerformanceObserver((entryList) => { + const entries = entryList.getEntries(); + stamp(JSON.stringify(entries)); + }); + polcp.observe({ type: 'largest-contentful-paint', buffered: true}); + const pores = new PerformanceObserver((entryList) => { + const entries = entryList.getEntries(); + entries.forEach((entry) => { + stamp(`resource loaded: ${entry.name} - [${Math.round(entry.startTime + entry.duration)}]`); + }); + }); + + pores.observe({ type: 'resource', buffered: true }); + } catch (e) { + // no output + } +} + +registerPerformanceLogger(); From 69de5763b45ab7c8e099e4cb26e91cbbf6855b5b Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 11 Mar 2021 13:18:07 -0800 Subject: [PATCH 058/649] fix(make): new locales for template lists --- express/blocks/template-list/template-list.js | 2 +- express/scripts/scripts.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index d3974c9..3fd8212 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -52,7 +52,7 @@ async function decorateTemplateList($block) { $block.classList.add('masonry'); } - if (rows === 0 && locale !== 'en-US') { + if (rows === 0 && locale !== 'en') { const tls = Array.from($block.closest('main').querySelectorAll('.template-list')); const i = tls.indexOf($block); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 33f7586..49a4791 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -38,10 +38,10 @@ function wrapSections(element) { export function getLocale(url) { const locale = url.pathname.split('/')[1]; - if (/^[a-z-]{2}(-[a-zA-Z-]*)?-[A-Z]{2}$/.test(locale)) { + if (/^[a-z]{2}$/.test(locale)) { return locale; } - return 'en-US'; + return 'en'; } export function addBlockClasses($block, classNames) { @@ -655,7 +655,7 @@ function registerPerformanceLogger() { const entries = entryList.getEntries(); stamp(JSON.stringify(entries)); }); - polcp.observe({ type: 'largest-contentful-paint', buffered: true}); + polcp.observe({ type: 'largest-contentful-paint', buffered: true }); const pores = new PerformanceObserver((entryList) => { const entries = entryList.getEntries(); entries.forEach((entry) => { From 28cbd649177304e3279920f6a2e0cba8ec35cd8e Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 11 Mar 2021 14:30:07 -0800 Subject: [PATCH 059/649] feat: add linked image --- express/blocks/columns/columns.js | 14 ++++++++++++-- express/blocks/linked-image/linked-image.js | 11 +++-------- express/scripts/scripts.js | 11 +++++++++++ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/express/blocks/columns/columns.js b/express/blocks/columns/columns.js index 1d0d458..6222290 100644 --- a/express/blocks/columns/columns.js +++ b/express/blocks/columns/columns.js @@ -11,7 +11,17 @@ */ /* global */ +import { linkImage } from '../../scripts/scripts.js'; + export default function decorate($block) { - const numRows = $block.children.length; - return (numRows); + const $rows = Array.from($block.children); + $rows.forEach(($row) => { + const $cells = Array.from($row.children); + $cells.forEach(($cell) => { + /* this probably needs to be tighter and possibly earlier */ + if ($cell.querySelector('img') && $cell.querySelector('a')) { + linkImage($cell); + } + }); + }); } diff --git a/express/blocks/linked-image/linked-image.js b/express/blocks/linked-image/linked-image.js index 72b6f7a..b24c0b3 100644 --- a/express/blocks/linked-image/linked-image.js +++ b/express/blocks/linked-image/linked-image.js @@ -11,13 +11,8 @@ */ /* global */ +import { linkImage } from '../../scripts/scripts.js'; + export default function decorate($block) { - const $a = $block.querySelector('a'); - const $parent = $a.closest('div'); - $a.remove(); - const picture = $parent.innerHTML; - $parent.innerHTML = ''; - $parent.appendChild($a); - $a.innerHTML = picture; - $a.className = ''; + linkImage($block); } diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 49a4791..eddb71b 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -26,6 +26,17 @@ export function createTag(name, attrs) { return el; } +export function linkImage($elem) { + const $a = $elem.querySelector('a'); + const $parent = $a.closest('div'); + $a.remove(); + const picture = $parent.innerHTML; + $parent.innerHTML = ''; + $parent.appendChild($a); + $a.innerHTML = picture; + $a.className = ''; +} + function wrapSections(element) { document.querySelectorAll(element).forEach(($div) => { if (!$div.id) { From 6e7c406445161b10f39e0d6527e5f89c50f4f9a7 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 11 Mar 2021 15:59:10 -0800 Subject: [PATCH 060/649] fix: icons --- express/blocks/layouts/layouts.js | 2 +- icons.svg => express/icons.svg | 59 +++++++------------------------ express/scripts/scripts.js | 8 +++++ 3 files changed, 21 insertions(+), 48 deletions(-) rename icons.svg => express/icons.svg (66%) diff --git a/express/blocks/layouts/layouts.js b/express/blocks/layouts/layouts.js index 288bbb4..721f517 100644 --- a/express/blocks/layouts/layouts.js +++ b/express/blocks/layouts/layouts.js @@ -32,7 +32,7 @@ export default function decorate($block) { layouts.push(layout); }); $block.innerHTML = ''; - const knownIcons = ['instagram', 'youtube', 'facebook', 'twitter']; + const knownIcons = ['instagram', 'youtube', 'facebook', 'twitter', 'snapchat']; layouts.forEach((layout) => { const $layout = createTag('div', { class: 'layout', style: `padding-top: ${layout.ratio * 100}%` }); let iconString = layout.icon; diff --git a/icons.svg b/express/icons.svg similarity index 66% rename from icons.svg rename to express/icons.svg index 7bfaf7c..cb95f4b 100644 --- a/icons.svg +++ b/express/icons.svg @@ -87,53 +87,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -150,4 +103,16 @@ + + Snapchat + Snapchat Icon + + diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index eddb71b..824c7a6 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -637,6 +637,13 @@ function setLCPTrigger() { } } +function fixIcons() { + document.querySelectorAll('svg use[href^="./_icons_"]').forEach(($use) => { + console.log($use.href); + $use.setAttribute('href', `/express/icons.svg#${$use.getAttribute('href').split('#')[1]}`); + }); +} + async function decoratePage() { setTemplate(); await decorateTesting(); @@ -645,6 +652,7 @@ async function decoratePage() { decorateHero(); decorateTemplate(); decorateButtons(); + fixIcons(); decorateTutorials(); decorateDoMoreEmbed(); setLCPTrigger(); From f03bc32da37d7d30e1b3d86ca9321d6bfde46155 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 12 Mar 2021 11:51:40 -0800 Subject: [PATCH 061/649] chore: add chat --- express/blocks/chat/chat.css | 3 +++ express/blocks/chat/chat.js | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 express/blocks/chat/chat.css create mode 100644 express/blocks/chat/chat.js diff --git a/express/blocks/chat/chat.css b/express/blocks/chat/chat.css new file mode 100644 index 0000000..475210e --- /dev/null +++ b/express/blocks/chat/chat.css @@ -0,0 +1,3 @@ +#drift-widget-container { + z-index: 10000!important; +} \ No newline at end of file diff --git a/express/blocks/chat/chat.js b/express/blocks/chat/chat.js new file mode 100644 index 0000000..e3b1c33 --- /dev/null +++ b/express/blocks/chat/chat.js @@ -0,0 +1,22 @@ +!function() { + var t = window.driftt = window.drift = window.driftt || []; + if (!t.init) { + if (t.invoked) return void (window.console && console.error && console.error("Drift snippet included twice.")); + t.invoked = !0, t.methods = [ "identify", "config", "track", "reset", "debug", "show", "ping", "page", "hide", "off", "on" ], + t.factory = function(e) { + return function() { + var n = Array.prototype.slice.call(arguments); + return n.unshift(e), t.push(n), t; + }; + }, t.methods.forEach(function(e) { + t[e] = t.factory(e); + }), t.load = function(t) { + var e = 3e5, n = Math.ceil(new Date() / e) * e, o = document.createElement("script"); + o.type = "text/javascript", o.async = !0, o.crossorigin = "anonymous", o.src = "https://js.driftt.com/include/" + n + "/" + t + ".js"; + var i = document.getElementsByTagName("script")[0]; + i.parentNode.insertBefore(o, i); + }; + } +}(); +drift.SNIPPET_VERSION = '0.3.1'; +drift.load('3m8mmedirgph'); From 6a60110d3abd6e978156b35e770fa9b2113a72c0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 12 Mar 2021 15:42:40 -0800 Subject: [PATCH 062/649] chore: disable linter for drift snippet --- express/blocks/chat/chat.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/express/blocks/chat/chat.js b/express/blocks/chat/chat.js index e3b1c33..c2291e3 100644 --- a/express/blocks/chat/chat.js +++ b/express/blocks/chat/chat.js @@ -1,3 +1,5 @@ +/* eslint-disable */ + !function() { var t = window.driftt = window.drift = window.driftt || []; if (!t.init) { From f3a03eb3317eddfd69d699c0080871216b31dea9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 12 Mar 2021 15:44:23 -0800 Subject: [PATCH 063/649] fix: handle no link gracefully --- express/blocks/layouts/layouts.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/express/blocks/layouts/layouts.js b/express/blocks/layouts/layouts.js index 721f517..d6061ac 100644 --- a/express/blocks/layouts/layouts.js +++ b/express/blocks/layouts/layouts.js @@ -47,9 +47,13 @@ export default function decorate($block) {
${layout.name} - ${layout.res}
`; - $layout.addEventListener('click', () => { - window.location.href = layout.link; - }); + + if (layout.link) { + $layout.addEventListener('click', () => { + window.location.href = layout.link; + }); + } + $block.append($layout); console.log($layout); }); From 9af5854d910d84778332e490a3cad590c77df62e Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 13 Mar 2021 10:02:27 -0800 Subject: [PATCH 064/649] feat(template-list): add animation --- .../blocks/template-list/template-list.css | 2 +- express/blocks/template-list/template-list.js | 31 ++++++++++++------- express/scripts/scripts.js | 2 +- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 8c7f12c..247d693 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -50,7 +50,7 @@ main .template-list > div { } -main .template-list > div img { +main .template-list > div img, main .template-list > div video { border-radius: 10px; width: 300px; } diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 3fd8212..5e925d3 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -16,6 +16,7 @@ import { getLocale, createTag, + linkImage, } from '../../scripts/scripts.js'; async function fetchBlueprint(pathname) { @@ -35,16 +36,6 @@ async function fetchBlueprint(pathname) { } async function decorateTemplateList($block) { - $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { - const $parent = $a.closest('div'); - $a.remove(); - const picture = $parent.innerHTML; - $parent.innerHTML = ''; - $parent.appendChild($a); - $a.innerHTML = picture; - $a.className = ''; - }); - const rows = $block.children.length; const locale = getLocale(window.location); @@ -63,7 +54,6 @@ async function decorateTemplateList($block) { if ($bpBlock) { $block.innerHTML = $bpBlock.innerHTML; } - const $heroPicture = document.querySelector('.hero-bg'); if (!$heroPicture && window.spark.$blueprint) { @@ -81,6 +71,25 @@ async function decorateTemplateList($block) { } } } + + $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { + const $parent = $a.closest('div'); + if ($a.textContent.startsWith('https://')) { + linkImage($parent); + } else { + const $picture = $parent.querySelector('picture'); + const $video = createTag('video', { + playsinline: '', + autoplay: '', + loop: '', + muted: '', + }); + $video.innerHTML = ``; + $parent.replaceChild($video, $picture); + $a.remove(); + $video.play(); + } + }); } export default function decorate($block) { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 824c7a6..dd3f156 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -688,4 +688,4 @@ function registerPerformanceLogger() { } } -registerPerformanceLogger(); +if (window.name.includes('performance')) registerPerformanceLogger(); From d18a922a6f5ec12a4beb8ef7903d79b180ac9672 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 13 Mar 2021 10:10:04 -0800 Subject: [PATCH 065/649] feat(template-list): add animation --- express/blocks/template-list/template-list.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 5e925d3..942fa84 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -87,7 +87,10 @@ async function decorateTemplateList($block) { $video.innerHTML = ``; $parent.replaceChild($video, $picture); $a.remove(); - $video.play(); + $video.addEventListener('canplay', () => { + $video.muted = true; + $video.play(); + }); } }); } From b4b290bd261bc622d20bd3ca85929aaf22370ba3 Mon Sep 17 00:00:00 2001 From: rofe Date: Sat, 13 Mar 2021 20:33:29 +0100 Subject: [PATCH 066/649] feat: layout tweaks for default page --- express/blocks/layouts/layouts.css | 7 +++---- express/blocks/steps/steps.css | 4 ++++ express/blocks/template-list/template-list.css | 8 ++++++++ express/styles/styles.css | 8 ++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 2e0e6a0..d03f465 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -1,5 +1,5 @@ main .layouts { - padding-top: 64px; + margin: 56px 0 120px 0; } main .layouts div:first-of-type { @@ -28,7 +28,7 @@ main .layouts .layout-inside { left: 0; width: 100%; height: 100%; - padding: 16px; + padding: 16px 0; box-sizing: border-box; display: flex; align-items: stretch; @@ -79,7 +79,7 @@ main .layouts .layout-content { main .layouts { display: block; columns: 240px 2; - margin: auto; + margin: 80px auto; column-gap: 32px; width: 528px; } @@ -93,7 +93,6 @@ main .layouts .layout-content { main .layouts { display: block; columns: 240px 3; - margin: auto; column-gap: 32px; width: 792px; } diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 7bfe057..246abfa 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -46,6 +46,10 @@ main .steps-dark-container { main .steps { margin-bottom: 80px; } + + main .steps-dark-container { + margin: 80px 0; + } } @media (min-width:900px) { diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 8c7f12c..4a2525b 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -16,6 +16,10 @@ main .template-list a:any-link { display: flex; } +main .template-list > div > div:first-child > a:any-link { + padding-left: 0; +} + main .template-list div > div:nth-child(2) a:any-link::after { display: flex; width: 6px; @@ -65,6 +69,10 @@ main .template-list.large > div img { width: 100%; } +main .template-list + .button-container > a { + margin: 0; +} + @media (min-width: 600px) { main .template-list > div { diff --git a/express/styles/styles.css b/express/styles/styles.css index f935ae6..ba165cf 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -394,8 +394,8 @@ main .section-wrapper.steps-dark-container > div > h2 { } main .section-wrapper h2 { - font-size: 45px; - line-height: 49px; + font-size: 36px; + line-height: 39px; margin-top: 80px; text-align: center; } @@ -437,6 +437,10 @@ main .section-wrapper.steps-dark-container > div > h2 { max-width: 1024px; } + main .section-wrapper h2 { + text-align: left; + } + main .section-wrapper h5 + p, main .section-wrapper p.button-container { text-align: unset; From 91de5414ed3efdfabddfe3e47c96739b06a9f539 Mon Sep 17 00:00:00 2001 From: rofe Date: Sat, 13 Mar 2021 22:41:03 +0100 Subject: [PATCH 067/649] feat: template-list tweaks for default page --- express/blocks/layouts/layouts.css | 1 - express/blocks/template-list/template-list.css | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index d03f465..27c16aa 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -93,7 +93,6 @@ main .layouts .layout-content { main .layouts { display: block; columns: 240px 3; - column-gap: 32px; width: 792px; } } diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index bb94c0c..261fc36 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -106,4 +106,20 @@ main .template-list + .button-container > a { column-gap: 32px; width: 792px; } +} + +@media (min-width: 1200px) { + main .template-list-container > div { + max-width: 1056px; + } + + main .template-list { + display: block; + columns: 240px 4; + margin: auto; + column-gap: 32px; + width: 1056px; + position: relative; + left: -16px; + } } \ No newline at end of file From 855cf48461d225fe7a96760c2a10a004551d1ce6 Mon Sep 17 00:00:00 2001 From: rofe Date: Sun, 14 Mar 2021 15:22:26 +0100 Subject: [PATCH 068/649] chore: decorateTemplate no longer used --- express/scripts/scripts.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index dd3f156..6ee8476 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -290,15 +290,15 @@ function decorateButtons() { }); } -function decorateTemplate() { - if (window.location.pathname.includes('/make/')) { - document.body.classList.add('make-page'); - } - const year = window.location.pathname.match(/\/20\d\d\//); - if (year) { - document.body.classList.add('blog-page'); - } -} +// function decorateTemplate() { +// if (window.location.pathname.includes('/make/')) { +// document.body.classList.add('make-page'); +// } +// const year = window.location.pathname.match(/\/20\d\d\//); +// if (year) { +// document.body.classList.add('blog-page'); +// } +// } // function decorateLegacyLinks() { // const legacy = 'https://blog.adobespark.com/'; @@ -650,7 +650,6 @@ async function decoratePage() { wrapSections('main>div'); decorateHeader(); decorateHero(); - decorateTemplate(); decorateButtons(); fixIcons(); decorateTutorials(); From 6c8ade598e838a2b78d5f34086223c42d7f7fa13 Mon Sep 17 00:00:00 2001 From: rofe Date: Sun, 14 Mar 2021 15:23:07 +0100 Subject: [PATCH 069/649] chore: move top margin from main to container --- express/styles/styles.css | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index ba165cf..15cb93b 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -305,10 +305,6 @@ main .hero > div { /* make page : default content */ -main { - margin-top: 106px; -} - main .section-wrapper > div { margin: auto; max-width: 672px; @@ -376,6 +372,10 @@ main .section-wrapper p { text-align: left; } +main .section-wrapper.columns-container { + margin-top: 106px; +} + main .section-wrapper p.button-container { text-align: center; } @@ -389,10 +389,6 @@ main .section-wrapper.steps-dark-container > div > h2 { } @media (min-width:376px) { - main { - margin-top: 66px; - } - main .section-wrapper h2 { font-size: 36px; line-height: 39px; @@ -427,6 +423,10 @@ main .section-wrapper.steps-dark-container > div > h2 { line-height: 22px; } + main .section-wrapper.columns-container { + margin-top: 66px; + } + main .section-wrapper.steps-dark-container > div { padding: 80px 32px 0 32px; } From 046d7429b359c258f4363bb4e2eb2de26485dfc1 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 14 Mar 2021 09:35:01 -0700 Subject: [PATCH 070/649] fix: temporary branch confusion --- tools/sidekick/plugins.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tools/sidekick/plugins.js b/tools/sidekick/plugins.js index 72934ae..630bbd0 100644 --- a/tools/sidekick/plugins.js +++ b/tools/sidekick/plugins.js @@ -29,4 +29,37 @@ }, }, }); + + // RELOAD temp fix + + sk.add({ + id: 'reload', + condition: (sidekick) => sidekick.location.host === sidekick.config.innerHost || sidekick.location.hostname === 'localhost', + button: { + action: () => { + const { location } = sk; + const path = location.pathname; + sk.showModal('Please wait …', true); + const stashInner = sk.config.innerHost; + const stashPurge = sk.config.purgeHost; + //sk.config.innerHost = `master--${sk.config.innerHost}`; + sk.config.purgeHost = sk.config.innerHost.replace('main--', 'master--'); + console.log(`custom reload ${sk.config.innerHost} ${sk.config.purgeHost}`); + sk + .publish(path, true) + .then((resp) => { + if (resp && resp.ok) { + window.location.reload(); + } else { + sk.showModal([ + `Failed to reload ${path}. Please try again later.`, + JSON.stringify(resp), + ], true, 0); + } + //sk.config.innerHost = stashInner; + sk.config.purgeHost = stashPurge; + }); + }, + }, + }); })(); From 0573e11c9c5d13a0a7bba9b2ddec9360207e1f15 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 14 Mar 2021 09:37:13 -0700 Subject: [PATCH 071/649] fix: temporary branch confusion --- tools/sidekick/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/sidekick/plugins.js b/tools/sidekick/plugins.js index 630bbd0..7c7a3ab 100644 --- a/tools/sidekick/plugins.js +++ b/tools/sidekick/plugins.js @@ -43,7 +43,7 @@ const stashInner = sk.config.innerHost; const stashPurge = sk.config.purgeHost; //sk.config.innerHost = `master--${sk.config.innerHost}`; - sk.config.purgeHost = sk.config.innerHost.replace('main--', 'master--'); + sk.config.purgeHost = sk.config.purgeHost.replace('main--', 'master--'); console.log(`custom reload ${sk.config.innerHost} ${sk.config.purgeHost}`); sk .publish(path, true) From 79bc7ea76ac464fd0d239024220aebe270970f6a Mon Sep 17 00:00:00 2001 From: rofe Date: Mon, 15 Mar 2021 18:15:03 +0100 Subject: [PATCH 072/649] fix: mobile breakpoint --- express/blocks/steps/steps.css | 2 +- express/styles/styles.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 246abfa..d40cb37 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -42,7 +42,7 @@ main .steps-dark-container { margin: 120px 0; } -@media (min-width:376px) { +@media (min-width:600px) { main .steps { margin-bottom: 80px; } diff --git a/express/styles/styles.css b/express/styles/styles.css index 15cb93b..7e270f9 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -388,7 +388,7 @@ main .section-wrapper.steps-dark-container > div > h2 { margin: 0; } -@media (min-width:376px) { +@media (min-width:600px) { main .section-wrapper h2 { font-size: 36px; line-height: 39px; From 9b31dac8e63d3bace0d18e535ebb5735b545f924 Mon Sep 17 00:00:00 2001 From: rofe Date: Mon, 15 Mar 2021 18:15:24 +0100 Subject: [PATCH 073/649] fix: use currentColor for svg fill --- express/blocks/layouts/layouts.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 27c16aa..5ef31a8 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -54,7 +54,7 @@ main .layouts .layout-icon { main .layouts .layout-icon svg { height: 38px; width: 38px; - fill: #484848; + fill: currentColor; } main .layouts .layout-description { From d184c422ff5df6be18e95be1456599f9a4024fa1 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 15 Mar 2021 11:59:40 -0700 Subject: [PATCH 074/649] chore: lint --- tools/sidekick/plugins.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/sidekick/plugins.js b/tools/sidekick/plugins.js index 7c7a3ab..48e25ab 100644 --- a/tools/sidekick/plugins.js +++ b/tools/sidekick/plugins.js @@ -40,11 +40,11 @@ const { location } = sk; const path = location.pathname; sk.showModal('Please wait …', true); - const stashInner = sk.config.innerHost; + // const stashInner = sk.config.innerHost; const stashPurge = sk.config.purgeHost; - //sk.config.innerHost = `master--${sk.config.innerHost}`; + // sk.config.innerHost = `master--${sk.config.innerHost}`; sk.config.purgeHost = sk.config.purgeHost.replace('main--', 'master--'); - console.log(`custom reload ${sk.config.innerHost} ${sk.config.purgeHost}`); + // console.log(`custom reload ${sk.config.innerHost} ${sk.config.purgeHost}`); sk .publish(path, true) .then((resp) => { @@ -56,7 +56,7 @@ JSON.stringify(resp), ], true, 0); } - //sk.config.innerHost = stashInner; + // sk.config.innerHost = stashInner; sk.config.purgeHost = stashPurge; }); }, From c967d8e8caed57b19920d84ac505e311d189a97c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 15 Mar 2021 16:35:13 -0700 Subject: [PATCH 075/649] chore: linting --- express/blocks/filter-pages/filter-pages.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/express/blocks/filter-pages/filter-pages.js b/express/blocks/filter-pages/filter-pages.js index 3a7ad18..628ba60 100644 --- a/express/blocks/filter-pages/filter-pages.js +++ b/express/blocks/filter-pages/filter-pages.js @@ -55,11 +55,15 @@ async function fetchFullIndex(indices) { await Promise.all(indices.map(async (url) => { if (url) { - const resp = await fetch(url); - const json = await resp.json(); - // eslint-disable-next-line no-console - console.log(`${url}: ${json.data.length}`); - fullIndex.push(...json.data.filter((e) => !!e.path)); + try { + const resp = await fetch(url); + const json = await resp.json(); + // eslint-disable-next-line no-console + console.log(`${url}: ${json.data.length}`); + fullIndex.push(...json.data.filter((e) => !!e.path)); + } catch (e) { + // something went wrong + } } })); fullIndex.forEach((e) => { From 559374388eea8f185611656e2194009e030cf7e0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 15 Mar 2021 16:36:50 -0700 Subject: [PATCH 076/649] chore: test push to prod --- express/styles/styles.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 7e270f9..7ff307e 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -1,3 +1,7 @@ +/* + testing push to prod +*/ + body { font-family: 'adobe-clean', 'Adobe Clean'; margin: 0; From 71dfe270884378c8d73d0a69a6267fa0d1f7fe14 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 15 Mar 2021 16:39:21 -0700 Subject: [PATCH 077/649] chore: test push to prod --- express/styles/styles.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 7ff307e..7e270f9 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -1,7 +1,3 @@ -/* - testing push to prod -*/ - body { font-family: 'adobe-clean', 'Adobe Clean'; margin: 0; From f467a03530cb3c5a3204ac8ce428690002e595ae Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 15 Mar 2021 17:45:32 -0700 Subject: [PATCH 078/649] feat(analytics): initial basic implementation --- express/scripts/martech.js | 39 +++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 5128018..0114591 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -11,7 +11,7 @@ */ /* global window */ -import { loadScript } from './scripts.js'; +import { loadScript, getLocale } from './scripts.js'; function handleConsentSettings() { try { @@ -54,5 +54,42 @@ window.targetGlobalSettings = { bodyHidingEnabled: false, }; +const pageName = `adobe.com:${window.location.pathname.split('/').join(':')}`; +const locale = getLocale(window.location); + +const langs = { + en: 'en-US', + fr: 'fr-FR', + de: 'de-DE', + it: 'it-IT', + da: 'da-DK', + es: 'es-ES', + fi: 'fi-FI', + jp: 'ja-JP', + kr: 'ko-KR', + no: 'nb-NO', + nl: 'nl-NL', + br: 'pt-BR', + se: 'sv-SE', + tw: 'zh-Hant-TW', + cn: 'zh-Hans-CN', +}; + +const language = langs[locale]; +let category = 'design'; +if (window.location.pathname.includes('/photo')) category = 'photo'; +if (window.location.pathname.includes('/video')) category = 'video'; + +window.digitalData = { + page: { + pageInfo: { + pageName, + language, + siteSection: 'adobe.com:express', + category, + }, + }, +}; + loadScript('https://www.adobe.com/marketingtech/main.min.js'); loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); From d842ab1686e47f0ca8bd321085e7820e7fc09f31 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 15 Mar 2021 17:56:18 -0700 Subject: [PATCH 079/649] feat(analytics): initial basic implementation --- express/scripts/martech.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 0114591..d7ea271 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -76,9 +76,12 @@ const langs = { }; const language = langs[locale]; -let category = 'design'; -if (window.location.pathname.includes('/photo')) category = 'photo'; -if (window.location.pathname.includes('/video')) category = 'video'; +let category = ''; +if (window.location.pathname.includes('/create/') || window.location.pathname.includes('/feature/')) { + category = 'design'; + if (window.location.pathname.includes('/photo')) category = 'photo'; + if (window.location.pathname.includes('/video')) category = 'video'; +} window.digitalData = { page: { From 76aee7409bdb56d47cff6a69b9ac35db0e14f151 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 15 Mar 2021 18:18:10 -0700 Subject: [PATCH 080/649] fix(make): fix large template list layout --- .../blocks/template-list/template-list.css | 4 ++++ express/blocks/template-list/template-list.js | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 261fc36..2cfb5ce 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -65,6 +65,10 @@ main .template-list.large > div { border: 0; } +main .template-list.large > div > div { + margin: auto; +} + main .template-list.large > div img { width: 100%; } diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 942fa84..6f2fd9c 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -36,13 +36,8 @@ async function fetchBlueprint(pathname) { } async function decorateTemplateList($block) { - const rows = $block.children.length; + let rows = $block.children.length; const locale = getLocale(window.location); - - if (rows > 6) { - $block.classList.add('masonry'); - } - if (rows === 0 && locale !== 'en') { const tls = Array.from($block.closest('main').querySelectorAll('.template-list')); const i = tls.indexOf($block); @@ -72,9 +67,19 @@ async function decorateTemplateList($block) { } } + rows = $block.children.length; + + if (rows > 6) { + $block.classList.add('masonry'); + } + + if (rows === 1) { + $block.classList.add('large'); + } + $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { const $parent = $a.closest('div'); - if ($a.textContent.startsWith('https://')) { + if ($a.href.includes('.app.link')) { linkImage($parent); } else { const $picture = $parent.querySelector('picture'); From 27e6c729bffd141ac5bab9b5b62daaa4668216d1 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 11:17:43 +0100 Subject: [PATCH 081/649] feat: icon-list block --- express/blocks/icon-list/icon-list.css | 41 ++++++++++++++++++++++++++ express/blocks/icon-list/icon-list.js | 26 ++++++++++++++++ express/icons.svg | 22 +++++++++++++- express/scripts/scripts.js | 12 ++++++-- 4 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 express/blocks/icon-list/icon-list.css create mode 100644 express/blocks/icon-list/icon-list.js diff --git a/express/blocks/icon-list/icon-list.css b/express/blocks/icon-list/icon-list.css new file mode 100644 index 0000000..de7edaf --- /dev/null +++ b/express/blocks/icon-list/icon-list.css @@ -0,0 +1,41 @@ +main .icon-list { + text-align: left; + font-size: 1.125rem; + width: 300px; + margin: 0 auto; +} + +main .icon-list > div { + display: flex; + flex-direction: row; + margin-bottom: 32px; +} + +main .icon-list > div > div:first-child { + min-width: 64px; +} + +main .icon-list > div > div:last-child { + flex-grow: 1; +} + +main .icon-list .icon { + fill: currentColor; + width: 40px; + height: 40px; +} + +@media (min-width:600px) { + main .icon-list { + columns: 2; + column-gap: 32px; + width: 528px; + } +} + +@media (min-width:900px) { + main .icon-list { + width: 792px; + } +} + diff --git a/express/blocks/icon-list/icon-list.js b/express/blocks/icon-list/icon-list.js new file mode 100644 index 0000000..f14a4dc --- /dev/null +++ b/express/blocks/icon-list/icon-list.js @@ -0,0 +1,26 @@ +/* + * Copyright 2021 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. + */ +/* global */ + +import { + toClassName, + getIcon, +} from '../../scripts/scripts.js'; + +export default function decorate($block) { + $block.querySelectorAll(':scope>div').forEach(($row) => { + if ($row.children && $row.children[1]) { + const iconName = toClassName($row.children[0].textContent); + $row.children[0].innerHTML = iconName ? getIcon(iconName) : ''; + } + }); +} diff --git a/express/icons.svg b/express/icons.svg index cb95f4b..2cd7f9b 100644 --- a/express/icons.svg +++ b/express/icons.svg @@ -114,5 +114,25 @@ c2.2,0,4.3,1.1,5.3,3.4c0.5,1.2,0.3,3.3,0.2,4.9c0.1,0,0.2,0.1,0.4,0.1c0.3,0,0.6-0.1,0.9-0.3c0.3-0.1,0.6-0.1,0.9,0l0,0 c0.4,0.1,0.6,0.4,0.7,0.7c0,0.4-0.4,0.8-1.1,1c-0.1,0-0.2,0.1-0.3,0.1c-0.4,0.1-1,0.3-1.2,0.7c-0.1,0.2-0.1,0.5,0.1,0.8c0,0,0,0,0,0 c0.1,0.1,1.4,3.1,4.3,3.6C22.6,17.1,22.8,17.4,22.7,17.7L22.7,17.7z"/> - + + + + Learn + Learn + + + + + + + Magic Wand + Magic Wand + + + + + + + + diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 6ee8476..121f4b5 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -12,8 +12,16 @@ /* global window, navigator, document, fetch, performance, PerformanceObserver */ /* eslint-disable no-console */ -function toClassName(name) { - return (name.toLowerCase().replace(/[^0-9a-z]/gi, '-')); +export function toClassName(name) { + return name && typeof name === 'string' + ? name.toLowerCase().replace(/[^0-9a-z]/gi, '-') + : ''; +} + +export function getIcon(icon) { + return ` + + `; } export function createTag(name, attrs) { From 3f04e1a9c017729c8ad2644c3befc3ee31733a7d Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 11:18:23 +0100 Subject: [PATCH 082/649] refactor: use getIcon --- express/blocks/layouts/layouts.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/express/blocks/layouts/layouts.js b/express/blocks/layouts/layouts.js index d6061ac..9ceea09 100644 --- a/express/blocks/layouts/layouts.js +++ b/express/blocks/layouts/layouts.js @@ -13,6 +13,7 @@ import { createTag, + getIcon, } from '../../scripts/scripts.js'; export default function decorate($block) { @@ -37,9 +38,7 @@ export default function decorate($block) { const $layout = createTag('div', { class: 'layout', style: `padding-top: ${layout.ratio * 100}%` }); let iconString = layout.icon; if (knownIcons.includes(iconString)) { - iconString = ` - - `; + iconString = getIcon(layout.icon); } $layout.innerHTML = `
From 7c6b65456dc43017359d1a3023bc876441c85d8b Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 11:24:33 +0100 Subject: [PATCH 083/649] feat: icon-list block --- express/blocks/icon-list/icon-list.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/icon-list/icon-list.css b/express/blocks/icon-list/icon-list.css index de7edaf..d90604a 100644 --- a/express/blocks/icon-list/icon-list.css +++ b/express/blocks/icon-list/icon-list.css @@ -29,7 +29,7 @@ main .icon-list .icon { main .icon-list { columns: 2; column-gap: 32px; - width: 528px; + width: 588px; } } From 58131b5085db0819cbf1b323cff61e7c70edfc5c Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 11:29:26 +0100 Subject: [PATCH 084/649] refactor: section margins and paddings --- express/blocks/layouts/layouts.css | 4 +-- express/blocks/steps/steps.css | 15 -------- express/styles/styles.css | 55 ++++++++++++++++++++---------- 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 5ef31a8..0cfef50 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -1,5 +1,5 @@ main .layouts { - margin: 56px 0 120px 0; + margin: 56px 0 0 0; } main .layouts div:first-of-type { @@ -79,7 +79,7 @@ main .layouts .layout-content { main .layouts { display: block; columns: 240px 2; - margin: 80px auto; + margin: 0 auto; column-gap: 32px; width: 528px; } diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index d40cb37..05463e7 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -1,21 +1,18 @@ main .steps { margin-top: 56px; text-align: left; - margin-bottom: 120px; } main .steps h3 { font-size: 22px; line-height: 26px; margin-top: 0; - text-align: left; } main .steps p { font-size: 18px; line-height: 22px; margin: 0; - text-align: left; } main .steps > div { @@ -37,19 +34,7 @@ main .steps .step-description { main .steps-dark-container { background-color: black; - padding: 1px 0; color: white; - margin: 120px 0; -} - -@media (min-width:600px) { - main .steps { - margin-bottom: 80px; - } - - main .steps-dark-container { - margin: 80px 0; - } } @media (min-width:900px) { diff --git a/express/styles/styles.css b/express/styles/styles.css index 7e270f9..463e54e 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -305,6 +305,14 @@ main .hero > div { /* make page : default content */ +main .section-wrapper:first-of-type { + padding: 120px 0; +} + +main .section-wrapper:not(:first-of-type) { + padding-top: 120px; +} + main .section-wrapper > div { margin: auto; max-width: 672px; @@ -322,29 +330,38 @@ main .section-wrapper h2 { font-size: 36px; line-height: 40px; margin: 0; - margin-top: 120px; text-align: left; font-weight: 800; } +main .section-wrapper * + h2 { + margin-top: 120px; +} + main .section-wrapper h3 { font-size: 28px; line-height: 32px; margin: 0; - margin-top: 64px; text-align: left; font-weight: 800; } +main .section-wrapper * + h2 { + margin-top: 64px; +} + main .section-wrapper h4 { font-size: 22px; line-height: 26px; margin: 0; - margin-top: 56px; text-align: left; font-weight: 800; } +main .section-wrapper * + h4 { + margin-top: 56px; +} + main .section-wrapper h5 { font-size: 22px; line-height: 26px; @@ -369,19 +386,19 @@ main .section-wrapper p { font-size: 20px; line-height: 24px; margin: 32px 0; - text-align: left; -} - -main .section-wrapper.columns-container { - margin-top: 106px; } main .section-wrapper p.button-container { text-align: center; + margin-bottom: 0; +} + +main .section-wrapper.steps-dark-container { + padding: 120px 0; } main .section-wrapper.steps-dark-container > div { - padding: 120px 32px 0 32px; + padding: 0 32px; } main .section-wrapper.steps-dark-container > div > h2 { @@ -389,17 +406,23 @@ main .section-wrapper.steps-dark-container > div > h2 { } @media (min-width:600px) { + main .section-wrapper:first-of-type { + padding: 80px 0; + } + + main .section-wrapper:not(:first-of-type) { + padding-top: 80px; + } + main .section-wrapper h2 { font-size: 36px; line-height: 39px; - margin-top: 80px; text-align: center; } main .section-wrapper h3 { font-size: 36px; line-height: 40px; - margin-top: 64px; text-align: center; } @@ -423,14 +446,10 @@ main .section-wrapper.steps-dark-container > div > h2 { line-height: 22px; } - main .section-wrapper.columns-container { - margin-top: 66px; - } - - main .section-wrapper.steps-dark-container > div { - padding: 80px 32px 0 32px; + main .section-wrapper.steps-dark-container { + padding: 80px 0; } - } +} @media (min-width:900px) { main .section-wrapper > div { From 4d8d320b3da9ead2f2f4df6864b2581bf9d19294 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 13:25:39 +0100 Subject: [PATCH 085/649] refactor: blog pages are always in */blog* now --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 121f4b5..94e9a20 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -623,7 +623,7 @@ function setTemplate() { let template = 'default'; if (path.includes('/make/')) { template = 'make'; - } else if (path.includes('/20') || path.includes('/blog/')) { + } else if (path.includes('/blog/')) { template = 'blog'; } // todo: read template from page metadata From b4998989b7c4f99140dfde13b08c2985ec51a51a Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 15:50:45 +0100 Subject: [PATCH 086/649] feat: default background and text color --- express/styles/styles.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 463e54e..5a5c246 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -1,5 +1,7 @@ body { font-family: 'adobe-clean', 'Adobe Clean'; + background-color: #FFF; + color: #232323; margin: 0; padding: 0; display: none; From 6260f74a26b8091e2ceac2ca4e9331478cff8113 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 15:51:04 +0100 Subject: [PATCH 087/649] feat: cards block --- express/blocks/cards/cards.css | 82 ++++++++++++++++++++++++++++++++++ express/blocks/cards/cards.js | 22 +++++++++ express/scripts/scripts.js | 2 +- 3 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 express/blocks/cards/cards.css create mode 100644 express/blocks/cards/cards.js diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css new file mode 100644 index 0000000..3b47ed4 --- /dev/null +++ b/express/blocks/cards/cards.css @@ -0,0 +1,82 @@ +main .section-wrapper.cards-container { + background-color: #F1F3F4; + padding: 0; +} + +main .cards-container .cards { + margin: 0 auto; + padding: 16px 16px 120px 16px; + display: flex; + flex-direction: column; +} + +main .cards-container .card { + box-sizing: border-box; + background-color: #FFF; + width: 344px; + margin: 0 auto 16px auto; + border-radius: 20px; + display: flex; + flex-direction: column; +} + +main .cards-container .card .hero { + padding: 32px 32px 0 32px; + border-top-left-radius: 20px; + border-top-right-radius: 20px; +} + +main .cards-container .card .content { + padding: 32px 32px 8px 32px; +} + +main .cards-container .card .content h2 { + text-align: center; + margin-bottom: 32px; +} + +main .cards-container .card .content p { + margin-top: 0; +} + +@media (min-width:900px) { + main .cards-container .cards { + padding-top: 80px; + width: 800px; + flex-direction: row; + } + + main .section-wrapper.cards-container { + background-color: unset; + } + + main .cards-container .cards { + + padding-bottom: 80px; + } + + main .cards-container .card { + width: 248px; + margin-right: 32px; + box-shadow: 0 4px 8px 2px rgba(102, 102, 102, 0.1); + } + + main .cards-container .card .hero { + background-color: #F1F3F4; + } + + main .cards-container .card .content { + padding: 16px 16px 8px 16px; + } + + main .cards-container .card .content h2 { + text-align: center; + font-size: 1.2rem; + margin-bottom: 8px; + } + + main .cards-container .card .content p { + font-size: 0.9rem; + } + +} \ No newline at end of file diff --git a/express/blocks/cards/cards.js b/express/blocks/cards/cards.js new file mode 100644 index 0000000..4c1f713 --- /dev/null +++ b/express/blocks/cards/cards.js @@ -0,0 +1,22 @@ +/* + * Copyright 2021 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. + */ +/* global */ + +export default function decorate($block) { + $block.querySelectorAll(':scope>div').forEach(($card) => { + $card.classList.add('card'); + if ($card.children.length > 1) { + $card.children[0].classList.add('hero'); + } + $card.lastElementChild.classList.add('content'); + }); +} diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 94e9a20..f6a84bb 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -161,7 +161,7 @@ function decorateBlocks() { if ($section) { $section.classList.add(`${blockName}-container`); } - const blocksWithOptions = ['checker-board', 'template-list', 'steps']; + const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { const options = blockName.substring(b.length + 1).split('-'); From 26f8707d986b0c6e1421f776b076a504fe7eb490 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 17:42:12 +0100 Subject: [PATCH 088/649] feat: hero section default bg --- express/styles/styles.css | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 5a5c246..6529643 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -232,7 +232,7 @@ main .hero { } main .hero.hero-noimage { - color: black; + background-color: #000; } main .hero h1 { @@ -249,8 +249,13 @@ main .hero h2 { font-weight: 400; } -main .hero p, main .hero a.button:any-link { - margin: 0; +main .hero p { + margin: 16px 0; + font-size: 1.25rem; +} + +main .hero a.button:any-link { + text-shadow: none; } From a16090d6d74ee490f093d5326bb201f982655aed Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 17:42:36 +0100 Subject: [PATCH 089/649] fix: skip empty options --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index f6a84bb..d3531bf 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -164,7 +164,7 @@ function decorateBlocks() { const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { - const options = blockName.substring(b.length + 1).split('-'); + const options = blockName.substring(b.length + 1).split('-').filter((opt) => !!opt); blockName = b; $block.classList.add(b); $block.classList.add(...options); From 202076e8a0dc04f33a12a5ba893f033cee65ba3a Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 17:42:55 +0100 Subject: [PATCH 090/649] feat: large, dark and featured cards --- express/blocks/cards/cards.css | 97 ++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 16 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index 3b47ed4..1242c7f 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -3,15 +3,14 @@ main .section-wrapper.cards-container { padding: 0; } -main .cards-container .cards { +main .cards { margin: 0 auto; padding: 16px 16px 120px 16px; display: flex; flex-direction: column; } -main .cards-container .card { - box-sizing: border-box; +main .cards .card { background-color: #FFF; width: 344px; margin: 0 auto 16px auto; @@ -20,27 +19,66 @@ main .cards-container .card { flex-direction: column; } -main .cards-container .card .hero { +main .cards .card .hero { + box-sizing: border-box; padding: 32px 32px 0 32px; border-top-left-radius: 20px; border-top-right-radius: 20px; + min-height: 136px; } -main .cards-container .card .content { +main .cards .card .content { padding: 32px 32px 8px 32px; } -main .cards-container .card .content h2 { +main .cards .card .content h2 { text-align: center; margin-bottom: 32px; } -main .cards-container .card .content p { +main .cards .card .content p { margin-top: 0; } +main .cards.dark .card { + background-color: #000; + color: #FFF; +} + +main .cards.dark .card .hero { + background-color: #343434; +} + +main .cards.large { + gap: 32px; +} + +main .cards.large .card { + margin: 0 auto; +} + +main .cards.large .card .hero { + min-height: 198px; +} + +main .cards.large .card .content { + padding: 32px 32px 8px 32px; +} + +main .cards.large .card .content h2 { + text-align: left; + font-size: 1.375rem; + line-height: 1.1; + margin-bottom: 32px; +} + +main .cards.large .card .content p { + text-align: left; + font-size: 1.125rem; +} + @media (min-width:900px) { - main .cards-container .cards { + main .cards { padding-top: 80px; width: 800px; flex-direction: row; @@ -50,33 +88,60 @@ main .cards-container .card .content p { background-color: unset; } - main .cards-container .cards { - + main .cards { padding-bottom: 80px; } - main .cards-container .card { + main .cards .card { width: 248px; margin-right: 32px; box-shadow: 0 4px 8px 2px rgba(102, 102, 102, 0.1); } - main .cards-container .card .hero { + main .cards .card .hero { background-color: #F1F3F4; } - main .cards-container .card .content { + main .cards .card .content { padding: 16px 16px 8px 16px; } - main .cards-container .card .content h2 { + main .cards .card .content h2 { text-align: center; - font-size: 1.2rem; + font-size: 1.25rem; + line-height: 1.2; margin-bottom: 8px; } - main .cards-container .card .content p { + main .cards .card .content p { font-size: 0.9rem; } + main .cards.large { + flex-wrap: wrap; + gap: 40px; + width: 724px; + } + + main .cards.large .card { + width: 342px; + } + + main .cards.featured .card:first-of-type { + width: 724px; + flex-direction: row; + } + + main .cards.featured .card:first-of-type .hero { + border-top-left-radius: 20px; + border-top-right-radius: 0; + border-bottom-left-radius: 20px; + min-height: unset; + min-width: 342px; + } + + main .cards.featured .card:first-of-type .content { + padding: 32px 40px 8px 40px; + min-height: 294px; + } } \ No newline at end of file From 0f6b8cf1026d75aed37f25a921b9e9ba7c360f91 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 18:06:04 +0100 Subject: [PATCH 091/649] feat: hero section tweaks --- express/styles/styles.css | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 6529643..54cb229 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -228,7 +228,7 @@ main .hero { color: white; text-shadow: 1px 1px 2px rgba(0,0,0,.25); position: relative; - padding: 120px 0; + padding: 120px 32px; } main .hero.hero-noimage { @@ -238,7 +238,7 @@ main .hero.hero-noimage { main .hero h1 { font-size: 45px; font-weight: 900; - margin: 0 16px; + margin: 0; line-height: 49px; } @@ -412,6 +412,15 @@ main .section-wrapper.steps-dark-container > div > h2 { margin: 0; } +main .section-wrapper.cards-container { + background-color: #F1F3F4; + padding: 0; +} + +main .section-wrapper.cards-container > div { + padding: 0; +} + @media (min-width:600px) { main .section-wrapper:first-of-type { padding: 80px 0; @@ -464,7 +473,7 @@ main .section-wrapper.steps-dark-container > div > h2 { } main .section-wrapper h2 { - text-align: left; + /* text-align: left; */ } main .section-wrapper h5 + p, @@ -477,6 +486,10 @@ main .section-wrapper.steps-dark-container > div > h2 { font-size: 13px; font-weight: 500; } + + main .section-wrapper.cards-container { + background-color: unset; + } } @media(min-width:1200px) { From da653c155cafb50fa65261109b654348014ab80b Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 18:06:27 +0100 Subject: [PATCH 092/649] feat: cards tweaks --- express/blocks/cards/cards.css | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index 1242c7f..ba0e521 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -1,11 +1,6 @@ -main .section-wrapper.cards-container { - background-color: #F1F3F4; - padding: 0; -} - main .cards { margin: 0 auto; - padding: 16px 16px 120px 16px; + padding: 16px 0 120px 0; display: flex; flex-direction: column; } @@ -84,10 +79,6 @@ main .cards.large .card .content p { flex-direction: row; } - main .section-wrapper.cards-container { - background-color: unset; - } - main .cards { padding-bottom: 80px; } @@ -95,6 +86,7 @@ main .cards.large .card .content p { main .cards .card { width: 248px; margin-right: 32px; + background-color: #FFF; box-shadow: 0 4px 8px 2px rgba(102, 102, 102, 0.1); } From 8cdeecc90c4a8e6380e39290adf58ed4f13df083 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 16 Mar 2021 12:38:18 -0700 Subject: [PATCH 093/649] chore: liniting --- express/blocks/layouts/layouts.js | 1 - 1 file changed, 1 deletion(-) diff --git a/express/blocks/layouts/layouts.js b/express/blocks/layouts/layouts.js index 9ceea09..48043ff 100644 --- a/express/blocks/layouts/layouts.js +++ b/express/blocks/layouts/layouts.js @@ -54,6 +54,5 @@ export default function decorate($block) { } $block.append($layout); - console.log($layout); }); } From 5bf6e0b3d351451f58ecd1cbbe7ebeb9d4c0381b Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 20:49:23 +0100 Subject: [PATCH 094/649] feat: quotes block --- express/blocks/quotes/quotes.css | 68 ++++++++++++++++++++++++++++++++ express/blocks/quotes/quotes.js | 35 ++++++++++++++++ express/scripts/scripts.js | 4 +- express/styles/styles.css | 18 +++++---- 4 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 express/blocks/quotes/quotes.css create mode 100644 express/blocks/quotes/quotes.js diff --git a/express/blocks/quotes/quotes.css b/express/blocks/quotes/quotes.css new file mode 100644 index 0000000..6aa35de --- /dev/null +++ b/express/blocks/quotes/quotes.css @@ -0,0 +1,68 @@ +main .quotes { + margin: 40px auto 0 auto; + padding-bottom: 120px; + display: flex; + flex-direction: column; + gap: 16px; +} + +main .quotes .quote { + border-radius: 20px; + margin: 0 auto; + background-color: #FFF; + width: 344px; + padding: 32px; + display: flex; + flex-direction: column; +} + +main .quotes .quote .content { + padding-top: 28px; + font-size: 1.125rem; + text-align: left; + flex-grow: 1; +} + +main .quotes .quote .content::before { + content: "“"; + display: block; + position: absolute; + margin-top: -50px; + width: 36px; + text-align: left; + font-size: 72px; + font-weight: 800; +} + +main .quotes .quote .author { + display: flex; + margin-top: 16px; + width: 100%; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + align-self: baseline; +} + +main .quotes .quote .author .image picture { + width: 42px; + padding-right: 16px; +} + +main .quotes .quote .author .summary p { + text-align: left; + margin: 0; + font-size: 0.75rem; + line-height: 1.2; +} + + +@media (min-width:900px) { + main .quotes { + margin-top: 56px; + padding-bottom: 80px; + flex-direction: row; + gap: 16px; + } + +} diff --git a/express/blocks/quotes/quotes.js b/express/blocks/quotes/quotes.js new file mode 100644 index 0000000..c5ae64a --- /dev/null +++ b/express/blocks/quotes/quotes.js @@ -0,0 +1,35 @@ +/* + * Copyright 2021 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. + */ +/* global */ + +import { createTag } from '../../scripts/scripts.js'; + +export default function decorate($block) { + $block.querySelectorAll(':scope>div').forEach(($card) => { + $card.classList.add('quote'); + if ($card.children.length > 1) { + const $author = $card.children[1]; + $author.classList.add('author'); + if ($author.querySelector('picture')) { + const $authorImg = createTag('div', { class: 'image' }); + $authorImg.appendChild($author.querySelector('picture')); + $author.appendChild($authorImg); + } + const $authorSummary = createTag('div', { class: 'summary' }); + Array.from($author.querySelectorAll('p')) + .filter(($p) => !!$p.textContent) + .forEach(($p) => $authorSummary.appendChild($p)); + $author.appendChild($authorSummary); + } + $card.firstElementChild.classList.add('content'); + }); +} diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index d3531bf..5f13ea1 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -159,9 +159,9 @@ function decorateBlocks() { let blockName = classes[0]; const $section = $block.closest('.section-wrapper'); if ($section) { - $section.classList.add(`${blockName}-container`); + $section.classList.add(`${blockName}-container`.replaceAll('--', '-')); } - const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards']; + const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards', 'quotes']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { const options = blockName.substring(b.length + 1).split('-').filter((opt) => !!opt); diff --git a/express/styles/styles.css b/express/styles/styles.css index 54cb229..018e97b 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -337,7 +337,6 @@ main .section-wrapper h2 { font-size: 36px; line-height: 40px; margin: 0; - text-align: left; font-weight: 800; } @@ -349,7 +348,6 @@ main .section-wrapper h3 { font-size: 28px; line-height: 32px; margin: 0; - text-align: left; font-weight: 800; } @@ -361,7 +359,6 @@ main .section-wrapper h4 { font-size: 22px; line-height: 26px; margin: 0; - text-align: left; font-weight: 800; } @@ -421,6 +418,17 @@ main .section-wrapper.cards-container > div { padding: 0; } +main .section-wrapper.quotes-dark-container { + background-color: #000; +} + +main .section-wrapper.quotes-dark-container h2, +main .section-wrapper.quotes-dark-container h3, +main .section-wrapper.quotes-dark-container h4, +main .section-wrapper.quotes-dark-container h5 { + color: #FFF; +} + @media (min-width:600px) { main .section-wrapper:first-of-type { padding: 80px 0; @@ -472,10 +480,6 @@ main .section-wrapper.cards-container > div { max-width: 1024px; } - main .section-wrapper h2 { - /* text-align: left; */ - } - main .section-wrapper h5 + p, main .section-wrapper p.button-container { text-align: unset; From 0645dbf5b7256abea9bf6423ee1736f43f412f17 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 16 Mar 2021 13:26:55 -0700 Subject: [PATCH 095/649] feat(page-list): initial page-list block --- express/blocks/columns/columns.css | 1 + express/blocks/page-list/page-list.css | 55 ++++++++++++++++++++ express/blocks/page-list/page-list.js | 69 ++++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 express/blocks/page-list/page-list.css create mode 100644 express/blocks/page-list/page-list.js diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 382337a..078c2e9 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -12,5 +12,6 @@ main .columns > div { main .section-wrapper div.columns > div > div { width: 50%; text-align: left; + padding: 10px; } } \ No newline at end of file diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css new file mode 100644 index 0000000..76c2675 --- /dev/null +++ b/express/blocks/page-list/page-list.css @@ -0,0 +1,55 @@ +main .page-list { + margin-top: 64px; + text-align: left; + } + + main .page-list-container > div { + max-width: 100%; + } + + + main .page-list { + display: flex; + flex-wrap: wrap; + justify-content: center; + } + + main .page-list .card { + display: flex; + flex-direction: column; + width: 240px; + margin: 16px; + cursor: pointer; + } + + main .page-list .card img { + height: 240px; + width: 240px; + object-fit: cover; + object-position: center center; + border-radius: 10px; + } + + + main .page-list .card-body { + padding: 0 15px; + + } + + main .page-list .card-body h3 { + padding: 0; + margin: 0; + font-size: 16px; + color: #1473E6; + font-weight: 600; + text-align: left; + line-height: 1.1em; + margin-bottom: 3px; + } + + main .page-list .card-body p { + font-size: 0.7em; + margin: 0; + text-align: left; + line-height: normal; + } \ No newline at end of file diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js new file mode 100644 index 0000000..2c4da03 --- /dev/null +++ b/express/blocks/page-list/page-list.js @@ -0,0 +1,69 @@ +/* + * Copyright 2021 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. + */ +/* global window fetch */ +/* eslint-disable import/named, import/extensions */ + +import { + createTag, + readBlockConfig, +} from '../../scripts/scripts.js'; + +function addPages(index, filter, $block) { + index.forEach((page) => { + if (page.path.includes(filter)) { + let { path } = page; + if (!path.startsWith(' ')) path = path.substr(1); + path = path.replace('.html', ''); + const $card = createTag('div', { class: 'card' }); + $card.innerHTML = `
+ +
+
+

${page.title}

+
`; + $card.addEventListener('click', () => { + window.location.href = path; + }); + $block.appendChild($card); + } + }); +} + +async function fetchIndex() { + /* + const locale = getLocale(); + const indexURL = locale === 'en' ? '/express/query-index.json' : `/${locale}/query-index.json`; + */ + + const indexURL = '/drafts/uncled/query-index.json'; + try { + const resp = await fetch(indexURL); + const json = await resp.json(); + // eslint-disable-next-line no-console + console.log(`${indexURL}: ${json.data.length}`); + return (json.data); + } catch (e) { + // something went wrong + return ([]); + } +} + +async function decoratePageList($block) { + const config = readBlockConfig($block); + $block.innerHTML = ''; + const index = await fetchIndex(); + addPages(index, config.filter, $block); +} + +export default function decorate($block) { + decoratePageList($block); +} From 17d38786ecb74d9e8c9181722f6ab270c01f48fc Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 16 Mar 2021 13:40:28 -0700 Subject: [PATCH 096/649] feat(page-list): initial page-list block --- express/blocks/page-list/page-list.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 2c4da03..191c0c2 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -20,9 +20,7 @@ import { function addPages(index, filter, $block) { index.forEach((page) => { if (page.path.includes(filter)) { - let { path } = page; - if (!path.startsWith(' ')) path = path.substr(1); - path = path.replace('.html', ''); + const { path } = page; const $card = createTag('div', { class: 'card' }); $card.innerHTML = `
From ccc7349bc2b98812234dc4d3b35b4e041e20d856 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 21:45:25 +0100 Subject: [PATCH 097/649] feat: banner block --- express/blocks/banner/banner.css | 14 ++++++++++++++ express/blocks/banner/banner.js | 12 ++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 express/blocks/banner/banner.css create mode 100644 express/blocks/banner/banner.js diff --git a/express/blocks/banner/banner.css b/express/blocks/banner/banner.css new file mode 100644 index 0000000..77553a1 --- /dev/null +++ b/express/blocks/banner/banner.css @@ -0,0 +1,14 @@ +main .banner { + border-radius: 20px; + background-color: #000; + color: #FFF; + padding: 32px; + margin: 32px auto; +} + +@media (min-width:900px) { + main .banner { + margin-top: 0; + margin-bottom: 80px; + } +} \ No newline at end of file diff --git a/express/blocks/banner/banner.js b/express/blocks/banner/banner.js new file mode 100644 index 0000000..77046f4 --- /dev/null +++ b/express/blocks/banner/banner.js @@ -0,0 +1,12 @@ +/* + * Copyright 2021 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. + */ +/* global */ From 8905c74a86b7c9b8d41d7ca6c13e6e3930555dd4 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 16 Mar 2021 21:46:18 +0100 Subject: [PATCH 098/649] refactor: tweaks --- express/blocks/cards/cards.css | 9 +++------ express/blocks/icon-list/icon-list.css | 2 ++ express/blocks/quotes/quotes.css | 6 ++++++ express/styles/styles.css | 21 +++++++++++++++++++-- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index ba0e521..4be249e 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -1,6 +1,6 @@ main .cards { margin: 0 auto; - padding: 16px 0 120px 0; + padding: 16px 0 56px 0; display: flex; flex-direction: column; } @@ -74,13 +74,10 @@ main .cards.large .card .content p { @media (min-width:900px) { main .cards { - padding-top: 80px; + padding-top: 0; width: 800px; flex-direction: row; - } - - main .cards { - padding-bottom: 80px; + padding-bottom: 0; } main .cards .card { diff --git a/express/blocks/icon-list/icon-list.css b/express/blocks/icon-list/icon-list.css index d90604a..6fe1194 100644 --- a/express/blocks/icon-list/icon-list.css +++ b/express/blocks/icon-list/icon-list.css @@ -3,6 +3,7 @@ main .icon-list { font-size: 1.125rem; width: 300px; margin: 0 auto; + padding-bottom: 80px; } main .icon-list > div { @@ -36,6 +37,7 @@ main .icon-list .icon { @media (min-width:900px) { main .icon-list { width: 792px; + padding-bottom: 0; } } diff --git a/express/blocks/quotes/quotes.css b/express/blocks/quotes/quotes.css index 6aa35de..6105cfc 100644 --- a/express/blocks/quotes/quotes.css +++ b/express/blocks/quotes/quotes.css @@ -7,6 +7,7 @@ main .quotes { } main .quotes .quote { + box-sizing: border-box; border-radius: 20px; margin: 0 auto; background-color: #FFF; @@ -63,6 +64,11 @@ main .quotes .quote .author .summary p { padding-bottom: 80px; flex-direction: row; gap: 16px; + width: 722px; + } + + main .quotes .quote { + width: 230px; } } diff --git a/express/styles/styles.css b/express/styles/styles.css index 018e97b..f867dd6 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -316,10 +316,14 @@ main .section-wrapper:first-of-type { padding: 120px 0; } -main .section-wrapper:not(:first-of-type) { +main .section-wrapper { padding-top: 120px; } +main .section-wrapper:first-of-type { + padding: 0; +} + main .section-wrapper > div { margin: auto; max-width: 672px; @@ -429,14 +433,22 @@ main .section-wrapper.quotes-dark-container h5 { color: #FFF; } +main .section-wrapper.banner-container { + padding-top: 0; +} + @media (min-width:600px) { main .section-wrapper:first-of-type { padding: 80px 0; } - main .section-wrapper:not(:first-of-type) { + main .section-wrapper { padding-top: 80px; } + + main .section-wrapper:first-of-type { + padding-top: 0; + } main .section-wrapper h2 { font-size: 36px; @@ -492,8 +504,13 @@ main .section-wrapper.quotes-dark-container h5 { } main .section-wrapper.cards-container { + padding-top: 80px; background-color: unset; } + + main .section-wrapper.banner-container { + padding-top: 80px; + } } @media(min-width:1200px) { From b112cca69f6a64fcf504419b3f0108b4e2ab730b Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 16 Mar 2021 14:58:19 -0700 Subject: [PATCH 099/649] chore: add sitemap stub --- express/sitemap.xml | 6 + sitemap.xml | 30741 ------------------------------------------ 2 files changed, 6 insertions(+), 30741 deletions(-) create mode 100644 express/sitemap.xml delete mode 100644 sitemap.xml diff --git a/express/sitemap.xml b/express/sitemap.xml new file mode 100644 index 0000000..8309b4c --- /dev/null +++ b/express/sitemap.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml deleted file mode 100644 index b92be85..0000000 --- a/sitemap.xml +++ /dev/null @@ -1,30741 +0,0 @@ - - - - - https://adobe.com/express/de-DE/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/es-ES/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/it-IT/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/add-music-to-video - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/advertisement-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/advertisement-maker/cyber-monday - - - - - - - - - https://adobe.com/express/make/advertisement-maker/cyber-monday - - - - - - - - - https://adobe.com/express/pt-BR/make/advertisement-maker/cyber-monday - - - - - - - - - https://adobe.com/express/es-ES/make/advertisement-maker/cyber-monday - - - - - - - - - https://adobe.com/express/it-IT/make/advertisement-maker/cyber-monday - - - - - - - - - https://adobe.com/express/fr-FR/make/advertisement-maker/cyber-monday - - - - - - - - - https://adobe.com/express/fi-FI/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/advertisement-maker/facebook - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/agenda - - - - - - - - - https://adobe.com/express/make/agenda - - - - - - - - - https://adobe.com/express/pt-BR/make/agenda - - - - - - - - - https://adobe.com/express/es-ES/make/agenda - - - - - - - - - https://adobe.com/express/it-IT/make/agenda - - - - - - - - - https://adobe.com/express/fr-FR/make/agenda - - - - - - - - - https://adobe.com/express/fi-FI/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/album-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/es-ES/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/it-IT/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/album-cover-maker/graduation - - - - - - - - - - - - https://adobe.com/express/make/background-maker - - - - - https://adobe.com/express/ja-JP/make/background-maker - - - - - https://adobe.com/express/de-DE/make/background-maker/zoom - - - - - - - - - https://adobe.com/express/make/background-maker/zoom - - - - - - - - - https://adobe.com/express/pt-BR/make/background-maker/zoom - - - - - - - - - https://adobe.com/express/es-ES/make/background-maker/zoom - - - - - - - - - https://adobe.com/express/it-IT/make/background-maker/zoom - - - - - - - - - https://adobe.com/express/fr-FR/make/background-maker/zoom - - - - - - - - - https://adobe.com/express/fi-FI/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/badge-maker - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/banner-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/banner-maker/etsy-banners - - - - - - - - - - - https://adobe.com/express/make/banner-maker/etsy-banners - - - - - - - - - - - https://adobe.com/express/ko-KR/make/banner-maker/etsy-banners - - - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker/etsy-banners - - - - - - - - - - - https://adobe.com/express/nl-NL/make/banner-maker/etsy-banners - - - - - - - - - - - https://adobe.com/express/da-DK/make/banner-maker/etsy-banners - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/banner-maker/etsy-banners - - - - - - - - - - - https://adobe.com/express/sv-SE/make/banner-maker/etsy-banners - - - - - - - - - - - https://adobe.com/express/fi-FI/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/banner-maker/facebook-covers - - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/facebook-covers/christmas - - - - https://adobe.com/express/make/banner-maker/graphic - - - - https://adobe.com/express/fi-FI/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/banner-maker/linkedin - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/banner-maker/soundcloud - - - - - - - - - https://adobe.com/express/make/banner-maker/soundcloud - - - - - - - - - https://adobe.com/express/pt-BR/make/banner-maker/soundcloud - - - - - - - - - https://adobe.com/express/es-ES/make/banner-maker/soundcloud - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker/soundcloud - - - - - - - - - https://adobe.com/express/fr-FR/make/banner-maker/soundcloud - - - - - - - - - https://adobe.com/express/fi-FI/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/banner-maker/tumblr-banners - - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/twitch-banners - - - - https://adobe.com/express/fi-FI/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/banner-maker/twitter-headers - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/vinyl - - - - https://adobe.com/express/de-DE/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/es-ES/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/banner-maker/website - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/banner-maker/youtube - - - - - - - - - - - - - - https://adobe.com/express/make/billboard - - - - https://adobe.com/express/de-DE/make/bingo-cards/quarantine - - - - - - - - https://adobe.com/express/make/bingo-cards/quarantine - - - - - - - - https://adobe.com/express/es-ES/make/bingo-cards/quarantine - - - - - - - - https://adobe.com/express/it-IT/make/bingo-cards/quarantine - - - - - - - - https://adobe.com/express/fr-FR/make/bingo-cards/quarantine - - - - - - - - https://adobe.com/express/make/black-lives-matter - - - - https://adobe.com/express/de-DE/make/blank-calendar - - - - - - - - - - - https://adobe.com/express/make/blank-calendar - - - - - - - - - - - https://adobe.com/express/ko-KR/make/blank-calendar - - - - - - - - - - - https://adobe.com/express/pt-BR/make/blank-calendar - - - - - - - - - - - https://adobe.com/express/es-ES/make/blank-calendar - - - - - - - - - - - https://adobe.com/express/it-IT/make/blank-calendar - - - - - - - - - - - https://adobe.com/express/fr-FR/make/blank-calendar - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/blank-calendar - - - - - - - - - - - https://adobe.com/express/de-DE/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/book-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/book-cover-maker/cook - - - - - - - - - https://adobe.com/express/make/book-cover-maker/cook - - - - - - - - - https://adobe.com/express/pt-BR/make/book-cover-maker/cook - - - - - - - - - https://adobe.com/express/es-ES/make/book-cover-maker/cook - - - - - - - - - https://adobe.com/express/it-IT/make/book-cover-maker/cook - - - - - - - - - https://adobe.com/express/fr-FR/make/book-cover-maker/cook - - - - - - - - - https://adobe.com/express/make/book-review - - - - https://adobe.com/express/fi-FI/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/brochure-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/business-plans - - - - - - - - - https://adobe.com/express/make/business-plans - - - - - - - - - https://adobe.com/express/pt-BR/make/business-plans - - - - - - - - - https://adobe.com/express/es-ES/make/business-plans - - - - - - - - - https://adobe.com/express/it-IT/make/business-plans - - - - - - - - - https://adobe.com/express/fr-FR/make/business-plans - - - - - - - - - https://adobe.com/express/fi-FI/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/calendar-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/birthday-cards-with-quotes - - - - - - - - - https://adobe.com/express/make/card-maker/birthday-cards-with-quotes - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/birthday-cards-with-quotes - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/birthday-cards-with-quotes - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/birthday-cards-with-quotes - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/birthday-cards-with-quotes - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/birthday/covid - - - - - - - - - - https://adobe.com/express/make/card-maker/birthday/covid - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/birthday/covid - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/birthday/covid - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/birthday/covid - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/birthday/covid - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/birthday/covid - - - - - - - - - - https://adobe.com/express/make/card-maker/birthday/group - - - - https://adobe.com/express/make/card-maker/birthday/mother - - - - https://adobe.com/express/fi-FI/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/business - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/business/baker - - - - - https://adobe.com/express/ja-JP/make/card-maker/business/baker - - - - - https://adobe.com/express/make/card-maker/business/dj - - - - https://adobe.com/express/make/card-maker/business/floral - - - - https://adobe.com/express/de-DE/make/card-maker/business/qr-code - - - - - - - - - - - https://adobe.com/express/make/card-maker/business/qr-code - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/business/qr-code - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/business/qr-code - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/business/qr-code - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/business/qr-code - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/business/qr-code - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/business/qr-code - - - - - - - - - - - https://adobe.com/express/make/card-maker/business/salon - - - - https://adobe.com/express/make/card-maker/business/student - - - - - https://adobe.com/express/nb-NO/make/card-maker/business/student - - - - - https://adobe.com/express/fi-FI/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/card-maker/christmas - - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/christmas/funny - - - - https://adobe.com/express/make/card-maker/christmas/photo - - - - https://adobe.com/express/de-DE/make/card-maker/easter - - - - - - - - - https://adobe.com/express/make/card-maker/easter - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/easter - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/easter - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/easter - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/easter - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/ecards - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/father - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/flashcards - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/holidays - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/id - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/love - - - - - - - - - - - https://adobe.com/express/make/card-maker/love - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/love - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/love - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/love - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/love - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/love - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/love - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/loyalty - - - - - - - - - - https://adobe.com/express/make/card-maker/loyalty - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/loyalty - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/loyalty - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/loyalty - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/loyalty - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/loyalty - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/card-maker/mother - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/new-year - - - - - - - - - - - https://adobe.com/express/make/card-maker/new-year - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/new-year - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/new-year - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/new-year - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/new-year - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/new-year - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/new-year - - - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/postcards - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/printable - - - - https://adobe.com/express/fi-FI/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/recipes - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/save-the-dates - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/thank-you - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/thank-you/group - - - - https://adobe.com/express/de-DE/make/card-maker/thanksgiving - - - - - - - - - https://adobe.com/express/make/card-maker/thanksgiving - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/thanksgiving - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/thanksgiving - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/thanksgiving - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/thanksgiving - - - - - - - - - https://adobe.com/express/fi-FI/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/card-maker/valentines-day - - - - - - - - - - - - - - - - https://adobe.com/express/make/card-maker/welcome/group - - - - https://adobe.com/express/fi-FI/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/certificate-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/make/certificate-maker/appreciation - - - - https://adobe.com/express/make/certificate-maker/completion - - - - https://adobe.com/express/make/certificate-maker/participation - - - - https://adobe.com/express/de-DE/make/certificate-maker/recognition - - - - - - - - - - - https://adobe.com/express/make/certificate-maker/recognition - - - - - - - - - - - https://adobe.com/express/ko-KR/make/certificate-maker/recognition - - - - - - - - - - - https://adobe.com/express/pt-BR/make/certificate-maker/recognition - - - - - - - - - - - https://adobe.com/express/es-ES/make/certificate-maker/recognition - - - - - - - - - - - https://adobe.com/express/it-IT/make/certificate-maker/recognition - - - - - - - - - - - https://adobe.com/express/fr-FR/make/certificate-maker/recognition - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/certificate-maker/recognition - - - - - - - - - - - https://adobe.com/express/make/change-of-address - - - - https://adobe.com/express/de-DE/make/charts - - - - - - - - - https://adobe.com/express/make/charts - - - - - - - - - https://adobe.com/express/pt-BR/make/charts - - - - - - - - - https://adobe.com/express/es-ES/make/charts - - - - - - - - - https://adobe.com/express/it-IT/make/charts - - - - - - - - - https://adobe.com/express/fr-FR/make/charts - - - - - - - - - https://adobe.com/express/de-DE/make/charts/bar-graph - - - - - - - - - https://adobe.com/express/make/charts/bar-graph - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/bar-graph - - - - - - - - - https://adobe.com/express/es-ES/make/charts/bar-graph - - - - - - - - - https://adobe.com/express/it-IT/make/charts/bar-graph - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/bar-graph - - - - - - - - - https://adobe.com/express/de-DE/make/charts/comparative - - - - - - - - - - - https://adobe.com/express/make/charts/comparative - - - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/comparative - - - - - - - - - - - https://adobe.com/express/es-ES/make/charts/comparative - - - - - - - - - - - https://adobe.com/express/it-IT/make/charts/comparative - - - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/comparative - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/charts/comparative - - - - - - - - - - - https://adobe.com/express/ja-JP/make/charts/comparative - - - - - - - - - - - https://adobe.com/express/de-DE/make/charts/flow - - - - - - - - - https://adobe.com/express/make/charts/flow - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/flow - - - - - - - - - https://adobe.com/express/es-ES/make/charts/flow - - - - - - - - - https://adobe.com/express/it-IT/make/charts/flow - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/flow - - - - - - - - - https://adobe.com/express/de-DE/make/charts/gantt - - - - - - - - - - https://adobe.com/express/make/charts/gantt - - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/gantt - - - - - - - - - - https://adobe.com/express/es-ES/make/charts/gantt - - - - - - - - - - https://adobe.com/express/it-IT/make/charts/gantt - - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/gantt - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/charts/gantt - - - - - - - - - - https://adobe.com/express/de-DE/make/charts/line-graph - - - - - - - - - https://adobe.com/express/make/charts/line-graph - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/line-graph - - - - - - - - - https://adobe.com/express/es-ES/make/charts/line-graph - - - - - - - - - https://adobe.com/express/it-IT/make/charts/line-graph - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/line-graph - - - - - - - - - https://adobe.com/express/de-DE/make/charts/organization - - - - - - - - - - - https://adobe.com/express/make/charts/organization - - - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/organization - - - - - - - - - - - https://adobe.com/express/es-ES/make/charts/organization - - - - - - - - - - - https://adobe.com/express/it-IT/make/charts/organization - - - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/organization - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/charts/organization - - - - - - - - - - - https://adobe.com/express/ja-JP/make/charts/organization - - - - - - - - - - - https://adobe.com/express/de-DE/make/charts/pie-chart - - - - - - - - - https://adobe.com/express/make/charts/pie-chart - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/pie-chart - - - - - - - - - https://adobe.com/express/es-ES/make/charts/pie-chart - - - - - - - - - https://adobe.com/express/it-IT/make/charts/pie-chart - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/pie-chart - - - - - - - - - https://adobe.com/express/de-DE/make/charts/seating - - - - - - - - - - - https://adobe.com/express/make/charts/seating - - - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/seating - - - - - - - - - - - https://adobe.com/express/es-ES/make/charts/seating - - - - - - - - - - - https://adobe.com/express/it-IT/make/charts/seating - - - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/seating - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/charts/seating - - - - - - - - - - - https://adobe.com/express/ja-JP/make/charts/seating - - - - - - - - - - - https://adobe.com/express/de-DE/make/charts/seating/wedding - - - - - - - - - - - https://adobe.com/express/make/charts/seating/wedding - - - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/seating/wedding - - - - - - - - - - - https://adobe.com/express/es-ES/make/charts/seating/wedding - - - - - - - - - - - https://adobe.com/express/it-IT/make/charts/seating/wedding - - - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/seating/wedding - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/charts/seating/wedding - - - - - - - - - - - https://adobe.com/express/ja-JP/make/charts/seating/wedding - - - - - - - - - - - https://adobe.com/express/de-DE/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/charts/venn-diagram - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/checklist-templates - - - - - - - - - - - https://adobe.com/express/make/checklist-templates - - - - - - - - - - - https://adobe.com/express/ko-KR/make/checklist-templates - - - - - - - - - - - https://adobe.com/express/pt-BR/make/checklist-templates - - - - - - - - - - - https://adobe.com/express/es-ES/make/checklist-templates - - - - - - - - - - - https://adobe.com/express/it-IT/make/checklist-templates - - - - - - - - - - - https://adobe.com/express/fr-FR/make/checklist-templates - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/checklist-templates - - - - - - - - - - - https://adobe.com/express/de-DE/make/christmas-greetings - - - - - - - - - https://adobe.com/express/make/christmas-greetings - - - - - - - - - https://adobe.com/express/pt-BR/make/christmas-greetings - - - - - - - - - https://adobe.com/express/es-ES/make/christmas-greetings - - - - - - - - - https://adobe.com/express/it-IT/make/christmas-greetings - - - - - - - - - https://adobe.com/express/fr-FR/make/christmas-greetings - - - - - - - - - https://adobe.com/express/de-DE/make/class-photo - - - - - - - - - - - https://adobe.com/express/make/class-photo - - - - - - - - - - - https://adobe.com/express/ko-KR/make/class-photo - - - - - - - - - - - https://adobe.com/express/pt-BR/make/class-photo - - - - - - - - - - - https://adobe.com/express/es-ES/make/class-photo - - - - - - - - - - - https://adobe.com/express/it-IT/make/class-photo - - - - - - - - - - - https://adobe.com/express/fr-FR/make/class-photo - - - - - - - - - - - https://adobe.com/express/ja-JP/make/class-photo - - - - - - - - - - - https://adobe.com/express/de-DE/make/collage-maker/music - - - - - - - - - https://adobe.com/express/make/collage-maker/music - - - - - - - - - https://adobe.com/express/pt-BR/make/collage-maker/music - - - - - - - - - https://adobe.com/express/es-ES/make/collage-maker/music - - - - - - - - - https://adobe.com/express/it-IT/make/collage-maker/music - - - - - - - - - https://adobe.com/express/fr-FR/make/collage-maker/music - - - - - - - - - https://adobe.com/express/make/collage-maker/side-by-side - - - - https://adobe.com/express/de-DE/make/color-pages - - - - - - - - - - https://adobe.com/express/make/color-pages - - - - - - - - - - https://adobe.com/express/pt-BR/make/color-pages - - - - - - - - - - https://adobe.com/express/es-ES/make/color-pages - - - - - - - - - - https://adobe.com/express/it-IT/make/color-pages - - - - - - - - - - https://adobe.com/express/fr-FR/make/color-pages - - - - - - - - - - https://adobe.com/express/nb-NO/make/color-pages - - - - - - - - - - https://adobe.com/express/de-DE/make/color-palette - - - - - - - - - https://adobe.com/express/make/color-palette - - - - - - - - - https://adobe.com/express/pt-BR/make/color-palette - - - - - - - - - https://adobe.com/express/es-ES/make/color-palette - - - - - - - - - https://adobe.com/express/it-IT/make/color-palette - - - - - - - - - https://adobe.com/express/fr-FR/make/color-palette - - - - - - - - - https://adobe.com/express/de-DE/make/comic-strips - - - - - - - - - https://adobe.com/express/make/comic-strips - - - - - - - - - https://adobe.com/express/pt-BR/make/comic-strips - - - - - - - - - https://adobe.com/express/es-ES/make/comic-strips - - - - - - - - - https://adobe.com/express/it-IT/make/comic-strips - - - - - - - - - https://adobe.com/express/fr-FR/make/comic-strips - - - - - - - - - https://adobe.com/express/fi-FI/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/coupon-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/cover-letters - - - - - - - - - https://adobe.com/express/make/cover-letters - - - - - - - - - https://adobe.com/express/pt-BR/make/cover-letters - - - - - - - - - https://adobe.com/express/es-ES/make/cover-letters - - - - - - - - - https://adobe.com/express/it-IT/make/cover-letters - - - - - - - - - https://adobe.com/express/fr-FR/make/cover-letters - - - - - - - - - https://adobe.com/express/de-DE/make/cover-maker/notebook - - - - - - - - - - https://adobe.com/express/make/cover-maker/notebook - - - - - - - - - - https://adobe.com/express/pt-BR/make/cover-maker/notebook - - - - - - - - - - https://adobe.com/express/es-ES/make/cover-maker/notebook - - - - - - - - - - https://adobe.com/express/it-IT/make/cover-maker/notebook - - - - - - - - - - https://adobe.com/express/fr-FR/make/cover-maker/notebook - - - - - - - - - - https://adobe.com/express/ja-JP/make/cover-maker/notebook - - - - - - - - - - https://adobe.com/express/de-DE/make/curriculum-vitae - - - - - - - - - https://adobe.com/express/make/curriculum-vitae - - - - - - - - - https://adobe.com/express/pt-BR/make/curriculum-vitae - - - - - - - - - https://adobe.com/express/es-ES/make/curriculum-vitae - - - - - - - - - https://adobe.com/express/it-IT/make/curriculum-vitae - - - - - - - - - https://adobe.com/express/fr-FR/make/curriculum-vitae - - - - - - - - - https://adobe.com/express/de-DE/make/design/best-logos-for-brand - - - - - - - - - https://adobe.com/express/make/design/best-logos-for-brand - - - - - - - - - https://adobe.com/express/pt-BR/make/design/best-logos-for-brand - - - - - - - - - https://adobe.com/express/es-ES/make/design/best-logos-for-brand - - - - - - - - - https://adobe.com/express/it-IT/make/design/best-logos-for-brand - - - - - - - - - https://adobe.com/express/fr-FR/make/design/best-logos-for-brand - - - - - - - - - https://adobe.com/express/de-DE/make/design/seller-collection - - - - - - - - - - https://adobe.com/express/make/design/seller-collection - - - - - - - - - - https://adobe.com/express/pt-BR/make/design/seller-collection - - - - - - - - - - https://adobe.com/express/es-ES/make/design/seller-collection - - - - - - - - - - https://adobe.com/express/it-IT/make/design/seller-collection - - - - - - - - - - https://adobe.com/express/fr-FR/make/design/seller-collection - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/design/seller-collection - - - - - - - - - - https://adobe.com/express/make/design/top-templates-of-2019 - - - - https://adobe.com/express/make/door-hanger - - - - https://adobe.com/express/de-DE/make/ebook - - - - - - - - - - - https://adobe.com/express/make/ebook - - - - - - - - - - - https://adobe.com/express/pt-BR/make/ebook - - - - - - - - - - - https://adobe.com/express/es-ES/make/ebook - - - - - - - - - - - https://adobe.com/express/it-IT/make/ebook - - - - - - - - - - - https://adobe.com/express/fr-FR/make/ebook - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/ebook - - - - - - - - - - - https://adobe.com/express/nb-NO/make/ebook - - - - - - - - - - - https://adobe.com/express/de-DE/make/event-calendar - - - - - - - - - - - https://adobe.com/express/make/event-calendar - - - - - - - - - - - https://adobe.com/express/pt-BR/make/event-calendar - - - - - - - - - - - https://adobe.com/express/es-ES/make/event-calendar - - - - - - - - - - - https://adobe.com/express/it-IT/make/event-calendar - - - - - - - - - - - https://adobe.com/express/fr-FR/make/event-calendar - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/event-calendar - - - - - - - - - - - https://adobe.com/express/ja-JP/make/event-calendar - - - - - - - - - - - https://adobe.com/express/fi-FI/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/event-program-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/explainer-video-maker - - - - - - - - - - - - - - - https://adobe.com/express/make/express-pie-chart - - - - https://adobe.com/express/make/express-timeline - - - - https://adobe.com/express/de-DE/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/es-ES/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/it-IT/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/facebook-post - - - - - - - - - - - - https://adobe.com/express/de-DE/make/facebook-shop - - - - - - - - - https://adobe.com/express/make/facebook-shop - - - - - - - - - https://adobe.com/express/pt-BR/make/facebook-shop - - - - - - - - - https://adobe.com/express/es-ES/make/facebook-shop - - - - - - - - - https://adobe.com/express/it-IT/make/facebook-shop - - - - - - - - - https://adobe.com/express/fr-FR/make/facebook-shop - - - - - - - - - https://adobe.com/express/de-DE/make/family-tree - - - - - - - - - - - https://adobe.com/express/make/family-tree - - - - - - - - - - - https://adobe.com/express/ko-KR/make/family-tree - - - - - - - - - - - https://adobe.com/express/pt-BR/make/family-tree - - - - - - - - - - - https://adobe.com/express/es-ES/make/family-tree - - - - - - - - - - - https://adobe.com/express/it-IT/make/family-tree - - - - - - - - - - - https://adobe.com/express/fr-FR/make/family-tree - - - - - - - - - - - https://adobe.com/express/sv-SE/make/family-tree - - - - - - - - - - - https://adobe.com/express/fi-FI/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/flyer-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/flyer-maker/business - - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/flyer-maker/church - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/flyer-maker/clubs - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/flyer-maker/grand-opening - - - - - - - - - - - - - - - - https://adobe.com/express/make/flyer-maker/lawn-care - - - - https://adobe.com/express/fi-FI/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/flyer-maker/party - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/flyer-maker/real-estate - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/free-animated-giphy-stickers - - - - - - - - - https://adobe.com/express/make/free-animated-giphy-stickers - - - - - - - - - https://adobe.com/express/pt-BR/make/free-animated-giphy-stickers - - - - - - - - - https://adobe.com/express/es-ES/make/free-animated-giphy-stickers - - - - - - - - - https://adobe.com/express/it-IT/make/free-animated-giphy-stickers - - - - - - - - - https://adobe.com/express/fr-FR/make/free-animated-giphy-stickers - - - - - - - - - https://adobe.com/express/de-DE/make/free-fonts - - - - - - - - - https://adobe.com/express/make/free-fonts - - - - - - - - - https://adobe.com/express/pt-BR/make/free-fonts - - - - - - - - - https://adobe.com/express/es-ES/make/free-fonts - - - - - - - - - https://adobe.com/express/it-IT/make/free-fonts - - - - - - - - - https://adobe.com/express/fr-FR/make/free-fonts - - - - - - - - - https://adobe.com/express/de-DE/make/free-icons - - - - - - - - - https://adobe.com/express/make/free-icons - - - - - - - - - https://adobe.com/express/pt-BR/make/free-icons - - - - - - - - - https://adobe.com/express/es-ES/make/free-icons - - - - - - - - - https://adobe.com/express/it-IT/make/free-icons - - - - - - - - - https://adobe.com/express/fr-FR/make/free-icons - - - - - - - - - https://adobe.com/express/de-DE/make/free-images - - - - - - - - - https://adobe.com/express/make/free-images - - - - - - - - - https://adobe.com/express/pt-BR/make/free-images - - - - - - - - - https://adobe.com/express/es-ES/make/free-images - - - - - - - - - https://adobe.com/express/it-IT/make/free-images - - - - - - - - - https://adobe.com/express/fr-FR/make/free-images - - - - - - - - - https://adobe.com/express/make/gfx - - - - https://adobe.com/express/fi-FI/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/gift-certificate-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/gift-tag-maker - - - - - - - - - - - - - - - https://adobe.com/express/make/grassroot-movement - - - - https://adobe.com/express/de-DE/make/halloween-party - - - - - - - - https://adobe.com/express/make/halloween-party - - - - - - - - https://adobe.com/express/es-ES/make/halloween-party - - - - - - - - https://adobe.com/express/it-IT/make/halloween-party - - - - - - - - https://adobe.com/express/fr-FR/make/halloween-party - - - - - - - - https://adobe.com/express/de-DE/make/ideas/banners - - - - - - - - - https://adobe.com/express/make/ideas/banners - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/banners - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/banners - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/banners - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/banners - - - - - - - - - https://adobe.com/express/de-DE/make/ideas/book-covers - - - - - - - - - https://adobe.com/express/make/ideas/book-covers - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/book-covers - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/book-covers - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/book-covers - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/book-covers - - - - - - - - - https://adobe.com/express/de-DE/make/ideas/brochures - - - - - - - - - https://adobe.com/express/make/ideas/brochures - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/brochures - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/brochures - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/brochures - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/brochures - - - - - - - - - https://adobe.com/express/de-DE/make/ideas/business-cards - - - - - - - - - https://adobe.com/express/make/ideas/business-cards - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/business-cards - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/business-cards - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/business-cards - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/business-cards - - - - - - - - - https://adobe.com/express/de-DE/make/ideas/flyers - - - - - - - - - https://adobe.com/express/make/ideas/flyers - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/flyers - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/flyers - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/flyers - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/flyers - - - - - - - - - https://adobe.com/express/make/ideas/happy-birthday - - - - https://adobe.com/express/de-DE/make/ideas/infographic - - - - - - - - - https://adobe.com/express/make/ideas/infographic - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/infographic - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/infographic - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/infographic - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/infographic - - - - - - - - - https://adobe.com/express/de-DE/make/ideas/logo - - - - - - - - - https://adobe.com/express/make/ideas/logo - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/logo - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/logo - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/logo - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/logo - - - - - - - - - https://adobe.com/express/de-DE/make/ideas/posters - - - - - - - - - https://adobe.com/express/make/ideas/posters - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/posters - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/posters - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/posters - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/posters - - - - - - - - - https://adobe.com/express/de-DE/make/ideas/youtube-banners - - - - - - - - - https://adobe.com/express/make/ideas/youtube-banners - - - - - - - - - https://adobe.com/express/pt-BR/make/ideas/youtube-banners - - - - - - - - - https://adobe.com/express/es-ES/make/ideas/youtube-banners - - - - - - - - - https://adobe.com/express/it-IT/make/ideas/youtube-banners - - - - - - - - - https://adobe.com/express/fr-FR/make/ideas/youtube-banners - - - - - - - - - https://adobe.com/express/de-DE/make/images/add-borders-to-photos - - - - - - - - - - - https://adobe.com/express/make/images/add-borders-to-photos - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/add-borders-to-photos - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/add-borders-to-photos - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/add-borders-to-photos - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/add-borders-to-photos - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/add-borders-to-photos - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/add-borders-to-photos - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/add-frame - - - - - - - - - - - https://adobe.com/express/make/images/add-frame - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/add-frame - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/add-frame - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/add-frame - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/add-frame - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/add-frame - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/add-frame - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/add-speech-bubbles-to-photos - - - - - - - - - - - https://adobe.com/express/make/images/add-speech-bubbles-to-photos - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/add-speech-bubbles-to-photos - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/add-speech-bubbles-to-photos - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/add-speech-bubbles-to-photos - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/add-speech-bubbles-to-photos - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/add-speech-bubbles-to-photos - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/add-speech-bubbles-to-photos - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/black-white-filter - - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/blur - - - - - - - - - - - - https://adobe.com/express/make/images/blur - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/blur - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/blur - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/blur - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/blur - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/blur - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/blur - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/blur - - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/change-background-colors - - - - - - - - - - - - https://adobe.com/express/make/images/combine-images - - - - - - - https://adobe.com/express/ko-KR/make/images/combine-images - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/combine-images - - - - - - - https://adobe.com/express/ja-JP/make/images/combine-images - - - - - - - https://adobe.com/express/de-DE/make/images/crop - - - - - - - - - - - - https://adobe.com/express/make/images/crop - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/crop - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/crop - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/crop - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/crop - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/crop - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/crop - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/crop - - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/filter - - - - - - - - - - - - https://adobe.com/express/make/images/filter - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/filter - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/filter - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/filter - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/filter - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/filter - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/filter - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/filter - - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/flip - - - - - - - - - - - - https://adobe.com/express/make/images/flip - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/flip - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/flip - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/flip - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/flip - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/flip - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/flip - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/flip - - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/mirror - - - - - - - - - - - - https://adobe.com/express/make/images/photo-montage - - - - https://adobe.com/express/de-DE/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/remove-background - - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/resize - - - - - - - - - - - - https://adobe.com/express/make/images/resize - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/resize - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/resize - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/resize - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/resize - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/resize - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/resize - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/resize - - - - - - - - - - - - https://adobe.com/express/de-DE/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/images/rotate - - - - - - - - - - - - - - https://adobe.com/express/make/images/unblur-images - - - - - - https://adobe.com/express/ko-KR/make/images/unblur-images - - - - - - https://adobe.com/express/ja-JP/make/images/unblur-images - - - - - - https://adobe.com/express/fi-FI/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/infographic-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/infographic/data-visualization - - - - - https://adobe.com/express/nb-NO/make/infographic/data-visualization - - - - - https://adobe.com/express/de-DE/make/instagram-shop - - - - - - - - - https://adobe.com/express/make/instagram-shop - - - - - - - - - https://adobe.com/express/pt-BR/make/instagram-shop - - - - - - - - - https://adobe.com/express/es-ES/make/instagram-shop - - - - - - - - - https://adobe.com/express/it-IT/make/instagram-shop - - - - - - - - - https://adobe.com/express/fr-FR/make/instagram-shop - - - - - - - - - https://adobe.com/express/de-DE/make/instagram-stories - - - - - - - - - - https://adobe.com/express/make/instagram-stories - - - - - - - - - - https://adobe.com/express/pt-BR/make/instagram-stories - - - - - - - - - - https://adobe.com/express/es-ES/make/instagram-stories - - - - - - - - - - https://adobe.com/express/it-IT/make/instagram-stories - - - - - - - - - - https://adobe.com/express/fr-FR/make/instagram-stories - - - - - - - - - - https://adobe.com/express/nb-NO/make/instagram-stories - - - - - - - - - - https://adobe.com/express/fi-FI/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/invitation-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/da-DK/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker/baby-showers - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/baptism - - - - - - - - - https://adobe.com/express/make/invitation-maker/baptism - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/baptism - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/baptism - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/baptism - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/baptism - - - - - - - - - https://adobe.com/express/fi-FI/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/invitation-maker/birthdays - - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/birthdays/first - - - - https://adobe.com/express/fi-FI/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/invitation-maker/bridal-shower - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/invitation-maker/email - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/engagement - - - - - - - - https://adobe.com/express/make/invitation-maker/engagement - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/engagement - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/engagement - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/engagement - - - - - - - - https://adobe.com/express/fi-FI/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/invitation-maker/graduation - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/griha-pravesh - - - - https://adobe.com/express/make/invitation-maker/hawaiian - - - - https://adobe.com/express/fi-FI/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/invitation-maker/party - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/potluck - - - - https://adobe.com/express/fi-FI/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker/quinceanera - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/invitation-maker/wedding - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/invitation-maker/wedding/digital - - - - - - - - - https://adobe.com/express/make/invitation-maker/wedding/digital - - - - - - - - - https://adobe.com/express/pt-BR/make/invitation-maker/wedding/digital - - - - - - - - - https://adobe.com/express/es-ES/make/invitation-maker/wedding/digital - - - - - - - - - https://adobe.com/express/it-IT/make/invitation-maker/wedding/digital - - - - - - - - - https://adobe.com/express/fr-FR/make/invitation-maker/wedding/digital - - - - - - - - - https://adobe.com/express/de-DE/make/invoice-generator - - - - - - - - - https://adobe.com/express/make/invoice-generator - - - - - - - - - https://adobe.com/express/pt-BR/make/invoice-generator - - - - - - - - - https://adobe.com/express/es-ES/make/invoice-generator - - - - - - - - - https://adobe.com/express/it-IT/make/invoice-generator - - - - - - - - - https://adobe.com/express/fr-FR/make/invoice-generator - - - - - - - - - https://adobe.com/express/de-DE/make/itineraries - - - - - - - - - https://adobe.com/express/make/itineraries - - - - - - - - - https://adobe.com/express/pt-BR/make/itineraries - - - - - - - - - https://adobe.com/express/es-ES/make/itineraries - - - - - - - - - https://adobe.com/express/it-IT/make/itineraries - - - - - - - - - https://adobe.com/express/fr-FR/make/itineraries - - - - - - - - - https://adobe.com/express/fi-FI/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/label-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/label-maker/beer - - - - - - - - - - - - - - - - https://adobe.com/express/make/label-maker/cloth - - - - https://adobe.com/express/de-DE/make/label-maker/water - - - - - - - - - https://adobe.com/express/make/label-maker/water - - - - - - - - - https://adobe.com/express/pt-BR/make/label-maker/water - - - - - - - - - https://adobe.com/express/es-ES/make/label-maker/water - - - - - - - - - https://adobe.com/express/it-IT/make/label-maker/water - - - - - - - - - https://adobe.com/express/fr-FR/make/label-maker/water - - - - - - - - - https://adobe.com/express/fi-FI/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/label-maker/wine - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/learn/calligraphy - - - - - - - - - https://adobe.com/express/make/learn/calligraphy - - - - - - - - - https://adobe.com/express/pt-BR/make/learn/calligraphy - - - - - - - - - https://adobe.com/express/es-ES/make/learn/calligraphy - - - - - - - - - https://adobe.com/express/it-IT/make/learn/calligraphy - - - - - - - - - https://adobe.com/express/fr-FR/make/learn/calligraphy - - - - - - - - - https://adobe.com/express/de-DE/make/learn/color-combinations - - - - - - - - - https://adobe.com/express/make/learn/color-combinations - - - - - - - - - https://adobe.com/express/pt-BR/make/learn/color-combinations - - - - - - - - - https://adobe.com/express/es-ES/make/learn/color-combinations - - - - - - - - - https://adobe.com/express/it-IT/make/learn/color-combinations - - - - - - - - - https://adobe.com/express/fr-FR/make/learn/color-combinations - - - - - - - - - https://adobe.com/express/de-DE/make/learn/modern-fonts - - - - - - - - - https://adobe.com/express/make/learn/modern-fonts - - - - - - - - - https://adobe.com/express/pt-BR/make/learn/modern-fonts - - - - - - - - - https://adobe.com/express/es-ES/make/learn/modern-fonts - - - - - - - - - https://adobe.com/express/it-IT/make/learn/modern-fonts - - - - - - - - - https://adobe.com/express/fr-FR/make/learn/modern-fonts - - - - - - - - - https://adobe.com/express/make/learn/resume - - - - https://adobe.com/express/make/learn/résumé - - - - https://adobe.com/express/de-DE/make/learn/top-social-media-sites - - - - - - - - - https://adobe.com/express/make/learn/top-social-media-sites - - - - - - - - - https://adobe.com/express/pt-BR/make/learn/top-social-media-sites - - - - - - - - - https://adobe.com/express/es-ES/make/learn/top-social-media-sites - - - - - - - - - https://adobe.com/express/it-IT/make/learn/top-social-media-sites - - - - - - - - - https://adobe.com/express/fr-FR/make/learn/top-social-media-sites - - - - - - - - - https://adobe.com/express/fi-FI/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/letterhead-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/letterhead-templates - - - - https://adobe.com/express/de-DE/make/letters/experience - - - - - - - https://adobe.com/express/make/letters/experience - - - - - - - https://adobe.com/express/pt-BR/make/letters/experience - - - - - - - https://adobe.com/express/es-ES/make/letters/experience - - - - - - - https://adobe.com/express/make/letters/letter-of-intent - - - - https://adobe.com/express/make/letters/recommendations - - - - https://adobe.com/express/fi-FI/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/logo-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/logo-maker/animated - - - - - - - - - - - https://adobe.com/express/make/logo-maker/animated - - - - - - - - - - - https://adobe.com/express/ko-KR/make/logo-maker/animated - - - - - - - - - - - https://adobe.com/express/pt-BR/make/logo-maker/animated - - - - - - - - - - - https://adobe.com/express/es-ES/make/logo-maker/animated - - - - - - - - - - - https://adobe.com/express/it-IT/make/logo-maker/animated - - - - - - - - - - - https://adobe.com/express/fr-FR/make/logo-maker/animated - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/logo-maker/animated - - - - - - - - - - - https://adobe.com/express/make/logo-maker/art - - - - - https://adobe.com/express/nb-NO/make/logo-maker/art - - - - - https://adobe.com/express/make/logo-maker/bakery - - - - https://adobe.com/express/make/logo-maker/bank - - - - https://adobe.com/express/make/logo-maker/basketball - - - - https://adobe.com/express/make/logo-maker/beauty - - - - https://adobe.com/express/make/logo-maker/cake - - - - - https://adobe.com/express/sv-SE/make/logo-maker/cake - - - - - https://adobe.com/express/make/logo-maker/camera - - - - https://adobe.com/express/make/logo-maker/car - - - - https://adobe.com/express/make/logo-maker/cat - - - - - https://adobe.com/express/ja-JP/make/logo-maker/cat - - - - - https://adobe.com/express/make/logo-maker/circle - - - - - https://adobe.com/express/zh-Hant-CN/make/logo-maker/circle - - - - - https://adobe.com/express/make/logo-maker/clothing - - - - - https://adobe.com/express/nb-NO/make/logo-maker/clothing - - - - - https://adobe.com/express/make/logo-maker/coffee - - - - - https://adobe.com/express/ja-JP/make/logo-maker/coffee - - - - - https://adobe.com/express/make/logo-maker/company - - - - - - https://adobe.com/express/ko-KR/make/logo-maker/company - - - - - - https://adobe.com/express/ja-JP/make/logo-maker/company - - - - - - https://adobe.com/express/make/logo-maker/construction - - - - - https://adobe.com/express/ja-JP/make/logo-maker/construction - - - - - https://adobe.com/express/make/logo-maker/cool - - - - - https://adobe.com/express/ja-JP/make/logo-maker/cool - - - - - https://adobe.com/express/make/logo-maker/crown - - - - https://adobe.com/express/make/logo-maker/dental - - - - https://adobe.com/express/make/logo-maker/dj - - - - https://adobe.com/express/make/logo-maker/dog - - - - https://adobe.com/express/make/logo-maker/eagle - - - - https://adobe.com/express/make/logo-maker/education - - - - https://adobe.com/express/make/logo-maker/electrical - - - - https://adobe.com/express/make/logo-maker/farm - - - - https://adobe.com/express/make/logo-maker/fashion - - - - https://adobe.com/express/make/logo-maker/fitness - - - - https://adobe.com/express/make/logo-maker/food - - - - https://adobe.com/express/make/logo-maker/football - - - - https://adobe.com/express/make/logo-maker/furniture - - - - - https://adobe.com/express/nb-NO/make/logo-maker/furniture - - - - - https://adobe.com/express/de-DE/make/logo-maker/game - - - - - - - - - https://adobe.com/express/make/logo-maker/game - - - - - - - - - https://adobe.com/express/pt-BR/make/logo-maker/game - - - - - - - - - https://adobe.com/express/es-ES/make/logo-maker/game - - - - - - - - - https://adobe.com/express/it-IT/make/logo-maker/game - - - - - - - - - https://adobe.com/express/fr-FR/make/logo-maker/game - - - - - - - - - https://adobe.com/express/make/logo-maker/heart - - - - - https://adobe.com/express/ja-JP/make/logo-maker/heart - - - - - https://adobe.com/express/make/logo-maker/hotel - - - - https://adobe.com/express/make/logo-maker/how-to-design-a-logo-for-your-business - - - - - - - - https://adobe.com/express/pt-BR/make/logo-maker/how-to-design-a-logo-for-your-business - - - - - - - - https://adobe.com/express/es-ES/make/logo-maker/how-to-design-a-logo-for-your-business - - - - - - - - https://adobe.com/express/it-IT/make/logo-maker/how-to-design-a-logo-for-your-business - - - - - - - - https://adobe.com/express/fr-FR/make/logo-maker/how-to-design-a-logo-for-your-business - - - - - - - - https://adobe.com/express/make/logo-maker/instagram - - - - https://adobe.com/express/make/logo-maker/letters - - - - - - https://adobe.com/express/zh-Hant-CN/make/logo-maker/letters - - - - - - https://adobe.com/express/nb-NO/make/logo-maker/letters - - - - - - https://adobe.com/express/make/logo-maker/medical - - - - https://adobe.com/express/make/logo-maker/mobile - - - - https://adobe.com/express/make/logo-maker/mountain - - - - https://adobe.com/express/make/logo-maker/movie - - - - https://adobe.com/express/make/logo-maker/music - - - - https://adobe.com/express/make/logo-maker/name - - - - https://adobe.com/express/make/logo-maker/numbers - - - - - https://adobe.com/express/ja-JP/make/logo-maker/numbers - - - - - https://adobe.com/express/make/logo-maker/online-radio - - - - https://adobe.com/express/make/logo-maker/pharmacy - - - - https://adobe.com/express/make/logo-maker/phone - - - - https://adobe.com/express/make/logo-maker/photography - - - - - https://adobe.com/express/zh-Hant-CN/make/logo-maker/photography - - - - - https://adobe.com/express/make/logo-maker/real-estate - - - - https://adobe.com/express/make/logo-maker/restaurant - - - - https://adobe.com/express/make/logo-maker/school - - - - - https://adobe.com/express/ja-JP/make/logo-maker/school - - - - - https://adobe.com/express/make/logo-maker/shop - - - - - https://adobe.com/express/ja-JP/make/logo-maker/shop - - - - - https://adobe.com/express/make/logo-maker/soccer - - - - https://adobe.com/express/make/logo-maker/sports - - - - https://adobe.com/express/make/logo-maker/team - - - - https://adobe.com/express/make/logo-maker/technology - - - - https://adobe.com/express/make/logo-maker/text - - - - - - https://adobe.com/express/ko-KR/make/logo-maker/text - - - - - - https://adobe.com/express/ja-JP/make/logo-maker/text - - - - - - https://adobe.com/express/make/logo-maker/travel - - - - https://adobe.com/express/make/logo-maker/tree - - - - - https://adobe.com/express/nb-NO/make/logo-maker/tree - - - - - https://adobe.com/express/make/logo-maker/twitch - - - - https://adobe.com/express/make/logo-maker/volleyball - - - - https://adobe.com/express/make/logo-maker/website - - - - https://adobe.com/express/make/logo-maker/wedding - - - - https://adobe.com/express/de-DE/make/logo-maker/youtube - - - - - - - - - https://adobe.com/express/make/logo-maker/youtube - - - - - - - - - https://adobe.com/express/pt-BR/make/logo-maker/youtube - - - - - - - - - https://adobe.com/express/es-ES/make/logo-maker/youtube - - - - - - - - - https://adobe.com/express/it-IT/make/logo-maker/youtube - - - - - - - - - https://adobe.com/express/fr-FR/make/logo-maker/youtube - - - - - - - - - https://adobe.com/express/fi-FI/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/magazine-cover-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/marketing-plans - - - - - - - - - https://adobe.com/express/make/marketing-plans - - - - - - - - - https://adobe.com/express/pt-BR/make/marketing-plans - - - - - - - - - https://adobe.com/express/es-ES/make/marketing-plans - - - - - - - - - https://adobe.com/express/it-IT/make/marketing-plans - - - - - - - - - https://adobe.com/express/fr-FR/make/marketing-plans - - - - - - - - - https://adobe.com/express/de-DE/make/meeting-minutes - - - - - - - - - https://adobe.com/express/make/meeting-minutes - - - - - - - - - https://adobe.com/express/pt-BR/make/meeting-minutes - - - - - - - - - https://adobe.com/express/es-ES/make/meeting-minutes - - - - - - - - - https://adobe.com/express/it-IT/make/meeting-minutes - - - - - - - - - https://adobe.com/express/fr-FR/make/meeting-minutes - - - - - - - - - https://adobe.com/express/fi-FI/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/meme-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/meme-maker/birthday - - - - https://adobe.com/express/make/meme-maker/dogs - - - - https://adobe.com/express/fi-FI/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/meme-maker/how-to-leverage-meme-for-your-social-media-marketing - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/memos - - - - - - - - - https://adobe.com/express/make/memos - - - - - - - - - https://adobe.com/express/pt-BR/make/memos - - - - - - - - - https://adobe.com/express/es-ES/make/memos - - - - - - - - - https://adobe.com/express/it-IT/make/memos - - - - - - - - - https://adobe.com/express/fr-FR/make/memos - - - - - - - - - https://adobe.com/express/fi-FI/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/menu-maker - - - - - - - - - - - - - - - - - - https://adobe.com/express/make/menu-maker/bar - - - - https://adobe.com/express/make/menu-maker/breakfast - - - - - https://adobe.com/express/nb-NO/make/menu-maker/breakfast - - - - - https://adobe.com/express/make/menu-maker/catering - - - - https://adobe.com/express/make/menu-maker/dinner - - - - https://adobe.com/express/make/menu-maker/thanksgiving - - - - https://adobe.com/express/de-DE/make/mind-map - - - - - - - - - - - - https://adobe.com/express/make/mind-map - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/mind-map - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/mind-map - - - - - - - - - - - - https://adobe.com/express/es-ES/make/mind-map - - - - - - - - - - - - https://adobe.com/express/it-IT/make/mind-map - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/mind-map - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/mind-map - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/mind-map - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/mood-board-maker - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/mug-design - - - - - - - - - - - https://adobe.com/express/make/mug-design - - - - - - - - - - - https://adobe.com/express/ko-KR/make/mug-design - - - - - - - - - - - https://adobe.com/express/pt-BR/make/mug-design - - - - - - - - - - - https://adobe.com/express/es-ES/make/mug-design - - - - - - - - - - - https://adobe.com/express/it-IT/make/mug-design - - - - - - - - - - - https://adobe.com/express/fr-FR/make/mug-design - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/mug-design - - - - - - - - - - - https://adobe.com/express/fi-FI/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/name-tag-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/networking-cards - - - - https://adobe.com/express/fi-FI/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/newsletter-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/note-card - - - - - - - - - - - https://adobe.com/express/make/note-card - - - - - - - - - - - https://adobe.com/express/pt-BR/make/note-card - - - - - - - - - - - https://adobe.com/express/es-ES/make/note-card - - - - - - - - - - - https://adobe.com/express/it-IT/make/note-card - - - - - - - - - - - https://adobe.com/express/fr-FR/make/note-card - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/note-card - - - - - - - - - - - https://adobe.com/express/ja-JP/make/note-card - - - - - - - - - - - https://adobe.com/express/de-DE/make/online-journal - - - - - - - - - - https://adobe.com/express/make/online-journal - - - - - - - - - - https://adobe.com/express/pt-BR/make/online-journal - - - - - - - - - - https://adobe.com/express/es-ES/make/online-journal - - - - - - - - - - https://adobe.com/express/it-IT/make/online-journal - - - - - - - - - - https://adobe.com/express/fr-FR/make/online-journal - - - - - - - - - - https://adobe.com/express/nb-NO/make/online-journal - - - - - - - - - - https://adobe.com/express/de-DE/make/online-portfolio - - - - - - - - - - https://adobe.com/express/make/online-portfolio - - - - - - - - - - https://adobe.com/express/pt-BR/make/online-portfolio - - - - - - - - - - https://adobe.com/express/es-ES/make/online-portfolio - - - - - - - - - - https://adobe.com/express/it-IT/make/online-portfolio - - - - - - - - - - https://adobe.com/express/fr-FR/make/online-portfolio - - - - - - - - - - https://adobe.com/express/sv-SE/make/online-portfolio - - - - - - - - - - https://adobe.com/express/fi-FI/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/pamphlet-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/photo-album/wedding - - - - - - - - - - https://adobe.com/express/make/photo-album/wedding - - - - - - - - - - https://adobe.com/express/pt-BR/make/photo-album/wedding - - - - - - - - - - https://adobe.com/express/es-ES/make/photo-album/wedding - - - - - - - - - - https://adobe.com/express/it-IT/make/photo-album/wedding - - - - - - - - - - https://adobe.com/express/fr-FR/make/photo-album/wedding - - - - - - - - - - https://adobe.com/express/ja-JP/make/photo-album/wedding - - - - - - - - - - https://adobe.com/express/de-DE/make/photo-animation-maker - - - - - - - - - - - https://adobe.com/express/make/photo-animation-maker - - - - - - - - - - - https://adobe.com/express/ko-KR/make/photo-animation-maker - - - - - - - - - - - https://adobe.com/express/pt-BR/make/photo-animation-maker - - - - - - - - - - - https://adobe.com/express/es-ES/make/photo-animation-maker - - - - - - - - - - - https://adobe.com/express/it-IT/make/photo-animation-maker - - - - - - - - - - - https://adobe.com/express/fr-FR/make/photo-animation-maker - - - - - - - - - - - https://adobe.com/express/ja-JP/make/photo-animation-maker - - - - - - - - - - - https://adobe.com/express/de-DE/make/photo-book - - - - - - - - - - - - https://adobe.com/express/make/photo-book - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/photo-book - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/photo-book - - - - - - - - - - - - https://adobe.com/express/es-ES/make/photo-book - - - - - - - - - - - - https://adobe.com/express/it-IT/make/photo-book - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/photo-book - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/photo-book - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/photo-book - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/photo-collage-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/photo-collage-maker/birthday - - - - - - - - - - - - - - - - https://adobe.com/express/make/photo-collage-maker/family - - - - - https://adobe.com/express/nb-NO/make/photo-collage-maker/family - - - - - https://adobe.com/express/make/photo-collage-maker/fashion - - - - https://adobe.com/express/make/photo-collage-maker/instagram - - - - - https://adobe.com/express/sv-SE/make/photo-collage-maker/instagram - - - - - https://adobe.com/express/make/photo-collage-maker/tumblr - - - - https://adobe.com/express/de-DE/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/photo-editor - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/photo-video - - - - - - - - - - https://adobe.com/express/make/photo-video - - - - - - - - - - https://adobe.com/express/pt-BR/make/photo-video - - - - - - - - - - https://adobe.com/express/es-ES/make/photo-video - - - - - - - - - - https://adobe.com/express/it-IT/make/photo-video - - - - - - - - - - https://adobe.com/express/fr-FR/make/photo-video - - - - - - - - - - https://adobe.com/express/sv-SE/make/photo-video - - - - - - - - - - https://adobe.com/express/de-DE/make/photoshop-alternative - - - - - - - - - - - https://adobe.com/express/make/photoshop-alternative - - - - - - - - - - - https://adobe.com/express/ko-KR/make/photoshop-alternative - - - - - - - - - - - https://adobe.com/express/pt-BR/make/photoshop-alternative - - - - - - - - - - - https://adobe.com/express/es-ES/make/photoshop-alternative - - - - - - - - - - - https://adobe.com/express/it-IT/make/photoshop-alternative - - - - - - - - - - - https://adobe.com/express/fr-FR/make/photoshop-alternative - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/photoshop-alternative - - - - - - - - - - - https://adobe.com/express/de-DE/make/pinterest-pins - - - - - - - - - https://adobe.com/express/make/pinterest-pins - - - - - - - - - https://adobe.com/express/pt-BR/make/pinterest-pins - - - - - - - - - https://adobe.com/express/es-ES/make/pinterest-pins - - - - - - - - - https://adobe.com/express/it-IT/make/pinterest-pins - - - - - - - - - https://adobe.com/express/fr-FR/make/pinterest-pins - - - - - - - - - https://adobe.com/express/make/post/how-to-convert-your-website-traffic-to-buyers - - - - https://adobe.com/express/make/post/how-to-increase-website-conversion - - - - - https://adobe.com/express/nb-NO/make/post/how-to-increase-website-conversion - - - - - https://adobe.com/express/make/post/how-to-start-a-small-business - - - - https://adobe.com/express/make/post/how-to-write-a-strong-business-plan - - - - - - https://adobe.com/express/pt-BR/make/post/how-to-write-a-strong-business-plan - - - - - - https://adobe.com/express/es-ES/make/post/how-to-write-a-strong-business-plan - - - - - - https://adobe.com/express/make/post/personal-branding - - - - https://adobe.com/express/make/post/tools-for-awesome-remote-design-collaboration - - - - - - - - https://adobe.com/express/pt-BR/make/post/tools-for-awesome-remote-design-collaboration - - - - - - - - https://adobe.com/express/es-ES/make/post/tools-for-awesome-remote-design-collaboration - - - - - - - - https://adobe.com/express/it-IT/make/post/tools-for-awesome-remote-design-collaboration - - - - - - - - https://adobe.com/express/fr-FR/make/post/tools-for-awesome-remote-design-collaboration - - - - - - - - https://adobe.com/express/de-DE/make/poster-maker/a3 - - - - - - - - - - - https://adobe.com/express/make/poster-maker/a3 - - - - - - - - - - - https://adobe.com/express/pt-BR/make/poster-maker/a3 - - - - - - - - - - - https://adobe.com/express/es-ES/make/poster-maker/a3 - - - - - - - - - - - https://adobe.com/express/it-IT/make/poster-maker/a3 - - - - - - - - - - - https://adobe.com/express/fr-FR/make/poster-maker/a3 - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/poster-maker/a3 - - - - - - - - - - - https://adobe.com/express/ja-JP/make/poster-maker/a3 - - - - - - - - - - - https://adobe.com/express/de-DE/make/poster-maker/bathroom - - - - - - - - - - - https://adobe.com/express/make/poster-maker/bathroom - - - - - - - - - - - https://adobe.com/express/pt-BR/make/poster-maker/bathroom - - - - - - - - - - - https://adobe.com/express/es-ES/make/poster-maker/bathroom - - - - - - - - - - - https://adobe.com/express/it-IT/make/poster-maker/bathroom - - - - - - - - - - - https://adobe.com/express/fr-FR/make/poster-maker/bathroom - - - - - - - - - - - https://adobe.com/express/ja-JP/make/poster-maker/bathroom - - - - - - - - - - - https://adobe.com/express/sv-SE/make/poster-maker/bathroom - - - - - - - - - - - https://adobe.com/express/make/poster-maker/classroom - - - - https://adobe.com/express/de-DE/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/es-ES/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/it-IT/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/poster-maker/school - - - - - - - - - - - - https://adobe.com/express/make/poster-maker/typography - - - - https://adobe.com/express/fi-FI/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/posters - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/posters/campaign-posters - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/posters/motivational-posters - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/posters/movie-posters - - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/posters/quote-posters - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/posters/social-distance - - - - - - - - - - https://adobe.com/express/make/posters/social-distance - - - - - - - - - - https://adobe.com/express/ko-KR/make/posters/social-distance - - - - - - - - - - https://adobe.com/express/pt-BR/make/posters/social-distance - - - - - - - - - - https://adobe.com/express/es-ES/make/posters/social-distance - - - - - - - - - - https://adobe.com/express/it-IT/make/posters/social-distance - - - - - - - - - - https://adobe.com/express/fr-FR/make/posters/social-distance - - - - - - - - - - https://adobe.com/express/de-DE/make/posters/stay-home-stay-safe - - - - - - - - - https://adobe.com/express/make/posters/stay-home-stay-safe - - - - - - - - - https://adobe.com/express/pt-BR/make/posters/stay-home-stay-safe - - - - - - - - - https://adobe.com/express/es-ES/make/posters/stay-home-stay-safe - - - - - - - - - https://adobe.com/express/it-IT/make/posters/stay-home-stay-safe - - - - - - - - - https://adobe.com/express/fr-FR/make/posters/stay-home-stay-safe - - - - - - - - - https://adobe.com/express/make/posters/twenty-one-pilots-contests - - - - https://adobe.com/express/de-DE/make/posters/wash-your-hands - - - - - - - - - - https://adobe.com/express/make/posters/wash-your-hands - - - - - - - - - - https://adobe.com/express/pt-BR/make/posters/wash-your-hands - - - - - - - - - - https://adobe.com/express/es-ES/make/posters/wash-your-hands - - - - - - - - - - https://adobe.com/express/it-IT/make/posters/wash-your-hands - - - - - - - - - - https://adobe.com/express/fr-FR/make/posters/wash-your-hands - - - - - - - - - - https://adobe.com/express/nb-NO/make/posters/wash-your-hands - - - - - - - - - - https://adobe.com/express/de-DE/make/posters/we-are-open - - - - - - - - - - https://adobe.com/express/make/posters/we-are-open - - - - - - - - - - https://adobe.com/express/ko-KR/make/posters/we-are-open - - - - - - - - - - https://adobe.com/express/pt-BR/make/posters/we-are-open - - - - - - - - - - https://adobe.com/express/es-ES/make/posters/we-are-open - - - - - - - - - - https://adobe.com/express/it-IT/make/posters/we-are-open - - - - - - - - - - https://adobe.com/express/fr-FR/make/posters/we-are-open - - - - - - - - - - https://adobe.com/express/fi-FI/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/presentation-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/press-kit-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/professional-bios - - - - - - - - - https://adobe.com/express/make/professional-bios - - - - - - - - - https://adobe.com/express/pt-BR/make/professional-bios - - - - - - - - - https://adobe.com/express/es-ES/make/professional-bios - - - - - - - - - https://adobe.com/express/it-IT/make/professional-bios - - - - - - - - - https://adobe.com/express/fr-FR/make/professional-bios - - - - - - - - - https://adobe.com/express/de-DE/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/es-ES/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/it-IT/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/profile-picture - - - - - - - - - - - - https://adobe.com/express/de-DE/make/quotations - - - - - - - - - - https://adobe.com/express/make/quotations - - - - - - - - - - https://adobe.com/express/pt-BR/make/quotations - - - - - - - - - - https://adobe.com/express/es-ES/make/quotations - - - - - - - - - - https://adobe.com/express/it-IT/make/quotations - - - - - - - - - - https://adobe.com/express/fr-FR/make/quotations - - - - - - - - - - https://adobe.com/express/nb-NO/make/quotations - - - - - - - - - - https://adobe.com/express/make/rack-card - - - - - https://adobe.com/express/nb-NO/make/rack-card - - - - - https://adobe.com/express/fi-FI/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/resume-builder - - - - - - - - - - - - - - - - https://adobe.com/express/make/resume-builder/freshers - - - - https://adobe.com/express/make/resume-builder/high-school - - - - - - - - https://adobe.com/express/pt-BR/make/resume-builder/high-school - - - - - - - - https://adobe.com/express/es-ES/make/resume-builder/high-school - - - - - - - - https://adobe.com/express/it-IT/make/resume-builder/high-school - - - - - - - - https://adobe.com/express/fr-FR/make/resume-builder/high-school - - - - - - - - https://adobe.com/express/fi-FI/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/schedule-maker - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/schedule-maker/college - - - - - - - - - - - - - - - https://adobe.com/express/make/scrapbook - - - - https://adobe.com/express/de-DE/make/shawty-pass - - - - - - - - - - https://adobe.com/express/make/shawty-pass - - - - - - - - - - https://adobe.com/express/pt-BR/make/shawty-pass - - - - - - - - - - https://adobe.com/express/es-ES/make/shawty-pass - - - - - - - - - - https://adobe.com/express/it-IT/make/shawty-pass - - - - - - - - - - https://adobe.com/express/fr-FR/make/shawty-pass - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/shawty-pass - - - - - - - - - - https://adobe.com/express/de-DE/make/signage - - - - - - - - - - - https://adobe.com/express/make/signage - - - - - - - - - - - https://adobe.com/express/ko-KR/make/signage - - - - - - - - - - - https://adobe.com/express/pt-BR/make/signage - - - - - - - - - - - https://adobe.com/express/es-ES/make/signage - - - - - - - - - - - https://adobe.com/express/it-IT/make/signage - - - - - - - - - - - https://adobe.com/express/fr-FR/make/signage - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/signage - - - - - - - - - - - https://adobe.com/express/make/signs/yard-sale - - - - - https://adobe.com/express/fr-FR/make/signs/yard-sale - - - - - https://adobe.com/express/de-DE/make/size/facebook - - - - - - - - - https://adobe.com/express/make/size/facebook - - - - - - - - - https://adobe.com/express/pt-BR/make/size/facebook - - - - - - - - - https://adobe.com/express/es-ES/make/size/facebook - - - - - - - - - https://adobe.com/express/it-IT/make/size/facebook - - - - - - - - - https://adobe.com/express/fr-FR/make/size/facebook - - - - - - - - - https://adobe.com/express/de-DE/make/size/instagram - - - - - - - - - - https://adobe.com/express/make/size/instagram - - - - - - - - - - https://adobe.com/express/pt-BR/make/size/instagram - - - - - - - - - - https://adobe.com/express/es-ES/make/size/instagram - - - - - - - - - - https://adobe.com/express/it-IT/make/size/instagram - - - - - - - - - - https://adobe.com/express/fr-FR/make/size/instagram - - - - - - - - - - https://adobe.com/express/nb-NO/make/size/instagram - - - - - - - - - - https://adobe.com/express/de-DE/make/size/twitter - - - - - - - - - https://adobe.com/express/make/size/twitter - - - - - - - - - https://adobe.com/express/pt-BR/make/size/twitter - - - - - - - - - https://adobe.com/express/es-ES/make/size/twitter - - - - - - - - - https://adobe.com/express/it-IT/make/size/twitter - - - - - - - - - https://adobe.com/express/fr-FR/make/size/twitter - - - - - - - - - https://adobe.com/express/de-DE/make/size/youtube - - - - - - - - - https://adobe.com/express/make/size/youtube - - - - - - - - - https://adobe.com/express/pt-BR/make/size/youtube - - - - - - - - - https://adobe.com/express/es-ES/make/size/youtube - - - - - - - - - https://adobe.com/express/it-IT/make/size/youtube - - - - - - - - - https://adobe.com/express/fr-FR/make/size/youtube - - - - - - - - - https://adobe.com/express/fi-FI/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/slideshow-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/snapchat-geofilter-maker - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/social-media-graphics - - - - - - - - - - - - - - - - https://adobe.com/express/make/social-media-graphics/sea-hear-now-festival - - - - https://adobe.com/express/make/spark-101-templates/aspiring-communicator - - - - https://adobe.com/express/make/spark-101-templates/professional-communicator - - - - https://adobe.com/express/make/spark-101-templates/starter-pack - - - - https://adobe.com/express/make/spark-101-templates/welcome-to-spark-premium - - - - https://adobe.com/express/de-DE/make/sticker - - - - - - - - - - - https://adobe.com/express/make/sticker - - - - - - - - - - - https://adobe.com/express/pt-BR/make/sticker - - - - - - - - - - - https://adobe.com/express/es-ES/make/sticker - - - - - - - - - - - https://adobe.com/express/it-IT/make/sticker - - - - - - - - - - - https://adobe.com/express/fr-FR/make/sticker - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/sticker - - - - - - - - - - - https://adobe.com/express/ja-JP/make/sticker - - - - - - - - - - - https://adobe.com/express/de-DE/make/sympathy-card - - - - - - - - - https://adobe.com/express/make/sympathy-card - - - - - - - - - https://adobe.com/express/pt-BR/make/sympathy-card - - - - - - - - - https://adobe.com/express/es-ES/make/sympathy-card - - - - - - - - - https://adobe.com/express/it-IT/make/sympathy-card - - - - - - - - - https://adobe.com/express/fr-FR/make/sympathy-card - - - - - - - - - https://adobe.com/express/de-DE/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/es-ES/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/it-IT/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/t-shirt-design - - - - - - - - - - - - https://adobe.com/express/de-DE/make/table-of-contents - - - - - - - - - - https://adobe.com/express/make/table-of-contents - - - - - - - - - - https://adobe.com/express/pt-BR/make/table-of-contents - - - - - - - - - - https://adobe.com/express/es-ES/make/table-of-contents - - - - - - - - - - https://adobe.com/express/it-IT/make/table-of-contents - - - - - - - - - - https://adobe.com/express/fr-FR/make/table-of-contents - - - - - - - - - - https://adobe.com/express/nb-NO/make/table-of-contents - - - - - - - - - - https://adobe.com/express/make/tags/hang - - - - - - https://adobe.com/express/zh-Hant-CN/make/tags/hang - - - - - - https://adobe.com/express/ja-JP/make/tags/hang - - - - - - https://adobe.com/express/de-DE/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/es-ES/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/it-IT/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/text-animation-maker - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/text-on-photos - - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/ticket-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/ticket-maker/raffle - - - - - - - - - - - - - - - https://adobe.com/express/make/tier-list - - - - https://adobe.com/express/de-DE/make/timeline-maker - - - - - - - - - - - https://adobe.com/express/make/timeline-maker - - - - - - - - - - - https://adobe.com/express/ko-KR/make/timeline-maker - - - - - - - - - - - https://adobe.com/express/pt-BR/make/timeline-maker - - - - - - - - - - - https://adobe.com/express/es-ES/make/timeline-maker - - - - - - - - - - - https://adobe.com/express/it-IT/make/timeline-maker - - - - - - - - - - - https://adobe.com/express/fr-FR/make/timeline-maker - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/timeline-maker - - - - - - - - - - - https://adobe.com/express/de-DE/make/timetable - - - - - - - - - - - - https://adobe.com/express/make/timetable - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/timetable - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/timetable - - - - - - - - - - - - https://adobe.com/express/es-ES/make/timetable - - - - - - - - - - - - https://adobe.com/express/it-IT/make/timetable - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/timetable - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/timetable - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/timetable - - - - - - - - - - - - https://adobe.com/express/de-DE/make/topic/baby-shower - - - - - - - - - https://adobe.com/express/make/topic/baby-shower - - - - - - - - - https://adobe.com/express/pt-BR/make/topic/baby-shower - - - - - - - - - https://adobe.com/express/es-ES/make/topic/baby-shower - - - - - - - - - https://adobe.com/express/it-IT/make/topic/baby-shower - - - - - - - - - https://adobe.com/express/fr-FR/make/topic/baby-shower - - - - - - - - - https://adobe.com/express/de-DE/make/topic/birthday - - - - - - - - - https://adobe.com/express/make/topic/birthday - - - - - - - - - https://adobe.com/express/pt-BR/make/topic/birthday - - - - - - - - - https://adobe.com/express/es-ES/make/topic/birthday - - - - - - - - - https://adobe.com/express/it-IT/make/topic/birthday - - - - - - - - - https://adobe.com/express/fr-FR/make/topic/birthday - - - - - - - - - https://adobe.com/express/make/topic/covid - - - - https://adobe.com/express/make/topic/covid/back-to-business - - - - https://adobe.com/express/de-DE/make/topic/job-application - - - - - - - - - https://adobe.com/express/make/topic/job-application - - - - - - - - - https://adobe.com/express/pt-BR/make/topic/job-application - - - - - - - - - https://adobe.com/express/es-ES/make/topic/job-application - - - - - - - - - https://adobe.com/express/it-IT/make/topic/job-application - - - - - - - - - https://adobe.com/express/fr-FR/make/topic/job-application - - - - - - - - - https://adobe.com/express/make/topic/new-year - - - - https://adobe.com/express/de-DE/make/topic/small-business - - - - - - - - - https://adobe.com/express/make/topic/small-business - - - - - - - - - https://adobe.com/express/pt-BR/make/topic/small-business - - - - - - - - - https://adobe.com/express/es-ES/make/topic/small-business - - - - - - - - - https://adobe.com/express/it-IT/make/topic/small-business - - - - - - - - - https://adobe.com/express/fr-FR/make/topic/small-business - - - - - - - - - https://adobe.com/express/de-DE/make/topic/social-media-marketing - - - - - - - - - https://adobe.com/express/make/topic/social-media-marketing - - - - - - - - - https://adobe.com/express/pt-BR/make/topic/social-media-marketing - - - - - - - - - https://adobe.com/express/es-ES/make/topic/social-media-marketing - - - - - - - - - https://adobe.com/express/it-IT/make/topic/social-media-marketing - - - - - - - - - https://adobe.com/express/fr-FR/make/topic/social-media-marketing - - - - - - - - - https://adobe.com/express/de-DE/make/topic/wedding - - - - - - - - - https://adobe.com/express/make/topic/wedding - - - - - - - - - https://adobe.com/express/pt-BR/make/topic/wedding - - - - - - - - - https://adobe.com/express/es-ES/make/topic/wedding - - - - - - - - - https://adobe.com/express/it-IT/make/topic/wedding - - - - - - - - - https://adobe.com/express/fr-FR/make/topic/wedding - - - - - - - - - https://adobe.com/express/make/topics/saint-patrick-day - - - - https://adobe.com/express/make/trading-cards - - - - https://adobe.com/express/de-DE/make/twitch-overlay - - - - - https://adobe.com/express/make/twitch-overlay - - - - - https://adobe.com/express/make/user-persona - - - - - - - https://adobe.com/express/ko-KR/make/user-persona - - - - - - - https://adobe.com/express/zh-Hant-CN/make/user-persona - - - - - - - https://adobe.com/express/ja-JP/make/user-persona - - - - - - - https://adobe.com/express/fi-FI/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/video-editor - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/video-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-intro-maker/movie - - - - - - - - - - https://adobe.com/express/make/video-intro-maker/movie - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-intro-maker/movie - - - - - - - - - - https://adobe.com/express/es-ES/make/video-intro-maker/movie - - - - - - - - - - https://adobe.com/express/it-IT/make/video-intro-maker/movie - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-intro-maker/movie - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/video-intro-maker/movie - - - - - - - - - - https://adobe.com/express/de-DE/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/es-ES/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/it-IT/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/video-intro-maker/wedding - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/video-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-maker/birthday - - - - - - - - - - - https://adobe.com/express/make/video-maker/birthday - - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-maker/birthday - - - - - - - - - - - https://adobe.com/express/es-ES/make/video-maker/birthday - - - - - - - - - - - https://adobe.com/express/it-IT/make/video-maker/birthday - - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-maker/birthday - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/video-maker/birthday - - - - - - - - - - - https://adobe.com/express/ja-JP/make/video-maker/birthday - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-maker/infographics - - - - - - - - - https://adobe.com/express/make/video-maker/infographics - - - - - - - - - https://adobe.com/express/pt-BR/make/video-maker/infographics - - - - - - - - - https://adobe.com/express/es-ES/make/video-maker/infographics - - - - - - - - - https://adobe.com/express/it-IT/make/video-maker/infographics - - - - - - - - - https://adobe.com/express/fr-FR/make/video-maker/infographics - - - - - - - - - https://adobe.com/express/de-DE/make/video-maker/tik-tok - - - - - - - - - https://adobe.com/express/make/video-maker/tik-tok - - - - - - - - - https://adobe.com/express/pt-BR/make/video-maker/tik-tok - - - - - - - - - https://adobe.com/express/es-ES/make/video-maker/tik-tok - - - - - - - - - https://adobe.com/express/it-IT/make/video-maker/tik-tok - - - - - - - - - https://adobe.com/express/fr-FR/make/video-maker/tik-tok - - - - - - - - - https://adobe.com/express/fi-FI/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/video-maker/youtube - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-outro-maker - - - - - - - - - - https://adobe.com/express/make/video-outro-maker - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-outro-maker - - - - - - - - - - https://adobe.com/express/es-ES/make/video-outro-maker - - - - - - - - - - https://adobe.com/express/it-IT/make/video-outro-maker - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-outro-maker - - - - - - - - - - https://adobe.com/express/nb-NO/make/video-outro-maker - - - - - - - - - - https://adobe.com/express/de-DE/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/es-ES/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/it-IT/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/video-resizer - - - - - - - - - - - - https://adobe.com/express/de-DE/make/video-trimmer - - - - - - - - - - - https://adobe.com/express/make/video-trimmer - - - - - - - - - - - https://adobe.com/express/ko-KR/make/video-trimmer - - - - - - - - - - - https://adobe.com/express/pt-BR/make/video-trimmer - - - - - - - - - - - https://adobe.com/express/es-ES/make/video-trimmer - - - - - - - - - - - https://adobe.com/express/it-IT/make/video-trimmer - - - - - - - - - - - https://adobe.com/express/fr-FR/make/video-trimmer - - - - - - - - - - - https://adobe.com/express/ja-JP/make/video-trimmer - - - - - - - - - - - https://adobe.com/express/de-DE/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/es-ES/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/it-IT/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/videos/add-subtitle - - - - - - - - - - - - https://adobe.com/express/de-DE/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/videos/add-text - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/es-ES/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/it-IT/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/videos/images-to-video - - - - - - - - - - - - https://adobe.com/express/de-DE/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/es-ES/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/it-IT/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/videos/merge - - - - - - - - - - - - https://adobe.com/express/de-DE/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/wallpaper-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/wattpad-cover-maker - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/website-builder - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/sv-SE/make/wedding-congratulations - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/wedding-program-maker - - - - - - - - - https://adobe.com/express/make/wedding-program-maker - - - - - - - - - https://adobe.com/express/pt-BR/make/wedding-program-maker - - - - - - - - - https://adobe.com/express/es-ES/make/wedding-program-maker - - - - - - - - - https://adobe.com/express/it-IT/make/wedding-program-maker - - - - - - - - - https://adobe.com/express/fr-FR/make/wedding-program-maker - - - - - - - - - https://adobe.com/express/make/weekly-schedule-templates - - - - https://adobe.com/express/de-DE/make/whats-up/good-night-messages - - - - - - - - - https://adobe.com/express/make/whats-up/good-night-messages - - - - - - - - - https://adobe.com/express/pt-BR/make/whats-up/good-night-messages - - - - - - - - - https://adobe.com/express/es-ES/make/whats-up/good-night-messages - - - - - - - - - https://adobe.com/express/it-IT/make/whats-up/good-night-messages - - - - - - - - - https://adobe.com/express/fr-FR/make/whats-up/good-night-messages - - - - - - - - - https://adobe.com/express/de-DE/make/white-paper - - - - - - - - - - https://adobe.com/express/make/white-paper - - - - - - - - - - https://adobe.com/express/pt-BR/make/white-paper - - - - - - - - - - https://adobe.com/express/es-ES/make/white-paper - - - - - - - - - - https://adobe.com/express/it-IT/make/white-paper - - - - - - - - - - https://adobe.com/express/fr-FR/make/white-paper - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/white-paper - - - - - - - - - - https://adobe.com/express/make/worksheet/all-about-me - - - - https://adobe.com/express/make/worksheet/goal-setting - - - - https://adobe.com/express/de-DE/make/worksheet/math - - - - - - - - - https://adobe.com/express/make/worksheet/math - - - - - - - - - https://adobe.com/express/pt-BR/make/worksheet/math - - - - - - - - - https://adobe.com/express/es-ES/make/worksheet/math - - - - - - - - - https://adobe.com/express/it-IT/make/worksheet/math - - - - - - - - - https://adobe.com/express/fr-FR/make/worksheet/math - - - - - - - - - https://adobe.com/express/de-DE/make/worksheet/pre-school - - - - - - - - - https://adobe.com/express/make/worksheet/pre-school - - - - - - - - - https://adobe.com/express/pt-BR/make/worksheet/pre-school - - - - - - - - - https://adobe.com/express/es-ES/make/worksheet/pre-school - - - - - - - - - https://adobe.com/express/it-IT/make/worksheet/pre-school - - - - - - - - - https://adobe.com/express/fr-FR/make/worksheet/pre-school - - - - - - - - - https://adobe.com/express/make/worksheet/smart-goal - - - - - https://adobe.com/express/nb-NO/make/worksheet/smart-goal - - - - - https://adobe.com/express/make/worksheet/state-of-matter - - - - https://adobe.com/express/de-DE/make/yearbook - - - - - - - - - - https://adobe.com/express/make/yearbook - - - - - - - - - - https://adobe.com/express/pt-BR/make/yearbook - - - - - - - - - - https://adobe.com/express/es-ES/make/yearbook - - - - - - - - - - https://adobe.com/express/it-IT/make/yearbook - - - - - - - - - - https://adobe.com/express/fr-FR/make/yearbook - - - - - - - - - - https://adobe.com/express/nb-NO/make/yearbook - - - - - - - - - - https://adobe.com/express/fi-FI/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/youtube-channel-art-maker - - - - - - - - - - - - - - - https://adobe.com/express/make/youtube-end-screen - - - - - https://adobe.com/express/nb-NO/make/youtube-end-screen - - - - - https://adobe.com/express/fi-FI/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nb-NO/make/youtube-intro-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fi-FI/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/de-DE/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ko-KR/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/pt-BR/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/es-ES/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/it-IT/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hans-CN/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/nl-NL/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/da-DK/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/fr-FR/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/zh-Hant-CN/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - - https://adobe.com/express/ja-JP/make/youtube-thumbnail-maker - - - - - - - - - - - - - - - From 555bbf96ba8c6b8ed9f4048358b87aa455033ccf Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 16 Mar 2021 21:04:19 -0700 Subject: [PATCH 100/649] feat(page-list): omit redundant images --- express/blocks/page-list/page-list.css | 29 +++++++++++++++++--- express/blocks/page-list/page-list.js | 38 ++++++++++++++++++-------- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 76c2675..417ebb4 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -3,12 +3,12 @@ main .page-list { text-align: left; } - main .page-list-container > div { + main .page-list-container .page-list-images > div { max-width: 100%; } - main .page-list { + main .page-list .page-list-images { display: flex; flex-wrap: wrap; justify-content: center; @@ -36,7 +36,7 @@ main .page-list { } - main .page-list .card-body h3 { + main .page-list .card-body h3, main .page-list .page-list-additional p a:any-link { padding: 0; margin: 0; font-size: 16px; @@ -45,6 +45,7 @@ main .page-list { text-align: left; line-height: 1.1em; margin-bottom: 3px; + text-decoration: none; } main .page-list .card-body p { @@ -52,4 +53,24 @@ main .page-list { margin: 0; text-align: left; line-height: normal; - } \ No newline at end of file + } + + main .page-list .page-list-additional p { + margin: 12px 0; + } + + main .page-list .page-list-additional { + max-width: 400px; + margin: 64px auto; + text-align: center; + } + + @media (min-width: 900px) { + main .page-list .page-list-additional { + max-width: 800px; + columns: 2 30px; + } + main .page-list .page-list-additional p:first-of-type { + margin-top: 0; + } + } \ No newline at end of file diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 191c0c2..b0ba9ae 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -18,20 +18,34 @@ import { } from '../../scripts/scripts.js'; function addPages(index, filter, $block) { + const $images = createTag('div', { class: 'page-list-images' }); + const $additional = createTag('div', { class: 'page-list-additional' }); + $block.appendChild($images); + $block.appendChild($additional); + + const images = []; + index.forEach((page) => { if (page.path.includes(filter)) { - const { path } = page; - const $card = createTag('div', { class: 'card' }); - $card.innerHTML = `
- -
-
-

${page.title}

-
`; - $card.addEventListener('click', () => { - window.location.href = path; - }); - $block.appendChild($card); + const { path, image, title } = page; + if (!images.includes(image)) { + const $card = createTag('div', { class: 'card' }); + $card.innerHTML = `
+ +
+
+

${title}

+
`; + $card.addEventListener('click', () => { + window.location.href = path; + }); + $images.appendChild($card); + images.push(image); + } else { + const $p = createTag('p'); + $p.innerHTML = `${title}`; + $additional.appendChild($p); + } } }); } From 8844c132c8a0556a62bfdc2b0423773f95fe53ef Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 16 Mar 2021 23:06:17 -0700 Subject: [PATCH 101/649] feat(sticky-banner): basic sticky banner --- .../sticky-promo-bar/sticky-promo-bar.css | 55 +++++++++++++++++++ .../sticky-promo-bar/sticky-promo-bar.js | 24 ++++++++ express/styles/styles.css | 4 ++ 3 files changed, 83 insertions(+) create mode 100644 express/blocks/sticky-promo-bar/sticky-promo-bar.css create mode 100644 express/blocks/sticky-promo-bar/sticky-promo-bar.js diff --git a/express/blocks/sticky-promo-bar/sticky-promo-bar.css b/express/blocks/sticky-promo-bar/sticky-promo-bar.css new file mode 100644 index 0000000..8731465 --- /dev/null +++ b/express/blocks/sticky-promo-bar/sticky-promo-bar.css @@ -0,0 +1,55 @@ +main .sticky-promo-bar { + position: fixed; + left: 0; + right: 0; + bottom: 0; + background-color: #1473E6; + color: white; + padding: 24px; + padding-right: 36px; + font-weight: 800; + line-height: 2em; +} + +main .sticky-promo-bar a:any-link { + color: white; + border: 2px solid white; + border-radius: 20px; + padding: 3px 10px 5px 10px; + text-decoration: none; + margin-left: 20px; + font-weight: 500; + font-size: 0.9em; + white-space: nowrap; +} + +main .sticky-promo-bar .close { + color: white; + position: absolute; + margin-top: 0; + margin-left: 0; + width: 21px; + height: 21px; + top: 30px; + right: 25px; + } + + main .sticky-promo-bar .close:before { + content: ''; + position: absolute; + top: 10px; + width: 21px; + height: 1px; + background-color: currentColor; + transform: rotate(-45deg); + } + + main .sticky-promo-bar .close:after { + content: ''; + position: absolute; + top: 10px; + width: 21px; + height: 1px; + background-color: currentColor; + transform: rotate(45deg); + } diff --git a/express/blocks/sticky-promo-bar/sticky-promo-bar.js b/express/blocks/sticky-promo-bar/sticky-promo-bar.js new file mode 100644 index 0000000..5a1d64f --- /dev/null +++ b/express/blocks/sticky-promo-bar/sticky-promo-bar.js @@ -0,0 +1,24 @@ +/* + * Copyright 2021 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. + */ +/* global */ + +import { + createTag, +} from '../../scripts/scripts.js'; + +export default function decorate($block) { + const $close = createTag('div', { class: 'close' }); + $block.appendChild($close); + $close.addEventListener('click', () => { + $block.remove(); + }); +} diff --git a/express/styles/styles.css b/express/styles/styles.css index f867dd6..c3656ff 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -235,6 +235,10 @@ main .hero.hero-noimage { background-color: #000; } +main .hero.hero-noimage a:any-link{ + color: white; +} + main .hero h1 { font-size: 45px; font-weight: 900; From 7a97e71c7161d0c5acde896ff0f6712744f6e1fe Mon Sep 17 00:00:00 2001 From: Raphael Wegmueller Date: Wed, 17 Mar 2021 19:33:11 +0100 Subject: [PATCH 102/649] chore: show templates on new documents too --- tools/sidekick/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/sidekick/plugins.js b/tools/sidekick/plugins.js index 48e25ab..9d007f1 100644 --- a/tools/sidekick/plugins.js +++ b/tools/sidekick/plugins.js @@ -20,7 +20,7 @@ sk.add({ id: 'templates', - condition: (s) => s.isEditor() && (s.location.search.includes('.docx&') || s.location.search.includes('doc.aspx?') || s.location.search.includes('.md&')), + condition: (s) => s.isEditor() && (s.location.pathname.includes('/:w:/'), button: { text: 'Templates', action: () => { From 8296d3a4807e97242abd654fcee24ad0ee83e1a6 Mon Sep 17 00:00:00 2001 From: Raphael Wegmueller Date: Wed, 17 Mar 2021 19:35:46 +0100 Subject: [PATCH 103/649] chore: show templates on new documents too --- tools/sidekick/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/sidekick/plugins.js b/tools/sidekick/plugins.js index 9d007f1..25122f7 100644 --- a/tools/sidekick/plugins.js +++ b/tools/sidekick/plugins.js @@ -20,7 +20,7 @@ sk.add({ id: 'templates', - condition: (s) => s.isEditor() && (s.location.pathname.includes('/:w:/'), + condition: (s) => s.isEditor() && (s.location.pathname.includes('/:w:/') || s.location.href.includes('doc.aspx?')), button: { text: 'Templates', action: () => { From 415ddd2f72b9315494502a06ecb2fcd604d3f36c Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 17 Mar 2021 19:44:39 +0100 Subject: [PATCH 104/649] fix(steps): align left --- express/blocks/steps/steps.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 05463e7..8929dc5 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -1,16 +1,17 @@ main .steps { margin-top: 56px; - text-align: left; } main .steps h3 { font-size: 22px; + text-align: left; line-height: 26px; margin-top: 0; } main .steps p { font-size: 18px; + text-align: left; line-height: 22px; margin: 0; } From 9d0ea069e53a996d409f872872db2a6cdc749b8a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 17 Mar 2021 15:46:08 -0700 Subject: [PATCH 105/649] feat(design): unwrap blocks that run wider --- express/blocks/columns/columns.css | 4 ++++ express/blocks/layouts/layouts.css | 4 ++++ express/scripts/scripts.js | 32 ++++++++++++++++++++++++++++++ express/styles/styles.css | 3 --- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 078c2e9..30776e4 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -4,6 +4,10 @@ main .columns > div { align-items: center; } +main .columns-container > div { + max-width: 1024px; +} + @media (min-width:900px) { main .columns > div { flex-direction: row; diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 0cfef50..1d6e257 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -71,6 +71,10 @@ main .layouts .layout-content { height: 100%; } +main .layouts-container > div { + max-width: 1024px; +} + @media (min-width:600px) { main .layouts .layout { width: 250px; diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 5f13ea1..52ae021 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -652,9 +652,41 @@ function fixIcons() { }); } +export function unwrapBlock($block) { + const $section = $block.parentNode; + const $elems = [...$section.children]; + const $blockSection = createTag('div'); + const $postBlockSection = createTag('div'); + $section.parentNode.appendChild($blockSection); + $section.parentNode.appendChild($postBlockSection); + + let $appendTo; + console.log($appendTo) + + $elems.forEach(($e) => { + console.log($e); + if ($e === $block) $appendTo = $blockSection; + console.log($appendTo); + if ($appendTo) { + $appendTo.appendChild($e); + $appendTo = $postBlockSection; + } + }); +} + +function splitSections() { + document.querySelectorAll('main > div > div').forEach(($block) => { + const blocksToSplit = ['template-list', 'layouts']; + if (blocksToSplit.includes($block.className)) { + unwrapBlock($block); + } + }); +} + async function decoratePage() { setTemplate(); await decorateTesting(); + splitSections(); wrapSections('main>div'); decorateHeader(); decorateHero(); diff --git a/express/styles/styles.css b/express/styles/styles.css index c3656ff..bdb5309 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -492,9 +492,6 @@ main .section-wrapper.banner-container { } @media (min-width:900px) { - main .section-wrapper > div { - max-width: 1024px; - } main .section-wrapper h5 + p, main .section-wrapper p.button-container { From dbfa0b0a0399ebfde3c27721b585176b83f8596b Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 17 Mar 2021 17:55:48 -0700 Subject: [PATCH 106/649] chore: remove logging --- express/scripts/scripts.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 52ae021..3b5a130 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -661,8 +661,6 @@ export function unwrapBlock($block) { $section.parentNode.appendChild($postBlockSection); let $appendTo; - console.log($appendTo) - $elems.forEach(($e) => { console.log($e); if ($e === $block) $appendTo = $blockSection; From e40f516613a206b10234399b3748c4797fed72aa Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 17 Mar 2021 18:20:05 -0700 Subject: [PATCH 107/649] feat: pricing skeleton --- express/blocks/pricing/pricing.css | 3 ++ express/blocks/pricing/pricing.js | 67 ++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 express/blocks/pricing/pricing.css create mode 100644 express/blocks/pricing/pricing.js diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css new file mode 100644 index 0000000..2809215 --- /dev/null +++ b/express/blocks/pricing/pricing.css @@ -0,0 +1,3 @@ +main .pricing { + background-color: yellow; +} \ No newline at end of file diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js new file mode 100644 index 0000000..393626f --- /dev/null +++ b/express/blocks/pricing/pricing.js @@ -0,0 +1,67 @@ +/* + * Copyright 2021 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. + */ +/* global fetch */ + +import { + createTag, +} from '../../scripts/scripts.js'; + +async function fetchHeader(sheet) { + const url = `/${sheet}.json?sheet=header`; + const resp = await fetch(url); + const json = await resp.json(); + return json.data; +} + +async function fetchPlans(sheet) { + const url = `/${sheet}.json?sheet=plans`; + const resp = await fetch(url); + const json = await resp.json(); + return json.data; +} + +async function fetchFeatures(sheet) { + const url = `/${sheet}.json?sheet=features`; + const resp = await fetch(url); + const json = await resp.json(); + return json.data; +} + +function decorateHeader(header) { + +} + +function decoratePlans(plans, features) { + +} + +function decorateTable(features) { + +} + +async function decoratePricing($block) { + const $rows = $block.children; + const sheet = $rows[1]; + + const header = await fetchHeader(sheet); + const plans = await fetchPlans(sheet); + const features = await fetchFeatures(sheet); + + decorateHeader(header); + decoratePlans(plans, features); + decorateTable(features); +} + +export default function decorate($block) { + console.log('decorate pricing'); + decoratePricing($block); +} From e24d30b1395bacf9ede3d117662ebbe0bab887ab Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 17 Mar 2021 18:32:49 -0700 Subject: [PATCH 108/649] fix(pricing): path updates --- express/blocks/pricing/pricing.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 393626f..1031c57 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -13,24 +13,25 @@ import { createTag, + readBlockConfig, } from '../../scripts/scripts.js'; async function fetchHeader(sheet) { - const url = `/${sheet}.json?sheet=header`; + const url = `./${sheet}.json?sheet=header`; const resp = await fetch(url); const json = await resp.json(); return json.data; } async function fetchPlans(sheet) { - const url = `/${sheet}.json?sheet=plans`; + const url = `./${sheet}.json?sheet=plans`; const resp = await fetch(url); const json = await resp.json(); return json.data; } async function fetchFeatures(sheet) { - const url = `/${sheet}.json?sheet=features`; + const url = `./${sheet}.json?sheet=table`; const resp = await fetch(url); const json = await resp.json(); return json.data; @@ -49,8 +50,8 @@ function decorateTable(features) { } async function decoratePricing($block) { - const $rows = $block.children; - const sheet = $rows[1]; + const config = readBlockConfig($block); + const { sheet } = config; const header = await fetchHeader(sheet); const plans = await fetchPlans(sheet); From f1341b335be13d885ca137eae9e48b9894170f42 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Wed, 17 Mar 2021 23:01:58 -0400 Subject: [PATCH 109/649] feat(pricing): header --- express/blocks/pricing/pricing.css | 15 ++++++++++- express/blocks/pricing/pricing.js | 41 +++++++++++++++++++++++++++--- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index 2809215..6f82da3 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -1,3 +1,16 @@ main .pricing { background-color: yellow; -} \ No newline at end of file +} + +.pricing-header { + color: rgb(40, 70, 96); +} + +.pricing-header span { + color: rgb(16, 196, 89); + transition: 1.5s opacity ease; +} + +.pricing-header span.hidden { + opacity: 0; +} diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 1031c57..44849a4 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -37,8 +37,42 @@ async function fetchFeatures(sheet) { return json.data; } -function decorateHeader(header) { +function buildWordList(header) { + const words = []; + header.forEach((row) => { + const word = row['Header Words']; + words.push(word); + }); + return words; +} + +function animateHeader($header, words) { + let i = 0; + const max = words.length; + const firstWord = words[0]; + const headerWordTemplate = `${firstWord}`; + $header.innerHTML = $header.innerHTML.replace('[x]', headerWordTemplate); + const $headerWord = $header.children[0]; + setInterval(() => { + $headerWord.classList.add('hidden'); + setTimeout(() => { + i += 1; + if (i > max) { + i = 0; + } + $headerWord.innerHTML = words[i]; + $headerWord.classList.remove('hidden'); + }, 1500); + }, 4000); +} +function decorateHeader($block, header) { + const headerText = header[0]['Header Title']; + const $header = createTag('h2', { class: 'pricing-header' }); + const words = buildWordList(header); + $header.innerHTML = headerText; + $block.append($header); + animateHeader($header, words); } function decoratePlans(plans, features) { @@ -57,12 +91,13 @@ async function decoratePricing($block) { const plans = await fetchPlans(sheet); const features = await fetchFeatures(sheet); - decorateHeader(header); + $block.innerHTML = ''; + + decorateHeader($block, header); decoratePlans(plans, features); decorateTable(features); } export default function decorate($block) { - console.log('decorate pricing'); decoratePricing($block); } From 403d2fe05ac677937d31b5c9c79d1f60cf74c5a6 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 17 Mar 2021 21:31:36 -0700 Subject: [PATCH 110/649] fix(hero): temp no-image hero adjustment for homepage --- express/styles/styles.css | 44 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index bdb5309..fd2f95d 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -226,19 +226,32 @@ main img { main .hero { color: white; - text-shadow: 1px 1px 2px rgba(0,0,0,.25); position: relative; padding: 120px 32px; } main .hero.hero-noimage { - background-color: #000; + color: black; + padding-top: 64px; + padding-bottom: 0; } -main .hero.hero-noimage a:any-link{ +main .hero.hero-noimage + .section-wrapper { + padding-top: 0; +} + +main .hero.hero-noimage > div { + max-width: 1024px; +} + +main .hero.hero-noimage a.button:any-link { color: white; } +main .hero.hero-noimage a:any-link{ + color: black; +} + main .hero h1 { font-size: 45px; font-weight: 900; @@ -253,6 +266,18 @@ main .hero h2 { font-weight: 400; } +main .hero h5 { + font-size: 18px; + font-weight: 500; + max-width: 672px; + margin: auto; + margin-top: 32px; +} + +main .hero.hero-noimage p { + font-size: 14px; +} + main .hero p { margin: 16px 0; font-size: 1.25rem; @@ -295,6 +320,19 @@ main .hero > div { margin-bottom: 40px; } + main .hero h5 { + font-size: 22px; + font-weight: 500; + max-width: 672px; + margin: auto; + margin-top: 32px; + } + + main .hero.hero-noimage p { + font-size: 14px; + } + + main .hero { padding: 80px 0; } From e5345772d1213760273aca49d441b7d99bcd6125 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 17 Mar 2021 23:21:45 -0700 Subject: [PATCH 111/649] fix: trigger postLCP on error --- express/scripts/scripts.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 3b5a130..c357efa 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -639,6 +639,9 @@ function setLCPTrigger() { $lcpCandidate.addEventListener('load', () => { postLCP(); }); + $lcpCandidate.addEventListener('error', () => { + postLCP(); + }); } } else { postLCP(); From 7fbaa993d4d8ba20933da9db4f1b1fb9bd9cb321 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Thu, 18 Mar 2021 12:04:44 +0100 Subject: [PATCH 112/649] feat(test): (infra)structure for block tests --- express/blocks/animation/animation.js | 5 +- express/blocks/how-to-steps/how-to-steps.js | 5 +- .../table-of-contents/table-of-contents.js | 6 +- express/scripts/scripts.js | 2 +- karma.config.js | 9 ++- package.json | 2 +- .../blocks-test-list.js} | 23 +++++-- test/unit/blocks/blocks.test.js | 68 +++++++++++++++++++ .../expected/link-image.basic.block.html | 13 ++++ .../link-image.nolinebreaks.block.html | 11 +++ .../table-of-contents.1level.block.html | 5 ++ .../table-of-contents.2levels.block.html | 8 +++ .../blocks/input/link-image.basic.doc.html | 18 +++++ .../input/link-image.nolinebreaks.doc.html | 16 +++++ .../input/table-of-contents.1level.doc.html | 16 +++++ .../input/table-of-contents.2levels.doc.html | 21 ++++++ .../table-of-contents.noheadings.doc.html | 21 ++++++ test/unit/post.test.js | 18 ----- test/unit/template.test.js | 18 ----- 19 files changed, 229 insertions(+), 56 deletions(-) rename test/unit/{make.test.js => blocks/blocks-test-list.js} (50%) create mode 100644 test/unit/blocks/blocks.test.js create mode 100644 test/unit/blocks/expected/link-image.basic.block.html create mode 100644 test/unit/blocks/expected/link-image.nolinebreaks.block.html create mode 100644 test/unit/blocks/expected/table-of-contents.1level.block.html create mode 100644 test/unit/blocks/expected/table-of-contents.2levels.block.html create mode 100644 test/unit/blocks/input/link-image.basic.doc.html create mode 100644 test/unit/blocks/input/link-image.nolinebreaks.doc.html create mode 100644 test/unit/blocks/input/table-of-contents.1level.doc.html create mode 100644 test/unit/blocks/input/table-of-contents.2levels.doc.html create mode 100644 test/unit/blocks/input/table-of-contents.noheadings.doc.html delete mode 100644 test/unit/post.test.js delete mode 100644 test/unit/template.test.js diff --git a/express/blocks/animation/animation.js b/express/blocks/animation/animation.js index c9fde33..7506654 100644 --- a/express/blocks/animation/animation.js +++ b/express/blocks/animation/animation.js @@ -9,14 +9,13 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global document */ import { createTag, } from '../../scripts/scripts.js'; -export default function decorate() { - document.querySelectorAll('.animation a[href], .video a[href]').forEach(($a) => { +export default function decorate($block, name, doc) { + doc.querySelectorAll('.animation a[href], .video a[href]').forEach(($a) => { const href = $a.getAttribute('href'); const url = new URL(href); const helixId = url.pathname.split('/')[2]; diff --git a/express/blocks/how-to-steps/how-to-steps.js b/express/blocks/how-to-steps/how-to-steps.js index b8f41a8..d0714d8 100644 --- a/express/blocks/how-to-steps/how-to-steps.js +++ b/express/blocks/how-to-steps/how-to-steps.js @@ -10,14 +10,13 @@ * governing permissions and limitations under the License. */ -/* global document */ /* eslint-disable import/named, import/extensions */ import { createTag, } from '../../scripts/scripts.js'; -export default function decorate($block) { +export default function decorate($block, name, doc) { const $howto = $block; const $heading = $howto.previousElementSibling; const $rows = Array.from($howto.children); @@ -47,6 +46,6 @@ export default function decorate($block) { $cells[0].remove(); }); $schema.innerHTML = JSON.stringify(schema); - const $head = document.head; + const $head = doc.head; $head.append($schema); } diff --git a/express/blocks/table-of-contents/table-of-contents.js b/express/blocks/table-of-contents/table-of-contents.js index f06a471..d9e5de9 100644 --- a/express/blocks/table-of-contents/table-of-contents.js +++ b/express/blocks/table-of-contents/table-of-contents.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global document */ + /* eslint-disable import/named, import/extensions */ import { @@ -17,9 +17,9 @@ import { readBlockConfig, } from '../../scripts/scripts.js'; -export default function decorate($block) { +export default function decorate($block, name, doc) { const config = readBlockConfig($block); - const $headings = document.querySelectorAll('main h2, main h3, main h4, main .table-of-contents'); + const $headings = doc.querySelectorAll('main h2, main h3, main h4, main .table-of-contents'); let skip = true; const $toc = createTag('div', { class: 'toc' }); $headings.forEach(($h) => { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index c357efa..ddbedf6 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -173,7 +173,7 @@ function decorateBlocks() { $block.classList.add('block'); import(`/express/blocks/${blockName}/${blockName}.js`) .then((mod) => { - mod.default($block, blockName); + mod.default($block, blockName, document); }) .catch((err) => console.log('failed to load module', err)); diff --git a/karma.config.js b/karma.config.js index d3967a8..28238dc 100644 --- a/karma.config.js +++ b/karma.config.js @@ -15,13 +15,16 @@ module.exports = (config) => { frameworks: ['mocha', 'chai'], plugins: ['karma-chrome-launcher', 'karma-chai', 'karma-mocha', 'karma-mocha-reporter'], files: [ - { pattern: './scripts/*.js', type: 'module', included: false }, - { pattern: './test/unit/*.test.js', type: 'module' }, + { pattern: './express/**/*.js', type: 'module', included: false }, + { pattern: './test/unit/**/*.test.js', type: 'module' }, + { pattern: './test/unit/blocks/**/*.html' }, + { pattern: './test/unit/blocks/blocks-test-list.js', type: 'module' }, ], reporters: ['mocha'], port: 9876, proxies: { - '/scripts': '/base/scripts', + '/express': '/base/express', + '/blocks': '/base/test/unit/blocks', }, colors: true, logLevel: config.LOG_INFO, diff --git a/package.json b/package.json index 92ad9a4..4daad09 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@babel/core": "7.13.10", "@babel/eslint-parser": "7.13.10", "chai": "4.2.0", - "eslint": "^7.15.0", + "eslint": "7.15.0", "eslint-plugin-header": "3.1.0", "eslint-plugin-import": "2.22.1", "fs-extra": "9.0.1", diff --git a/test/unit/make.test.js b/test/unit/blocks/blocks-test-list.js similarity index 50% rename from test/unit/make.test.js rename to test/unit/blocks/blocks-test-list.js index 40ded89..2bef37d 100644 --- a/test/unit/make.test.js +++ b/test/unit/blocks/blocks-test-list.js @@ -9,10 +9,21 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* eslint-env mocha */ -describe('Make page', () => { - it('dummy', () => { - // expect(true).to.be.true; - }); -}); +export default [{ + name: 'Table of Contents - 1 level', + input: 'input/table-of-contents.1level.doc.html', + expected: 'expected/table-of-contents.1level.block.html', +}, { + name: 'Table of Contents - 2 levels', + input: 'input/table-of-contents.2levels.doc.html', + expected: 'expected/table-of-contents.2levels.block.html', +}, { + name: 'Link Image - basic', + input: 'input/link-image.basic.doc.html', + expected: 'expected/link-image.basic.block.html', +}, { + name: 'Link Image - no line breaks', + input: 'input/link-image.nolinebreaks.doc.html', + expected: 'expected/link-image.nolinebreaks.block.html', +}]; diff --git a/test/unit/blocks/blocks.test.js b/test/unit/blocks/blocks.test.js new file mode 100644 index 0000000..25bdcc3 --- /dev/null +++ b/test/unit/blocks/blocks.test.js @@ -0,0 +1,68 @@ +/* + * Copyright 2021 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. + */ +/* global expect fetch document */ +/* eslint-env mocha */ +/* eslint-disable no-unused-expressions */ + +import TESTS from './blocks-test-list.js'; + +const ROOT_PATH = '/blocks'; + +const getFragment = (html) => { + const template = document.createElement('template'); + template.innerHTML = html; + return template.content; +}; + +const trim = (html) => html + .replace(/^\s*/gm, '') + .replace(/\s*$/gm, '') + .replace(/\n/gm, ''); + +const fragmentToString = (fragment) => { + let html = ''; + fragment.children.forEach((c) => { + html += c.outerHTML; + }); + return trim(html); +}; + +describe('Block tests', () => { + TESTS.forEach((test) => { + it(test.name, async () => { + expect(test.input, 'Missing test "input" definition').to.exist; + expect(test.expected, 'Missing test "expected" definition').to.exist; + + let res = await fetch(`${ROOT_PATH}/${test.input}`); + expect(res.ok, `Missing test "input" file: ${test.input}`).to.be.true; + + let html = await res.text(); + const doc = getFragment(html); + + res = await fetch(`${ROOT_PATH}/${test.expected}`); + expect(res.ok, `Missing test "expected" file: ${test.expected}`).to.be.true; + + html = await res.text(); + const expected = getFragment(html); + + const block = doc.querySelector('main > div'); + + const classes = Array.from(block.classList.values()); + const blockName = classes[0]; + + const mod = await import(`/express/blocks/${blockName}/${blockName}.js`); + mod.default(block, blockName, doc); + + expect(fragmentToString(block)).to.be.equal(fragmentToString(expected)); + }); + }); +}); diff --git a/test/unit/blocks/expected/link-image.basic.block.html b/test/unit/blocks/expected/link-image.basic.block.html new file mode 100644 index 0000000..53e2c3e --- /dev/null +++ b/test/unit/blocks/expected/link-image.basic.block.html @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/test/unit/blocks/expected/link-image.nolinebreaks.block.html b/test/unit/blocks/expected/link-image.nolinebreaks.block.html new file mode 100644 index 0000000..eef193c --- /dev/null +++ b/test/unit/blocks/expected/link-image.nolinebreaks.block.html @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/test/unit/blocks/expected/table-of-contents.1level.block.html b/test/unit/blocks/expected/table-of-contents.1level.block.html new file mode 100644 index 0000000..ad72b9d --- /dev/null +++ b/test/unit/blocks/expected/table-of-contents.1level.block.html @@ -0,0 +1,5 @@ +
+
H21
+
H22
+
H23
+
\ No newline at end of file diff --git a/test/unit/blocks/expected/table-of-contents.2levels.block.html b/test/unit/blocks/expected/table-of-contents.2levels.block.html new file mode 100644 index 0000000..90ae56a --- /dev/null +++ b/test/unit/blocks/expected/table-of-contents.2levels.block.html @@ -0,0 +1,8 @@ +
+
H21
+
H3211
+
H3212
+
H22
+
H23
+
H3231
+
\ No newline at end of file diff --git a/test/unit/blocks/input/link-image.basic.doc.html b/test/unit/blocks/input/link-image.basic.doc.html new file mode 100644 index 0000000..ca22230 --- /dev/null +++ b/test/unit/blocks/input/link-image.basic.doc.html @@ -0,0 +1,18 @@ +
+ +
\ No newline at end of file diff --git a/test/unit/blocks/input/link-image.nolinebreaks.doc.html b/test/unit/blocks/input/link-image.nolinebreaks.doc.html new file mode 100644 index 0000000..27c26c7 --- /dev/null +++ b/test/unit/blocks/input/link-image.nolinebreaks.doc.html @@ -0,0 +1,16 @@ +
+ +
\ No newline at end of file diff --git a/test/unit/blocks/input/table-of-contents.1level.doc.html b/test/unit/blocks/input/table-of-contents.1level.doc.html new file mode 100644 index 0000000..c786503 --- /dev/null +++ b/test/unit/blocks/input/table-of-contents.1level.doc.html @@ -0,0 +1,16 @@ +
+

H11

+

Table of Contents

+
+
+
Levels
+
1
+
+
+

H21

+

Some content

+

H22

+

Some content

+

H23

+

Some content

+
\ No newline at end of file diff --git a/test/unit/blocks/input/table-of-contents.2levels.doc.html b/test/unit/blocks/input/table-of-contents.2levels.doc.html new file mode 100644 index 0000000..d951987 --- /dev/null +++ b/test/unit/blocks/input/table-of-contents.2levels.doc.html @@ -0,0 +1,21 @@ +
+

H11

+

Table of Contents

+
+
+
Levels
+
2
+
+
+

H21

+

Some content

+

H3211

+

H3212

+

H22

+

Some content

+

H23

+

Some content

+

H3231

+

H432311

+

H432312

+
\ No newline at end of file diff --git a/test/unit/blocks/input/table-of-contents.noheadings.doc.html b/test/unit/blocks/input/table-of-contents.noheadings.doc.html new file mode 100644 index 0000000..d951987 --- /dev/null +++ b/test/unit/blocks/input/table-of-contents.noheadings.doc.html @@ -0,0 +1,21 @@ +
+

H11

+

Table of Contents

+
+
+
Levels
+
2
+
+
+

H21

+

Some content

+

H3211

+

H3212

+

H22

+

Some content

+

H23

+

Some content

+

H3231

+

H432311

+

H432312

+
\ No newline at end of file diff --git a/test/unit/post.test.js b/test/unit/post.test.js deleted file mode 100644 index a3d24e5..0000000 --- a/test/unit/post.test.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2021 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. - */ -/* eslint-env mocha */ - -describe('Post page', () => { - it('dummy', () => { - // expect(true).to.be.true; - }); -}); diff --git a/test/unit/template.test.js b/test/unit/template.test.js deleted file mode 100644 index 5746dc9..0000000 --- a/test/unit/template.test.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2021 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. - */ -/* eslint-env mocha */ - -describe('Template page', () => { - it('dummy', () => { - // expect(true).to.be.true; - }); -}); From 943d5bf7249e3886bedb7b22746f61db9b6ab2d2 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 18 Mar 2021 15:51:12 +0100 Subject: [PATCH 113/649] refactor: fix margins for banner block --- express/blocks/banner/banner.css | 5 ++--- express/styles/styles.css | 4 ---- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/express/blocks/banner/banner.css b/express/blocks/banner/banner.css index 77553a1..b803369 100644 --- a/express/blocks/banner/banner.css +++ b/express/blocks/banner/banner.css @@ -8,7 +8,6 @@ main .banner { @media (min-width:900px) { main .banner { - margin-top: 0; - margin-bottom: 80px; + margin: 80px auto; } -} \ No newline at end of file +} diff --git a/express/styles/styles.css b/express/styles/styles.css index fd2f95d..13d4d90 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -546,10 +546,6 @@ main .section-wrapper.banner-container { padding-top: 80px; background-color: unset; } - - main .section-wrapper.banner-container { - padding-top: 80px; - } } @media(min-width:1200px) { From 1a6d1935d505a0286e6df4bb0d3a4cb341207b5b Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 09:20:09 -0700 Subject: [PATCH 114/649] chore: promo bar update --- express/blocks/sticky-promo-bar/sticky-promo-bar.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/blocks/sticky-promo-bar/sticky-promo-bar.css b/express/blocks/sticky-promo-bar/sticky-promo-bar.css index 8731465..8f861aa 100644 --- a/express/blocks/sticky-promo-bar/sticky-promo-bar.css +++ b/express/blocks/sticky-promo-bar/sticky-promo-bar.css @@ -5,7 +5,7 @@ main .sticky-promo-bar { bottom: 0; background-color: #1473E6; color: white; - padding: 24px; + padding: 12px; padding-right: 36px; font-weight: 800; line-height: 2em; @@ -30,7 +30,7 @@ main .sticky-promo-bar .close { margin-left: 0; width: 21px; height: 21px; - top: 30px; + top: 18px; right: 25px; } From a658dbee100ff7f1faa2906f768ce8536f5f7df3 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 18 Mar 2021 17:27:37 +0100 Subject: [PATCH 115/649] refactor: fix margins for cards block --- express/blocks/cards/cards.css | 5 ++--- express/styles/styles.css | 21 ++++++++------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index 4be249e..e452912 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -1,5 +1,4 @@ main .cards { - margin: 0 auto; padding: 16px 0 56px 0; display: flex; flex-direction: column; @@ -73,9 +72,9 @@ main .cards.large .card .content p { } @media (min-width:900px) { - main .cards { - padding-top: 0; + main .cards { width: 800px; + padding: 80px 0 80px 0; flex-direction: row; padding-bottom: 0; } diff --git a/express/styles/styles.css b/express/styles/styles.css index 13d4d90..5930902 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -354,11 +354,11 @@ main .hero > div { /* make page : default content */ -main .section-wrapper:first-of-type { - padding: 120px 0; +main .section-wrapper { + padding-top: 60px; } -main .section-wrapper { +main .section-wrapper:first-of-type { padding-top: 120px; } @@ -457,11 +457,7 @@ main .section-wrapper.steps-dark-container > div > h2 { main .section-wrapper.cards-container { background-color: #F1F3F4; - padding: 0; -} - -main .section-wrapper.cards-container > div { - padding: 0; + padding-top: 0; } main .section-wrapper.quotes-dark-container { @@ -480,14 +476,14 @@ main .section-wrapper.banner-container { } @media (min-width:600px) { - main .section-wrapper:first-of-type { - padding: 80px 0; + main .section-wrapper { + padding-top: 40px; } - main .section-wrapper { + main .section-wrapper:first-of-type { padding-top: 80px; } - + main .section-wrapper:first-of-type { padding-top: 0; } @@ -543,7 +539,6 @@ main .section-wrapper.banner-container { } main .section-wrapper.cards-container { - padding-top: 80px; background-color: unset; } } From b421dd5db1e1545183e2a0e75f20b105c78c1bfb Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 18 Mar 2021 17:39:33 +0100 Subject: [PATCH 116/649] chore: isolate card colors --- express/blocks/cards/cards.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index e452912..c97d416 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -23,6 +23,7 @@ main .cards .card .hero { main .cards .card .content { padding: 32px 32px 8px 32px; + color: #232323; } main .cards .card .content h2 { @@ -36,6 +37,9 @@ main .cards .card .content p { main .cards.dark .card { background-color: #000; +} + +main .cards.dark .card .content { color: #FFF; } From 08f60d148d78fe9e95cf323d91c11807b5e6c984 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 18 Mar 2021 17:43:04 +0100 Subject: [PATCH 117/649] refactor: fix margins for cards block --- express/blocks/cards/cards.css | 1 - 1 file changed, 1 deletion(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index c97d416..cbd86f6 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -80,7 +80,6 @@ main .cards.large .card .content p { width: 800px; padding: 80px 0 80px 0; flex-direction: row; - padding-bottom: 0; } main .cards .card { From 4e6e06d1a0a93ca241f7923c8a7194631b7fb59f Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 18 Mar 2021 17:50:57 +0100 Subject: [PATCH 118/649] refactor: fix margins for banner block --- express/blocks/banner/banner.css | 2 +- express/styles/styles.css | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/express/blocks/banner/banner.css b/express/blocks/banner/banner.css index b803369..2b229b4 100644 --- a/express/blocks/banner/banner.css +++ b/express/blocks/banner/banner.css @@ -8,6 +8,6 @@ main .banner { @media (min-width:900px) { main .banner { - margin: 80px auto; + margin: 40px auto; } } diff --git a/express/styles/styles.css b/express/styles/styles.css index 5930902..68509d1 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -471,10 +471,6 @@ main .section-wrapper.quotes-dark-container h5 { color: #FFF; } -main .section-wrapper.banner-container { - padding-top: 0; -} - @media (min-width:600px) { main .section-wrapper { padding-top: 40px; From 63afaba5d85c16ea75e0dbf77d87c4f4825dbb0e Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 18 Mar 2021 17:52:20 +0100 Subject: [PATCH 119/649] refactor: fix margins for cards block --- express/blocks/cards/cards.css | 1 + express/styles/styles.css | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/cards/cards.css b/express/blocks/cards/cards.css index cbd86f6..4e90d61 100644 --- a/express/blocks/cards/cards.css +++ b/express/blocks/cards/cards.css @@ -78,6 +78,7 @@ main .cards.large .card .content p { @media (min-width:900px) { main .cards { width: 800px; + margin: 0 auto; padding: 80px 0 80px 0; flex-direction: row; } diff --git a/express/styles/styles.css b/express/styles/styles.css index 68509d1..d1eba8e 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -457,7 +457,6 @@ main .section-wrapper.steps-dark-container > div > h2 { main .section-wrapper.cards-container { background-color: #F1F3F4; - padding-top: 0; } main .section-wrapper.quotes-dark-container { From b2da9337b7fd3093d723eb9ff2f128c300c2aff6 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Thu, 18 Mar 2021 12:54:22 -0400 Subject: [PATCH 120/649] feat(pricing): plans --- express/blocks/pricing/pricing.css | 139 ++++++++++++++++++++++++++--- express/blocks/pricing/pricing.js | 71 +++++++++++++-- express/icons/candle.svg | 45 ++++++++++ express/icons/rocket.svg | 19 ++++ express/icons/rockets.svg | 44 +++++++++ 5 files changed, 299 insertions(+), 19 deletions(-) create mode 100644 express/icons/candle.svg create mode 100644 express/icons/rocket.svg create mode 100644 express/icons/rockets.svg diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index 6f82da3..939490c 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -1,16 +1,131 @@ -main .pricing { - background-color: yellow; -} +@media (min-width: 1200px) { -.pricing-header { - color: rgb(40, 70, 96); -} + .pricing-container { + background-color: rgba(242,244,245,1); + } -.pricing-header span { - color: rgb(16, 196, 89); - transition: 1.5s opacity ease; -} + .pricing-container>div { + max-width: 1140px!important; + } + + .pricing { + padding-top: 100px; + display: flex; + align-items: start; + } + + .pricing-header { + text-align: left!important; + color: rgb(40, 70, 96); + width: 300px; + padding-right: 100px; + } + + .pricing-header span { + color: rgb(16, 196, 89); + transition: 1.5s opacity ease; + } + + .pricing-plans { + display: inline-flex; + justify-content: space-between; + width: 900px; + } + + .pricing-plan { + position: relative; + display: flex; + flex-direction: column; + background-color: white; + width: 210px; + height: 300px; + padding: 20px; + align-items: center; + } + + .pricing-plan-header { + display: flex; + text-align: left; + border-bottom: 1px #DBDBDB solid; + padding-bottom: 10px; + margin-bottom: 10px; + min-height: 110px; + } + + .pricing-plan-header img { + align-self: start; + width: 50px; + height: 50px; + } + + .pricing-plan-header>div>span { + font-weight: 900; + font-size: 20px; + color: rgb(53,65,76); + text-transform: uppercase; + text-align: left; + } + + .pricing-plan-header>div>p { + margin: 10px 0; + font-size: 13px; + color: rgb(53,65,76); + } + + .pricing-plan-pricing { + margin-top: 10px; + font-size: 14px; + color: rgb(53,65,76); + } + + .pricing-plan-pricing strong { + font-size: 24px; + color: black; + } + + .previous-pricing { + position: relative; + margin-left: 20px; + } + + .previous-pricing::after { + position: absolute; + content: ''; + width: 110%; + top: 45%; + left: -5%; + height: 2px; + background-color: red; + } + + .pricing-plan-secondary { + font-size: 13px; + color: rgb(130, 145, 155); + } + + .plan-footer { + margin-top: auto; + } + + .plan-dropdown { + padding: 7px 10px; + border-radius: 5px; + width: 165px; + border: 1px solid #dce0e3; + } -.pricing-header span.hidden { - opacity: 0; + .plan-cta { + width: 145px; + height: 40px; + font-size: 16px; + font-weight: 900; + background-color: #5167CF; + color: white; + border-radius: 24px; + border: none; + margin-top: 1em; + cursor: pointer; + outline: none; + transition: .2s all ease-in; + } } diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 44849a4..24438b3 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -54,14 +54,14 @@ function animateHeader($header, words) { $header.innerHTML = $header.innerHTML.replace('[x]', headerWordTemplate); const $headerWord = $header.children[0]; setInterval(() => { - $headerWord.classList.add('hidden'); + $headerWord.style.opacity = '0'; setTimeout(() => { i += 1; - if (i > max) { + if (i >= max) { i = 0; } $headerWord.innerHTML = words[i]; - $headerWord.classList.remove('hidden'); + $headerWord.style.opacity = '1'; }, 1500); }, 4000); } @@ -75,11 +75,68 @@ function decorateHeader($block, header) { animateHeader($header, words); } -function decoratePlans(plans, features) { +function buildPlanDropdown() { + const $dropdown = createTag('select', { class: 'plan-dropdown' }); + const $option1 = createTag('option', { value: 'Option 1' }); + $option1.innerHTML = 'Option 1'; + $dropdown.append($option1); + return $dropdown; +} +function decoratePlans($block, plans) { + const $plans = createTag('div', { class: 'pricing-plans' }); + $block.append($plans); + plans.forEach((plan) => { + const title = plan['Plan Title']; + const description = plan['Plan Description']; + const imageName = plan['Plan Image']; + const imagePath = `icons/${imageName}.svg`; + const price = plan['Plan Current Price']; + const fullPrice = plan['Plan Full Price']; + const pricingText = plan['Plan Pricing Text']; + + const $plan = createTag('div', { class: 'pricing-plan' }); + $plans.append($plan); + const $header = createTag('div', { class: 'pricing-plan-header' }); + $plan.append($header); + const $headerContainer = createTag('div'); + $header.append($headerContainer); + const $title = createTag('span'); + $title.innerHTML = title; + $headerContainer.append($title); + const $description = createTag('p'); + $description.innerHTML = description; + $headerContainer.append($description); + const $icon = createTag('img', { src: imagePath, class: 'plan-icon' }); + $header.append($icon); + const $pricing = createTag('div', { class: 'pricing-plan-pricing' }); + + if (price === 'Free') { + $pricing.innerHTML = 'Free'; + } else { + $pricing.innerHTML = `US $${price}/mo`; + if (price !== fullPrice) { + $pricing.innerHTML += `US $${fullPrice}/mo`; + } + } + $plan.append($pricing); + if (pricingText) { + const $pricingText = createTag('span', { class: 'pricing-plan-secondary' }); + $pricingText.innerHTML = pricingText; + $plan.append($pricingText); + } + const $footer = createTag('div', { class: 'plan-footer' }); + $plan.append($footer); + if (price !== 'Free') { + const $dropdown = buildPlanDropdown(); + $footer.append($dropdown); + } + const $cta = createTag('input', { type: 'submit', class: 'plan-cta' }); + $footer.append($cta); + }); } -function decorateTable(features) { +function decorateTable($block, features) { } @@ -94,8 +151,8 @@ async function decoratePricing($block) { $block.innerHTML = ''; decorateHeader($block, header); - decoratePlans(plans, features); - decorateTable(features); + decoratePlans($block, plans); + decorateTable($block, features); } export default function decorate($block) { diff --git a/express/icons/candle.svg b/express/icons/candle.svg new file mode 100644 index 0000000..992c3e1 --- /dev/null +++ b/express/icons/candle.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/express/icons/rocket.svg b/express/icons/rocket.svg new file mode 100644 index 0000000..752bfa2 --- /dev/null +++ b/express/icons/rocket.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/express/icons/rockets.svg b/express/icons/rockets.svg new file mode 100644 index 0000000..2bfef78 --- /dev/null +++ b/express/icons/rockets.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 11b7414bbb0cfffdc1f0d40dee22e8f9a3253da2 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 18 Mar 2021 17:54:34 +0100 Subject: [PATCH 121/649] chore: revert --- express/styles/styles.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index d1eba8e..68509d1 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -457,6 +457,7 @@ main .section-wrapper.steps-dark-container > div > h2 { main .section-wrapper.cards-container { background-color: #F1F3F4; + padding-top: 0; } main .section-wrapper.quotes-dark-container { From d0e6d187862568eaf2fec91216aef1872d21a2b6 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 18 Mar 2021 18:37:33 +0100 Subject: [PATCH 122/649] refactor: fix margins for steps block --- express/blocks/steps/steps.css | 9 +++++++-- express/styles/styles.css | 16 ---------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 8929dc5..5d3ea58 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -33,13 +33,18 @@ main .steps .step-description { width: 100%; } -main .steps-dark-container { +main .section-wrapper.steps-dark-container { background-color: black; color: white; + padding: 120px 0; } @media (min-width:900px) { - main .steps { + main .section-wrapper.steps-dark-container { + padding: 80px 0; + } + + main .steps { display: flex; } diff --git a/express/styles/styles.css b/express/styles/styles.css index 68509d1..244967d 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -443,14 +443,6 @@ main .section-wrapper p.button-container { margin-bottom: 0; } -main .section-wrapper.steps-dark-container { - padding: 120px 0; -} - -main .section-wrapper.steps-dark-container > div { - padding: 0 32px; -} - main .section-wrapper.steps-dark-container > div > h2 { margin: 0; } @@ -515,10 +507,6 @@ main .section-wrapper.quotes-dark-container h5 { font-size: 18px; line-height: 22px; } - - main .section-wrapper.steps-dark-container { - padding: 80px 0; - } } @media (min-width:900px) { @@ -544,10 +532,6 @@ main .section-wrapper.quotes-dark-container h5 { font-size: 60px; line-height: 64px; } - - main .section-wrapper.steps-dark-container > div > h2 { - text-align: left; - } } .blog main .section-wrapper h3 { From fe04db870f73cc3cca6a03b6e6aa578c9fb4c249 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 11:07:03 -0700 Subject: [PATCH 123/649] feat(icons): improve icons handling --- express/blocks/steps/steps.css | 8 +++++++ express/icons.svg | 39 ++++++++++++++++++++++++++++++---- express/scripts/scripts.js | 36 ++++++++++++++++++++++++------- 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 8929dc5..a112032 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -27,6 +27,7 @@ main .steps > div { main .steps .step-image { width: 32px; margin-right: 8px; + margin-top: 4px; } main .steps .step-description { @@ -38,6 +39,13 @@ main .steps-dark-container { color: white; } +main .steps .icon { + fill: currentColor; + width: 24px; + height: 24px; + } + + @media (min-width:900px) { main .steps { display: flex; diff --git a/express/icons.svg b/express/icons.svg index 2cd7f9b..10b58d3 100644 --- a/express/icons.svg +++ b/express/icons.svg @@ -125,14 +125,45 @@ - Magic Wand - Magic Wand - + Magic Wand + Magic Wand + - + + + + + Upload + Upload + + + + + + + + Resize + Resize Icon + + + + + + + + + + + + Download + Download + + + + diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index ddbedf6..c192121 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -18,12 +18,6 @@ export function toClassName(name) { : ''; } -export function getIcon(icon) { - return ` - - `; -} - export function createTag(name, attrs) { const el = document.createElement(name); if (typeof attrs === 'object') { @@ -34,6 +28,19 @@ export function createTag(name, attrs) { return el; } +export function getIcon(icon) { + return ` + + `; +} + +export function getIconElement(icon) { + console.log(icon); + const $div = createTag('div'); + $div.innerHTML = getIcon(icon); + return ($div.children[0]); +} + export function linkImage($elem) { const $a = $elem.querySelector('a'); const $parent = $a.closest('div'); @@ -175,7 +182,7 @@ function decorateBlocks() { .then((mod) => { mod.default($block, blockName, document); }) - .catch((err) => console.log('failed to load module', err)); + .catch((err) => console.log(`failed to load module for ${blockName}`, err)); loadCSS(`/express/blocks/${blockName}/${blockName}.css`); }); @@ -649,10 +656,23 @@ function setLCPTrigger() { } function fixIcons() { + /* backwards compatible icon handling, deprecated */ document.querySelectorAll('svg use[href^="./_icons_"]').forEach(($use) => { - console.log($use.href); $use.setAttribute('href', `/express/icons.svg#${$use.getAttribute('href').split('#')[1]}`); }); + + /* new icons handling */ + document.querySelectorAll('img').forEach(($img) => { + const alt = $img.getAttribute('alt'); + if (alt) { + const lowerAlt = alt.toLowerCase(); + if (lowerAlt.includes('icon:')) { + const icon = lowerAlt.split('icon:')[1].trim().split(' '); + const $picture = $img.closest('picture'); + $picture.parentElement.replaceChild(getIconElement(icon), $picture); + } + } + }); } export function unwrapBlock($block) { From 31a2fe9eb31c959dbddc4ae59e269ee5a9c024ac Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 11:47:51 -0700 Subject: [PATCH 124/649] fix: z-index for blue bar --- express/blocks/sticky-promo-bar/sticky-promo-bar.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/sticky-promo-bar/sticky-promo-bar.css b/express/blocks/sticky-promo-bar/sticky-promo-bar.css index 8f861aa..b5157a7 100644 --- a/express/blocks/sticky-promo-bar/sticky-promo-bar.css +++ b/express/blocks/sticky-promo-bar/sticky-promo-bar.css @@ -9,6 +9,7 @@ main .sticky-promo-bar { padding-right: 36px; font-weight: 800; line-height: 2em; + z-index: 10; } main .sticky-promo-bar a:any-link { From d3b74135808aeff9b5d24cfc159f47ed58a1c6d0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 12:20:08 -0700 Subject: [PATCH 125/649] fix: icons and adding cc --- express/icons.svg | 12 +++++++++--- express/scripts/scripts.js | 2 -- express/styles/styles.css | 6 +++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/express/icons.svg b/express/icons.svg index 10b58d3..a208653 100644 --- a/express/icons.svg +++ b/express/icons.svg @@ -160,10 +160,16 @@ Download Download - - - + + + + + Creative Cloud + Creative Cloud Icon + + + diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index c192121..cd39260 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -685,9 +685,7 @@ export function unwrapBlock($block) { let $appendTo; $elems.forEach(($e) => { - console.log($e); if ($e === $block) $appendTo = $blockSection; - console.log($appendTo); if ($appendTo) { $appendTo.appendChild($e); $appendTo = $postBlockSection; diff --git a/express/styles/styles.css b/express/styles/styles.css index 244967d..787b6be 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -287,7 +287,11 @@ main .hero a.button:any-link { text-shadow: none; } - +main .icon { + height: 1em; + width: 1em; + color: currentColor; +} main .hero .hero-bg { position: absolute; top: 0; From 709cde5752a2e861a0124dd9a255a3c31fe32999 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Thu, 18 Mar 2021 16:59:08 -0400 Subject: [PATCH 126/649] feat(pricing): cta functionality --- express/blocks/pricing/pricing.css | 25 ++--- express/blocks/pricing/pricing.js | 156 +++++++++++++++++++++++------ 2 files changed, 137 insertions(+), 44 deletions(-) diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index 939490c..f72537a 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -32,7 +32,7 @@ width: 900px; } - .pricing-plan { + .plan { position: relative; display: flex; flex-direction: column; @@ -43,7 +43,7 @@ align-items: center; } - .pricing-plan-header { + .plan-header { display: flex; text-align: left; border-bottom: 1px #DBDBDB solid; @@ -52,13 +52,13 @@ min-height: 110px; } - .pricing-plan-header img { + .plan-header img { align-self: start; width: 50px; height: 50px; } - .pricing-plan-header>div>span { + .plan-header>div>span { font-weight: 900; font-size: 20px; color: rgb(53,65,76); @@ -66,20 +66,20 @@ text-align: left; } - .pricing-plan-header>div>p { + .plan-header>div>p { margin: 10px 0; font-size: 13px; color: rgb(53,65,76); } - .pricing-plan-pricing { + .plan-pricing { margin-top: 10px; font-size: 14px; color: rgb(53,65,76); } - .pricing-plan-pricing strong { - font-size: 24px; + .plan-pricing strong { + font-size: 22px; color: black; } @@ -98,7 +98,7 @@ background-color: red; } - .pricing-plan-secondary { + .plan-secondary { font-size: 13px; color: rgb(130, 145, 155); } @@ -115,17 +115,18 @@ } .plan-cta { + display: block; width: 145px; - height: 40px; + padding: 10px 0; + margin: 1em auto 0 auto; font-size: 16px; font-weight: 900; background-color: #5167CF; color: white; border-radius: 24px; border: none; - margin-top: 1em; - cursor: pointer; outline: none; transition: .2s all ease-in; + text-decoration: none; } } diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 24438b3..b0f7d10 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -30,6 +30,13 @@ async function fetchPlans(sheet) { return json.data; } +async function fetchPlanOptions(sheet) { + const url = `./${sheet}.json?sheet=plan-options`; + const resp = await fetch(url); + const json = await resp.json(); + return json.data; +} + async function fetchFeatures(sheet) { const url = `./${sheet}.json?sheet=table`; const resp = await fetch(url); @@ -75,15 +82,103 @@ function decorateHeader($block, header) { animateHeader($header, words); } -function buildPlanDropdown() { - const $dropdown = createTag('select', { class: 'plan-dropdown' }); - const $option1 = createTag('option', { value: 'Option 1' }); - $option1.innerHTML = 'Option 1'; - $dropdown.append($option1); - return $dropdown; +function getPlanOptions(planTitle, planOptions) { + const options = []; + planOptions.forEach((option) => { + const optionPlan = option['Option Plan']; + if (planTitle === optionPlan) { + options.push(option); + } + }); + return options; } -function decoratePlans($block, plans) { +function replaceUrlParam(url, paramName, paramValue) { + const parameterValue = paramValue == null ? '' : paramValue; + const pattern = new RegExp(`\\b(${paramName}=).*?(&|#|$)`); + if (url.search(pattern) >= 0) { + return url.replace(pattern, `$1${parameterValue}$2`); + } + const newUrl = url.replace(/[?#]$/, ''); + const urlCharacter = newUrl.indexOf('?') > 0 ? '&' : '?'; + return `${newUrl}${urlCharacter}${paramName}=${parameterValue}`; +} + +function buildUrl(optionUrl, optionPlan) { + const planUrl = new URL(optionUrl); + const currentUrl = new URL(window.location.href); + let rUrl = planUrl.searchParams.get('rUrl'); + if (currentUrl.searchParams.has('host')) { + const hostParam = currentUrl.searchParams.get('host'); + if (hostParam === 'spark.adobe.com') { + planUrl.hostname = 'commerce.adobe.com'; + rUrl = rUrl.replace('spark.adobe.com', hostParam); + } else if (hostParam.includes('qa.adobeprojectm.com')) { + planUrl.hostname = 'commerce.adobe.com'; + rUrl = rUrl.replace('spark.adobe.com', hostParam); + } else if (hostParam.includes('.adobeprojectm.com')) { + planUrl.hostname = 'commerce-stg.adobe.com'; + rUrl = rUrl.replace('adminconsole.adobe.com', 'stage.adminconsole.adobe.com'); + rUrl = rUrl.replace('spark.adobe.com', hostParam); + } + } + if (currentUrl.searchParams.has('touchpointName')) { + rUrl = replaceUrlParam(rUrl, 'touchpointName', currentUrl.searchParams.get('touchpointName')); + } + if (currentUrl.searchParams.has('destinationUrl') && optionPlan === 'Individual') { + rUrl = replaceUrlParam(rUrl, 'destinationUrl', currentUrl.searchParams.get('destinationUrl')); + } + if (currentUrl.searchParams.has('srcUrl')) { + rUrl = replaceUrlParam(rUrl, 'srcUrl', currentUrl.searchParams.get('srcUrl')); + } + if (currentUrl.searchParams.has('code')) { + planUrl.searchParams.set('code', currentUrl.searchParams.get('code')); + } + planUrl.searchParams.set('rUrl', rUrl); + return planUrl.href; +} + +function selectPlanOption($plan, option) { + const priceString = option['Option Price'].split('/'); + const fullPriceString = option['Option Full Price'].split('/'); + const price = priceString[0]; + const priceUnit = priceString[1]; + const fullPrice = fullPriceString[0]; + const fullPriceUnit = fullPriceString[1]; + const text = option['Option Text']; + const cta = option['Option CTA']; + const ctaUrl = buildUrl(option['Option Url'], option['Option Plan']); + + const $pricing = $plan.querySelector('.plan-pricing'); + const $pricingText = $plan.querySelector('.plan-secondary'); + const $cta = $plan.querySelector('.plan-cta'); + + if (price === 'Free') { + $pricing.innerHTML = 'Free'; + } else { + $pricing.innerHTML = `US $${price}/${priceUnit}`; + if (price !== fullPrice) { + $pricing.innerHTML += `US $${fullPrice}/${fullPriceUnit}`; + } + } + if (text) { + $pricingText.innerHTML = text; + } + + $cta.innerHTML = cta; + $cta.href = ctaUrl; +} + +function addDropdownEventListener($plan, options) { + const $dropdown = $plan.querySelector('.plan-dropdown'); + + $dropdown.addEventListener('change', (e) => { + const option = options[e.target.selectedIndex]; + selectPlanOption($plan, option); + }); +} + +function decoratePlans($block, plans, planOptions) { const $plans = createTag('div', { class: 'pricing-plans' }); $block.append($plans); plans.forEach((plan) => { @@ -91,13 +186,10 @@ function decoratePlans($block, plans) { const description = plan['Plan Description']; const imageName = plan['Plan Image']; const imagePath = `icons/${imageName}.svg`; - const price = plan['Plan Current Price']; - const fullPrice = plan['Plan Full Price']; - const pricingText = plan['Plan Pricing Text']; - - const $plan = createTag('div', { class: 'pricing-plan' }); + const $plan = createTag('div', { class: 'plan' }); + const options = getPlanOptions(title, planOptions); $plans.append($plan); - const $header = createTag('div', { class: 'pricing-plan-header' }); + const $header = createTag('div', { class: 'plan-header' }); $plan.append($header); const $headerContainer = createTag('div'); $header.append($headerContainer); @@ -109,30 +201,29 @@ function decoratePlans($block, plans) { $headerContainer.append($description); const $icon = createTag('img', { src: imagePath, class: 'plan-icon' }); $header.append($icon); - const $pricing = createTag('div', { class: 'pricing-plan-pricing' }); - - if (price === 'Free') { - $pricing.innerHTML = 'Free'; - } else { - $pricing.innerHTML = `US $${price}/mo`; - if (price !== fullPrice) { - $pricing.innerHTML += `US $${fullPrice}/mo`; - } - } + const $pricing = createTag('div', { class: 'plan-pricing' }); $plan.append($pricing); - if (pricingText) { - const $pricingText = createTag('span', { class: 'pricing-plan-secondary' }); - $pricingText.innerHTML = pricingText; - $plan.append($pricingText); - } + const $pricingText = createTag('span', { class: 'plan-secondary' }); + $plan.append($pricingText); const $footer = createTag('div', { class: 'plan-footer' }); $plan.append($footer); - if (price !== 'Free') { - const $dropdown = buildPlanDropdown(); + if (options.length > 1) { + const $dropdown = createTag('select', { class: 'plan-dropdown' }); + let i = 0; + options.forEach((option) => { + const name = option['Option Name']; + const $option = createTag('option', { value: i }); + $option.innerHTML = name; + $dropdown.append($option); + i += 1; + }); $footer.append($dropdown); + addDropdownEventListener($plan, options); } - const $cta = createTag('input', { type: 'submit', class: 'plan-cta' }); + const $cta = createTag('a', { class: 'plan-cta' }); $footer.append($cta); + + selectPlanOption($plan, options[0]); }); } @@ -146,12 +237,13 @@ async function decoratePricing($block) { const header = await fetchHeader(sheet); const plans = await fetchPlans(sheet); + const planOptions = await fetchPlanOptions(sheet); const features = await fetchFeatures(sheet); $block.innerHTML = ''; decorateHeader($block, header); - decoratePlans($block, plans); + decoratePlans($block, plans, planOptions); decorateTable($block, features); } From 45b16e2fc42e6b9005961adb67f5b836888bfa54 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Thu, 18 Mar 2021 17:22:13 -0400 Subject: [PATCH 127/649] fix(pricing): better replace function --- express/blocks/pricing/pricing.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index b0f7d10..70dd859 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -94,14 +94,10 @@ function getPlanOptions(planTitle, planOptions) { } function replaceUrlParam(url, paramName, paramValue) { - const parameterValue = paramValue == null ? '' : paramValue; - const pattern = new RegExp(`\\b(${paramName}=).*?(&|#|$)`); - if (url.search(pattern) >= 0) { - return url.replace(pattern, `$1${parameterValue}$2`); - } - const newUrl = url.replace(/[?#]$/, ''); - const urlCharacter = newUrl.indexOf('?') > 0 ? '&' : '?'; - return `${newUrl}${urlCharacter}${paramName}=${parameterValue}`; + const params = url.searchParams; + params.set(paramName, paramValue); + url.search = params.toString(); + return url.toString(); } function buildUrl(optionUrl, optionPlan) { From 0f08163e224582545658c426b20425656c04e8dd Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 14:46:52 -0700 Subject: [PATCH 128/649] fix: improve LCP candidate selection --- express/scripts/scripts.js | 2 +- express/styles/styles.css | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index cd39260..abdae9c 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -638,7 +638,7 @@ function setTemplate() { } function setLCPTrigger() { - const $lcpCandidate = document.querySelector('main img'); + const $lcpCandidate = document.querySelector('main > div:first-of-type img'); if ($lcpCandidate) { if ($lcpCandidate.complete) { postLCP(); diff --git a/express/styles/styles.css b/express/styles/styles.css index 787b6be..93d8f98 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -216,8 +216,13 @@ a.button > svg > use { /* make page : hero */ +main.light-grey { + background-color: #f4f4f4; +} + main { text-align: center; + background-color: white; } main img { From a4da8284219bc095803696db80e05772400f7eeb Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 15:05:08 -0700 Subject: [PATCH 129/649] feat: add theme support --- express/scripts/scripts.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index abdae9c..6def10d 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -702,8 +702,22 @@ function splitSections() { }); } +function setTheme() { + let $theme = document.querySelector("meta[name='Theme']"); + if (!$theme) $theme = document.querySelector("meta[name='theme']"); + if ($theme) { + const theme = $theme.getAttribute('content'); + if (theme) { + const themeClass = toClassName(theme); + const $main = document.querySelector('main'); + $main.classList.add(themeClass); + } + } +} + async function decoratePage() { setTemplate(); + setTheme(); await decorateTesting(); splitSections(); wrapSections('main>div'); From 2651bd3355cb37764a51db1ecaf1924034142746 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Thu, 18 Mar 2021 18:59:15 -0400 Subject: [PATCH 130/649] feat(pricing): adding promotion and cleaning css --- express/blocks/pricing/pricing.css | 64 +++++++++++++++++++++--------- express/blocks/pricing/pricing.js | 9 +++++ 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index f72537a..ea8af37 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -1,38 +1,38 @@ @media (min-width: 1200px) { - .pricing-container { + main .pricing-container { background-color: rgba(242,244,245,1); } - .pricing-container>div { + main .pricing-container>div { max-width: 1140px!important; } - .pricing { + main .pricing { padding-top: 100px; display: flex; align-items: start; } - .pricing-header { + main .pricing .pricing-header { text-align: left!important; color: rgb(40, 70, 96); width: 300px; padding-right: 100px; } - .pricing-header span { + main .pricing .pricing-header span { color: rgb(16, 196, 89); transition: 1.5s opacity ease; } - .pricing-plans { + main .pricing .pricing-plans { display: inline-flex; justify-content: space-between; width: 900px; } - .plan { + main .pricing .plan { position: relative; display: flex; flex-direction: column; @@ -43,7 +43,28 @@ align-items: center; } - .plan-header { + main .pricing .plan.promotional { + border: 2px #5167CF solid; + width: 206px; + height: 296px; + } + + .plan-promotional-header { + position: absolute; + display: flex; + background: linear-gradient(#FFDA00, #e6ab00); + height: 30px; + width: 250px; + top: -32px; + font-weight: 600; + font-size: 12px; + color: black; + border-radius: 7px 7px 0 0; + align-items: center; + justify-content: center; + } + + main .pricing .plan-header { display: flex; text-align: left; border-bottom: 1px #DBDBDB solid; @@ -52,13 +73,13 @@ min-height: 110px; } - .plan-header img { + main .pricing .plan-header img { align-self: start; width: 50px; height: 50px; } - .plan-header>div>span { + main .pricing .plan-header>div>span { font-weight: 900; font-size: 20px; color: rgb(53,65,76); @@ -66,29 +87,34 @@ text-align: left; } - .plan-header>div>p { + main .pricing .plan-header>div>p { margin: 10px 0; font-size: 13px; color: rgb(53,65,76); } - .plan-pricing { + main .pricing .plan-pricing { margin-top: 10px; font-size: 14px; color: rgb(53,65,76); } - .plan-pricing strong { + main .pricing .plan-pricing strong { font-size: 22px; color: black; } - .previous-pricing { + main .pricing .previous-pricing { position: relative; margin-left: 20px; + color: rgb(130, 145, 155); + } + + main .pricing .previous-pricing strong { + color: rgb(130, 145, 155); } - .previous-pricing::after { + main .pricing .previous-pricing::after { position: absolute; content: ''; width: 110%; @@ -98,23 +124,23 @@ background-color: red; } - .plan-secondary { + main .pricing .plan-secondary { font-size: 13px; color: rgb(130, 145, 155); } - .plan-footer { + main .pricing .plan-footer { margin-top: auto; } - .plan-dropdown { + main .pricing .plan-dropdown { padding: 7px 10px; border-radius: 5px; width: 165px; border: 1px solid #dce0e3; } - .plan-cta { + main .pricing .plan-cta { display: block; width: 145px; padding: 10px 0; diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 70dd859..cb0dc9e 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -184,9 +184,18 @@ function decoratePlans($block, plans, planOptions) { const imagePath = `icons/${imageName}.svg`; const $plan = createTag('div', { class: 'plan' }); const options = getPlanOptions(title, planOptions); + const promotion = plan['Plan Special']; $plans.append($plan); const $header = createTag('div', { class: 'plan-header' }); $plan.append($header); + if (promotion) { + $plan.classList.add('promotional'); + const $promotionalHeader = createTag('div', { class: 'plan-promotional-header' }); + $plan.append($promotionalHeader); + const $promotionalHeaderText = createTag('span'); + $promotionalHeaderText.innerHTML = promotion; + $promotionalHeader.append($promotionalHeaderText); + } const $headerContainer = createTag('div'); $header.append($headerContainer); const $title = createTag('span'); From fb54c7673f17821b593c60ad053fe514a14180cc Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 17:46:14 -0700 Subject: [PATCH 131/649] feat(analytics): CTA implementation --- express/scripts/martech.js | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index d7ea271..1f14e4f 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window */ +/* global window document digitalData */ import { loadScript, getLocale } from './scripts.js'; @@ -94,5 +94,31 @@ window.digitalData = { }, }; +function textToName(text) { + const splits = text.toLowerCase().split(' '); + const camelCase = splits.map((s, i) => (i ? s : s.charAt(0).toUpperCase() + s.slice(1))).join(''); + return (camelCase); +} + +function trackButtonClick($button) { + const eventName = textToName($button.textContent); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('digitalData.primaryEvent.eventInfo.eventName', eventName); + + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('digitalData.primaryEvent.eventInfo.eventName'); + console.log(eventName); +} + +function decorateAnalyticsEvents() { + document.querySelectorAll('main .button').forEach(($button) => { + $button.addEventListener('click', () => { + trackButtonClick($button); + }); + }); +} + loadScript('https://www.adobe.com/marketingtech/main.min.js'); loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); + +decorateAnalyticsEvents(); From 30cc7cdd20b2116752dc7eec8b87b79498ca63cc Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 17:58:54 -0700 Subject: [PATCH 132/649] feat(analytics): link implementation --- express/scripts/martech.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 1f14e4f..cb35080 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -96,12 +96,20 @@ window.digitalData = { function textToName(text) { const splits = text.toLowerCase().split(' '); - const camelCase = splits.map((s, i) => (i ? s : s.charAt(0).toUpperCase() + s.slice(1))).join(''); + const camelCase = splits.map((s, i) => (i ? s.charAt(0).toUpperCase() + s.substr(1) : s)).join(''); return (camelCase); } -function trackButtonClick($button) { - const eventName = textToName($button.textContent); +function trackButtonClick($a) { + let eventName = 'linkEvent' + if ($a.textContent) { + eventName = textToName($a.textContent); + } else { + const $img = $a.querySelector('img'); + if ($img && $img.getAttribute('alt')) { + eventName = textToName($img.getAttribute('alt')); + } + } // eslint-disable-next-line no-underscore-dangle digitalData._set('digitalData.primaryEvent.eventInfo.eventName', eventName); @@ -111,9 +119,9 @@ function trackButtonClick($button) { } function decorateAnalyticsEvents() { - document.querySelectorAll('main .button').forEach(($button) => { - $button.addEventListener('click', () => { - trackButtonClick($button); + document.querySelectorAll('main a').forEach(($a) => { + $a.addEventListener('click', () => { + trackButtonClick($a); }); }); } From 860019e264a8bfcd18890ce6cd4deedc7c638d7c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 18:13:58 -0700 Subject: [PATCH 133/649] feat(analytics): link implementation --- express/scripts/martech.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index cb35080..e2ff68f 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window document digitalData */ +/* global window document digitalData _satellite */ import { loadScript, getLocale } from './scripts.js'; @@ -112,7 +112,8 @@ function trackButtonClick($a) { } // eslint-disable-next-line no-underscore-dangle digitalData._set('digitalData.primaryEvent.eventInfo.eventName', eventName); - + // eslint-disable-next-line no-underscore-dangle + _satellite.track('event', { digitalData: digitalData._snapshot() }); // eslint-disable-next-line no-underscore-dangle digitalData._delete('digitalData.primaryEvent.eventInfo.eventName'); console.log(eventName); From 5df1fa029e83b3ca0b9deeb3508e257a5bda2069 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Thu, 18 Mar 2021 21:39:09 -0400 Subject: [PATCH 134/649] feat(pricing): feature grid --- express/blocks/pricing/pricing.css | 78 +++++++++++++++++++++++++++-- express/blocks/pricing/pricing.js | 66 +++++++++++++++++++++++- express/icons/admin-features.svg | 12 +++++ express/icons/checkmark.svg | 4 ++ express/icons/complete-features.svg | 28 +++++++++++ express/icons/crossmark.svg | 9 ++++ express/icons/starter-features.svg | 13 +++++ 7 files changed, 206 insertions(+), 4 deletions(-) create mode 100644 express/icons/admin-features.svg create mode 100644 express/icons/checkmark.svg create mode 100644 express/icons/complete-features.svg create mode 100644 express/icons/crossmark.svg create mode 100644 express/icons/starter-features.svg diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index ea8af37..efd8067 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -12,13 +12,14 @@ padding-top: 100px; display: flex; align-items: start; + flex-wrap: wrap; } main .pricing .pricing-header { text-align: left!important; color: rgb(40, 70, 96); width: 300px; - padding-right: 100px; + padding-right: 60px; } main .pricing .pricing-header span { @@ -29,7 +30,7 @@ main .pricing .pricing-plans { display: inline-flex; justify-content: space-between; - width: 900px; + width: 780px; } main .pricing .plan { @@ -49,7 +50,7 @@ height: 296px; } - .plan-promotional-header { + main .pricing .plan-promotional-header { position: absolute; display: flex; background: linear-gradient(#FFDA00, #e6ab00); @@ -155,4 +156,75 @@ transition: .2s all ease-in; text-decoration: none; } + + main .pricing .features { + margin-top: 20px; + width: 1200px; + } + + main .pricing .category-header { + display: flex; + justify-content: flex-start; + align-items: center; + padding: 10px 0; + margin-top: 20px; + } + + main .pricing .category-image { + width: 30px; + } + + main .pricing .category-text { + margin-left: 20px; + font-size: 21px; + color: rgb(53, 65, 76); + font-weight: 600; + } + + main .pricing .feature { + display: flex; + padding: 15px 0; + } + + main .pricing .feature:nth-child(even) { + background-color: white; + } + + main .pricing .feature-special { + min-width: 40px; + text-align: right; + padding-top: 2px; + } + + main .pricing .feature-special span { + background-color: rgba(15,196,89,1); + height: 50px; + border-radius: 3px; + font-weight: bolder; + font-size: 10px; + color: rgb(255, 255, 255); + padding: 2px 6px; + } + + main .pricing .feature-text { + margin-left: 10px; + margin-right: 10px; + text-align: left; + width: 300px; + font-size: 14px; + color: rgb(53, 65, 76); + line-height: 1.2; + } + + main .pricing .feature-column { + width: 250px; + margin-right: 15px; + display: flex; + justify-content: center; + align-items: center; + } + + main .pricing .feature-column:last-child { + margin-right: 0; + } } diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index cb0dc9e..b1b80e4 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -14,6 +14,7 @@ import { createTag, readBlockConfig, + toClassName, } from '../../scripts/scripts.js'; async function fetchHeader(sheet) { @@ -233,7 +234,70 @@ function decoratePlans($block, plans, planOptions) { } function decorateTable($block, features) { - + const categories = []; + const categoryContainers = []; + const $features = createTag('div', { class: 'features' }); + $block.append($features); + features.forEach((feature) => { + const { Category, Description, Special } = feature; + const columnOneCheck = feature['Column 1']; + const columnTwoCheck = feature['Column 2']; + const columnThreeCheck = feature['Column 3']; + if (!categories.includes(Category)) { + const imageName = toClassName(Category); + const categoryImage = `icons/${imageName}.svg`; + const $category = createTag('div', { class: 'category' }); + $features.append($category); + const $categoryHeader = createTag('div', { class: 'category-header' }); + $category.append($categoryHeader); + const $categoryImage = createTag('img', { src: categoryImage, class: 'category-image' }); + $categoryHeader.append($categoryImage); + const $categoryText = createTag('span', { class: 'category-text' }); + $categoryText.innerHTML = Category; + $categoryHeader.append($categoryText); + categories.push(Category); + categoryContainers[Category] = $category; + } + const $feature = createTag('div', { class: 'feature' }); + categoryContainers[Category].append($feature); + const $featureSpecial = createTag('div', { class: 'feature-special' }); + $feature.append($featureSpecial); + if (Special) { + const $specialText = createTag('span'); + $specialText.innerHTML = Special; + $featureSpecial.append($specialText); + } + const $featureText = createTag('div', { class: 'feature-text' }); + $featureText.innerHTML = Description; + $feature.append($featureText); + const $featureColumnOne = createTag('div', { class: 'feature-column' }); + $feature.append($featureColumnOne); + const $columnOneImage = createTag('img'); + if (columnOneCheck === 'Y') { + $columnOneImage.src = 'icons/checkmark.svg'; + } else { + $columnOneImage.src = 'icons/crossmark.svg'; + } + $featureColumnOne.append($columnOneImage); + const $featureColumnTwo = createTag('div', { class: 'feature-column' }); + const $columnTwoImage = createTag('img'); + if (columnTwoCheck === 'Y') { + $columnTwoImage.src = 'icons/checkmark.svg'; + } else { + $columnTwoImage.src = 'icons/crossmark.svg'; + } + $featureColumnTwo.append($columnTwoImage); + $feature.append($featureColumnTwo); + const $featureColumnThree = createTag('div', { class: 'feature-column' }); + const $columnThreeImage = createTag('img'); + if (columnThreeCheck === 'Y') { + $columnThreeImage.src = 'icons/checkmark.svg'; + } else { + $columnThreeImage.src = 'icons/crossmark.svg'; + } + $featureColumnThree.append($columnThreeImage); + $feature.append($featureColumnThree); + }); } async function decoratePricing($block) { diff --git a/express/icons/admin-features.svg b/express/icons/admin-features.svg new file mode 100644 index 0000000..cac8348 --- /dev/null +++ b/express/icons/admin-features.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/express/icons/checkmark.svg b/express/icons/checkmark.svg new file mode 100644 index 0000000..4209578 --- /dev/null +++ b/express/icons/checkmark.svg @@ -0,0 +1,4 @@ + + + + diff --git a/express/icons/complete-features.svg b/express/icons/complete-features.svg new file mode 100644 index 0000000..cab662f --- /dev/null +++ b/express/icons/complete-features.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/express/icons/crossmark.svg b/express/icons/crossmark.svg new file mode 100644 index 0000000..a9aa327 --- /dev/null +++ b/express/icons/crossmark.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/express/icons/starter-features.svg b/express/icons/starter-features.svg new file mode 100644 index 0000000..fe695ec --- /dev/null +++ b/express/icons/starter-features.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From c1229d64f79bc912bba6613c3d4b7828d23d15d4 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 18 Mar 2021 18:52:47 -0700 Subject: [PATCH 135/649] fix(hero): show hero image --- express/styles/styles.css | 1 - 1 file changed, 1 deletion(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 93d8f98..9801f02 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -222,7 +222,6 @@ main.light-grey { main { text-align: center; - background-color: white; } main img { From 62f7b6165630c8f0f9f6bc5fde892706119ca488 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Thu, 18 Mar 2021 23:36:16 -0400 Subject: [PATCH 136/649] feat(pricing): contact blocks and some styling --- express/blocks/contact/contact.css | 56 +++++++++++++++++++++++++++ express/blocks/contact/contact.js | 61 ++++++++++++++++++++++++++++++ express/blocks/pricing/pricing.css | 31 +++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 express/blocks/contact/contact.css create mode 100644 express/blocks/contact/contact.js diff --git a/express/blocks/contact/contact.css b/express/blocks/contact/contact.css new file mode 100644 index 0000000..6733f49 --- /dev/null +++ b/express/blocks/contact/contact.css @@ -0,0 +1,56 @@ +main .contact { + margin-top: 40px; +} + +main .contact .contact-row { + display: flex; + margin-bottom: 20px; + align-items: center; + justify-content: center; +} + +main .contact .contact-container { + display: flex; + background-color: white; + width: 680px; + height: 80px; + align-items: center; + border-radius: 5px; +} + +main .contact .contact-title { + width: 200px; + font-size: 18px; + color: black; + font-weight: 600; + margin-right: 80px; +} + +main .contact .contact-phone-container { + width: 220px; +} + +main .contact .contact-phone { + font-size: 18px; + color: rgb(130, 145, 156); +} + +main .contact .contact-phone a { + color: #1473e6!important; + text-decoration: none!important; +} + +main .contact .contact-text-container { + width: 460px; +} + +main .contact .contact-text { + padding: 0 20px; + font-size: 14px; + color: rgb(53, 65, 76); +} + +main .contact .contact-text a { + color: #1473e6!important; + text-decoration: none!important; +} diff --git a/express/blocks/contact/contact.js b/express/blocks/contact/contact.js new file mode 100644 index 0000000..03696ce --- /dev/null +++ b/express/blocks/contact/contact.js @@ -0,0 +1,61 @@ +/* + * Copyright 2021 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. + */ +import { + createTag, +} from '../../scripts/scripts.js'; + +function decorateContactBlocks($block) { + const contacts = []; + + const $rows = Array.from($block.children); + $rows.forEach(($row) => { + const $cells = Array.from($row.children); + const $title = $cells[0]; + const $phone = $cells[1]; + const $text = $cells[2]; + + const title = $title.textContent; + const phone = $phone.innerHTML.replace('https://tel.com/', 'tel:'); + const text = $text.innerHTML; + + contacts.push({ + title, phone, text, + }); + }); + + $block.innerHTML = ''; + contacts.forEach((contact) => { + const { title, phone, text } = contact; + + const $contact = createTag('div', { class: 'contact-row' }); + $block.append($contact); + const $title = createTag('span', { class: 'contact-title' }); + $title.innerHTML = title; + $contact.append($title); + const $contactBlock = createTag('div', { class: 'contact-container' }); + $contact.append($contactBlock); + const $phoneContainer = createTag('div', { class: 'contact-phone-container' }); + $contactBlock.append($phoneContainer); + const $phone = createTag('span', { class: 'contact-phone' }); + $phone.innerHTML = phone; + $phoneContainer.append($phone); + const $textContainer = createTag('div', { class: 'contact-text-container' }); + $contactBlock.append($textContainer); + const $text = createTag('p', { class: 'contact-text' }); + $text.innerHTML = text; + $textContainer.append($text); + }); +} + +export default function decorate($block) { + decorateContactBlocks($block); +} diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index efd8067..39d1337 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -6,6 +6,7 @@ main .pricing-container>div { max-width: 1140px!important; + padding-bottom: 40px; } main .pricing { @@ -194,6 +195,7 @@ min-width: 40px; text-align: right; padding-top: 2px; + } main .pricing .feature-special span { @@ -228,3 +230,32 @@ margin-right: 0; } } + +main .pricing-container>div>p { + margin-top: 20px; + margin-bottom: 60px; + font-size: 14px; + color: #82919c; +} + +main .pricing-container>div>p a { + color: #82919c!important; +} + +main .pricing-container .icon-creativecloud { + margin-top: 40px; + width: 32px; + height: 24px; + fill: grey; +} + +main .pricing-container>div>h5 { + font-weight: normal; + font-size: 16px; + color: #82919c; +} + +main .pricing-container>div>h5 a { + color: #1473e6!important; + text-decoration: none!important; +} From 6006a9204e53c6a3741791cd301e05b9ebdf30a1 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Thu, 18 Mar 2021 23:38:56 -0400 Subject: [PATCH 137/649] fix(pricing): /tel/ --- express/blocks/contact/contact.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/contact/contact.js b/express/blocks/contact/contact.js index 03696ce..7a8153d 100644 --- a/express/blocks/contact/contact.js +++ b/express/blocks/contact/contact.js @@ -24,7 +24,7 @@ function decorateContactBlocks($block) { const $text = $cells[2]; const title = $title.textContent; - const phone = $phone.innerHTML.replace('https://tel.com/', 'tel:'); + const phone = $phone.innerHTML.replace('https://tel/', 'tel:'); const text = $text.innerHTML; contacts.push({ From 4f5c70861ac7dde15fd4f37a7164a840361b9a73 Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Fri, 19 Mar 2021 00:05:45 -0400 Subject: [PATCH 138/649] feat(pricing): list block --- express/blocks/list/list.css | 25 ++++++++++++++++++ express/blocks/list/list.js | 51 ++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 express/blocks/list/list.css create mode 100644 express/blocks/list/list.js diff --git a/express/blocks/list/list.css b/express/blocks/list/list.css new file mode 100644 index 0000000..ce9ae42 --- /dev/null +++ b/express/blocks/list/list.css @@ -0,0 +1,25 @@ +main .list { + max-width: 1140px; + margin: 40px auto; + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; +} + +main .list .item { + margin-bottom: 50px; + width: 310px; +} + +main .list .item-title { + font-size: 16px; + font-weight: 600; +} + +main .list .item-text { + margin-top: 0; + font-size: 14px; + color: rgb(40, 60, 96); + text-align: center; + line-height: 1.4; +} diff --git a/express/blocks/list/list.js b/express/blocks/list/list.js new file mode 100644 index 0000000..880bb4a --- /dev/null +++ b/express/blocks/list/list.js @@ -0,0 +1,51 @@ +/* + * Copyright 2021 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. + */ +import { + createTag, +} from '../../scripts/scripts.js'; + +function decorateList($block) { + const list = []; + + const $rows = Array.from($block.children); + $rows.forEach(($row, i) => { + // eslint-disable-next-line no-console + console.log(i); + const $cells = Array.from($row.children); + const $title = $cells[0]; + const $text = $cells[1]; + + const title = $title.textContent; + const text = $text.textContent; + + list.push({ + title, text, + }); + }); + + $block.innerHTML = ''; + list.forEach((item) => { + const { title, text } = item; + const $listItem = createTag('div', { class: 'item' }); + $block.append($listItem); + const $title = createTag('h3', { class: 'item-title' }); + $title.innerHTML = title; + $listItem.append($title); + const $text = createTag('p', { class: 'item-text' }); + $text.innerHTML = text; + $listItem.append($text); + }); +} + +export default function decorate($block) { + decorateList($block); +} From 3b543f382000c1be55fdab0ddf03911361614d70 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 19 Mar 2021 10:54:23 -0700 Subject: [PATCH 139/649] fix(analytics): update link instrumentation --- express/scripts/martech.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index e2ff68f..974d880 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -110,6 +110,15 @@ function trackButtonClick($a) { eventName = textToName($img.getAttribute('alt')); } } + + window.digitalData = { + primaryEvent: { + eventInfo: { + eventName: `adobe.com:express:${eventName}`, + }, + }, + }; + // eslint-disable-next-line no-underscore-dangle digitalData._set('digitalData.primaryEvent.eventInfo.eventName', eventName); // eslint-disable-next-line no-underscore-dangle From 9eebe6b57665878a5f3e7d2ce1595caf3f987029 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 19 Mar 2021 10:57:21 -0700 Subject: [PATCH 140/649] chore: temp disable of link instrumentation --- express/scripts/martech.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 974d880..1128cd4 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -111,6 +111,7 @@ function trackButtonClick($a) { } } + /* window.digitalData = { primaryEvent: { eventInfo: { @@ -118,6 +119,7 @@ function trackButtonClick($a) { }, }, }; + */ // eslint-disable-next-line no-underscore-dangle digitalData._set('digitalData.primaryEvent.eventInfo.eventName', eventName); From 1be2a807d63283bb07c680a80ffa443a1ddce0fb Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 19 Mar 2021 11:04:29 -0700 Subject: [PATCH 141/649] fix(analytics): remove direct update --- express/scripts/martech.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 1128cd4..090760a 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -111,16 +111,6 @@ function trackButtonClick($a) { } } - /* - window.digitalData = { - primaryEvent: { - eventInfo: { - eventName: `adobe.com:express:${eventName}`, - }, - }, - }; - */ - // eslint-disable-next-line no-underscore-dangle digitalData._set('digitalData.primaryEvent.eventInfo.eventName', eventName); // eslint-disable-next-line no-underscore-dangle From f02c6f0741f8caac177d1927b53cbfb2f8ddf596 Mon Sep 17 00:00:00 2001 From: Raphael Wegmueller Date: Fri, 19 Mar 2021 21:43:38 +0100 Subject: [PATCH 142/649] chore: override reload button instead of extending it --- tools/sidekick/plugins.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/sidekick/plugins.js b/tools/sidekick/plugins.js index 25122f7..d12f62a 100644 --- a/tools/sidekick/plugins.js +++ b/tools/sidekick/plugins.js @@ -34,6 +34,7 @@ sk.add({ id: 'reload', + override: true, condition: (sidekick) => sidekick.location.host === sidekick.config.innerHost || sidekick.location.hostname === 'localhost', button: { action: () => { From ff59771e5da4ba80af53f462010bf4a81a21f44a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 19 Mar 2021 14:27:14 -0700 Subject: [PATCH 143/649] fix(page-list): bigger screen support --- express/blocks/page-list/page-list.css | 3 +++ express/blocks/page-list/page-list.js | 8 ++++---- express/scripts/scripts.js | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 417ebb4..67d3c1c 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -2,6 +2,9 @@ main .page-list { margin-top: 64px; text-align: left; } + main .page-list-container > div { + max-width: 100%; + } main .page-list-container .page-list-images > div { max-width: 100%; diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index b0ba9ae..49fb159 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -17,7 +17,7 @@ import { readBlockConfig, } from '../../scripts/scripts.js'; -function addPages(index, filter, $block) { +function addPages(index, config, $block) { const $images = createTag('div', { class: 'page-list-images' }); const $additional = createTag('div', { class: 'page-list-additional' }); $block.appendChild($images); @@ -26,9 +26,9 @@ function addPages(index, filter, $block) { const images = []; index.forEach((page) => { - if (page.path.includes(filter)) { + if (page.path.includes(config.filter)) { const { path, image, title } = page; - if (!images.includes(image)) { + if (!images.includes(image) && (images.length < +config.images)) { const $card = createTag('div', { class: 'card' }); $card.innerHTML = `
@@ -73,7 +73,7 @@ async function decoratePageList($block) { const config = readBlockConfig($block); $block.innerHTML = ''; const index = await fetchIndex(); - addPages(index, config.filter, $block); + addPages(index, config, $block); } export default function decorate($block) { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 6def10d..836d958 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -168,7 +168,7 @@ function decorateBlocks() { if ($section) { $section.classList.add(`${blockName}-container`.replaceAll('--', '-')); } - const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards', 'quotes']; + const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards', 'quotes', 'page-list']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { const options = blockName.substring(b.length + 1).split('-').filter((opt) => !!opt); From 258571d48db2f0e95f00969f2abc4ce945644212 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 19 Mar 2021 17:20:17 -0700 Subject: [PATCH 144/649] feat(blog): improved card styling --- express/blocks/blog-posts/blog-posts.css | 31 +++++++++++++++++++++--- express/blocks/blog-posts/blog-posts.js | 16 ++++++++---- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index eddf188..5a08924 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -1,3 +1,11 @@ +main .blog-posts-container > div { + max-width: 100%; +} + + +main .blog-posts { + margin-top: 64px; +} main .blog-posts .card { display: flex; @@ -15,17 +23,34 @@ main .blog-posts .card { height: 200px; object-fit: cover; width: 100%; + border-radius: 10px 10px 0 0; + } + + main .blog-posts .card .card-body h3 { + font-size: 18px; + line-height: 22px; + margin-top: 0; } + + main .blog-posts .card .card-body .eyebrow { + text-transform: uppercase; + margin: 0; + margin-bottom: 12px; + font-weight: 600; + color: #1473e6; + } + main .blog-posts .card .card-body { - padding: 20px; + padding: 16px; border: 1px solid lightgrey; - border-radius: 0 0 5px 5px; + border-radius: 0 0 10px 10px; border-top: none; - height: 300px; + height: 200px; } main .blog-posts .card .card-body p { font-size: 1rem; + margin: 12px 0; } \ No newline at end of file diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 9058381..77dd9f1 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -18,7 +18,7 @@ import { } from '../../scripts/scripts.js'; async function fetchBlogIndex() { - const resp = await fetch('/blog-index.json'); + const resp = await fetch('/blog/query-index.json'); const json = await resp.json(); return (json.data); } @@ -82,16 +82,22 @@ async function decorateBlogPosts($blogPosts) { } $blogPosts.innerHTML = ''; posts.forEach((post) => { + const { + path, title, teaser, tags, image + } = post; + + const eyebrow = JSON.parse(tags)[0].replace('-',' '); const $card = createTag('div', { class: 'card' }); $card.innerHTML = `
- +
-

${post.title}

-

${post.teaser}

+

${eyebrow}

+

${title}

+

${teaser}

`; $card.addEventListener('click', () => { - window.location.href = `/${post.path}`; + window.location.href = `${path}`; }); $blogPosts.appendChild($card); }); From b291d65b0c561280f2d3a67b64a41cbff94fcd38 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 19 Mar 2021 17:22:20 -0700 Subject: [PATCH 145/649] feat(blog): improved card styling --- express/blocks/blog-posts/blog-posts.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 77dd9f1..3ddc4cc 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -83,10 +83,10 @@ async function decorateBlogPosts($blogPosts) { $blogPosts.innerHTML = ''; posts.forEach((post) => { const { - path, title, teaser, tags, image + path, title, teaser, tags, image, } = post; - const eyebrow = JSON.parse(tags)[0].replace('-',' '); + const eyebrow = JSON.parse(tags)[0].replace('-', ' '); const $card = createTag('div', { class: 'card' }); $card.innerHTML = `
From 733a18bd4fa53e7e5f43179b6a7f93fe370b9ec2 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 19 Mar 2021 17:29:41 -0700 Subject: [PATCH 146/649] feat(blog): improved card styling --- express/blocks/blog-posts/blog-posts.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 3ddc4cc..db55ba7 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -31,14 +31,17 @@ async function filterBlogPosts(locale, filters) { const f = {}; for (const name of Object.keys(filters)) { - const vals = filters[name]; - let v = vals; - if (!Array.isArray(vals)) { - v = [vals]; + const filterNames = ['tag', 'author']; + if (filterNames.includes(name)) { + const vals = filters[name]; + let v = vals; + if (!Array.isArray(vals)) { + v = [vals]; + } + // eslint-disable-next-line no-console + console.log(v); + f[name] = v.map((e) => e.toLowerCase().trim()); } - // eslint-disable-next-line no-console - console.log(v); - f[name] = v.map((e) => e.toLowerCase().trim()); } const result = index.filter((post) => { From 4582a0f81fa108514eeea2a9f6bbf3ce972f4633 Mon Sep 17 00:00:00 2001 From: rofe Date: Sat, 20 Mar 2021 09:59:40 +0100 Subject: [PATCH 147/649] fix(pricing) use standard buttons --- express/blocks/columns/columns.css | 7 +++++-- express/blocks/pricing/pricing.js | 6 +++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 30776e4..09063be 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -15,7 +15,10 @@ main .columns-container > div { main .section-wrapper div.columns > div > div { width: 50%; - text-align: left; padding: 10px; } - } \ No newline at end of file + + main .section-wrapper div.columns > div > div * { + text-align: left; + } +} \ No newline at end of file diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index b1b80e4..8fe8c38 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global fetch */ +/* global window, fetch */ import { createTag, @@ -148,7 +148,7 @@ function selectPlanOption($plan, option) { const $pricing = $plan.querySelector('.plan-pricing'); const $pricingText = $plan.querySelector('.plan-secondary'); - const $cta = $plan.querySelector('.plan-cta'); + const $cta = $plan.querySelector('.button.primary'); if (price === 'Free') { $pricing.innerHTML = 'Free'; @@ -226,7 +226,7 @@ function decoratePlans($block, plans, planOptions) { $footer.append($dropdown); addDropdownEventListener($plan, options); } - const $cta = createTag('a', { class: 'plan-cta' }); + const $cta = createTag('a', { class: 'button primary' }); $footer.append($cta); selectPlanOption($plan, options[0]); From f96dc01f3aece0a2575c73edc4719977b4a712ab Mon Sep 17 00:00:00 2001 From: rofe Date: Sat, 20 Mar 2021 10:08:44 +0100 Subject: [PATCH 148/649] fix(pricing) use standard buttons --- express/blocks/pricing/pricing.css | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index 39d1337..4cfab1a 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -142,22 +142,6 @@ border: 1px solid #dce0e3; } - main .pricing .plan-cta { - display: block; - width: 145px; - padding: 10px 0; - margin: 1em auto 0 auto; - font-size: 16px; - font-weight: 900; - background-color: #5167CF; - color: white; - border-radius: 24px; - border: none; - outline: none; - transition: .2s all ease-in; - text-decoration: none; - } - main .pricing .features { margin-top: 20px; width: 1200px; From 03a10532fdaa08827714f0c014a518dbda88b7ad Mon Sep 17 00:00:00 2001 From: rofe Date: Sat, 20 Mar 2021 10:35:04 +0100 Subject: [PATCH 149/649] feat(button): secondary style --- express/styles/styles.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 9801f02..1e8ddc2 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -199,6 +199,12 @@ a.button:any-link { display: inline-block; } +a.button.secondary:any-link { + border: solid 2px #1473e6; + background-color: #FFF; + color: #1473e6; +} + a.button > svg { float: left; display: inline; From dbb26533a6cf359301a0a00a16b64dd189523549 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 20 Mar 2021 08:35:30 -0700 Subject: [PATCH 150/649] fix(buttons): change secondary to em --- express/scripts/scripts.js | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 836d958..05b4aa1 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -229,14 +229,23 @@ export function loadScript(url, callback, type) { export function readBlockConfig($block) { const config = {}; $block.querySelectorAll(':scope>div').forEach(($row) => { - if ($row.children && $row.children[1]) { - const name = toClassName($row.children[0].textContent); - const $a = $row.children[1].querySelector('a'); - let value = ''; - if ($a) value = $a.href; - else value = $row.children[1].textContent; - config[name] = value; - } + if ($row.children) { + const $cols = [...$row.children]; + if ($cols[1]) { + const $value = $cols[1]; + const name = toClassName($cols[0].textContent); + let value = ''; + if ($value.querySelector('a')) { + const $as = [...$value.querySelectorAll('a')]; + if ($as.length === 1) { + value = $as[0].href; + } else { + value = $as.map(($a) => $a.href); + } + } else value = $row.children[1].textContent; + config[name] = value; + } + }; }); return config; } @@ -293,7 +302,7 @@ function decorateButtons() { const $twoup = $a.parentElement.parentElement; if (!$a.querySelector('img')) { if ($up.childNodes.length === 1 && $up.tagName === 'P') { - $a.className = 'button secondary'; + $a.className = 'button primary'; $up.classList.add('button-container'); } if ($up.childNodes.length === 1 && $up.tagName === 'STRONG' @@ -301,6 +310,11 @@ function decorateButtons() { $a.className = 'button primary'; $twoup.classList.add('button-container'); } + if ($up.childNodes.length === 1 && $up.tagName === 'EM' + && $twoup.childNodes.length === 1 && $twoup.tagName === 'P') { + $a.className = 'button secondary'; + $twoup.classList.add('button-container'); + } } }); } From 6c53318087ba7fdb759186add4438e2616b67295 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 20 Mar 2021 10:44:17 -0700 Subject: [PATCH 151/649] feat(blog): blog homepage --- express/blocks/blog-posts/blog-posts.css | 84 ++++++++++++++++++++++-- express/blocks/blog-posts/blog-posts.js | 74 +++++++++++++++------ express/styles/lazy-styles.css | 6 -- 3 files changed, 131 insertions(+), 33 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index 5a08924..584ffba 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -1,16 +1,44 @@ main .blog-posts-container > div { max-width: 100%; + padding: 0; } +main .blog-posts .cards { + display: flex; + flex-wrap: wrap; + justify-content: center; + margin: 16px; +} + +main .blog-posts .hero-card { + width: 100%; + box-sizing: border-box; + margin: 0; + border: 0; +} -main .blog-posts { - margin-top: 64px; +main .blog-posts .hero-card .card-image { + width: 100%; + padding-bottom: 66.67%; + position: relative; +} + +main .blog-posts .hero-card .card-image img { + object-fit: cover; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; + margin: 0; } main .blog-posts .card { display: flex; flex-direction: column; - width: 290px; + width: 350px; margin: 10px; text-align: left; cursor: pointer; @@ -26,19 +54,41 @@ main .blog-posts .card { border-radius: 10px 10px 0 0; } - main .blog-posts .card .card-body h3 { + main .blog-posts .hero-card .card-body { + max-width: 700px; + margin: auto; + text-align: center; + margin: 16px; + } + + main .blog-posts .hero-card .card-body p { + margin: 12px 0; + + } + + main .blog-posts .hero-card .card-body h3 { + text-align: center; + font-size: 28px; + line-height: 32px; + } + + main .blog-posts .card-body h3 { font-size: 18px; line-height: 22px; margin-top: 0; } - main .blog-posts .card .card-body .eyebrow { + main .blog-posts .card-body .eyebrow { text-transform: uppercase; margin: 0; margin-bottom: 12px; font-weight: 600; - color: #1473e6; + color: #aaa; + font-size: 0.75rem; + line-height: 1rem; + letter-spacing: .1em; + font-weight: 600; } main .blog-posts .card .card-body { @@ -53,4 +103,24 @@ main .blog-posts .card { font-size: 1rem; margin: 12px 0; } - \ No newline at end of file + +@media (min-width: 600px) { + main .blog-posts .hero-card { + display: flex; + flex-direction: row; + align-items: center; + } + main .blog-posts .hero-card .card-image { + height: 320px; + padding-bottom: 0; + } + + main .blog-posts .hero-card .card-body { + text-align: left; + } + + main .blog-posts .hero-card .card-body h3 { + text-align: left; + } + +} \ No newline at end of file diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index db55ba7..129143a 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -23,17 +23,31 @@ async function fetchBlogIndex() { return (json.data); } -async function filterBlogPosts(locale, filters) { +function getFeatured(index, urls) { + const paths = urls.map((url) => new URL(url).pathname.split('.')[0]); + const results = index.filter((post) => { + const path = post.path.split('.')[0]; + return (paths.includes(path)); + }); + return (results); +} + +async function filterBlogPosts(locale, config) { if (!window.blogIndex) { window.blogIndex = await fetchBlogIndex(); } const index = window.blogIndex; + const featured = getFeatured(index, config.featured); + + const result = featured; + + /* filter posts by tag and author */ const f = {}; - for (const name of Object.keys(filters)) { + for (const name of Object.keys(config)) { const filterNames = ['tag', 'author']; if (filterNames.includes(name)) { - const vals = filters[name]; + const vals = config[name]; let v = vals; if (!Array.isArray(vals)) { v = [vals]; @@ -44,7 +58,8 @@ async function filterBlogPosts(locale, filters) { } } - const result = index.filter((post) => { + /* filter and ignore if already in result */ + const feed = index.filter((post) => { let matchedAll = true; for (const name of Object.keys(f)) { let matched = false; @@ -58,41 +73,58 @@ async function filterBlogPosts(locale, filters) { break; } } - return (matchedAll); + return (matchedAll && !result.includes(post)); }); + result.push(...feed); + return (result); } async function decorateBlogPosts($blogPosts) { let posts = []; + let config = {}; - if ($blogPosts.querySelector('a')) { + if ($blogPosts.querySelector(':scope > div:first-of-type > div:first-of-type > a')) { /* handle links */ - const links = []; - $blogPosts.querySelectorAll('a').forEach(($a) => { - links.push($a.href); - }); - - $blogPosts.innerHTML = ''; + const links = [...$blogPosts.querySelectorAll('a')].map(($a) => $a.href); /* needs fixing to work with links */ - posts = await filterBlogPosts('en-US', { path: links }); + config = { + featured: links, + featuredOnly: true, + }; } else { - const config = readBlockConfig($blogPosts); - posts = await filterBlogPosts('en-US', config); + config = readBlockConfig($blogPosts); } + + console.log(config); + posts = await filterBlogPosts('en-US', config); + + const hasHero = config.featured && !config.featuredOnly; + $blogPosts.innerHTML = ''; - posts.forEach((post) => { + const $cards = createTag('div', { class: 'cards' }); + posts.forEach((post, i) => { const { path, title, teaser, tags, image, } = post; - const eyebrow = JSON.parse(tags)[0].replace('-', ' '); - const $card = createTag('div', { class: 'card' }); + const tagsArr = JSON.parse(tags); + const eyebrow = tagsArr[0] ? tagsArr[0].replace('-', ' ') : ''; + const isHero = hasHero && !i; + const imagePath = image.split('?')[0].split('_')[1]; + let pictureTag = ``; + if (isHero) { + pictureTag = ` + + + `; + } + const $card = createTag('div', { class: `${isHero ? 'hero-card' : 'card'}` }); $card.innerHTML = `
- + ${pictureTag}

${eyebrow}

@@ -102,8 +134,10 @@ async function decorateBlogPosts($blogPosts) { $card.addEventListener('click', () => { window.location.href = `${path}`; }); - $blogPosts.appendChild($card); + if (isHero) $blogPosts.appendChild($card); + else $cards.appendChild($card); }); + $blogPosts.appendChild($cards); } export default function decorate($block) { diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index bdbf6fb..e2d30e7 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -112,12 +112,6 @@ main .list ol li::before { display: none; } -main .blog-posts { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - main .tutorials .filters .tag-filter { border: 1px solid lightgray; border-radius: 5px; From c88f7856e4f67dda6195c62a245b6caa03b8ee02 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 20 Mar 2021 13:21:44 -0700 Subject: [PATCH 152/649] feat(blog): styling --- express/blocks/blog-posts/blog-posts.css | 21 +++--- express/blocks/blog-posts/blog-posts.js | 67 +++++++++++--------- express/scripts/scripts.js | 81 +++++++++++++++++++----- express/styles/styles.css | 65 ++++++++++++++++++- 4 files changed, 176 insertions(+), 58 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index 584ffba..b9f4a1d 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -35,13 +35,16 @@ main .blog-posts .hero-card .card-image img { margin: 0; } +main .blog-posts .card, main .blog-posts .hero-card { + cursor: pointer; +} + main .blog-posts .card { display: flex; flex-direction: column; width: 350px; margin: 10px; text-align: left; - cursor: pointer; } main .blog-posts .card .card-image { line-height: 0; @@ -79,14 +82,19 @@ main .blog-posts .card { } - main .blog-posts .card-body .eyebrow { + main .blog-posts .card .card-body p { + font-size: 1rem; + margin: 12px 0; + } + + main .blog-posts .card-body p.eyebrow { text-transform: uppercase; margin: 0; margin-bottom: 12px; font-weight: 600; color: #aaa; - font-size: 0.75rem; - line-height: 1rem; + font-size: 12px; + line-height: 16px; letter-spacing: .1em; font-weight: 600; } @@ -98,11 +106,6 @@ main .blog-posts .card { border-top: none; height: 200px; } - - main .blog-posts .card .card-body p { - font-size: 1rem; - margin: 12px 0; - } @media (min-width: 600px) { main .blog-posts .hero-card { diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 129143a..86c9c93 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -42,42 +42,43 @@ async function filterBlogPosts(locale, config) { const result = featured; - /* filter posts by tag and author */ - const f = {}; - for (const name of Object.keys(config)) { - const filterNames = ['tag', 'author']; - if (filterNames.includes(name)) { - const vals = config[name]; - let v = vals; - if (!Array.isArray(vals)) { - v = [vals]; + if (!config.featuredOnly) { + /* filter posts by tag and author */ + const f = {}; + for (const name of Object.keys(config)) { + const filterNames = ['tag', 'author']; + if (filterNames.includes(name)) { + const vals = config[name]; + let v = vals; + if (!Array.isArray(vals)) { + v = [vals]; + } + // eslint-disable-next-line no-console + console.log(v); + f[name] = v.map((e) => e.toLowerCase().trim()); } - // eslint-disable-next-line no-console - console.log(v); - f[name] = v.map((e) => e.toLowerCase().trim()); } - } - /* filter and ignore if already in result */ - const feed = index.filter((post) => { - let matchedAll = true; - for (const name of Object.keys(f)) { - let matched = false; - f[name].forEach((val) => { - if (post[name].toLowerCase().includes(val)) { - matched = true; + /* filter and ignore if already in result */ + const feed = index.filter((post) => { + let matchedAll = true; + for (const name of Object.keys(f)) { + let matched = false; + f[name].forEach((val) => { + if (post[name].toLowerCase().includes(val)) { + matched = true; + } + }); + if (!matched) { + matchedAll = false; + break; } - }); - if (!matched) { - matchedAll = false; - break; } - } - return (matchedAll && !result.includes(post)); - }); - - result.push(...feed); + return (matchedAll && !result.includes(post)); + }); + result.push(...feed); + } return (result); } @@ -85,10 +86,14 @@ async function decorateBlogPosts($blogPosts) { let posts = []; let config = {}; - if ($blogPosts.querySelector(':scope > div:first-of-type > div:first-of-type > a')) { + let $rows = [...$blogPosts.children]; + let $firstRow = [...$rows[0].children]; + + if ($rows.length === 1 && $firstRow.length === 1) { /* handle links */ const links = [...$blogPosts.querySelectorAll('a')].map(($a) => $a.href); + console.log('links only'); /* needs fixing to work with links */ config = { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 05b4aa1..84ebbc2 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -28,6 +28,19 @@ export function createTag(name, attrs) { return el; } +function getMeta(name) { + let value = ''; + const nameLower = name.toLowerCase(); + const $metas = [...document.querySelectorAll('meta')].filter(($m) => { + const nameAttr = $m.getAttribute('name'); + const propertyAttr = $m.getAttribute('property'); + return ((nameAttr && nameLower === nameAttr.toLowerCase()) + || (propertyAttr && nameLower === propertyAttr.toLowerCase())); + }); + if ($metas[0]) value = $metas[0].getAttribute('content'); + return value; +} + export function getIcon(icon) { return ` @@ -266,7 +279,18 @@ function postLCP() { } } +async function fetchAuthorImage($image, author) { + const resp = await fetch(`/blog/authors/${toClassName(author)}.plain.html`); + const main = await resp.text(); + const $div = createTag('div'); + $div.innerHTML = main; + const $img = $div.querySelector('img'); + const src = $img.src.replace('width=2000', 'width=200'); + $image.src = src; +} + function decorateHero() { + const isBlog = document.documentElement.classList.contains('blog'); const $h1 = document.querySelector('main h1'); // check if h1 is inside a block @@ -274,14 +298,41 @@ function decorateHero() { const $heroPicture = $h1.parentElement.querySelector('picture'); let $heroSection; const $main = document.querySelector('main'); - if ($main.children.length === 1) { + if ($main.children.length === 1 || isBlog) { $heroSection = createTag('div', { class: 'hero' }); const $div = createTag('div'); - $heroSection.append($div); - if ($heroPicture) { - $div.append($heroPicture); + if (isBlog) { + $heroSection.append($div); + const $blogHeader = createTag('div', { class: 'blog-header' }); + $div.append($blogHeader); + const $eyebrow = createTag('div', { class: 'eyebrow' }); + const tagString = getMeta('article:tag'); + const tags = tagString.split(','); + $eyebrow.innerHTML = 'Content & Social Marketing'; + // $eyebrow.innerHTML = tags[0]; + $blogHeader.append($eyebrow); + $blogHeader.append($h1); + const author = getMeta('author'); + const date = getMeta('publication-date'); + const $author = createTag('div', { class: 'author' }); + $author.innerHTML = `
+
+
${author}
+
${date}
+
`; + fetchAuthorImage($author.querySelector('img'), author); + $blogHeader.append($author); + $div.append($blogHeader); + if ($heroPicture) { + $div.append($heroPicture); + } + } else { + $heroSection.append($div); + if ($heroPicture) { + $div.append($heroPicture); + } + $div.append($h1); } - $div.append($h1); $main.prepend($heroSection); } else { $heroSection = $h1.closest('.section-wrapper'); @@ -289,7 +340,9 @@ function decorateHero() { $heroSection.classList.remove('section-wrapper'); } if ($heroPicture) { - $heroPicture.classList.add('hero-bg'); + if (!isBlog) { + $heroPicture.classList.add('hero-bg'); + } } else { $heroSection.classList.add('hero-noimage'); } @@ -709,7 +762,7 @@ export function unwrapBlock($block) { function splitSections() { document.querySelectorAll('main > div > div').forEach(($block) => { - const blocksToSplit = ['template-list', 'layouts']; + const blocksToSplit = ['template-list', 'layouts', 'blog-posts']; if (blocksToSplit.includes($block.className)) { unwrapBlock($block); } @@ -717,15 +770,11 @@ function splitSections() { } function setTheme() { - let $theme = document.querySelector("meta[name='Theme']"); - if (!$theme) $theme = document.querySelector("meta[name='theme']"); - if ($theme) { - const theme = $theme.getAttribute('content'); - if (theme) { - const themeClass = toClassName(theme); - const $main = document.querySelector('main'); - $main.classList.add(themeClass); - } + const theme = getMeta('theme'); + if (theme) { + const themeClass = toClassName(theme); + const $main = document.querySelector('main'); + $main.classList.add(themeClass); } } diff --git a/express/styles/styles.css b/express/styles/styles.css index 1e8ddc2..72a1018 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -302,6 +302,7 @@ main .icon { width: 1em; color: currentColor; } + main .hero .hero-bg { position: absolute; top: 0; @@ -355,8 +356,6 @@ main .hero > div { max-width: 672px; margin: auto; } - - } @media (min-width:900px) { @@ -477,6 +476,68 @@ main .section-wrapper.quotes-dark-container h5 { color: #FFF; } +/* blog styling */ + +.blog main .hero { + margin: 0; + padding: 0; +} + +.blog main .hero > div { + margin: auto; + max-width: 1000px; + width: 100%; + +} + +.blog main .hero { + color: black; +} + +.blog main .hero .blog-header .eyebrow { + text-transform: uppercase; + margin: 0; + margin-bottom: 12px; + font-weight: 600; + color: #aaa; + font-size: 16px; + line-height: 20px; + letter-spacing: .1em; + font-weight: 600; +} + +.blog main .hero .blog-header .author { + margin-top: 32px; + display: flex; +} + +.blog main .hero .blog-header .author .name { + margin-top: 10px; + font-weight: 600; +} + +.blog main .hero .blog-header img { + width: 64px; + height: 64px; + object-fit: cover; + border-radius: 50%; + margin-right: 20px; +} + +.blog main .hero .blog-header { + text-align: left; + margin: 32px; +} + +.blog div.section-wrapper { + text-align: left; +} + +.blog main div.section-wrapper h2, .blog main div.section-wrapper h3 { + text-align: left; +} + + @media (min-width:600px) { main .section-wrapper { padding-top: 40px; From 1d491d65ffcda4cfbba89c7cc8e0d6e8ab99866f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sat, 20 Mar 2021 13:38:34 -0700 Subject: [PATCH 153/649] fix(blog): single featured article --- express/blocks/blog-posts/blog-posts.css | 4 ++++ express/blocks/blog-posts/blog-posts.js | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index b9f4a1d..ebf69ec 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -1,3 +1,7 @@ +main .blog-posts-container { + padding: 0; +} + main .blog-posts-container > div { max-width: 100%; padding: 0; diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 86c9c93..79afd50 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -37,7 +37,7 @@ async function filterBlogPosts(locale, config) { window.blogIndex = await fetchBlogIndex(); } const index = window.blogIndex; - + if (!Array.isArray(config.featured)) config.featured = [config.featured]; const featured = getFeatured(index, config.featured); const result = featured; @@ -93,7 +93,6 @@ async function decorateBlogPosts($blogPosts) { /* handle links */ const links = [...$blogPosts.querySelectorAll('a')].map(($a) => $a.href); - console.log('links only'); /* needs fixing to work with links */ config = { From c8be4f2f4415d4aa7eca839322028cc512a7fd79 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 21 Mar 2021 06:40:46 -0700 Subject: [PATCH 154/649] chore: remove config --- express/blocks/blog-posts/blog-posts.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 79afd50..7470d7c 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -103,12 +103,11 @@ async function decorateBlogPosts($blogPosts) { config = readBlockConfig($blogPosts); } - console.log(config); + $blogPosts.innerHTML = ''; posts = await filterBlogPosts('en-US', config); const hasHero = config.featured && !config.featuredOnly; - $blogPosts.innerHTML = ''; const $cards = createTag('div', { class: 'cards' }); posts.forEach((post, i) => { const { From 555089801d5f85fe945a131fd9f8a1dea7725f22 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 21 Mar 2021 06:55:07 -0700 Subject: [PATCH 155/649] chore: linting --- express/blocks/blog-posts/blog-posts.js | 4 ++-- express/scripts/scripts.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 7470d7c..2ad2e87 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -86,8 +86,8 @@ async function decorateBlogPosts($blogPosts) { let posts = []; let config = {}; - let $rows = [...$blogPosts.children]; - let $firstRow = [...$rows[0].children]; + const $rows = [...$blogPosts.children]; + const $firstRow = [...$rows[0].children]; if ($rows.length === 1 && $firstRow.length === 1) { /* handle links */ diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 84ebbc2..cdb495c 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -48,7 +48,6 @@ export function getIcon(icon) { } export function getIconElement(icon) { - console.log(icon); const $div = createTag('div'); $div.innerHTML = getIcon(icon); return ($div.children[0]); @@ -258,7 +257,7 @@ export function readBlockConfig($block) { } else value = $row.children[1].textContent; config[name] = value; } - }; + } }); return config; } @@ -307,6 +306,7 @@ function decorateHero() { $div.append($blogHeader); const $eyebrow = createTag('div', { class: 'eyebrow' }); const tagString = getMeta('article:tag'); + // eslint-disable-next-line no-unused-vars const tags = tagString.split(','); $eyebrow.innerHTML = 'Content & Social Marketing'; // $eyebrow.innerHTML = tags[0]; From 9d21cea51e593026e3e915dedd226ad827818863 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 21 Mar 2021 09:04:40 -0700 Subject: [PATCH 156/649] chore: icon cleanup --- express/icons.svg | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/express/icons.svg b/express/icons.svg index a208653..5db7633 100644 --- a/express/icons.svg +++ b/express/icons.svg @@ -138,9 +138,9 @@ Upload Upload - - - + + + @@ -157,12 +157,12 @@ - + Download Download - - - + + + From 1574080c201f3da8a2f599dad6564f7544850b26 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 21 Mar 2021 11:32:09 -0700 Subject: [PATCH 157/649] feat(blog): support featured order --- express/blocks/blog-posts/blog-posts.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 2ad2e87..adeb61d 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -20,15 +20,25 @@ import { async function fetchBlogIndex() { const resp = await fetch('/blog/query-index.json'); const json = await resp.json(); - return (json.data); + const byPath = {}; + json.data.forEach((post) => { + byPath[post.path.split('.')[0]] = post; + }); + const index = { data: json.data, byPath }; + return (index); } function getFeatured(index, urls) { const paths = urls.map((url) => new URL(url).pathname.split('.')[0]); - const results = index.filter((post) => { - const path = post.path.split('.')[0]; - return (paths.includes(path)); + const results = []; + paths.forEach((path) => { + const post = index.byPath[path]; + if (post) { + results.push(post); + } }); + + console.log(results); return (results); } @@ -60,7 +70,7 @@ async function filterBlogPosts(locale, config) { } /* filter and ignore if already in result */ - const feed = index.filter((post) => { + const feed = index.data.filter((post) => { let matchedAll = true; for (const name of Object.keys(f)) { let matched = false; From 8e8f236dc4a0daf4c0180e65a8e6dfeb1abafbac Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Sun, 21 Mar 2021 12:46:27 -0700 Subject: [PATCH 158/649] fix(blog): pagination --- express/blocks/blog-posts/blog-posts.css | 3 + express/blocks/blog-posts/blog-posts.js | 82 +++++++++++++++--------- express/scripts/scripts.js | 18 +++--- 3 files changed, 65 insertions(+), 38 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index ebf69ec..472137e 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -39,6 +39,9 @@ main .blog-posts .hero-card .card-image img { margin: 0; } +main .blog-posts { + text-align: center; +} main .blog-posts .card, main .blog-posts .hero-card { cursor: pointer; } diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index adeb61d..fae8b96 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -46,11 +46,13 @@ async function filterBlogPosts(locale, config) { if (!window.blogIndex) { window.blogIndex = await fetchBlogIndex(); } + const result = []; const index = window.blogIndex; - if (!Array.isArray(config.featured)) config.featured = [config.featured]; - const featured = getFeatured(index, config.featured); - - const result = featured; + if (config.featured) { + if (!Array.isArray(config.featured)) config.featured = [config.featured]; + const featured = getFeatured(index, config.featured); + result.push(...featured); + } if (!config.featuredOnly) { /* filter posts by tag and author */ @@ -92,34 +94,24 @@ async function filterBlogPosts(locale, config) { return (result); } -async function decorateBlogPosts($blogPosts) { +async function decorateBlogPosts($blogPosts, config, offset = 0) { let posts = []; - let config = {}; - const $rows = [...$blogPosts.children]; - const $firstRow = [...$rows[0].children]; + posts = await filterBlogPosts('en-US', config); - if ($rows.length === 1 && $firstRow.length === 1) { - /* handle links */ + const hasHero = config.featured && !config.featuredOnly && !offset; - const links = [...$blogPosts.querySelectorAll('a')].map(($a) => $a.href); + const limit = hasHero ? 13 : 12; - /* needs fixing to work with links */ - config = { - featured: links, - featuredOnly: true, - }; - } else { - config = readBlockConfig($blogPosts); + let $cards = $blogPosts.querySelector('.cards'); + console.log($cards); + if (!$cards) { + $cards = createTag('div', { class: 'cards' }); + $blogPosts.appendChild($cards); } - $blogPosts.innerHTML = ''; - posts = await filterBlogPosts('en-US', config); - - const hasHero = config.featured && !config.featuredOnly; - - const $cards = createTag('div', { class: 'cards' }); - posts.forEach((post, i) => { + for (let i = offset; i < offset + limit; i += 1) { + const post = posts[i]; const { path, title, teaser, tags, image, } = post; @@ -147,12 +139,42 @@ async function decorateBlogPosts($blogPosts) { $card.addEventListener('click', () => { window.location.href = `${path}`; }); - if (isHero) $blogPosts.appendChild($card); - else $cards.appendChild($card); - }); - $blogPosts.appendChild($cards); + if (isHero) $blogPosts.prepend($card); + else $cards.append($card); + } + if (posts.length > offset + limit) { + console.log('loadmore'); + const $loadMore = createTag('a', { class: 'load-more button secondary', href: '#' }); + $loadMore.innerHTML = 'Load more articles'; + $blogPosts.append($loadMore); + $loadMore.addEventListener('click', (event) => { + event.preventDefault(); + $loadMore.remove(); + decorateBlogPosts($blogPosts, config, offset + limit); + }); + } } export default function decorate($block) { - decorateBlogPosts($block); + let config = {}; + + const $rows = [...$block.children]; + const $firstRow = [...$rows[0].children]; + + if ($rows.length === 1 && $firstRow.length === 1) { + /* handle links */ + + const links = [...$block.querySelectorAll('a')].map(($a) => $a.href); + + /* needs fixing to work with links */ + config = { + featured: links, + featuredOnly: true, + }; + } else { + config = readBlockConfig($block); + } + $block.innerHTML = ''; + + decorateBlogPosts($block, config); } diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index cdb495c..dd8e3af 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -314,14 +314,16 @@ function decorateHero() { $blogHeader.append($h1); const author = getMeta('author'); const date = getMeta('publication-date'); - const $author = createTag('div', { class: 'author' }); - $author.innerHTML = `
-
-
${author}
-
${date}
-
`; - fetchAuthorImage($author.querySelector('img'), author); - $blogHeader.append($author); + if (author) { + const $author = createTag('div', { class: 'author' }); + $author.innerHTML = `
+
+
${author}
+
${date}
+
`; + fetchAuthorImage($author.querySelector('img'), author); + $blogHeader.append($author); + } $div.append($blogHeader); if ($heroPicture) { $div.append($heroPicture); From 78e11c6eaea0fd00ccb5bdbbcffbc457350af660 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Mon, 22 Mar 2021 17:50:15 +0100 Subject: [PATCH 159/649] feat(ci): Enable linting check for each commit --- .github/workflows/run-tests.yaml | 1 + express/blocks/blog-posts/blog-posts.js | 3 --- express/scripts/martech.js | 3 +-- express/scripts/scripts.js | 2 +- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/run-tests.yaml b/.github/workflows/run-tests.yaml index 655f465..d41cee3 100644 --- a/.github/workflows/run-tests.yaml +++ b/.github/workflows/run-tests.yaml @@ -13,6 +13,7 @@ jobs: node-version: '12' - run: npm install working-directory: test + - run: npm run lint - run: npm test working-directory: test env: diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index fae8b96..caa1e23 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -38,7 +38,6 @@ function getFeatured(index, urls) { } }); - console.log(results); return (results); } @@ -104,7 +103,6 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { const limit = hasHero ? 13 : 12; let $cards = $blogPosts.querySelector('.cards'); - console.log($cards); if (!$cards) { $cards = createTag('div', { class: 'cards' }); $blogPosts.appendChild($cards); @@ -143,7 +141,6 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { else $cards.append($card); } if (posts.length > offset + limit) { - console.log('loadmore'); const $loadMore = createTag('a', { class: 'load-more button secondary', href: '#' }); $loadMore.innerHTML = 'Load more articles'; $blogPosts.append($loadMore); diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 090760a..7d42f37 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -101,7 +101,7 @@ function textToName(text) { } function trackButtonClick($a) { - let eventName = 'linkEvent' + let eventName = 'linkEvent'; if ($a.textContent) { eventName = textToName($a.textContent); } else { @@ -117,7 +117,6 @@ function trackButtonClick($a) { _satellite.track('event', { digitalData: digitalData._snapshot() }); // eslint-disable-next-line no-underscore-dangle digitalData._delete('digitalData.primaryEvent.eventInfo.eventName'); - console.log(eventName); } function decorateAnalyticsEvents() { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index dd8e3af..b3168d5 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -323,7 +323,7 @@ function decorateHero() {
`; fetchAuthorImage($author.querySelector('img'), author); $blogHeader.append($author); - } + } $div.append($blogHeader); if ($heroPicture) { $div.append($heroPicture); From 5bcffb624bd77439ca3a7469e86393388597be84 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 09:57:04 -0700 Subject: [PATCH 160/649] fix(analytics): add namespace and remove locale --- express/scripts/martech.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 7d42f37..a7162e9 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -54,8 +54,10 @@ window.targetGlobalSettings = { bodyHidingEnabled: false, }; -const pageName = `adobe.com:${window.location.pathname.split('/').join(':')}`; const locale = getLocale(window.location); +const pathSegments = window.location.pathname.split('/'); +if (locale !== 'en') pathSegments.shift(); +const pageName = `adobe.com:${pathSegments.join(':')}`; const langs = { en: 'en-US', @@ -101,13 +103,14 @@ function textToName(text) { } function trackButtonClick($a) { - let eventName = 'linkEvent'; + const prefix = 'adobe.com:express:'; + let eventName = `${prefix}linkEvent`; if ($a.textContent) { - eventName = textToName($a.textContent); + eventName = prefix + textToName($a.textContent); } else { const $img = $a.querySelector('img'); if ($img && $img.getAttribute('alt')) { - eventName = textToName($img.getAttribute('alt')); + eventName = prefix + textToName($img.getAttribute('alt')); } } From e5ec3d64cb2699569026df9fe9fcd7aa88db81b0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 10:07:50 -0700 Subject: [PATCH 161/649] fix(analytics): add namespace and remove locale --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index a7162e9..877760b 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -55,7 +55,7 @@ window.targetGlobalSettings = { }; const locale = getLocale(window.location); -const pathSegments = window.location.pathname.split('/'); +const pathSegments = window.location.pathname.substr(1).split('/'); if (locale !== 'en') pathSegments.shift(); const pageName = `adobe.com:${pathSegments.join(':')}`; From 45f3c85e67aa6404fd823ea69e84edaf74537b86 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 11:11:30 -0700 Subject: [PATCH 162/649] chore: cross-origin push fun --- head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/head.html b/head.html index e99af15..5a36c14 100644 --- a/head.html +++ b/head.html @@ -1,4 +1,4 @@ - + From 57181faf6f9b9d5e956824936507dcb9cec417b0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 13:15:56 -0700 Subject: [PATCH 163/649] chore: move blog index --- express/blocks/blog-posts/blog-posts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index caa1e23..6ede63b 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -18,7 +18,7 @@ import { } from '../../scripts/scripts.js'; async function fetchBlogIndex() { - const resp = await fetch('/blog/query-index.json'); + const resp = await fetch('/express/learn/blog/dev-query-index.json'); const json = await resp.json(); const byPath = {}; json.data.forEach((post) => { From 37684422dffdc4dfd17e142147df729b6f677afa Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 13:22:24 -0700 Subject: [PATCH 164/649] fix(blog): handle author block --- express/scripts/scripts.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index b3168d5..6cdf4c7 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -281,11 +281,13 @@ function postLCP() { async function fetchAuthorImage($image, author) { const resp = await fetch(`/blog/authors/${toClassName(author)}.plain.html`); const main = await resp.text(); - const $div = createTag('div'); - $div.innerHTML = main; - const $img = $div.querySelector('img'); - const src = $img.src.replace('width=2000', 'width=200'); - $image.src = src; + if (resp.status === 200) { + const $div = createTag('div'); + $div.innerHTML = main; + const $img = $div.querySelector('img'); + const src = $img.src.replace('width=2000', 'width=200'); + $image.src = src; + } } function decorateHero() { From 2dee719ee00765eb2c5c2b7f4dc70a60a129c331 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 13:27:45 -0700 Subject: [PATCH 165/649] fix(blog): handle author block --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 6cdf4c7..5d8cb31 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -279,7 +279,7 @@ function postLCP() { } async function fetchAuthorImage($image, author) { - const resp = await fetch(`/blog/authors/${toClassName(author)}.plain.html`); + const resp = await fetch(`/express/learn/blog/authors/${toClassName(author)}.plain.html`); const main = await resp.text(); if (resp.status === 200) { const $div = createTag('div'); From a1d375f47668035267a8f7b0e4dc0c5534f6027c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 13:37:34 -0700 Subject: [PATCH 166/649] chore: style fix --- express/blocks/blog-posts/blog-posts.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index 472137e..d919203 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -86,6 +86,7 @@ main .blog-posts .card { font-size: 18px; line-height: 22px; margin-top: 0; + text-align: left; } From d53be1233d515e55145af61384a663291cf34cbe Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 13:53:36 -0700 Subject: [PATCH 167/649] chore: move index --- express/blocks/page-list/page-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 49fb159..63258c7 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -56,7 +56,7 @@ async function fetchIndex() { const indexURL = locale === 'en' ? '/express/query-index.json' : `/${locale}/query-index.json`; */ - const indexURL = '/drafts/uncled/query-index.json'; + const indexURL = '/express/dev-query-index.json'; try { const resp = await fetch(indexURL); const json = await resp.json(); From 07be1f1edd1ec32a8f999f7ce60fb696d0547d62 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Mon, 22 Mar 2021 16:28:34 -0700 Subject: [PATCH 168/649] fix(layouts): adjust layouts block to specs --- express/blocks/layouts/layouts.css | 51 +++++++++++++++++++----------- express/scripts/scripts.js | 5 +-- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 1d6e257..1b743c2 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -1,5 +1,7 @@ main .layouts { - margin: 56px 0 0 0; + margin: 0 auto 0 auto; + width: 200px; + } main .layouts div:first-of-type { @@ -13,10 +15,10 @@ main .layouts .layout { position: relative; border: 2px dashed #D9D9D9; border-radius: 10px; - margin: 32px auto; + margin: 48px auto; cursor: pointer; background-color: #F4F4F4; - width: 311px; + width: 200px; -webkit-column-break-inside: avoid; page-break-inside: avoid; break-inside: avoid; @@ -28,7 +30,7 @@ main .layouts .layout-inside { left: 0; width: 100%; height: 100%; - padding: 16px 0; + padding: 6px 0; box-sizing: border-box; display: flex; align-items: stretch; @@ -40,7 +42,7 @@ main .layouts .layout:hover { } main .layouts .layout-icon { - font-size: 36px; + font-size: 23px; font-weight: 800; color: #484848; position: absolute; @@ -49,6 +51,7 @@ main .layouts .layout-icon { margin: auto; left: 0; right: 0; + padding-bottom: 10px; } main .layouts .layout-icon svg { @@ -63,6 +66,7 @@ main .layouts .layout-description { bottom: 0px; left: 0; right: 0; + font-size: 12px; } main .layouts .layout-content { @@ -72,31 +76,40 @@ main .layouts .layout-content { } main .layouts-container > div { - max-width: 1024px; + max-width: 100%; } -@media (min-width:600px) { +@media (min-width:500px) { main .layouts .layout { - width: 250px; + width: 200px; } main .layouts { display: block; - columns: 240px 2; + columns: 200px 2; margin: 0 auto; - column-gap: 32px; - width: 528px; + column-gap: 48px; + width: 448px; } } -@media (min-width:900px) { - main .layouts .layout { - width: 240px; - } - +@media (min-width:720px) { main .layouts { - display: block; - columns: 240px 3; - width: 792px; + columns: 200px 3; + width: 696px; } } + +@media (min-width:1000px) { + main .layouts { + columns: 200px 4; + width: 944px; + } +} + +@media (min-width:1250px) { + main .layouts { + columns: 200px 5; + width: 1192px; + } +} diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 5d8cb31..7768488 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -751,8 +751,9 @@ export function unwrapBlock($block) { const $elems = [...$section.children]; const $blockSection = createTag('div'); const $postBlockSection = createTag('div'); - $section.parentNode.appendChild($blockSection); - $section.parentNode.appendChild($postBlockSection); + const $nextSection = $section.nextSibling; + $section.parentNode.insertBefore($blockSection, $nextSection); + $section.parentNode.insertBefore($postBlockSection, $nextSection); let $appendTo; $elems.forEach(($e) => { From 02a2a2ca91cbcc79c5c9acaa51851165538356dc Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 00:02:23 -0700 Subject: [PATCH 169/649] feat(layouts): horizontal masonry load --- express/blocks/layouts/layouts.css | 77 +++++++----------------------- express/blocks/layouts/layouts.js | 46 +++++++++++++++++- 2 files changed, 62 insertions(+), 61 deletions(-) diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 1b743c2..0151e74 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -1,40 +1,34 @@ main .layouts { - margin: 0 auto 0 auto; - width: 200px; - + margin: 0 auto; + display: flex; + width: 100%; + justify-content: center; } -main .layouts div:first-of-type { - margin-top: 0; +main .layouts .masonry-col { + width: 252px; } + main .layouts .layout { - height: 0; - overflow: hidden; - background: white; - position: relative; - border: 2px dashed #D9D9D9; - border-radius: 10px; - margin: 48px auto; - cursor: pointer; - background-color: #F4F4F4; - width: 200px; - -webkit-column-break-inside: avoid; - page-break-inside: avoid; - break-inside: avoid; - } + display: inline-block; + margin: 24px; + width: 200px; + overflow: hidden; + background: white; + border: 2px dashed #D9D9D9; + border-radius: 10px; + cursor: pointer; + background-color: #F4F4F4; +} main .layouts .layout-inside { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; padding: 6px 0; box-sizing: border-box; display: flex; align-items: stretch; justify-content: center; + height: 100%; } main .layouts .layout:hover { @@ -78,38 +72,3 @@ main .layouts .layout-content { main .layouts-container > div { max-width: 100%; } - -@media (min-width:500px) { - main .layouts .layout { - width: 200px; - } - - main .layouts { - display: block; - columns: 200px 2; - margin: 0 auto; - column-gap: 48px; - width: 448px; - } -} - -@media (min-width:720px) { - main .layouts { - columns: 200px 3; - width: 696px; - } -} - -@media (min-width:1000px) { - main .layouts { - columns: 200px 4; - width: 944px; - } -} - -@media (min-width:1250px) { - main .layouts { - columns: 200px 5; - width: 1192px; - } -} diff --git a/express/blocks/layouts/layouts.js b/express/blocks/layouts/layouts.js index 48043ff..09c1d1f 100644 --- a/express/blocks/layouts/layouts.js +++ b/express/blocks/layouts/layouts.js @@ -9,13 +9,44 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window */ +/* global window */ import { createTag, getIcon, } from '../../scripts/scripts.js'; +function masonrize(masonry, $masonry) { + const numCols = Math.floor((window.innerWidth - 64) / 252); + if (numCols !== masonry.numCols) { + masonry.numCols = numCols; + const columns = []; + for (let i = 0; i < numCols; i += 1) { + columns.push({ + cells: [], + outerHeight: 0, + }); + } + + masonry.cells.forEach((cell) => { + const minOuterHeight = Math.min(...columns.map((column) => column.outerHeight)); + const column = columns.find((col) => col.outerHeight === minOuterHeight); + column.cells.push(cell); + column.outerHeight += cell.outerHeight; + }); + + $masonry.innerHTML = ''; + + columns.forEach((column) => { + const $column = createTag('div', { class: 'masonry-col' }); + column.cells.forEach((cell) => { + $column.append(cell.element); + }); + $masonry.append($column); + }); + } +} + export default function decorate($block) { const $layouts = Array.from($block.children); const layouts = []; @@ -35,7 +66,7 @@ export default function decorate($block) { $block.innerHTML = ''; const knownIcons = ['instagram', 'youtube', 'facebook', 'twitter', 'snapchat']; layouts.forEach((layout) => { - const $layout = createTag('div', { class: 'layout', style: `padding-top: ${layout.ratio * 100}%` }); + const $layout = createTag('div', { class: 'layout', style: `height: ${layout.ratio * 200}px` }); let iconString = layout.icon; if (knownIcons.includes(iconString)) { iconString = getIcon(layout.icon); @@ -55,4 +86,15 @@ export default function decorate($block) { $block.append($layout); }); + + const cells = [...$block.children].map(($cell) => ({ + element: $cell, + outerHeight: $cell.offsetHeight, + })); + + const masonry = { numCols: 0, cells }; + masonrize(masonry, $block); + window.addEventListener('resize', () => { + masonrize(masonry, $block); + }); } From 46fa2b31c1cb8fc528040bb2ccd58f812733a6d8 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 00:05:43 -0700 Subject: [PATCH 170/649] feat(layouts): horizontal masonry load --- express/blocks/layouts/layouts.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 0151e74..5657949 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -3,6 +3,7 @@ main .layouts { display: flex; width: 100%; justify-content: center; + max-width: 1400px; } main .layouts .masonry-col { From 40a3d16598f58084ac3a34fc69ccc075a674f4f2 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 00:11:36 -0700 Subject: [PATCH 171/649] feat(layouts): horizontal masonry load --- express/blocks/layouts/layouts.css | 3 +-- express/blocks/layouts/layouts.js | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/express/blocks/layouts/layouts.css b/express/blocks/layouts/layouts.css index 5657949..7a30135 100644 --- a/express/blocks/layouts/layouts.css +++ b/express/blocks/layouts/layouts.css @@ -3,7 +3,6 @@ main .layouts { display: flex; width: 100%; justify-content: center; - max-width: 1400px; } main .layouts .masonry-col { @@ -71,5 +70,5 @@ main .layouts .layout-content { } main .layouts-container > div { - max-width: 100%; + max-width: 1400px; } diff --git a/express/blocks/layouts/layouts.js b/express/blocks/layouts/layouts.js index 09c1d1f..353abbe 100644 --- a/express/blocks/layouts/layouts.js +++ b/express/blocks/layouts/layouts.js @@ -17,7 +17,8 @@ import { } from '../../scripts/scripts.js'; function masonrize(masonry, $masonry) { - const numCols = Math.floor((window.innerWidth - 64) / 252); + const width = window.innerWidth > 1400 ? 1400 : window.innerWidth; + const numCols = Math.floor((width - 64) / 252); if (numCols !== masonry.numCols) { masonry.numCols = numCols; const columns = []; From 44f03058f11e642f154dad121a819eec23d67c98 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 23 Mar 2021 08:30:28 +0100 Subject: [PATCH 172/649] feat: add FEDS nav --- express/scripts/martech.js | 8 ++++++++ express/scripts/scripts.js | 11 ++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 877760b..5d2bf1b 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -96,6 +96,14 @@ window.digitalData = { }, }; +window.fedsConfig = { + ...window.fedsConfig, + locale: language, + content: { + experience: 'acom/cc-mega-menu/spark-localnav', + }, +}; + function textToName(text) { const splits = text.toLowerCase().split(' '); const camelCase = splits.map((s, i) => (i ? s.charAt(0).toUpperCase() + s.substr(1) : s)).join(''); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 7768488..8c2e97b 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -98,13 +98,13 @@ export function addBlockClasses($block, classNames) { // }); // } -function decorateHeader() { +function decorateHeaderAndFooter() { const $header = document.querySelector('header'); /* init header with placeholder */ $header.innerHTML = ` -
+
@@ -135,6 +135,11 @@ function decorateHeader() {
`; + + document.querySelector('footer').innerHTML = ` + + + `; } /** @@ -789,7 +794,7 @@ async function decoratePage() { await decorateTesting(); splitSections(); wrapSections('main>div'); - decorateHeader(); + decorateHeaderAndFooter(); decorateHero(); decorateButtons(); fixIcons(); From 9fbf7fa4e509c043f0026de53bf180669b8b1fae Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 23 Mar 2021 08:39:46 +0100 Subject: [PATCH 173/649] feat: lazyload feds and ims --- express/scripts/scripts.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 8c2e97b..3fb9f6c 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -213,6 +213,7 @@ export function loadScript(url, callback, type) { } $head.append($script); $script.onload = callback; + return $script; } // async function loadLazyFooter() { @@ -279,6 +280,8 @@ function postLCP() { if (delay) ms = +delay; setTimeout(() => { loadScript(martechUrl, null, 'module'); + loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js').id = 'feds-script'; + loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); }, ms); } } From a4b30bb07e352702137217e9e2d58744c262abb5 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 23 Mar 2021 14:12:23 +0100 Subject: [PATCH 174/649] feat(index): compute blog index from meta --- helix-query.yaml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/helix-query.yaml b/helix-query.yaml index adb55d7..27b64ff 100644 --- a/helix-query.yaml +++ b/helix-query.yaml @@ -11,25 +11,25 @@ indices: target: https://adobe.sharepoint.com/:x:/r/sites/SparkHelix/Shared%20Documents/website/express/learn/blog/query-index.xlsx?d=w24dec97b02f04be084a8ccc8c02382bf&csf=1&web=1&e=aybVc5 properties: author: - select: main > div:nth-of-type(1) > p:nth-of-type(2) + select: head > meta[name="author"] value: | - match(el, '[bB]y (.*)') + attribute(el, 'content') title: select: head > meta[property="og:title"] value: | attribute(el, 'content') date: - select: main > div:nth-of-type(1) > p:nth-of-type(3) + select: head > meta[name="publication-date"] value: | - parseTimestamp(el, '[Posted on] MM-DD-YYYY') + parseTimestamp(attribute(el, 'content'), 'MM/DD/YYYY') image: select: head > meta[property="og:image"] value: | match(attribute(el, 'content'), 'https:\/\/[^/]+(\/.*)') teaser: - select: main > div:nth-of-type(1) > p:nth-of-type(4) + select: head > meta[name="description"] value: | - words(textContent(el), 0, 20) + attribute(el, 'content') sourceHash: select: head > meta[name=x-source-hash value: | @@ -38,10 +38,14 @@ indices: select: head > meta[property="og:url"] value: | match(attribute(el, 'content'), 'https:\/\/[^/]+(\/.*)') + category: + select: head > meta[name="category"] + value: | + attribute(el, 'content') tags: - select: main > div:nth-of-type(1) > p:last-of-type + select: head > meta[property="article:tag"] values: | - match(el, '(Tags: )? ([^,]+)') + attribute(el, 'content') website: &default source: html From 0c00b97128d1a9773fabb0394a322c9d818403c4 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 23 Mar 2021 14:52:36 +0100 Subject: [PATCH 175/649] feat(index): Index the last modified date --- helix-query.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/helix-query.yaml b/helix-query.yaml index 27b64ff..6b76be2 100644 --- a/helix-query.yaml +++ b/helix-query.yaml @@ -34,10 +34,6 @@ indices: select: head > meta[name=x-source-hash value: | attribute(el, 'content') - external-path: - select: head > meta[property="og:url"] - value: | - match(attribute(el, 'content'), 'https:\/\/[^/]+(\/.*)') category: select: head > meta[name="category"] value: | @@ -46,6 +42,10 @@ indices: select: head > meta[property="article:tag"] values: | attribute(el, 'content') + lastModified: + select: none + value: | + parseTimestamp(headers['last-modified'], 'ddd, DD MMM YYYY hh:mm:ss GMT') website: &default source: html @@ -69,10 +69,10 @@ indices: select: head > meta[name=x-source-hash value: | attribute(el, 'content') - external-path: - select: head > meta[property="og:url"] + lastModified: + select: none value: | - match(attribute(el, 'content'), 'https:\/\/[^/]+(\/.*)') + parseTimestamp(headers['last-modified'], 'ddd, DD MMM YYYY hh:mm:ss GMT') germany: <<: *default From 7a2635be524ea50be5b3a636fc29380926d04247 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 23 Mar 2021 15:09:01 +0100 Subject: [PATCH 176/649] feat: prep adobe id config --- express/scripts/martech.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 5d2bf1b..87033d1 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -104,6 +104,12 @@ window.fedsConfig = { }, }; +window.adobeid = { + client_id: 'spark-helix', + scope: 'AdobeID,openid', + locale: language, +}; + function textToName(text) { const splits = text.toLowerCase().split(' '); const camelCase = splits.map((s, i) => (i ? s.charAt(0).toUpperCase() + s.substr(1) : s)).join(''); From e64ede5709b98484b3768893b246236c2873ef2f Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 23 Mar 2021 15:09:50 +0100 Subject: [PATCH 177/649] chore: only load with ?gnav=true --- express/scripts/scripts.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 3fb9f6c..aa965fa 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -280,8 +280,10 @@ function postLCP() { if (delay) ms = +delay; setTimeout(() => { loadScript(martechUrl, null, 'module'); - loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js').id = 'feds-script'; - loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); + if (usp.get('gnav') === 'true') { + loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js').id = 'feds-script'; + loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); + } }, ms); } } From 090c55e1f2a869d6689eb79249837a04c1f5c3d0 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 23 Mar 2021 15:13:26 +0100 Subject: [PATCH 178/649] feat(feds): add breadcrumbs --- express/scripts/martech.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 87033d1..9cb4027 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -102,6 +102,19 @@ window.fedsConfig = { content: { experience: 'acom/cc-mega-menu/spark-localnav', }, + breadcrumbs: { + showLogo: false, + links: [ + { + title: 'Home', + url: 'https://www.adobe.com/express.html', + }, + { + title: 'Adobe Creative Cloud', + url: 'https://www.adobe.com/creativecloud.html', + }, + ], + }, }; window.adobeid = { From 7400b3b1110772887394eaed65c0c8df951c8b6c Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 23 Mar 2021 15:18:40 +0100 Subject: [PATCH 179/649] fix(feds): fix home breadcrumb --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 9cb4027..be16301 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -107,7 +107,7 @@ window.fedsConfig = { links: [ { title: 'Home', - url: 'https://www.adobe.com/express.html', + url: 'https://www.adobe.com/express/index.html', }, { title: 'Adobe Creative Cloud', From 7756311a7da47d1afee989aff998da5d0142bec4 Mon Sep 17 00:00:00 2001 From: rofe Date: Tue, 23 Mar 2021 16:56:31 +0100 Subject: [PATCH 180/649] feat(feds): load from martech.js --- express/scripts/martech.js | 5 +++++ express/scripts/scripts.js | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index be16301..f38c452 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -157,6 +157,11 @@ function decorateAnalyticsEvents() { }); } +if (new URLSearchParams(window.location.search).get('gnav') === 'true') { + loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js').id = 'feds-script'; + loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); +} + loadScript('https://www.adobe.com/marketingtech/main.min.js'); loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index aa965fa..63aa1c8 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -280,10 +280,6 @@ function postLCP() { if (delay) ms = +delay; setTimeout(() => { loadScript(martechUrl, null, 'module'); - if (usp.get('gnav') === 'true') { - loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js').id = 'feds-script'; - loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); - } }, ms); } } From 08b668c8d12812358486ecb2116edea7a86387ff Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 09:37:22 -0700 Subject: [PATCH 181/649] fix(template-list): adjust design --- express/blocks/template-list/template-list.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 2cfb5ce..19f2c86 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -53,6 +53,10 @@ main .template-list > div { break-inside: avoid; } +main .template-list > div:first-of-type { + margin-top: 0px; +} + main .template-list > div img, main .template-list > div video { border-radius: 10px; From 5d2578a2c568ce1dbac3f18c574bff39203328f4 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 09:43:34 -0700 Subject: [PATCH 182/649] fix(template-list): adjust design --- express/blocks/template-list/template-list.css | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 19f2c86..9df15b8 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -53,10 +53,6 @@ main .template-list > div { break-inside: avoid; } -main .template-list > div:first-of-type { - margin-top: 0px; -} - main .template-list > div img, main .template-list > div video { border-radius: 10px; @@ -82,6 +78,11 @@ main .template-list + .button-container > a { } +main .template-list.masonry > div:first-of-type { + margin-top: 0px; +} + + @media (min-width: 600px) { main .template-list > div { width: 240px; @@ -121,7 +122,7 @@ main .template-list + .button-container > a { max-width: 1056px; } - main .template-list { + main .template-list.masonry { display: block; columns: 240px 4; margin: auto; From e1fd07d6e2d2dd87455828b6caf333de38cf8d98 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 23 Mar 2021 18:09:51 +0100 Subject: [PATCH 183/649] feat(picker): allow to search by branch url --- tools/templates/picker.html | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/templates/picker.html b/tools/templates/picker.html index e0dd6f3..0ff8163 100644 --- a/tools/templates/picker.html +++ b/tools/templates/picker.html @@ -245,13 +245,25 @@ path: url.href }, '', url.href); } - - const params = { + + let link; + try { + link = new URL(q.value); + } catch(e) {} + + let params = { q: q.value, filters: 'branchURL:*', limit: 100, }; + if (link) { + params = { + filters: `branchURL:${link.pathname.substring(1)}`, + limit: 100, + }; + } + const options = { headers: { 'x-api-key': 'Helix_Spark_Content_Search' From 9464b67132a137ac4ce7baaeacd22b0b56f93465 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Tue, 23 Mar 2021 18:23:12 +0100 Subject: [PATCH 184/649] feat(picker): search for multiple branch urls --- tools/templates/picker.html | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tools/templates/picker.html b/tools/templates/picker.html index 0ff8163..4cea700 100644 --- a/tools/templates/picker.html +++ b/tools/templates/picker.html @@ -233,11 +233,11 @@ const resultContainer = document.querySelector('#results'); resultContainer.innerHTML = ''; - const q = document.getElementById('search'); + const search = document.getElementById('search'); if (window.history.pushState) { const searchParams = new URLSearchParams(window.location.search); - searchParams.set('q', q.value); + searchParams.set('q', search.value); const url = new URL(window.location.href); url.search = searchParams.toString(); @@ -246,24 +246,24 @@ }, '', url.href); } - let link; - try { - link = new URL(q.value); - } catch(e) {} + let q = ''; + let branchURL = ''; - let params = { - q: q.value, - filters: 'branchURL:*', + search.value.split(' ').forEach(s => { + try { + const link = new URL(s); + branchURL += `${link.pathname.substring(1)} `; + } catch(e) { + q += `${s} `; + } + }); + + const params = { + q, + filters: `branchURL:${branchURL || '*'}`, limit: 100, }; - if (link) { - params = { - filters: `branchURL:${link.pathname.substring(1)}`, - limit: 100, - }; - } - const options = { headers: { 'x-api-key': 'Helix_Spark_Content_Search' From f782100489be9a5f6a7e7b067b67dbeef92b0d2c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 11:19:41 -0700 Subject: [PATCH 185/649] fix(template-list): adjust design --- express/blocks/template-list/template-list.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 9df15b8..0f41fbb 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -78,8 +78,11 @@ main .template-list + .button-container > a { } -main .template-list.masonry > div:first-of-type { +main .template-list.masonry > div { margin-top: 0px; + padding: 0; + margin-bottom: 0; + padding-bottom: 32px; } From 1be4b8fe78ad7aa12389d70c9da0496f6ec3e47a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 12:02:18 -0700 Subject: [PATCH 186/649] fix: font and spacing --- express/styles/lazy-styles.css | 28 ++++++++++++++-------------- express/styles/styles.css | 11 ++++++++++- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index e2d30e7..c75c2a0 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -11,37 +11,37 @@ */ /* fonts */ + @font-face { + font-family:"adobe-clean"; + src:url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff2"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("opentype"); + font-display:swap;font-style:normal;font-weight:900; + } @font-face { font-family:"adobe-clean"; src:url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("woff2"),url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("woff"),url("https://use.typekit.net/af/b0c5f5/00000000000000003b9b3f85/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("opentype"); font-display:swap;font-style:normal;font-weight:400; } - + + @font-face { + font-family:"adobe-clean"; + src:url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff2"),url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff"),url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("opentype"); + font-display:swap;font-style:normal;font-weight:700; + } + + @font-face { font-family:"adobe-clean"; src:url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff2"),url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff"),url("https://use.typekit.net/af/aa41d0/00000000000000003b9b3f86/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("opentype"); font-display:swap;font-style:italic;font-weight:400; } - @font-face { - font-family:"adobe-clean"; - src:url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff2"),url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff"),url("https://use.typekit.net/af/97fbd1/00000000000000003b9b3f88/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("opentype"); - font-display:swap;font-style:normal;font-weight:700; - } - @font-face { font-family:"adobe-clean"; src:url("https://use.typekit.net/af/37eaae/00000000000000003b9b3f83/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("woff2"),url("https://use.typekit.net/af/37eaae/00000000000000003b9b3f83/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("woff"),url("https://use.typekit.net/af/37eaae/00000000000000003b9b3f83/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("opentype"); font-display:swap;font-style:normal;font-weight:300; } - - @font-face { - font-family:"adobe-clean"; - src:url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff2"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff"),url("https://use.typekit.net/af/ad2a79/00000000000000003b9b3f8c/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("opentype"); - font-display:swap;font-style:normal;font-weight:900; - } - + @font-face { font-family:"adobe-clean"; src:url("https://use.typekit.net/af/a0c22f/00000000000000003b9b3f84/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i3&v=3") format("woff2"),url("https://use.typekit.net/af/a0c22f/00000000000000003b9b3f84/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i3&v=3") format("woff"),url("https://use.typekit.net/af/a0c22f/00000000000000003b9b3f84/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i3&v=3") format("opentype"); diff --git a/express/styles/styles.css b/express/styles/styles.css index 72a1018..558305e 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -1,5 +1,5 @@ body { - font-family: 'adobe-clean', 'Adobe Clean'; + font-family: 'adobe-clean', 'Adobe Clean', sans-serif; background-color: #FFF; color: #232323; margin: 0; @@ -410,6 +410,15 @@ main .section-wrapper h3 { font-weight: 800; } +main .section-wrapper > div > h3 { + margin-top: 64px; +} + +main .section-wrapper > div > h3:first-child { + margin-top: 0px; +} + + main .section-wrapper * + h2 { margin-top: 64px; } From eae54a78d85e9e55939d750cf181cfb31573ebe9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 13:42:14 -0700 Subject: [PATCH 187/649] fix: design --- express/blocks/how-to-steps/how-to-steps.css | 1 + express/scripts/scripts.js | 2 +- express/styles/styles.css | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/express/blocks/how-to-steps/how-to-steps.css b/express/blocks/how-to-steps/how-to-steps.css index dc243f8..9e30722 100644 --- a/express/blocks/how-to-steps/how-to-steps.css +++ b/express/blocks/how-to-steps/how-to-steps.css @@ -14,6 +14,7 @@ main .how-to-steps > div { line-height: 32px; font-weight: 800; text-align: left; + margin-bottom: 20px; } main .how-to-steps .number span { diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 7768488..1220d28 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -180,7 +180,7 @@ function decorateBlocks() { if ($section) { $section.classList.add(`${blockName}-container`.replaceAll('--', '-')); } - const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards', 'quotes', 'page-list']; + const blocksWithOptions = ['checker-board', 'template-list', 'steps', 'cards', 'quotes', 'page-list', 'columns']; blocksWithOptions.forEach((b) => { if (blockName.startsWith(`${b}-`)) { const options = blockName.substring(b.length + 1).split('-').filter((opt) => !!opt); diff --git a/express/styles/styles.css b/express/styles/styles.css index 558305e..6979ee2 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -628,3 +628,8 @@ main .section-wrapper.quotes-dark-container h5 { .blog main .section-wrapper h4 { text-align: left; } + +main .section-wrapper > div { + max-width: 830px; +} + From bf2b6bcbd2d8535c729a1660259f49f67012752f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 14:28:12 -0700 Subject: [PATCH 188/649] feat(columns): introducing top aligned option --- express/blocks/columns/columns.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 09063be..fce815a 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -4,6 +4,10 @@ main .columns > div { align-items: center; } +main .columns.top > div { + align-items: top; +} + main .columns-container > div { max-width: 1024px; } From bbd2bef99fd91e9b13850f5d1ae3f211e3d8fda1 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 15:04:51 -0700 Subject: [PATCH 189/649] fix(cta): height and wrap design --- express/styles/styles.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 6979ee2..fe99001 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -184,11 +184,10 @@ header .mobile .hamburger::before { a.button:any-link { text-decoration: none; border-radius: 18px; - padding: 0px 1.2em; - height: 36px; + padding: 5px 1.2em 7px 1.2em; outline: none; text-align: center; - line-height: 34px; + line-height: 20px; font-size: 1rem; background-color: #1473e6; font-weight: 600; From b656533452cec64c96dce2516cb3f4c02b47ab0a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 15:07:23 -0700 Subject: [PATCH 190/649] fix(button): design adjustment --- express/styles/styles.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index fe99001..0173e92 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -115,9 +115,8 @@ header .mobile .hamburger::before { header .desktop .top .button { font-size: 14px; - height: 32px; margin-left: 0; - padding: 0px 20px 3px 20px; + padding: 5px 20px 7px 20px; } header .desktop .top .selected { From eb25c669a9b6f25c2625c032ea8504a398e11686 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 16:14:26 -0700 Subject: [PATCH 191/649] fix: add html lang --- express/scripts/martech.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 877760b..fb55199 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -76,8 +76,11 @@ const langs = { tw: 'zh-Hant-TW', cn: 'zh-Hans-CN', }; - const language = langs[locale]; +const htmlLang = language.split('-').pop().join('-'); + +document.documentElement.setAttribute('lang', htmlLang); + let category = ''; if (window.location.pathname.includes('/create/') || window.location.pathname.includes('/feature/')) { category = 'design'; From c2c9530b783939630fe05d7f0a072b4733aa1e7a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 16:23:28 -0700 Subject: [PATCH 192/649] fix: add html lang --- express/scripts/martech.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index fb55199..332c609 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -77,7 +77,10 @@ const langs = { cn: 'zh-Hans-CN', }; const language = langs[locale]; -const htmlLang = language.split('-').pop().join('-'); + +const langSplits = language.split('-'); +langSplits.pop(); +const htmlLang = langSplits.join('-'); document.documentElement.setAttribute('lang', htmlLang); From ec10305e38b292003fd0407dc6044829f5c56306 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 16:27:12 -0700 Subject: [PATCH 193/649] fix(steps): max-width for 1200+ --- express/blocks/steps/steps.css | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 7570592..072fdf9 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -61,4 +61,11 @@ main .steps .icon { margin: 0 16px 0 0; width: 30%; } -} \ No newline at end of file +} + + +@media (min-width:1200px) { + main .section-wrapper.steps-dark-container > div { + max-width: 900px; + } +} \ No newline at end of file From ab3cafc4fac91a26b753b729280f5533bf4bb67b Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 16:41:59 -0700 Subject: [PATCH 194/649] fix(design): spacing --- express/blocks/columns/columns.css | 8 ++++++++ express/blocks/steps/steps.css | 1 + 2 files changed, 9 insertions(+) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index fce815a..c4d7408 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -1,3 +1,7 @@ +main .columns { + margin-top: 70px; +} + main .columns > div { display: flex; flex-direction: column; @@ -12,6 +16,10 @@ main .columns-container > div { max-width: 1024px; } +main .columns a > p:empty { + display: none; +} + @media (min-width:900px) { main .columns > div { flex-direction: row; diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 072fdf9..7f5b8a1 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -38,6 +38,7 @@ main .section-wrapper.steps-dark-container { background-color: black; color: white; padding: 120px 0; + margin-top: 110px; } main .steps .icon { From 6b8545f1fbdddc7cddcd28816a0a3ebed86ed37a Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 21:04:20 -0700 Subject: [PATCH 195/649] fix: spacing --- express/styles/styles.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 0173e92..830e550 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -397,6 +397,11 @@ main .section-wrapper h2 { font-weight: 800; } +main .section-wrapper > div > h2 { + margin-top: 80px +} + + main .section-wrapper * + h2 { margin-top: 120px; } From 6a122aebfee7fad591eeb3855fd1e856fa9d3774 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Tue, 23 Mar 2021 22:38:33 -0700 Subject: [PATCH 196/649] fix(tutorials): refactor tutorials --- express/blocks/blog-posts/blog-posts.css | 1 + express/blocks/tutorials/tutorials.css | 130 +++++++++++++ express/blocks/tutorials/tutorials.js | 226 +++++++++++++++++++++++ express/scripts/scripts.js | 214 --------------------- express/styles/lazy-styles.css | 98 ---------- 5 files changed, 357 insertions(+), 312 deletions(-) create mode 100644 express/blocks/tutorials/tutorials.css create mode 100644 express/blocks/tutorials/tutorials.js diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index d919203..b299d5c 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -53,6 +53,7 @@ main .blog-posts .card { margin: 10px; text-align: left; } + main .blog-posts .card .card-image { line-height: 0; } diff --git a/express/blocks/tutorials/tutorials.css b/express/blocks/tutorials/tutorials.css new file mode 100644 index 0000000..24dfb99 --- /dev/null +++ b/express/blocks/tutorials/tutorials.css @@ -0,0 +1,130 @@ +main .tutorials .filters { + margin-top: 25px; +} + +main .tutorials .filters .tag-filter { + border: 1px solid lightgray; + border-radius: 20px; + padding: 4px 20px 6px 20px; + margin: 5px; + display: inline-block; + } + + main .tutorials-container .hidden { + display: none; + } + + main .tutorials-container > div { + max-width: 1440px; + } + + main .tutorials .filters .tag-filter.selected { + background-color: #1473e6; + color: white; + font-weight: 700; + } + + main .tutorials-container .results { + display: flex; + flex-wrap: wrap; + justify-content: center; + } + + main .tutorials-container .results.hidden { + display: none; + } + + main .tutorials-container .results .tutorial-card { + display: flex; + flex-direction: column; + width: 350px; + margin: 10px; + text-align: left; + } + + main .tutorials-container .results .tutorial-card-img { + height: 204px; + position: relative; + border-radius: 10px 10px 0 0; + overflow: hidden; + } + + main .tutorials-container .results .tutorial-card h3 { + font-size: 18px; + padding: 8px; + line-height: 22px; + margin-top: 0; + text-align: left; + } + + main .tutorials-container .results .tutorial-card-img.noimg { + background: linear-gradient(135deg, rgba(238,140,63,1) 0%, rgba(229,66,50,1) 47%, rgba(155,38,103,1) 100%); + color: white; + display: flex; + align-items: center; + justify-content: center; + padding: 20px; + box-sizing: border-box; + } + + main .tutorial-card .tutorial-card-title { + border: 1px solid grey; + border-width: 0 1px 0 1px; + padding: 10px; + } + + main .tutorial-card .tutorial-card-tags { + border-radius: 0 0 10px 10px; + border: 1px solid grey; + border-width: 0 1px 1px 1px; + padding: 10px; + } + + main .tutorials-container .results .tutorial-card-img .badge { + position: absolute; + top: 20px; + left: 20px; + border: 3px solid white; + border-radius: 50%; + height: 30px; + width: 30px; + background-image: url(/express/icons/spark.svg); + } + + main .tutorials-container .results .tutorial-card-img .duration { + position: absolute; + bottom: 10px; + right: 10px; + border: 2px solid white; + border-radius: 20px; + color: white; + padding: 2px 10px 4px 10px; + font-size: 0.8em; + } + + main .overlay { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: rgba(0,0,0,0.7); + display: flex; + align-items: center; + justify-content: center; + } + + main .overlay .overlay-video { + margin: 50px; + } + + + main .tutorials-container .results .tutorial-card-tags span { + border: 1px solid #444; + border-radius: 20px; + color: #444; + display: inline-block; + padding: 2px 10px 4px 10px; + margin: 5px; + } + \ No newline at end of file diff --git a/express/blocks/tutorials/tutorials.js b/express/blocks/tutorials/tutorials.js new file mode 100644 index 0000000..0f07c39 --- /dev/null +++ b/express/blocks/tutorials/tutorials.js @@ -0,0 +1,226 @@ +/* + * 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. + */ +/* globals window document */ + +import { + createTag, + toClassName, +} from '../../scripts/scripts.js'; + +function playYouTubeVideo(vid, $element) { + $element.innerHTML = ``; + + /* + const ytPlayerScript='https://www.youtube.com/iframe_api'; + if (!document.querySelector(`script[src="${ytPlayerScript}"]`)) { + const tag = document.createElement('script'); + tag.src = ytPlayerScript; + var firstScriptTag = document.getElementsByTagName('script')[0]; + firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); + } + + if (typeof YT !== 'undefined' && YT.Player) { + const player = new YT.Player($element.id, { + height: $element.clientHeight, + width: $element.clientWidth, + videoId: vid, + events: { + 'onReady': (event) => { + event.target.playVideo(); + }, + } + }); + } else { + setTimeout(() => { + playYouTubeVideo(vid, $element); + }, 100) + } + */ +} + +function displayTutorial(tutorial) { + if (tutorial.link.includes('youtu')) { + const $overlay = createTag('div', { class: 'overlay' }); + const $video = createTag('div', { class: 'overlay-video', id: 'overlay-video' }); + $overlay.appendChild($video); + window.location.hash = toClassName(tutorial.title); + const $main = document.querySelector('main'); + $main.append($overlay); + const yturl = new URL(tutorial.link); + let vid = yturl.searchParams.get('v'); + if (!vid) { + vid = yturl.pathname.substr(1); + } + $overlay.addEventListener('click', () => { + window.location.hash = ''; + $overlay.remove(); + }); + + playYouTubeVideo(vid, $video); + } else { + window.location.href = tutorial.link; + } + + // eslint-disable-next-line no-console + console.log(tutorial.link); +} + +function createTutorialCard(tutorial) { + const $card = createTag('div', { class: 'tutorial-card' }); + let img; + let noimg = ''; + if (tutorial.img) { + img = ``; + } else { + img = `
${tutorial.title}
`; + noimg = 'noimg'; + } + + $card.innerHTML = `
+
+
+ ${img} +
${tutorial.time}
+
+
+

${tutorial.title}

+
+
+ ${tutorial.tags.join('')} +
+ `; + $card.addEventListener('click', () => { + displayTutorial(tutorial); + }); + return ($card); +} + +function displayTutorialsByCatgory(tutorials, $results, category) { + $results.innerHTML = ''; + + const matches = tutorials.filter((tut) => tut.categories.includes(category)); + matches.forEach((match) => { + $results.appendChild(createTutorialCard(match)); + }); +} + +function toggleCategories($section, show) { + const children = Array.from($section.children); + let afterTutorials = false; + children.forEach(($e) => { + if (afterTutorials) { + if (show) { + $e.classList.remove('hidden'); + } else { + $e.classList.add('hidden'); + } + } + if ($e.classList.contains('tutorials')) { + afterTutorials = true; + } + }); +} + +function displayFilteredTutorials(tutorials, $results, $filters) { + $results.innerHTML = ''; + const $section = $results.closest('.section-wrapper > div'); + const filters = (Array.from($filters)).map((f) => f.textContent); + if (filters.length) { + toggleCategories($section, false); + const matches = tutorials.filter((tut) => filters.every((v) => tut.tags.includes(v))); + matches.forEach((match) => { + $results.append(createTutorialCard(match)); + }); + } else { + toggleCategories($section, true); + } +} + +function decorateTutorials($tutorials) { + const tutorials = []; + const $section = $tutorials.closest('.section-wrapper > div'); + const allTags = []; + const $rows = Array.from($tutorials.children); + $rows.forEach(($row, i) => { + const $cells = Array.from($row.children); + const $tags = $cells[3]; + const $categories = $cells[2]; + const $title = $cells[0]; + const $img = $cells[4]; + + const tags = Array.from($tags.children).map(($tag) => $tag.textContent); + const categories = Array.from($categories.children).map(($cat) => $cat.textContent); + const time = $cells[1].textContent; + const title = $title.textContent; + const link = $title.querySelector('a').href; + const img = $img.querySelector('img') ? $img.querySelector('img').src : undefined; + + tutorials.push({ + title, link, time, tags, categories, img, + }); + + tags.forEach((tag) => { + if (!allTags.includes(tag)) allTags.push(tag); + }); + }); + + $tutorials.innerHTML = ''; + const $results = createTag('div', { class: 'results' }); + $tutorials.append($results); + + const $filters = createTag('div', { class: 'filters' }); + allTags.forEach((tag) => { + const $tagFilter = createTag('span', { class: 'tag-filter' }); + $tagFilter.innerHTML = tag; + $filters.appendChild($tagFilter); + $tagFilter.addEventListener('click', () => { + $tagFilter.classList.toggle('selected'); + displayFilteredTutorials(tutorials, $results, $filters.querySelectorAll('.selected')); + }); + }); + + $tutorials.prepend($filters); + + const $children = Array.from($section.children); + let filterFor = ''; + $children.forEach(($e) => { + // eslint-disable-next-line no-console + console.log($e.tagName); + if ($e.tagName === 'H2') { + if (filterFor) { + const $h2results = createTag('div', { class: 'results' }); + displayTutorialsByCatgory(tutorials, $h2results, filterFor); + $section.insertBefore($h2results, $e); + } + filterFor = $e.textContent; + } + }); + + if (filterFor) { + const $lasth2results = createTag('div', { class: 'results' }); + displayTutorialsByCatgory(tutorials, $lasth2results, filterFor); + $section.appendChild($lasth2results); + } + + if (window.location.hash !== '#') { + const video = window.location.hash.substr(1); + tutorials.forEach((tutorial) => { + if (toClassName(tutorial.title) === video) { + displayTutorial(tutorial); + } + }); + } +} + +export default function decorate($block) { + decorateTutorials($block); +} diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 1220d28..7dc84ce 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -483,219 +483,6 @@ async function decorateTesting() { // console.log(`Test is not run => ${reason}`); } } -function playYouTubeVideo(vid, $element) { - $element.innerHTML = ``; - - /* - const ytPlayerScript='https://www.youtube.com/iframe_api'; - if (!document.querySelector(`script[src="${ytPlayerScript}"]`)) { - const tag = document.createElement('script'); - tag.src = ytPlayerScript; - var firstScriptTag = document.getElementsByTagName('script')[0]; - firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); - } - - if (typeof YT !== 'undefined' && YT.Player) { - const player = new YT.Player($element.id, { - height: $element.clientHeight, - width: $element.clientWidth, - videoId: vid, - events: { - 'onReady': (event) => { - event.target.playVideo(); - }, - } - }); - } else { - setTimeout(() => { - playYouTubeVideo(vid, $element); - }, 100) - } - */ -} - -function displayTutorial(tutorial) { - if (tutorial.link.includes('youtu')) { - const $overlay = createTag('div', { class: 'overlay' }); - const $video = createTag('div', { class: 'overlay-video', id: 'overlay-video' }); - $overlay.appendChild($video); - window.location.hash = toClassName(tutorial.title); - const $main = document.querySelector('main'); - $main.append($overlay); - const yturl = new URL(tutorial.link); - let vid = yturl.searchParams.get('v'); - if (!vid) { - vid = yturl.pathname.substr(1); - } - $overlay.addEventListener('click', () => { - window.location.hash = ''; - $overlay.remove(); - }); - - playYouTubeVideo(vid, $video); - } else { - window.location.href = tutorial.link; - } - - // eslint-disable-next-line no-console - console.log(tutorial.link); -} - -function createTutorialCard(tutorial) { - const $card = createTag('div', { class: 'tutorial-card' }); - let img; - let noimg = ''; - if (tutorial.img) { - img = ``; - } else { - img = `
${tutorial.title}
`; - noimg = 'noimg'; - } - - $card.innerHTML = `
-
-
- ${img} -
${tutorial.time}
-
-
-

${tutorial.title}

-
-
- ${tutorial.tags.join('')} -
- `; - $card.addEventListener('click', () => { - displayTutorial(tutorial); - }); - return ($card); -} - -function displayTutorialsByCatgory(tutorials, $results, category) { - $results.innerHTML = ''; - - const matches = tutorials.filter((tut) => tut.categories.includes(category)); - matches.forEach((match) => { - $results.appendChild(createTutorialCard(match)); - }); -} - -function toggleCategories($section, show) { - const children = Array.from($section.children); - let afterTutorials = false; - children.forEach(($e) => { - // eslint-disable-next-line no-console - console.log($e); - if (afterTutorials) { - if (show) { - $e.classList.remove('hidden'); - } else { - $e.classList.add('hidden'); - } - } - if ($e.classList.contains('tutorials')) { - afterTutorials = true; - } - }); -} - -function displayFilteredTutorials(tutorials, $results, $filters) { - $results.innerHTML = ''; - const $section = $results.closest('.section-wrapper > div'); - // eslint-disable-next-line no-console - console.log($section); - const filters = (Array.from($filters)).map((f) => f.textContent); - if (filters.length) { - toggleCategories($section, false); - const matches = tutorials.filter((tut) => filters.every((v) => tut.tags.includes(v))); - matches.forEach((match) => { - $results.appendChild(createTutorialCard(match)); - }); - } else { - toggleCategories($section, true); - } -} - -function decorateTutorials() { - document.querySelectorAll('main .tutorials').forEach(($tutorials) => { - const tutorials = []; - const $section = $tutorials.closest('.section-wrapper > div'); - const allTags = []; - const $rows = Array.from($tutorials.children); - $rows.forEach(($row, i) => { - // eslint-disable-next-line no-console - console.log(i); - const $cells = Array.from($row.children); - const $tags = $cells[3]; - const $categories = $cells[2]; - const $title = $cells[0]; - const $img = $cells[4]; - - const tags = Array.from($tags.children).map(($tag) => $tag.textContent); - const categories = Array.from($categories.children).map(($cat) => $cat.textContent); - const time = $cells[1].textContent; - const title = $title.textContent; - const link = $title.querySelector('a').href; - const img = $img.querySelector('img') ? $img.querySelector('img').src : undefined; - - tutorials.push({ - title, link, time, tags, categories, img, - }); - - tags.forEach((tag) => { - if (!allTags.includes(tag)) allTags.push(tag); - }); - }); - - $tutorials.innerHTML = ''; - let $results = createTag('div', { class: 'results' }); - $tutorials.appendChild($results); - - const $filters = createTag('div', { class: 'filters' }); - allTags.forEach((tag) => { - const $tagFilter = createTag('span', { class: 'tag-filter' }); - $tagFilter.innerHTML = tag; - $filters.appendChild($tagFilter); - $tagFilter.addEventListener('click', () => { - $tagFilter.classList.toggle('selected'); - displayFilteredTutorials(tutorials, $results, $filters.querySelectorAll('.selected')); - }); - }); - - $tutorials.prepend($filters); - - const $children = Array.from($section.children); - let filterFor = ''; - $children.forEach(($e) => { - // eslint-disable-next-line no-console - console.log($e.tagName); - if ($e.tagName === 'H2') { - if (filterFor) { - $results = createTag('div', { class: 'results' }); - displayTutorialsByCatgory(tutorials, $results, filterFor); - $section.insertBefore($results, $e); - } - filterFor = $e.textContent; - } - }); - - if (filterFor) { - $results = createTag('div', { class: 'results' }); - displayTutorialsByCatgory(tutorials, $results, filterFor); - $section.appendChild($results); - } - - if (window.location.hash !== '#') { - const video = window.location.hash.substr(1); - tutorials.forEach((tutorial) => { - if (toClassName(tutorial.title) === video) { - displayTutorial(tutorial); - } - }); - } - }); -} - function setTemplate() { const path = window.location.pathname; let template = 'default'; @@ -793,7 +580,6 @@ async function decoratePage() { decorateHero(); decorateButtons(); fixIcons(); - decorateTutorials(); decorateDoMoreEmbed(); setLCPTrigger(); document.body.classList.add('appear'); diff --git a/express/styles/lazy-styles.css b/express/styles/lazy-styles.css index c75c2a0..d51a858 100644 --- a/express/styles/lazy-styles.css +++ b/express/styles/lazy-styles.css @@ -112,104 +112,6 @@ main .list ol li::before { display: none; } -main .tutorials .filters .tag-filter { - border: 1px solid lightgray; - border-radius: 5px; - padding: 5px 20px; - margin: 5px; - display: inline-block; -} - -main .tutorials .filters .tag-filter.selected { - background-color: #1473e6; - color: white; - font-weight: 700; -} - -main .tutorials-container .results { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -main .tutorials-container .results.hidden { - display: none; -} - -main .tutorials-container .results .tutorial-card { - width: 275px; - display: flex; - flex-direction: column; - margin: 20px -} - -main .tutorials-container .results .tutorial-card-img { - height: 168px; - position: relative; -} - -main .tutorials-container .results .tutorial-card-img.noimg { - background: linear-gradient(135deg, rgba(238,140,63,1) 0%, rgba(229,66,50,1) 47%, rgba(155,38,103,1) 100%); - color: white; - display: flex; - align-items: center; - justify-content: center; - padding: 20px; - box-sizing: border-box; -} - -main .tutorial-card .title { - font-size: 1.3em; -} - -main .tutorials-container .results .tutorial-card-img .badge { - position: absolute; - top: 20px; - left: 20px; - border: 3px solid white; - border-radius: 50%; - height: 30px; - width: 30px; - background-image: url(/icons/spark.svg); -} - -main .tutorials-container .results .tutorial-card-img .duration { - position: absolute; - bottom: 10px; - right: 10px; - border: 2px solid white; - border-radius: 20px; - color: white; - padding: 2px 10px 4px 10px; - font-size: 0.8em; -} - -main .overlay { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background-color: rgba(0,0,0,0.7); - display: flex; - align-items: center; - justify-content: center; -} - -main .overlay .overlay-video { - margin: 50px; -} - - -main .tutorials-container .results .tutorial-card-tags span { - border: 1px solid lightgray; - border-radius: 5px; - color: lightgray; - display: inline-block; - padding: 4px 10px; - margin: 5px; -} - main video { max-width: 100%; From 32eefa0514b0b2105654078c3b4c0587a35980af Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 09:33:53 +0100 Subject: [PATCH 197/649] feat: switch to new local nav experience --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index f38c452..e04e432 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -100,7 +100,7 @@ window.fedsConfig = { ...window.fedsConfig, locale: language, content: { - experience: 'acom/cc-mega-menu/spark-localnav', + experience: 'cc-express/spark-gnav', }, breadcrumbs: { showLogo: false, From 6bb4c65ee6b3a1a24a5919b6e5d5e252a041ad64 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 09:41:31 +0100 Subject: [PATCH 198/649] chore: random debugging --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index e04e432..c3299c4 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -100,7 +100,7 @@ window.fedsConfig = { ...window.fedsConfig, locale: language, content: { - experience: 'cc-express/spark-gnav', + experience: 'acom/cc-express/spark-gnav', }, breadcrumbs: { showLogo: false, From 9a341815f1a2082d1587321602959bde0a269bab Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 09:43:07 +0100 Subject: [PATCH 199/649] chore: revert --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index c3299c4..e04e432 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -100,7 +100,7 @@ window.fedsConfig = { ...window.fedsConfig, locale: language, content: { - experience: 'acom/cc-express/spark-gnav', + experience: 'cc-express/spark-gnav', }, breadcrumbs: { showLogo: false, From f31a4dcb757bb74c911940068c1b2a8a938496a9 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 14:19:12 +0100 Subject: [PATCH 200/649] feat: fragments --- express/scripts/scripts.js | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 7dc84ce..29dcbb5 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -172,6 +172,36 @@ function decorateDoMoreEmbed() { }); } +function resolveFragments() { + Array.from(document.querySelectorAll('main > div div')) + .filter(($cell) => /^\[[A-Za-z0-9 -_]+\]$/mg.test($cell.textContent)) + .forEach(($cell) => { + const marker = $cell.textContent + .substring(1, $cell.textContent.length - 1) + .toLocaleLowerCase(); + // find the fragment with the marker + const $marker = Array.from(document.querySelectorAll('main > div h3')) + .find(($title) => $title.textContent.toLocaleLowerCase() === marker); + if (!$marker) { + console.log(`no fragment with marker "${marker}" found`); + return; + } + let $fragment = $marker.closest('main > div'); + $marker.remove(); + if ($fragment.children.length === 0) { + // empty section with marker, use content from next section + $fragment = $fragment.nextElementSibling; + } + if (!$fragment) { + console.log(`no content found for fragment "${marker}"`); + return; + } + $cell.innerHTML = ''; + Array.from($fragment.children).forEach(($elem) => $cell.appendChild($elem)); + console.log(`fragment "${marker}" resolved`); + }); +} + function decorateBlocks() { document.querySelectorAll('main div.section-wrapper > div > div').forEach(async ($block) => { const classes = Array.from($block.classList.values()); @@ -192,7 +222,9 @@ function decorateBlocks() { $block.classList.add('block'); import(`/express/blocks/${blockName}/${blockName}.js`) .then((mod) => { - mod.default($block, blockName, document); + if (mod.default) { + mod.default($block, blockName, document); + } }) .catch((err) => console.log(`failed to load module for ${blockName}`, err)); @@ -574,6 +606,7 @@ async function decoratePage() { setTemplate(); setTheme(); await decorateTesting(); + resolveFragments(); splitSections(); wrapSections('main>div'); decorateHeader(); From 33ce8fad059bf1847e17b41c7849bdc32e104df7 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 14:24:15 +0100 Subject: [PATCH 201/649] chore: fix someone's linting error --- express/blocks/tutorials/tutorials.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/tutorials/tutorials.js b/express/blocks/tutorials/tutorials.js index 0f07c39..4816f26 100644 --- a/express/blocks/tutorials/tutorials.js +++ b/express/blocks/tutorials/tutorials.js @@ -150,7 +150,7 @@ function decorateTutorials($tutorials) { const $section = $tutorials.closest('.section-wrapper > div'); const allTags = []; const $rows = Array.from($tutorials.children); - $rows.forEach(($row, i) => { + $rows.forEach(($row) => { const $cells = Array.from($row.children); const $tags = $cells[3]; const $categories = $cells[2]; From 528a4a23254049d71b9ef5ee4bca78cdc1d5fe5d Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 14:24:39 +0100 Subject: [PATCH 202/649] feat: remove fragment section after resolution --- express/scripts/scripts.js | 1 + 1 file changed, 1 insertion(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 29dcbb5..20e2de9 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -198,6 +198,7 @@ function resolveFragments() { } $cell.innerHTML = ''; Array.from($fragment.children).forEach(($elem) => $cell.appendChild($elem)); + $fragment.remove(); console.log(`fragment "${marker}" resolved`); }); } From a60f96b49ff36fa8aa3e763f4ca376ac2be4c8e4 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 14:30:34 +0100 Subject: [PATCH 203/649] chore: reverse feature flag --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index e04e432..7ba59e0 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -157,7 +157,7 @@ function decorateAnalyticsEvents() { }); } -if (new URLSearchParams(window.location.search).get('gnav') === 'true') { +if (new URLSearchParams(window.location.search).get('gnav') !== 'false') { loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js').id = 'feds-script'; loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); } From 79916b9c96ebccb715dbb53bae86e2a486aaba67 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Wed, 24 Mar 2021 14:47:57 +0100 Subject: [PATCH 204/649] fix(template-list): fix edge case and add template-list tests --- express/blocks/template-list/template-list.js | 2 +- test/unit/blocks/blocks-test-list.js | 16 ++++++++++ .../template-list.linkedimage.block.html | 11 +++++++ .../template-list.linknotext.block.html | 26 ++++++++++++++++ .../template-list.linkwithtext.block.html | 11 +++++++ .../expected/template-list.video.block.html | 8 +++++ .../input/template-list.linkedimage.doc.html | 16 ++++++++++ .../input/template-list.linknotext.doc.html | 31 +++++++++++++++++++ .../input/template-list.linkwithtext.doc.html | 16 ++++++++++ .../blocks/input/template-list.video.doc.html | 17 ++++++++++ 10 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 test/unit/blocks/expected/template-list.linkedimage.block.html create mode 100644 test/unit/blocks/expected/template-list.linknotext.block.html create mode 100644 test/unit/blocks/expected/template-list.linkwithtext.block.html create mode 100644 test/unit/blocks/expected/template-list.video.block.html create mode 100644 test/unit/blocks/input/template-list.linkedimage.doc.html create mode 100644 test/unit/blocks/input/template-list.linknotext.doc.html create mode 100644 test/unit/blocks/input/template-list.linkwithtext.doc.html create mode 100644 test/unit/blocks/input/template-list.video.doc.html diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 6f2fd9c..1361732 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -79,7 +79,7 @@ async function decorateTemplateList($block) { $block.querySelectorAll(':scope > div > div:first-of-type a').forEach(($a) => { const $parent = $a.closest('div'); - if ($a.href.includes('.app.link')) { + if (!$a.href.includes('.mp4')) { linkImage($parent); } else { const $picture = $parent.querySelector('picture'); diff --git a/test/unit/blocks/blocks-test-list.js b/test/unit/blocks/blocks-test-list.js index 2bef37d..38491a7 100644 --- a/test/unit/blocks/blocks-test-list.js +++ b/test/unit/blocks/blocks-test-list.js @@ -26,4 +26,20 @@ export default [{ name: 'Link Image - no line breaks', input: 'input/link-image.nolinebreaks.doc.html', expected: 'expected/link-image.nolinebreaks.block.html', +}, { + name: 'Template List - video', + input: 'input/template-list.video.doc.html', + expected: 'expected/template-list.video.block.html', +}, { + name: 'Template List - linked image', + input: 'input/template-list.linkedimage.doc.html', + expected: 'expected/template-list.linkedimage.block.html', +}, { + name: 'Template List - link without text', + input: 'input/template-list.linknotext.doc.html', + expected: 'expected/template-list.linknotext.block.html', +}, { + name: 'Template List - linked with text', + input: 'input/template-list.linkwithtext.doc.html', + expected: 'expected/template-list.linkwithtext.block.html', }]; diff --git a/test/unit/blocks/expected/template-list.linkedimage.block.html b/test/unit/blocks/expected/template-list.linkedimage.block.html new file mode 100644 index 0000000..7473009 --- /dev/null +++ b/test/unit/blocks/expected/template-list.linkedimage.block.html @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/test/unit/blocks/expected/template-list.linknotext.block.html b/test/unit/blocks/expected/template-list.linknotext.block.html new file mode 100644 index 0000000..c528f84 --- /dev/null +++ b/test/unit/blocks/expected/template-list.linknotext.block.html @@ -0,0 +1,26 @@ + + \ No newline at end of file diff --git a/test/unit/blocks/expected/template-list.linkwithtext.block.html b/test/unit/blocks/expected/template-list.linkwithtext.block.html new file mode 100644 index 0000000..b82003e --- /dev/null +++ b/test/unit/blocks/expected/template-list.linkwithtext.block.html @@ -0,0 +1,11 @@ +
+
+ + + + +
+ +
\ No newline at end of file diff --git a/test/unit/blocks/expected/template-list.video.block.html b/test/unit/blocks/expected/template-list.video.block.html new file mode 100644 index 0000000..b5485a9 --- /dev/null +++ b/test/unit/blocks/expected/template-list.video.block.html @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/test/unit/blocks/input/template-list.linkedimage.doc.html b/test/unit/blocks/input/template-list.linkedimage.doc.html new file mode 100644 index 0000000..df9425b --- /dev/null +++ b/test/unit/blocks/input/template-list.linkedimage.doc.html @@ -0,0 +1,16 @@ +
+ +
\ No newline at end of file diff --git a/test/unit/blocks/input/template-list.linknotext.doc.html b/test/unit/blocks/input/template-list.linknotext.doc.html new file mode 100644 index 0000000..70a1903 --- /dev/null +++ b/test/unit/blocks/input/template-list.linknotext.doc.html @@ -0,0 +1,31 @@ +
+ +
\ No newline at end of file diff --git a/test/unit/blocks/input/template-list.linkwithtext.doc.html b/test/unit/blocks/input/template-list.linkwithtext.doc.html new file mode 100644 index 0000000..8ff5e8c --- /dev/null +++ b/test/unit/blocks/input/template-list.linkwithtext.doc.html @@ -0,0 +1,16 @@ +
+
+
+
+ + + + +
+ +
+
+
\ No newline at end of file diff --git a/test/unit/blocks/input/template-list.video.doc.html b/test/unit/blocks/input/template-list.video.doc.html new file mode 100644 index 0000000..1932a8b --- /dev/null +++ b/test/unit/blocks/input/template-list.video.doc.html @@ -0,0 +1,17 @@ +
+
+
+
+ + + Gray Mens Fashion Store Ad Instagram Story with Fashion Model + Animation +
+ +
+
+
\ No newline at end of file From 37264ca55e705f932bae4544a322c5ec45e57567 Mon Sep 17 00:00:00 2001 From: Lars Trieloff Date: Wed, 24 Mar 2021 16:44:40 +0100 Subject: [PATCH 205/649] fix(head): allow script to be used from h2 push fixes #43 --- head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/head.html b/head.html index 5a36c14..e99af15 100644 --- a/head.html +++ b/head.html @@ -1,4 +1,4 @@ - + From 13ec79c8565a109cb6fde9b54531d1b40d721134 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 24 Mar 2021 10:22:48 -0700 Subject: [PATCH 206/649] chore: fix langmap --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 2a3307b..d33df4f 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -64,7 +64,7 @@ const langs = { fr: 'fr-FR', de: 'de-DE', it: 'it-IT', - da: 'da-DK', + dk: 'da-DK', es: 'es-ES', fi: 'fi-FI', jp: 'ja-JP', From 29258477cda97365406eb5a40372d01b7fb50fbd Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 19:36:04 +0100 Subject: [PATCH 207/649] feat: numbered columns --- express/blocks/columns/columns.css | 21 +++++++++++++++++++++ express/blocks/columns/columns.js | 7 +++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index c4d7408..51269b8 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -20,9 +20,24 @@ main .columns a > p:empty { display: none; } +main .columns > div span.num { + position:relative; + font-weight: 800; + font-size: 36px; + line-height: 39px; + top:0; + margin-right: 12px; +} + +main .columns > div span.num + * { + display:inline; +} + @media (min-width:900px) { main .columns > div { flex-direction: row; + align-items: flex-start; + text-align: left; } main .section-wrapper div.columns > div > div { @@ -33,4 +48,10 @@ main .columns a > p:empty { main .section-wrapper div.columns > div > div * { text-align: left; } + + main .columns > div span.num { + font-size: 22px; + line-height: 29px; + display: block; + } } \ No newline at end of file diff --git a/express/blocks/columns/columns.js b/express/blocks/columns/columns.js index 6222290..e1d420f 100644 --- a/express/blocks/columns/columns.js +++ b/express/blocks/columns/columns.js @@ -15,9 +15,12 @@ import { linkImage } from '../../scripts/scripts.js'; export default function decorate($block) { const $rows = Array.from($block.children); - $rows.forEach(($row) => { + $rows.forEach(($row, rowNum) => { const $cells = Array.from($row.children); - $cells.forEach(($cell) => { + $cells.forEach(($cell, cellNum) => { + if (cellNum === 0 && $block.classList.contains('numbered')) { + $cell.innerHTML = `${rowNum + 1}/${$rows.length} —${$cell.innerHTML}`; + } /* this probably needs to be tighter and possibly earlier */ if ($cell.querySelector('img') && $cell.querySelector('a')) { linkImage($cell); From d0384a193cc9a39fb3a2ea41e6b57de8dc097fda Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 19:39:25 +0100 Subject: [PATCH 208/649] feat: list tweaks --- express/blocks/list/list.css | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/express/blocks/list/list.css b/express/blocks/list/list.css index ce9ae42..8d4e41b 100644 --- a/express/blocks/list/list.css +++ b/express/blocks/list/list.css @@ -1,5 +1,5 @@ main .list { - max-width: 1140px; + max-width: 375px; margin: 40px auto; display: flex; flex-wrap: wrap; @@ -13,6 +13,7 @@ main .list .item { main .list .item-title { font-size: 16px; + line-height: 1.2; font-weight: 600; } @@ -23,3 +24,25 @@ main .list .item-text { text-align: center; line-height: 1.4; } + +@media (min-width: 900px) { + main .list { + max-width: 600px; + } + main .list .item { + width: auto; + } +} +@media (min-width: 1200px) { + main .list { + max-width: 1140px; + } + + main .list .item { + padding: 20px; + } + + main .list .item { + width: 220px; + } +} From 258d886c5f2930e4448f307d27ee1595dcef7ed6 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 19:39:44 +0100 Subject: [PATCH 209/649] feat: template list inside columns --- .../blocks/template-list/template-list.css | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/express/blocks/template-list/template-list.css b/express/blocks/template-list/template-list.css index 0f41fbb..b2157ed 100644 --- a/express/blocks/template-list/template-list.css +++ b/express/blocks/template-list/template-list.css @@ -85,7 +85,6 @@ main .template-list.masonry > div { padding-bottom: 32px; } - @media (min-width: 600px) { main .template-list > div { width: 240px; @@ -118,6 +117,13 @@ main .template-list.masonry > div { column-gap: 32px; width: 792px; } + + /* template-list inside columns */ + + main .columns .template-list { + margin-top: 0; + margin-left: 40px; + } } @media (min-width: 1200px) { @@ -134,4 +140,21 @@ main .template-list.masonry > div { position: relative; left: -16px; } + + /* template-list inside columns */ + + main .columns .template-list { + flex-direction: row; + flex-wrap: nowrap; + } + + main .columns .template-list > div { + justify-content: flex-start; + min-width: 132px; + } + + main .columns .template-list a:any-link { + font-size: 0.875rem; + font-weight: 500;; + } } \ No newline at end of file From 7309965141f4467b391ab2c3a4e039540ab38f83 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 19:40:02 +0100 Subject: [PATCH 210/649] chore(feds): no breadcrumbs --- express/scripts/martech.js | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 2a3307b..60cfb9b 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -108,19 +108,6 @@ window.fedsConfig = { content: { experience: 'cc-express/spark-gnav', }, - breadcrumbs: { - showLogo: false, - links: [ - { - title: 'Home', - url: 'https://www.adobe.com/express/index.html', - }, - { - title: 'Adobe Creative Cloud', - url: 'https://www.adobe.com/creativecloud.html', - }, - ], - }, }; window.adobeid = { From 809b3025feb43457e877f3439650a57a003af9aa Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 19:41:07 +0100 Subject: [PATCH 211/649] fix: correctly detect empty fragment section --- express/scripts/scripts.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 8e2bcd5..156bce3 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -192,8 +192,9 @@ function resolveFragments() { return; } let $fragment = $marker.closest('main > div'); + const $markerContainer = $marker.parentNode; $marker.remove(); - if ($fragment.children.length === 0) { + if ($markerContainer.children.length === 0) { // empty section with marker, use content from next section $fragment = $fragment.nextElementSibling; } @@ -305,6 +306,7 @@ function postLCP() { const martechUrl = '/express/scripts/martech.js'; loadCSS('/express/styles/lazy-styles.css'); decorateBlocks(); + resolveFragments(); // loadLazyFooter(); if (!(window.location.search === '?nomartech' || document.querySelector(`head script[src="${martechUrl}"]`))) { let ms = 2000; @@ -613,7 +615,7 @@ async function decoratePage() { setTemplate(); setTheme(); await decorateTesting(); - resolveFragments(); + // resolveFragments(); splitSections(); wrapSections('main>div'); decorateHeaderAndFooter(); From 8fc1c2b086169b7ed8b5638dc393319bce725bf0 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 19:41:36 +0100 Subject: [PATCH 212/649] feat: hero tweak --- express/styles/styles.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 830e550..d147a31 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -488,6 +488,10 @@ main .section-wrapper.quotes-dark-container h5 { color: #FFF; } +main .section-wrapper .hero { + color: initial; +} + /* blog styling */ .blog main .hero { From 80447128503dbd32ac35ae30c7f7e3eda68c6b69 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 24 Mar 2021 12:45:12 -0700 Subject: [PATCH 213/649] chore: styling --- express/blocks/feature-list/feature-list.css | 21 ++++++++++++++++++++ express/styles/styles.css | 12 +++++++++++ 2 files changed, 33 insertions(+) create mode 100644 express/blocks/feature-list/feature-list.css diff --git a/express/blocks/feature-list/feature-list.css b/express/blocks/feature-list/feature-list.css new file mode 100644 index 0000000..fbb8dd1 --- /dev/null +++ b/express/blocks/feature-list/feature-list.css @@ -0,0 +1,21 @@ +main .feature-list { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + margin: auto; +} + + +main .feature-list img { + width: 32px; +} + +main .feature-list > div { + width: 200px; + padding: 20px; +} + +main .feature-list h3 { + font-size: 22px; +} \ No newline at end of file diff --git a/express/styles/styles.css b/express/styles/styles.css index d147a31..a1ed25c 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -321,6 +321,10 @@ main .hero > div { padding: 0; } +main .hero a:any-link { + color: currentColor; +} + @media (min-width:600px) { main .hero h1 { font-size: 60px; @@ -354,12 +358,20 @@ main .hero > div { max-width: 672px; margin: auto; } + + main .hero .columns > div { + display: flex; + margin: auto; + justify-content: center; + } + } @media (min-width:900px) { main>.hero h1 { font-size: 3.5em; } + } From 4f7814b3ab532bceea2aead4f05216ebbd88449c Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 24 Mar 2021 12:49:09 -0700 Subject: [PATCH 214/649] fix: footer margin --- express/styles/styles.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index a1ed25c..98e6a4c 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -180,6 +180,10 @@ header .mobile .hamburger::before { } } +footer { + margin: 120px; +} + a.button:any-link { text-decoration: none; border-radius: 18px; From 1b28b5220d631f3322ddc52f761ca6e26ae613c9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 24 Mar 2021 12:50:02 -0700 Subject: [PATCH 215/649] fix: footer margin --- express/styles/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 98e6a4c..9f736da 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -181,7 +181,7 @@ header .mobile .hamburger::before { } footer { - margin: 120px; + margin-top: 120px; } a.button:any-link { From 2fd15bd2526ea51a76eaa49f89e87c5ad11ec0e1 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 24 Mar 2021 12:54:12 -0700 Subject: [PATCH 216/649] fix: footer margin --- express/styles/styles.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 9f736da..72246c5 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -181,6 +181,7 @@ header .mobile .hamburger::before { } footer { + margin-top: 120px; } From 388401d7004bc211f6e1265a0635cb88d17a11e8 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 21:16:35 +0100 Subject: [PATCH 217/649] fix: remove all fragment sections --- express/scripts/scripts.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 156bce3..bc3b595 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -195,8 +195,10 @@ function resolveFragments() { const $markerContainer = $marker.parentNode; $marker.remove(); if ($markerContainer.children.length === 0) { - // empty section with marker, use content from next section - $fragment = $fragment.nextElementSibling; + // empty section with marker, remove and use content from next section + const $emptyFragment = $fragment; + $fragment = $emptyFragment.nextElementSibling; + $emptyFragment.remove(); } if (!$fragment) { console.log(`no content found for fragment "${marker}"`); @@ -615,7 +617,6 @@ async function decoratePage() { setTemplate(); setTheme(); await decorateTesting(); - // resolveFragments(); splitSections(); wrapSections('main>div'); decorateHeaderAndFooter(); From 3328408fc2673259e183fa0555dbdcc8c19d8d75 Mon Sep 17 00:00:00 2001 From: rofe Date: Wed, 24 Mar 2021 22:03:18 +0100 Subject: [PATCH 218/649] fix: concurrency issue --- express/scripts/scripts.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index bc3b595..407cc8b 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -193,10 +193,9 @@ function resolveFragments() { } let $fragment = $marker.closest('main > div'); const $markerContainer = $marker.parentNode; - $marker.remove(); - if ($markerContainer.children.length === 0) { + if ($markerContainer.children.length === 1) { // empty section with marker, remove and use content from next section - const $emptyFragment = $fragment; + const $emptyFragment = $markerContainer.parentNode; $fragment = $emptyFragment.nextElementSibling; $emptyFragment.remove(); } @@ -204,10 +203,12 @@ function resolveFragments() { console.log(`no content found for fragment "${marker}"`); return; } - $cell.innerHTML = ''; - Array.from($fragment.children).forEach(($elem) => $cell.appendChild($elem)); - $fragment.remove(); - console.log(`fragment "${marker}" resolved`); + setTimeout(() => { + $cell.innerHTML = ''; + Array.from($fragment.children).forEach(($elem) => $cell.appendChild($elem)); + $fragment.remove(); + console.log(`fragment "${marker}" resolved`); + }, 500); }); } From a94377df98be2d807e6f435c53bd14e921d2ae5b Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 24 Mar 2021 14:41:26 -0700 Subject: [PATCH 219/649] chore: adjust font --- express/blocks/steps/steps.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/blocks/steps/steps.css b/express/blocks/steps/steps.css index 7f5b8a1..081a7be 100644 --- a/express/blocks/steps/steps.css +++ b/express/blocks/steps/steps.css @@ -10,9 +10,9 @@ main .steps h3 { } main .steps p { - font-size: 18px; + font-size: 14px; text-align: left; - line-height: 22px; + line-height: 18px; margin: 0; } From 5e0c79931d4cea19bdf4b895503cfcf1561a81de Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 24 Mar 2021 14:49:09 -0700 Subject: [PATCH 220/649] feat(columns): add center option --- express/blocks/columns/columns.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 51269b8..474bfb9 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -33,12 +33,16 @@ main .columns > div span.num + * { display:inline; } +main .columns.center > div { + align-items: center; +} + @media (min-width:900px) { main .columns > div { flex-direction: row; align-items: flex-start; text-align: left; - } + } main .section-wrapper div.columns > div > div { width: 50%; From 4afcb97e84cbe1a4759c5a61f5006e074944c8f9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Wed, 24 Mar 2021 18:01:46 -0700 Subject: [PATCH 221/649] feat(pagelist): new layout --- express/blocks/page-list/page-list.css | 161 +++++++++++++++---------- express/blocks/page-list/page-list.js | 81 ++++++++----- express/scripts/scripts.js | 3 +- 3 files changed, 155 insertions(+), 90 deletions(-) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 67d3c1c..b15c8de 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -1,79 +1,116 @@ main .page-list { - margin-top: 64px; text-align: left; - } - main .page-list-container > div { - max-width: 100%; + box-sizing: border-box; + padding-right: 20px; + font-size: 20px; + width: 100%; } - main .page-list-container .page-list-images > div { - max-width: 100%; - } +main .page-list.hidden { + display: none; +} + +main .page-template-list.hidden { + display: none; +} + +main .page-list-browse-button { + margin-top: 20px; + text-decoration: none; + border-radius: 18px; + padding: 5px 1.2em 7px 1.2em; + text-align: center; + line-height: 20px; + font-size: 1rem; + border: 2px solid #333; + color: #333; + outline: none; + background-color: transparent; + font-weight: 600; + cursor: pointer; + transition: background-color .4s; + display: inline-block; + font-family: 'adobe-clean', 'Adobe Clean', sans-serif; +} + +@media (min-width: 600px) { + main .page-list-browse-button { + display: none; + } + main .page-list { + width: 280px; + } +} - - main .page-list .page-list-images { + +main .page-list-container > div { + height: 500px; + max-width: 100%; display: flex; - flex-wrap: wrap; - justify-content: center; + margin: 0; + box-sizing: border-box; } - - main .page-list .card { - display: flex; - flex-direction: column; - width: 240px; - margin: 16px; - cursor: pointer; + +main .page-list-container > div > div { + overflow-y: scroll; } - - main .page-list .card img { - height: 240px; - width: 240px; - object-fit: cover; - object-position: center center; - border-radius: 10px; + +main .page-list-container > div .template-list { + width: 100%; + height: 10000px; + box-sizing: border-box; +} + +main .page-list ul { + margin: 0; + padding: 0; + list-style: none; +} + +main .page-list a:any-link { + text-decoration: none; + color: #333; +} + +main .page-list ul li { + padding: 10px; +} + +main .hero-short { + padding: 32px; +} + +@media (min-width: 600px) { + main .page-template-list > .template-list.masonry { + columns: unset; } - - - main .page-list .card-body { - padding: 0 15px; - +} +@media (min-width: 900px) { + + main .page-template-list > .template-list.masonry { + columns: 240px 2; + width: 530px; } +} - main .page-list .card-body h3, main .page-list .page-list-additional p a:any-link { - padding: 0; - margin: 0; - font-size: 16px; - color: #1473E6; - font-weight: 600; - text-align: left; - line-height: 1.1em; - margin-bottom: 3px; - text-decoration: none; +@media (min-width: 1200px) { + main .page-template-list > .template-list.masonry { + columns: 240px 3; + width: 800px; } +} - main .page-list .card-body p { - font-size: 0.7em; - margin: 0; - text-align: left; - line-height: normal; - } - main .page-list .page-list-additional p { - margin: 12px 0; +@media (min-width: 1400px) { + main .page-template-list > .template-list.masonry { + columns: 240px 4; + width: 1100px; } +} - main .page-list .page-list-additional { - max-width: 400px; - margin: 64px auto; - text-align: center; +@media (min-width: 1700px) { + main .page-template-list > .template-list.masonry { + columns: 240px 5; + width: 1400px; } - - @media (min-width: 900px) { - main .page-list .page-list-additional { - max-width: 800px; - columns: 2 30px; - } - main .page-list .page-list-additional p:first-of-type { - margin-top: 0; - } - } \ No newline at end of file +} \ No newline at end of file diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 63258c7..1ecdf8c 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window fetch */ +/* global window document fetch */ /* eslint-disable import/named, import/extensions */ import { @@ -18,36 +18,26 @@ import { } from '../../scripts/scripts.js'; function addPages(index, config, $block) { - const $images = createTag('div', { class: 'page-list-images' }); - const $additional = createTag('div', { class: 'page-list-additional' }); - $block.appendChild($images); - $block.appendChild($additional); - - const images = []; - + const $ul = createTag('ul'); index.forEach((page) => { if (page.path.includes(config.filter)) { - const { path, image, title } = page; - if (!images.includes(image) && (images.length < +config.images)) { - const $card = createTag('div', { class: 'card' }); - $card.innerHTML = `
- -
-
-

${title}

-
`; - $card.addEventListener('click', () => { - window.location.href = path; - }); - $images.appendChild($card); - images.push(image); - } else { - const $p = createTag('p'); - $p.innerHTML = `${title}`; - $additional.appendChild($p); - } + const { path, shortTitle } = page; + const $p = createTag('li'); + $p.innerHTML = `${shortTitle}`; + $ul.appendChild($p); } }); + $block.appendChild($ul); +} + +function showHide($block, $ptl) { + if (window.innerWidth < 600) { + $block.classList.add('hidden'); + $ptl.classList.remove('hidden'); + } else { + $block.classList.remove('hidden'); + $ptl.classList.remove('hidden'); + } } async function fetchIndex() { @@ -72,7 +62,44 @@ async function fetchIndex() { async function decoratePageList($block) { const config = readBlockConfig($block); $block.innerHTML = ''; + + const $browse = createTag('button', { class: 'page-list-browse-button hidden' }); + $browse.innerHTML = config.label; + $block.appendChild($browse); + const $section = $block.closest('.section-wrapper'); + $section.parentNode.insertBefore($browse, $section); + + // shorten hero + const $hero = document.querySelector('.hero'); + $hero.classList.add('hero-short'); + + const $flex = document.querySelector('main .page-list-container > div'); + $flex.style.height = `${(window.innerHeight - $hero.offsetHeight)}px`; + + // get $tlc + const $tlc = document.querySelector('.template-list-container'); + const $ptl = $tlc.firstChild; + $ptl.classList.add('page-template-list'); + $block.parentNode.appendChild($ptl); + $tlc.remove(); + + $browse.addEventListener('click', () => { + if ($block.classList.contains('hidden')) { + $block.classList.remove('hidden'); + $ptl.classList.add('hidden'); + } else { + $ptl.classList.remove('hidden'); + $block.classList.add('hidden'); + } + }); + + showHide($block, $ptl); + window.addEventListener('resize', () => { + showHide($block, $ptl); + }); + const index = await fetchIndex(); + index.sort((e1, e2) => e1.shortTitle.localeCompare(e2.shortTitle)); addPages(index, config, $block); } diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 407cc8b..f618dc2 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -311,7 +311,7 @@ function postLCP() { decorateBlocks(); resolveFragments(); // loadLazyFooter(); - if (!(window.location.search === '?nomartech' || document.querySelector(`head script[src="${martechUrl}"]`))) { + if (!(window.location.search === '?nomartech' || window.location.hostname === 'localhost' || document.querySelector(`head script[src="${martechUrl}"]`))) { let ms = 2000; const usp = new URLSearchParams(window.location.search); const delay = usp.get('delay'); @@ -599,6 +599,7 @@ export function unwrapBlock($block) { function splitSections() { document.querySelectorAll('main > div > div').forEach(($block) => { const blocksToSplit = ['template-list', 'layouts', 'blog-posts']; + if (blocksToSplit.includes($block.className)) { unwrapBlock($block); } From a099aec2a550865e917dd995d758642495af0fea Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 25 Mar 2021 09:50:34 +0100 Subject: [PATCH 222/649] feat: numbered columns --- express/blocks/columns/columns.css | 5 +- express/blocks/columns/columns.js | 18 +++- test/unit/blocks/blocks-test-list.js | 80 ++++++++++------- .../expected/columns.singlerow.block.html | 12 +++ .../columns.table.numbered.10.block.html | 90 +++++++++++++++++++ .../columns.table.numbered.3.block.html | 39 ++++++++ .../blocks/input/columns.singlerow.doc.html | 16 ++++ .../input/columns.table.numbered.10.doc.html | 84 +++++++++++++++++ .../input/columns.table.numbered.3.doc.html | 40 +++++++++ 9 files changed, 349 insertions(+), 35 deletions(-) create mode 100644 test/unit/blocks/expected/columns.singlerow.block.html create mode 100644 test/unit/blocks/expected/columns.table.numbered.10.block.html create mode 100644 test/unit/blocks/expected/columns.table.numbered.3.block.html create mode 100644 test/unit/blocks/input/columns.singlerow.doc.html create mode 100644 test/unit/blocks/input/columns.table.numbered.10.doc.html create mode 100644 test/unit/blocks/input/columns.table.numbered.3.doc.html diff --git a/express/blocks/columns/columns.css b/express/blocks/columns/columns.css index 474bfb9..5492c5e 100644 --- a/express/blocks/columns/columns.css +++ b/express/blocks/columns/columns.css @@ -8,6 +8,10 @@ main .columns > div { align-items: center; } +main .columns.table > div { + align-items: flex-start; +} + main .columns.top > div { align-items: top; } @@ -40,7 +44,6 @@ main .columns.center > div { @media (min-width:900px) { main .columns > div { flex-direction: row; - align-items: flex-start; text-align: left; } diff --git a/express/blocks/columns/columns.js b/express/blocks/columns/columns.js index e1d420f..3e4697c 100644 --- a/express/blocks/columns/columns.js +++ b/express/blocks/columns/columns.js @@ -15,11 +15,27 @@ import { linkImage } from '../../scripts/scripts.js'; export default function decorate($block) { const $rows = Array.from($block.children); + if ($rows.length > 1) { + $block.classList.add('table'); + } $rows.forEach(($row, rowNum) => { const $cells = Array.from($row.children); $cells.forEach(($cell, cellNum) => { if (cellNum === 0 && $block.classList.contains('numbered')) { - $cell.innerHTML = `${rowNum + 1}/${$rows.length} —${$cell.innerHTML}`; + // add number to first cell + let num = rowNum + 1; + if ($rows.length > 9) { + // stylize with total for 10 or more items + num = `${num}/${$rows.length} —`; + if (rowNum < 9) { + // pad number with 0 + num = `0${num}`; + } + } else { + // regular ordered list style for 1 to 9 items + num = `${num}.`; + } + $cell.innerHTML = `${num}${$cell.innerHTML}`; } /* this probably needs to be tighter and possibly earlier */ if ($cell.querySelector('img') && $cell.querySelector('a')) { diff --git a/test/unit/blocks/blocks-test-list.js b/test/unit/blocks/blocks-test-list.js index 38491a7..cd91b14 100644 --- a/test/unit/blocks/blocks-test-list.js +++ b/test/unit/blocks/blocks-test-list.js @@ -10,36 +10,50 @@ * governing permissions and limitations under the License. */ -export default [{ - name: 'Table of Contents - 1 level', - input: 'input/table-of-contents.1level.doc.html', - expected: 'expected/table-of-contents.1level.block.html', -}, { - name: 'Table of Contents - 2 levels', - input: 'input/table-of-contents.2levels.doc.html', - expected: 'expected/table-of-contents.2levels.block.html', -}, { - name: 'Link Image - basic', - input: 'input/link-image.basic.doc.html', - expected: 'expected/link-image.basic.block.html', -}, { - name: 'Link Image - no line breaks', - input: 'input/link-image.nolinebreaks.doc.html', - expected: 'expected/link-image.nolinebreaks.block.html', -}, { - name: 'Template List - video', - input: 'input/template-list.video.doc.html', - expected: 'expected/template-list.video.block.html', -}, { - name: 'Template List - linked image', - input: 'input/template-list.linkedimage.doc.html', - expected: 'expected/template-list.linkedimage.block.html', -}, { - name: 'Template List - link without text', - input: 'input/template-list.linknotext.doc.html', - expected: 'expected/template-list.linknotext.block.html', -}, { - name: 'Template List - linked with text', - input: 'input/template-list.linkwithtext.doc.html', - expected: 'expected/template-list.linkwithtext.block.html', -}]; +export default [ + { + name: 'Table of Contents - 1 level', + input: 'input/table-of-contents.1level.doc.html', + expected: 'expected/table-of-contents.1level.block.html', + }, { + name: 'Table of Contents - 2 levels', + input: 'input/table-of-contents.2levels.doc.html', + expected: 'expected/table-of-contents.2levels.block.html', + }, { + name: 'Link Image - basic', + input: 'input/link-image.basic.doc.html', + expected: 'expected/link-image.basic.block.html', + }, { + name: 'Link Image - no line breaks', + input: 'input/link-image.nolinebreaks.doc.html', + expected: 'expected/link-image.nolinebreaks.block.html', + }, { + name: 'Template List - video', + input: 'input/template-list.video.doc.html', + expected: 'expected/template-list.video.block.html', + }, { + name: 'Template List - linked image', + input: 'input/template-list.linkedimage.doc.html', + expected: 'expected/template-list.linkedimage.block.html', + }, { + name: 'Template List - link without text', + input: 'input/template-list.linknotext.doc.html', + expected: 'expected/template-list.linknotext.block.html', + }, { + name: 'Template List - linked with text', + input: 'input/template-list.linkwithtext.doc.html', + expected: 'expected/template-list.linkwithtext.block.html', + }, { + name: 'Columns - single row', + input: 'input/columns.singlerow.doc.html', + expected: 'expected/columns.singlerow.block.html', + }, { + name: 'Columns - 3 numbered rows', + input: 'input/columns.table.numbered.3.doc.html', + expected: 'expected/columns.table.numbered.3.block.html', + }, { + name: 'Columns - 10 numbered rows', + input: 'input/columns.table.numbered.10.doc.html', + expected: 'expected/columns.table.numbered.10.block.html', + }, +]; diff --git a/test/unit/blocks/expected/columns.singlerow.block.html b/test/unit/blocks/expected/columns.singlerow.block.html new file mode 100644 index 0000000..6f15f95 --- /dev/null +++ b/test/unit/blocks/expected/columns.singlerow.block.html @@ -0,0 +1,12 @@ +
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
diff --git a/test/unit/blocks/expected/columns.table.numbered.10.block.html b/test/unit/blocks/expected/columns.table.numbered.10.block.html new file mode 100644 index 0000000..e0034ed --- /dev/null +++ b/test/unit/blocks/expected/columns.table.numbered.10.block.html @@ -0,0 +1,90 @@ +
+
+ 01/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 02/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 03/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 04/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 05/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 06/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 07/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 08/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 09/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 10/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
diff --git a/test/unit/blocks/expected/columns.table.numbered.3.block.html b/test/unit/blocks/expected/columns.table.numbered.3.block.html new file mode 100644 index 0000000..1b234b9 --- /dev/null +++ b/test/unit/blocks/expected/columns.table.numbered.3.block.html @@ -0,0 +1,39 @@ +
+
+ 1. +

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
+ 2. +

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
+ 3. +

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
diff --git a/test/unit/blocks/input/columns.singlerow.doc.html b/test/unit/blocks/input/columns.singlerow.doc.html new file mode 100644 index 0000000..3dc40ec --- /dev/null +++ b/test/unit/blocks/input/columns.singlerow.doc.html @@ -0,0 +1,16 @@ +
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
diff --git a/test/unit/blocks/input/columns.table.numbered.10.doc.html b/test/unit/blocks/input/columns.table.numbered.10.doc.html new file mode 100644 index 0000000..f053aa4 --- /dev/null +++ b/test/unit/blocks/input/columns.table.numbered.10.doc.html @@ -0,0 +1,84 @@ +
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
diff --git a/test/unit/blocks/input/columns.table.numbered.3.doc.html b/test/unit/blocks/input/columns.table.numbered.3.doc.html new file mode 100644 index 0000000..caa3eda --- /dev/null +++ b/test/unit/blocks/input/columns.table.numbered.3.doc.html @@ -0,0 +1,40 @@ +
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
From 6cddb3af7e030051094800a36a6b50259df79428 Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Thu, 25 Mar 2021 10:33:48 +0100 Subject: [PATCH 223/649] chore(test): include block div in expected dom --- test/unit/blocks/blocks.test.js | 9 +++- .../expected/link-image.basic.block.html | 27 +++++----- .../link-image.nolinebreaks.block.html | 23 ++++---- .../table-of-contents.1level.block.html | 10 ++-- .../table-of-contents.2levels.block.html | 16 +++--- .../template-list.linkedimage.block.html | 22 ++++---- .../template-list.linknotext.block.html | 52 ++++++++++--------- .../template-list.linkwithtext.block.html | 18 ++++--- .../expected/template-list.video.block.html | 18 ++++--- 9 files changed, 109 insertions(+), 86 deletions(-) diff --git a/test/unit/blocks/blocks.test.js b/test/unit/blocks/blocks.test.js index 25bdcc3..f9765b3 100644 --- a/test/unit/blocks/blocks.test.js +++ b/test/unit/blocks/blocks.test.js @@ -26,9 +26,14 @@ const getFragment = (html) => { const trim = (html) => html .replace(/^\s*/gm, '') .replace(/\s*$/gm, '') - .replace(/\n/gm, ''); + .replace(/\n/gm, '') + .replace(/\/>\s*<'); const fragmentToString = (fragment) => { + if (fragment.outerHTML) { + return trim(fragment.outerHTML); + } + let html = ''; fragment.children.forEach((c) => { html += c.outerHTML; @@ -62,7 +67,7 @@ describe('Block tests', () => { const mod = await import(`/express/blocks/${blockName}/${blockName}.js`); mod.default(block, blockName, doc); - expect(fragmentToString(block)).to.be.equal(fragmentToString(expected)); + expect(fragmentToString(expected)).to.be.equal(fragmentToString(block)); }); }); }); diff --git a/test/unit/blocks/expected/link-image.basic.block.html b/test/unit/blocks/expected/link-image.basic.block.html index 53e2c3e..12c83b5 100644 --- a/test/unit/blocks/expected/link-image.basic.block.html +++ b/test/unit/blocks/expected/link-image.basic.block.html @@ -1,13 +1,16 @@ -
- + \ No newline at end of file diff --git a/test/unit/blocks/expected/link-image.nolinebreaks.block.html b/test/unit/blocks/expected/link-image.nolinebreaks.block.html index eef193c..0f2c868 100644 --- a/test/unit/blocks/expected/link-image.nolinebreaks.block.html +++ b/test/unit/blocks/expected/link-image.nolinebreaks.block.html @@ -1,11 +1,14 @@ -
- + \ No newline at end of file diff --git a/test/unit/blocks/expected/table-of-contents.1level.block.html b/test/unit/blocks/expected/table-of-contents.1level.block.html index ad72b9d..7e4788a 100644 --- a/test/unit/blocks/expected/table-of-contents.1level.block.html +++ b/test/unit/blocks/expected/table-of-contents.1level.block.html @@ -1,5 +1,7 @@ -
-
H21
-
H22
-
H23
+
+
+
H21
+
H22
+
H23
+
\ No newline at end of file diff --git a/test/unit/blocks/expected/table-of-contents.2levels.block.html b/test/unit/blocks/expected/table-of-contents.2levels.block.html index 90ae56a..a834d9a 100644 --- a/test/unit/blocks/expected/table-of-contents.2levels.block.html +++ b/test/unit/blocks/expected/table-of-contents.2levels.block.html @@ -1,8 +1,10 @@ -
-
H21
-
H3211
-
H3212
-
H22
-
H23
-
H3231
+
+
+
H21
+
H3211
+
H3212
+
H22
+
H23
+
H3231
+
\ No newline at end of file diff --git a/test/unit/blocks/expected/template-list.linkedimage.block.html b/test/unit/blocks/expected/template-list.linkedimage.block.html index 7473009..d1ff22f 100644 --- a/test/unit/blocks/expected/template-list.linkedimage.block.html +++ b/test/unit/blocks/expected/template-list.linkedimage.block.html @@ -1,11 +1,13 @@ -
- -
+
+
\ No newline at end of file diff --git a/test/unit/blocks/expected/template-list.linknotext.block.html b/test/unit/blocks/expected/template-list.linknotext.block.html index c528f84..85de59c 100644 --- a/test/unit/blocks/expected/template-list.linknotext.block.html +++ b/test/unit/blocks/expected/template-list.linknotext.block.html @@ -1,26 +1,28 @@ - -
- -
+ \ No newline at end of file diff --git a/test/unit/blocks/expected/template-list.linkwithtext.block.html b/test/unit/blocks/expected/template-list.linkwithtext.block.html index b82003e..043b687 100644 --- a/test/unit/blocks/expected/template-list.linkwithtext.block.html +++ b/test/unit/blocks/expected/template-list.linkwithtext.block.html @@ -1,11 +1,13 @@ -
+
- - - - +
+ + + + +
+
-
\ No newline at end of file diff --git a/test/unit/blocks/expected/template-list.video.block.html b/test/unit/blocks/expected/template-list.video.block.html index b5485a9..17861ff 100644 --- a/test/unit/blocks/expected/template-list.video.block.html +++ b/test/unit/blocks/expected/template-list.video.block.html @@ -1,8 +1,10 @@ - \ No newline at end of file +
+
+
+ +
+
From 4083f08cafe24f430c330dc7a412b363533910c7 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 25 Mar 2021 11:06:10 +0100 Subject: [PATCH 224/649] chore: adjusted tests --- .../expected/columns.singlerow.block.html | 22 ++- .../columns.table.numbered.10.block.html | 182 +++++++++--------- .../columns.table.numbered.3.block.html | 66 ++++--- 3 files changed, 138 insertions(+), 132 deletions(-) diff --git a/test/unit/blocks/expected/columns.singlerow.block.html b/test/unit/blocks/expected/columns.singlerow.block.html index 6f15f95..a7738fd 100644 --- a/test/unit/blocks/expected/columns.singlerow.block.html +++ b/test/unit/blocks/expected/columns.singlerow.block.html @@ -1,12 +1,14 @@ -
+
-

Resize your image for free.

-
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
-

Powered by Adobe Photoshop

+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
-
-

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

-
-
+
\ No newline at end of file diff --git a/test/unit/blocks/expected/columns.table.numbered.10.block.html b/test/unit/blocks/expected/columns.table.numbered.10.block.html index e0034ed..1fdf719 100644 --- a/test/unit/blocks/expected/columns.table.numbered.10.block.html +++ b/test/unit/blocks/expected/columns.table.numbered.10.block.html @@ -1,90 +1,92 @@ -
-
- 01/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 02/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 03/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 04/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 05/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 06/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 07/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 08/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 09/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
-
-
- 10/10 — -

Resize your image for free.

-
-
-

Lorem ipsum dolor sit amet.

-
-
+
+
+
+ 01/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 02/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 03/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 04/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 05/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 06/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 07/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 08/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 09/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
+
+ 10/10 — +

Resize your image for free.

+
+
+

Lorem ipsum dolor sit amet.

+
+
+
\ No newline at end of file diff --git a/test/unit/blocks/expected/columns.table.numbered.3.block.html b/test/unit/blocks/expected/columns.table.numbered.3.block.html index 1b234b9..8266566 100644 --- a/test/unit/blocks/expected/columns.table.numbered.3.block.html +++ b/test/unit/blocks/expected/columns.table.numbered.3.block.html @@ -1,39 +1,41 @@ -
+
- 1. -

Resize your image for free.

-
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
-

Powered by Adobe Photoshop

+
+ 1. +

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
-

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

-
-
-
-
- 2. -

Resize your image for free.

-
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
-

Powered by Adobe Photoshop

-
-
-

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

-
-
-
-
- 3. -

Resize your image for free.

-
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
-

Powered by Adobe Photoshop

+
+ 2. +

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
-

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+ 3. +

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
From 442cef554d94391e676ee3b29e8bb309f3bc8162 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 25 Mar 2021 11:08:22 +0100 Subject: [PATCH 225/649] test: added test for unordered list --- test/unit/blocks/blocks-test-list.js | 4 ++ .../expected/columns.table.3.block.html | 38 ++++++++++++++++++ .../blocks/input/columns.table.3.doc.html | 40 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 test/unit/blocks/expected/columns.table.3.block.html create mode 100644 test/unit/blocks/input/columns.table.3.doc.html diff --git a/test/unit/blocks/blocks-test-list.js b/test/unit/blocks/blocks-test-list.js index cd91b14..cfad07e 100644 --- a/test/unit/blocks/blocks-test-list.js +++ b/test/unit/blocks/blocks-test-list.js @@ -47,6 +47,10 @@ export default [ name: 'Columns - single row', input: 'input/columns.singlerow.doc.html', expected: 'expected/columns.singlerow.block.html', + }, { + name: 'Columns - 3 rows', + input: 'input/columns.table.3.doc.html', + expected: 'expected/columns.table.3.block.html', }, { name: 'Columns - 3 numbered rows', input: 'input/columns.table.numbered.3.doc.html', diff --git a/test/unit/blocks/expected/columns.table.3.block.html b/test/unit/blocks/expected/columns.table.3.block.html new file mode 100644 index 0000000..3406b26 --- /dev/null +++ b/test/unit/blocks/expected/columns.table.3.block.html @@ -0,0 +1,38 @@ +
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
diff --git a/test/unit/blocks/input/columns.table.3.doc.html b/test/unit/blocks/input/columns.table.3.doc.html new file mode 100644 index 0000000..b096485 --- /dev/null +++ b/test/unit/blocks/input/columns.table.3.doc.html @@ -0,0 +1,40 @@ +
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
+

Resize your image for free.

+
Use our fast, easy, and free online photo resizer to change the dimensions of any picture.
+

Powered by Adobe Photoshop

+
+
+

By clicking “Upload your photo,” you agree to the Adobe Terms of Use and Privacy Policy.

+
+
+
+
From ea22fdfcb1ea164a05eac2f6b0e5940807e0d061 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 25 Mar 2021 12:10:45 +0100 Subject: [PATCH 226/649] chore: trim fragment marker to be safe --- express/scripts/scripts.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index f618dc2..e218ac4 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -67,6 +67,7 @@ export function linkImage($elem) { function wrapSections(element) { document.querySelectorAll(element).forEach(($div) => { if (!$div.id) { + console.log('wrap section', $div); const $wrapper = createTag('div', { class: 'section-wrapper' }); $div.parentNode.appendChild($wrapper); $wrapper.appendChild($div); @@ -183,7 +184,8 @@ function resolveFragments() { .forEach(($cell) => { const marker = $cell.textContent .substring(1, $cell.textContent.length - 1) - .toLocaleLowerCase(); + .toLocaleLowerCase() + .trim(); // find the fragment with the marker const $marker = Array.from(document.querySelectorAll('main > div h3')) .find(($title) => $title.textContent.toLocaleLowerCase() === marker); @@ -197,6 +199,7 @@ function resolveFragments() { // empty section with marker, remove and use content from next section const $emptyFragment = $markerContainer.parentNode; $fragment = $emptyFragment.nextElementSibling; + console.log('remove section', $emptyFragment); $emptyFragment.remove(); } if (!$fragment) { @@ -206,6 +209,7 @@ function resolveFragments() { setTimeout(() => { $cell.innerHTML = ''; Array.from($fragment.children).forEach(($elem) => $cell.appendChild($elem)); + console.log('remove section', $fragment); $fragment.remove(); console.log(`fragment "${marker}" resolved`); }, 500); From 00c9702d0dda20369e2b7aac2a058e8656238413 Mon Sep 17 00:00:00 2001 From: rofe Date: Thu, 25 Mar 2021 12:11:44 +0100 Subject: [PATCH 227/649] chore: remove debug output --- express/scripts/scripts.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index e218ac4..ae37e27 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -199,7 +199,6 @@ function resolveFragments() { // empty section with marker, remove and use content from next section const $emptyFragment = $markerContainer.parentNode; $fragment = $emptyFragment.nextElementSibling; - console.log('remove section', $emptyFragment); $emptyFragment.remove(); } if (!$fragment) { @@ -209,7 +208,6 @@ function resolveFragments() { setTimeout(() => { $cell.innerHTML = ''; Array.from($fragment.children).forEach(($elem) => $cell.appendChild($elem)); - console.log('remove section', $fragment); $fragment.remove(); console.log(`fragment "${marker}" resolved`); }, 500); From f717acdf1ef39dd1517493457b6e09604a3fd97a Mon Sep 17 00:00:00 2001 From: Alexandre Capt Date: Thu, 25 Mar 2021 13:20:28 +0100 Subject: [PATCH 228/649] fix(section): blocks might be followed with empty section divs --- express/scripts/scripts.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index ae37e27..fb56a6f 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -596,6 +596,10 @@ export function unwrapBlock($block) { $appendTo = $postBlockSection; } }); + + if (!$postBlockSection.hasChildNodes()) { + $postBlockSection.remove(); + } } function splitSections() { From 7fa4eb690140dbce915457c44647758cdf5aca13 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 25 Mar 2021 11:04:04 -0700 Subject: [PATCH 229/649] fix(page-list): design update --- express/blocks/page-list/page-list.css | 44 ++++++++++---------------- express/blocks/page-list/page-list.js | 38 ++++++++++++++++------ 2 files changed, 45 insertions(+), 37 deletions(-) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index b15c8de..0e2e3a2 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -38,7 +38,7 @@ main .page-list-browse-button { display: none; } main .page-list { - width: 280px; + width: 260px; } } @@ -57,7 +57,6 @@ main .page-list-container > div > div { main .page-list-container > div .template-list { width: 100%; - height: 10000px; box-sizing: border-box; } @@ -80,37 +79,26 @@ main .hero-short { padding: 32px; } -@media (min-width: 600px) { - main .page-template-list > .template-list.masonry { - columns: unset; - } +main .page-list-left { + flex: 0 0 auto; + overflow: scroll; + height: 500px; } -@media (min-width: 900px) { - - main .page-template-list > .template-list.masonry { - columns: 240px 2; - width: 530px; - } +main .page-list-right { + flex: 1 1 auto; + padding-left: 20px; + overflow: scroll; + height: 500px; } -@media (min-width: 1200px) { - main .page-template-list > .template-list.masonry { - columns: 240px 3; - width: 800px; - } +main .page-template-list > .template-list.masonry { + columns: 260px auto; + column-gap: 0; } -@media (min-width: 1400px) { - main .page-template-list > .template-list.masonry { - columns: 240px 4; - width: 1100px; +@media (max-width:600px) { + .hero h1 + p { + display: none; } } - -@media (min-width: 1700px) { - main .page-template-list > .template-list.masonry { - columns: 240px 5; - width: 1400px; - } -} \ No newline at end of file diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 1ecdf8c..0c1858b 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -30,6 +30,13 @@ function addPages(index, config, $block) { $block.appendChild($ul); } +function setSize($cols, $flex, $hero) { + const minWidth = 260; + const w = $cols.parentNode.offsetWidth; + $cols.style.width = `${Math.floor(w / minWidth) * minWidth}px`; + $flex.style.height = `${(window.innerHeight - $hero.offsetHeight)}px`; +} + function showHide($block, $ptl) { if (window.innerWidth < 600) { $block.classList.add('hidden'); @@ -61,26 +68,37 @@ async function fetchIndex() { async function decoratePageList($block) { const config = readBlockConfig($block); - $block.innerHTML = ''; - - const $browse = createTag('button', { class: 'page-list-browse-button hidden' }); - $browse.innerHTML = config.label; - $block.appendChild($browse); - const $section = $block.closest('.section-wrapper'); - $section.parentNode.insertBefore($browse, $section); // shorten hero const $hero = document.querySelector('.hero'); $hero.classList.add('hero-short'); const $flex = document.querySelector('main .page-list-container > div'); - $flex.style.height = `${(window.innerHeight - $hero.offsetHeight)}px`; + + $flex.innerHTML = ` +
+
+
    +
+
+
+
+
+ `; + + // eslint-disable-next-line no-param-reassign + $block = $flex.querySelector('.page-list'); + + const $browse = createTag('button', { class: 'page-list-browse-button hidden' }); + $browse.innerHTML = config.label; + const $section = $block.closest('.section-wrapper'); + $section.parentNode.insertBefore($browse, $section); // get $tlc const $tlc = document.querySelector('.template-list-container'); const $ptl = $tlc.firstChild; $ptl.classList.add('page-template-list'); - $block.parentNode.appendChild($ptl); + $flex.querySelector('.page-list-right').appendChild($ptl); $tlc.remove(); $browse.addEventListener('click', () => { @@ -94,8 +112,10 @@ async function decoratePageList($block) { }); showHide($block, $ptl); + setSize($ptl, $flex, $hero); window.addEventListener('resize', () => { showHide($block, $ptl); + setSize($ptl, $flex, $hero); }); const index = await fetchIndex(); From 66e3a5be1f9c30ece15d3879f40c6f32cf904591 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 25 Mar 2021 12:09:54 -0700 Subject: [PATCH 230/649] chore: linting --- express/blocks/page-list/page-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 0c1858b..843805c 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -34,7 +34,7 @@ function setSize($cols, $flex, $hero) { const minWidth = 260; const w = $cols.parentNode.offsetWidth; $cols.style.width = `${Math.floor(w / minWidth) * minWidth}px`; - $flex.style.height = `${(window.innerHeight - $hero.offsetHeight)}px`; + $flex.style.height = `${(window.innerHeight - $hero.offsetHeight)}px`; } function showHide($block, $ptl) { From 13533bc9bc327ff80d101b829abe9cc87824fbaf Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 25 Mar 2021 12:22:28 -0700 Subject: [PATCH 231/649] feat(gnav): custom signin --- express/scripts/martech.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 8f15312..1c9680b 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -108,6 +108,11 @@ window.fedsConfig = { content: { experience: 'cc-express/spark-gnav', }, + profile: { + customSignIn: () => { + window.location.href = 'https://spark.adobe.com/sp'; + }, + }, }; window.adobeid = { From 6ec7c09e8bff3573e8680f13e13830fc8ea7998f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 25 Mar 2021 16:08:29 -0700 Subject: [PATCH 232/649] fix: change locale default to us --- express/blocks/template-list/template-list.js | 2 +- express/scripts/martech.js | 4 ++-- express/scripts/scripts.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/express/blocks/template-list/template-list.js b/express/blocks/template-list/template-list.js index 1361732..472e280 100644 --- a/express/blocks/template-list/template-list.js +++ b/express/blocks/template-list/template-list.js @@ -38,7 +38,7 @@ async function fetchBlueprint(pathname) { async function decorateTemplateList($block) { let rows = $block.children.length; const locale = getLocale(window.location); - if (rows === 0 && locale !== 'en') { + if (rows === 0 && locale !== 'us') { const tls = Array.from($block.closest('main').querySelectorAll('.template-list')); const i = tls.indexOf($block); diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 1c9680b..ed7fb88 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -56,11 +56,11 @@ window.targetGlobalSettings = { const locale = getLocale(window.location); const pathSegments = window.location.pathname.substr(1).split('/'); -if (locale !== 'en') pathSegments.shift(); +if (locale !== 'us') pathSegments.shift(); const pageName = `adobe.com:${pathSegments.join(':')}`; const langs = { - en: 'en-US', + us: 'en-US', fr: 'fr-FR', de: 'de-DE', it: 'it-IT', diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index fb56a6f..c67e406 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -80,7 +80,7 @@ export function getLocale(url) { if (/^[a-z]{2}$/.test(locale)) { return locale; } - return 'en'; + return 'us'; } export function addBlockClasses($block, classNames) { From 112e532e4771bfc000aa2fd79509e39f268abac5 Mon Sep 17 00:00:00 2001 From: Benjamin Bytheway Date: Thu, 25 Mar 2021 17:39:20 -0600 Subject: [PATCH 233/649] chore: Add Analytics tracking as a first pass. --- express/scripts/martech.js | 467 ++++++++++++++++++++++++++++++------- 1 file changed, 384 insertions(+), 83 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 877760b..6a4b64f 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -9,128 +9,429 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window document digitalData _satellite */ +/* global w document digitalData _satellite */ import { loadScript, getLocale } from './scripts.js'; +var + // this saves on file size when this file gets minified... + w = window, + d = document, + loc = w.location, + pathname = loc.pathname; + function handleConsentSettings() { try { - if (!window.adobePrivacy || window.adobePrivacy.hasUserProvidedCustomConsent()) { - window.sprk_full_consent = false; + if (!w.adobePrivacy || w.adobePrivacy.hasUserProvidedCustomConsent()) { + w.sprk_full_consent = false; return; } - if (window.adobePrivacy.hasUserProvidedConsent()) { - window.sprk_full_consent = true; + if (w.adobePrivacy.hasUserProvidedConsent()) { + w.sprk_full_consent = true; } else { - window.sprk_full_consent = false; + w.sprk_full_consent = false; } } catch (e) { // eslint-disable-next-line no-console console.warn("Couldn't determine user consent status:", e); - window.sprk_full_consent = false; + w.sprk_full_consent = false; } } -window.addEventListener('adobePrivacy:PrivacyConsent', handleConsentSettings); -window.addEventListener('adobePrivacy:PrivacyReject', handleConsentSettings); -window.addEventListener('adobePrivacy:PrivacyCustom', handleConsentSettings); -window.fedsConfig = window.fedsConfig || {}; -window.fedsConfig.privacy = window.fedsConfig.privacy || {}; -window.fedsConfig.privacy.otDomainId = '7a5eb705-95ed-4cc4-a11d-0cc5760e93db'; -window.fedsConfig.privacy.footerLinkSelector = '#openCookieModal'; -window.marketingtech = { +w.addEventListener('adobePrivacy:PrivacyConsent', handleConsentSettings); +w.addEventListener('adobePrivacy:PrivacyReject', handleConsentSettings); +w.addEventListener('adobePrivacy:PrivacyCustom', handleConsentSettings); +w.fedsConfig = w.fedsConfig || {}; +w.fedsConfig.privacy = w.fedsConfig.privacy || {}; +w.fedsConfig.privacy.otDomainId = '7a5eb705-95ed-4cc4-a11d-0cc5760e93db'; +w.fedsConfig.privacy.footerLinkSelector = '#openCookieModal'; +w.marketingtech = { adobe: { launch: { property: 'global', environment: 'production', }, analytics: { - additionalAccounts: 'adbemmarvelweb.prod', + // TODO: Switch these before go live. + // additionalAccounts: 'adbemmarvelweb.prod', + additionalAccounts: 'adbemmarvelweb.rebootdev2', }, target: true, }, }; -window.targetGlobalSettings = { +w.targetGlobalSettings = { bodyHidingEnabled: false, }; -const locale = getLocale(window.location); -const pathSegments = window.location.pathname.substr(1).split('/'); -if (locale !== 'en') pathSegments.shift(); -const pageName = `adobe.com:${pathSegments.join(':')}`; - -const langs = { - en: 'en-US', - fr: 'fr-FR', - de: 'de-DE', - it: 'it-IT', - da: 'da-DK', - es: 'es-ES', - fi: 'fi-FI', - jp: 'ja-JP', - kr: 'ko-KR', - no: 'nb-NO', - nl: 'nl-NL', - br: 'pt-BR', - se: 'sv-SE', - tw: 'zh-Hant-TW', - cn: 'zh-Hans-CN', -}; +loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { -const language = langs[locale]; -let category = ''; -if (window.location.pathname.includes('/create/') || window.location.pathname.includes('/feature/')) { - category = 'design'; - if (window.location.pathname.includes('/photo')) category = 'photo'; - if (window.location.pathname.includes('/video')) category = 'video'; -} + //------------------------------------------------------------------------------------ + // gathering the data + //------------------------------------------------------------------------------------ -window.digitalData = { - page: { - pageInfo: { - pageName, - language, - siteSection: 'adobe.com:express', - category, - }, - }, -}; + let locale = getLocale(w.location); + let pathSegments = pathname.substr(1).split('/'); + if (locale !== 'en') pathSegments.shift(); + let pageName = `adobe.com:${pathSegments.join(':')}`; + let langs = { + en: 'en-US', + fr: 'fr-FR', + de: 'de-DE', + it: 'it-IT', + da: 'da-DK', + es: 'es-ES', + fi: 'fi-FI', + jp: 'ja-JP', + kr: 'ko-KR', + no: 'nb-NO', + nl: 'nl-NL', + br: 'pt-BR', + se: 'sv-SE', + tw: 'zh-Hant-TW', + cn: 'zh-Hans-CN', + }; -function textToName(text) { - const splits = text.toLowerCase().split(' '); - const camelCase = splits.map((s, i) => (i ? s.charAt(0).toUpperCase() + s.substr(1) : s)).join(''); - return (camelCase); -} - -function trackButtonClick($a) { - const prefix = 'adobe.com:express:'; - let eventName = `${prefix}linkEvent`; - if ($a.textContent) { - eventName = prefix + textToName($a.textContent); - } else { - const $img = $a.querySelector('img'); - if ($img && $img.getAttribute('alt')) { - eventName = prefix + textToName($img.getAttribute('alt')); - } + let language = langs[locale]; + let category; + if ( + pathname.includes('/create/') || + pathname.includes('/feature/') + ) { + category = 'design'; + if (pathname.includes('/photo')) category = 'photo'; + if (pathname.includes('/video')) category = 'video'; } + let sparkLandingPageType; + // seo + if ( + pathname.includes('/create/') || + pathname.includes('/make/') || + pathname.includes('/feature/') || + pathname.includes('/discover/') + ) { + sparkLandingPageType = 'seo'; + // blog + } else if ( + pathname.includes('/learn/blog/') + ) { + sparkLandingPageType = 'blog'; + // pricing + } else if ( + pathname.includes('/pricing') + ) { + sparkLandingPageType = 'pricing'; + // edu + } else if ( + pathname.includes('/education/') + ) { + sparkLandingPageType = 'edu'; + } + let sparkUserType = 'knownNotAuth'; // (w.adobeIMS && w.adobeIMS.isUserAuthenticated()) ? '' : ''; + let url = new URL(loc.href); + let sparkTouchpoint = url.searchParams.get('touchpointName'); + + + + //------------------------------------------------------------------------------------ + // set some global and persistent data layer properties + //------------------------------------------------------------------------------------ + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('page.pageInfo.pageName', pageName); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('page.pageInfo.language', language); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('page.pageInfo.siteSection', 'adobe.com:express'); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('page.pageInfo.category', category); + + //------------------------------------------------------------------------------------ + // spark specific global and persistent data layer properties + //------------------------------------------------------------------------------------ + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('page.pageInfo.pageurl', loc.href); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('page.pageInfo.namespace', 'express'); // eslint-disable-next-line no-underscore-dangle - digitalData._set('digitalData.primaryEvent.eventInfo.eventName', eventName); + digitalData._set('spark.eventData.pageurl', loc.href); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.pageReferrer', d.referrer); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.pageTitle', d.title); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.landingPageType', sparkLandingPageType); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.landingPageReferrer', d.referrer); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.landingPageUrl', loc.href); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.userType', sparkUserType); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.premiumEntitled', ''); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.displayedLanguage', language); + // eslint-disable-next-line no-underscore-dangle + // digitalData._set('spark.eventData.deviceLanguage', language); // NOTE: I don't know how to capture this + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.pagename', pageName); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.platformName', 'web'); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData3', 'category:' + category); + + + //------------------------------------------------------------------------------------ + // Fire the viewedPage event + //------------------------------------------------------------------------------------ + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryEvent.eventInfo.eventName', 'viewedPage'); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.eventName', 'viewedPage'); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.sendTimestamp', new Date().getTime()); + // eslint-disable-next-line no-underscore-dangle _satellite.track('event', { digitalData: digitalData._snapshot() }); + + //------------------------------------------------------------------------------------ + // Fire the landing:viewedPage event + //------------------------------------------------------------------------------------ + + if ( + sparkLandingPageType === 'seo' || + sparkLandingPageType === 'pricing' || + sparkLandingPageType === 'edu' + ) { + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryEvent.eventInfo.eventName', 'landing:viewedPage'); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.eventName', 'landing:viewedPage'); + + // eslint-disable-next-line no-underscore-dangle + _satellite.track('event', { digitalData: digitalData._snapshot() }); + + } else if ( + sparkLandingPageType === 'blog' + ) { + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryEvent.eventInfo.eventName', 'blog:viewedPage'); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.eventName', 'blog:viewedPage'); + + // eslint-disable-next-line no-underscore-dangle + _satellite.track('event', { digitalData: digitalData._snapshot() }); + + } else if ( + sparkLandingPageType === 'pricing' && + sparkTouchpoint + ) { + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryEvent.eventInfo.eventName', 'displayPurchasePanel'); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.eventName', 'displayPurchasePanel'); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.trigger', sparkTouchpoint); + + // eslint-disable-next-line no-underscore-dangle + _satellite.track('event', { digitalData: digitalData._snapshot() }); + + } + // eslint-disable-next-line no-underscore-dangle - digitalData._delete('digitalData.primaryEvent.eventInfo.eventName'); -} + digitalData._delete('primaryEvent.eventInfo.eventName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.eventName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.sendTimestamp'); + + + + function textToName(text) { + const splits = text.toLowerCase().split(' '); + const camelCase = splits.map((s, i) => (i ? s.charAt(0).toUpperCase() + s.substr(1) : s)).join(''); + return (camelCase); + } + + function appendLinkText(eventName, $a) { + let + $img, + alt; + + if ($a.textContent) { + eventName += textToName($a.textContent); + } else { + if ( + ($img = $a.querySelector('img')) && + (alt = $img.getAttribute('alt')) + ) { + eventName += textToName(alt); + } + } + + return eventName; + } + + function trackButtonClick($a) { + let + adobeEventName = 'adobe.com:express:cta:', + sparkEventName, + + $templateContainer, + $cardContainer, + $img, + alt, + cardPosition; + + // Template button click + if ( + ($templateContainer = $a.closest('.template-list')) + ) { + + adobeEventName += 'template:'; + + // try to get the image alternate text + if ( + ($cardContainer = $a.closest('.template-list > div')) && + ($img = $cardContainer.querySelector('img')) && + (alt = $img.getAttribute('alt')) + ) { + adobeEventName += textToName(alt); + } else { + adobeEventName += 'Click'; + } + + sparkEventName = 'landing:templatePressed'; + + // CTA in the hero + } else if ($a.closest('.hero')) { + adobeEventName = appendLinkText(adobeEventName + 'hero:', $a); + sparkEventName = 'landing:ctaPressed'; + + // Click in the pricing block + } else if ($a.closest('.pricing')) { + + // get the position of the card in the plans + cardPosition = Array.prototype.slice.call( + document.querySelectorAll('.plan') + ).indexOf( + $a.closest('.plan') + ) + 1; + + // Buy Now + if ($a.hostname.includes('commerce.adobe.com')) { + + // individual + if ($a.search.includes('spark.adobe.com')) { + adobeEventName += 'pricing:individual:'+cardPosition+':buyNow:Click'; + // team + } else if ($a.search.includes('adminconsole.adobe.com')) { + adobeEventName += 'pricing:team:'+cardPosition+':buyNow:Click'; + } + + sparkEventName = 'beginPurchaseFlow'; + + // anything else + } else { + adobeEventName += 'pricing:starter:'+cardPosition+':getStarted:Click'; + sparkEventName = 'pricing:ctaPressed'; + } + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData5', 'cardPosition:' + cardPosition); + + // Click in the pricing block + } else if (sparkLandingPageType === 'pricing') { -function decorateAnalyticsEvents() { - document.querySelectorAll('main a').forEach(($a) => { - $a.addEventListener('click', () => { - trackButtonClick($a); + // edu link + if ( + $a.pathname.includes('/edu') + ) { + adobeEventName += 'pricing:eduLink:Click' + sparkEventName = 'landing:eduSeoPagePressed'; + + // business enterprise link + } else if ( + $a.pathname.includes('business/enterprise') + ) { + adobeEventName += 'pricing:enterpriseLink:Click' + sparkEventName = 'landing:businessSeoPagePressed'; + + // all other links + } else { + adobeEventName = appendLinkText(adobeEventName, $a); + sparkEventName = 'pricing:ctaPressed'; + } + + // Default clicks + } else { + adobeEventName = appendLinkText(adobeEventName, $a); + sparkEventName = 'landing:ctaPressed'; + } + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryEvent.eventInfo.eventName', adobeEventName); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.eventName', sparkEventName); + + + // eslint-disable-next-line no-underscore-dangle + _satellite.track('event', { digitalData: digitalData._snapshot() }); + + + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryEvent.eventInfo.eventName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.eventName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData5'); + } + + function decorateAnalyticsEvents() { + d.querySelectorAll('main a') + .forEach(($a) => { + $a.addEventListener('click', () => { + trackButtonClick($a); + }); }); - }); -} + } + + function pollForPricingBlock() { + let + pollingTimer; + + pollingTimer = setTimeout(() => { + let + $plansBlock = d.querySelector('.pricing-plans'); + + if ($plansBlock) { + decorateAnalyticsEvents(); + } else { + pollForPricingBlock(); + } + + }, 300); + + // make sure we don't poll forever + setTimeout(() => { + clearTimeout(pollingTimer); + }, 4000); + + } + + if (sparkLandingPageType === 'pricing') { + pollForPricingBlock(); + } else { + decorateAnalyticsEvents(); + } + +}); -loadScript('https://www.adobe.com/marketingtech/main.min.js'); loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); -decorateAnalyticsEvents(); + From acddb490aac772bcac79efc02e0d0296275dae07 Mon Sep 17 00:00:00 2001 From: Benjamin Bytheway Date: Thu, 25 Mar 2021 18:22:44 -0600 Subject: [PATCH 234/649] chore: resolving millions of eslint errors --- express/scripts/martech.js | 187 ++++++++++++++++--------------------- 1 file changed, 79 insertions(+), 108 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 6a4b64f..30b794f 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -9,16 +9,15 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global w document digitalData _satellite */ +/* global window document digitalData _satellite */ import { loadScript, getLocale } from './scripts.js'; -var - // this saves on file size when this file gets minified... - w = window, - d = document, - loc = w.location, - pathname = loc.pathname; +// this saves on file size when this file gets minified... +const w = window; +const d = document; +const loc = w.location; +const { pathname } = loc; function handleConsentSettings() { try { @@ -64,16 +63,15 @@ w.targetGlobalSettings = { }; loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { - //------------------------------------------------------------------------------------ // gathering the data //------------------------------------------------------------------------------------ - let locale = getLocale(w.location); - let pathSegments = pathname.substr(1).split('/'); + const locale = getLocale(w.location); + const pathSegments = pathname.substr(1).split('/'); if (locale !== 'en') pathSegments.shift(); - let pageName = `adobe.com:${pathSegments.join(':')}`; - let langs = { + const pageName = `adobe.com:${pathSegments.join(':')}`; + const langs = { en: 'en-US', fr: 'fr-FR', de: 'de-DE', @@ -91,11 +89,11 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { cn: 'zh-Hans-CN', }; - let language = langs[locale]; + const language = langs[locale]; let category; if ( - pathname.includes('/create/') || - pathname.includes('/feature/') + pathname.includes('/create/') + || pathname.includes('/feature/') ) { category = 'design'; if (pathname.includes('/photo')) category = 'photo'; @@ -104,10 +102,10 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { let sparkLandingPageType; // seo if ( - pathname.includes('/create/') || - pathname.includes('/make/') || - pathname.includes('/feature/') || - pathname.includes('/discover/') + pathname.includes('/create/') + || pathname.includes('/make/') + || pathname.includes('/feature/') + || pathname.includes('/discover/') ) { sparkLandingPageType = 'seo'; // blog @@ -126,12 +124,10 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { ) { sparkLandingPageType = 'edu'; } - let sparkUserType = 'knownNotAuth'; // (w.adobeIMS && w.adobeIMS.isUserAuthenticated()) ? '' : ''; - let url = new URL(loc.href); - let sparkTouchpoint = url.searchParams.get('touchpointName'); - + const sparkUserType = 'knownNotAuth'; // (w.adobeIMS && w.adobeIMS.isUserAuthenticated()) ? '' : ''; + const url = new URL(loc.href); + const sparkTouchpoint = url.searchParams.get('touchpointName'); - //------------------------------------------------------------------------------------ // set some global and persistent data layer properties //------------------------------------------------------------------------------------ @@ -148,7 +144,7 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { //------------------------------------------------------------------------------------ // spark specific global and persistent data layer properties //------------------------------------------------------------------------------------ - + // eslint-disable-next-line no-underscore-dangle digitalData._set('page.pageInfo.pageurl', loc.href); // eslint-disable-next-line no-underscore-dangle @@ -172,15 +168,15 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { digitalData._set('spark.eventData.premiumEntitled', ''); // eslint-disable-next-line no-underscore-dangle digitalData._set('spark.eventData.displayedLanguage', language); + // TODO: I don't know how to capture this // eslint-disable-next-line no-underscore-dangle - // digitalData._set('spark.eventData.deviceLanguage', language); // NOTE: I don't know how to capture this + // digitalData._set('spark.eventData.deviceLanguage', language); // eslint-disable-next-line no-underscore-dangle digitalData._set('spark.eventData.pagename', pageName); // eslint-disable-next-line no-underscore-dangle digitalData._set('spark.eventData.platformName', 'web'); // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData3', 'category:' + category); - + digitalData._set('spark.eventData.contextualData3', `category:${category}`); //------------------------------------------------------------------------------------ // Fire the viewedPage event @@ -196,41 +192,41 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { // eslint-disable-next-line no-underscore-dangle _satellite.track('event', { digitalData: digitalData._snapshot() }); - //------------------------------------------------------------------------------------ // Fire the landing:viewedPage event - //------------------------------------------------------------------------------------ - if ( - sparkLandingPageType === 'seo' || - sparkLandingPageType === 'pricing' || - sparkLandingPageType === 'edu' + sparkLandingPageType === 'seo' + || sparkLandingPageType === 'pricing' + || sparkLandingPageType === 'edu' ) { - // eslint-disable-next-line no-underscore-dangle digitalData._set('primaryEvent.eventInfo.eventName', 'landing:viewedPage'); // eslint-disable-next-line no-underscore-dangle digitalData._set('spark.eventData.eventName', 'landing:viewedPage'); - // eslint-disable-next-line no-underscore-dangle - _satellite.track('event', { digitalData: digitalData._snapshot() }); + _satellite.track('event', { + // eslint-disable-next-line no-underscore-dangle + digitalData: digitalData._snapshot(), + }); + // Fire the blog:viewedPage event } else if ( sparkLandingPageType === 'blog' ) { - // eslint-disable-next-line no-underscore-dangle digitalData._set('primaryEvent.eventInfo.eventName', 'blog:viewedPage'); // eslint-disable-next-line no-underscore-dangle digitalData._set('spark.eventData.eventName', 'blog:viewedPage'); - // eslint-disable-next-line no-underscore-dangle - _satellite.track('event', { digitalData: digitalData._snapshot() }); + _satellite.track('event', { + // eslint-disable-next-line no-underscore-dangle + digitalData: digitalData._snapshot(), + }); + // Fire the displayPurchasePanel event } else if ( - sparkLandingPageType === 'pricing' && - sparkTouchpoint + sparkLandingPageType === 'pricing' + && sparkTouchpoint ) { - // eslint-disable-next-line no-underscore-dangle digitalData._set('primaryEvent.eventInfo.eventName', 'displayPurchasePanel'); // eslint-disable-next-line no-underscore-dangle @@ -238,11 +234,12 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { // eslint-disable-next-line no-underscore-dangle digitalData._set('spark.eventData.trigger', sparkTouchpoint); - // eslint-disable-next-line no-underscore-dangle - _satellite.track('event', { digitalData: digitalData._snapshot() }); - + _satellite.track('event', { + // eslint-disable-next-line no-underscore-dangle + digitalData: digitalData._snapshot(), + }); } - + // eslint-disable-next-line no-underscore-dangle digitalData._delete('primaryEvent.eventInfo.eventName'); // eslint-disable-next-line no-underscore-dangle @@ -250,8 +247,6 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { // eslint-disable-next-line no-underscore-dangle digitalData._delete('spark.eventData.sendTimestamp'); - - function textToName(text) { const splits = text.toLowerCase().split(' '); const camelCase = splits.map((s, i) => (i ? s.charAt(0).toUpperCase() + s.substr(1) : s)).join(''); @@ -259,48 +254,44 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { } function appendLinkText(eventName, $a) { - let - $img, - alt; + let $img; + let alt; + let newEventName; if ($a.textContent) { - eventName += textToName($a.textContent); + newEventName = eventName + textToName($a.textContent); } else { - if ( - ($img = $a.querySelector('img')) && - (alt = $img.getAttribute('alt')) - ) { - eventName += textToName(alt); + $img = $a.querySelector('img'); + alt = $img && $img.getAttribute('alt'); + if (alt) { + newEventName = eventName + textToName(alt); + } else { + newEventName = eventName; } } - return eventName; + return newEventName; } function trackButtonClick($a) { - let - adobeEventName = 'adobe.com:express:cta:', - sparkEventName, - - $templateContainer, - $cardContainer, - $img, - alt, - cardPosition; + let adobeEventName = 'adobe.com:express:cta:'; + let sparkEventName; + const $templateContainer = $a.closest('.template-list'); + let $cardContainer; + let $img; + let alt; + let cardPosition; // Template button click - if ( - ($templateContainer = $a.closest('.template-list')) - ) { - + if ($templateContainer) { adobeEventName += 'template:'; + $cardContainer = $a.closest('.template-list > div'); + $img = $cardContainer && $cardContainer.querySelector('img'); + alt = $img && $img.getAttribute('alt'); + // try to get the image alternate text - if ( - ($cardContainer = $a.closest('.template-list > div')) && - ($img = $cardContainer.querySelector('img')) && - (alt = $img.getAttribute('alt')) - ) { + if (alt) { adobeEventName += textToName(alt); } else { adobeEventName += 'Click'; @@ -310,58 +301,50 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { // CTA in the hero } else if ($a.closest('.hero')) { - adobeEventName = appendLinkText(adobeEventName + 'hero:', $a); + adobeEventName = appendLinkText(`${adobeEventName}hero:`, $a); sparkEventName = 'landing:ctaPressed'; // Click in the pricing block } else if ($a.closest('.pricing')) { - // get the position of the card in the plans - cardPosition = Array.prototype.slice.call( - document.querySelectorAll('.plan') - ).indexOf( - $a.closest('.plan') - ) + 1; + cardPosition = Array.prototype.slice.call(document.querySelectorAll('.plan')).indexOf($a.closest('.plan')) + 1; // Buy Now if ($a.hostname.includes('commerce.adobe.com')) { - // individual if ($a.search.includes('spark.adobe.com')) { - adobeEventName += 'pricing:individual:'+cardPosition+':buyNow:Click'; + adobeEventName += `pricing:individual:${cardPosition}:buyNow:Click`; // team } else if ($a.search.includes('adminconsole.adobe.com')) { - adobeEventName += 'pricing:team:'+cardPosition+':buyNow:Click'; + adobeEventName += `pricing:team:${cardPosition}:buyNow:Click`; } sparkEventName = 'beginPurchaseFlow'; // anything else } else { - adobeEventName += 'pricing:starter:'+cardPosition+':getStarted:Click'; + adobeEventName += `pricing:starter:${cardPosition}:getStarted:Click`; sparkEventName = 'pricing:ctaPressed'; } // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData5', 'cardPosition:' + cardPosition); + digitalData._set('spark.eventData.contextualData5', `cardPosition:${cardPosition}`); // Click in the pricing block } else if (sparkLandingPageType === 'pricing') { - // edu link if ( $a.pathname.includes('/edu') ) { - adobeEventName += 'pricing:eduLink:Click' + adobeEventName += 'pricing:eduLink:Click'; sparkEventName = 'landing:eduSeoPagePressed'; // business enterprise link } else if ( $a.pathname.includes('business/enterprise') ) { - adobeEventName += 'pricing:enterpriseLink:Click' + adobeEventName += 'pricing:enterpriseLink:Click'; sparkEventName = 'landing:businessSeoPagePressed'; - // all other links } else { adobeEventName = appendLinkText(adobeEventName, $a); @@ -379,11 +362,9 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { // eslint-disable-next-line no-underscore-dangle digitalData._set('spark.eventData.eventName', sparkEventName); - // eslint-disable-next-line no-underscore-dangle _satellite.track('event', { digitalData: digitalData._snapshot() }); - // eslint-disable-next-line no-underscore-dangle digitalData._delete('primaryEvent.eventInfo.eventName'); // eslint-disable-next-line no-underscore-dangle @@ -393,8 +374,7 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { } function decorateAnalyticsEvents() { - d.querySelectorAll('main a') - .forEach(($a) => { + d.querySelectorAll('main a').forEach(($a) => { $a.addEventListener('click', () => { trackButtonClick($a); }); @@ -402,26 +382,20 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { } function pollForPricingBlock() { - let - pollingTimer; - - pollingTimer = setTimeout(() => { - let - $plansBlock = d.querySelector('.pricing-plans'); + const pollingTimer = setTimeout(() => { + const $plansBlock = d.querySelector('.pricing-plans'); if ($plansBlock) { decorateAnalyticsEvents(); } else { pollForPricingBlock(); } - }, 300); // make sure we don't poll forever setTimeout(() => { clearTimeout(pollingTimer); }, 4000); - } if (sparkLandingPageType === 'pricing') { @@ -429,9 +403,6 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { } else { decorateAnalyticsEvents(); } - }); loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); - - From 39a7eb5ef4dba646ca4b468dc665f662af45f4c0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Thu, 25 Mar 2021 17:39:26 -0700 Subject: [PATCH 235/649] feat: inital getOffer implementation --- express/scripts/scripts.js | 145 +++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index c67e406..47abd29 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -83,6 +83,151 @@ export function getLocale(url) { return 'us'; } +export function getCurrency(locale) { + const currencies = { + ar: 'ARS', + at: 'EUR', + au: 'AUD', + be: 'EUR', + bg: 'EUR', + br: 'BRL', + ca: 'CAD', + ch: 'CHF', + cl: 'CLP', + co: 'COP', + cr: 'USD', + cy: 'EUR', + cz: 'EUR', + de: 'EUR', + dk: 'DKK', + ec: 'USD', + ee: 'EUR', + es: 'EUR', + fi: 'EUR', + fr: 'EUR', + gb: 'GBP', + gr: 'EUR', + gt: 'USD', + hk: 'HKD', + hu: 'EUR', + id: 'IDR', + ie: 'EUR', + il: 'ILS', + in: 'INR', + it: 'EUR', + jp: 'JPY', + kr: 'KRW', + lt: 'EUR', + lu: 'EUR', + lv: 'EUR', + mt: 'EUR', + mx: 'MXN', + my: 'MYR', + nl: 'EUR', + no: 'NOK', + nz: 'AUD', + pe: 'PEN', + ph: 'PHP', + pl: 'EUR', + pt: 'EUR', + ro: 'EUR', + ru: 'RUB', + se: 'SEK', + sg: 'SGD', + si: 'EUR', + sk: 'EUR', + th: 'THB', + tw: 'TWD', + us: 'USD', + ve: 'USD', + za: 'USD', + ae: 'USD', + bh: 'BHD', + eg: 'EGP', + jo: 'JOD', + kw: 'KWD', + om: 'OMR', + qa: 'USD', + sa: 'SAR', + ua: 'USD', + dz: 'USD', + lb: 'LBP', + ma: 'USD', + tn: 'USD', + ye: 'USD', + am: 'USD', + az: 'USD', + ge: 'USD', + md: 'USD', + tm: 'USD', + by: 'USD', + kz: 'USD', + kg: 'USD', + tj: 'USD', + uz: 'USD', + bo: 'USD', + do: 'USD', + hr: 'EUR', + ke: 'USD', + lk: 'USD', + mo: 'HKD', + mu: 'USD', + ng: 'USD', + pa: 'USD', + py: 'USD', + sv: 'USD', + tt: 'USD', + uy: 'USD', + vn: 'USD', + }; + return currencies[locale]; +} + +function getCookie(cname) { + const name = `${cname}=`; + const decodedCookie = decodeURIComponent(document.cookie); + const ca = decodedCookie.split(';'); + for (let i = 0; i < ca.length; i += 1) { + let c = ca[i]; + while (c.charAt(0) === ' ') { + c = c.substring(1); + } + if (c.indexOf(name) === 0) { + return c.substring(name.length, c.length); + } + } + return ''; +} + +function getCountry() { + let country = getCookie('international'); + if (!country) { + country = getLocale(window.location); + } + return (country); +} + +export async function getOffer(offerId) { + const country = getCountry(); + console.log(country); + const currency = getCurrency(country); + const resp = await fetch('/express/system/offers.json'); + const json = await resp.json(); + const upperCountry = country.toUpperCase(); + const offer = json.data.find((e) => (e.o === offerId) && (e.c === upperCountry)); + + if (offer) { + const unitPrice = offer.p; + const commerceURL = `https://commerce.adobe.com/checkout?cli=spark&co=${country}&items%5B0%5D%5Bid%5D=${offerId}&items%5B0%5D%5Bcs%5D=0&rUrl=https%3A%2F%2Fspark.adobe.com%2Fsp%2F`; + return { + country, currency, unitPrice, commerceURL, + }; + } + return {}; +} + +window.getOffer = getOffer; + export function addBlockClasses($block, classNames) { const $rows = Array.from($block.children); $rows.forEach(($row) => { From 7778e81a45fc05921ad2f2ae36974d951ef05ad1 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Fri, 26 Mar 2021 18:38:07 +0900 Subject: [PATCH 236/649] fix(a11y): ensure any-buttons have outline and close link is focusable --- .../sticky-promo-bar/sticky-promo-bar.css | 21 ++++++++------ .../sticky-promo-bar/sticky-promo-bar.js | 5 +++- express/styles/styles.css | 28 +++++++++---------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/express/blocks/sticky-promo-bar/sticky-promo-bar.css b/express/blocks/sticky-promo-bar/sticky-promo-bar.css index b5157a7..b223528 100644 --- a/express/blocks/sticky-promo-bar/sticky-promo-bar.css +++ b/express/blocks/sticky-promo-bar/sticky-promo-bar.css @@ -32,10 +32,13 @@ main .sticky-promo-bar .close { width: 21px; height: 21px; top: 18px; - right: 25px; - } - - main .sticky-promo-bar .close:before { + right: 20px; + cursor: pointer; + background: none; + border: none; +} + +main .sticky-promo-bar .close:before { content: ''; position: absolute; top: 10px; @@ -43,9 +46,10 @@ main .sticky-promo-bar .close { height: 1px; background-color: currentColor; transform: rotate(-45deg); - } - - main .sticky-promo-bar .close:after { + left: 0; +} + +main .sticky-promo-bar .close:after { content: ''; position: absolute; top: 10px; @@ -53,4 +57,5 @@ main .sticky-promo-bar .close { height: 1px; background-color: currentColor; transform: rotate(45deg); - } + left: 0; +} diff --git a/express/blocks/sticky-promo-bar/sticky-promo-bar.js b/express/blocks/sticky-promo-bar/sticky-promo-bar.js index 5a1d64f..96a7666 100644 --- a/express/blocks/sticky-promo-bar/sticky-promo-bar.js +++ b/express/blocks/sticky-promo-bar/sticky-promo-bar.js @@ -16,7 +16,10 @@ import { } from '../../scripts/scripts.js'; export default function decorate($block) { - const $close = createTag('div', { class: 'close' }); + const $close = createTag('button', { + class: 'close', + 'aria-label': 'close', + }); $block.appendChild($close); $close.addEventListener('click', () => { $block.remove(); diff --git a/express/styles/styles.css b/express/styles/styles.css index 72246c5..5c4328b 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -110,7 +110,7 @@ header .mobile .hamburger::before { } header .desktop .top .section span { - padding: 0 12px; + padding: 0 12px; } header .desktop .top .button { @@ -133,7 +133,7 @@ header .mobile .hamburger::before { header .desktop .top .right > div.search { padding: 2px 10px; - + } header .desktop .bottom { @@ -145,7 +145,7 @@ header .mobile .hamburger::before { header .desktop .bottom > span { padding: 0 8px; } - + header .desktop .drop { display: flex; align-items: center; @@ -181,7 +181,7 @@ header .mobile .hamburger::before { } footer { - + margin-top: 120px; } @@ -189,7 +189,7 @@ a.button:any-link { text-decoration: none; border-radius: 18px; padding: 5px 1.2em 7px 1.2em; - outline: none; + /*outline: none; (keep outline for a11n */ text-align: center; line-height: 20px; font-size: 1rem; @@ -226,7 +226,7 @@ a.button > svg > use { /* make page : hero */ main.light-grey { - background-color: #f4f4f4; + background-color: #f4f4f4; } main { @@ -352,7 +352,7 @@ main .hero a:any-link { main .hero.hero-noimage p { font-size: 14px; - } + } main .hero { @@ -376,7 +376,7 @@ main .hero a:any-link { main>.hero h1 { font-size: 3.5em; } - + } @@ -395,7 +395,7 @@ main .section-wrapper:first-of-type { } main .section-wrapper > div { - margin: auto; + margin: auto; max-width: 672px; padding: 0 32px; } @@ -575,15 +575,15 @@ main .section-wrapper .hero { main .section-wrapper { padding-top: 40px; } - + main .section-wrapper:first-of-type { padding-top: 80px; } - + main .section-wrapper:first-of-type { padding-top: 0; } - + main .section-wrapper h2 { font-size: 36px; line-height: 39px; @@ -602,7 +602,7 @@ main .section-wrapper .hero { margin-top: 56px; text-align: center; } - + main .section-wrapper h1 + h5 { font-size: 24px; line-height: 29px; @@ -610,7 +610,7 @@ main .section-wrapper .hero { margin-top: 32px; margin-bottom: 16px; } - + main .section-wrapper p { font-size: 18px; line-height: 22px; From 6cc7208721c3e49636c361047204e2e7270c3207 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Fri, 26 Mar 2021 19:39:23 +0900 Subject: [PATCH 237/649] fix(a11y): use contrast value of 4.5 for eyebrow color --- express/blocks/blog-posts/blog-posts.css | 19 +++++++++---------- express/styles/styles.css | 3 +-- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index b299d5c..6598730 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -53,11 +53,11 @@ main .blog-posts .card { margin: 10px; text-align: left; } - + main .blog-posts .card .card-image { line-height: 0; } - + main .blog-posts .card .card-image img { height: 200px; object-fit: cover; @@ -74,7 +74,7 @@ main .blog-posts .card { main .blog-posts .hero-card .card-body p { margin: 12px 0; - + } main .blog-posts .hero-card .card-body h3 { @@ -89,24 +89,23 @@ main .blog-posts .card { margin-top: 0; text-align: left; } - - + + main .blog-posts .card .card-body p { font-size: 1rem; margin: 12px 0; } - + main .blog-posts .card-body p.eyebrow { text-transform: uppercase; margin: 0; margin-bottom: 12px; font-weight: 600; - color: #aaa; + color: #696969; font-size: 12px; line-height: 16px; letter-spacing: .1em; - font-weight: 600; - } + } main .blog-posts .card .card-body { padding: 16px; @@ -135,4 +134,4 @@ main .blog-posts .card { text-align: left; } -} \ No newline at end of file +} diff --git a/express/styles/styles.css b/express/styles/styles.css index 5c4328b..4dc9ce7 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -532,11 +532,10 @@ main .section-wrapper .hero { margin: 0; margin-bottom: 12px; font-weight: 600; - color: #aaa; + color: #696969; font-size: 16px; line-height: 20px; letter-spacing: .1em; - font-weight: 600; } .blog main .hero .blog-header .author { From de48220c410728d5c23cfed4baf25f04bf033939 Mon Sep 17 00:00:00 2001 From: Raphael Wegmueller Date: Fri, 26 Mar 2021 11:58:08 +0100 Subject: [PATCH 238/649] fix: no whitespace on emtpy sections --- express/styles/styles.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/styles/styles.css b/express/styles/styles.css index 72246c5..888d5b7 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -400,6 +400,10 @@ main .section-wrapper > div { padding: 0 32px; } +main .section-wrapper > div:empty { + padding: 0; +} + main .section-wrapper h1 { font-size: 45px; line-height: 49px; From b4ad99874607da0f8e25ca33fdb4d46a69d5ec42 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Fri, 26 Mar 2021 20:05:49 +0900 Subject: [PATCH 239/649] fix(a11y): use A for cards --- express/blocks/blog-posts/blog-posts.css | 4 ++++ express/blocks/blog-posts/blog-posts.js | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.css b/express/blocks/blog-posts/blog-posts.css index 6598730..8574673 100644 --- a/express/blocks/blog-posts/blog-posts.css +++ b/express/blocks/blog-posts/blog-posts.css @@ -19,6 +19,8 @@ main .blog-posts .hero-card { box-sizing: border-box; margin: 0; border: 0; + text-decoration: unset; + color: unset; } main .blog-posts .hero-card .card-image { @@ -52,6 +54,8 @@ main .blog-posts .card { width: 350px; margin: 10px; text-align: left; + text-decoration: unset; + color: unset; } main .blog-posts .card .card-image { diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index 6ede63b..c09c44d 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -125,7 +125,10 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { `; } - const $card = createTag('div', { class: `${isHero ? 'hero-card' : 'card'}` }); + const $card = createTag('a', { + class: `${isHero ? 'hero-card' : 'card'}`, + href: path, + }); $card.innerHTML = `
${pictureTag}
@@ -134,9 +137,6 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) {

${title}

${teaser}

`; - $card.addEventListener('click', () => { - window.location.href = `${path}`; - }); if (isHero) $blogPosts.prepend($card); else $cards.append($card); } From d816985e1070e8aac63324d0b6d63118b82a4c60 Mon Sep 17 00:00:00 2001 From: Dominique Pfister Date: Fri, 26 Mar 2021 14:35:38 +0100 Subject: [PATCH 240/649] Add short title to index (#60) * fix(index): add short-title to website and its locales * fix: s/titlu/title/ :roll-eyes: * fix: it's a meta name not property --- helix-query.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/helix-query.yaml b/helix-query.yaml index 6b76be2..592ce7b 100644 --- a/helix-query.yaml +++ b/helix-query.yaml @@ -73,6 +73,10 @@ indices: select: none value: | parseTimestamp(headers['last-modified'], 'ddd, DD MMM YYYY hh:mm:ss GMT') + shortTitle: + select: head > meta[name="short-title"] + value: | + attribute(el, 'content') germany: <<: *default From 76fec104d7952dd8398925ec430fb5fa8ca5d04f Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 06:48:19 -0700 Subject: [PATCH 241/649] feat: jank protection for page list --- express/blocks/page-list/page-list.css | 4 ++++ express/blocks/page-list/page-list.js | 2 ++ express/styles/styles.css | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 0e2e3a2..89184ce 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -1,3 +1,7 @@ +main .page-list-container.appear, main .page-list.appear { + opacity: 1; +} + main .page-list { text-align: left; box-sizing: border-box; diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 843805c..074e12f 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -121,6 +121,8 @@ async function decoratePageList($block) { const index = await fetchIndex(); index.sort((e1, e2) => e1.shortTitle.localeCompare(e2.shortTitle)); addPages(index, config, $block); + $section.classList.add('appear'); + $block.classList.add('appear'); } export default function decorate($block) { diff --git a/express/styles/styles.css b/express/styles/styles.css index 72246c5..f35b926 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -657,3 +657,11 @@ main .section-wrapper > div { max-width: 830px; } +/* jank protection for async sections */ + +main .page-list-container, main .page-list { + opacity: 0; + height: 100vh; + transition: opacity 100ms; +} + From 37cf2e250cd0d199717d7fa6a2b2c300f832b9dd Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 07:29:44 -0700 Subject: [PATCH 242/649] fix(pagelist): unset height on appear --- express/blocks/page-list/page-list.css | 1 + 1 file changed, 1 insertion(+) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index 89184ce..a41fdc6 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -1,5 +1,6 @@ main .page-list-container.appear, main .page-list.appear { opacity: 1; + height: unset; } main .page-list { From e5294a013470d00cc5db104118150673decda2b6 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 07:42:09 -0700 Subject: [PATCH 243/649] fix(pagelist): prod index --- express/blocks/page-list/page-list.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 074e12f..425211b 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -15,6 +15,7 @@ import { createTag, readBlockConfig, + getLocale, } from '../../scripts/scripts.js'; function addPages(index, config, $block) { @@ -48,12 +49,8 @@ function showHide($block, $ptl) { } async function fetchIndex() { - /* - const locale = getLocale(); - const indexURL = locale === 'en' ? '/express/query-index.json' : `/${locale}/query-index.json`; - */ - - const indexURL = '/express/dev-query-index.json'; + const locale = getLocale(window.location); + const indexURL = locale === 'us' ? '/express/query-index.json' : `/${locale}/query-index.json`; try { const resp = await fetch(indexURL); const json = await resp.json(); @@ -119,8 +116,9 @@ async function decoratePageList($block) { }); const index = await fetchIndex(); - index.sort((e1, e2) => e1.shortTitle.localeCompare(e2.shortTitle)); - addPages(index, config, $block); + const shortIndex = index.filter((e) => e.shortTitle); + shortIndex.sort((e1, e2) => e1.shortTitle.localeCompare(e2.shortTitle)); + addPages(shortIndex, config, $block); $section.classList.add('appear'); $block.classList.add('appear'); } From aabb6ab2604c56c0ad3fca45161f2ff40b0006c0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 07:44:27 -0700 Subject: [PATCH 244/649] fix(pagelist): remove extension from path --- express/blocks/page-list/page-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/blocks/page-list/page-list.js b/express/blocks/page-list/page-list.js index 425211b..2710aeb 100644 --- a/express/blocks/page-list/page-list.js +++ b/express/blocks/page-list/page-list.js @@ -24,7 +24,7 @@ function addPages(index, config, $block) { if (page.path.includes(config.filter)) { const { path, shortTitle } = page; const $p = createTag('li'); - $p.innerHTML = `${shortTitle}`; + $p.innerHTML = `${shortTitle}`; $ul.appendChild($p); } }); From 62f91bbab07e90bda8c80312eb9ff5c01abbdae1 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 07:51:23 -0700 Subject: [PATCH 245/649] chore: css fix --- express/blocks/page-list/page-list.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/express/blocks/page-list/page-list.css b/express/blocks/page-list/page-list.css index a41fdc6..6de9f5d 100644 --- a/express/blocks/page-list/page-list.css +++ b/express/blocks/page-list/page-list.css @@ -87,13 +87,13 @@ main .hero-short { main .page-list-left { flex: 0 0 auto; overflow: scroll; - height: 500px; + height: 100%; } main .page-list-right { flex: 1 1 auto; padding-left: 20px; overflow: scroll; - height: 500px; + height: 100%; } main .page-template-list > .template-list.masonry { From 6ed38e127f2e18c5eb673d9513e0ad9b7d04d8ba Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Fri, 26 Mar 2021 12:04:55 -0400 Subject: [PATCH 246/649] fix(pricing): rebuild grid as table --- express/blocks/pricing/pricing.css | 50 +++++++++++---------------- express/blocks/pricing/pricing.js | 54 ++++++++++++++++-------------- 2 files changed, 49 insertions(+), 55 deletions(-) diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index 4cfab1a..603504e 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -144,47 +144,44 @@ main .pricing .features { margin-top: 20px; - width: 1200px; + width: 1140px; + border-collapse: collapse; } - main .pricing .category-header { - display: flex; - justify-content: flex-start; - align-items: center; - padding: 10px 0; - margin-top: 20px; + main .pricing .category { + padding-top: 50px; } main .pricing .category-image { - width: 30px; + padding: 30px 0 10px 0; + margin-left: 5px; } main .pricing .category-text { - margin-left: 20px; + padding: 25px 0 10px 10px; font-size: 21px; color: rgb(53, 65, 76); font-weight: 600; + text-align: left; } main .pricing .feature { - display: flex; - padding: 15px 0; + background-color: white; } - main .pricing .feature:nth-child(even) { - background-color: white; + main .pricing .feature.odd { + background-color: rgba(242,244,245,1) } main .pricing .feature-special { - min-width: 40px; - text-align: right; - padding-top: 2px; - + width: 40px; + text-align: center; + height: 40px; + padding-bottom: 4px; } main .pricing .feature-special span { background-color: rgba(15,196,89,1); - height: 50px; border-radius: 3px; font-weight: bolder; font-size: 10px; @@ -193,25 +190,18 @@ } main .pricing .feature-text { - margin-left: 10px; - margin-right: 10px; + padding: 15px 10px; text-align: left; - width: 300px; + width: 220px; font-size: 14px; color: rgb(53, 65, 76); line-height: 1.2; } main .pricing .feature-column { - width: 250px; - margin-right: 15px; - display: flex; - justify-content: center; - align-items: center; - } - - main .pricing .feature-column:last-child { - margin-right: 0; + width: 200px; + padding-top: 5px; + padding-left: 10px; } } diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 8fe8c38..50f2504 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -235,9 +235,9 @@ function decoratePlans($block, plans, planOptions) { function decorateTable($block, features) { const categories = []; - const categoryContainers = []; - const $features = createTag('div', { class: 'features' }); - $block.append($features); + const $featuresTable = createTag('table', { class: 'features' }); + let odd = false; + $block.append($featuresTable); features.forEach((feature) => { const { Category, Description, Special } = feature; const columnOneCheck = feature['Column 1']; @@ -246,32 +246,36 @@ function decorateTable($block, features) { if (!categories.includes(Category)) { const imageName = toClassName(Category); const categoryImage = `icons/${imageName}.svg`; - const $category = createTag('div', { class: 'category' }); - $features.append($category); - const $categoryHeader = createTag('div', { class: 'category-header' }); - $category.append($categoryHeader); + const $categoryRow = createTag('tr', { class: 'category' }); + $featuresTable.append($categoryRow); + const $featureLogoColumn = createTag('td'); + $categoryRow.append($featureLogoColumn); const $categoryImage = createTag('img', { src: categoryImage, class: 'category-image' }); - $categoryHeader.append($categoryImage); - const $categoryText = createTag('span', { class: 'category-text' }); - $categoryText.innerHTML = Category; - $categoryHeader.append($categoryText); + $featureLogoColumn.append($categoryImage); + const $categoryHeaderColumn = createTag('td', { class: 'category-text' }); + $categoryHeaderColumn.innerHTML = Category; + $categoryRow.append($categoryHeaderColumn); categories.push(Category); - categoryContainers[Category] = $category; + odd = false; } - const $feature = createTag('div', { class: 'feature' }); - categoryContainers[Category].append($feature); - const $featureSpecial = createTag('div', { class: 'feature-special' }); - $feature.append($featureSpecial); + const $featureRow = createTag('tr', { class: 'feature' }); + if (odd) { + $featureRow.classList.add('odd'); + } + odd = !odd; + $featuresTable.append($featureRow); + const $featureSpecialColumn = createTag('td', { class: 'feature-special' }); + $featureRow.append($featureSpecialColumn); if (Special) { const $specialText = createTag('span'); $specialText.innerHTML = Special; - $featureSpecial.append($specialText); + $featureSpecialColumn.append($specialText); } - const $featureText = createTag('div', { class: 'feature-text' }); + const $featureText = createTag('td', { class: 'feature-text' }); $featureText.innerHTML = Description; - $feature.append($featureText); - const $featureColumnOne = createTag('div', { class: 'feature-column' }); - $feature.append($featureColumnOne); + $featureRow.append($featureText); + const $featureColumnOne = createTag('td', { class: 'feature-column' }); + $featureRow.append($featureColumnOne); const $columnOneImage = createTag('img'); if (columnOneCheck === 'Y') { $columnOneImage.src = 'icons/checkmark.svg'; @@ -279,7 +283,7 @@ function decorateTable($block, features) { $columnOneImage.src = 'icons/crossmark.svg'; } $featureColumnOne.append($columnOneImage); - const $featureColumnTwo = createTag('div', { class: 'feature-column' }); + const $featureColumnTwo = createTag('td', { class: 'feature-column' }); const $columnTwoImage = createTag('img'); if (columnTwoCheck === 'Y') { $columnTwoImage.src = 'icons/checkmark.svg'; @@ -287,8 +291,8 @@ function decorateTable($block, features) { $columnTwoImage.src = 'icons/crossmark.svg'; } $featureColumnTwo.append($columnTwoImage); - $feature.append($featureColumnTwo); - const $featureColumnThree = createTag('div', { class: 'feature-column' }); + $featureRow.append($featureColumnTwo); + const $featureColumnThree = createTag('td', { class: 'feature-column' }); const $columnThreeImage = createTag('img'); if (columnThreeCheck === 'Y') { $columnThreeImage.src = 'icons/checkmark.svg'; @@ -296,7 +300,7 @@ function decorateTable($block, features) { $columnThreeImage.src = 'icons/crossmark.svg'; } $featureColumnThree.append($columnThreeImage); - $feature.append($featureColumnThree); + $featureRow.append($featureColumnThree); }); } From 89296d648eacd27c71bc408d000a9e1e512ceacd Mon Sep 17 00:00:00 2001 From: William Ste-Marie Date: Fri, 26 Mar 2021 12:36:04 -0400 Subject: [PATCH 247/649] fix(pricing): accessibility --- express/blocks/pricing/pricing.css | 1 + express/blocks/pricing/pricing.js | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/express/blocks/pricing/pricing.css b/express/blocks/pricing/pricing.css index 603504e..89f40a9 100644 --- a/express/blocks/pricing/pricing.css +++ b/express/blocks/pricing/pricing.css @@ -26,6 +26,7 @@ main .pricing .pricing-header span { color: rgb(16, 196, 89); transition: 1.5s opacity ease; + cursor: pointer; } main .pricing .pricing-plans { diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 50f2504..ed139f5 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -58,20 +58,26 @@ function animateHeader($header, words) { let i = 0; const max = words.length; const firstWord = words[0]; - const headerWordTemplate = `${firstWord}`; + const headerWordTemplate = ``; $header.innerHTML = $header.innerHTML.replace('[x]', headerWordTemplate); + $header.setAttribute('aria-label', $header.innerText); const $headerWord = $header.children[0]; - setInterval(() => { + const interval = setInterval(() => { $headerWord.style.opacity = '0'; setTimeout(() => { i += 1; if (i >= max) { i = 0; } + $headerWord.innerHTML = words[i]; $headerWord.style.opacity = '1'; }, 1500); }, 4000); + $headerWord.addEventListener('click', () => { + clearInterval(interval); + $headerWord.style.cursor = 'inherit'; + }); } function decorateHeader($block, header) { @@ -155,7 +161,7 @@ function selectPlanOption($plan, option) { } else { $pricing.innerHTML = `US $${price}/${priceUnit}`; if (price !== fullPrice) { - $pricing.innerHTML += `US $${fullPrice}/${fullPriceUnit}`; + $pricing.innerHTML += `US $${fullPrice}/${fullPriceUnit}`; } } if (text) { @@ -205,7 +211,7 @@ function decoratePlans($block, plans, planOptions) { const $description = createTag('p'); $description.innerHTML = description; $headerContainer.append($description); - const $icon = createTag('img', { src: imagePath, class: 'plan-icon' }); + const $icon = createTag('img', { src: imagePath, class: 'plan-icon', alt: '' }); $header.append($icon); const $pricing = createTag('div', { class: 'plan-pricing' }); $plan.append($pricing); @@ -215,6 +221,7 @@ function decoratePlans($block, plans, planOptions) { $plan.append($footer); if (options.length > 1) { const $dropdown = createTag('select', { class: 'plan-dropdown' }); + $dropdown.setAttribute('arial-label', 'Select your plan'); let i = 0; options.forEach((option) => { const name = option['Option Name']; @@ -279,8 +286,10 @@ function decorateTable($block, features) { const $columnOneImage = createTag('img'); if (columnOneCheck === 'Y') { $columnOneImage.src = 'icons/checkmark.svg'; + $columnOneImage.alt = 'Yes'; } else { $columnOneImage.src = 'icons/crossmark.svg'; + $columnOneImage.alt = ''; } $featureColumnOne.append($columnOneImage); const $featureColumnTwo = createTag('td', { class: 'feature-column' }); From 2c8226faf3fe19dc244cd886579575167f7909d9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 10:49:52 -0700 Subject: [PATCH 248/649] feat: refactor decorateBlocks --- express/scripts/scripts.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 47abd29..479120d 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -360,7 +360,7 @@ function resolveFragments() { } function decorateBlocks() { - document.querySelectorAll('main div.section-wrapper > div > div').forEach(async ($block) => { + document.querySelectorAll('main div.section-wrapper > div > div').forEach(($block) => { const classes = Array.from($block.classList.values()); let blockName = classes[0]; const $section = $block.closest('.section-wrapper'); @@ -377,6 +377,13 @@ function decorateBlocks() { } }); $block.classList.add('block'); + $block.setAttribute('data-block-name', blockName); + }); +} + +function loadBlocks() { + document.querySelectorAll('main div.section-wrapper > div > .block').forEach(async ($block) => { + const blockName = $block.getAttribute('data-block-name'); import(`/express/blocks/${blockName}/${blockName}.js`) .then((mod) => { if (mod.default) { @@ -455,7 +462,7 @@ export function readBlockConfig($block) { function postLCP() { const martechUrl = '/express/scripts/martech.js'; loadCSS('/express/styles/lazy-styles.css'); - decorateBlocks(); + loadBlocks(); resolveFragments(); // loadLazyFooter(); if (!(window.location.search === '?nomartech' || window.location.hostname === 'localhost' || document.querySelector(`head script[src="${martechUrl}"]`))) { @@ -776,6 +783,7 @@ async function decoratePage() { decorateHero(); decorateButtons(); fixIcons(); + decorateBlocks(); decorateDoMoreEmbed(); setLCPTrigger(); document.body.classList.add('appear'); From 139599636ef5fc668493a4727d68cbf67ab16854 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 11:40:25 -0700 Subject: [PATCH 249/649] feat: rUrl support --- express/blocks/pricing/pricing.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index ed139f5..24ff8dc 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -137,6 +137,10 @@ function buildUrl(optionUrl, optionPlan) { if (currentUrl.searchParams.has('code')) { planUrl.searchParams.set('code', currentUrl.searchParams.get('code')); } + if (currentUrl.searchParams.get('rUrl')) { + rUrl = currentUrl.searchParams.get('rUrl'); + } + planUrl.searchParams.set('rUrl', rUrl); return planUrl.href; } From 0e7829ef7237a0df671e80fb3f7ea15cebece11d Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 11:52:41 -0700 Subject: [PATCH 250/649] chore: remove crumb from header --- express/scripts/scripts.js | 3 --- express/styles/styles.css | 1 - 2 files changed, 4 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 479120d..306def8 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -276,9 +276,6 @@ function decorateHeaderAndFooter() {
Sign In
-
- Home / Adobe Creative Cloud -
`; diff --git a/express/styles/styles.css b/express/styles/styles.css index 59e7830..fad103e 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -54,7 +54,6 @@ header .mobile .hamburger::before { @media (min-width: 1200px) { header { - height: 98px; background-size: 1201px auto; } From a58161147664376863a1959c899b63f1145ea526 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 13:15:03 -0700 Subject: [PATCH 251/649] chore: re-enable martech on localhost --- express/scripts/scripts.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index 306def8..d0b01c0 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -462,7 +462,7 @@ function postLCP() { loadBlocks(); resolveFragments(); // loadLazyFooter(); - if (!(window.location.search === '?nomartech' || window.location.hostname === 'localhost' || document.querySelector(`head script[src="${martechUrl}"]`))) { + if (!(window.location.search === '?nomartech' || document.querySelector(`head script[src="${martechUrl}"]`))) { let ms = 2000; const usp = new URLSearchParams(window.location.search); const delay = usp.get('delay'); From 13087e23aa08308cd2ed2274e63752cc8b408855 Mon Sep 17 00:00:00 2001 From: Benjamin Bytheway Date: Fri, 26 Mar 2021 14:39:52 -0600 Subject: [PATCH 252/649] Analytics changes for pricing block. --- express/blocks/pricing/pricing.js | 162 +++++++++++++++++++++++++++++- express/scripts/martech.js | 50 ++++----- 2 files changed, 188 insertions(+), 24 deletions(-) diff --git a/express/blocks/pricing/pricing.js b/express/blocks/pricing/pricing.js index 8fe8c38..002941b 100644 --- a/express/blocks/pricing/pricing.js +++ b/express/blocks/pricing/pricing.js @@ -9,7 +9,7 @@ * OF ANY KIND, either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ -/* global window, fetch */ +/* global window, fetch, digitalData, _satellite */ import { createTag, @@ -229,6 +229,166 @@ function decoratePlans($block, plans, planOptions) { const $cta = createTag('a', { class: 'button primary' }); $footer.append($cta); + $cta.addEventListener('click', () => { + let adobeEventName; + let sparkEventName; + const option = {}; + // get the position of the card in the plans + const cardPosition = Array.prototype.slice.call($plans.children).indexOf($plan) + 1; + // determine whether individual | starter | etc. + // Buy Now + if ($cta.hostname.includes('commerce.adobe.com')) { + // individual + if ($cta.search.includes('spark.adobe.com')) { + adobeEventName += `pricing:individual:${cardPosition}:buyNow:Click`; + // team + } else if ($cta.search.includes('adminconsole.adobe.com')) { + adobeEventName += `pricing:team:${cardPosition}:buyNow:Click`; + } + sparkEventName = 'beginPurchaseFlow'; + // anything else + } else { + adobeEventName += `pricing:starter:${cardPosition}:getStarted:Click`; + sparkEventName = 'pricing:ctaPressed'; + } + + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryEvent.eventInfo.eventName', adobeEventName); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.eventName', sparkEventName); + // TODO: option.priceWithoutTax - price withou tax if you have it, otherwise ignore this + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.amountWithoutTax', option.priceWithoutTax); + // TODO: option.billingFrequency - Set to Monthly or whatever is in the drop-down + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.billingFrequency', option.billingFrequency); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.cardPosition', cardPosition); + // TODO: option.commitmentType - Month, year, or whatever + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.commitmentType', option.commitmentType); + // TODO: option.currencyCode - USD or whatever currency type is being used + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.currencyCode', option.currencyCode); + // TODO: option.offerId - 08A2CD1688E89927614A5F402329DB5B or whatever the offer is + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.offerId', option.offerId); + // TODO: option.price - the price with tax or whatever price + // value you have if non-distinguishable + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.price', option.price); + // TODO: option.productName - If there is a user friendly product name, put it here + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.productName', option.productName); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('primaryProduct.productInfo.quantity', 1); + // primaryProduct: { + // productInfo: { + // amountWithoutTax:'79.99', + // billingFrequency:'MONTHLY', + // cardPosition:'1', + // commitmentType:'YEAR', + // currencyCode:'USD', + // label:'ccle_direct_indirect_team',// + // offerId:'08A2CD1688E89927614A5F402329DB5B', + // price:'59.99', + // productCode:'ccle_direct_indirect_team', + // productName: '', //product Name -> 'Creative Cloud All Apps' + // or as per the details available of the product + // sku:'65296994', + // quantity:''//Number of licenses + // } + // } + // TODO: option.priceWithoutTax - price withou tax if you have it, otherwise ignore this + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData3', `amountWithoutTax:${option.priceWithoutTax}`); + // TODO: option.billingFrequency - Set to Monthly or whatever is in the drop-down + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData4', `billingFrequency:${option.billingFrequency}`); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData5', `cardPosition:${cardPosition}`); + // TODO: option.commitmentType - Month, year, or whatever + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData6', `commitmentType:${option.commitmentType}`); + // TODO: option.currencyCode - USD or whatever currency type is being used + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData7', `currencyCode:${option.currencyCode}`); + // TODO: option.offerId - 08A2CD1688E89927614A5F402329DB5B or whatever the offer is + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData9', `offerId:${option.offerId}`); + // TODO: option.price - the price with tax or whatever price + // value you have if non-distinguishable + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData10', `price:${option.price}`); + // TODO: option.productName - If there is a user friendly product name, put it here + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData12', `productName:${option.productName}`); + // eslint-disable-next-line no-underscore-dangle + digitalData._set('spark.eventData.contextualData14', 'quantity:1'); + // spark.eventData.contextualData3: 'amountWithoutTax:79.99' or + // whatever is set in primaryProduct.productInfo.amountWithoutTax + // spark.eventData.contextualData4: 'billingFrequency:MONTHLY' + // spark.eventData.contextualData5: 'cardPosition:1' + // spark.eventData.contextualData6: 'commitmentType:YEAR' + // spark.eventData.contextualData7: 'currencyCode:USD' + // spark.eventData.contextualData8: 'label:ccle_direct_indirect_team' + // spark.eventData.contextualData9: 'offerId:08A2CD1688E89927614A5F402329DB5B' + // spark.eventData.contextualData10: 'price:59.99' + // spark.eventData.contextualData11: 'productCode:ccle_direct_indirect_team' + // spark.eventData.contextualData12: 'productName: '', //product Name -> + // 'Creative Cloud All Apps' or as per the details available of the product + // spark.eventData.contextualData13: 'sku:65296994' + // spark.eventData.contextualData14: 'quantity:''//Number of licenses" + + // eslint-disable-next-line no-underscore-dangle + _satellite.track('event', { digitalData: digitalData._snapshot() }); + + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryEvent.eventInfo.eventName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.eventName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryEvent.eventInfo.eventName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.eventName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.amountWithoutTax'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.billingFrequency'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.cardPosition'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.commitmentType'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.currencyCode'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.offerId'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.price'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.productName'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('primaryProduct.productInfo.quantity'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData3'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData4'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData5'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData6'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData7'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData9'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData10'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData12'); + // eslint-disable-next-line no-underscore-dangle + digitalData._delete('spark.eventData.contextualData14'); + }); + selectPlanOption($plan, options[0]); }); } diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 30b794f..5bcb822 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -280,7 +280,7 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { let $cardContainer; let $img; let alt; - let cardPosition; + // let cardPosition; // Template button click if ($templateContainer) { @@ -306,29 +306,33 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { // Click in the pricing block } else if ($a.closest('.pricing')) { - // get the position of the card in the plans - cardPosition = Array.prototype.slice.call(document.querySelectorAll('.plan')).indexOf($a.closest('.plan')) + 1; - - // Buy Now - if ($a.hostname.includes('commerce.adobe.com')) { - // individual - if ($a.search.includes('spark.adobe.com')) { - adobeEventName += `pricing:individual:${cardPosition}:buyNow:Click`; - // team - } else if ($a.search.includes('adminconsole.adobe.com')) { - adobeEventName += `pricing:team:${cardPosition}:buyNow:Click`; - } - - sparkEventName = 'beginPurchaseFlow'; - - // anything else - } else { - adobeEventName += `pricing:starter:${cardPosition}:getStarted:Click`; - sparkEventName = 'pricing:ctaPressed'; - } + // allow the pricing block to handle this analytics + return; - // eslint-disable-next-line no-underscore-dangle - digitalData._set('spark.eventData.contextualData5', `cardPosition:${cardPosition}`); + // // get the position of the card in the plans + // cardPosition = Array.prototype.slice.call(document.querySelectorAll('.plan')) + // .indexOf($a.closest('.plan')) + 1; + + // // Buy Now + // if ($a.hostname.includes('commerce.adobe.com')) { + // // individual + // if ($a.search.includes('spark.adobe.com')) { + // adobeEventName += `pricing:individual:${cardPosition}:buyNow:Click`; + // // team + // } else if ($a.search.includes('adminconsole.adobe.com')) { + // adobeEventName += `pricing:team:${cardPosition}:buyNow:Click`; + // } + + // sparkEventName = 'beginPurchaseFlow'; + + // // anything else + // } else { + // adobeEventName += `pricing:starter:${cardPosition}:getStarted:Click`; + // sparkEventName = 'pricing:ctaPressed'; + // } + + // // eslint-disable-next-line no-underscore-dangle + // digitalData._set('spark.eventData.contextualData5', `cardPosition:${cardPosition}`); // Click in the pricing block } else if (sparkLandingPageType === 'pricing') { From d2cc8ea902f1c74290da5ae6a95c60515d19295c Mon Sep 17 00:00:00 2001 From: Benjamin Bytheway Date: Fri, 26 Mar 2021 14:46:50 -0600 Subject: [PATCH 253/649] chore: small changes to globals --- express/scripts/martech.js | 53 +++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 9113ec2..fe0385b 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -139,20 +139,20 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { // set some global and persistent data layer properties //------------------------------------------------------------------------------------ - window.fedsConfig = { - ...window.fedsConfig, + w.fedsConfig = { + ...w.fedsConfig, locale: language, content: { experience: 'cc-express/spark-gnav', }, profile: { customSignIn: () => { - window.location.href = 'https://spark.adobe.com/sp'; + w.location.href = 'https://spark.adobe.com/sp'; }, }, }; - window.adobeid = { + w.adobeid = { client_id: 'spark-helix', scope: 'AdobeID,openid', locale: language, @@ -411,28 +411,29 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { }); } - function pollForPricingBlock() { - const pollingTimer = setTimeout(() => { - const $plansBlock = d.querySelector('.pricing-plans'); - - if ($plansBlock) { - decorateAnalyticsEvents(); - } else { - pollForPricingBlock(); - } - }, 300); - - // make sure we don't poll forever - setTimeout(() => { - clearTimeout(pollingTimer); - }, 4000); - } - - if (sparkLandingPageType === 'pricing') { - pollForPricingBlock(); - } else { - decorateAnalyticsEvents(); - } + // function pollForPricingBlock() { + // const pollingTimer = setTimeout(() => { + // const $plansBlock = d.querySelector('.pricing-plans'); + + // if ($plansBlock) { + // decorateAnalyticsEvents(); + // } else { + // pollForPricingBlock(); + // } + // }, 300); + + // // make sure we don't poll forever + // setTimeout(() => { + // clearTimeout(pollingTimer); + // }, 4000); + // } + + // if (sparkLandingPageType === 'pricing') { + // pollForPricingBlock(); + // } else { + // decorateAnalyticsEvents(); + // } + decorateAnalyticsEvents(); }); loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); From f336872794da0ac413aa1975e763e9557411c1ec Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 14:23:55 -0700 Subject: [PATCH 254/649] chore: extend icon support --- express/scripts/scripts.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/express/scripts/scripts.js b/express/scripts/scripts.js index d0b01c0..9084c36 100644 --- a/express/scripts/scripts.js +++ b/express/scripts/scripts.js @@ -41,10 +41,18 @@ function getMeta(name) { return value; } -export function getIcon(icon) { - return ` - - `; +export function getIcon(icon, alt = icon) { + const symbols = ['adobe', 'adobe-red', 'facebook', 'instagram', 'pinterest', + 'linkedin', 'twitter', 'youtube', 'discord', 'behance', 'creative-cloud', + 'hamburger', 'adchoices', 'play', 'not-found', 'snapchat', 'learn', 'magicwand', + 'upload', 'resize', 'download', 'creativecloud']; + if (symbols.includes(icon)) { + return ` + + `; + } else { + return (`${alt}`); + } } export function getIconElement(icon) { From c252a34a83ad6fceb8473494e5dfb799a13df8c9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 14:36:19 -0700 Subject: [PATCH 255/649] chore: fix lang default --- express/scripts/martech.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index fe0385b..7ef6baf 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -72,7 +72,7 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { if (locale !== 'us') pathSegments.shift(); const pageName = `adobe.com:${pathSegments.join(':')}`; const langs = { - en: 'en-US', + us: 'en-US', fr: 'fr-FR', de: 'de-DE', it: 'it-IT', @@ -89,7 +89,8 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { cn: 'zh-Hans-CN', }; - const language = langs[locale]; + let language = langs[locale]; + if (!language) language = 'us'; const langSplits = language.split('-'); langSplits.pop(); From 7fc4fb84e1386aba95b8340acce52412bb0290b4 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 14:38:14 -0700 Subject: [PATCH 256/649] chore: fix lang default --- express/scripts/martech.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 7ef6baf..e276ccc 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -90,7 +90,7 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { }; let language = langs[locale]; - if (!language) language = 'us'; + if (!language) language = 'en-US'; const langSplits = language.split('-'); langSplits.pop(); From 1d4e61f70699f7ea8cf9bb1bf18ab9600fba8c27 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 14:47:45 -0700 Subject: [PATCH 257/649] chore: enable gnav --- express/scripts/martech.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index e276ccc..0cb18f4 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -438,3 +438,9 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { }); loadScript('https://www.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); + +loadScript('https://www.adobe.com/etc.clientlibs/globalnav/clientlibs/base/feds.js').id = 'feds-script'; + +loadScript('https://static.adobelogin.com/imslib/imslib.min.js'); + +loadScript('https://www.adobe.com/marketingtech/main.min.js'); From 8d3771b4bca9b31ed195abf93658c62b569ecbe0 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 15:03:41 -0700 Subject: [PATCH 258/649] feat(nav): add spark logo --- express/styles/styles.css | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index fad103e..11ccb65 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -17,6 +17,11 @@ header { height: 64px; box-sizing: border-box; border-bottom: 1px solid #EAEAEA; + height: 98px; + background-image: url(/express/icons/spark.svg); + background-repeat: no-repeat; + background-size: 22px 22px; + background-position: bottom 5px center; } header .desktop { @@ -53,10 +58,6 @@ header .mobile .hamburger::before { @media (min-width: 1200px) { - header { - background-size: 1201px auto; - } - header .mobile { display: none; } From 5e9d43e14b0fe3925c279cd5448ad75bef7572ce Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 15:17:17 -0700 Subject: [PATCH 259/649] chore: new spark icon --- express/icons/adobe-spark.png | Bin 0 -> 5713 bytes express/styles/styles.css | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 express/icons/adobe-spark.png diff --git a/express/icons/adobe-spark.png b/express/icons/adobe-spark.png new file mode 100644 index 0000000000000000000000000000000000000000..98fdb6d24ddee82372e5e512aeba5aa636622e0c GIT binary patch literal 5713 zcmV-X7Ov@uP)Px#IAvH#W=%~1DgXcg2mk?xX#fNO00031000^Q000000-yo_1ONa40RR92E1&}a z1ONa40RR91I{*Lx0K%q3p#T6C$4Nv%RCodHonMS3$6d$k4jTe-xQUQRERc3AO!CIf zMInGt*s%ms96&cG#fZ0^^SgcHw}c?w98w&am)kSX$#eR|{pwf0`c~DitEy}IF1P~v zxO1Pl=-j6-IQOfFJjvB85M2uP51spW40(g=>)8C--#Pa;OJP_vA|enGSO@})>q+{A zb02~Ehj6b>rmS4-ul~=u-ak0^uPbMHG&mv<5y&Ah;jC~}zlp?GVE$xIay1$6;IO(l ztXEdk{AhJVAR^!qIC54j``Rq~{u&0s*&>#R*Z$tQ;n}KHtW8AVd?AoHt6y;Lr+?hJ zf1&ChI*ZlESsnb3bFF*M?VrW^#X3a<&I1C;Eb4vE{Q;Fdla5M_h(~VxsBcfz?3ZBD0Qbt6}Q=R#MmBonK4T z5D|z7oCX3HSqJ{sX%u`KW#X)U{WQvrWkv)d0`nuFJ*%IcU(IT0V541!TO&mTA_6Oj zz(oe|hgZ<kwsbbByR69)|4T=&8FBJ9B_(sd%5ha0R>k?5!R0tH$SY zR*%ySKf{jKCm(h0@sc^(KmWkFKl^XzzD5`+A`lUX2-HPjW@q&bzhAk|d$kW#d~SY> zk|cUooz*Wnw@LLbTMdvtQTkR|9a{4t~PzSVOYLLTaQT_@m$^>^P5yd zCbDKkU?yjEo!Qj0@c_UCWQdWKK!AqR?@DjbwpH4%iCmM4b;zS% zhP1gNEeL^<#aq6VD=bE%qsrql#ZfuZ8tmzG^0^{snGr}G)eh~~UuHYci*2=MR$BU5 zq>c1%vZH%1vnO>0?H|S+mhER*`c{co#SziryVPm8O7%MLwlX^!(r);yNXvjgEoY?- zbvdArzWROVUVg{9w}XT&7VaYD`xGsIhMiWGS<_WLsmF02C-kC@3V!<)s_0fjK= zjnE#-bz&- z1cqG`taMP_q**)YZ77j2A#8VQZua9CFK!6Tcepu75^MZH->Y7y&!)I^bKGM@IG}@X z`?M-yx<@FxTe8!Wzen$0s`r*ps}pMQ708bY_!I2Z!S78l(?|=Pd6~XW|7e4QE?9X| zU6AwmZ&tx5bs8IFYg7NG$HQy)akVMs4mhxT$ESs1s%t0YlkW-DPxWBvsy}v-X{K_! zgv0c{R-pckeOqBB>hTbMOJ#cdLm4yv76@DPYdq>-;s3+=6yZtI^L#k|=@Tw9TR$}z z@z5bT2KI=V!ze53?*YH#@2i9wm|WjdL((xQaxtXNL37?iTNk~mhe;}vtIxo>N1lb1 zpBARUI-q`)bW?Z(N3=s8IlyVQG-b2&Dvw#Q*_gT6Rvk6iBOJd)o+0hoE2%@GS~6S% z>iwV$fBKx9OP8z3RY+;Mo3r4f{wq7wAJEgMkY-^)6%(XS{W}z=tcP4}KfABxthD!( zecP8+u4UZknPI*10S=2&6D{#(rR@Hc$}5`DN&j;=ta-|s)kfvRPj-y_cgM^?1Tb)E z?`neJZA>txMCeQdVAQ}||m2s=P9))PeQK-$BRSmS{SMrJ2^}W^^Q4Qa=CP_pYbEoxW|v`jF%#i;h!-vWt#W zbl1>1@;uT9{@#c1T3UYjcu|--s*R%bS@}4GE_rXvk{{a}D%>4dC0p}Czl2YUF~5(o~~vUw9mrZrl7ndwlE^HHO;9X30J%kKGdZjinBko7xENG zzLVNvCD-E7n8^dk(#Nd-I_)sXDy;3S?y;l!BF>}=X+KI%>p7g)V^uOtk1_nxPafzZpw!+W0IJ@OU~2J&kl-6g!0Ubz`us8exu4)or( z(o&w+xlMfEk|TeEGPkTWi-+ueu5GScq~GN-^(wD))0CUK&yofcY3o^@?$N1b!Y%z^ zoA4Ufb||Abc{?*W*qj|1-D-QkG`l^6?u@GBb|2e!RTpA+2n*YjavKcVX>FJ&M2E1E z&g6o*pCs6Sat|-R^s>bl!&O^TAG&3Z?u3p?616tiy~?lhn&PdunK`lS(@d(2euqbq zjwL)#9{$Zta+F#YT4%j&YMRbBrSQfndY+CMlz8W0IqfWBsd1-i+uov)>C@m*v zaFa&N5&Vbn`)syuW)m6AqRWRt@n4#uPiiBSkY28KcFHXo^bRO*Ba|oJ*3&(dH{={o z$X@v62lRH3mF`PM9_u_>&yd@v>mBW9r0GNK8o}QR<*}m=uN(4<;yfES8BBU;ST_1> zP0H$lU5|EFeQwP%$mzD-5Fg9Q-S19{h!5OQfGhn{_MTdae4RzA!gOEqu>Hy86sXPv)tIlKS(M+OEC)~8s zD)Ks(9G$FVIUYJqmoj&)JlNQ?_*Hls6sn6QtGYj$c@Th;@W?p~Z0=i*K~LlYo2@}_ znUL_t3_#h)rCDqh5>^iwgg2`Qm&vGZILtP3`<5&Nw;S^58*0aag^Oh6+_15z-CCi( zqBuHs!T$>7HMx4Uryihv!+Dx2(l*WEB)#f$W+s?3J1Z&FEJ=qwpJ7i)OT#xxW;SwI z`dY(0R8+=EIx9W(7(lts4{sROjYb`WJjIbUI}HuiwdCR7vK)#fYw`3{g})Z2q4$1C zC)*73r14z+3*=0;>O$GuRwA9UaFq+u8TPEw% zDQ97CA;&mOIc2Xq8&b}CHg4VPfylLv1Kp4lO&w`byEQExAy54UhmxCxhjK-6*@W%4 z!*uBd>!WrL(-miNHb2Q}X=$iS%Q0@zDZ;b&q2dcp4DYF;qR)?Rm z6b!{RsLal!Wl2uB1_KAsw!|rKVDUYVjyc5s9Feb;W7cO3$+8h<1IvczQBK?6XG3g4 ztR7)-?Vmf150^Mv_IAOrPl;<~r3xFK$venhDU&TrXGjehGFygR)8IKd1MIv3I34Ub z!qJiqc&5HUM$rRfP;c^zHsO<#=vX@|J&7~4 zXv|*LNfF?7!?LK-B?i!rbs>MrkWcmrvix-RlVv6MwCD@HGP$z!X*P%WGjkd+pzoox zOZkm5-KUV=wCuv>&a`@ZI~VS(yy9f0g}bz9o+VrOn?bL?=)kH^UsR|L0^ru{r%4%Y z>#`aMIZ@{@IR3xb(3+!^11m3swqfz-<)L?fULD7kUo%ZDgTV6%?A$IX=SE5TT**AQ zkJ<%CHO8imxfGsKW*%Cv(m6}}QY~kt{c&AYNryWZN&2y~bxc9~SZ~sEPJ%F@yTEdi zH(v|XH%-;vw8XQXM)#SKrX04>q5 z9LdiRvPMSoE+gR^88 z!0RkPN1}o%`8QvKX*!WxpO#)FjRAFlo*dDnJk+MYaxN;LmG?NOum&S7+sd(LF+ERp z!BKqB$4@hq!vMfGdsKVibSbn2TN@#-PJGJNK-T&83UulyLtp!*+4NcV`?C3Gy$6e3 zFghUrRYOM?r@K$P_KmcJRcmIY96B-XPpIF)dFZD#pTy-Q-^WnzkO7= zLE4b7N^(*v<4XnlG3u5)?W#AH9V<<|S~IIqiT)D^U3Ez3vdT#3vA#nuE&FVYelu8fs=cg?S<;I- z4rbh{qEC%s$W0uAMAv=fE{AfIeY3@W2_xblOsf)S@;Soi=ZLae8u&$yl4nmZmk9=T zjx2svo|Z1iu7&dGeaO>w==s=3mGd)8@VMRL}8TE6bJq!1muBJeJMYg^uTJ;-L zRUFlGZ=d-8N!SUiN@vkQwtmRB;(BV(`Erg3C(=cJQ+d$0iOiPn18Op1-QkSaHNRI8 zq)&~ilQ8|ii_q0jkdE^z9ptI7gJ`f=^2*OZ9w@9!t;40SPU!av@+LU=G?jyWH+!jJ-Z1Y->P)*@*nIVb>~0XYNS9N&YoMM{*F;;!ooVBidS@ zU+G(Nl&3y7R2nh|mJIwg=@}QKTX{~3r+x;mFHqj?uuSZ3aB0K+N@)9uIVHX9=DL-h*@i zjeHt>fsXV)uA@zKw)!v2yx+-TE2LvI(O4^qc^+2=jYkR|FSc&d#y3_F^7 z5W#;cn^wzNX=7ZoBYoMk>Q_VcTRwfMVG+OElaqP{ z?nwtVr@b-sMuef9lJ=}b(j$Fxl&AdP(02|kdhahLny1#^lbF1dGok^^r5L)Te^WU$ z#b^0)ok6-asi9tsPS6Z<;OqNzkaj@_3B@Pk*!U1e*IEuu2-c76tNxlLSXosbc=WJ& zE<7yV$H5a$T;Y$b=PD}I*#o0NsA!%x4RxJloW|DvRhKeHw5|0Z>M~w5#*%SS%UNYB zqM6bnW=mO}{$Bq9#c}EOWz-3o>2xeG;SK8Oku1JYP%S=gm_U^lI?k!lAU( zu|i!wj?AEfE-#+wOl|DR9-lBRREHHFvIn{SX|hT~PBWZs@@$sLX46&A6q{}7$fgzD zBd0GBTnF>!G@Od^hkS24I;9n(yPb$Mv4eT z1R?^}yaayE`}cfhd)j%h_ILjbIt<1p4|0r87v!mFIlit{B-%6@j0>kw^^2%KjG zI79B-N1S_|Q@Fpv?a!S>FmP0_|0h2yIB2Px z>U5vif4{xw94p>P5rK%nsv?lgtYrLuaNdgROF!e>hgci3GF*MaQT;I$yvFj6|1&yL zL?9xt$_ONTR$&GB4b#U-coF_@glQ`hA2FNyeKs!tc17%sW<~@e0woBT&dTTcm~&4) z%I7JVp*-e!%N%0oyHw~;m`OcYW;>&85rK$6eFXj=fT&?UoLZo900000NkvXXu0mjf D9JwD) literal 0 HcmV?d00001 diff --git a/express/styles/styles.css b/express/styles/styles.css index 11ccb65..8166268 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -18,9 +18,9 @@ header { box-sizing: border-box; border-bottom: 1px solid #EAEAEA; height: 98px; - background-image: url(/express/icons/spark.svg); + background-image: url(/express/icons/adobe-spark.png); background-repeat: no-repeat; - background-size: 22px 22px; + background-size: 22px; background-position: bottom 5px center; } From 162abd9cf314d359351cbb1e3b9010b2eac12b42 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 15:18:44 -0700 Subject: [PATCH 260/649] chore: new spark icon --- express/styles/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 8166268..4bb4c3d 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -20,7 +20,7 @@ header { height: 98px; background-image: url(/express/icons/adobe-spark.png); background-repeat: no-repeat; - background-size: 22px; + background-size: auto 22px; background-position: bottom 5px center; } From d0438c8cf41b0adeb8d83c43a24f4dd3d13914a5 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 15:24:00 -0700 Subject: [PATCH 261/649] chore: new spark icon --- express/styles/styles.css | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 4bb4c3d..17c4f27 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -20,8 +20,12 @@ header { height: 98px; background-image: url(/express/icons/adobe-spark.png); background-repeat: no-repeat; - background-size: auto 22px; - background-position: bottom 5px center; + background-size: auto 24px; + background-position: bottom 7px center; +} + +#feds-topnav .feds-navList { + border-bottom: 1px solid #eaeaea; } header .desktop { From a521c6aa7ea41e043955046efc66ca2f6c6ac619 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 15:25:23 -0700 Subject: [PATCH 262/649] chore: new spark icon --- express/styles/styles.css | 4 ---- 1 file changed, 4 deletions(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 17c4f27..5de849e 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -24,10 +24,6 @@ header { background-position: bottom 7px center; } -#feds-topnav .feds-navList { - border-bottom: 1px solid #eaeaea; -} - header .desktop { display: none; } From d3e0bc112399a7a1e92609afdaa3e74b1e81ddd9 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 15:30:29 -0700 Subject: [PATCH 263/649] chore: adjust position --- express/styles/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/express/styles/styles.css b/express/styles/styles.css index 5de849e..76f0705 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -21,7 +21,7 @@ header { background-image: url(/express/icons/adobe-spark.png); background-repeat: no-repeat; background-size: auto 24px; - background-position: bottom 7px center; + background-position: bottom 5px center; } header .desktop { From 496fbba585aaec7f9fec9bbd58be0f5b22a86386 Mon Sep 17 00:00:00 2001 From: David Nuescheler Date: Fri, 26 Mar 2021 17:39:05 -0700 Subject: [PATCH 264/649] chore: logo styling and typo --- express/scripts/martech.js | 2 +- express/styles/styles.css | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/express/scripts/martech.js b/express/scripts/martech.js index 0cb18f4..8789de4 100644 --- a/express/scripts/martech.js +++ b/express/scripts/martech.js @@ -76,7 +76,7 @@ loadScript('https://www.adobe.com/marketingtech/main.min.js', () => { fr: 'fr-FR', de: 'de-DE', it: 'it-IT', - da: 'da-DK', + dk: 'da-DK', es: 'es-ES', fi: 'fi-FI', jp: 'ja-JP', diff --git a/express/styles/styles.css b/express/styles/styles.css index 76f0705..3ded822 100644 --- a/express/styles/styles.css +++ b/express/styles/styles.css @@ -17,11 +17,11 @@ header { height: 64px; box-sizing: border-box; border-bottom: 1px solid #EAEAEA; - height: 98px; + height: 135px; background-image: url(/express/icons/adobe-spark.png); background-repeat: no-repeat; background-size: auto 24px; - background-position: bottom 5px center; + background-position: bottom 24px center; } header .desktop { From 74ca4eddeebf5e5e5a24a328e80200ab9cc44ce2 Mon Sep 17 00:00:00 2001 From: Tobias Bocanegra Date: Sat, 27 Mar 2021 10:22:35 +0900 Subject: [PATCH 265/649] fix(blog): use correct image optimization --- express/blocks/blog-posts/blog-posts.js | 6 +++--- test/unit/blocks/expected/link-image.basic.block.html | 6 +++--- .../blocks/expected/link-image.nolinebreaks.block.html | 6 +++--- .../expected/template-list.linkedimage.block.html | 6 +++--- .../expected/template-list.linknotext.block.html | 10 +++++----- .../expected/template-list.linkwithtext.block.html | 6 +++--- test/unit/blocks/input/link-image.basic.doc.html | 6 +++--- .../unit/blocks/input/link-image.nolinebreaks.doc.html | 6 +++--- .../blocks/input/template-list.linkedimage.doc.html | 6 +++--- .../blocks/input/template-list.linknotext.doc.html | 10 +++++----- .../blocks/input/template-list.linkwithtext.doc.html | 6 +++--- test/unit/blocks/input/template-list.video.doc.html | 6 +++--- 12 files changed, 40 insertions(+), 40 deletions(-) diff --git a/express/blocks/blog-posts/blog-posts.js b/express/blocks/blog-posts/blog-posts.js index c09c44d..94defa7 100644 --- a/express/blocks/blog-posts/blog-posts.js +++ b/express/blocks/blog-posts/blog-posts.js @@ -118,11 +118,11 @@ async function decorateBlogPosts($blogPosts, config, offset = 0) { const eyebrow = tagsArr[0] ? tagsArr[0].replace('-', ' ') : ''; const isHero = hasHero && !i; const imagePath = image.split('?')[0].split('_')[1]; - let pictureTag = ``; + let pictureTag = ``; if (isHero) { pictureTag = ` - - + + `; } const $card = createTag('a', { diff --git a/test/unit/blocks/expected/link-image.basic.block.html b/test/unit/blocks/expected/link-image.basic.block.html index 12c83b5..6666913 100644 --- a/test/unit/blocks/expected/link-image.basic.block.html +++ b/test/unit/blocks/expected/link-image.basic.block.html @@ -4,13 +4,13 @@

+ srcset="./media_35ddae1c71c67d8605c37871b8881af5d29c6acc.png?width=750&auto=webp&format=pjpg&optimize=medium">

-
\ No newline at end of file +
diff --git a/test/unit/blocks/expected/link-image.nolinebreaks.block.html b/test/unit/blocks/expected/link-image.nolinebreaks.block.html index 0f2c868..9416e66 100644 --- a/test/unit/blocks/expected/link-image.nolinebreaks.block.html +++ b/test/unit/blocks/expected/link-image.nolinebreaks.block.html @@ -3,12 +3,12 @@
-
\ No newline at end of file +
diff --git a/test/unit/blocks/expected/template-list.linkedimage.block.html b/test/unit/blocks/expected/template-list.linkedimage.block.html index d1ff22f..52e49b4 100644 --- a/test/unit/blocks/expected/template-list.linkedimage.block.html +++ b/test/unit/blocks/expected/template-list.linkedimage.block.html @@ -3,11 +3,11 @@
-
\ No newline at end of file +
diff --git a/test/unit/blocks/expected/template-list.linknotext.block.html b/test/unit/blocks/expected/template-list.linknotext.block.html index 85de59c..8dc9b0c 100644 --- a/test/unit/blocks/expected/template-list.linknotext.block.html +++ b/test/unit/blocks/expected/template-list.linknotext.block.html @@ -4,9 +4,9 @@

+ srcset="./media_ce75b319cd2e8be003380efa8d1328cd487b5147.jpeg?width=750&auto=webp&format=pjpg&optimize=medium"> fashion blogging pinterest

@@ -18,11 +18,11 @@