├── .eslintignore ├── helix-version.txt ├── favicon.ico ├── fstab.yaml ├── hlx_statics ├── styles │ ├── lazy-styles.css │ ├── spectrum │ │ ├── spectrum-css-icon-Dash100.svg │ │ ├── spectrum-css-icon-Chevron100.svg │ │ ├── spectrum-css-icon-Checkmark100.svg │ │ └── font.css │ └── styles.css ├── icons │ ├── avatar.svg │ ├── search.svg │ ├── adobe.svg │ ├── ribbon.svg │ ├── ribbon_purple.svg │ ├── experiencecloud.svg │ ├── audiencemanager.svg │ ├── sign.svg │ ├── workfront.svg │ ├── acrobat.svg │ ├── experienceplatform.svg │ ├── indesign.svg │ ├── illustrator.svg │ ├── audition.svg │ ├── animate.svg │ ├── xd.svg │ ├── stock.svg │ ├── premiere.svg │ ├── lightroom.svg │ ├── bridge.svg │ ├── photoshop.svg │ ├── aftereffects.svg │ ├── lightroom-classic.svg │ ├── cloudservices.svg │ ├── dreamweaver.svg │ ├── genstudio.svg │ └── substance3d.svg ├── blocks │ ├── iframe │ │ ├── iframe.css │ │ └── iframe.js │ ├── banner │ │ ├── banner.css │ │ └── banner.js │ ├── table │ │ ├── table.css │ │ └── table.js │ ├── error404 │ │ ├── error404.js │ │ └── error404.css │ ├── info │ │ ├── info.css │ │ └── info.js │ ├── embed │ │ ├── embed.css │ │ └── embed.js │ ├── summary │ │ ├── summary.js │ │ └── summary.css │ ├── resource-card │ │ ├── resource-card-large.css │ │ ├── resource-card-small.css │ │ ├── resource-card.js │ │ └── resource-card.css │ ├── site-hero │ │ ├── site-hero.js │ │ └── site-hero.css │ ├── announcement │ │ ├── announcement.js │ │ └── announcement.css │ ├── hero │ │ ├── hero.js │ │ └── hero.css │ ├── cards │ │ ├── cards.css │ │ └── cards.js │ ├── info-columns │ │ ├── info-columns.js │ │ └── info-columns.css │ ├── accordion │ │ ├── accordion.css │ │ └── accordion.js │ ├── mini-resource-card │ │ ├── mini-resource-card.js │ │ └── mini-resource-card.css │ ├── footer │ │ ├── footer.js │ │ └── footer.css │ ├── carousel │ │ ├── carousel.css │ │ └── carousel.js │ ├── video-carousel │ │ └── video-carousel.css │ ├── columns │ │ ├── columns.js │ │ └── columns.css │ └── api-browser │ │ └── api-browser.css └── scripts │ ├── experimentation-ued.js │ ├── scripts.js │ └── delayed.js ├── postcss.config.js ├── head.html ├── tools ├── sidekick │ ├── config.json │ └── library.html └── preview │ └── experimentation-preview.css ├── .github └── workflows │ └── npm-publish.yml ├── .eslintrc.js ├── README.md ├── package.json ├── styles-includes.css ├── .gitignore ├── 404.html ├── CONTRIBUTING.md ├── CODE_OF_CONDUCT.md └── scripts └── experimentation-ued.js /.eslintignore: -------------------------------------------------------------------------------- 1 | helix-importer-ui -------------------------------------------------------------------------------- /helix-version.txt: -------------------------------------------------------------------------------- 1 | v7 2 | 3 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/adobe-io-website/main/favicon.ico -------------------------------------------------------------------------------- /fstab.yaml: -------------------------------------------------------------------------------- 1 | mountpoints: 2 | /: https://drive.google.com/drive/folders/1cV6zhxBY6zrAAqA_HalWeDAH4mPloY7T 3 | -------------------------------------------------------------------------------- /hlx_statics/styles/lazy-styles.css: -------------------------------------------------------------------------------- 1 | @import url('./spectrum/font.css'); 2 | /* below the fold CSS goes here */ 3 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('postcss-import'), 4 | require('postcss-varfallback'), 5 | require('postcss-dropunusedvars'), 6 | ], 7 | }; -------------------------------------------------------------------------------- /hlx_statics/icons/avatar.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /hlx_statics/blocks/iframe/iframe.css: -------------------------------------------------------------------------------- 1 | main div.iframe-wrapper { 2 | width: 100%; 3 | border: none; 4 | } 5 | 6 | main iframe.iframe-container { 7 | width: 100%; 8 | height: calc(100vh - var(--spectrum-global-dimension-size-800)); 9 | border: none; 10 | } -------------------------------------------------------------------------------- /head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /hlx_statics/styles/spectrum/spectrum-css-icon-Dash100.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /tools/sidekick/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "project": "adobe.io", 3 | "plugins": [ 4 | { 5 | "id": "library", 6 | "title": "Library", 7 | "environments": ["edit"], 8 | "url": "https://main--adobe-io-website--adobe.hlx.live/tools/sidekick/library.html", 9 | "includePaths": ["**.docx**"] 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /hlx_statics/icons/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /hlx_statics/blocks/banner/banner.css: -------------------------------------------------------------------------------- 1 | main div.banner-container { 2 | background-color: var(--spectrum-global-color-blue-700); 3 | } 4 | 5 | main div.banner { 6 | width: 90%; 7 | text-align: left; 8 | height: 210px; 9 | margin: 0 auto; 10 | } 11 | 12 | main div.banner h1 { 13 | line-height: 210px; 14 | color: var(--spectrum-global-color-gray-50); 15 | } 16 | -------------------------------------------------------------------------------- /hlx_statics/icons/adobe.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /hlx_statics/blocks/table/table.css: -------------------------------------------------------------------------------- 1 | table { 2 | dir: ltr; 3 | } 4 | 5 | main div.table-container { 6 | width: 100%; 7 | background: var(--spectrum-global-color-gray-100); 8 | overflow-x: auto; 9 | } 10 | 11 | main div.table { 12 | width: var(--spectrum-global-dimension-static-grid-fixed-max-width); 13 | box-sizing: border-box; 14 | margin: auto; 15 | } 16 | 17 | main div.table-wrapper { 18 | padding: 80px 32px; 19 | } 20 | -------------------------------------------------------------------------------- /hlx_statics/blocks/error404/error404.js: -------------------------------------------------------------------------------- 1 | import { decorateButtons } from '../../scripts/lib-adobeio.js'; 2 | 3 | /** 4 | * decorates the error404 5 | * @param {Element} block The 404 block element 6 | */ 7 | export default async function decorate(block) { 8 | decorateButtons(block); 9 | 10 | block.querySelectorAll('h1').forEach((h1) => { 11 | h1.classList.add('spectrum-Heading--sizeXXL', 'spectrum-Heading--serif'); 12 | }); 13 | } 14 | 15 | -------------------------------------------------------------------------------- /hlx_statics/blocks/banner/banner.js: -------------------------------------------------------------------------------- 1 | import { applyAnalyticHeaderOverride } from '../../scripts/lib-adobeio.js'; 2 | 3 | /** 4 | * decorates the banenr 5 | * @param {Element} block The banner block element 6 | */ 7 | export default async function decorate(block) { 8 | block.setAttribute('daa-lh', 'banner'); 9 | block.querySelectorAll('h1').forEach((h1) => { 10 | h1.classList.add('spectrum-Heading', 'spectrum-Heading--sizeXL'); 11 | }); 12 | applyAnalyticHeaderOverride(block); 13 | } 14 | -------------------------------------------------------------------------------- /hlx_statics/blocks/error404/error404.css: -------------------------------------------------------------------------------- 1 | main div.error404-container { 2 | height: 100%; 3 | width: 100%; 4 | box-sizing: border-box; 5 | padding: 0 calc(var(--spectrum-global-dimension-size-3600) + var(--spectrum-global-dimension-size-125)); 6 | flex-direction: column; 7 | display: flex; 8 | -webkit-box-align: center; 9 | align-items: center; 10 | -webkit-box-pack: center; 11 | justify-content: center; 12 | text-align: center; 13 | margin-top: 100px; 14 | margin-bottom: 100px; 15 | } 16 | 17 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: NPM Publish 2 | on: 3 | release: 4 | types: [created] 5 | jobs: 6 | publish-npm: 7 | runs-on: ubuntu-latest 8 | defaults: 9 | run: 10 | working-directory: ./ 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v1 14 | with: 15 | node-version: 14 16 | registry-url: https://registry.npmjs.org/ 17 | - run: npm publish 18 | env: 19 | NODE_AUTH_TOKEN: ${{secrets.ADOBE_BOT_NPM_TOKEN}} -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: 'airbnb-base', 4 | env: { 5 | browser: true, 6 | }, 7 | parser: '@babel/eslint-parser', 8 | parserOptions: { 9 | allowImportExportEverywhere: true, 10 | sourceType: 'module', 11 | requireConfigFile: false, 12 | }, 13 | rules: { 14 | // allow reassigning param 15 | 'no-param-reassign': [2, { props: false }], 16 | 'linebreak-style': ['error', 'unix'], 17 | 'import/extensions': ['error', { 18 | js: 'always', 19 | }], 20 | }, 21 | }; 22 | -------------------------------------------------------------------------------- /hlx_statics/styles/spectrum/spectrum-css-icon-Chevron100.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Adobe I/O Website Helix Repository 2 | This is the Adobe I/O Helix repo. It contains all the scripts, styles and other helixy bits to power the adobe.io website. 3 | 4 | ## Installation 5 | 1. Install hlx as a global command. You need Node 10.13 or newer. `$ npm install -g @adobe/helix-cli` 6 | 3. Run `$ hlx up` 7 | 4. Navigate to http://localhost:3000/ 8 | 9 | ## Building styles 10 | The site always uses the minified version of the styles so you must build the styles before seeing them get updated. 11 | 1. `$ npm install --legacy-peer-deps` 12 | 2. Make changes to any css file. If you add a new .css files make sure to include them in `styles-includes.css`. 13 | 3. `$ npm run buildCss` 14 | 4. Minified css built to `/hlx_statics/spectrum/minified` 15 | -------------------------------------------------------------------------------- /hlx_statics/styles/spectrum/spectrum-css-icon-Checkmark100.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /hlx_statics/blocks/info/info.css: -------------------------------------------------------------------------------- 1 | main div.info { 2 | width: 90%; 3 | margin: 0 auto; 4 | background: var(--spectrum-global-color-gray-100); 5 | justify-content: center; 6 | margin-bottom: 64px; 7 | } 8 | 9 | main div.info h2 { 10 | margin-top: var(--spectrum-global-dimension-size-800); 11 | scroll-margin-top: 100px; 12 | } 13 | 14 | main div.info .info-header .anchor-link{ 15 | padding-left: 10px; 16 | visibility: hidden; 17 | } 18 | 19 | main div.info .info-header:hover .anchor-link{ 20 | display: inline-block; 21 | visibility: visible; 22 | } 23 | 24 | 25 | main div.info code { 26 | display: inline-block; 27 | min-width: auto; 28 | background-color: var(--spectrum-global-color-gray-100); 29 | padding: 0 var(--spectrum-global-dimension-size-50); 30 | margin: 0; 31 | } 32 | -------------------------------------------------------------------------------- /hlx_statics/icons/ribbon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /hlx_statics/icons/ribbon_purple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /tools/sidekick/library.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | 12 | 13 | 25 | Sidekick Library 26 | 27 | 28 | 29 | 33 | 41 | 42 | -------------------------------------------------------------------------------- /hlx_statics/icons/experiencecloud.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 16 | 17 | -------------------------------------------------------------------------------- /hlx_statics/icons/audiencemanager.svg: -------------------------------------------------------------------------------- 1 | Artboard 1 copy 3 -------------------------------------------------------------------------------- /hlx_statics/blocks/info/info.js: -------------------------------------------------------------------------------- 1 | import { 2 | createTag, 3 | decorateAnchorLink, 4 | applyBkgColorOverride, 5 | applyWidthOverride, 6 | applyAnalyticHeaderOverride, 7 | } from '../../scripts/lib-adobeio.js'; 8 | import { decorateLightOrDark } from '../../scripts/lib-helix.js'; 9 | 10 | /** 11 | * decorates the info 12 | * @param {Element} block The info block element 13 | */ 14 | export default async function decorate(block) { 15 | block.setAttribute('daa-lh', 'info'); 16 | 17 | decorateLightOrDark(block); 18 | 19 | block.querySelectorAll('h2').forEach((h2) => { 20 | h2.classList.add('spectrum-Heading', 'spectrum-Heading--sizeM', 'info-header'); 21 | decorateAnchorLink(h2); 22 | const hr = createTag('hr', { class: 'spectrum-Divider spectrum-Divider--sizeL' }); 23 | h2.after(hr); 24 | }); 25 | block.querySelectorAll('p').forEach((p) => { 26 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeM'); 27 | }); 28 | block.querySelectorAll('ul').forEach((ul) => { 29 | ul.classList.add('spectrum-Body', 'spectrum-Body--sizeM'); 30 | }); 31 | block.querySelectorAll('a').forEach((a) => { 32 | a.classList.add('spectrum-Link', 'spectrum-Link--quiet'); 33 | }); 34 | applyBkgColorOverride(block); 35 | applyWidthOverride(block); 36 | applyAnalyticHeaderOverride(block); 37 | } 38 | -------------------------------------------------------------------------------- /hlx_statics/blocks/embed/embed.css: -------------------------------------------------------------------------------- 1 | main div.embed-container { 2 | align-items: center; 3 | justify-content: center; 4 | text-align: center; 5 | background: var(--spectrum-global-color-gray-100); 6 | } 7 | 8 | main div.embed-container > div{ 9 | max-width: calc(6 * var(--spectrum-global-dimension-static-grid-fixed-max-width) / var(--spectrum-global-dimension-static-grid-columns)); 10 | padding: var(--spectrum-global-dimension-size-1000) var(--spectrum-global-dimension-size-400); 11 | margin: auto; 12 | } 13 | 14 | main div.embed-container h3 { 15 | margin-bottom: var(--spectrum-global-dimension-size-200)!important; 16 | } 17 | 18 | main div.embed-container p { 19 | margin-top: 0; 20 | margin-bottom: 0!important; 21 | } 22 | 23 | main div.embed { 24 | margin-top: var(--spectrum-global-dimension-size-400); 25 | max-width: calc(6 * var(--spectrum-global-dimension-static-grid-fixed-max-width) / var(--spectrum-global-dimension-static-grid-columns)); 26 | } 27 | 28 | main div.embed iframe { 29 | position: absolute; 30 | top: 0; 31 | left: 0; 32 | width: 100%; 33 | height: 100%; 34 | border: 0; 35 | opacity: 0; 36 | transition: opacity 2.4s ease 0s; 37 | } 38 | 39 | main div.embed-container .embed-custom-width{ 40 | display: flex; 41 | align-items: center; 42 | justify-content: center; 43 | } -------------------------------------------------------------------------------- /hlx_statics/icons/sign.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /hlx_statics/blocks/summary/summary.js: -------------------------------------------------------------------------------- 1 | import { 2 | decorateButtons, 3 | removeEmptyPTags, 4 | rearrangeHeroPicture, 5 | applyAnalyticHeaderOverride, 6 | } from '../../scripts/lib-adobeio.js'; 7 | 8 | /** 9 | * decorates the summary 10 | * @param {Element} block The summary block element 11 | */ 12 | export default async function decorate(block) { 13 | block.setAttribute('daa-lh', 'summary'); 14 | decorateButtons(block); 15 | removeEmptyPTags(block); 16 | block.classList.add('spectrum--dark'); 17 | block.querySelectorAll('h2').forEach((h2) => { 18 | h2.classList.add('spectrum-Heading', 'spectrum-Heading--sizeL'); 19 | }); 20 | block.querySelectorAll('p').forEach((p) => { 21 | const hasLinks = p.querySelectorAll('a, button'); 22 | // don't attach to icon container or if p tag contains links 23 | if (!p.classList.contains('icon-container') && hasLinks.length === 0) { 24 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeL'); 25 | } else if (hasLinks.length > 0) { 26 | p.classList.remove('button-container'); 27 | } 28 | hasLinks.forEach((button) => { 29 | button.className = ''; 30 | button.classList.add('spectrum-Button', 'spectrum-Button--secondary', 'spectrum-Button--sizeM', 'spectrum-Button--overBackground'); 31 | }); 32 | }); 33 | const overlayStyle = 'position: absolute; display: flex; left: 0%; z-index: 1000;'; 34 | rearrangeHeroPicture(block, overlayStyle); 35 | applyAnalyticHeaderOverride(block); 36 | } 37 | -------------------------------------------------------------------------------- /hlx_statics/blocks/summary/summary.css: -------------------------------------------------------------------------------- 1 | main div.summary-container { 2 | background: var(--spectrum-global-color-gray-50); 3 | background-position: center; 4 | background-size: cover; 5 | padding: 0; 6 | } 7 | 8 | main div.summary { 9 | position: relative; 10 | width: 100%; 11 | } 12 | 13 | @media screen and (max-width: 768px) { 14 | main div picture { 15 | height: 350px; 16 | width: 100%; 17 | } 18 | main div.summary img { 19 | height: 100%; 20 | width: 100%; 21 | } 22 | } 23 | 24 | main div.summary > div { 25 | box-sizing: border-box; 26 | padding-left: var(--spectrum-global-dimension-size-800); 27 | width: calc(7 * 100% / 12); 28 | height: 100%; 29 | position: absolute; 30 | top: 20%; 31 | left: 0; 32 | display: flex; 33 | align-items: left; 34 | justify-content: center; 35 | text-align: left; 36 | } 37 | 38 | @media screen and (max-width: 1280px) { 39 | main div.summary > div { 40 | top: 5%; 41 | width: auto; 42 | padding: var(--spectrum-global-dimension-size-400); 43 | } 44 | } 45 | 46 | main div.summary h2 { 47 | margin-top: 0 !important; 48 | margin-bottom: var(--spectrum-global-dimension-size-200) !important; 49 | } 50 | 51 | main div.summary p { 52 | margin-bottom: var(--spectrum-global-dimension-size-300) !important; 53 | color: var(--spectrum-global-color-gray-900); 54 | margin-top: 0; 55 | } 56 | 57 | main div.summary p a:hover { 58 | color: var(--spectrum-global-color-gray-300); 59 | } 60 | 61 | main div.summary img { 62 | object-fit: cover; 63 | } -------------------------------------------------------------------------------- /hlx_statics/icons/workfront.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "adobe-io-website", 3 | "version": "1.1.0", 4 | "scripts": { 5 | "lint": "eslint .", 6 | "buildCss": "mkdir -p hlx_statics/spectrum/minified/ && postcss -o hlx_statics/spectrum/minified/index.min.css styles-includes.css" 7 | }, 8 | "devDependencies": { 9 | "@adobe/eslint-config-helix": "1.1.3", 10 | "@babel/core": "7.13.10", 11 | "@babel/eslint-parser": "7.13.10", 12 | "eslint": "7.15.0", 13 | "eslint-plugin-header": "3.1.0", 14 | "eslint-plugin-import": "2.22.1", 15 | "postcss": "^8.2.6", 16 | "postcss-cli": "^8.3.1", 17 | "postcss-dropunusedvars": "^1.2.0", 18 | "postcss-transformselectors": "^1.1.0", 19 | "postcss-varfallback": "^1.1.0", 20 | "postcss-import": "^14.0.0" 21 | }, 22 | "dependencies": { 23 | "@spectrum-css/actionbutton": "^1.1.13", 24 | "@spectrum-css/button": "6.0.13", 25 | "@spectrum-css/card": "5.0.0", 26 | "@spectrum-css/checkbox": "3.1.3", 27 | "@spectrum-css/divider": "1.0.27", 28 | "@spectrum-css/icon": "3.0.23", 29 | "@spectrum-css/inlinealert": "4.0.13", 30 | "@spectrum-css/link": "3.1.23", 31 | "@spectrum-css/menu": "4.0.4", 32 | "@spectrum-css/page": "5.0.11", 33 | "@spectrum-css/picker": "1.2.12", 34 | "@spectrum-css/popover": "5.0.18", 35 | "@spectrum-css/typography": "4.0.20", 36 | "@spectrum-css/vars": "8.0.0", 37 | "@spectrum-css/well": "3.0.22", 38 | "minimist": "^1.2.6" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /hlx_statics/icons/acrobat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | Asset 90 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /hlx_statics/icons/experienceplatform.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /hlx_statics/icons/indesign.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 256 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /hlx_statics/blocks/resource-card/resource-card-large.css: -------------------------------------------------------------------------------- 1 | main a.resource-card-large-container-inner { 2 | height: calc(var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-100)); 3 | margin: var(--spectrum-global-dimension-size-300); 4 | } 5 | 6 | @media screen and (max-width: 1280px) { 7 | main a.resource-card-large-container-inner { 8 | width: calc(100vw - var(--spectrum-global-dimension-size-300)*2); 9 | margin: var(--spectrum-global-dimension-size-300); 10 | } 11 | } 12 | 13 | main div.resource-card-large-preview { 14 | height: var(--spectrum-global-dimension-size-3000); 15 | width: 100%; 16 | padding: 0 !important; 17 | } 18 | 19 | main div.resource-card-large-image-container { 20 | display: flex; 21 | align-items: center; 22 | justify-content: center; 23 | height: 100%; 24 | width: 100%; 25 | margin-bottom: 0 !important; 26 | margin-top: 0; 27 | } 28 | 29 | main div.resource-card-large-image-container img { 30 | object-fit: cover; 31 | } 32 | 33 | main div.resource-card-large-body { 34 | flex: 1; 35 | padding: var(--spectrum-global-dimension-size-300) !important; 36 | justify-content: flex-start !important; 37 | overflow: hidden; 38 | } 39 | 40 | main div.resource-card-large-header { 41 | height: auto; 42 | width: 100%; 43 | } 44 | 45 | main div.resource-card-large-title { 46 | white-space: normal; 47 | text-align: left; 48 | } 49 | 50 | main div.resource-card-large h3 { 51 | margin-top: 0 !important; 52 | margin-bottom: 0 !important; 53 | } 54 | 55 | main div.resource-card-large p { 56 | text-align: left; 57 | color: var(--spectrum-global-color-gray-700); 58 | margin-top: 0; 59 | } 60 | -------------------------------------------------------------------------------- /hlx_statics/icons/illustrator.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 25 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /hlx_statics/blocks/site-hero/site-hero.js: -------------------------------------------------------------------------------- 1 | import { 2 | removeEmptyPTags, 3 | decorateButtons, 4 | createTag, 5 | applyAnalyticHeaderOverride, 6 | } from '../../scripts/lib-adobeio.js'; 7 | 8 | /** 9 | * decorates the site-hero 10 | * @param {Element} block The site-hero block element 11 | */ 12 | export default async function decorate(block) { 13 | block.setAttribute('daa-lh', 'site hero'); 14 | removeEmptyPTags(block); 15 | decorateButtons(block); 16 | 17 | const button_div = createTag('div', {class: 'hero-button-container'}); 18 | 19 | block.classList.add('spectrum--dark'); 20 | block.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((h) => { 21 | const fontFamily = block?.parentElement?.parentElement?.getAttribute('data-font-family'); 22 | if (fontFamily) { 23 | h.style.fontFamily = fontFamily; 24 | h.classList.add('spectrum-Heading', 'spectrum-Heading--sizeXXL'); 25 | } else { 26 | h.classList.add('spectrum-Heading', 'spectrum-Heading--sizeXXL', 'spectrum-Heading--serif'); 27 | } 28 | h.parentElement.classList.add('site-hero-content'); 29 | h.parentElement.append(button_div); 30 | }); 31 | 32 | block.querySelectorAll('p').forEach((p) => { 33 | const hasLinks = p.querySelectorAll('a, button'); 34 | // don't attach to icon container or if p tag contains links 35 | if (!p.classList.contains('icon-container')) { 36 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeL'); 37 | } 38 | if (p.classList.contains('button-container')){ 39 | button_div.append(p); 40 | } 41 | }); 42 | 43 | if(document.querySelectorAll('.xl img').length === 1){ 44 | const hero_img = document.querySelectorAll('.xl img')[0]; 45 | hero_img.removeAttribute('style'); 46 | hero_img.setAttribute('class', 'xl-img'); 47 | } 48 | applyAnalyticHeaderOverride(block); 49 | } -------------------------------------------------------------------------------- /hlx_statics/icons/audition.svg: -------------------------------------------------------------------------------- 1 | Asset 142 -------------------------------------------------------------------------------- /hlx_statics/icons/animate.svg: -------------------------------------------------------------------------------- 1 | Asset 147 -------------------------------------------------------------------------------- /hlx_statics/styles/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2020 Adobe. All rights reserved. 3 | * This file is licensed to you under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. You may obtain a copy 5 | * of the License at http://www.apache.org/licenses/LICENSE-2.0 6 | * 7 | * Unless required by applicable law or agreed to in writing, software distributed under 8 | * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 9 | * OF ANY KIND, either express or implied. See the License for the specific language 10 | * governing permissions and limitations under the License. 11 | */ 12 | 13 | @import url('./spectrum/spectrum.min.css'); 14 | 15 | html, body { 16 | margin: 0; 17 | -webkit-font-smoothing: antialiased; 18 | -moz-osx-font-smoothing: grayscale; 19 | } 20 | 21 | .spectrum { 22 | --spectrum-global-font-family-serif: adobe-clean-serif, adobe-clean-serif-fallback; 23 | } 24 | 25 | /* fallback font for adobe-clean-serif (900) */ 26 | @font-face { 27 | font-family: "adobe-clean-serif-fallback"; 28 | size-adjust: 109.64%; 29 | src: local("Times New Roman"); 30 | } 31 | 32 | img { 33 | width: auto; 34 | height: auto; 35 | } 36 | 37 | .title-header { 38 | text-align: center; 39 | padding-bottom: 16px; 40 | padding-top: 60px; 41 | } 42 | 43 | .title-body { 44 | text-align: center; 45 | max-width: 900px; 46 | margin: 0 auto; 47 | padding-bottom: 60px; 48 | } 49 | 50 | #onetrust-consent-sdk, #ot-cookie-settings { 51 | font-family: "adobe-clean",sans-serif; 52 | } 53 | 54 | main .section { 55 | padding: var(--spectrum-global-dimension-size-400) 0; 56 | } 57 | 58 | main .section .section-title{ 59 | margin: 0; 60 | text-align: center; 61 | } 62 | /* progressive section appearance */ 63 | main .section[data-section-status='loading'], 64 | main .section[data-section-status='initialized'] { 65 | display: none; 66 | } 67 | 68 | body > header { 69 | height: 81px; 70 | } 71 | 72 | body.sidekick-library #onetrust-consent-sdk { display: none } -------------------------------------------------------------------------------- /hlx_statics/blocks/table/table.js: -------------------------------------------------------------------------------- 1 | import { 2 | applyWidthOverride, 3 | applyBkgColorOverride, 4 | applyAnalyticHeaderOverride, 5 | } from '../../scripts/lib-adobeio.js'; 6 | /* 7 | * Table Block 8 | * Recreate a table 9 | * https://www.hlx.live/developer/block-collection/table 10 | */ 11 | 12 | function buildCell(rowIndex) { 13 | const cell = document.createElement('td'); 14 | if (!rowIndex) cell.setAttribute('scope', 'col'); 15 | return cell; 16 | } 17 | 18 | function buildCellHead(rowIndex) { 19 | const cell = document.createElement('th'); 20 | if (!rowIndex) cell.setAttribute('scope', 'col'); 21 | return cell; 22 | } 23 | 24 | export default async function decorate(block) { 25 | block.setAttribute('daa-lh', 'table'); 26 | block.setAttribute('dir','ltr'); 27 | const table = document.createElement('table'); 28 | table.classList.add('spectrum-Table','spectrum-Table--sizeM','spectrum-Table--spacious'); 29 | const thead = document.createElement('thead'); 30 | thead.classList.add('spectrum-Table-head'); 31 | const tbody = document.createElement('tbody'); 32 | tbody.classList.add('spectrum-Table-body'); 33 | table.append(thead, tbody); 34 | [...block.children].forEach((child, i) => { 35 | const row = document.createElement('tr'); 36 | if (i) { 37 | row.classList.add('spectrum-Table-row'); 38 | tbody.append(row); 39 | [...child.children].forEach((col) => { 40 | const cell = buildCell(i); 41 | cell.classList.add('spectrum-Table-cell'); 42 | cell.innerHTML = col.innerHTML; 43 | row.append(cell); 44 | });} 45 | else { 46 | thead.append(row); 47 | [...child.children].forEach((col) => { 48 | const cell = buildCellHead(i); 49 | cell.classList.add('spectrum-Table-headCell'); 50 | cell.innerHTML = col.innerHTML; 51 | row.append(cell); 52 | });} 53 | 54 | }); 55 | block.textContent = ''; 56 | block.append(table); 57 | applyBkgColorOverride(block); 58 | applyWidthOverride(block); 59 | applyAnalyticHeaderOverride(block); 60 | } 61 | -------------------------------------------------------------------------------- /hlx_statics/blocks/announcement/announcement.js: -------------------------------------------------------------------------------- 1 | import { decorateButtons, removeEmptyPTags, applyWidthOverride, applyBkgColorOverride, applyAnalyticHeaderOverride } from '../../scripts/lib-adobeio.js'; 2 | 3 | function calculateOverlapping(block) { 4 | var myImg = block.querySelector('picture img'); 5 | if (myImg !== null) { 6 | let marginToAdd = myImg.height - 200; 7 | const firstDivAfterVideo = block.parentElement.parentElement.nextElementSibling; 8 | 9 | const ro = new ResizeObserver(entries => { 10 | for (let entry of entries) { 11 | var actualWidth = window.innerWidth; 12 | if (actualWidth < 1280) 13 | marginToAdd = 0; 14 | else 15 | marginToAdd = myImg.height - 200; 16 | entry.target.style.margin = marginToAdd + "px 0 0"; 17 | } 18 | }); 19 | ro.observe(firstDivAfterVideo); 20 | 21 | var actualWidth = window.innerWidth; 22 | if (actualWidth < 1280) 23 | marginToAdd = 0; 24 | firstDivAfterVideo.style.margin = marginToAdd + "px 0 0" 25 | } 26 | } 27 | 28 | /** 29 | * decorates the announcement 30 | * @param {Element} block The announcement block element 31 | */ 32 | export default async function decorate(block) { 33 | decorateButtons(block); 34 | removeEmptyPTags(block); 35 | block.setAttribute('daa-lh', 'announcement'); 36 | block.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((h) => { 37 | h.classList.add('spectrum-Heading', 'spectrum-Heading--sizeL', 'announce-heading'); 38 | }); 39 | block.querySelectorAll('p').forEach((p) => { 40 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeL'); 41 | }); 42 | block.querySelectorAll('p').forEach((paragraph) => { 43 | paragraph.classList.add('spectrum-Body'); 44 | paragraph.classList.add('spectrum-Body--sizeL'); 45 | }); 46 | block.querySelectorAll('p a').forEach((link) => { 47 | link.parentElement.classList.add('announce-link'); 48 | }); 49 | applyBkgColorOverride(block); 50 | applyWidthOverride(block); 51 | calculateOverlapping(block); 52 | applyAnalyticHeaderOverride(block); 53 | } 54 | 55 | -------------------------------------------------------------------------------- /hlx_statics/icons/xd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /hlx_statics/icons/stock.svg: -------------------------------------------------------------------------------- 1 | 3 | 7 | 9 | 18 | 24 | 25 | -------------------------------------------------------------------------------- /hlx_statics/blocks/hero/hero.js: -------------------------------------------------------------------------------- 1 | import { 2 | decorateButtons, 3 | applyAnalyticHeaderOverride, 4 | } from '../../scripts/lib-adobeio.js'; 5 | import { decorateLightOrDark } from '../../scripts/lib-helix.js'; 6 | 7 | /** 8 | * Rearranges the links into a hero-button-container div 9 | * @param {*} block The hero block element 10 | */ 11 | function rearrangeLinks(block) { 12 | const leftDiv = block.firstElementChild.firstElementChild; 13 | const heroButtonContainer = document.createElement('div'); 14 | heroButtonContainer.classList.add('hero-button-container'); 15 | leftDiv.querySelectorAll('p.button-container').forEach((p) => { 16 | heroButtonContainer.append(p); 17 | }); 18 | leftDiv.append(heroButtonContainer); 19 | } 20 | 21 | /** 22 | * decorates the hero 23 | * @param {Element} block The hero block element 24 | */ 25 | export default async function decorate(block) { 26 | block.setAttribute('daa-lh', 'hero'); 27 | // Block decoration 28 | decorateLightOrDark(block, true); 29 | // H1 decoration 30 | block.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((h) => { 31 | const fontFamily = block?.parentElement?.parentElement?.getAttribute('data-font-family'); 32 | if (fontFamily) { 33 | h.style.fontFamily = fontFamily; 34 | h.classList.add('spectrum-Heading', 'spectrum-Heading--sizeXXL'); 35 | } else { 36 | h.classList.add('spectrum-Heading', 'spectrum-Heading--sizeXXL', 'spectrum-Heading--serif'); 37 | } 38 | 39 | }); 40 | 41 | block.querySelectorAll('picture source').forEach((picture) => { 42 | // Removes weird max-width attribute 43 | picture.media = ''; 44 | }); 45 | 46 | // Removes content for span.icon 47 | block.querySelectorAll('span.icon').forEach((span) => { 48 | span.textContent = ''; 49 | }); 50 | // Link decoration 51 | rearrangeLinks(block); 52 | decorateButtons(block); 53 | // Paragraph decoration 54 | block.querySelectorAll('p').forEach((p) => { 55 | if (p.innerText) { 56 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeL'); 57 | } 58 | }); 59 | applyAnalyticHeaderOverride(block); 60 | } 61 | -------------------------------------------------------------------------------- /hlx_statics/icons/premiere.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 26 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /styles-includes.css: -------------------------------------------------------------------------------- 1 | @import 'node_modules/@spectrum-css/vars/dist/spectrum-global.css'; 2 | @import 'node_modules/@spectrum-css/vars/dist/spectrum-medium.css'; 3 | @import 'node_modules/@spectrum-css/vars/dist/spectrum-large.css'; 4 | @import 'node_modules/@spectrum-css/vars/dist/spectrum-light.css'; 5 | @import 'node_modules/@spectrum-css/vars/dist/spectrum-lightest.css'; 6 | @import 'node_modules/@spectrum-css/vars/dist/spectrum-dark.css'; 7 | @import 'node_modules/@spectrum-css/vars/dist/spectrum-darkest.css'; 8 | 9 | @import 'node_modules/@spectrum-css/typography/dist/index-vars.css'; 10 | @import 'node_modules/@spectrum-css/page/dist/index-vars.css'; 11 | @import 'node_modules/@spectrum-css/button/dist/index-vars.css'; 12 | @import 'node_modules/@spectrum-css/icon/dist/index-vars.css'; 13 | 14 | @import 'node_modules/@spectrum-css/card/dist/index-vars.css'; 15 | @import 'node_modules/@spectrum-css/checkbox/dist/index-vars.css'; 16 | @import 'node_modules/@spectrum-css/link/dist/index-vars.css'; 17 | @import 'node_modules/@spectrum-css/divider/dist/index-vars.css'; 18 | @import 'node_modules/@spectrum-css/menu/dist/index-vars.css'; 19 | @import 'node_modules/@spectrum-css/popover/dist/index-vars.css'; 20 | @import 'node_modules/@spectrum-css/picker/dist/index-vars.css'; 21 | @import 'node_modules/@spectrum-css/well/dist/index-vars.css'; 22 | 23 | @import 'node_modules/@spectrum-css/actionbutton/dist/index-vars.css'; 24 | 25 | @import 'hlx_statics/blocks/announcement.css'; 26 | @import 'hlx_statics/blocks/api-browser.css'; 27 | @import 'hlx_statics/blocks/background-image.css'; 28 | @import 'hlx_statics/blocks/cards.css'; 29 | @import 'hlx_statics/blocks/columns.css'; 30 | @import 'hlx_statics/blocks/embed.css'; 31 | @import 'hlx_statics/blocks/hero.css'; 32 | @import 'hlx_statics/blocks/resource-card-large.css'; 33 | @import 'hlx_statics/blocks/resource-card-small.css'; 34 | @import 'hlx_statics/blocks/resource-card.css'; 35 | @import 'hlx_statics/blocks/site-hero.css'; 36 | @import 'hlx_statics/blocks/summary.css'; 37 | @import 'hlx_statics/blocks/info.css'; 38 | @import 'hlx_statics/blocks/banner.css'; 39 | @import 'hlx_statics/blocks/info-columns.css'; 40 | 41 | @import 'hlx_statics/styles.css' -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | package-lock.json 44 | 45 | # TypeScript v1 declaration files 46 | typings/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Microbundle cache 58 | .rpt2_cache/ 59 | .rts2_cache_cjs/ 60 | .rts2_cache_es/ 61 | .rts2_cache_umd/ 62 | 63 | # Optional REPL history 64 | .node_repl_history 65 | 66 | # Output of 'npm pack' 67 | *.tgz 68 | 69 | # Yarn Integrity file 70 | .yarn-integrity 71 | 72 | # dotenv environment variables file 73 | .env 74 | .env.test 75 | 76 | # parcel-bundler cache (https://parceljs.org/) 77 | .cache 78 | 79 | # Next.js build output 80 | .next 81 | 82 | # Nuxt.js build / generate output 83 | .nuxt 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | .hlx 107 | 108 | .DS_Store -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Page not found 6 | 10 | 11 | 12 | 13 | 32 | 33 | 48 | 49 | 50 | 51 | 52 |
53 |
54 |
55 | 56 | 404 57 | 58 |

Page Not Found

59 |

60 | Go home 61 |

62 |
63 |
64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /hlx_statics/blocks/cards/cards.css: -------------------------------------------------------------------------------- 1 | main div.cards { 2 | width: var(--spectrum-global-dimension-static-grid-fluid-width); 3 | background: var(--spectrum-global-color-gray-100); 4 | display: flex; 5 | justify-content: center; 6 | flex-direction: row; 7 | } 8 | 9 | @media screen and (max-width: 320px) { 10 | main div.cards { 11 | flex-direction: column; 12 | } 13 | } 14 | 15 | @media screen and (max-width: 768px) { 16 | main div.cards { 17 | flex-wrap: wrap; 18 | } 19 | main div.cards>* { 20 | flex: 0 0 50%; 21 | } 22 | } 23 | 24 | main div.cards > div { 25 | text-align: center; 26 | display: table-cell; 27 | padding: var(--spectrum-global-dimension-size-1000) 0; 28 | } 29 | 30 | main div.cards > div.three-cards { 31 | width: 33.33vw; 32 | } 33 | 34 | main div.cards > div.four-cards { 35 | width: 25vw; 36 | } 37 | 38 | main div.cards-container.background-color-white { 39 | background-color: white; 40 | } 41 | 42 | main div.cards-container .cards-wrapper{ 43 | display: flex; 44 | align-items: center; 45 | justify-content: center; 46 | } 47 | 48 | main div.cards-container.background-color-white div.cards { 49 | background-color: white; 50 | } 51 | 52 | @media screen and (max-width: 320px) { 53 | main div.cards > div { 54 | display: block; 55 | width: 100%; 56 | } 57 | } 58 | 59 | main div.cards > div > div { 60 | max-width: var(--spectrum-global-dimension-size-4600); 61 | padding: 0 var(--spectrum-global-dimension-size-400); 62 | margin: auto; 63 | } 64 | 65 | main div.cards > div img { 66 | height: var(--spectrum-global-dimension-size-1000); 67 | margin-top: 0; 68 | margin-bottom: var(--spectrum-global-dimension-size-300); 69 | } 70 | 71 | main div.cards > div h3 { 72 | margin-bottom: var(--spectrum-global-dimension-size-200)!important; 73 | } 74 | 75 | main div.cards > div p { 76 | margin-top: 0; 77 | margin-bottom: 0!important; 78 | } 79 | 80 | main div.cards a.card-button { 81 | --gap: var(--spectrum-global-dimension-size-200); 82 | margin-top: var(--spectrum-global-dimension-size-150); 83 | margin-bottom: var(--spectrum-global-dimension-size-150); 84 | } 85 | -------------------------------------------------------------------------------- /hlx_statics/blocks/info-columns/info-columns.js: -------------------------------------------------------------------------------- 1 | import { 2 | createTag, 3 | checkExternalLink, 4 | removeEmptyPTags, 5 | applyBkgColorOverride, 6 | applyWidthOverride, 7 | applyAnalyticHeaderOverride, 8 | } from '../../scripts/lib-adobeio.js'; 9 | import { decorateLightOrDark } from '../../scripts/lib-helix.js'; 10 | 11 | /** 12 | * decorates the info-columns 13 | * @param {Element} block The info-columns block element 14 | */ 15 | export default async function decorate(block) { 16 | block.setAttribute('daa-lh', 'info column'); 17 | block.querySelectorAll('.info-columns > div > div').forEach((column) => { 18 | column.classList.add('info-column'); 19 | }); 20 | block.querySelectorAll('.info-column').forEach((column) => { 21 | 22 | decorateLightOrDark(block); 23 | 24 | removeEmptyPTags(column); 25 | column.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((h) => { 26 | h.classList.add('spectrum-Heading', 'spectrum-Heading--sizeM', 'column-header'); 27 | }); 28 | column.querySelectorAll('ul').forEach((ul) => { 29 | ul.classList.add('spectrum-Body', 'spectrum-Body--sizeM'); 30 | }); 31 | column.querySelectorAll('p').forEach((p) => { 32 | const hasLinks = p.querySelectorAll('a, button'); 33 | // don't attach to icon container or if p tag contains links 34 | if (!p.classList.contains('icon-container') && hasLinks.length === 0) { 35 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeM'); 36 | } else { 37 | p.classList.add('icon-container'); 38 | } 39 | }); 40 | column.querySelectorAll('a').forEach((a) => { 41 | a.classList.add('spectrum-Link', 'spectrum-Link--quiet'); 42 | checkExternalLink(a); 43 | }); 44 | column.querySelectorAll('div > div.info-column').forEach((infoColumn) => { 45 | const productLinkContainer = createTag('div', { class: 'product-link-container' }); 46 | infoColumn.querySelectorAll('p.icon-container').forEach((innerSecond) => { 47 | productLinkContainer.append(innerSecond); 48 | }); 49 | infoColumn.append(productLinkContainer); 50 | }); 51 | }); 52 | applyBkgColorOverride(block); 53 | applyWidthOverride(block); 54 | applyAnalyticHeaderOverride(block); 55 | } 56 | -------------------------------------------------------------------------------- /hlx_statics/blocks/resource-card/resource-card-small.css: -------------------------------------------------------------------------------- 1 | main a.resource-card-small-container-inner { 2 | height: calc(var(--spectrum-global-dimension-size-2000) - var(--spectrum-global-dimension-size-50)); 3 | margin: var(--spectrum-global-dimension-size-300); 4 | } 5 | 6 | @media screen and (max-width: 1280px) { 7 | main a.resource-card-small-container-inner { 8 | height: calc(var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-100)); 9 | margin: var(--spectrum-global-dimension-size-300); 10 | width: calc(100vw - var(--spectrum-global-dimension-size-300)*2); 11 | } 12 | } 13 | 14 | main div.resource-card-small-preview { 15 | width: calc(var(--spectrum-global-dimension-size-2000) + var(--spectrum-global-dimension-size-125)); 16 | padding: 0 !important; 17 | } 18 | 19 | @media screen and (max-width: 1280px) { 20 | main div.resource-card-small-preview { 21 | height: var(--spectrum-global-dimension-size-3000); 22 | width: calc(100vw - var(--spectrum-global-dimension-size-300)*2); 23 | padding: 0 !important; 24 | } 25 | } 26 | 27 | main div.resource-card-small-image-container { 28 | display: flex; 29 | align-items: center; 30 | justify-content: center; 31 | height: 100%; 32 | width: 100%; 33 | margin-top: 0; 34 | margin-bottom: 0 !important; 35 | } 36 | 37 | main div.resource-card-small-image-container img { 38 | object-fit: contain; 39 | } 40 | 41 | @media screen and (min-width: 1280px) { 42 | main div.resource-card-small-image-container img { 43 | max-width: 110%; 44 | max-height: 110%; 45 | } 46 | } 47 | 48 | main div.resource-card-small-body { 49 | flex: 1; 50 | padding: var(--spectrum-global-dimension-size-300) !important; 51 | justify-content: flex-start !important; 52 | overflow: hidden; 53 | } 54 | 55 | main div.resource-card-small-header { 56 | width: 100%; 57 | } 58 | 59 | main div.resource-card-small-title { 60 | white-space: normal; 61 | text-align: left; 62 | } 63 | 64 | main div.resource-card-small h3 { 65 | margin-top: 0 !important; 66 | margin-bottom: var(--spectrum-global-dimension-size-200) !important; 67 | } 68 | 69 | main div.resource-card-small p { 70 | text-align: left; 71 | color: var(--spectrum-global-color-gray-700); 72 | margin-top: 0; 73 | } 74 | -------------------------------------------------------------------------------- /hlx_statics/icons/lightroom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | ]> 13 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 26 | 29 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /hlx_statics/blocks/accordion/accordion.css: -------------------------------------------------------------------------------- 1 | main div.accordion .accordion-div { 2 | display: flex !important; 3 | flex-direction: column; 4 | align-items: center; 5 | justify-content: center; 6 | width: 50% !important; 7 | margin: auto !important; 8 | } 9 | 10 | main .accordion-whole { 11 | padding: var(--spectrum-global-dimension-size-600) 0; 12 | } 13 | 14 | main .accordion-whole .accordion-wrapper { 15 | display: flex; 16 | align-items: center; 17 | justify-content: center; 18 | } 19 | 20 | main div.accordion .accordion-title { 21 | display: flex !important; 22 | flex-direction: column; 23 | justify-content: center; 24 | text-align: left; 25 | color: black; 26 | width: 50% !important; 27 | margin: auto !important 28 | } 29 | 30 | main div.accordion .accordion-item { 31 | border-color: #d9d9d9 !important; 32 | border-bottom: var(--spectrum-alias-border-size-thin) solid; 33 | display: list-item; 34 | list-style: none; 35 | width: 100%; 36 | } 37 | 38 | main div.accordion .spectrum-Accordion-ChevronIcon { 39 | padding: 6px!important; 40 | } 41 | 42 | main div.accordion h3 { 43 | margin: 0; 44 | } 45 | 46 | main div.accordion .accordion-itemHeader { 47 | box-sizing: border-box; 48 | margin: 0; 49 | text-align: left; 50 | align-items: center; 51 | width: 100%!important; 52 | background-color: inherit; 53 | border: 0; 54 | cursor: pointer; 55 | padding-left: 0!important; 56 | display: flex; 57 | justify-content: flex-start; 58 | font-family: inherit; 59 | font-size: 16px !important; 60 | padding-left: 0 !important; 61 | padding-right: var(--spectrum-global-dimension-size-275); 62 | padding-bottom: var(--spectrum-global-dimension-size-200); 63 | padding-top: var(--spectrum-global-dimension-size-200); 64 | font-weight: var(--spectrum-global-font-weight-bold)!important; 65 | } 66 | 67 | main div.accordion .accordion-itemHeader:hover { 68 | background-color: #e9eaeb; 69 | color: var(--spectrum-global-color-gray-900); 70 | } 71 | 72 | main div.accordion .accordion-itemContent { 73 | font-size: 16px; 74 | margin-top: var(--spectrum-global-dimension-size-150); 75 | padding-left: 20px!important; 76 | padding-bottom: var(--spectrum-global-dimension-size-200); 77 | display: none; 78 | } 79 | 80 | main div.accordion .active { 81 | background-color: transparent; 82 | } 83 | 84 | -------------------------------------------------------------------------------- /hlx_statics/icons/bridge.svg: -------------------------------------------------------------------------------- 1 | Asset 140 -------------------------------------------------------------------------------- /hlx_statics/icons/photoshop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 26 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /hlx_statics/icons/aftereffects.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /hlx_statics/blocks/info-columns/info-columns.css: -------------------------------------------------------------------------------- 1 | main div.info-columns-container { 2 | width: 100%; 3 | background: var(--spectrum-global-color-gray-100); 4 | } 5 | 6 | main div.info-columns { 7 | width: var(--spectrum-global-dimension-static-grid-fixed-max-width); 8 | box-sizing: border-box; 9 | margin: auto; 10 | } 11 | 12 | @media screen and (max-width: 1280px) { 13 | main div.info-columns { 14 | width: 100%; 15 | } 16 | main div.info-columns > div { 17 | flex-direction: column !important; 18 | } 19 | } 20 | 21 | main div.info-columns > div { 22 | display: flex; 23 | align-items: start; 24 | } 25 | 26 | main div.info-columns > div:nth-child(even) { 27 | flex-direction: row-reverse; 28 | } 29 | 30 | @media screen and (max-width: 1280px) { 31 | main div.info-columns > div { 32 | flex-direction: column; 33 | } 34 | } 35 | 36 | main div.info-column { 37 | width: 50%; 38 | display: flex; 39 | flex-direction: column; 40 | justify-content: center; 41 | text-align: left; 42 | box-sizing: border-box; 43 | padding: 0 var(--spectrum-global-dimension-size-400); 44 | } 45 | 46 | @media screen and (max-width: 1280px) { 47 | main div.info-columns div.info-column { 48 | width: 100%; 49 | margin: var(--spectrum-global-dimension-size-400) 0; 50 | } 51 | } 52 | 53 | main div.info-columns h3.column-header { 54 | margin-top: 0 !important; 55 | margin-bottom: var(--spectrum-global-dimension-size-200) !important; 56 | } 57 | 58 | main div.info-columns h3.column-header + p { 59 | margin-top: 0 !important; 60 | } 61 | 62 | main div.info-columns p + p { 63 | margin-top: var(--spectrum-global-dimension-size-300); 64 | } 65 | 66 | main div.info-columns div.product-link-container p { 67 | margin-top: var(--spectrum-global-dimension-size-300); 68 | } 69 | 70 | main div.info-columns div.product-link-container p + p { 71 | margin-left: var(--spectrum-global-dimension-size-300); 72 | } 73 | 74 | main div.info-column div.product-link-container { 75 | display: flex; 76 | flex-direction: row; 77 | } 78 | 79 | main div.info-column div.product-link-container p.icon-container { 80 | display: flex; 81 | align-items: center; 82 | } 83 | 84 | main div.info-column div.product-link-container img.icon { 85 | height: var(--spectrum-global-dimension-size-400); 86 | width: var(--spectrum-global-dimension-size-400); 87 | object-fit: contain; 88 | } 89 | 90 | main div.info-column div.product-link-container a { 91 | margin-left: var(--spectrum-global-dimension-size-100); 92 | } 93 | -------------------------------------------------------------------------------- /hlx_statics/blocks/resource-card/resource-card.js: -------------------------------------------------------------------------------- 1 | import { 2 | removeEmptyPTags, 3 | applySectionTitle, 4 | applyAnalyticHeaderOverride, 5 | } from '../../scripts/lib-adobeio.js'; 6 | 7 | import { 8 | createOptimizedPicture, 9 | } from '../../scripts/lib-helix.js'; 10 | 11 | /** 12 | * Returns the HTML for a resource card 13 | * @param {*} linkHref The link to the resource 14 | * @param {*} imgSrc The URL of the resource image 15 | * @param {*} heading The heading text of the card 16 | * @param {*} text The text of the card 17 | * @param {*} altText The alternative text of the card 18 | * @returns The resource card HTML 19 | */ 20 | function getResourceCard(linkHref, heading, text) { 21 | return ` 22 | 25 |
26 |
27 | 28 |
29 |
30 |
31 |
32 |
33 |

34 | ${heading} 35 |

36 |
37 |
38 |
39 |
40 |

41 | ${text} 42 |

43 |
44 |
45 |
46 |
47 | `; 48 | } 49 | 50 | /** 51 | * decorates the resource-card 52 | * @param {Element} block The resource-card block element 53 | */ 54 | export default async function decorate(block) { 55 | block.setAttribute('daa-lh', 'resource card'); 56 | block.querySelectorAll('.resource-card > div').forEach((resource) => { 57 | removeEmptyPTags(resource); 58 | // const resourceCard = createTag('div', { class: 'resource-cards-card' }); 59 | const linkHref = resource.querySelector('a')?.href; 60 | const heading = resource.querySelector('a')?.innerText; 61 | const imgSrc = resource.querySelector('img')?.src; 62 | const text = resource.querySelector('p')?.innerText; 63 | const altText = resource.querySelector('img')?.alt; 64 | resource.innerHTML = getResourceCard(linkHref, heading, text); 65 | const picture = createOptimizedPicture(imgSrc, altText); 66 | const pictureContainer = resource.querySelector('.resource-card-image-container'); 67 | pictureContainer.append(picture); 68 | }); 69 | applySectionTitle(block); 70 | applyAnalyticHeaderOverride(block); 71 | } 72 | -------------------------------------------------------------------------------- /hlx_statics/blocks/cards/cards.js: -------------------------------------------------------------------------------- 1 | import { decorateButtons, applyWidthOverride, applyBkgColorOverride, applySectionTitle, applyAnalyticHeaderOverride} from '../../scripts/lib-adobeio.js'; 2 | import { createOptimizedPicture, decorateLightOrDark } from '../../scripts/lib-helix.js'; 3 | 4 | /** 5 | * Generates optimized images for all cards in the block 6 | * @param {*} block The cards block 7 | */ 8 | function processImages(block) { 9 | block.querySelectorAll('picture > img').forEach((img) => { 10 | const parent = img.parentElement.parentElement; 11 | const imgSrc = img?.src; 12 | const altText = img?.alt; 13 | const picture = createOptimizedPicture(imgSrc, altText); 14 | parent.replaceChild(picture, img.parentElement); 15 | }); 16 | } 17 | 18 | /** 19 | * loads and decorates the cards 20 | * @param {Element} block The cards block element 21 | */ 22 | export default async function decorate(block) { 23 | // by default, we will use all links as button. When the section metadata added a linkstyle to be link, it'll change that section's button to be link. 24 | const isLink = block.parentElement.parentElement.getAttribute('data-link-class'); 25 | if(isLink !== "link") { 26 | decorateButtons(block); 27 | } 28 | block.setAttribute('daa-lh', 'card'); 29 | block.querySelectorAll('.cards > div').forEach((card, index, array) => { 30 | 31 | decorateLightOrDark(block); 32 | 33 | card.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((header) => { 34 | header.classList.add('spectrum-Heading', 'spectrum-Heading--sizeM'); 35 | }); 36 | 37 | card.querySelectorAll('p').forEach((p) => { 38 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeM'); 39 | }); 40 | 41 | if(isLink === "link") { 42 | card.querySelectorAll('p > a').forEach((a) => { 43 | a.classList.add('spectrum-Link', 'spectrum-Link--quiet'); 44 | }); 45 | } else { 46 | card.querySelectorAll('p > a').forEach((a) => { 47 | a.classList.remove('spectrum-Button--secondary'); 48 | a.classList.add('spectrum-Button--cta', 'spectrum-Button--fill', 'card-button'); 49 | }); 50 | } 51 | 52 | 53 | if (array.length === 3) { 54 | card.classList.add('three-card'); 55 | } else if (array.length === 4) { 56 | card.classList.add('four-card'); 57 | } 58 | }); 59 | const observer = new IntersectionObserver((entries) => { 60 | if (entries.some((e) => e.isIntersecting)) { 61 | observer.disconnect(); 62 | processImages(block); 63 | } 64 | }); 65 | observer.observe(block); 66 | applyBkgColorOverride(block); 67 | applyWidthOverride(block); 68 | applySectionTitle(block); 69 | applyAnalyticHeaderOverride(block); 70 | } 71 | -------------------------------------------------------------------------------- /hlx_statics/blocks/site-hero/site-hero.css: -------------------------------------------------------------------------------- 1 | main div.site-hero-container { 2 | background: var(--spectrum-global-color-gray-50); 3 | background-position: center; 4 | background-size: cover; 5 | padding: 0 !important; 6 | } 7 | 8 | main div.site-hero { 9 | position: relative; 10 | width: 100%; 11 | height: 350px; 12 | } 13 | 14 | main .xl div.site-hero { 15 | position: relative; 16 | width: 100%; 17 | height: 624px !important; 18 | } 19 | 20 | main div.site-hero .site-hero-content { 21 | position: absolute; 22 | display: flex; 23 | flex-direction: column; 24 | justify-content: center; 25 | align-items: center; 26 | padding: 0 25%; 27 | box-sizing: border-box; 28 | height: 100%; 29 | width: 100%; 30 | } 31 | 32 | 33 | main .site-hero img { 34 | width: 100%; 35 | height: 350px; 36 | object-fit: cover; 37 | } 38 | 39 | main .xl .xl-img{ 40 | width: 100%; 41 | height: 624px !important; 42 | object-fit: cover; 43 | } 44 | 45 | 46 | main .site-hero h1 { 47 | text-align: center; 48 | margin-top: 0; 49 | margin-bottom: var(--spectrum-global-dimension-size-200); 50 | } 51 | 52 | main .site-hero p.spectrum-Body--sizeL { 53 | margin-top: 0 !important; 54 | font-size: var(--spectrum-global-dimension-size-225); 55 | color: var(--spectrum-global-color-gray-800) !important; 56 | } 57 | 58 | main .site-hero .hero-button-container { 59 | display: flex; 60 | flex-wrap: wrap; 61 | display: inline-flex; 62 | margin-top: var(--spectrum-global-dimension-size-225); 63 | gap: var(--spectrum-global-dimension-size-200, var(--spectrum-alias-size-200)); 64 | } 65 | 66 | 67 | @media screen and (max-width: 1024px) { 68 | main div.site-hero .site-hero-content{ 69 | padding: 0 var(--spectrum-global-dimension-size-400); 70 | } 71 | 72 | main .site-hero img { 73 | width: 100%; 74 | height: 350px; 75 | object-fit: cover; 76 | } 77 | 78 | main .xl .xl-img{ 79 | width: 100%; 80 | height: 624px !important; 81 | object-fit: cover; 82 | } 83 | } 84 | 85 | 86 | @media screen and (max-width: 768px) { 87 | main div.site-hero { 88 | position: relative; 89 | width: 100%; 90 | height: 100vh !important 91 | } 92 | 93 | main .xl div.site-hero { 94 | position: relative; 95 | width: 100%; 96 | height: 100vh !important; 97 | } 98 | 99 | main div.site-hero img { 100 | overflow-clip-margin: content-box; 101 | overflow: clip; 102 | height: 100vh !important; 103 | } 104 | 105 | main div.site-hero .xl-img { 106 | overflow-clip-margin: content-box; 107 | overflow: clip; 108 | height: 100vh !important; 109 | } 110 | } -------------------------------------------------------------------------------- /hlx_statics/blocks/announcement/announcement.css: -------------------------------------------------------------------------------- 1 | main div.announcement-container { 2 | width: 100%; 3 | background: var(--spectrum-global-color-gray-100); 4 | box-sizing: border-box; 5 | text-align: center; 6 | padding: var(--spectrum-global-dimension-size-400); 7 | } 8 | 9 | main div.section.video-enabled.announcement-container{ 10 | height: calc(var(--spectrum-global-dimension-size-2000) + var(--spectrum-global-dimension-size-125)); 11 | } 12 | 13 | @media screen and (max-width: 1280px) { 14 | main div.announcement-container { 15 | height: auto; 16 | } 17 | } 18 | 19 | 20 | main .section.video-enabled + .columns-container > .columns-wrapper > div.columns.block > div > div:first-of-type + div { 21 | display:flex; 22 | margin-top: var(--spectrum-global-dimension-size-1250); 23 | } 24 | 25 | main div.announcement-container > div { 26 | width: 100%; 27 | } 28 | 29 | main div.announcement-container > div { 30 | width: 100%; 31 | } 32 | 33 | main div.announcement .announce-heading { 34 | margin-top: 0 !important; 35 | margin-bottom: var(--spectrum-global-dimension-size-100) !important; 36 | } 37 | 38 | main div.announcement.block { 39 | margin: auto; 40 | max-width: calc( calc(12 * var(--spectrum-global-dimension-static-grid-fixed-max-width) / var(--spectrum-global-dimension-static-grid-columns) - var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-150)) ); 41 | } 42 | 43 | main div.announcement p { 44 | margin-top: 0; 45 | margin-left: 20%; 46 | margin-right: 20%; 47 | } 48 | 49 | @media screen and (max-width: 768px) { 50 | main div.announcement p { 51 | margin-left: 0%; 52 | margin-right: 0%; 53 | } 54 | } 55 | 56 | main div.announcement p.announce-link { 57 | margin-top: var(--spectrum-global-dimension-size-200) 58 | } 59 | 60 | main div.announcement p:last-child { 61 | margin-bottom: 0; 62 | } 63 | 64 | main div.announcement-container > div { 65 | width: 100%; 66 | } 67 | 68 | main div.announcement-container > div { 69 | width: 100%; 70 | } 71 | 72 | main div.announcement .announce-heading { 73 | margin-top: 0 !important; 74 | margin-bottom: var(--spectrum-global-dimension-size-100) !important; 75 | } 76 | 77 | main div.announcement.block { 78 | margin: auto; 79 | max-width: calc( calc(12 * var(--spectrum-global-dimension-static-grid-fixed-max-width) / var(--spectrum-global-dimension-static-grid-columns) - var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-150)) ); 80 | } 81 | 82 | main div.announcement p { 83 | margin-top: 0; 84 | } 85 | 86 | main div.announcement p.announce-link { 87 | margin-top: var(--spectrum-global-dimension-size-200) 88 | } 89 | 90 | main div.announcement p:last-child { 91 | margin-bottom: 0; 92 | } 93 | -------------------------------------------------------------------------------- /hlx_statics/icons/lightroom-classic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Asset 180 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /hlx_statics/blocks/mini-resource-card/mini-resource-card.js: -------------------------------------------------------------------------------- 1 | import {createTag, removeEmptyPTags, applyBkgColorOverride, applySectionTitle, applyAnalyticHeaderOverride} from '../../scripts/lib-adobeio.js'; 2 | 3 | /** 4 | * Returns the HTML for a mini resource card 5 | * @param {*} linkHref The link to the resource 6 | * @param {*} heading The heading text of the card 7 | * @param {*} text The text of the card 8 | * @returns The resource card HTML 9 | */ 10 | function getMiniResourceCard(linkHref, heading, text) { 11 | if(text === undefined){ //no body just heading 12 | return ` 13 | 14 |
15 | 16 |
17 |
18 |

19 | ${heading} 20 |

21 |
`; 22 | }else{ 23 | return ` 24 |
25 |
26 | 27 |
28 |
29 |

30 | ${heading} 31 |

32 |

33 | ${text} 34 |

35 |
`; 36 | } 37 | } 38 | 39 | /** 40 | * decorates the mini-resource-card 41 | * @param {Element} block The mini-resource-card block element 42 | */ 43 | export default async function decorate(block) { 44 | block.setAttribute('daa-lh', 'mini resource card'); 45 | const grid_div = createTag('div', {class: 'card-container'}); 46 | block.querySelectorAll('.mini-resource-card > div').forEach((resource) => { 47 | removeEmptyPTags(resource); 48 | grid_div.appendChild(resource); 49 | 50 | //create spectrum cards 51 | const linkHref = resource.querySelector('a')?.href; 52 | const heading = resource.querySelector('a')?.innerText; 53 | const text = resource.querySelector('p')?.innerText; 54 | const picture = resource.querySelector('picture'); 55 | const img = resource.querySelector('img'); 56 | img.setAttribute('class', 'image-mini'); 57 | 58 | resource.innerHTML = getMiniResourceCard(linkHref, heading, text); 59 | const pictureContainer = resource.querySelector('.mini-resource-card-image-container'); 60 | pictureContainer.append(picture); 61 | 62 | }); 63 | block.appendChild(grid_div); 64 | applyBkgColorOverride(block); 65 | applySectionTitle(block); 66 | applyAnalyticHeaderOverride(block); 67 | } -------------------------------------------------------------------------------- /hlx_statics/icons/cloudservices.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /hlx_statics/blocks/mini-resource-card/mini-resource-card.css: -------------------------------------------------------------------------------- 1 | main div.mini-resource-card .card-container { 2 | display: grid; 3 | grid-template-columns: repeat(3, 1fr); 4 | column-gap: 10px; 5 | row-gap: 10px; 6 | margin-top: auto; 7 | margin: auto!important; 8 | width: 1280px !important; 9 | } 10 | 11 | main div.mini-resource-card .mini-card { 12 | display: flex; 13 | flex-direction: row; 14 | text-decoration: none!important; 15 | 16 | padding: 0; 17 | justify-self: center; 18 | align-self: center; 19 | grid-column-start: auto; 20 | grid-column-end: auto; 21 | grid-row-start: auto; 22 | grid-row-end: auto; 23 | border: none !important; 24 | margin: 0!important; 25 | width: 420px !important; 26 | height: 100px !important; 27 | box-shadow: 0 9px 15px 5px #e6e6e6; 28 | } 29 | 30 | main div.mini-resource-card .mini-resource-card-image-container { 31 | margin: 0!important; 32 | height: 100px !important; 33 | width: 100px!important; 34 | } 35 | 36 | main div.mini-resource-card .image-mini { 37 | height: 100px !important; 38 | width: auto !important; 39 | object-fit: cover; 40 | } 41 | 42 | main div.mini-resource-card .mini-resource-card-body { 43 | display: flex; 44 | flex-direction: column; 45 | justify-content: center; 46 | 47 | border: none!important; 48 | height: 100px !important; 49 | width: 320px !important; 50 | padding: 0 0 0 4%!important 51 | } 52 | 53 | main div.mini-resource-card-container .section-title { 54 | margin: var(--spectrum-global-dimension-size-600) 0 var(--spectrum-global-dimension-size-400) 0; 55 | } 56 | 57 | @media screen and (max-width: 1280px) { 58 | main div.mini-resource-card .card-container { 59 | grid-template-columns: repeat(2, 1fr); 60 | width: 90% !important; 61 | column-gap: 10px; 62 | row-gap: 10px; 63 | margin: auto!important; 64 | } 65 | 66 | main div.mini-resource-card .mini-card { 67 | width: auto !important; 68 | height: 100px !important; 69 | } 70 | 71 | main div.mini-resource-card .mini-resource-card-body { 72 | height: 100px !important; 73 | width: auto !important; 74 | } 75 | } 76 | 77 | @media screen and (max-width: 768px) { 78 | main div.mini-resource-card .card-container { 79 | grid-template-columns: repeat(1, 1fr); 80 | margin: auto !important; 81 | margin-top: auto; 82 | 83 | width: 80% !important; 84 | } 85 | 86 | main div.mini-resource-card .mini-card { 87 | width: auto !important; 88 | height: 100px !important; 89 | } 90 | 91 | main div.mini-resource-card .mini-resource-card-body { 92 | height: 100px !important; 93 | width: auto !important; 94 | } 95 | } 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /tools/preview/experimentation-preview.css: -------------------------------------------------------------------------------- 1 | .hlx-preview-overlay { 2 | z-index: 99; 3 | position: fixed; 4 | bottom: 32px; 5 | right: 32px; 6 | color: #eee; 7 | font-weight: 600; 8 | font-size: 24px; 9 | } 10 | 11 | .hlx-badge { 12 | border-radius: 32px; 13 | background-color: #888; 14 | color: #eee; 15 | padding: 16px 32px; 16 | cursor: pointer; 17 | display: flex; 18 | align-items: center; 19 | position: relative; 20 | } 21 | 22 | .hlx-badge .hlx-open { 23 | box-sizing: border-box; 24 | position: relative; 25 | display: block; 26 | width: 22px; 27 | height: 22px; 28 | border: 2px solid; 29 | border-radius: 100px; 30 | margin-left: 16px; 31 | } 32 | 33 | .hlx-badge .hlx-open::after { 34 | content: ""; 35 | display: block; 36 | box-sizing: border-box; 37 | position: absolute; 38 | width: 6px; 39 | height: 6px; 40 | border-top: 2px solid; 41 | border-right: 2px solid; 42 | transform: rotate(-45deg); 43 | left: 6px; 44 | bottom: 5px; 45 | } 46 | 47 | .hlx-badge.hlx-testing { 48 | background-color: #fa0f00; 49 | color: #fff; 50 | } 51 | 52 | .hlx-popup { 53 | position: absolute; 54 | bottom: 64px; 55 | right: 0; 56 | background-color: #444; 57 | min-width: 300px; 58 | border-radius: 16px; 59 | box-shadow: 0 0 10px #000; 60 | font-size: 12px; 61 | } 62 | 63 | .hlx-popup a:any-link { 64 | color: #eee; 65 | border: 2px solid; 66 | padding: 5px 12px; 67 | display: inline-block; 68 | border-radius: 20px; 69 | text-decoration: none; 70 | } 71 | 72 | .hlx-popup .hlx-popup-header { 73 | display: flex; 74 | justify-content: space-between; 75 | background-color: #222; 76 | border-radius: 16px 16px 0 0; 77 | padding: 24px 16px; 78 | } 79 | 80 | .hlx-popup h4, .hlx-popup h5 { 81 | margin: 0; 82 | } 83 | 84 | .hlx-popup h4 { 85 | font-size: 16px; 86 | } 87 | 88 | .hlx-popup h5 { 89 | font-size: 14px; 90 | } 91 | 92 | 93 | .hlx-popup p { 94 | margin: 0; 95 | } 96 | 97 | .hlx-popup::before { 98 | content: ''; 99 | width: 0; 100 | height: 0; 101 | position: absolute; 102 | border-left: 15px solid transparent; 103 | border-right: 15px solid transparent; 104 | border-top: 15px solid #444; 105 | bottom: -15px; 106 | right: 30px; 107 | } 108 | 109 | .hlx-hidden { 110 | display: none; 111 | } 112 | 113 | .hlx-badge.hlx-experiment-status-active { 114 | background-color: #280; 115 | } 116 | 117 | .hlx-variant { 118 | margin: 16px; 119 | display: flex; 120 | padding: 16px; 121 | border-radius: 16px; 122 | } 123 | 124 | .hlx-variant-selected { 125 | background-color: #666; 126 | } 127 | 128 | .hlx-variant > div { 129 | flex: 1 1 auto; 130 | } 131 | 132 | .hlx-variant > div.hlx-button { 133 | flex: 0 0 auto; 134 | } 135 | -------------------------------------------------------------------------------- /hlx_statics/icons/dreamweaver.svg: -------------------------------------------------------------------------------- 1 | Asset 107 -------------------------------------------------------------------------------- /hlx_statics/blocks/footer/footer.js: -------------------------------------------------------------------------------- 1 | import { readBlockConfig } from '../../scripts/lib-helix.js'; 2 | import { 3 | createTag, 4 | setExpectedOrigin, 5 | } from '../../scripts/lib-adobeio.js'; 6 | 7 | function buildFooter(html) { 8 | const footer = createTag('div', { class: 'footer-links-container' }); 9 | const footerInnerContainer = createTag('div', { class: 'footer-links-container-inner' }); 10 | const horizontalDivider = createTag('div', { class: 'spectrum-Divider spectrum-Divider--sizeM footer-horizontal' }); 11 | const footerLegal = createTag('div', { class: 'footer-legal' }); 12 | footerInnerContainer.innerHTML = html; 13 | footerLegal.append(footerInnerContainer.querySelector('div:nth-child(5)')); 14 | footerLegal.append(footerInnerContainer.querySelector('div:nth-child(5)')); 15 | 16 | footerInnerContainer.querySelectorAll('div').forEach((footerColumn) => { 17 | const footerColumnWrapper = createTag('div'); 18 | footerColumnWrapper.append(footerColumn); 19 | const footerDivider = createTag('div', { class: 'footer-divider' }); 20 | const divider = createTag('div', { class: 'spectrum-Divider spectrum-Divider--sizeM spectrum-Divider--vertical' }); 21 | divider.setAttribute('style', 'height: 100%; align-self: stretch;'); 22 | footerDivider.append(divider); 23 | footerColumnWrapper.append(footerDivider); 24 | footerInnerContainer.append(footerColumnWrapper); 25 | }); 26 | footerInnerContainer.querySelector('div:last-child > .footer-divider').remove(); 27 | 28 | footer.append(footerInnerContainer); 29 | footer.append(horizontalDivider); 30 | footer.append(footerLegal); 31 | return footer; 32 | } 33 | 34 | /** 35 | * loads and decorates the footer 36 | * @param {Element} block The footer block element 37 | */ 38 | 39 | export default async function decorate(block) { 40 | block.setAttribute('daa-lh', 'footer'); 41 | const cfg = readBlockConfig(block); 42 | block.textContent = ''; 43 | const footerPath = cfg.footer || setExpectedOrigin(window.location.origin, '/franklin_assets/footer'); 44 | const resp = await fetch(`${footerPath}.plain.html`); 45 | const html = await resp.text(); 46 | block.classList.add('footer-links-container'); 47 | block.append(buildFooter(html)); 48 | 49 | block.querySelectorAll('.footer-links-container-inner ul').forEach((ul) => { 50 | ul.className = 'spectrum-Body spectrum-Body--sizeS'; 51 | }); 52 | block.querySelectorAll('h3').forEach((h3) => { 53 | h3.className = 'spectrum-Heading--sizeXS'; 54 | }); 55 | block.querySelector('.footer-legal ul').className = 'spectrum-Body spectrum-Body--sizeXS'; 56 | block.querySelectorAll('a').forEach((a) => { 57 | const className = a.parentElement.tagName === 'STRONG' 58 | ? 'spectrum-Link spectrum-Link--quiet' 59 | : 'spectrum-Link spectrum-Link--secondary spectrum-Link--quiet'; 60 | a.className = className; 61 | }); 62 | block.querySelectorAll('div.footer-legal > div > p').forEach((p) => { 63 | p.className = 'spectrum-Body spectrum-Body--sizeXS footer-date'; 64 | }); 65 | } 66 | -------------------------------------------------------------------------------- /hlx_statics/blocks/embed/embed.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Embed Block 3 | * Show videos and social posts directly on your page 4 | * https://www.hlx.live/developer/block-collection/embed 5 | */ 6 | 7 | import { decorateLightOrDark } from '../../scripts/lib-helix.js'; 8 | import { applyBkgColorOverride, applyAnalyticHeaderOverride } from '../../scripts/lib-adobeio.js'; 9 | 10 | /** 11 | * Gets the video id from the authored URL and inserts the Youtube embed 12 | * The iframe is not loaded until the users moves the pointer over the thumbnail image 13 | * Or eventually with a delay of 3 seconds (see delayed.js) 14 | * @param {*} url The authored URL 15 | * @returns The HTML to embed 16 | */ 17 | const embedYoutube = (url) => { 18 | const usp = new URLSearchParams(url.search); 19 | let vid = encodeURIComponent(usp.get('v')); 20 | const embed = url.pathname; 21 | if (url.origin.includes('youtu.be')) { 22 | [, vid] = url.pathname.split('/'); 23 | } 24 | const embedHTML = `
25 | 27 | 28 | 29 |
`; 30 | return embedHTML; 31 | }; 32 | 33 | /** 34 | * Decorates the block with the embedded HTML 35 | * Sets the event listener for pointer over thumbnail image 36 | * @param {*} block The block to decorate 37 | * @param {*} a The authored link 38 | * @returns Exits early if the embed is already loaded 39 | */ 40 | const loadEmbed = (block, a) => { 41 | if (block.classList.contains('embed-is-loaded')) { 42 | return; 43 | } 44 | decorateLightOrDark(block, true); 45 | block.className = 'block embed embed-youtube'; 46 | const link = a.href; 47 | const url = new URL(link); 48 | a.insertAdjacentHTML('afterend', embedYoutube(url)); 49 | a.remove(); 50 | block.classList.add('embed-is-loaded'); 51 | 52 | const videoListener = () => { 53 | const iframe = block.querySelector('iframe'); 54 | if (!iframe.src) { 55 | iframe.src = iframe.getAttribute('data-src'); 56 | iframe.onload = () => { iframe.style.opacity = 1; }; 57 | } 58 | block.removeEventListener('mouseover', videoListener); 59 | }; 60 | block.addEventListener('mouseover', videoListener); 61 | applyBkgColorOverride(block); 62 | const wid = block?.parentElement?.parentElement?.getAttribute('data-width'); 63 | if (wid) { 64 | block.classList.add('embed-custom-width'); 65 | block.firstChild.firstChild.style.width = wid; 66 | } 67 | }; 68 | 69 | /** 70 | * Decorates the embed 71 | * @param {*} block The embed block 72 | */ 73 | export default async function decorate(block) { 74 | block.setAttribute('daa-lh', 'embed'); 75 | applyAnalyticHeaderOverride(block); 76 | const a = block.querySelector('a'); 77 | loadEmbed(block, a); 78 | } 79 | -------------------------------------------------------------------------------- /hlx_statics/blocks/resource-card/resource-card.css: -------------------------------------------------------------------------------- 1 | .resource-cards-container { 2 | display: flex; 3 | } 4 | 5 | @media screen and (max-width: 1280px) { 6 | .resource-cards-container { 7 | flex-wrap: wrap; 8 | flex-direction: column; 9 | } 10 | } 11 | 12 | .resource-cards-left { 13 | display: flex; 14 | } 15 | 16 | div.resource-cards-left > a.resource-card-large-container-inner { 17 | margin-right: 0 !important; 18 | } 19 | 20 | @media screen and (min-width: 1280px) { 21 | div.resource-cards-left > a.resource-card-large-container-inner { 22 | width: 100%; 23 | } 24 | .resource-cards-left, .resource-cards-right { 25 | width: 50% 26 | } 27 | } 28 | 29 | .resource-cards-right { 30 | display: flex; 31 | flex-direction: column; 32 | } 33 | 34 | main div.resource-card-container { 35 | max-width: 1280px; 36 | margin: auto; 37 | } 38 | 39 | main div.resource-card { 40 | width: var(--spectrum-global-dimension-static-grid-fluid-width); 41 | background: var(--spectrum-global-color-gray-100); 42 | display: flex; 43 | justify-content: center; 44 | flex-direction: row; 45 | } 46 | 47 | main div.resource-card > div { 48 | width: 400px; 49 | } 50 | 51 | @media screen and (max-width: 1280px) { 52 | main div.resource-card { 53 | flex-direction: column; 54 | flex-wrap: wrap; 55 | align-items: center; 56 | } 57 | 58 | main div.resource-card > div { 59 | min-width: var(--spectrum-global-dimension-size-4600); 60 | } 61 | 62 | main div.resource-card > div:first-child { 63 | padding-left: 0 !important; 64 | } 65 | main div.resource-card > div:nth-child(2){ 66 | padding-left: 0; 67 | padding-right: 0; 68 | } 69 | 70 | main div.resource-card-image-container img { 71 | object-fit: cover; 72 | width: 100% !important; 73 | } 74 | } 75 | 76 | main div.resource-card > div{ 77 | padding: 24px; 78 | } 79 | 80 | main div.resource-card-preview { 81 | height: 200px; 82 | width: 100%; 83 | padding: 0 !important; 84 | } 85 | 86 | main div.resource-card-image-container { 87 | display: flex; 88 | align-items: center; 89 | justify-content: center; 90 | height: 100%; 91 | margin-bottom: 0 !important; 92 | margin-top: 0; 93 | } 94 | 95 | main div.resource-card-image-container img { 96 | object-fit: cover; 97 | width: 400px; 98 | } 99 | 100 | main div.resource-card-body { 101 | flex: 1; 102 | padding-top: 16px 16px 24px 16px !important; 103 | justify-content: flex-start !important; 104 | overflow: hidden; 105 | } 106 | 107 | main div.resource-card-header { 108 | height: auto; 109 | width: 100%; 110 | } 111 | 112 | main div.resource-card-title { 113 | white-space: normal; 114 | text-align: left; 115 | } 116 | 117 | main div.resource-card-content { 118 | margin-bottom: 24px !important; 119 | padding-bottom: 12px; 120 | } 121 | 122 | main div.resource-card h3 { 123 | margin-top: 0 !important; 124 | margin-bottom: 0 !important; 125 | } 126 | 127 | main div.resource-card p { 128 | text-align: left; 129 | color: var(--spectrum-global-color-gray-700); 130 | margin-top: 0; 131 | } 132 | -------------------------------------------------------------------------------- /hlx_statics/blocks/hero/hero.css: -------------------------------------------------------------------------------- 1 | main div.hero { 2 | background: var(--spectrum-global-color-gray-50); 3 | height: calc(var(--spectrum-global-dimension-size-6000) + var(--spectrum-global-dimension-size-250)); 4 | overflow: hidden; 5 | display: flex; 6 | justify-content: center; 7 | } 8 | 9 | main div.hero-container { 10 | padding: 0; 11 | } 12 | 13 | @media screen and (max-width: 768px) { 14 | main div.hero { 15 | height: auto; 16 | padding: var(--spectrum-global-dimension-size-400); 17 | } 18 | } 19 | 20 | main div.hero > div:first-child { 21 | display: flex; 22 | flex-direction: column; 23 | justify-content: center; 24 | width: calc(5 * 100% / 12); 25 | 26 | margin-left: var(--spectrum-global-dimension-size-800); 27 | margin-right: var(--spectrum-global-dimension-size-400); 28 | } 29 | 30 | @media screen and (max-width: 768px) { 31 | main div.hero > div:first-child { 32 | width: 100%; 33 | margin: 0; 34 | } 35 | } 36 | 37 | main div.hero div:nth-child(2) { 38 | flex: 1; 39 | } 40 | 41 | @media screen and (max-width: 768px) { 42 | main div.hero div:nth-child(2) { 43 | display: none; 44 | } 45 | } 46 | 47 | main div.hero div:nth-child(2) > div { 48 | display: flex; 49 | align-items: center; 50 | justify-content: center; 51 | height: 100%; 52 | margin-top: 0; 53 | } 54 | 55 | main div.hero div:nth-child(2) > div img { 56 | width: 100%; 57 | height: 100%; 58 | object-fit: cover; 59 | border-radius: 0; 60 | min-height: 500px; 61 | } 62 | 63 | main .hero .icon-container { 64 | height: var(--spectrum-global-dimension-size-600); 65 | width: var(--spectrum-global-dimension-size-600); 66 | margin-top: 0 !important; 67 | margin-bottom: var(--spectrum-global-dimension-size-300) !important; 68 | } 69 | 70 | main .hero span.icon { 71 | display: none; 72 | } 73 | 74 | main .hero .icon { 75 | height: 100%; 76 | object-fit: contain; 77 | } 78 | 79 | main .hero h3 { 80 | margin-top: 0; 81 | margin-bottom: var(--spectrum-global-dimension-size-200); 82 | } 83 | 84 | main .hero p.spectrum-Body--sizeL { 85 | margin-top: 0 !important; 86 | font-size: var(--spectrum-global-dimension-size-225); 87 | color: var(--spectrum-global-color-gray-800) !important; 88 | } 89 | 90 | main .hero h1 + p.last-of-type { 91 | margin-bottom: 0 !important; 92 | } 93 | 94 | main .hero .hero-button-container { 95 | display: flex; 96 | flex-wrap: wrap; 97 | 98 | margin-top: var(--spectrum-global-dimension-size-300); 99 | gap: var(--spectrum-global-dimension-size-200); 100 | } 101 | 102 | @media screen and (max-width: 768px) { 103 | main div.hero { 104 | overflow: auto; 105 | height: 100vh; 106 | } 107 | main div.hero .spectrum-Heading--sizeXXL { 108 | font-size: var(--spectrum-alias-heading-xl-text-size); 109 | } 110 | 111 | main .hero picture { 112 | display: none; 113 | } 114 | } 115 | 116 | 117 | @media screen and (max-width: 768px) { 118 | main div.hero > div:first-child { 119 | width: 100%; 120 | margin: 0; 121 | } 122 | } 123 | 124 | @media screen and (max-width: 768px) { 125 | main div.hero { 126 | height: 100%; 127 | } 128 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Project Helix 2 | 3 | This project (like almost all of Project Helix) is an Open Development project and welcomes contributions from everyone who finds it useful or lacking. 4 | 5 | ## Code Of Conduct 6 | 7 | This project adheres to the Adobe [code of conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to cstaub at adobe dot com. 8 | 9 | ## Contributor License Agreement 10 | 11 | All third-party contributions to this project must be accompanied by a signed contributor license. This gives Adobe permission to redistribute your contributions as part of the project. [Sign our CLA](http://opensource.adobe.com/cla.html)! You only need to submit an Adobe CLA one time, so if you have submitted one previously, you are good to go! 12 | 13 | ## Things to Keep in Mind 14 | 15 | This project uses a **commit then review** process, which means that for approved maintainers, changes can be merged immediately, but will be reviewed by others. 16 | 17 | For other contributors, a maintainer of the project has to approve the pull request. 18 | 19 | # Before You Contribute 20 | 21 | * Check that there is an existing issue in GitHub issues 22 | * Check if there are other pull requests that might overlap or conflict with your intended contribution 23 | 24 | # How to Contribute 25 | 26 | 1. Fork the repository 27 | 2. Make some changes on a branch on your fork 28 | 3. Create a pull request from your branch 29 | 30 | In your pull request, outline: 31 | 32 | * What the changes intend 33 | * How they change the existing code 34 | * If (and what) they breaks 35 | * Start the pull request with the GitHub issue ID, e.g. #123 36 | 37 | Lastly, please follow the [pull request template](.github/pull_request_template.md) when submitting a pull request! 38 | 39 | Each commit message that is not part of a pull request: 40 | 41 | * Should contain the issue ID like `#123` 42 | * Can contain the tag `[trivial]` for trivial changes that don't relate to an issue 43 | 44 | 45 | 46 | ## Coding Styleguides 47 | 48 | We enforce a coding styleguide using `eslint`. As part of your build, run `npm run lint` to check if your code is conforming to the style guide. We do the same for every PR in our CI, so PRs will get rejected if they don't follow the style guide. 49 | 50 | You can fix some of the issues automatically by running `npx eslint . --fix`. 51 | 52 | ## Commit Message Format 53 | 54 | This project uses a structured commit changelog format that should be used for every commit. Use `npm run commit` instead of your usual `git commit` to generate commit messages using a wizard. 55 | 56 | ```bash 57 | # either add all changed files 58 | $ git add -A 59 | # or selectively add files 60 | $ git add package.json 61 | # then commit using the wizard 62 | $ npm run commit 63 | ``` 64 | 65 | # How Contributions get Reviewed 66 | 67 | One of the maintainers will look at the pull request within one week. Feedback on the pull request will be given in writing, in GitHub. 68 | 69 | # Release Management 70 | 71 | The project's committers will release to the [Adobe organization on npmjs.org](https://www.npmjs.com/org/adobe). 72 | Please contact the [Adobe Open Source Advisory Board](https://git.corp.adobe.com/OpenSourceAdvisoryBoard/discuss/issues) to get access to the npmjs organization. 73 | 74 | The release process is fully automated using `semantic-release`, increasing the version numbers, etc. based on the contents of the commit messages found. 75 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Adobe Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at Grp-opensourceoffice@adobe.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ -------------------------------------------------------------------------------- /hlx_statics/blocks/carousel/carousel.css: -------------------------------------------------------------------------------- 1 | picture { 2 | width: 100%; 3 | height: 100%; 4 | display: flex; 5 | } 6 | 7 | picture img { 8 | object-fit: cover; 9 | height: auto; 10 | width: 100%; 11 | } 12 | 13 | main div.carousel .image-container { 14 | height: 300px; 15 | max-width: 602px; 16 | } 17 | 18 | main div.carousel { 19 | width: var(--spectrum-global-dimension-static-grid-fixed-max-width); 20 | margin: auto; 21 | } 22 | 23 | main div.carousel .block-container { 24 | display: flex; 25 | flex-direction: row ; 26 | justify-content: center; 27 | align-content: space-between; 28 | position: relative; 29 | } 30 | 31 | main div.carousel .carousel-heading { 32 | margin-top: 1 !important; 33 | margin-bottom: var(--spectrum-global-dimension-size-100) !important; 34 | } 35 | 36 | main div.carousel .carousel-container { 37 | display: flex; 38 | flex-direction: row-reverse; 39 | justify-content: center; 40 | align-content: space-between; 41 | } 42 | 43 | main div.carousel .left-container { 44 | flex: 0 1 50%; 45 | min-height: 100%; 46 | max-width: 50%; 47 | padding: 0 var(--spectrum-global-dimension-size-100); 48 | } 49 | 50 | main div.carousel .right-container { 51 | display: flex; 52 | flex-direction: column; 53 | justify-content: center; 54 | flex: 0 1 50%; 55 | min-height: 100%; 56 | max-width: 50%; 57 | padding: 0 var(--spectrum-global-dimension-size-400); 58 | } 59 | 60 | main div.carousel .carousel-button-container { 61 | display: flex; 62 | flex-direction: row !important; 63 | margin-top: var(--spectrum-global-dimension-size-100); 64 | gap: var(--spectrum-global-dimension-size-200); 65 | } 66 | 67 | main div.carousel .slider-wrapper { 68 | position: relative; 69 | overflow: hidden; 70 | transition-property: transform; 71 | box-sizing: content-box; 72 | align-items: center; 73 | } 74 | 75 | main div.carousel .slides-container { 76 | width: 100%; 77 | display: flex; 78 | list-style: none; 79 | margin: 1; 80 | padding: 0; 81 | margin-bottom: 1; 82 | margin-top: 1; 83 | overflow: hidden; 84 | scroll-behavior: smooth; 85 | } 86 | 87 | main div.carousel .slide { 88 | width: 100%; 89 | height: 100%; 90 | flex: 1 0 100%; 91 | } 92 | 93 | main div.carousel .slide-arrow { 94 | margin: auto; 95 | background-color: transparent; 96 | border: none; 97 | font-size: 5rem; 98 | color: #b3cef7; 99 | cursor: pointer; 100 | } 101 | 102 | main .carousel .slide-arrow:hover, 103 | main .carousel .slide-arrow:focus { 104 | color: #007aff; 105 | } 106 | 107 | main div.carousel .slides-container { 108 | scrollbar-width: none; /* Firefox */ 109 | -ms-overflow-style: none; /* Internet Explorer 10+ */ 110 | } 111 | 112 | /* WebKit */ 113 | main div.carousel .slides-container::-webkit-scrollbar { 114 | width: 0; 115 | height: 0; 116 | } 117 | 118 | main div.carousel .carousel-circle-div { 119 | display: flex; 120 | flex-direction: row; 121 | justify-content: center; 122 | align-items: center; 123 | } 124 | 125 | main div.carousel .carousel-circle { 126 | background-color: #c6c6c6; 127 | border: none; 128 | border-radius: 100%; 129 | width: 12px; 130 | height: 12px; 131 | margin: 4px 2px; 132 | cursor: pointer; 133 | } 134 | 135 | main div.carousel .carousel-circle-selected { 136 | background-color: #007aff !important; 137 | } 138 | -------------------------------------------------------------------------------- /hlx_statics/blocks/iframe/iframe.js: -------------------------------------------------------------------------------- 1 | import { 2 | createTag, 3 | addExtraScriptWithReturn 4 | } from '../../scripts/lib-adobeio.js'; 5 | 6 | function penpalOnLoad() { 7 | const createConnection = () => { 8 | const penpalIframe = document.querySelector('#penpalIframe'); 9 | const connection = window.Penpal.connectToChild({ 10 | // The iframe to which a connection should be made 11 | iframe: penpalIframe, 12 | // Manually set origin as auto-detection may fail, as the src of the iframe is set later 13 | //childOrigin: isExternalLink(src) ? new URL(src).origin : window.origin, 14 | // Methods the parent is exposing to the child 15 | methods: { 16 | scrollTop(position = 0) { 17 | if (document?.scrollingElement) { 18 | document.scrollingElement.scrollTop = position; 19 | } 20 | }, 21 | getURL() { 22 | return window?.location?.href; 23 | }, 24 | setURL(url) { 25 | if (window?.location) { 26 | window.location = url; 27 | } 28 | }, 29 | setHeight(height) { 30 | penpalIframe.style.height = height; 31 | }, 32 | getIMSAccessToken() { 33 | if (window.adobeIMS?.isSignedInUser()) { 34 | return window.adobeIMS.getAccessToken(); 35 | } 36 | 37 | return null; 38 | }, 39 | getIMSProfile() { 40 | if (window.adobeIMS?.isSignedInUser()) { 41 | return window.adobeIMS.getProfile(); 42 | } 43 | 44 | return null; 45 | }, 46 | signIn() { 47 | if (window.adobeIMS && !window.adobeIMS.isSignedInUser()) { 48 | window.adobeIMS.signIn(); 49 | } 50 | }, 51 | signOut() { 52 | if (window.adobeIMS && window.adobeIMS.isSignedInUser()) { 53 | window.adobeIMS.signOut(); 54 | } 55 | }, 56 | getIMSClientId() { 57 | if (window.adobeIMS) { 58 | return window.adobeIMS.adobeIdData.client_id; 59 | } else { 60 | return null; 61 | } 62 | }, 63 | onSignIn(signinCallback) { 64 | window.addEventListener('imsSignIn', signinCallback); 65 | } 66 | } 67 | }); 68 | 69 | connection.promise.then((child) => { 70 | if (penpalIframe.clientHeight === 0) { 71 | child.onHide(); 72 | } else { 73 | child.onShow(); 74 | } 75 | }); 76 | 77 | return connection; 78 | }; 79 | 80 | if (window.Penpal) { 81 | const connection = createConnection(); 82 | } 83 | } 84 | 85 | /** 86 | * decorates the iframe 87 | * @param {Element} block The hero block element 88 | */ 89 | export default async function decorate(block) { 90 | const penpalScript = addExtraScriptWithReturn(document.body, 'https://unpkg.com/penpal@^6/dist/penpal.min.js'); 91 | const iframeSrc = block.querySelector('a'); 92 | const iframeContainer = block.parentElement; 93 | const iframe = createTag('iframe', { class: 'iframe-container', 'src': iframeSrc.href, 'id': 'penpalIframe' }); 94 | penpalScript.onload = () => { 95 | iframeContainer.append(iframe); 96 | penpalOnLoad(); 97 | } 98 | block.remove(); 99 | } 100 | 101 | -------------------------------------------------------------------------------- /hlx_statics/blocks/video-carousel/video-carousel.css: -------------------------------------------------------------------------------- 1 | picture { 2 | width: 100%; 3 | height: 100%; 4 | display: flex; 5 | } 6 | 7 | picture img { 8 | object-fit: cover; 9 | height: auto; 10 | width: 100%; 11 | } 12 | 13 | main div.video-carousel .image-container { 14 | height: 300px; 15 | max-width: 602px; 16 | } 17 | 18 | main div.video-carousel { 19 | max-width: var(--spectrum-global-dimension-static-grid-fixed-max-width); 20 | margin: auto; 21 | } 22 | 23 | main div.video-carousel .video-block-container { 24 | display: flex; 25 | flex-direction: row ; 26 | justify-content: center; 27 | align-content: space-between; 28 | position: relative; 29 | } 30 | 31 | main div.video-carousel .video-carousel-heading { 32 | margin-top: 1 !important; 33 | margin-bottom: var(--spectrum-global-dimension-size-100) !important; 34 | } 35 | 36 | main div.video-carousel .video-container { 37 | display: flex; 38 | flex-direction: row-reverse; 39 | justify-content: center; 40 | align-content: space-between; 41 | } 42 | 43 | main div.video-carousel .left-container { 44 | flex: 0 1 50%; 45 | min-height: 100%; 46 | max-width: 50%; 47 | padding: 0 var(--spectrum-global-dimension-size-100); 48 | } 49 | 50 | main div.video-carousel .right-container { 51 | display: flex; 52 | flex-direction: column; 53 | justify-content: center; 54 | flex: 0 1 50%; 55 | min-height: 100%; 56 | max-width: 50%; 57 | padding: 0 var(--spectrum-global-dimension-size-400); 58 | } 59 | 60 | main div.video-carousel .video-carousel-button-container { 61 | display: flex; 62 | flex-direction: row !important; 63 | margin-top: var(--spectrum-global-dimension-size-100); 64 | gap: var(--spectrum-global-dimension-size-200); 65 | } 66 | 67 | main div.video-carousel .video-slider-wrapper { 68 | position: relative; 69 | overflow: hidden; 70 | transition-property: transform; 71 | box-sizing: content-box; 72 | align-items: center; 73 | } 74 | 75 | main div.video-carousel .video-slides-container { 76 | width: 100%; 77 | display: flex; 78 | list-style: none; 79 | margin: 1; 80 | padding: 0; 81 | margin-bottom: 1; 82 | margin-top: 1; 83 | overflow: hidden; 84 | scroll-behavior: smooth; 85 | } 86 | 87 | main div.video-carousel .video-slide { 88 | width: 100%; 89 | height: 100%; 90 | flex: 1 0 100%; 91 | } 92 | 93 | main div.video-carousel .embed { 94 | margin-top: 0px; 95 | } 96 | 97 | main div.video-carousel .video-slide-arrow { 98 | margin: auto; 99 | background-color: transparent; 100 | border: none; 101 | font-size: 5rem; 102 | color: #b3cef7; 103 | cursor: pointer; 104 | } 105 | 106 | main .video-carousel .video-slide-arrow:hover, 107 | main .video-carousel .video-slide-arrow:focus { 108 | color: #007aff; 109 | } 110 | 111 | main div.video-carousel .video-slides-container { 112 | scrollbar-width: none; /* Firefox */ 113 | -ms-overflow-style: none; /* Internet Explorer 10+ */ 114 | } 115 | 116 | /* WebKit */ 117 | main div.video-carousel .video-slides-container::-webkit-scrollbar { 118 | width: 0; 119 | height: 0; 120 | } 121 | 122 | main div.video-carousel .video-carousel-circle-div { 123 | display: flex; 124 | flex-direction: row; 125 | justify-content: center; 126 | align-items: center; 127 | } 128 | 129 | main div.video-carousel .video-carousel-circle { 130 | background-color: #c6c6c6; 131 | border: none; 132 | border-radius: 100%; 133 | width: 12px; 134 | height: 12px; 135 | margin: 4px 2px; 136 | cursor: pointer; 137 | } 138 | 139 | main div.video-carousel .video-carousel-circle-selected { 140 | background-color: #007aff !important; 141 | } 142 | -------------------------------------------------------------------------------- /scripts/experimentation-ued.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | var LOCAL_STORAGE_KEY = 'unified-decisioning-experiments'; 3 | function assignTreatment(allocationPercentages, treatments) { 4 | var random = Math.random() * 100; 5 | var i = treatments.length; 6 | while (random > 0 && i > 0) { 7 | i -= 1; 8 | random -= +allocationPercentages[i]; 9 | } 10 | return treatments[i]; 11 | } 12 | function getLastExperimentTreatment(experimentId) { 13 | var experimentsStr = localStorage.getItem(LOCAL_STORAGE_KEY); 14 | if (experimentsStr) { 15 | var experiments = JSON.parse(experimentsStr); 16 | if (experiments[experimentId]) { 17 | return experiments[experimentId].treatment; 18 | } 19 | } 20 | return null; 21 | } 22 | function setLastExperimentTreatment(experimentId, treatment) { 23 | var experimentsStr = localStorage.getItem(LOCAL_STORAGE_KEY); 24 | var experiments = experimentsStr ? JSON.parse(experimentsStr) : {}; 25 | var now = new Date(); 26 | var expKeys = Object.keys(experiments); 27 | expKeys.forEach(function (key) { 28 | var date = new Date(experiments[key].date); 29 | if ((now.getTime() - date.getTime()) > (1000 * 86400 * 30)) { 30 | delete experiments[key]; 31 | } 32 | }); 33 | var date = now.toISOString().split('T')[0]; 34 | experiments[experimentId] = { treatment: treatment, date: date }; 35 | localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(experiments)); 36 | } 37 | function assignTreatmentByDevice(experimentId, allocationPercentages, treatments) { 38 | var cachedTreatmentId = getLastExperimentTreatment(experimentId); 39 | var treatmentIdResponse; 40 | if (!cachedTreatmentId) { 41 | var assignedTreatmentId = assignTreatment(allocationPercentages, treatments); 42 | setLastExperimentTreatment(experimentId, assignedTreatmentId); 43 | treatmentIdResponse = assignedTreatmentId; 44 | } 45 | else { 46 | treatmentIdResponse = cachedTreatmentId; 47 | } 48 | return { 49 | treatmentId: treatmentIdResponse 50 | }; 51 | } 52 | 53 | var RandomizationUnit = { 54 | VISITOR: 'VISITOR', 55 | DEVICE: 'DEVICE' 56 | }; 57 | function evaluateExperiment(context, experiment) { 58 | var experimentId = experiment.id, identityNamespace = experiment.identityNamespace, _a = experiment.randomizationUnit, randomizationUnit = _a === void 0 ? RandomizationUnit.VISITOR : _a; 59 | var identityMap = context.identityMap; 60 | var treatments = experiment.treatments.map(function (item) { return item.id; }); 61 | var allocationPercentages = experiment.treatments.map(function (item) { return item.allocationPercentage; }); 62 | var treatmentAssignment = null; 63 | switch (randomizationUnit) { 64 | case RandomizationUnit.DEVICE: { 65 | treatmentAssignment = assignTreatmentByDevice(experimentId, allocationPercentages, treatments); 66 | break; 67 | } 68 | default: 69 | throw new Error("Unknow randomization unit"); 70 | } 71 | var evaluationResponse = { 72 | experimentId: experimentId, 73 | hashedBucket: treatmentAssignment.bucketId, 74 | treatment: { 75 | id: treatmentAssignment.treatmentId 76 | } 77 | }; 78 | return evaluationResponse; 79 | } 80 | 81 | function traverseDecisionTree(decisionNodesMap, context, currentNodeId) { 82 | var _a = decisionNodesMap[currentNodeId], experiment = _a.experiment, type = _a.type; 83 | if (type === 'EXPERIMENTATION') { 84 | var treatment = evaluateExperiment(context, experiment).treatment; 85 | return [treatment]; 86 | } 87 | } 88 | 89 | function evaluateDecisionPolicy(decisionPolicy, context) { 90 | var decisionNodesMap = {}; 91 | decisionPolicy.decisionNodes.forEach(function (item) { 92 | decisionNodesMap[item['id']] = item; 93 | }); 94 | var items = traverseDecisionTree(decisionNodesMap, context, decisionPolicy.rootDecisionNodeId); 95 | return { 96 | items: items 97 | }; 98 | } 99 | 100 | export { evaluateDecisionPolicy }; 101 | -------------------------------------------------------------------------------- /hlx_statics/scripts/experimentation-ued.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | var LOCAL_STORAGE_KEY = 'unified-decisioning-experiments'; 3 | function assignTreatment(allocationPercentages, treatments) { 4 | var random = Math.random() * 100; 5 | var i = treatments.length; 6 | while (random > 0 && i > 0) { 7 | i -= 1; 8 | random -= +allocationPercentages[i]; 9 | } 10 | return treatments[i]; 11 | } 12 | function getLastExperimentTreatment(experimentId) { 13 | var experimentsStr = localStorage.getItem(LOCAL_STORAGE_KEY); 14 | if (experimentsStr) { 15 | var experiments = JSON.parse(experimentsStr); 16 | if (experiments[experimentId]) { 17 | return experiments[experimentId].treatment; 18 | } 19 | } 20 | return null; 21 | } 22 | function setLastExperimentTreatment(experimentId, treatment) { 23 | var experimentsStr = localStorage.getItem(LOCAL_STORAGE_KEY); 24 | var experiments = experimentsStr ? JSON.parse(experimentsStr) : {}; 25 | var now = new Date(); 26 | var expKeys = Object.keys(experiments); 27 | expKeys.forEach(function (key) { 28 | var date = new Date(experiments[key].date); 29 | if ((now.getTime() - date.getTime()) > (1000 * 86400 * 30)) { 30 | delete experiments[key]; 31 | } 32 | }); 33 | var date = now.toISOString().split('T')[0]; 34 | experiments[experimentId] = { treatment: treatment, date: date }; 35 | localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(experiments)); 36 | } 37 | function assignTreatmentByDevice(experimentId, allocationPercentages, treatments) { 38 | var cachedTreatmentId = getLastExperimentTreatment(experimentId); 39 | var treatmentIdResponse; 40 | if (!cachedTreatmentId) { 41 | var assignedTreatmentId = assignTreatment(allocationPercentages, treatments); 42 | setLastExperimentTreatment(experimentId, assignedTreatmentId); 43 | treatmentIdResponse = assignedTreatmentId; 44 | } 45 | else { 46 | treatmentIdResponse = cachedTreatmentId; 47 | } 48 | return { 49 | treatmentId: treatmentIdResponse 50 | }; 51 | } 52 | 53 | var RandomizationUnit = { 54 | VISITOR: 'VISITOR', 55 | DEVICE: 'DEVICE' 56 | }; 57 | function evaluateExperiment(context, experiment) { 58 | var experimentId = experiment.id, identityNamespace = experiment.identityNamespace, _a = experiment.randomizationUnit, randomizationUnit = _a === void 0 ? RandomizationUnit.VISITOR : _a; 59 | var identityMap = context.identityMap; 60 | var treatments = experiment.treatments.map(function (item) { return item.id; }); 61 | var allocationPercentages = experiment.treatments.map(function (item) { return item.allocationPercentage; }); 62 | var treatmentAssignment = null; 63 | switch (randomizationUnit) { 64 | case RandomizationUnit.DEVICE: { 65 | treatmentAssignment = assignTreatmentByDevice(experimentId, allocationPercentages, treatments); 66 | break; 67 | } 68 | default: 69 | throw new Error("Unknow randomization unit"); 70 | } 71 | var evaluationResponse = { 72 | experimentId: experimentId, 73 | hashedBucket: treatmentAssignment.bucketId, 74 | treatment: { 75 | id: treatmentAssignment.treatmentId 76 | } 77 | }; 78 | return evaluationResponse; 79 | } 80 | 81 | function traverseDecisionTree(decisionNodesMap, context, currentNodeId) { 82 | var _a = decisionNodesMap[currentNodeId], experiment = _a.experiment, type = _a.type; 83 | if (type === 'EXPERIMENTATION') { 84 | var treatment = evaluateExperiment(context, experiment).treatment; 85 | return [treatment]; 86 | } 87 | } 88 | 89 | function evaluateDecisionPolicy(decisionPolicy, context) { 90 | var decisionNodesMap = {}; 91 | decisionPolicy.decisionNodes.forEach(function (item) { 92 | decisionNodesMap[item['id']] = item; 93 | }); 94 | var items = traverseDecisionTree(decisionNodesMap, context, decisionPolicy.rootDecisionNodeId); 95 | return { 96 | items: items 97 | }; 98 | } 99 | 100 | export { evaluateDecisionPolicy }; 101 | -------------------------------------------------------------------------------- /hlx_statics/styles/spectrum/font.css: -------------------------------------------------------------------------------- 1 | /* 2 | * The Typekit service used to deliver this font or fonts for use on websites 3 | * is provided by Adobe and is subject to these Terms of Use 4 | * http://www.adobe.com/products/eulas/tou_typekit. For font license 5 | * information, see the list below. 6 | * 7 | * adobe-clean: 8 | * - http://typekit.com/eulas/000000000000000000017701 9 | * - http://typekit.com/eulas/000000000000000000017702 10 | * - http://typekit.com/eulas/000000000000000000017703 11 | * - http://typekit.com/eulas/0000000000000000000176ff 12 | * adobe-clean-serif: 13 | * - http://typekit.com/eulas/00000000000000003b9aee44 14 | * 15 | * © 2009-2022 Adobe Systems Incorporated. All Rights Reserved. 16 | */ 17 | /*{"last_published":"2019-05-08 18:18:41 UTC"}*/ 18 | 19 | @import url("https://p.typekit.net/p.css?s=1&k=uma8ayv&ht=tk&f=7180.7181.7182.7184.22747&a=9025710&app=typekit&e=css"); 20 | 21 | @font-face { 22 | font-family:"adobe-clean"; 23 | src:url("https://use.typekit.net/af/cb695f/000000000000000000017701/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("woff2"),url("https://use.typekit.net/af/cb695f/000000000000000000017701/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("woff"),url("https://use.typekit.net/af/cb695f/000000000000000000017701/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n4&v=3") format("opentype"); 24 | font-display:swap;font-style:normal;font-weight:400;font-stretch:normal; 25 | } 26 | 27 | @font-face { 28 | font-family:"adobe-clean"; 29 | src:url("https://use.typekit.net/af/74ffb1/000000000000000000017702/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff2"),url("https://use.typekit.net/af/74ffb1/000000000000000000017702/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("woff"),url("https://use.typekit.net/af/74ffb1/000000000000000000017702/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=i4&v=3") format("opentype"); 30 | font-display:swap;font-style:italic;font-weight:400;font-stretch:normal; 31 | } 32 | 33 | @font-face { 34 | font-family:"adobe-clean"; 35 | src:url("https://use.typekit.net/af/eaf09c/000000000000000000017703/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff2"),url("https://use.typekit.net/af/eaf09c/000000000000000000017703/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("woff"),url("https://use.typekit.net/af/eaf09c/000000000000000000017703/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n7&v=3") format("opentype"); 36 | font-display:swap;font-style:normal;font-weight:700;font-stretch:normal; 37 | } 38 | 39 | @font-face { 40 | font-family:"adobe-clean"; 41 | src:url("https://use.typekit.net/af/40207f/0000000000000000000176ff/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("woff2"),url("https://use.typekit.net/af/40207f/0000000000000000000176ff/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("woff"),url("https://use.typekit.net/af/40207f/0000000000000000000176ff/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n3&v=3") format("opentype"); 42 | font-display:swap;font-style:normal;font-weight:300;font-stretch:normal; 43 | } 44 | 45 | @font-face { 46 | font-family:"adobe-clean-serif"; 47 | src:url("https://use.typekit.net/af/505d17/00000000000000003b9aee44/27/l?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff2"),url("https://use.typekit.net/af/505d17/00000000000000003b9aee44/27/d?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("woff"),url("https://use.typekit.net/af/505d17/00000000000000003b9aee44/27/a?primer=7cdcb44be4a7db8877ffa5c0007b8dd865b3bbc383831fe2ea177f62257a9191&fvd=n9&v=3") format("opentype"); 48 | font-display:swap;font-style:normal;font-weight:900;font-stretch:normal; 49 | } 50 | 51 | .tk-adobe-clean { font-family: "adobe-clean",sans-serif; } 52 | .tk-adobe-clean-serif { font-family: "adobe-clean-serif",sans-serif; } 53 | -------------------------------------------------------------------------------- /hlx_statics/blocks/accordion/accordion.js: -------------------------------------------------------------------------------- 1 | import {removeEmptyPTags, createTag, applyWidthOverride, applyBkgColorOverride, applyAnalyticHeaderOverride} from '../../scripts/lib-adobeio.js'; 2 | 3 | /** 4 | * Returns the HTML for an accordion item 5 | * @param {*} heading The heading text of the accordion 6 | * @returns The accordion item HTML 7 | */ 8 | function getAccordionItem(heading) { 9 | return ` 10 |

11 | 24 |

25 |
26 | 27 |
`; 28 | //text is added later 29 | } 30 | 31 | /** 32 | * decorates the accordion 33 | * @param {Element} block The accordion block element 34 | */ 35 | export default async function decorate(block) { 36 | block.setAttribute('daa-lh', 'accordion'); 37 | removeEmptyPTags(block); 38 | block.parentElement.parentElement.classList.add('accordion-whole'); 39 | 40 | const accordion_div = createTag('div', {class: 'accordion-div'}); 41 | block.querySelectorAll('.accordion > div').forEach((item) => { 42 | const text = item.querySelector('p'); 43 | if(text === null){ //title 44 | const title = item.querySelector('h1, h2'); 45 | title.setAttribute('class', 'spectrum-Heading spectrum-Heading--sizeM'); 46 | title.parentElement.setAttribute('class', 'accordion-title'); 47 | }else{ //accordion item 48 | item.setAttribute("class", "accordion-item"); 49 | const heading = item.querySelector('h3, h4, h5, h6')?.innerText; 50 | item.innerHTML = getAccordionItem(heading); 51 | item.querySelector('.accordion-itemContent').appendChild(text); 52 | accordion_div.appendChild(item); 53 | }; 54 | }); 55 | block.appendChild(accordion_div); 56 | 57 | const accordion_items = block.querySelectorAll('.accordion-item'); 58 | accordion_items.forEach((item, i) => { 59 | item.addEventListener("click", () => { 60 | const heading = item.querySelector('.accordion-itemHeader'); 61 | const content = item.querySelector('.accordion-itemContent'); 62 | if(!heading.classList.contains('active')){ //click on item - show content 63 | heading.classList.add('active'); 64 | content.style.display = 'block'; 65 | heading.querySelector('.spectrum-UIIcon-ChevronRight100').style.display = 'none'; 66 | heading.querySelector('.spectrum-UIIcon-ChevronDown100').style.display = 'block'; 67 | }else{ //hide contents 68 | heading.classList.remove('active'); 69 | content.style.display = 'none'; 70 | heading.querySelector('.spectrum-UIIcon-ChevronRight100').style.display = 'block'; 71 | heading.querySelector('.spectrum-UIIcon-ChevronDown100').style.display = 'none'; 72 | }; 73 | }); 74 | }); 75 | applyBkgColorOverride(block); 76 | applyWidthOverride(block); 77 | applyAnalyticHeaderOverride(block); 78 | } -------------------------------------------------------------------------------- /hlx_statics/blocks/footer/footer.css: -------------------------------------------------------------------------------- 1 | footer { 2 | position: relative; 3 | padding-bottom: var(--spectrum-global-dimension-size-400); 4 | padding-top: var(--spectrum-global-dimension-size-600); 5 | background-color: var(--spectrum-global-color-gray-75); 6 | width: 100%; 7 | } 8 | 9 | @media screen and (max-width: 768px) { 10 | footer { 11 | padding-top: 0; 12 | } 13 | } 14 | 15 | @media screen and (max-width:768px) { 16 | footer { 17 | max-width: none; 18 | } 19 | } 20 | 21 | footer > div { 22 | box-sizing: border-box; 23 | max-width: calc(12 * var(--spectrum-global-dimension-static-grid-fixed-max-width) / var(--spectrum-global-dimension-static-grid-columns)); 24 | margin: 0 auto; 25 | } 26 | 27 | footer > div ul { 28 | list-style: none; 29 | padding: 0; 30 | } 31 | 32 | footer h3.spectrum-Heading--XS { 33 | position: absolute; 34 | white-space: nowrap; 35 | } 36 | 37 | footer > div ul.spectrum-Body--sizeS { 38 | padding-top: var(--spectrum-global-dimension-size-500); 39 | padding-right: var(--spectrum-global-dimension-size-200); 40 | } 41 | 42 | footer > div ul.spectrum-Body--sizeS > li { 43 | margin-top: var(--spectrum-global-dimension-size-200); 44 | } 45 | 46 | footer > div ul.spectrum-Body--sizeS > li:first-of-type { 47 | margin-top: 0; 48 | } 49 | 50 | footer .footer-links-container-inner { 51 | display: grid; 52 | grid-template-areas: 'apis blogs support developer'; 53 | grid-template-columns: 30% 22% 19%; 54 | gap: var(--spectrum-global-dimension-size-400); 55 | padding: var(--spectrum-global-dimension-size-200); 56 | } 57 | 58 | @media screen and (max-width: 320px) { 59 | footer .footer-links-container-inner { 60 | display: flex; 61 | flex-direction: column; 62 | padding: var(--spectrum-global-dimension-size-200); 63 | margin: 0 auto; 64 | } 65 | } 66 | 67 | @media screen and (max-width: 768px) { 68 | footer .footer-links-container-inner { 69 | display: flex; 70 | flex-wrap: wrap; 71 | flex-direction: row; 72 | justify-content: center; 73 | } 74 | } 75 | 76 | footer .footer-divider { 77 | position: absolute; 78 | top: 0; 79 | right: 0; 80 | height: 100%; 81 | } 82 | 83 | footer div.footer-links-container-inner > div:nth-child(1) { 84 | position: relative; 85 | grid-area: apis; 86 | } 87 | 88 | footer div.footer-links-container-inner > div:nth-child(1) > div > ul > li > strong > a { 89 | padding-bottom: var(--spectrum-global-dimension-size-750) !important; 90 | } 91 | 92 | footer .footer-apis-container { 93 | display: flex; 94 | } 95 | 96 | @media screen and (max-width: 768px) { 97 | footer .footer-apis-container { 98 | flex-direction: column; 99 | } 100 | 101 | footer .footer-apis-container > div { 102 | margin: 0; 103 | } 104 | } 105 | 106 | footer .footer-services-container { 107 | margin-left: var(--spectrum-global-dimension-size-400); 108 | } 109 | 110 | footer .footer-services-container ul { 111 | padding-top: var(--spectrum-global-dimension-size-750) !important; 112 | } 113 | 114 | footer div.footer-links-container-inner > div:nth-child(2) { 115 | position: relative; 116 | grid-area: blogs; 117 | } 118 | 119 | footer div.footer-links-container-inner > div:nth-child(3) { 120 | position: relative; 121 | grid-area: support; 122 | } 123 | 124 | footer .footer-legal { 125 | display: flex; 126 | align-items: center; 127 | justify-content: space-between; 128 | margin-top: var(--spectrum-global-dimension-size-100); 129 | } 130 | 131 | footer .footer-legal ul { 132 | display: inline-flex; 133 | color: var(--spectrum-global-color-gray-700); 134 | } 135 | 136 | footer .footer-legal ul > li { 137 | margin-right: var(--spectrum-global-dimension-size-400); 138 | } 139 | 140 | @media screen and (max-width: 768px) { 141 | footer .footer-legal { 142 | flex-direction: column; 143 | align-items: flex-start; 144 | padding: var(--spectrum-global-dimension-size-200); 145 | margin: 0 auto; 146 | } 147 | } 148 | 149 | footer .footer-legal p { 150 | color: var(--spectrum-global-color-gray-700); 151 | } 152 | 153 | @media screen and (max-width: 768px) { 154 | footer .footer-legal p { 155 | display: block; 156 | margin-top: var(--spectrum-global-dimension-size-200); 157 | } 158 | } 159 | 160 | footer .footer-horizontal { 161 | margin-top: var(--spectrum-global-dimension-size-700); 162 | } 163 | -------------------------------------------------------------------------------- /hlx_statics/scripts/scripts.js: -------------------------------------------------------------------------------- 1 | import { 2 | sampleRUM, 3 | buildBlock, 4 | decorateBlock, 5 | loadBlock, 6 | decorateButtons, 7 | decorateIcons, 8 | decorateSections, 9 | decorateBlocks, 10 | decorateTemplateAndTheme, 11 | waitForLCP, 12 | loadBlocks, 13 | loadCSS, 14 | addFavIcon, 15 | getMetadata, 16 | toCamelCase, 17 | toClassName, 18 | } from './lib-helix.js'; 19 | 20 | import { 21 | buildEmbeds, 22 | toggleScale, 23 | decorateAnchorLink, 24 | } from './lib-adobeio.js'; 25 | 26 | export { 27 | sampleRUM, 28 | toCamelCase, 29 | toClassName, 30 | getMetadata, 31 | loadCSS, 32 | }; 33 | 34 | /* 35 | * ------------------------------------------------------------ 36 | * Edit above at your own risk 37 | * ------------------------------------------------------------ 38 | */ 39 | 40 | window.hlx = window.hlx || {}; 41 | window.adobeid = window.adobeid || {}; 42 | 43 | const LCP_BLOCKS = []; // add your LCP blocks to the list 44 | window.hlx.RUM_GENERATION = 'project-1'; // add your RUM generation information here 45 | 46 | window.addEventListener('resize', toggleScale); 47 | 48 | function loadHeader(header) { 49 | const headerBlock = buildBlock('header', ''); 50 | header.append(headerBlock); 51 | decorateBlock(headerBlock); 52 | loadBlock(headerBlock); 53 | } 54 | 55 | function loadFooter(footer) { 56 | const footerBlock = buildBlock('footer', ''); 57 | footer.append(footerBlock); 58 | decorateBlock(footerBlock); 59 | loadBlock(footerBlock); 60 | } 61 | 62 | /** 63 | * Builds all synthetic blocks in a container element. 64 | * @param {Element} main The container element 65 | */ 66 | 67 | function buildAutoBlocks(main) { 68 | try { 69 | buildEmbeds(main); 70 | } catch (error) { 71 | // eslint-disable-next-line no-console 72 | console.error('Auto Blocking failed', error); 73 | } 74 | } 75 | 76 | /** 77 | * Decorates the main element. 78 | * @param {Element} main The main element 79 | */ 80 | // eslint-disable-next-line import/prefer-default-export 81 | export function decorateMain(main) { 82 | // hopefully forward compatible button decoration 83 | decorateButtons(main); 84 | buildAutoBlocks(main); 85 | decorateSections(main); 86 | decorateBlocks(main); 87 | } 88 | 89 | /** 90 | * Decorates the html element. 91 | * @param {*} html The html element 92 | */ 93 | function decorateHTML(html) { 94 | html.className = 'spectrum spectrum--light spectrum--medium'; 95 | html.dir = 'ltr'; 96 | html.lang = 'en'; 97 | } 98 | 99 | /** 100 | * loads everything needed to get to LCP. 101 | */ 102 | async function loadEager(doc) { 103 | const experiment = getMetadata('experiment'); 104 | const instantExperiment = getMetadata('instant-experiment'); 105 | if (instantExperiment || experiment) { 106 | // eslint-disable-next-line import/no-cycle 107 | const { runExperiment } = await import('./experimentation.js'); 108 | await runExperiment(experiment, instantExperiment); 109 | } 110 | 111 | decorateTemplateAndTheme(); 112 | const html = doc.querySelector('html'); 113 | if (html) { 114 | decorateHTML(html); 115 | } 116 | toggleScale(); 117 | const main = doc.querySelector('main'); 118 | if (main) { 119 | decorateMain(main); 120 | await waitForLCP(LCP_BLOCKS); 121 | } 122 | } 123 | 124 | /** 125 | * loads everything that doesn't need to be delayed. 126 | */ 127 | async function loadLazy(doc) { 128 | const main = doc.querySelector('main'); 129 | await loadBlocks(main); 130 | const { hash } = window.location; 131 | const element = hash ? doc.getElementById(hash.substring(1)) : false; 132 | if (hash && element) element.scrollIntoView(); 133 | 134 | loadHeader(doc.querySelector('header')); 135 | decorateIcons(main); 136 | loadFooter(doc.querySelector('footer')); 137 | 138 | loadCSS(`${window.hlx.codeBasePath}/styles/lazy-styles.css`); 139 | addFavIcon(`/hlx_statics/icons/adobe.svg`); 140 | 141 | if (window.location.hostname.endsWith('hlx.page') || window.location.hostname === ('localhost')) { 142 | // eslint-disable-next-line import/no-cycle 143 | import('../../tools/preview/experimentation-preview.js'); 144 | } 145 | } 146 | 147 | /** 148 | * loads everything that happens a lot later, without impacting 149 | * the user experience. 150 | */ 151 | function loadDelayed() { 152 | // eslint-disable-next-line import/no-cycle 153 | window.setTimeout(() => import('./delayed.js'), 500); 154 | // load anything that can be postponed to the latest here 155 | } 156 | 157 | async function loadPage() { 158 | await loadEager(document); 159 | await loadLazy(document); 160 | loadDelayed(document); 161 | } 162 | 163 | loadPage(); 164 | -------------------------------------------------------------------------------- /hlx_statics/blocks/columns/columns.js: -------------------------------------------------------------------------------- 1 | import { 2 | checkExternalLink, 3 | createTag, 4 | removeEmptyPTags, 5 | getBlockSectionContainer, 6 | decorateAnchorLink, 7 | applyBkgColorOverride, 8 | applyWidthOverride, 9 | applyAnalyticHeaderOverride, 10 | } from '../../scripts/lib-adobeio.js'; 11 | 12 | import { 13 | createOptimizedPicture, 14 | decorateLightOrDark, 15 | } from '../../scripts/lib-helix.js'; 16 | 17 | /** 18 | * Generates optimized images for all columns in the block 19 | * @param {*} block The columns block 20 | */ 21 | function processImages(block) { 22 | block.querySelectorAll('picture > img').forEach((img) => { 23 | const picture = createOptimizedPicture(img.src, img.alt); 24 | const parent = img.parentElement.parentElement; 25 | const p = createTag('p', { class: 'spectrum-Body spectrum-Body--sizeM' }); 26 | p.appendChild(picture); 27 | parent.replaceChild(p, img.parentElement); 28 | }); 29 | } 30 | 31 | /** 32 | * loads and decorates the columns 33 | * @param {Element} block The columns block element 34 | */ 35 | export default async function decorate(block) { 36 | const container = getBlockSectionContainer(block); 37 | 38 | block.setAttribute('daa-lh', 'column'); 39 | applyAnalyticHeaderOverride(block); 40 | decorateLightOrDark(block); 41 | 42 | if (!container.classList.contains('columns-container')) { 43 | // eslint-disable-next-line no-console 44 | console.error('Columns Block expects .columns-container to be parent.'); 45 | } 46 | 47 | removeEmptyPTags(block); 48 | 49 | block.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((h) => { 50 | h.classList.add('spectrum-Heading', 'spectrum-Heading--sizeM', 'column-header'); 51 | decorateAnchorLink(h); 52 | }); 53 | block.querySelectorAll('p').forEach((p) => { 54 | const hasLinks = p.querySelectorAll('a, button'); 55 | // don't attach to icon container or if p tag contains links 56 | if (!p.classList.contains('icon-container') && hasLinks.length === 0) { 57 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeM'); 58 | } else if (hasLinks.length > 0) { 59 | p.classList.add('icon-container'); 60 | } 61 | }); 62 | 63 | block.querySelectorAll('.columns > div > div').forEach((column) => { 64 | const buttonGroupContainer = createTag('div', { class: 'button-group-container' }); 65 | column.querySelectorAll('.button-container').forEach((p, key) => { 66 | const prevElement = p.previousElementSibling; 67 | if (key === 0) { 68 | prevElement.insertAdjacentElement("afterend",buttonGroupContainer); 69 | } 70 | buttonGroupContainer.appendChild(p); 71 | }); 72 | column.querySelectorAll('ul').forEach((ul) => { 73 | ul.parentElement.classList.add('listing');; 74 | ul.classList.add('spectrum-Body', 'spectrum-Body--sizeM'); 75 | }); 76 | }); 77 | 78 | block.querySelectorAll('a').forEach((a) => { 79 | if (!a.classList.contains('button')) { 80 | a.classList.add('spectrum-Link', 'spectrum-Link--quiet'); 81 | } 82 | if (!a.classList.contains('anchor-link')) { 83 | checkExternalLink(a); 84 | } 85 | }); 86 | 87 | block.querySelectorAll('.button').forEach((button) => { 88 | button.classList.add('spectrum-Button', 'spectrum-Button--sizeM'); 89 | if (button.parentElement.tagName.toLowerCase() !== 'strong') { 90 | button.classList.add('spectrum-Button--secondary', 'spectrum-Button--outline'); 91 | } else { 92 | button.parentElement.replaceWith(button); 93 | button.classList.add('spectrum-Button--cta'); 94 | } 95 | }); 96 | 97 | /* Stop here when metadata is `style: center` */ 98 | if (container.classList.contains('center')) { 99 | return; 100 | } 101 | 102 | block.querySelectorAll('.columns > div > div:first-child').forEach((column) => { 103 | column.classList.add('first-column'); 104 | }); 105 | block.querySelectorAll('.columns > div > div:nth-child(2)').forEach((column) => { 106 | column.classList.add('second-column'); 107 | }); 108 | 109 | block.querySelectorAll('div > div.second-column').forEach((secondColumn) => { 110 | const productLinkContainer = createTag('div', { class: 'product-link-container' }); 111 | secondColumn.querySelectorAll('p.icon-container').forEach((innerSecond) => { 112 | productLinkContainer.append(innerSecond); 113 | }); 114 | secondColumn.append(productLinkContainer); 115 | }); 116 | const observer = new IntersectionObserver((entries) => { 117 | if (entries.some((e) => e.isIntersecting)) { 118 | observer.disconnect(); 119 | processImages(block); 120 | } 121 | }); 122 | observer.observe(block); 123 | applyBkgColorOverride(block); 124 | applyWidthOverride(block); 125 | } 126 | -------------------------------------------------------------------------------- /hlx_statics/blocks/api-browser/api-browser.css: -------------------------------------------------------------------------------- 1 | main .api-browser-container { 2 | background-color: #fff; 3 | padding-top: 32px; 4 | padding-bottom: 32px; 5 | } 6 | 7 | main .picker { 8 | display: flex; 9 | align-items: right; 10 | height: var(--spectrum-global-dimension-size-800); 11 | justify-content: flex-end; 12 | margin-right: var(--spectrum-global-dimension-size-400); 13 | } 14 | 15 | main .picker .sort-group{ 16 | display: flex; 17 | } 18 | 19 | main .picker .sort-by-label{ 20 | margin: 8px; 21 | } 22 | 23 | main .picker .filter-by-popover { 24 | display: flex; 25 | min-width: var(--spectrum-global-dimension-size-800); 26 | width: auto; 27 | z-index: 100; 28 | max-height: calc(100vh - var(--spectrum-global-dimension-size-2400)); 29 | overflow: auto; 30 | margin-top: 32px; 31 | margin-left: 40px; 32 | } 33 | 34 | main .api-browser { 35 | max-width: var(--spectrum-global-dimension-static-grid-fixed-max-width); 36 | margin: var(--spectrum-global-dimension-size-400) auto; 37 | margin-bottom: 0; 38 | } 39 | 40 | main .api-cards { 41 | display: grid; 42 | grid-template-columns: repeat(auto-fit, calc(var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-800))); 43 | grid-auto-rows: calc(var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-500)); 44 | justify-content: center; 45 | gap: var(--spectrum-global-dimension-size-400); 46 | flex: 1; 47 | } 48 | 49 | @media screen and (max-width: 320px) { 50 | main .api-cards { 51 | margin-top: var(--spectrum-global-dimension-size-400); 52 | display: flex; 53 | flex-direction: column; 54 | } 55 | } 56 | 57 | main .api-card { 58 | display: inline-flex; 59 | flex-direction: column; 60 | align-items: center; 61 | width: 100%; 62 | 63 | background: var(--spectrum-global-color-gray-100); 64 | } 65 | 66 | @media screen and (max-width: 320px) { 67 | main .api-card { 68 | display: flex; 69 | width: 100%; 70 | align-items: center; 71 | } 72 | } 73 | 74 | @media screen and (max-width: 768px) { 75 | main .api-card { 76 | flex-wrap: wrap; 77 | } 78 | main .api-card>* { 79 | flex: 0 0 50%; 80 | } 81 | } 82 | 83 | main .api-cards-inner { 84 | display: flex; 85 | } 86 | 87 | @media screen and (max-width: 320px) { 88 | main .api-cards-inner { 89 | flex-direction: column; 90 | align-items: center; 91 | } 92 | } 93 | 94 | 95 | main .api-card-inner { 96 | margin: 0 var(--spectrum-global-dimension-size-300); 97 | width: calc(var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-800)); 98 | height: calc(var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-500)); 99 | } 100 | 101 | main .api-card-inner:hover { 102 | border-color: var(--spectrum-card-border-color, var(--spectrum-global-color-gray-200)); 103 | } 104 | 105 | @media screen and (max-width: 320px) { 106 | main .api-card-inner { 107 | width: 0; 108 | margin: 0; 109 | } 110 | } 111 | 112 | main .api-card-body { 113 | height: calc(var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-500)); 114 | overflow: auto; 115 | text-align: left; 116 | } 117 | 118 | main .api-card-icon-container { 119 | position: absolute; 120 | height: var(--spectrum-global-dimension-size-800); 121 | z-index: 1; 122 | } 123 | 124 | main .api-card-icon { 125 | height: var(--spectrum-global-dimension-size-600); 126 | width: var(--spectrum-global-dimension-size-600); 127 | margin-top: 0; 128 | } 129 | 130 | main .api-card-icon img { 131 | display: block; 132 | height: 100%; 133 | object-fit: contain; 134 | } 135 | 136 | main .api-card-icon-container + .api-card-body-inner{ 137 | top: var(--spectrum-global-dimension-size-800) 138 | } 139 | 140 | main .api-card-body-inner { 141 | position: relative; 142 | z-index: 1; 143 | background-color: var(--spectrum-global-color-gray-50); 144 | 145 | } 146 | 147 | main .api-card-title-container { 148 | margin-top: 0 !important; 149 | margin-bottom: var(--spectrum-global-dimension-size-100) !important; 150 | } 151 | 152 | main .api-card-title { 153 | font-size: var(--spectrum-global-dimension-size-200); 154 | } 155 | 156 | main .api-card-title h4 { 157 | margin-top: 0; 158 | margin-bottom: var(--spectrum-global-dimension-size-200); 159 | } 160 | 161 | main .api-card-content { 162 | height: auto; 163 | margin-bottom: 0 !important; 164 | } 165 | 166 | main .api-card-button-container { 167 | display: flex; 168 | --gap: var(--spectrum-global-dimension-size-200); 169 | flex-wrap: wrap; 170 | margin: calc(-1 * var(--gap)) 0 0 calc(-1 * var(--gap)); 171 | width: calc(100% + var(--gap)); 172 | justify-content: flex-end; 173 | } 174 | 175 | main .api-card-button-container a { 176 | margin: var(--gap) 0 0 var(--gap); 177 | } 178 | 179 | 180 | @media screen and (max-width: 320px) { 181 | main .api-card-button-container { 182 | justify-content: center; 183 | } 184 | } 185 | 186 | main .api-browser .filters { 187 | width: var(--spectrum-global-dimension-size-3000, var(--spectrum-alias-size-3000)); 188 | align-items: flex-end; 189 | flex-direction: column; 190 | display: flex; 191 | } 192 | 193 | @media screen and (max-width: 768px) { 194 | main .api-browser .api-cards-inner { 195 | display: block; 196 | } 197 | main .api-browser .filters{ 198 | padding: var(--spectrum-global-dimension-size-400); 199 | } 200 | } 201 | 202 | main .api-browser .filters-inner { 203 | align-items: flex-start; 204 | flex-direction: column; 205 | display: flex; 206 | } 207 | 208 | main .filter-item { 209 | margin-bottom: var(--spectrum-global-dimension-size-100, var(--spectrum-alias-size-100)); 210 | } 211 | 212 | main .filters-list { 213 | margin-top: var(--spectrum-global-dimension-size-100); 214 | display: flex; 215 | flex-direction: column; 216 | } 217 | 218 | main .filter-label { 219 | margin-left: var(--spectrum-checkbox-text-gap); 220 | } 221 | -------------------------------------------------------------------------------- /hlx_statics/blocks/columns/columns.css: -------------------------------------------------------------------------------- 1 | main div.columns-container { 2 | width: 100%; 3 | background: var(--spectrum-global-color-gray-100); 4 | } 5 | 6 | main div.columns { 7 | width: var(--spectrum-global-dimension-static-grid-fixed-max-width); 8 | box-sizing: border-box; 9 | margin: auto; 10 | } 11 | 12 | @media screen and (max-width: 1280px) { 13 | main div.columns { 14 | width: 100%; 15 | } 16 | main div.columns > div { 17 | flex-direction: column !important; 18 | } 19 | } 20 | 21 | main div.columns > div { 22 | display: flex; 23 | align-items: center; 24 | padding: var(--spectrum-global-dimension-size-1000) 0; 25 | } 26 | 27 | main div.columns > div:nth-child(even) { 28 | flex-direction: row-reverse; 29 | } 30 | 31 | main div.columns-container.background-color-white { 32 | background-color: white; 33 | } 34 | 35 | main div.columns-container.section[data-class="photoshoppricing"] .columns > div > div{ 36 | flex-basis:auto; 37 | flex-grow: 1; 38 | flex-shink: 1; 39 | text-align: left; 40 | padding: 0 var(--spectrum-global-dimension-size-800); 41 | } 42 | 43 | main div.columns-container.section[data-class="photoshoppricing"] .columns .button-container{ 44 | margin-left:0px; 45 | } 46 | 47 | main div.columns-container.section[data-list-class="checkmark"] ul { 48 | list-style: none; 49 | font-size: var(--spectrum-global-dimension-font-size-200); 50 | padding-top: var(--spectrum-global-dimension-size-300); 51 | padding-left: 0px; 52 | } 53 | 54 | main div.columns-container.section[data-list-class="checkmark"] ul > li { 55 | margin-bottom: 12px; 56 | } 57 | 58 | main div.columns-container.section[data-list-class="checkmark"] ul > li:before{ 59 | color: #096; 60 | content: "\2714\0020"; 61 | } 62 | 63 | main div.columns-container 64 | @media screen and (max-width: 1280px) { 65 | main div.columns > div { 66 | flex-direction: column; 67 | } 68 | } 69 | 70 | main div.columns div.first-column { 71 | display: flex; 72 | align-items: center; 73 | justify-content: center; 74 | width: 50%; 75 | height: calc(var(--spectrum-global-dimension-size-4600) - var(--spectrum-global-dimension-size-225)); 76 | box-sizing: border-box; 77 | padding: 0 var(--spectrum-global-dimension-size-100); 78 | margin-top: 0; 79 | } 80 | 81 | main div.columns div.first-column img { 82 | max-height: 350px; 83 | } 84 | 85 | @media screen and (max-width: 1280px) { 86 | main div.columns div.first-column { 87 | width: 100%; 88 | } 89 | } 90 | 91 | main div.second-column { 92 | width: 50%; 93 | display: flex; 94 | flex-direction: column; 95 | justify-content: center; 96 | text-align: left; 97 | box-sizing: border-box; 98 | padding: 0 var(--spectrum-global-dimension-size-400); 99 | } 100 | 101 | main .column-header .anchor-link{ 102 | padding-left: 10px; 103 | visibility: hidden; 104 | } 105 | 106 | main .column-header:hover .anchor-link{ 107 | padding-left: 10px; 108 | visibility: visible; 109 | } 110 | 111 | @media screen and (max-width: 1280px) { 112 | main div.columns div.second-column { 113 | width: 100%; 114 | margin: var(--spectrum-global-dimension-size-400) 0; 115 | } 116 | } 117 | 118 | main div.columns h3.column-header { 119 | margin-top: 0!important; 120 | margin-bottom: var(--spectrum-global-dimension-size-200)!important; 121 | scroll-margin-top:100px; 122 | } 123 | 124 | main div.columns h3.column-header + p { 125 | margin-top: 0!important; 126 | } 127 | 128 | main div.columns p + p { 129 | margin-top: var(--spectrum-global-dimension-size-300); 130 | } 131 | 132 | main div.columns div.product-link-container p { 133 | margin-top: var(--spectrum-global-dimension-size-300); 134 | } 135 | 136 | main div.columns div.listing.second-column[data-align="right"]{ 137 | text-align: right; 138 | width: auto; 139 | } 140 | 141 | main div.columns div.listing ul { 142 | text-align: left; 143 | } 144 | 145 | @media screen and (min-width:768px) { 146 | main div.columns div.product-link-container p + p { 147 | margin-left: var(--spectrum-global-dimension-size-300); 148 | } 149 | } 150 | 151 | main div.second-column div.product-link-container { 152 | display: flex; 153 | flex-direction: row; 154 | } 155 | 156 | @media screen and (max-width:768px) { 157 | main div.second-column div.product-link-container { 158 | flex-wrap: wrap; 159 | } 160 | main div.columns div.product-link-container p { 161 | width: 150px; 162 | } 163 | } 164 | 165 | main div.second-column div.product-link-container p.icon-container { 166 | display: flex; 167 | align-items: center; 168 | } 169 | 170 | main div.second-column div.product-link-container img { 171 | height: var(--spectrum-global-dimension-size-400); 172 | width: var(--spectrum-global-dimension-size-400); 173 | object-fit: contain; 174 | } 175 | 176 | main div.second-column div.product-link-container svg { 177 | height: var(--spectrum-global-dimension-size-400); 178 | width: var(--spectrum-global-dimension-size-400); 179 | object-fit: contain; 180 | } 181 | 182 | main div.second-column div.product-link-container a { 183 | margin-left: var(--spectrum-global-dimension-size-100); 184 | } 185 | 186 | /* metadata: style: center */ 187 | 188 | main .columns-container.center div.columns { 189 | width: auto; 190 | } 191 | 192 | main .columns-container.center div.columns > div { 193 | align-items: start; 194 | } 195 | 196 | main .columns-container.center div.columns > div > div { 197 | display: flex; 198 | flex-direction: column; 199 | text-align: center; 200 | padding: 0 var(--spectrum-global-dimension-size-400); 201 | } 202 | 203 | main .columns-container.center div.columns .button-container { 204 | display: inline-flex; 205 | margin: var(--spectrum-global-dimension-size-200) var(--spectrum-global-dimension-size-100); 206 | margin-bottom: 0; 207 | } 208 | 209 | @media screen and (max-width: 1280px) { 210 | main .columns-container.center div.columns > div > div { 211 | text-align: center; 212 | padding: var(--spectrum-global-dimension-size-1000) var(--spectrum-global-dimension-size-400); 213 | } 214 | 215 | main .columns-container.center div.columns > div { 216 | align-items: center; 217 | } 218 | } 219 | -------------------------------------------------------------------------------- /hlx_statics/icons/genstudio.svg: -------------------------------------------------------------------------------- 1 | advertising_cloud_appicon_Artboard 1 -------------------------------------------------------------------------------- /hlx_statics/scripts/delayed.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line import/no-cycle 2 | import { 3 | focusRing, 4 | isHlxPath, 5 | isStageEnvironment, 6 | decorateProfile, 7 | addExtraScript, 8 | addExtraScriptWithLoad, 9 | setAnalyticsAttributes 10 | } from './lib-adobeio.js'; 11 | 12 | async function fetchProfileAvatar(userId) { 13 | try { 14 | const req = await fetch(`https://cc-api-behance.adobe.io/v2/users/${userId}?api_key=SUSI2`); 15 | if (req) { 16 | const res = await req.json(); 17 | const avatarUrl = res?.user?.images?.['138'] ?? '/hlx_statics/icons/avatar.svg'; 18 | if (document.querySelector('#nav-profile-popover-avatar-img')) { 19 | document.querySelector('#nav-profile-popover-avatar-img').src = avatarUrl; 20 | } 21 | 22 | const profileButton = document.querySelector('#nav-profile-dropdown-button'); 23 | if (profileButton.querySelector('svg')) { 24 | profileButton.querySelector('svg').remove(); 25 | } 26 | profileButton.innerHTML = ` 27 | 30 | `; 31 | } 32 | } catch (e) { 33 | // eslint-disable-next-line no-console 34 | console.warn(e); 35 | } 36 | } 37 | 38 | if (isHlxPath(window.location.host) || isStageEnvironment(window.location.host)) { 39 | addExtraScript(document.body, 'https://auth-stg1.services.adobe.com/imslib/imslib.js'); 40 | } else { 41 | addExtraScript(document.body, 'https://auth.services.adobe.com/imslib/imslib.min.js'); 42 | } 43 | 44 | addExtraScript(document.body, 'https://www.adobe.com/marketingtech/main.min.js'); 45 | addExtraScript(document.body, 'https://wwwimages2.adobe.com/etc/beagle/public/globalnav/adobe-privacy/latest/privacy.min.js'); 46 | 47 | document.querySelectorAll('.embed').forEach((embed) => { 48 | const iframe = embed.querySelector('iframe'); 49 | if (!iframe.src) { 50 | iframe.src = iframe.getAttribute('data-src'); 51 | iframe.onload = () => { iframe.style.opacity = 1; }; 52 | } 53 | }); 54 | 55 | focusRing(); 56 | setAnalyticsAttributes(); 57 | 58 | const imsSignIn = new Event('imsSignIn'); 59 | 60 | // should refactor this if we get more ims clients coming 61 | if (isHlxPath(window.location.host)) { 62 | window.adobeid = { 63 | client_id: 'helix_adobeio', 64 | scope: 65 | 'AdobeID,openid,read_organizations,additional_info.projectedProductContext,additional_info.roles,gnav,read_pc.dma_bullseye,creative_sdk', 66 | locale: 'en_US', 67 | environment: 'stg1', 68 | useLocalStorage: true, 69 | logsEnabled: true, 70 | redirect_uri: window.location.href, 71 | isSignedIn: false, 72 | onError: (error) => { 73 | // eslint-disable-next-line no-console 74 | console.log(error); 75 | }, 76 | onReady: () => { 77 | if (window.adobeIMSMethods.isSignedIn()) { 78 | window.dispatchEvent(imsSignIn); 79 | window.adobeIMSMethods.getProfile(); 80 | } 81 | }, 82 | }; 83 | window.marketingtech = { 84 | adobe: { 85 | launch: { 86 | property: 'global', 87 | environment: 'dev', 88 | }, 89 | analytics: { 90 | additionalAccounts: 'pgeo1xxpnwadobeio-qa', 91 | }, 92 | }, 93 | }; 94 | } else if (!isHlxPath(window.location.host) && isStageEnvironment(window.location.host)) { 95 | 96 | if (window.location.pathname.includes('/photoshop/api')) { 97 | window.adobeid = { 98 | client_id: 'cis_easybake', 99 | scope: 100 | 'AdobeID,openid,creative_sdk,creative_cloud,unified_dev_portal,read_organizations,additional_info.projectedProductContext,additional_info.roles,gnav,read_pc.dma_bullseye', 101 | locale: 'en_US', 102 | environment: 'stg1', 103 | useLocalStorage: true, 104 | logsEnabled: true, 105 | redirect_uri: window.location.href, 106 | isSignedIn: false, 107 | onError: (error) => { 108 | // eslint-disable-next-line no-console 109 | console.log(error); 110 | }, 111 | onReady: () => { 112 | if (window.adobeIMSMethods.isSignedIn()) { 113 | window.dispatchEvent(imsSignIn); 114 | window.adobeIMSMethods.getProfile(); 115 | } 116 | }, 117 | }; 118 | } else { 119 | window.adobeid = { 120 | client_id: 'stage_adobe_io', 121 | scope: 122 | 'AdobeID,openid,unified_dev_portal,read_organizations,additional_info.projectedProductContext,additional_info.roles,gnav,read_pc.dma_bullseye,creative_sdk', 123 | locale: 'en_US', 124 | environment: 'stg1', 125 | useLocalStorage: true, 126 | logsEnabled: true, 127 | redirect_uri: window.location.href, 128 | isSignedIn: false, 129 | onError: (error) => { 130 | // eslint-disable-next-line no-console 131 | console.log(error); 132 | }, 133 | onReady: () => { 134 | if (window.adobeIMSMethods.isSignedIn()) { 135 | window.dispatchEvent(imsSignIn); 136 | window.adobeIMSMethods.getProfile(); 137 | } 138 | }, 139 | }; 140 | } 141 | 142 | window.marketingtech = { 143 | adobe: { 144 | launch: { 145 | property: 'global', 146 | environment: 'dev', 147 | }, 148 | analytics: { 149 | additionalAccounts: 'pgeo1xxpnwadobeio-qa', 150 | }, 151 | }, 152 | }; 153 | } else if (!isHlxPath(window.location.host) && !isStageEnvironment(window.location.host)) { 154 | if (window.location.pathname.includes('/photoshop/api')) { 155 | window.adobeid = { 156 | client_id: 'cis_easybake', 157 | scope: 158 | 'AdobeID,openid,creative_sdk,creative_cloud,unified_dev_portal,read_organizations,additional_info.projectedProductContext,additional_info.roles,gnav,read_pc.dma_bullseye', 159 | locale: 'en_US', 160 | environment: 'prod', 161 | useLocalStorage: true, 162 | logsEnabled: false, 163 | redirect_uri: window.location.href, 164 | isSignedIn: false, 165 | onError: (error) => { 166 | // eslint-disable-next-line no-console 167 | console.log(error); 168 | }, 169 | onReady: () => { 170 | if (window.adobeIMSMethods.isSignedIn()) { 171 | window.dispatchEvent(imsSignIn); 172 | window.adobeIMSMethods.getProfile(); 173 | } 174 | }, 175 | }; 176 | } else { 177 | window.adobeid = { 178 | client_id: 'adobe_io', 179 | scope: 180 | 'AdobeID,openid,unified_dev_portal,read_organizations,additional_info.projectedProductContext,additional_info.roles,gnav,read_pc.dma_bullseye,creative_sdk', 181 | locale: 'en_US', 182 | environment: 'prod', 183 | useLocalStorage: true, 184 | logsEnabled: false, 185 | redirect_uri: window.location.href, 186 | isSignedIn: false, 187 | onError: (error) => { 188 | // eslint-disable-next-line no-console 189 | console.log(error); 190 | }, 191 | onReady: () => { 192 | if (window.adobeIMSMethods.isSignedIn()) { 193 | window.dispatchEvent(imsSignIn); 194 | window.adobeIMSMethods.getProfile(); 195 | } 196 | }, 197 | }; 198 | } 199 | 200 | window.marketingtech = { 201 | adobe: { 202 | launch: { 203 | property: 'global', 204 | environment: 'production', 205 | }, 206 | analytics: { 207 | additionalAccounts: 'pgeo1xxpnwadobeio-prod', 208 | }, 209 | }, 210 | }; 211 | } 212 | 213 | window.adobeIMSMethods = { 214 | isSignedIn: () => window.adobeIMS.isSignedInUser(), 215 | signIn: () => { 216 | window.adobeIMS.signIn(); 217 | }, 218 | signOut() { 219 | window.adobeIMS.signOut({}); 220 | }, 221 | getProfile() { 222 | window.adobeIMS.getProfile().then((profile) => { 223 | window.adobeid.profile = profile; 224 | window.adobeid.profile.avatarUrl = '/hlx_statics/icons/avatar.svg'; 225 | decorateProfile(window.adobeid.profile); 226 | fetchProfileAvatar(window.adobeid.profile.userId); 227 | }) 228 | .catch((ex) => { 229 | window.adobeid.profile = ex; 230 | }); 231 | }, 232 | }; 233 | 234 | // cookie preference 235 | window.fedsConfig = { 236 | privacy: { 237 | // TODO config from adobe.com 238 | otDomainId: '7a5eb705-95ed-4cc4-a11d-0cc5760e93db', 239 | footerLinkSelector: '#openPrivacy', 240 | }, 241 | }; 242 | 243 | if (window.adobeImsFactory && window.adobeImsFactory.createIMSLib) { 244 | window.adobeImsFactory.createIMSLib(window.adobeid); 245 | } 246 | 247 | if (window.adobeIMS && window.adobeIMS.initialize) { 248 | window.adobeIMS.initialize(); 249 | } 250 | -------------------------------------------------------------------------------- /hlx_statics/blocks/carousel/carousel.js: -------------------------------------------------------------------------------- 1 | import { createTag, decorateButtons, removeEmptyPTags, applyWidthOverride, applyBkgColorOverride, applyAnalyticHeaderOverride} from '../../scripts/lib-adobeio.js'; 2 | /** 3 | * decorates the carousel 4 | * @param {Element} block The carousel block element 5 | */ 6 | export default async function decorate(block) { 7 | block.setAttribute('daa-lh', 'carousel'); 8 | removeEmptyPTags(block); 9 | decorateButtons(block); 10 | 11 | const carousel_block_child = createTag('div', {class: 'block-container'}); 12 | block.append(carousel_block_child); 13 | 14 | const carousel_block_circle = createTag('div', {class: 'carousel-circle-div'}); 15 | block.append(carousel_block_circle); 16 | 17 | const carousel_section = createTag('section', {class: 'slider-wrapper'}); 18 | carousel_block_child.append(carousel_section); 19 | 20 | const arrow_button_previous = createTag('button', {class: 'slide-arrow'}); 21 | arrow_button_previous.classList.add('slide-arrow-previous'); 22 | arrow_button_previous.innerHTML = '‹' 23 | const arrow_button_forward = createTag('button', {class: 'slide-arrow'}); 24 | arrow_button_forward.classList.add('slide-arrow-forward'); 25 | arrow_button_forward.innerHTML = '›' 26 | 27 | const carousel_ul = createTag('ul', {class: 'slides-container'}); 28 | carousel_section.append(carousel_ul); 29 | 30 | //add a count to keep track of which slide is showing 31 | let count = 1; 32 | 33 | block.querySelectorAll('h1, h2, h3, h4, h5, h6').forEach((h) => { 34 | h.parentElement.classList.add('carousel-container'); 35 | h.parentElement.parentElement.replaceWith(carousel_block_child); 36 | h.classList.add('spectrum-Heading', 'spectrum-Heading--sizeL', 'carousel-heading'); 37 | h.parentElement.setAttribute('id', h.id); 38 | 39 | //add circle for every slide 40 | let div_slide_circle = block.querySelector(".carousel-circle-div"); 41 | let circle_button = createTag('button', {class: 'carousel-circle'}); 42 | circle_button.setAttribute('id', count); 43 | div_slide_circle.append(circle_button); 44 | count += 1; 45 | 46 | let carousel_li = createTag('li', {class: 'slide'}); 47 | carousel_ul.append(carousel_li); 48 | carousel_li.append(h.parentElement); 49 | 50 | //add everything but image to the left div 51 | let flex_div = createTag('div', { id: 'right-flex-div-'+h.id}); 52 | h.parentElement.append(flex_div); 53 | flex_div.append(h); 54 | 55 | let button_div = createTag('div', { id: 'button-div-'+h.id}); 56 | h.parentElement.append(button_div); 57 | 58 | }); 59 | 60 | carousel_block_child.insertBefore(arrow_button_previous, carousel_section); 61 | carousel_block_child.append(arrow_button_forward); 62 | 63 | //add id to image and add image to left div 64 | block.querySelectorAll('img').forEach((img) => { 65 | img.parentElement.parentElement.classList.add('IMAGE'); 66 | //add image to left div 67 | let flex_div = createTag('div', { id: 'left-flex-div-'+img.parentElement.parentElement.parentElement.id}); 68 | img.parentElement.parentElement.parentElement.append(flex_div); 69 | flex_div.append(img.parentElement.parentElement); 70 | flex_div.classList.add('left-container'); 71 | }); 72 | 73 | block.querySelectorAll('p').forEach(function (p){ 74 | //add everything but image to the right div 75 | if(p.classList.contains("IMAGE") ){ 76 | p.classList.add('image-container'); 77 | }else{ 78 | let button_div = block.querySelector("[id=button-div-" + p.parentElement.id + "]"); 79 | if(p.classList.contains('button-container')){ 80 | button_div.classList.add('carousel-button-container'); 81 | button_div.append(p); 82 | }else{ 83 | let flex_div = block.querySelector("[id=right-flex-div-" + p.parentElement.id + "]"); 84 | flex_div.setAttribute('class', 'right-container'); 85 | p.classList.add('spectrum-Body', 'spectrum-Body--sizeM'); 86 | flex_div.insertBefore(p, button_div); 87 | } 88 | }; 89 | }); 90 | 91 | //slide functionality with arrow buttons 92 | const slidesContainer = block.querySelector(".slides-container"); 93 | const slide = block.querySelector(".slide"); 94 | const prevButton = block.querySelector(".slide-arrow-previous"); 95 | const nextButton = block.querySelector(".slide-arrow-forward"); 96 | 97 | //for automatic scrolling 98 | let isPaused = false; 99 | 100 | nextButton.addEventListener("click", () => { 101 | isPaused = true; 102 | let slide_selected = block.querySelector(".carousel-circle-selected"); 103 | let slide_selected_num = parseInt(slide_selected.id); 104 | let new_slide_num = slide_selected_num+1; 105 | let new_slide; 106 | if(new_slide_num !== count){ //at last slide - can't go forward more 107 | //slide over to new slide 108 | const slideDx = slidesContainer.clientLeft + (slide.clientWidth * slide_selected_num); 109 | slidesContainer.scrollLeft = slideDx; 110 | //change color of circle 111 | new_slide = block.querySelector("[id=" + CSS.escape(new_slide_num)+ "]"); 112 | slide_selected.classList.remove('carousel-circle-selected') 113 | new_slide.classList.add('carousel-circle-selected'); 114 | }; 115 | }); 116 | 117 | prevButton.addEventListener("click", () => { 118 | isPaused = true; 119 | let slide_selected = block.querySelector(".carousel-circle-selected"); //should only be one in the block 120 | let slide_selected_num = parseInt(slide_selected.id); 121 | let new_slide_num = slide_selected_num-1; 122 | let new_slide; 123 | if(new_slide_num !== 0){ //at first slide - can't go back more 124 | //slide over to new slide 125 | const slideDx = (new_slide_num-1) * slide.clientWidth; 126 | slidesContainer.scrollLeft = slideDx; 127 | //change color of circle 128 | new_slide = block.querySelector("[id=" + CSS.escape(new_slide_num)+ "]"); 129 | slide_selected.classList.remove('carousel-circle-selected'); 130 | new_slide.classList.add('carousel-circle-selected'); 131 | }; 132 | }); 133 | 134 | //change color of circle button when clicked 135 | const buttons = block.querySelectorAll('.carousel-circle'); 136 | buttons[0].classList.add('carousel-circle-selected'); //when reloading first slide should be selected 137 | 138 | buttons.forEach((button, i) => { 139 | button.addEventListener("click", () => { 140 | isPaused = true; 141 | let new_slide_num = button.id; 142 | const slideDx = slidesContainer.clientLeft + (slide.clientWidth * (new_slide_num-1)); 143 | slidesContainer.scrollLeft = slideDx; 144 | //change circle color 145 | buttons.forEach((button) => 146 | button.classList.remove('carousel-circle-selected') 147 | ); 148 | button.classList.add('carousel-circle-selected'); 149 | }); 150 | }); 151 | 152 | //automatic scrolling 153 | function advanceSlide() { 154 | let slide_selected = block.querySelector('.carousel-circle-selected'); 155 | let slide_selected_num = parseInt(slide_selected.id); 156 | let new_slide_num = slide_selected_num+1; 157 | let new_slide; 158 | if(new_slide_num === count){ //at last slide - can't go forward more 159 | new_slide = block.querySelector("[id=" + CSS.escape(1)+ "]"); 160 | //change color of circle 161 | slide_selected.classList.remove('carousel-circle-selected') 162 | new_slide.classList.add('carousel-circle-selected'); 163 | //slide over to new slide - needs to start over 164 | const difference = count - 1 - 1; 165 | const slideWidth = slide.clientWidth; 166 | slidesContainer.scrollLeft -= (difference*slideWidth); 167 | }else{ 168 | //slide over to new slide 169 | const slideDx = slidesContainer.clientLeft + (slide.clientWidth * slide_selected_num); 170 | slidesContainer.scrollLeft = slideDx; 171 | //change color of circle 172 | new_slide = block.querySelector("[id=" + CSS.escape(new_slide_num)+ "]"); 173 | new_slide.classList.add('carousel-circle-selected'); 174 | slide_selected.classList.remove('carousel-circle-selected') 175 | }; 176 | }; 177 | 178 | if(block.parentElement.parentElement.classList.contains('background-color-white')){ 179 | block.parentElement.parentElement.style.backgroundColor = 'white'; 180 | }; 181 | 182 | function slideTimer() { 183 | if(!isPaused){ 184 | advanceSlide(); 185 | setTimeout(slideTimer, 9000); 186 | }else{ 187 | clearTimeout(timer); 188 | //after set amount of time automatic scrolling can commence 189 | setTimeout(() => {isPaused = false;}, 18000); 190 | setTimeout(slideTimer, 9000); 191 | }; 192 | }; 193 | 194 | const timer = setTimeout(slideTimer, 9000); 195 | timer; 196 | applyBkgColorOverride(block); 197 | applyWidthOverride(block); 198 | applyAnalyticHeaderOverride(block); 199 | } -------------------------------------------------------------------------------- /hlx_statics/icons/substance3d.svg: -------------------------------------------------------------------------------- 1 | --------------------------------------------------------------------------------