├── .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 |
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 |
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 |
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 |
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 |
15 |
--------------------------------------------------------------------------------
/hlx_statics/icons/ribbon_purple.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
17 |
--------------------------------------------------------------------------------
/hlx_statics/icons/audiencemanager.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
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 |
33 |
--------------------------------------------------------------------------------
/hlx_statics/icons/experienceplatform.svg:
--------------------------------------------------------------------------------
1 |
2 |
8 |
--------------------------------------------------------------------------------
/hlx_statics/icons/indesign.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
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 |
--------------------------------------------------------------------------------
/hlx_statics/icons/animate.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
16 |
--------------------------------------------------------------------------------
/hlx_statics/icons/stock.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------
/hlx_statics/icons/photoshop.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
38 |
--------------------------------------------------------------------------------
/hlx_statics/icons/aftereffects.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
30 |
31 |
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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------