Skip to content

Commit d8d6806

Browse files
committed
Merge branch 'main' of https://github.com/cloudadoption/diyfire into ue-support
2 parents 97f41ba + 9923a44 commit d8d6806

32 files changed

+13548
-3
lines changed

blocks/header/header.css

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,39 @@ header nav .nav-tools a.button:any-link:not(.nav-tool) {
519519
transition: all 0.3s;
520520
}
521521

522+
header nav .nav-tools a.button.nav-auth-link:any-link {
523+
padding: 10px 14px;
524+
min-height: 36px;
525+
line-height: 1;
526+
white-space: nowrap;
527+
}
528+
529+
header nav .nav-auth-link .nav-auth-info {
530+
display: inline-flex;
531+
align-items: center;
532+
justify-content: center;
533+
width: 14px;
534+
height: 14px;
535+
margin-left: 8px;
536+
border: 1px solid currentcolor;
537+
border-radius: 50%;
538+
font-size: 10px;
539+
font-weight: 700;
540+
line-height: 1;
541+
text-transform: none;
542+
}
543+
544+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item > p > a {
545+
display: block;
546+
color: inherit;
547+
text-decoration: none;
548+
}
549+
550+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item > p > a:hover,
551+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item > p > a:focus-visible {
552+
color: var(--nav-hover-color);
553+
}
554+
522555
header nav .nav-tools a.button:any-link:not(.nav-tool):hover {
523556
background: var(--color-rust);
524557
color: var(--color-light);
@@ -735,6 +768,12 @@ header nav .nav-tools .nav-language-menu a:focus-visible {
735768
width: 16px;
736769
height: 16px;
737770
}
771+
772+
header nav .nav-tools a.button.nav-auth-link:any-link {
773+
padding: 8px 10px;
774+
font-size: var(--body-font-size-xs);
775+
letter-spacing: 1px;
776+
}
738777
}
739778

740779
/* very small phones */
@@ -1168,6 +1207,10 @@ header nav .nav-tools .nav-language-menu a:focus-visible {
11681207
width: 190px;
11691208
}
11701209

1210+
header nav .nav-tools a.button.nav-auth-link:any-link {
1211+
padding: 12px 18px;
1212+
}
1213+
11711214
header nav .nav-tools .nav-search-input:hover {
11721215
border-color: light-dark(rgb(0 0 0 / 24%), rgb(255 255 255 / 30%));
11731216
}
@@ -1177,6 +1220,57 @@ header nav .nav-tools .nav-language-menu a:focus-visible {
11771220
}
11781221
}
11791222

1223+
@media (width <= 899px) {
1224+
header nav .nav-tools .nav-auth-desktop {
1225+
display: none;
1226+
}
1227+
1228+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item {
1229+
border-bottom: 0;
1230+
padding: var(--space-m) 0;
1231+
text-align: center;
1232+
}
1233+
1234+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item > p {
1235+
margin: 0;
1236+
padding: 0;
1237+
justify-content: center;
1238+
}
1239+
1240+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item > p > a.button.nav-auth-mobile:any-link {
1241+
display: inline-flex;
1242+
align-items: center;
1243+
justify-content: center;
1244+
border: 1.5px solid var(--color-rust);
1245+
border-radius: 4px;
1246+
background: transparent;
1247+
color: var(--color-rust);
1248+
padding: 12px 24px;
1249+
font-size: 0.75rem;
1250+
font-weight: 700;
1251+
text-transform: uppercase;
1252+
letter-spacing: 1.5px;
1253+
line-height: 1;
1254+
min-width: 120px;
1255+
text-decoration: none;
1256+
}
1257+
1258+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item > p > a.button.nav-auth-mobile:any-link:hover,
1259+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item > p > a.button.nav-auth-mobile:any-link:focus-visible {
1260+
background: var(--color-rust);
1261+
color: var(--color-light);
1262+
transform: none;
1263+
box-shadow: none;
1264+
text-decoration: none;
1265+
}
1266+
}
1267+
1268+
@media (width >= 900px) {
1269+
header nav .nav-sections .default-content-wrapper > ul > li.nav-auth-mobile-item {
1270+
display: none;
1271+
}
1272+
}
1273+
11801274
/* large screens: 1200px */
11811275
@media (width >= 1200px) {
11821276
header nav {

blocks/header/header.js

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@
77
import { getMetadata } from '../../scripts/aem.js';
88
import { loadFragment } from '../fragment/fragment.js';
99
import { getBlockContext } from '../../scripts/shared.js';
10+
import {
11+
getLoginUrl,
12+
getLogoutUrl,
13+
getDefaultAuthLabel,
14+
getSessionState,
15+
} from '../../scripts/shared/auth-api.js';
1016

1117
const DESKTOP = window.matchMedia('(min-width: 900px)');
1218
const THEME_KEY = 'diyfire-theme';
@@ -231,6 +237,99 @@ function getCookie(name) {
231237
return decodeURIComponent(cookie.split('=').slice(1).join('='));
232238
}
233239

240+
function hasCookieStartingWith(prefix) {
241+
return document.cookie
242+
.split(';')
243+
.map((entry) => decodeURIComponent(entry.split('=')[0] || '').trim())
244+
.some((cookieName) => cookieName.startsWith(prefix));
245+
}
246+
247+
function isLoggedIn() {
248+
return hasCookieStartingWith('CF_Authorization');
249+
}
250+
251+
async function resolveAuthState() {
252+
try {
253+
const session = await getSessionState();
254+
return {
255+
authenticated: Boolean(session?.authenticated),
256+
email: session?.email || '',
257+
};
258+
} catch (e) {
259+
return {
260+
authenticated: isLoggedIn(),
261+
email: '',
262+
};
263+
}
264+
}
265+
266+
function setAuthUserInfo(link, email) {
267+
link.querySelector('.nav-auth-info')?.remove();
268+
link.removeAttribute('title');
269+
link.removeAttribute('data-auth-email');
270+
271+
if (!email) return;
272+
273+
link.dataset.authEmail = email;
274+
link.setAttribute('title', email);
275+
const info = document.createElement('span');
276+
info.className = 'nav-auth-info';
277+
info.setAttribute('aria-hidden', 'true');
278+
info.setAttribute('title', email);
279+
info.textContent = 'i';
280+
link.append(info);
281+
}
282+
283+
async function initAuth(nav, tools) {
284+
const loginLabel = getDefaultAuthLabel('login');
285+
const logoutLabel = getDefaultAuthLabel('logout');
286+
287+
const loginCandidate = tools.querySelector('a[href*="login" i], a[data-auth-link]');
288+
const shouldCreateLink = !loginCandidate;
289+
290+
const desktopLink = loginCandidate || document.createElement('a');
291+
if (shouldCreateLink) {
292+
desktopLink.href = getLoginUrl();
293+
desktopLink.className = 'button nav-auth-link nav-auth-desktop';
294+
tools.append(desktopLink);
295+
}
296+
297+
desktopLink.dataset.authLink = 'true';
298+
if (!desktopLink.classList.contains('button')) desktopLink.classList.add('button');
299+
desktopLink.classList.add('nav-auth-link', 'nav-auth-desktop');
300+
301+
let mobileLink = nav.querySelector('.nav-auth-mobile-item a');
302+
if (!mobileLink) {
303+
const mobileList = nav.querySelector('.nav-sections .default-content-wrapper > ul');
304+
if (mobileList) {
305+
const li = document.createElement('li');
306+
li.className = 'nav-auth-mobile-item';
307+
const p = document.createElement('p');
308+
mobileLink = document.createElement('a');
309+
mobileLink.className = 'button nav-auth-link nav-auth-mobile';
310+
mobileLink.dataset.authLink = 'true';
311+
p.append(mobileLink);
312+
li.append(p);
313+
mobileList.append(li);
314+
}
315+
}
316+
if (mobileLink && !mobileLink.classList.contains('button')) mobileLink.classList.add('button');
317+
318+
const authState = await resolveAuthState();
319+
const loggedIn = authState.authenticated;
320+
const loginHref = getLoginUrl();
321+
const logoutHref = getLogoutUrl();
322+
const targetHref = loggedIn ? logoutHref : loginHref;
323+
const label = loggedIn ? logoutLabel : loginLabel;
324+
325+
[desktopLink, mobileLink].filter(Boolean).forEach((link) => {
326+
link.setAttribute('href', targetHref);
327+
link.textContent = label;
328+
link.setAttribute('aria-label', label);
329+
setAuthUserInfo(link, loggedIn ? authState.email : '');
330+
});
331+
}
332+
234333
function ensureGoogleTranslateScript() {
235334
if (window.__googleTranslateScriptLoaded) return Promise.resolve();
236335
if (window.__googleTranslateScriptPromise) return window.__googleTranslateScriptPromise;
@@ -437,6 +536,7 @@ export default async function decorate(block) {
437536
if (tools) {
438537
initTheme(tools);
439538
initSearch(tools);
539+
await initAuth(nav, tools);
440540
initLanguage(tools, eventRoot);
441541
hydrateTranslateFromCookie();
442542
}

eslint.config.cjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const js = require('@eslint/js');
22
const globals = require('globals');
33

44
module.exports = [
5-
{ ignores: ['helix-importer-ui/**', 'tools/**', '.skills/**', '**/*.min.js', '.eslintrc.js', 'eslint.config.cjs'] },
5+
{ ignores: ['helix-importer-ui/**', 'tools/**', '.skills/**', '**/*.min.js', '.eslintrc.js', 'eslint.config.cjs', 'plugins/**'] },
66
js.configs.recommended,
77
{
88
languageOptions: {

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
"build:json:definitions": "merge-json-cli -i \"ue/models/component-definition.json\" -o \"component-definition.json\"",
1414
"build:json:filters": "merge-json-cli -i \"ue/models/component-filters.json\" -o \"component-filters.json\"",
1515
"prepare": "husky",
16+
"dev:auth": "wrangler dev --config ./workers/auth/wrangler.toml",
17+
"deploy:auth": "wrangler deploy --config ./workers/auth/wrangler.toml",
18+
"tail:auth": "wrangler tail --config ./workers/auth/wrangler.toml",
1619
"dev:contact-us": "wrangler dev --config ./workers/contact_us/wrangler.toml",
1720
"deploy:contact-us": "wrangler deploy --config ./workers/contact_us/wrangler.toml",
1821
"tail:contact-us": "wrangler tail --config ./workers/contact_us/wrangler.toml"
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: Release
2+
on:
3+
push:
4+
branches:
5+
- main
6+
7+
permissions:
8+
contents: read
9+
10+
jobs:
11+
release:
12+
name: Release
13+
runs-on: ubuntu-latest
14+
permissions:
15+
contents: write
16+
issues: write
17+
pull-requests: write
18+
id-token: write
19+
steps:
20+
- name: Checkout
21+
uses: actions/checkout@v3
22+
with:
23+
fetch-depth: 0
24+
- name: Setup Node.js
25+
uses: actions/setup-node@v3
26+
with:
27+
node-version: "lts/*"
28+
- name: Install dependencies
29+
run: npm ci
30+
- name: Verify the integrity of provenance attestations and registry signatures for installed dependencies
31+
run: npm audit signatures
32+
- name: Release
33+
env:
34+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35+
run: npx semantic-release

plugins/experimentation/.releaserc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"branches": ["main"],
3+
"plugins": [
4+
"@semantic-release/commit-analyzer",
5+
"@semantic-release/release-notes-generator",
6+
"@semantic-release/changelog",
7+
"@semantic-release/npm",
8+
["@semantic-release/git", {
9+
"assets": ["CHANGELOG.md", "package.json"],
10+
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
11+
}]
12+
]
13+
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"extends": [
3+
"stylelint-config-standard"
4+
],
5+
"rules": {
6+
"declaration-block-no-redundant-longhand-properties": null
7+
}
8+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
## [1.0.4](https://github.com/adobe/aem-experimentation/compare/v1.0.3...v1.0.4) (2025-07-21)
2+
3+
4+
### Bug Fixes
5+
6+
* prevent XSS vulnerabilities in preview overlay ([#52](https://github.com/adobe/aem-experimentation/issues/52)) ([960e094](https://github.com/adobe/aem-experimentation/commit/960e094d33a2b11decd3ad1b2e45d5c5c2366175))
7+
8+
## [1.0.3](https://github.com/adobe/aem-experimentation/compare/v1.0.2...v1.0.3) (2024-10-06)
9+
10+
11+
### Bug Fixes
12+
13+
* regressions from prerendering logic and experimeantation ([5b90510](https://github.com/adobe/aem-experimentation/commit/5b90510168be9f9b55fc71e9c227cadaf481b968))
14+
15+
## [1.0.2](https://github.com/adobe/aem-experimentation/compare/v1.0.1...v1.0.2) (2024-06-11)
16+
17+
18+
### Bug Fixes
19+
20+
* pill css loading on localhost ([a41fafc](https://github.com/adobe/aem-experimentation/commit/a41fafc1003ada023725a451fe2215947a9bdeb9))
21+
22+
## [1.0.1](https://github.com/adobe/aem-experimentation/compare/v1.0.0...v1.0.1) (2024-05-24)
23+
24+
25+
### Bug Fixes
26+
27+
* semantic release ([5040fa8](https://github.com/adobe/aem-experimentation/commit/5040fa88c7a01b032431967e230abaaf6d69f9d6))

0 commit comments

Comments
 (0)