1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="utf-8"> 5<meta content="width=device-width, initial-scale=1" name="viewport"> 6<meta property="og:type" content="website"> 7<meta property="og:title" content="PathFactory Overview: Product Tour"> 8<meta property="og:description" content="PathFactory Overview: Product Tour"> 9<meta property="og:image" content="https://cdn.pathfactory.com/assets/146/thumbnails/932696/ca8257a0-118b-4078-8e19-3fd7a2c80de1.png"> 10<meta property="og:url" content="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory_product_tour"> 11<meta name="twitter:card" content="summary_large_image"> 12<meta name="twitter:title" content="PathFactory Overview: Product Tour"> 13<meta name="twitter:description" content="PathFactory Overview: Product Tour"> 14<meta name="twitter:image" content="https://cdn.pathfactory.com/assets/146/thumbnails/932696/ca8257a0-118b-4078-8e19-3fd7a2c80de1.png"> 15<meta name="robots" content="noindex, follow"> 16<link rel="canonical" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory_product_tour"> 17<link rel="icon" type="image/x-icon" href="https://cdn.pathfactory.com/assets/146/icons/460327/ddc2c6d9-1c2b-4d64-b7a2-7ae13299e9c6.png"> 18<title> PathFactory Overview: Product Tour </title> 19<meta name="description" content="PathFactory Overview: Product Tour"> 20 21 22<meta property="article:published_time" content="2024-11-18T15:41:47-05:00"> 23 24 25 26
27<script> 28 const jukeboxApiHost = "https://jukebox.pathfactory.com"; 29 const clientId = "LB-931336C1-146"; 30 function pfCamelize(str) { 31 return str.replace(/(_\w)/g, function (match) { 32 return match[1].toUpperCase(); 33 }); 34} 35 36const pfPluralize = (word) => word.endsWith('s') ? word : word + 's'; 37 38const pfFilterKeys = (obj, validKeys) => validKeys.reduce((acc, key) => { 39 if (key in obj) acc[key] = obj[key]; 40 return acc 41}, {}); 42 43function pfUpdateUrlParams(url, params) { 44 const urlObj = new URL(url, window.location.origin); 45 const searchParams = urlObj.searchParams; 46 47 Object.entries(params).forEach(([key, values]) => { 48 if (Array.isArray(values) && values.length > 0) { 49 searchParams.set(key, values.join(",")); 50 } else if (["string", "number"].includes(typeof values)) { 51 searchParams.set(key, values); 52 }else { 53 searchParams.delete(key); 54 } 55 }); 56 57 urlObj.search = searchParams.toString(); 58 return urlObj.toString(); 59} 60 61 62const convertToQueryParams = (paramObject) => { 63 const keys = Object.keys(paramObject); 64 const keyValuePairs = keys.filter(k => paramObject[k].length).map(key => { 65 return key + '=' + paramObject[key]; 66 }); 67 return keyValuePairs.join('&'); 68} 69 70const pfWaitForVidCookie = () => 71 new Promise((resolve) => { 72 const visitorId = pfGetCookie("vid"); 73 if (visitorId) { 74 resolve(visitorId); 75 return; 76 } 77 78 const interval = setInterval(() => { 79 const visitorId = pfGetCookie("vid"); 80 81 if (visitorId) { 82 clearInterval(interval); 83 clearTimeout(timeout); 84 resolve(visitorId); 85 } 86 }, 200); 87 88 const timeout = setTimeout(() => { 89 clearInterval(interval); 90 resolve(null); 91 }, 3000); 92 }); 93 94function fetchKsToken(clientId, baseUrl) { 95 if (!clientId || !baseUrl) { 96 return Promise.resolve(null); 97 } 98 99 if (typeof window.ksValue !== "undefined") { 100 return Promise.resolve(window.ksValue); 101 } 102 103 if (window.__pfKsTokenPromise) { 104 return window.__pfKsTokenPromise; 105 } 106 107 window.__pfKsTokenPromise = pfWaitForVidCookie().then((visitorId) => { 108 if (!visitorId) { 109 return null; 110 } 111 112 return fetch(`${baseUrl}/api/public/v3/kaltura_accounts/generate_ks_token`, { 113 method: "POST", 114 credentials: "include", 115 headers: { 116 "Content-Type": "application/json", 117 Accept: "application/json" 118 }, 119 body: JSON.stringify({ 120 client_id: clientId, 121 user_id: visitorId 122 }) 123 }).then((response) => { 124 if (!response.ok) { 125 return null; 126 } 127 return response.json().then((data) => data?.ks || null).catch(() => null); 128 }).catch(() => null); 129 }).then((ks) => { 130 window.ksValue = ks; 131 return ks; 132 }).finally(() => { 133 delete window.__pfKsTokenPromise; 134 }); 135 136 return window.__pfKsTokenPromise; 137} 138 139</script>
139 140 141
142<script> 143 let dimensions = []; 144 145 dimensions = `[{"label":"Topics","value":"topics","is_default":true},{"label":"Business Units","value":"business_units","is_default":true},{"label":"Personas","value":"personas","is_default":true},{"label":"Industries","value":"industries","is_default":true},{"label":"Products","value":"products","is_default":true},{"label":"Solutions","value":"solutions","is_default":true},{"label":"Use Cases","value":"use_cases","is_default":false},{"label":"Use In Recommendations?","value":"use_in_recommendations","is_default":false},{"label":"From The Nook?","value":"from_the_nook","is_default":false}]` ? JSON.parse(`[{"label":"Topics","value":"topics","is_default":true},{"label":"Business Units","value":"business_units","is_default":true},{"label":"Personas","value":"personas","is_default":true},{"label":"Industries","value":"industries","is_default":true},{"label":"Products","value":"products","is_default":true},{"label":"Solutions","value":"solutions","is_default":true},{"label":"Use Cases","value":"use_cases","is_default":false},{"label":"Use In Recommendations?","value":"use_in_recommendations","is_default":false},{"label":"From The Nook?","value":"from_the_nook","is_default":false}]`) : [] 146 147 const contentTagCategories = dimensions; 148 const customCategories = contentTagCategories?.filter(item => item?.is_default === false) || []; 149 const customCategoryKeys = customCategories.map(item => item.value); 150 const DIMENSION_FILTER_TYPES = [ 151 "business_units", 152 "funnel_stages", 153 "industries", 154 "personas", 155 "products", 156 "solutions", 157 "topics", 158 ...customCategoryKeys 159 ]; 160 const NON_DIMENSION_FILTER_TYPES = [ 161 "languages", 162 "content_types" 163 ]; 164 const PF_FILTER_TYPES = [ 165 ...NON_DIMENSION_FILTER_TYPES, 166 ...DIMENSION_FILTER_TYPES 167 ]; 168</script>
168 169 170
171<script> 172 function pfDebounce(func, timeout = 500){ 173 let timer; 174 return (...args) => { 175 clearTimeout(timer); 176 timer = setTimeout(() => { func.apply(this, args); }, timeout); 177 }; 178 } 179 180 function pfGetCookie(namePattern){ 181 const cookies = document.cookie.split("; "); 182 const cookie = cookies.find((cookie) => { 183 const cookieName = cookie.split("=")[0]; 184 return !!cookieName.match(namePattern) 185 }) || ""; 186 return cookie.split("=")[1]; 187 } 188</script>
188 189 190 191<!-- Google tag (gtag.js) -->
192<script async type="javascript/pathfactory"> 193 google_analytics_measurement_id = "G-6SYSEVSDWF"; 194 (function() { 195 var script = document.createElement('script'); 196 script.type = 'text/javascript'; 197 script.src = 'https://www.googletagmanager.com/gtag/js?id=' + google_analytics_measurement_id; 198 script.async = true; 199 document.head.appendChild(script); 200 })(); 201</script>
vendor: 1 bytes, line 201
201
202<script type="javascript/pathfactory"> 203
vendor: 134 bytes, lines 203-207
203window.dataLayer = window.dataLayer || []; 204 function gtag(){dataLayer.push(arguments);} 205 gtag('js', new Date()); 206 207 gtag('config', "
207G-6SYSEVSDWF
vendor: 4 bytes, line 207
207");
208</script>
208 209 210 211 212 213
213<script type="javascript/pathfactory"> 214 (function() { 215 var didInit = false; 216 function initMunchkin() { 217 if(didInit === false) { 218 didInit = true; 219 Munchkin.init('186-UMU-338'); 220 221 var webpageTrackTriggered = false; 222 var totalTimeSpent = 0; 223 const threshold = 150; 224 const totalTimer = setInterval(() => { 225 if (!webpageTrackTriggered && !window.formModalOpen && !document.hidden) { 226 totalTimeSpent++; 227 if (totalTimeSpent >= threshold) { 228 trackWebPage(true); 229 webpageTrackTriggered = true; 230 clearInterval(totalTimer); 231 } 232 } 233 }, 1000); 234 } 235 } 236 function trackWebPage(thresholdPassed) { 237 var url = document.location.pathname; 238 var params = "topic=Product&business_unit=Marketing&funnel_stage=Top of Funnel&business_unit=Product&industry=B2B&persona=CMO/VP&persona=ABM Lead&persona=Content Lead&persona=Demand Gen Lead&persona=Marketing Ops Lead&use_cases=ABM&use_cases=Demand Gen&use_cases=Content Strategy&use_cases=Buyer Enablement&use_in_recommendatio=Yes - ONLY if assets should be used for ChatFactory & Website Tools Recommendations&topic=product&business_unit=marketing&funnel_stage=top-of-funnel&business_unit=product&industry=b2b&persona=cmo-vp&persona=abm-lead&persona=content-lead&persona=demand-gen-lead&persona=marketing-ops-lead&use_cases=abm&use_cases=demand-gen&use_cases=content-strategy&use_cases=buyer-enablement&use_in_recommendatio=yes-only-if-assets-should-be-used-for-chatfactory-website-tools-recommendations&content_type=Product Tour&content_type=product-tour"; 239 var queryString = ""; 240 241 if (thresholdPassed) { 242 url = url + ", Met Threshold"; 243 params = "threshold_passed=true" + (params ? "&" + params : ""); 244 } 245 params = params + (queryString ? "&" + queryString : ""); 246 247 window.mktoMunchkinFunction('visitWebPage', { 248 url: url, 249 params: params 250 }); 251 } 252 var s = document.createElement('script'); 253 s.type = 'text/javascript'; 254 s.async = true; 255 s.src = '//munchkin.marketo.net/munchkin.js'; 256 s.onreadystatechange = function() { 257 if (this.readyState == 'complete' || this.readyState == 'loaded') { 258 initMunchkin(); 259 } 260 }; 261 s.onload = initMunchkin; 262 document.getElementsByTagName('head')[0].appendChild(s); 263 })(); 264 </script>
264 265 266 267 268 269
270<script src="https://cdn.pathfactory.com/templated-experiences/glide.js"></script>
270 271 272 273<link rel="stylesheet" href="https://cdn.pathfactory.com/templated-experiences/glide.core.css"> 274<link rel="stylesheet" href="https://cdn.pathfactory.com/templated-experiences/glide.theme.css"> 275 276
277<script defer src="https://cdn.pathfactory.com/templated-experiences/alpine.js"></script>
277 278 279 280 281
281<script src="https://cdn.pathfactory.com/templated-experiences/values.js"></script>
281 282 283 284 285 286 287
287<script src="https://cdn.pathfactory.com/templated-experiences/brightcove-player-loader.min.js"></script>
287 288
288<script src="https://cdn.pathfactory.com/templated-experiences/reactplayer.standalone.js"></script>
288 289
289<script src="https://cdn.pathfactory.com/templated-experiences/youtube-iframe-api.js"></script>
289 290
290<script src="https://cdn.pathfactory.com/templated-experiences/vimeo-player.js"></script>
290 291
291<script src="https://cdn.pathfactory.com/templated-experiences/vidyard-embed-v4.js"></script>
291 292
292<script src="https://cdn.pathfactory.com/templated-experiences/wistia-e-v1.js"></script>
292 293
293<script defer src="https://cdn.pathfactory.com/templated-experiences/parmonic-aw-single.js"></script>
293 294
294<script defer src="https://cdn.pathfactory.com/templated-experiences/parmonic-aw-init.js"></script>
294 295 296 297 298<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css"> 299 300 301 302
302<script> 303 var primaryColor = new Values("#5555FF"); 304 var primaryShades = primaryColor.all(18).map((shade) => shade.hexString()); 305 let sectionPadding = "px-[0px] sm:px-[0px] py-[0px] sm:py-[0px]"; 306 if (true) { 307 sectionPadding = "py-12 px-4 sm:px-6 lg:py-16 lg:px-8"; 308 }; 309 window.__unocss = { 310 theme: { 311 colors: { 312 primary: { 313 DEFAULT: primaryShades[5], 314 50: primaryShades[0], 315 100: primaryShades[1], 316 200: primaryShades[2], 317 300: primaryShades[3], 318 400: primaryShades[4], 319 500: primaryShades[5], 320 600: primaryShades[6], 321 700: primaryShades[7], 322 800: primaryShades[8], 323 900: primaryShades[9] 324 }, 325 on: { 326 primary: "#ffffff" 327 } 328 } 329 }, 330 shortcuts: { 331 "section-display": "flex justify-center mx-auto", 332 "section-padding": `${sectionPadding} flex justify-center mx-auto`, 333 "section-base": "container", 334 "section-heading": "text-3xl font-bold leading-tight tracking-tight text-gray-900 md:text-4xl", 335 "btn": "inline-block w-full px-4 py-2 text-base font-medium leading-4 text-center border rounded-md shadow-sm focus:ring-2 focus:ring-opacity-50 md:text-lg", 336 "btn-lg": "px-6 py-4", 337 "btn-md": "px-4 py-2", 338 "btn-sm": "px-2 py-1", 339 "btn-primary": "bg-primary-500 border-primary-500 text-on-primary hover:bg-primary-600 focus:ring-primary-500", 340 "btn-outline": "text-gray-800 bg-white border border-gray-400 hover:bg-gray-200 focus:ring-gray-200" 341 } 342 }; 343 </script>
343 344 345 346 347 348 <style> 349 [un-cloak] { 350 display: none; 351 } 352 </style> 353
353<script defer src="https://cdn.pathfactory.com/templated-experiences/attributify.global.js"></script>
353 354 355 356 357 358
358<script src="https://cdn.pathfactory.com/templated-experiences/tailwind.js"></script>
358 359 360 361
362<script> 363 function pfInitOzmenu(sectionClass) { 364 const section = document.querySelector(`.${sectionClass}`); 365 366 if (!section) return; 367 368 const openMenu = section.querySelector(".menu-open"); 369 const closeMenu = section.querySelector(".menu-close"); 370 const menuDiv = section.querySelector(".ozmenu"); 371 const menu = section.querySelector(".ozmenu-nav"); 372 373 if (!openMenu || !closeMenu || !menuDiv || !menu) return; 374 375 const dropDowns = menu.getElementsByClassName("nav-dropdown"); 376 const dropDownsChild = menu.querySelectorAll('.dropdown .nav-dropdown'); 377 const ozmenuOverlayClass = `ozmenu-${sectionClass}`; 378 379 openMenu.addEventListener("click", menuToggle); 380 closeMenu.addEventListener("click", menuToggle); 381 382 // menu-overlay covers up the rest of the page with an overlay when menu open 383 if (!document.querySelector(`.${ozmenuOverlayClass}#menu-overlay`)) { 384 document.body.insertAdjacentHTML("beforeend", `<div id='menu-overlay' class='${ozmenuOverlayClass}'></div>`); 385 document.querySelector(`.${ozmenuOverlayClass}#menu-overlay`).addEventListener("click", menuToggle); 386 } 387 388 function menuToggle() { 389 menuDiv.classList.toggle("active"); 390 document.body.classList.toggle("hide-scrolling"); 391 document.body.classList.toggle("mobile-menu-active"); 392 document.querySelector(`.${ozmenuOverlayClass}#menu-overlay`).classList.toggle("show"); 393 document.querySelectorAll(".pf-header").forEach((header) => { 394 if (!header.contains(openMenu)) { 395 header.classList.toggle("z-[10000]"); 396 } 397 }); 398 } 399 400 for (var i = 0; i < dropDownsChild.length; i++) { 401 dropDownsChild[i].classList.add('child'); 402 dropDownsChild[i].addEventListener("click", function() { 403 this.classList.toggle('opened'); 404 }); 405 } 406 for (var i = 0; i < dropDowns.length; i++) { 407 if(!dropDowns[i].classList.contains("child")){ 408 dropDowns[i].classList.add('parent'); 409 dropDowns[i].addEventListener("click", function() { 410 this.classList.toggle('opened'); 411 }); 412 } 413 } 414 }; 415 416 function pfOzmenuCycleFocus(sectionClass) { 417 const pfOzmenu = document.querySelector(`.${sectionClass} .ozmenu`); 418 const focusableElements = pfOzmenu.querySelectorAll("a, button, input"); 419 const firstFocusableEl = focusableElements[0]; 420 const lastFocusableEl = focusableElements[focusableElements.length - 1]; 421 pfOzmenu.addEventListener("keydown", (e) => { 422 if (!window.matchMedia('(max-width: 993px)').matches) return; 423 424 if (e.key === "Tab") { 425 if ( e.shiftKey ) /* shift + tab */ { 426 if (document.activeElement === firstFocusableEl) {
427 lastFocusableEl.focus(); 428 e.preventDefault(); 429 } 430 } else /* tab */ { 431 if (document.activeElement === lastFocusableEl) { 432 firstFocusableEl.focus(); 433 e.preventDefault(); 434 } 435 } 436 } 437 }); 438 } 439 440 function pfOzmenuEscClose(sectionClass) { 441 document.addEventListener("keydown", (e) => { 442 const pfOzmenu = document.querySelector(`.${sectionClass} .ozmenu`); 443 if (e.key === "Escape" && pfOzmenu.classList.contains("active")) { 444 document.querySelector(`.${sectionClass} .menu-close`).click(); 445 } 446 if (!window.matchMedia('(max-width: 993px)').matches) { 447 if (event.key === 'Escape') { 448 document.querySelectorAll('.dropdown').forEach((dropdown) => { 449 dropdown.style.display = 'none'; 450 }); 451 } 452 }; 453 }); 454 } 455</script>
455 456
457<script> 458 document.addEventListener("DOMContentLoaded", () => { 459 document.querySelectorAll(".pf-header").forEach((header) => { 460 const nodeId = header.dataset.pfThemeBlockId; 461 const sectionClass = `section-${nodeId || ""}`; 462 pfInitOzmenu(sectionClass); 463 }); 464 }); 465</script>
465 466<link rel="stylesheet" href="https://cdn.pathfactory.com/templated-experiences/ozmenu-styles.css"> 467 468 469 470
470<script src="https://cdn-app.pathfactory.com/libraries/overlay/overlay.js"></script>
470 471 <link href="https://cdn-app.pathfactory.com/libraries/overlay/overlay.css" rel="stylesheet" type="text/css"> 472 473 474
475<script defer> 476 window.pfGlides = {}; 477 window.carouselConfiguration = {}; 478 window.pfGlideAssets = {}; 479 const detectGlideAndMount = (count = 0) => { 480 const glides = document.querySelectorAll(".glide"); 481 if (glides.length === 0 && count <= 20) { 482 setTimeout(() => detectGlideAndMount(count + 1), 1000); 483 } else { 484 glides.forEach((glide) => { 485 const glideSlides = window.pfGlideAssets[glide?.dataset?.carouselGlideId] || []; 486 if (glideSlides.length === 0) { 487 window.pfGlideAssets[glide?.dataset?.carouselGlideId] = glide.querySelectorAll(".asset"); 488 } 489 window.carouselConfiguration[glide?.dataset?.carouselGlideId] = { 490 type: "slider", 491 animationDuration: 1000, 492 autoplay: glide.dataset.autoplay === "no" 493 ? false 494 : glide.dataset.autoplayInterval * 1000, 495 gap: glide.dataset.gap || 0, 496 perView: glide.dataset.tilesPerRow, 497 peek: glide.dataset.peek || 0, 498 breakpoints: { 499 640: { 500 perView: 1 501 }, 502 1024: { 503 perView: glide.dataset.tilesPerRow === "1" ? 1 : 2 504 } 505 } 506 }; 507 window.pfGlides[glide.dataset.carouselGlideId] = new Glide(glide, window.carouselConfiguration[glide?.dataset?.carouselGlideId]); 508 window.pfGlides[glide.dataset.carouselGlideId].on(['mount.after', 'run'], () => { 509 const bullets = glide.querySelectorAll('.glide__bullet'); 510 const slides = glide.querySelectorAll('.glide__slide'); 511 const activeIndex = window.pfGlides[glide.dataset.carouselGlideId].index; 512 // Dynamically get perView based on the current screen width 513 const viewportWidth = window.innerWidth; 514 let perView = parseInt(glide.dataset.tilesPerRow, 10); 515 if (viewportWidth <= 640) 516 perView = 1; 517 else if (viewportWidth <= 1024) 518 perView = Math.min(perView, 2); 519 const totalSlides = slides.length; 520 bullets.forEach((bullet, index) => { 521 bullet.setAttribute('aria-current', index === activeIndex); 522 bullet.setAttribute("tabindex", bullet.classList.contains("glide__bullet--between") ? "-1" : "0"); 523 }); 524 slides.forEach((slide, index) => { 525 const isVisible = 526 activeIndex + perView <= totalSlides 527 ? index >= activeIndex && index < activeIndex + perView 528 : index >= activeIndex && index < totalSlides; 529 slide.setAttribute('aria-hidden', !isVisible); 530 const slideButtons = slide.querySelectorAll("button, a"); 531 slideButtons.forEach(button => { 532 button.setAttribute("tabindex", isVisible ? "0" : "-1"); 533 }); 534 }); 535 }); 536 window.pfGlides[glide.dataset.carouselGlideId].mount(); 537 }); 538 for (let count = 0; count < 10; count++) { 539 setTimeout(() => window.dispatchEvent(new Event('resize')), 500 * count); 540 } 541 } 542 } 543 document.addEventListener("DOMContentLoaded", () => { 544 detectGlideAndMount(); 545 }); 546</script>
546 547 548 549 550 551
552<script> 553 554 555async function pfFetchFilters(sectionNodeId) { 556 const isContentPage = true; 557 const urlParams = new URLSearchParams(window.location.search); 558 const sectionSelector = `.section-${sectionNodeId}`; 559 const contentPlayUuid = urlParams.get("pf_cpid"); 560 const campaignUuid = urlParams.get("pf_cid"); 561 const landingPageId = "" || urlParams.get("pflpid"); 562 const lpSectionNodeId = isContentPage ? urlParams.get("pfsid") : sectionNodeId; 563 const segmentGroupId = ""; 564 const contentPageParams = isContentPage ? { 565 isContentPage: true, 566 contentSource: "experience", 567 templatedExperienceId: "26766" 568 } : {}; 569 const apiUrl = new URL(`${jukeboxApiHost}/api/public/v3/get_filter_options`); 570 const params = { 571 ...contentPageParams, 572 landingPageId, 573 sectionNodeId: lpSectionNodeId, 574 clientId, 575 segmentGroupId, 576 pf_cpid: contentPlayUuid, 577 pf_cid: campaignUuid 578 }; 579 apiUrl.search = new URLSearchParams(params); 580 581 const response = await fetch(apiUrl); 582 const result = await response.json(); 583 584 return result; 585} 586 587function pfBuildFilters({ 588 filters = {}, 589 sectionSelector, 590 sectionNodeId, 591 fetchCurrentParams, 592 handleParamsChange 593}) { 594 // The following classes must be present 595 const allFiltersContainerClass = "pf-resource-center-filters"; 596 const filterOptionClass = "pf-options"; 597 const templateClass = "pf-template"; 598 const optionLabelClass = "pf-label"; 599 const optionCheckboxClass = "pf-checkbox"; 600 const clearOptionsClass = "pf-clear-options"; 601 const clearOptionsClassAlt = "pf-clear-checked_filters-selector"; 602 const clearAllClass = "clear-all-filters"; 603 const optionsWrapperSelector = (filterType) => { 604 let selector = `.pf-options-wrapper-${filterType}`; 605 if (["languages", "content_types"].includes(filterType)) { 606 const filterTypeSingular = filterType.replace(/s$/, ""); 607 selector += `, .pf-options-wrapper-${filterTypeSingular}`; 608 } 609 return selector; 610 }; 611 const filterSelector = (filterType) => { 612 let selector = `.select-${filterType}`; 613 if (["languages", "content_types"].includes(filterType)) { 614 const filterTypeSingular = filterType.replace(/s$/, ""); 615 selector += `, .select-${filterTypeSingular}`; 616 } 617 return selector; 618 }; 619 620 const section = document.querySelector(sectionSelector); 621 622 // This should handle for both mobile and desktop, hence there's more than 1 allFiltersContainerClass 623 section.querySelectorAll(`.${allFiltersContainerClass}`).forEach((filtersWrapper) => { 624 const filterOptionTemplate = filtersWrapper.querySelector(`.${filterOptionClass}.${templateClass}`); 625 const clearAllFilters = filtersWrapper.querySelector(`.${clearAllClass}`); 626 627 if (clearAllFilters) { 628 clearAllFilters.addEventListener("click", (e) => { 629 e.stopPropagation(); 630 const updates = {}; 631 PF_FILTER_TYPES.forEach((ft) => { updates[ft] = [] }); 632 handleParamsChange(updates); 633 }); 634 } 635 636 PF_FILTER_TYPES.forEach((filterType) => { 637 const filterContainer = filtersWrapper.querySelector(filterSelector(filterType)); 638 const optionsWrapper = filtersWrapper.querySelector(optionsWrapperSelector(filterType)); 639 const clearOptionsButtons = filterContainer?.querySelectorAll(`.${clearOptionsClass}, .${clearOptionsClassAlt}`) || []; 640 641 if (!optionsWrapper || !filterContainer) return; 642 643 const filterOptionsAvailable = NON_DIMENSION_FILTER_TYPES.includes(filterType) 644 ? (filters[pfCamelize(filterType)] || []).length > 0 645 : (filters.dimensions[filterType] || []).length > 0; 646 647 if (!filterOptionsAvailable) { 648 filterContainer.style.display = "none"; 649 } else { 650 filterContainer.style.display = ""; 651 optionsWrapper.innerHTML = ""; 652 options = NON_DIMENSION_FILTER_TYPES.includes(filterType) 653 ? filters[pfCamelize(filterType)] 654 : filters.dimensions[filterType]; 655 options.forEach((option) => { 656 const optionNode = filterOptionTemplate.cloneNode(true); 657 const optionLabel = optionNode.querySelector(`.${optionLabelClass}`); 658 const optionCheckbox = optionNode.querySelector(`.${optionCheckboxClass}`); 659 const screenType = optionNode.querySelector(".pf-checkbox")?.getAttribute("data-screen"); 660 const labelSlug = option.label.replace(/\s/g, ""); 661 const idPrefix = 662 screenType && screenType === "desktop" 663 ? `${filterType}-${labelSlug}-desktop` 664 : `${filterType}-${labelSlug}`; 665 optionNode.style.display = ""; 666 optionLabel.textContent = option.label; 667 optionLabel.setAttribute("for", `${idPrefix}-${[sectionNodeId]}`); 668 optionCheckbox.id = `${idPrefix}-${[sectionNodeId]}`; 669 optionCheckbox.name = option.value; 670 optionCheckbox.dataset.label = option.label; 671 optionCheckbox.addEventListener("change", (event) => {
672 const currentParams = fetchCurrentParams() || {}; 673 const currentTypeCheckedValues = currentParams[filterType] || []; 674 const newCurrentTypeCheckedValues = 675 event.target.checked 676 ? [...currentTypeCheckedValues, option.value] 677 : currentTypeCheckedValues.filter(x => x !== option.value); 678 const updateParams = { [filterType]: newCurrentTypeCheckedValues }; 679 handleParamsChange(updateParams); 680 }); 681 optionsWrapper.appendChild(optionNode); 682 }); 683 684 clearOptionsButtons.forEach((clearOptionsButton) => { 685 clearOptionsButton.addEventListener("click", (e) => { 686 e.stopPropagation(); 687 handleParamsChange({ [filterType]: [] }); 688 }); 689 }); 690 } 691 }); 692 }); 693} 694 695function pfAddPaginationEvents({ 696 sectionSelector, 697 contentsPerPage, 698 handleParamsChange, 699 fetchTotalContents, 700 fetchCurrentParams 701}) { 702 // If lazy loading, need either of these classes 703 const lazyLoadClass = "pf-lazy-load-button"; 704 const scrollXContainerClass = "pf-bottombar-scroller"; 705 // If pagination, need these classes 706 const previousButtonClass = "pf-pagination-item-previous"; 707 const nextButtonClass = "pf-pagination-item-next"; 708 const pageButtonClass = "pf-pagination-item"; 709 710 const section = document.querySelector(sectionSelector); 711 const lazyLoadButton = section.querySelector(`.${lazyLoadClass}`); 712 const scrollXContainer = section.querySelector(`.${scrollXContainerClass}`); 713 const previousButton = section.querySelector(`.${previousButtonClass}`); 714 const nextButton = section.querySelector(`.${nextButtonClass}`); 715 const pageButtons = section.querySelectorAll(`.${pageButtonClass}`); 716 717 if (lazyLoadButton) { 718 lazyLoadButton.addEventListener("click", () => { 719 const currentPage = fetchCurrentParams().page || 1; 720 const nextPage = currentPage + 1; 721 handleParamsChange({ page: nextPage }, "lazy_load"); 722 }); 723 } 724 725 if (scrollXContainer) { 726 scrollXContainer.addEventListener("scroll", pfDebounce((event) => { 727 const scrollableWidth = event.target.scrollWidth - event.target.clientWidth; 728 const fullyScrolledToRight = event.target.scrollLeft >= scrollableWidth - 1; 729 const totalContents = fetchTotalContents(); 730 const totalPages = Math.ceil(totalContents / contentsPerPage); 731 const currentPage = fetchCurrentParams().page || 1; 732 const morePagesToLoad = currentPage < totalPages; 733 734 if (fullyScrolledToRight && morePagesToLoad) { 735 const nextPage = currentPage + 1; 736 handleParamsChange({ page: nextPage }, "lazy_load"); 737 } 738 }, 500)); 739 } 740 741 if (previousButton) { 742 previousButton.addEventListener("click", (event) => { 743 const currentPage = fetchCurrentParams().page || 1; 744 const newPage = Math.max(currentPage - 1, 1); 745 handleParamsChange({ page: newPage }); 746 }); 747 } 748 749 if (nextButton) { 750 nextButton.addEventListener("click", (event) => { 751 const currentPage = fetchCurrentParams().page || 1; 752 const totalContents = fetchTotalContents(); 753 const totalPages = Math.ceil(totalContents / contentsPerPage); 754 const newPage = Math.min(currentPage + 1, totalPages); 755 handleParamsChange({ page: newPage }); 756 }); 757 } 758 759 pageButtons.forEach((pageButton, index) => { 760 pageButton.addEventListener("click", (event) => { 761 if (pageButton.textContent === "...") return; 762 763 const newPage = parseInt(pageButton.textContent); 764 handleParamsChange({ page: newPage }); 765 }); 766 }); 767} 768 769function pfAddSearchEvent({ sectionSelector, handleParamsChange }) { 770 // The following classes are required 771 const searchInputClass = "pf-content-list-search"; 772 773 const section = document.querySelector(sectionSelector); 774 const searchInput = section?.querySelector(`.${searchInputClass}`); 775 searchInput?.addEventListener("input", pfDebounce((event) => { 776 handleParamsChange({ search: event.target.value }); 777 }), 1000); 778} 779 780function pfAddSortEvents({ sectionSelector, handleParamsChange }) { 781 // The following classes are required 782 const sortContainerClass = "pf-sort"; 783 const optionClass = "pf-sort-selection"; 784 const clearOptionsClass = "clear-options"; 785 const labelSelector = "button"; 786 787 const section = document.querySelector(sectionSelector); 788 const sortContainer = section?.querySelector(`.${sortContainerClass}`); 789 const label = sortContainer?.querySelector(labelSelector); 790 const clearSortButton = sortContainer?.querySelector(`.${clearOptionsClass}`); 791 const options = sortContainer?.querySelectorAll(`.${optionClass}`) || []; 792 793 clearSortButton?.addEventListener("click", (event) => { 794 event.stopPropagation(); 795
796 label.textContent = "Sort by..."; 797 sortContainer.click(); // closes the dropdown 798 handleParamsChange({ sort: "" }); 799 }); 800 801 options.forEach((option) => { 802 option.addEventListener("click", (event) => { 803 label.textContent = `${event.target.innerHTML}`; 804 sortContainer.click(); // closes the dropdown 805 handleParamsChange({ sort: event.target.dataset.value }); 806 }); 807 }); 808} 809 810function pfUpdateFilters({ sectionSelector, params }) { 811 // All of the following classes need to be present 812 const optionsCountClass = "pf-selected-options-count"; 813 const checkboxClass = "pf-checkbox"; 814 const totalCountClass = "pf-total-checked-filters-count"; // optional 815 const filterSelector = (type) => { 816 let filterTypeSelector = `.select-${type}`; 817 818 if (["languages", "content_types"].includes(type)) { 819 const filterTypeSingular = type.replace(/s$/, ""); 820 filterTypeSelector += `, .select-${filterTypeSingular}` 821 } 822 823 return filterTypeSelector; 824 }; 825 826 const section = document.querySelector(sectionSelector); 827 828 if (!section) return; 829 830 // Update checked filters count for that filter type 831 PF_FILTER_TYPES.forEach((filterType) => { 832 const filterTypeSelector = filterSelector(filterType); 833 section.querySelectorAll(filterTypeSelector).forEach((filterTypeWrapper) => { 834 const filterCountNode = filterTypeWrapper.querySelector(`.${optionsCountClass}`); 835 const checkedIdsForType = params[filterType] || []; 836 const checkedFiltersCount = checkedIdsForType.length; 837 filterCountNode.textContent = checkedFiltersCount || ""; 838 filterCountNode.style.display = checkedFiltersCount > 0 ? "inline-block" : "none"; 839 840 // Ensure the checkboxes are correctly checked or unchecked 841 const checkboxes = filterTypeWrapper.querySelectorAll(`.${checkboxClass}`); 842 checkboxes.forEach((checkbox) => { 843 const checkboxFilterId = parseInt(checkbox.name); 844 checkbox.checked = checkedIdsForType.includes(checkboxFilterId); 845 }); 846 }); 847 }); 848 849 // Update overall total checked filters count if applicable 850 section.querySelectorAll(`.${totalCountClass}`).forEach((overallFiltersCountNode) => { 851 const totalCheckedFilters = (params.content_types || []).length 852 + (params.languages || []).length 853 + (params.dimensions || []).flat().length; 854 if (overallFiltersCountNode) { 855 overallFiltersCountNode.textContent = totalCheckedFilters || ""; 856 overallFiltersCountNode.style.display = totalCheckedFilters > 0 ? "" : "none"; 857 } 858 }); 859} 860 861function pfGeneratePageOptions({ page, totalPages, maxSlots = 7 }) { 862 let pageOptions = []; 863 if (totalPages <= maxSlots) { 864 for (let i = 1; i <= totalPages; i++) { 865 pageOptions.push(i); 866 } 867 } else { 868 pageOptions = [page]; 869 let pagesSlotted = 1; 870 for (let i = 1; pagesSlotted < maxSlots; i++) { 871 const leadingPage = page - i; 872 const trailingPage = page + i; 873 if (leadingPage >= 1) { 874 pageOptions = [leadingPage, ...pageOptions]; 875 pagesSlotted++; 876 } 877 if (trailingPage <= totalPages) { 878 pageOptions = [...pageOptions, trailingPage]; 879 pagesSlotted++; 880 } 881 } 882 if (pageOptions[0] !== 1) { 883 pageOptions[0] = 1; 884 } 885 if (pageOptions[pageOptions.length - 1] !== totalPages) { 886 pageOptions[pageOptions.length - 1] = totalPages; 887 } 888 if (pageOptions[1] > 2) { 889 pageOptions[1] = "..."; 890 } 891 if (pageOptions[pageOptions.length - 2] < totalPages - 1) { 892 pageOptions[pageOptions.length - 2] = "..."; 893 } 894 } 895 896 return pageOptions; 897} 898 899function pfUpdatePagination({ 900 sectionSelector, 901 params, 902 totalContents, 903 currentContents = [], 904 contentsPerPage 905}) { 906 // The following classes are needed if lazy loading 907 const lazyLoadClass = "pf-lazy-load-button"; 908 // The following classes are needed if paginated 909 const nextClass = "pf-pagination-item-next"; 910 const previousClass = "pf-pagination-item-previous"; 911 const pageNumberClass = "pf-pagination-item"; 912 913 const currentPage = params.page || 1; 914 const totalPages = Math.ceil(totalContents / contentsPerPage); 915 const pageNumbers = pfGeneratePageOptions({ page: currentPage, totalPages }); 916 const section = document.querySelector(sectionSelector); 917 const lazyLoadButton = section.querySelector(`.${lazyLoadClass}`); 918 const nextButton = section.querySelector(`.${nextClass}`); 919 const prevButton = section.querySelector(`.${previousClass}`); 920 const contentsLoaded = currentContents.length; 921 const allContentsLoaded = contentsLoaded === totalContents; 922 923 if (lazyLoadButton) { 924 if (totalPages === currentPage || totalContents === 0 || allContentsLoaded) { 925 lazyLoadButton.style.display = "none"; 926 } else { 927 lazyLoadButton.style.display = ""; 928 } 929 } 930 931 if (prevButton && nextButton) { 932 if (currentPage == 1 || totalContents == 0) { 933 prevButton.setAttribute("aria-disabled", true); 934 prevButton.style.display = "none"; 935 } else { 936 prevButton.setAttribute("aria-disabled", false); 937 prevButton.style.display = ""; 938 } 939 940 if (currentPage == totalPages || totalContents == 0) { 941 nextButton.setAttribute("aria-disabled", true); 942 nextButton.style.display = "none"; 943 } else { 944 nextButton.setAttribute("aria-disabled", false); 945 nextButton.style.display = ""; 946 } 947 } 948 949 const activePageClasses = "flex rounded-full items-center justify-center bg-[#5555FF] text-[#ffffff] w-7 h-7".split(' '); 950 section.querySelectorAll(`.${pageNumberClass}`).forEach((pageNumber, index) => { 951 pageNumber.textContent = pageNumbers[index]; 952 pageNumber.style.display = ""; 953 954 if (pageNumbers[index] !== "...") { 955 pageNumber.setAttribute("aria-label", `Page ${pageNumbers[index]} of recommended assets`); 956 } 957 958 if (pageNumbers[index] === currentPage) { 959 pageNumber.classList.add(...activePageClasses); 960 pageNumber.setAttribute("aria-current", "page"); 961 } else { 962 pageNumber.classList.remove(...activePageClasses); 963 pageNumber.removeAttribute("aria-current"); 964 } 965 966 if (index + 1 > pageNumbers.length || (allContentsLoaded && index > 0)) { 967 pageNumber.style.display = "none"; 968 } 969 }); 970} 971 972function pfApplyQueryParams({ handleParamsChange, filtersConfig = {}, enabledFilters = [] }) { 973 const isContentPage = true; 974 const queryParamsApi = new URLSearchParams(window.location.search); 975 const allQueryParams = Object.fromEntries(queryParamsApi); 976 const validParamsList = ["page"].concat( 977 enabledFilters.map((ef) => 978 ["language", "content_type"].includes(ef) ? pfPluralize(ef) : ef 979 ) 980 ); 981 const queryParams = pfFilterKeys(allQueryParams, validParamsList); 982 queryParams.page = parseInt(queryParams.page || "1"); 983 984 if (Object.keys(queryParams).length === 0) return; 985 986 // convert param values to ids. Will work for any language
987 Object.keys(queryParams).forEach((param) => { 988 if (PF_FILTER_TYPES.includes(param)) { 989 const filterLabels = (queryParams[param] || "").split(","); 990 const filterIds = filterLabels.map((label) => { 991 const filterOption = (filtersConfig[param] || filtersConfig[pfCamelize(param)] || []) 992 .find((filterOption) => filterOption.label == label); 993 return filterOption?.value; 994 }).filter((id) => id != undefined); 995 queryParams[param] = filterIds; 996 } 997 }); 998 999 if (Object.keys(queryParams).length == 1 && queryParams.page == 1) return; 1000 1001 handleParamsChange(queryParams, "page_load"); 1002} 1003 1004 1005 1006 1007async function pfFetchContents({ 1008 sectionNodeId = "", 1009 params = {}, 1010 loadedContentUuids = [], 1011 contentsPerPage = 0, 1012 fetchType = "currentPage" // valid values: currentPage, upToPage 1013}) { 1014 const apiUrl = `https://jukebox.pathfactory.com/api/public/v3/get_contents/${window.location.search}`; 1015 const urlParams = new URLSearchParams(window.location.search); 1016 const isContentPage = true; 1017 const landingPageId = isContentPage ? urlParams.get("pflpid") : ""; 1018 const lpSectionNodeId = isContentPage ? urlParams.get("pfsid") : sectionNodeId; 1019 const body = { 1020 ...params, 1021 landingPageId, 1022 sectionNodeId: lpSectionNodeId, 1023 clientId: "LB-931336C1-146", 1024 baseUrl: "https://nurturenow.pathfactory.com", 1025 visitorUuid: pfGetCookie("vid"), 1026 sessionId: (pfGetCookie(/_pf_id.+/) || "").split(".")[5], 1027 segmentGroupId: "", 1028 loadedContentUuids: params.page === 1 ? [] : loadedContentUuids, 1029 // needed by content page 1030 isContentPage: true, 1031 templatedExperienceId: "26766" || undefined, 1032 contentSource: "experience" || undefined 1033 }; 1034 1035 if (fetchType === "upToPage") { 1036 body.page = 1; 1037 body.limit = (params.page || 1) * contentsPerPage; 1038 } 1039 1040 const response = await fetch(apiUrl, { 1041 method: "POST", 1042 headers: { "Content-Type": "application/json" }, 1043 body: JSON.stringify(body) 1044 }); 1045 const result = await response.json(); 1046 1047 return result; 1048} 1049 1050function pfBuildCards({ 1051 sectionSelector = "", 1052 contents = [], 1053 isLazyLoad = false, 1054 currentParams = {}, 1055 isCarousel = false 1056}) { 1057 // Either of these wrapper classes are needed 1058 const contentsWrapperClass = "pf-resource-center-cards-wrapper"; 1059 const sidebarContentsWrapperClass = "pf-cards-wrapper"; 1060 // The following classes are needed 1061 const cardClass = "pf-content-card"; 1062 const templateClass = "template"; 1063 const titleClass = "pf-content-card-title"; 1064 const linkClass = "pf-content-card-link"; 1065 // The following classes are optional 1066 const descriptionClass = "pf-content-card-description"; 1067 const cardCtaClass = "pf-content-card-cta"; 1068 const thumbnailClass = "pf-content-card-thumbnail"; 1069 const cardIconClass = "pf-card-icon"; 1070 1071 const currentPage = currentParams.page; 1072 const section = document.querySelector(sectionSelector); 1073 const contentListWrappers = section.querySelectorAll(`.${contentsWrapperClass}, .${sidebarContentsWrapperClass}`); 1074 contentListWrappers.forEach((contentListWrapper) => { 1075 const contentCardTemplate = contentListWrapper.querySelector(`.${cardClass}.${templateClass}`) 1076 || section.querySelector(`.${cardClass}.${templateClass}`); 1077 1078 if (!contentCardTemplate) return; 1079 1080 if (!isLazyLoad || currentPage == 1) { 1081 contentListWrapper.innerHTML = ""; 1082 if (!isCarousel) { 1083 contentListWrapper.appendChild(contentCardTemplate); 1084 } 1085 } 1086 1087 (contents || []).forEach((c) => { 1088 const contentCard = contentCardTemplate.cloneNode(true); 1089 const cardTitle = contentCard.querySelector(`.${titleClass}`); 1090 const cardDescription = contentCard.querySelector(`.${descriptionClass}`); 1091 const cardThumbnail = contentCard.querySelector(`.${thumbnailClass}`); 1092 const cardLink = contentCard.querySelector(`.${linkClass}`); 1093 const cardCTA = contentCard.querySelector(`.${cardCtaClass}`); 1094 const cardIcon = contentCard.querySelector(`.${cardIconClass}`); 1095 1096 contentCard.dataset.uuid = c.uuid; 1097 cardTitle.textContent = c.title; 1098 cardLink.href = c.url; 1099 contentCard.classList.remove(templateClass); 1100 1101 if (cardThumbnail) { 1102 cardThumbnail.src = c.thumbnail; 1103 cardThumbnail.setAttribute("alt", c.alt_text); 1104 } 1105 1106 if (cardIcon) { 1107 const iconClass = { 1108 webpage: "fa-globe", 1109 pdf: "fa-file-pdf", 1110 image: "fa-file-image", 1111 video: "fa-play-circle" 1112 }[c.mediaType] || "fa-globe"; 1113 cardIcon.className = cardIcon.className.replace(/\bfa-[^\s]+\b/g, "").trim(); 1114 cardIcon.classList.add(iconClass); 1115 } 1116 1117 if (cardLink.dataset.hasOwnProperty("lookbookOverlayHref")) { 1118 cardLink.dataset.lookbookOverlayHref = c.url; 1119 } 1120 1121 if (cardDescription && c.description) { 1122 cardDescription.textContent = c.description; 1123 cardDescription.parentElement.style.display = ""; 1124 } 1125 1126 if (cardCTA) { 1127 cardCTA.textContent = c.ctaLabel; 1128 } 1129 1130 pfAppendTagsToLpCard({ contentCard, content: c}); 1131 1132 contentCard.style.display = ""; 1133 contentListWrapper.appendChild(contentCard); 1134 }); 1135 }); 1136} 1137 1138function pfAppendTagsToLpCard({ contentCard, content: c }) { 1139 // The following classes are needed if is landing page 1140 const tagsOnCardWrapperClass = "pf-content-tag-on-card-wrapper"; 1141 const tagsBelowCardWrapperClass = "pf-content-tag-below-card-wrapper"; 1142 const tagOnCardClass = "pf-content-tag-on-card"; 1143 const tagBelowCardClass = "pf-content-tag-below-card"; 1144 // The following classes are needed if is content page 1145 const sidebarCardTagsWrapperClass = "pf-content-tags-wrapper"; 1146 const sidebarTagClass = "pf-content-tag"; 1147 // The following classes are needed 1148 const pinnedClass = "pf-pinned-content-tag"; 1149 1150 const tagsOnCardWrapper = contentCard.querySelector(`.${tagsOnCardWrapperClass}`); 1151 const tagsBelowCardWrapper = contentCard.querySelector(`.${tagsBelowCardWrapperClass}`); 1152 const sidebarCardTagsWrapper = contentCard.querySelector(`.${sidebarCardTagsWrapperClass}`); 1153 1154 if (c.isPinned) { 1155 const pinnedTag = contentCard.querySelector(`.${pinnedClass}`); 1156 pinnedTag.style.display = ""; 1157 } 1158 1159 if (tagsOnCardWrapper) { 1160 const tagOnCardTemplate = tagsOnCardWrapper.querySelector(`.${tagOnCardClass}`); 1161 const enabledTagTypes = tagOnCardTemplate.dataset.enabledTags.split(","); 1162 1163 if (c.contentType && enabledTagTypes.includes("content_type")) { 1164 const contentTypeTag = tagOnCardTemplate.cloneNode(); 1165 contentTypeTag.textContent = c.contentType; 1166 tagsOnCardWrapper.appendChild(contentTypeTag); 1167 } 1168 1169 if (c.language && enabledTagTypes.includes("language")) { 1170 const languageTag = tagOnCardTemplate.cloneNode(); 1171 languageTag.textContent = c.language; 1172 tagsOnCardWrapper.appendChild(languageTag); 1173 } 1174 1175 if (c.isPinned) { 1176 tagsOnCardWrapper.style.display = "flex"; 1177 } 1178 1179 tagOnCardTemplate.remove(); 1180 } 1181 1182 if (tagsBelowCardWrapper) { 1183 const tagBelowCardTemplate = tagsBelowCardWrapper.querySelector(`.${tagBelowCardClass}`); 1184 const enabledTagTypes = tagBelowCardTemplate.dataset.enabledTags.split(","); 1185 1186 const customCategoryDimensionsByType = customCategoryKeys.reduce((acc, item) => { 1187 const camelizedKey = pfCamelize(item); 1188 if (c && c[camelizedKey]) { 1189 acc[item] = c[camelizedKey]; 1190 } 1191 return acc; 1192 }, {}); 1193 1194 const dimensionsByType = { 1195 business_units: c.businessUnits, 1196 funnel_stages: c.funnelStages, 1197 industries: c.industries, 1198 personas: c.personas, 1199 products: c.products, 1200 solutions: c.solutions, 1201 topics: c.topics, 1202 ...customCategoryDimensionsByType 1203 }; 1204 1205 if (Object.values(dimensionsByType).flat().length > 0) {
1206 enabledTagTypes.forEach((type) => { 1207 const dimensions = dimensionsByType[type] || []; 1208 dimensions.forEach((d) => { 1209 const dimensionTag = tagBelowCardTemplate.cloneNode(); 1210 dimensionTag.textContent = d; 1211 tagsBelowCardWrapper.appendChild(dimensionTag); 1212 }); 1213 }); 1214 } 1215 1216 tagBelowCardTemplate.remove(); 1217 } 1218 1219 if (sidebarCardTagsWrapper) { 1220 const tagTemplate = sidebarCardTagsWrapper.querySelector(`.${sidebarTagClass}`); 1221 const enabledTagTypes = tagTemplate.dataset.enabledContentTags.split(","); 1222 enabledTagTypes.forEach((tagType) => { 1223 const tags = [c[pfCamelize(tagType)] || []].flat(); 1224 tags.forEach((tag) => { 1225 const newTagNode = tagTemplate.cloneNode(); 1226 newTagNode.textContent = tag; 1227 newTagNode.style.display = ""; 1228 sidebarCardTagsWrapper.appendChild(newTagNode); 1229 }); 1230 }); 1231 } 1232} 1233 1234// This is for content-list section. Function hides/unhides cards 1235function pfUpdateDisplayedContents({ 1236 sectionSelector = "", 1237 contents = [], 1238 isLazyLoad = false, 1239 currentParams = {} 1240}) { 1241 // The following classes are needed if is glide carousel
1242 const glideContainerClass = "glide"; 1243 1244 const section = document.querySelector(sectionSelector); 1245 const glideCarousel = section.querySelector(`.${glideContainerClass}`); 1246 1247 if (glideCarousel) { 1248 const glideId = glideCarousel?.dataset?.carouselGlideId; 1249 const glideConfig = window.carouselConfiguration?.[glideId]; 1250 let glideApi = window.pfGlides?.[glideId]; 1251 const glideReady = glideConfig && glideApi; 1252 1253 if (!glideReady) return; 1254 1255 glideApi.destroy(); 1256 pfBuildCards({ sectionSelector, contents, isLazyLoad, currentParams, isCarousel: true }); 1257 glideApi = new Glide(glideCarousel, glideConfig) 1258 window.pfGlides[glideId] = glideApi; 1259 glideApi.mount(); 1260 pfUpdateGlideControls({ sectionSelector, currentContents: contents }); 1261 } else { 1262 pfBuildCards({ sectionSelector, contents, isLazyLoad, currentParams }); 1263 } 1264} 1265 1266function pfUpdateGlideControls({ sectionSelector, currentContents = [] }) { 1267 // The following classes are needed for glide carousel 1268 const glideContainerClass = "glide"; 1269 const glideArrowsContainerClass = "glide__arrows"; 1270 const glideBulletClass = "glide__bullet"; 1271 const hiddenBulletClass = "glide__bullet--between"; 1272 1273 const section = document.querySelector(sectionSelector); 1274 const glideContainer = section.querySelector(`.${glideContainerClass}`); 1275 const glideArrowsContainer = section.querySelector(`.${glideArrowsContainerClass}`); 1276 const visibleGlideBullets = section.querySelectorAll(`.${glideBulletClass}:not(.${hiddenBulletClass})`); 1277 let tilesPerRow = glideContainer?.dataset?.tilesPerRow; 1278 if (window.innerWidth > 640 && window.innerWidth <= 1024 && tilesPerRow != 1) { 1279 tilesPerRow = 2; 1280 } else if (window.innerWidth <= 640) { 1281 tilesPerRow = 1; 1282 } 1283 1284 if (!glideContainer || !tilesPerRow) return; 1285 1286 if (glideArrowsContainer) { 1287 glideArrowsContainer.style.display = currentContents.length <= tilesPerRow 1288 ? "none" 1289 : ""; 1290 } 1291 1292 visibleGlideBullets.forEach((bullet) => { 1293 const bulletIndex = (bullet.dataset.glideDir || "0").match(/\d+/)[0] || 0; 1294 const hide = bulletIndex >= currentContents.length || currentContents.length <= tilesPerRow; 1295 bullet.style.display = hide ? "none" : ""; 1296 bullet.setAttribute("tabindex", hide ? -1 : 0); 1297 }); 1298} 1299 1300function pfUpdateContentsStatus({ 1301 sectionSelector, 1302 contents = [] 1303}) { 1304 // The following classes are required 1305 const statusContainerClass = "pf-no-results" 1306 const visuallyHiddenClass = "visually-hidden"; 1307 1308 const section = document.querySelector(sectionSelector); 1309 const statusContainers = section?.querySelectorAll(`.${statusContainerClass}`) || []; 1310 statusContainers.forEach((statusContainer) => { 1311 if (contents.length === 0) { 1312 statusContainer.classList.remove(visuallyHiddenClass); 1313 statusContainer.textContent = "No results match the search/filter criteria."; 1314 } else { 1315 statusContainer.classList.add(visuallyHiddenClass); 1316 statusContainer.textContent = `${contents.length} results found`; 1317 } 1318 }); 1319} 1320 1321function pfUpdateQueryStrings({ sectionSelector, currentParams = {}, filtersConfig = {} }) { 1322 const paramsMappedToLabels = { page: currentParams.page || 1 }; 1323 PF_FILTER_TYPES.forEach((filterType) => { 1324 const selectedIdsForType = currentParams[filterType] || []; 1325 paramsMappedToLabels[filterType] = selectedIdsForType.map((id) => { 1326 const optionsForType = filtersConfig[filterType] || []; 1327 const option = optionsForType.find((option) => option.value == id); 1328 return option?.label; 1329 }).filter((label) => label); 1330 }); 1331 1332 const newBrowserUrl = pfUpdateUrlParams(window.location.href, paramsMappedToLabels); 1333 history.replaceState({}, "", newBrowserUrl); 1334 pfUpdateContentSectionQueryStrings({ sectionSelector, params: paramsMappedToLabels }); 1335} 1336 1337function pfUpdateContentSectionQueryStrings({ sectionSelector, params = {} }) { 1338 // The following classes are needed 1339 const cardClass = "pf-content-card"; 1340 // Classes not strictly needed 1341 const templateClass = "template"; 1342 1343 const section = document.querySelector(sectionSelector); 1344 const contentLinks = section.querySelectorAll(`.${cardClass}:not(.${templateClass}) a`); 1345 contentLinks.forEach((link) => { 1346 link.href = pfUpdateUrlParams(link.href || "", params); 1347 }); 1348} 1349 1350function pfGetContentsOnPage({ sectionSelector }) { 1351 // The following classes are needed 1352 const contentCardClass = "pf-content-card"; 1353 const templateClass = "template"; 1354 1355 const section = document.querySelector(sectionSelector); 1356 1357 if (!section) return []; 1358 1359 const cards = Array.from(section.querySelectorAll(`.${contentCardClass}:not(.${templateClass})`)); 1360 const contentsData = cards.map((card) => ({ uuid: card.dataset.uuid })); 1361 const seen = new Set(); 1362 // To account for presence of desktop & mobile cards 1363 const uniqueContentsData = contentsData.filter((content) => { 1364 if (seen.has(content.uuid)) return false;
1365 seen.add(content.uuid); 1366 return true; 1367 }); 1368 1369 return uniqueContentsData; 1370} 1371 1372// ---------- custom on-image tag overlay due to zigzag layout ---------- 1373function pfMoveOnCardTags(contentCard) { 1374 const imageContainer = contentCard.querySelector('.image-container'); 1375 const onCardWrapper = 1376 contentCard.querySelector('.content-container .pf-content-tag-on-card-wrapper') || 1377 contentCard.querySelector('.pf-content-tag-on-card-wrapper'); 1378 1379 if (!imageContainer || !onCardWrapper) return; 1380 1381 if (getComputedStyle(imageContainer).position === 'static') { 1382 imageContainer.style.position = 'relative'; 1383 } 1384 1385 let overlayHost = imageContainer.querySelector('.pf-tags-overlay'); 1386 if (!overlayHost) { 1387 overlayHost = document.createElement('div'); 1388 overlayHost.className = 'pf-tags-overlay'; 1389 imageContainer.appendChild(overlayHost); 1390 } 1391 if (onCardWrapper.parentElement !== overlayHost) { 1392 overlayHost.appendChild(onCardWrapper); 1393 } 1394 onCardWrapper.classList.add('in-overlay'); 1395 1396 // ensure visible if it has chips 1397 onCardWrapper.style.display = onCardWrapper.childElementCount ? 'inline-flex' : 'none'; 1398 onCardWrapper.style.margin = '0'; 1399 onCardWrapper.style.width = 'auto'; 1400 onCardWrapper.style.maxWidth = '100%'; 1401 1402 // place at the image's top-left corner (slightly outside), regardless of side 1403 requestAnimationFrame(() => { 1404 overlayHost.style.right = ''; 1405 if (!window.matchMedia('(min-width: 768px)').matches) { 1406 overlayHost.style.left = '10px'; // mobile: inside 1407 return; 1408 } 1409 overlayHost.style.left = '-8px'; // desktop: small left bleed 1410 }); 1411} 1412 1413function pfHydrateOnCardTags(sectionEl) { 1414 const cards = sectionEl.querySelectorAll('.content-list-card-side'); 1415 cards.forEach(pfMoveOnCardTags); 1416} 1417 1418function pfRepositionAllOverlays(sectionEl) { 1419 const cards = sectionEl.querySelectorAll('.content-list-card-side'); 1420 cards.forEach(pfMoveOnCardTags); 1421} 1422 1423function pfBuildZigzagCards({ 1424 sectionSelector = "", 1425 contents = [], 1426 isLazyLoad = false, 1427 currentParams = {} 1428}) { 1429 const contentsWrapperClass = "pf-resource-center-cards-wrapper"; 1430 const sidebarContentsWrapperClass = "pf-cards-wrapper"; 1431 const cardClass = "pf-content-card"; 1432 const templateClass = "template"; 1433 const titleClass = "pf-content-card-title"; 1434 const linkClass = "pf-content-card-link"; 1435 const descriptionClass = "pf-content-card-description"; 1436 const cardCtaClass = "pf-content-card-cta"; 1437 const thumbnailClass = "pf-content-card-thumbnail"; 1438 const cardIconClass = "pf-card-icon"; 1439 1440 let section = document.querySelector(sectionSelector); 1441 if (!section) { 1442 if (!sectionSelector.startsWith("section-") && !sectionSelector.startsWith(".section-")) { 1443 section = document.querySelector(`.section-${sectionSelector.replace(/^\./, '')}`); 1444 } 1445 if (!section) { 1446 const nodeId = sectionSelector.replace(/^\.?section-/, ''); 1447 section = document.querySelector(`[data-section-id="${nodeId}"]`); 1448 } 1449 if (!section) return; 1450 } 1451 1452 const contentWrapper = section.querySelector(`.${contentsWrapperClass}, .${sidebarContentsWrapperClass}`); 1453 if (!contentWrapper) return; 1454 1455 const contentCardTemplate = contentWrapper.querySelector(`.${cardClass}.${templateClass}`) || 1456 section.querySelector(`.${cardClass}.${templateClass}`); 1457 if (!contentCardTemplate) return; 1458 1459 if (!isLazyLoad || currentParams.page == 1) { 1460 const templateCopy = contentCardTemplate.cloneNode(true); 1461 contentWrapper.innerHTML = ""; 1462 contentWrapper.appendChild(templateCopy); 1463 } 1464 1465 const noResultsClass = "pf-no-results"; 1466 const visuallyHiddenClass = "visually-hidden"; 1467 const statusContainers = section.querySelectorAll(`.${noResultsClass}, .no-results`) || []; 1468 statusContainers.forEach(statusContainer => { 1469 if (contents.length === 0) { 1470 statusContainer.classList.remove(visuallyHiddenClass); 1471 statusContainer.textContent = "No results match the search/filter criteria"; 1472 } else { 1473 statusContainer.classList.add(visuallyHiddenClass); 1474 statusContainer.textContent = `${contents.length} results found`; 1475 } 1476 }); 1477
1478 (contents || []).forEach((c, index) => { 1479 const contentCard = contentCardTemplate.cloneNode(true); 1480 const isEven = (index + 1) % 2 === 0; 1481 1482 contentCard.classList.remove(templateClass); 1483 contentCard.style.display = "block"; 1484 contentCard.style.visibility = "visible"; 1485 contentCard.dataset.uuid = c.uuid; 1486 1487 contentCard.dataset.contentId = c.id || ''; 1488 contentCard.dataset.title = c.title || ''; 1489 contentCard.dataset.isPinned = c.isPinned || false; 1490 1491 if (c.topics) contentCard.dataset.topics = JSON.stringify(c.topics); 1492 if (c.language) contentCard.dataset.language = c.language; 1493 if (c.personas) contentCard.dataset.personas = JSON.stringify(c.personas); 1494 if (c.businessUnits) contentCard.dataset.businessUnits = JSON.stringify(c.businessUnits); 1495 if (c.industries) contentCard.dataset.industries = JSON.stringify(c.industries); 1496 if (c.products) contentCard.dataset.products = JSON.stringify(c.products); 1497 if (c.solutions) contentCard.dataset.solutions = JSON.stringify(c.solutions); 1498 if (c.contentType) contentCard.dataset.contentType = c.contentType; 1499 if (c.funnelStages) contentCard.dataset.funnelStages = JSON.stringify(c.funnelStages); 1500 1501 const cardTitle = contentCard.querySelector(`.${titleClass}`); 1502 const cardDescription = contentCard.querySelector(`.${descriptionClass}`); 1503 const cardThumbnail = contentCard.querySelector(`.${thumbnailClass}`); 1504 const cardLink = contentCard.querySelector(`.${linkClass}`); 1505 const cardCTA = contentCard.querySelector(`.${cardCtaClass}`); 1506 const cardIcon = contentCard.querySelector(`.${cardIconClass}`); 1507 1508 if (cardTitle) cardTitle.textContent = c.title; 1509 if (cardLink) cardLink.href = c.url; 1510 1511 if (cardThumbnail) { 1512 cardThumbnail.src = c.thumbnail; 1513 cardThumbnail.setAttribute("alt", c.alt_text || c.title); 1514 } 1515 const thumbnails = contentCard.querySelectorAll(`.${thumbnailClass}`); 1516 thumbnails.forEach(img => { 1517 img.src = c.thumbnail; 1518 img.alt = c.alt_text || c.title; 1519 }); 1520 1521 if (cardIcon) { 1522 const iconClass = { 1523 webpage: "fa-globe", 1524 pdf: "fa-file-pdf", 1525 image: "fa-file-image", 1526 video: "fa-play-circle" 1527 }[c.mediaType] || "fa-globe"; 1528 cardIcon.className = cardIcon.className.replace(/\bfa-[^\s]+\b/g, "").trim(); 1529 cardIcon.classList.add(iconClass); 1530 } 1531 1532 if (cardLink && cardLink.dataset.hasOwnProperty("lookbookOverlayHref")) { 1533 cardLink.dataset.lookbookOverlayHref = c.url; 1534 } 1535 1536 if (cardDescription && c.description) { 1537 cardDescription.textContent = c.description; 1538 const descContainer = cardDescription.closest('[style*="display:none"]'); 1539 if (descContainer) descContainer.style.display = ''; 1540 } 1541 1542 if (cardCTA && c.ctaLabel) { 1543 cardCTA.textContent = c.ctaLabel; 1544 } 1545 1546 const zigzagWrapper = document.createElement('div'); 1547 zigzagWrapper.className = isEven ? 'zigzag-item zigzag-even' : 'zigzag-item zigzag-odd'; 1548 1549 try { 1550 pfAppendTagsToLpCard({ contentCard, content: c }); 1551 } catch (e) { 1552 console.error("Error appending tags:", e); 1553 } 1554 1555 zigzagWrapper.appendChild(contentCard); 1556 contentWrapper.appendChild(zigzagWrapper); 1557 1558 // place on-image tags 1559 pfMoveOnCardTags(contentCard); 1560 }); 1561 1562 // after building all cards, ensure placement is correct 1563 pfRepositionAllOverlays(section); 1564} 1565 1566 1567 class PfContentsApi { 1568 static initialParams = { 1569 sort: "", 1570 page: 1, 1571 search: "", 1572 dimensions: [], 1573 languages: [], 1574 content_types: [] 1575 }; 1576 static blankSectionState = { 1577 currentParams: PfContentsApi.initialParams, 1578 currentContents: [], 1579 totalScopedContents: 0, 1580 totalContents: 0, 1581 contentsPerPage: 9, 1582 enablePagination: true, 1583 enableQueryParams: false, 1584 enabledFilters: [], 1585 filtersConfig: {} 1586 }; 1587 static state = {}; 1588 static presets = { 1589 resourceCenter: {}, 1590 contentList: { 1591 buildCards: pfUpdateDisplayedContents 1592 }, 1593 contentPage: {} 1594 }; 1595 1596 constructor({ 1597 // required 1598 sectionNodeId, 1599 // required if not resource-center section 1600 preset = "resourceCenter", 1601 // optional overrides 1602 sectionSelector, 1603 fetchContents, 1604 buildCards, 1605 updateQueryStrings, 1606 updateFilters, 1607 updateStatus, 1608 updatePagination, 1609 fetchFilters, 1610 buildFilters, 1611 addPaginationEvents, 1612 addSearchEvent, 1613 addSortEvents, 1614 applyQueryParams, 1615 getContentsOnPage 1616 }) { 1617 this.preset = preset; 1618 this.sectionNodeId = sectionNodeId; 1619 this.sectionSelector = sectionSelector || `.section-${this.sectionNodeId}`; 1620 this.fetchContents = fetchContents || pfFetchContents; 1621 this.buildCards = buildCards || PfContentsApi.presets[preset]?.buildCards || pfBuildCards; 1622 this.updateQueryStrings = updateQueryStrings || pfUpdateQueryStrings; 1623 this.updateFilters = updateFilters || pfUpdateFilters; 1624 this.updateStatus = updateStatus || pfUpdateContentsStatus; 1625 this.updatePagination = updatePagination || pfUpdatePagination; 1626 this.fetchFilters = fetchFilters || pfFetchFilters; 1627 this.buildFilters = buildFilters || pfBuildFilters; 1628 this.addPaginationEvents = addPaginationEvents || pfAddPaginationEvents; 1629 this.addSearchEvent = addSearchEvent || pfAddSearchEvent; 1630 this.addSortEvents = addSortEvents || pfAddSortEvents; 1631 this.applyQueryParams = applyQueryParams || pfApplyQueryParams; 1632 this.getContentsOnPage = getContentsOnPage || pfGetContentsOnPage; 1633 1634 // Functions used in event listeners (outside a class instance) must bind "this" 1635 this.handleParamsChange = this.handleParamsChange.bind(this); 1636 1637 } 1638 1639 setSectionState(arg1, value) { 1640 const stateUpdates = typeof arg1 === "string" ? { [arg1]: value } : arg1; 1641 PfContentsApi.state[this.sectionNodeId] = { 1642 ...(PfContentsApi.state[this.sectionNodeId] || PfContentsApi.blankSectionState), 1643 ...stateUpdates 1644 }; 1645 } 1646 1647 get sectionState() { 1648 return PfContentsApi.state[this.sectionNodeId] || PfContentsApi.blankSectionState; 1649 } 1650 1651 setCurrentContents(contents = [], isLazyLoad = false) { 1652 const updatedContents = isLazyLoad 1653 ? [...this.sectionState.currentContents, ...contents] 1654 : contents; 1655 this.setSectionState("currentContents", updatedContents); 1656 } 1657
1658 setCurrentParams(params = {}) { 1659 const currentParams = this.sectionState.currentParams; 1660 const groupedCheckedDimensions = DIMENSION_FILTER_TYPES.map((filterType) => 1661 params[filterType] || currentParams[filterType] || [] 1662 ); 1663 const newParams = { 1664 ...currentParams, 1665 ...params, 1666 dimensions: groupedCheckedDimensions, 1667 page: params.page || 1 1668 }; 1669 if (!this.sectionState.enablePagination) { 1670 newParams.page = 1; 1671 newParams.limit = this.sectionState.totalContents; 1672 } 1673 this.setSectionState("currentParams", newParams); 1674 } 1675 1676 // valid values of context: page_load, lazy_load, undefined 1677 async handleParamsChange(params = {}, context = undefined) { 1678 this.setCurrentParams(params); 1679 const response = await this.fetchContents({ 1680 sectionNodeId: this.sectionNodeId, 1681 params: this.sectionState.currentParams, 1682 loadedContentUuids: this.sectionState.currentContents.map((c) => c.uuid), 1683 contentsPerPage: this.sectionState.contentsPerPage, 1684 fetchType: context == "page_load" && this.sectionState.paginationType == "lazy_load" ? "upToPage" : "currentPage" 1685 }) || []; 1686 const contents = response.contents || [] 1687 this.setCurrentContents(contents, context == "lazy_load"); 1688 this.setSectionState("totalScopedContents", response.totalContents || 0); 1689 1690 this.buildCards({ 1691 sectionSelector: this.sectionSelector, 1692 contents: contents, 1693 isLazyLoad: context == "lazy_load", 1694 currentParams: this.sectionState.currentParams 1695 }); 1696 1697 this.updateFilters({ 1698 sectionSelector: this.sectionSelector, 1699 params: this.sectionState.currentParams 1700 }); 1701 this.updateStatus({ 1702 sectionSelector: this.sectionSelector, 1703 contents: this.sectionState.currentContents 1704 }); 1705 this.updatePagination({ 1706 sectionSelector: this.sectionSelector, 1707 params: this.sectionState.currentParams, 1708 totalContents: this.sectionState.totalScopedContents, 1709 currentContents: this.sectionState.currentContents, 1710 contentsPerPage: this.sectionState.contentsPerPage 1711 }); 1712 // Don't want to update query strings on page load because query strings 1713 // are supposed to apply to multiple sections. Once one section applies the 1714 // query params, it must not update the query params based on its own valid 1715 // filters, or else other sections might not get filtered by those values. 1716 // On subsequent filtering from using the UI, then we can update the query 1717 // params because filters UI only meant to apply to its own section. 1718 if (this.sectionState.enableQueryParams && context !== "page_load") { 1719 this.updateQueryStrings({ 1720 sectionSelector: this.sectionSelector, 1721 currentParams: this.sectionState.currentParams, 1722 filtersConfig: this.sectionState.filtersConfig 1723 }); 1724 } 1725 } 1726 1727 async initializeContentControls() { 1728 const filters = await this.fetchFilters(this.sectionNodeId); 1729 this.setSectionState({ 1730 totalScopedContents: filters.totalContents || 0, 1731 totalContents: filters.totalContents || 0, 1732 contentsPerPage: (!filters.enablePagination && filters.totalContents) || filters.contentsPerPage || 0, 1733 enablePagination: filters.enablePagination, 1734 paginationType: filters.paginationType, 1735 enableQueryParams: filters.enableQueryParams, 1736 enabledFilters: filters.enabledFilters || [], 1737 filtersConfig: { 1738 ...(filters.dimensions || {}), 1739 contentTypes: filters.contentTypes, 1740 content_types: filters.contentTypes, 1741 languages: filters.languages 1742 }, 1743 currentContents: this.getContentsOnPage({ sectionSelector: this.sectionSelector }) 1744 }); 1745 1746 this.buildFilters({ 1747 filters, 1748 sectionSelector: this.sectionSelector, 1749 sectionNodeId: this.sectionNodeId, 1750 fetchCurrentParams: () => this.sectionState.currentParams, 1751 handleParamsChange: this.handleParamsChange 1752 }); 1753 this.addPaginationEvents({ 1754 sectionSelector: this.sectionSelector, 1755 contentsPerPage: this.sectionState.contentsPerPage, 1756 handleParamsChange: this.handleParamsChange, 1757 fetchTotalContents: () => this.sectionState.totalScopedContents,
1758 fetchCurrentParams: () => this.sectionState.currentParams 1759 }); 1760 this.updatePagination({ 1761 sectionSelector: this.sectionSelector, 1762 params: this.sectionState.currentParams, 1763 totalContents: this.sectionState.totalScopedContents, 1764 currentContents: this.sectionState.currentContents, 1765 contentsPerPage: this.sectionState.contentsPerPage 1766 }); 1767 this.addSearchEvent({ 1768 sectionSelector: this.sectionSelector, 1769 handleParamsChange: this.handleParamsChange 1770 }); 1771 this.addSortEvents({ 1772 sectionSelector: this.sectionSelector, 1773 handleParamsChange: this.handleParamsChange 1774 }); 1775 if (this.sectionState.enableQueryParams) { 1776 this.applyQueryParams({ 1777 handleParamsChange: this.handleParamsChange, 1778 filtersConfig: this.sectionState.filtersConfig, 1779 enabledFilters: this.sectionState.enabledFilters 1780 }); 1781 } 1782 } 1783 } 1784</script>
1784 1785 1786 1787
1788<script> 1789 const reconstructUrl = (newFilterQueryParams) => { 1790 const isContentPage = true; 1791 if (isContentPage) { 1792 const allowedFilters = ["topics", "languages", "personas", "business_units", "industries", "products", "solutions", "content_types", "funnel_stages", "current_page", ...customCategoryKeys]; 1793 const allParams = new URLSearchParams(window.location.search); 1794 const allParamsAsObject = Object.fromEntries(allParams); 1795 const nonFilterParams = Object.keys(allParamsAsObject). 1796 filter((key) => !allowedFilters.includes(key)). 1797 reduce((cur, key) => { return Object.assign(cur, { [key]: allParamsAsObject[key] })}, {}); 1798 const nonFilterQueryParams = convertToQueryParams(nonFilterParams); 1799 const currentUrl = window.location.href; 1800 const path = currentUrl.substring(0, currentUrl.indexOf('?')); 1801 history.replaceState({}, "", `${path}?${nonFilterQueryParams}&${newFilterQueryParams}`); 1802 const allContentLinks = document.querySelectorAll(".assets-content-page a"); 1803 for (let i = 0; i < allContentLinks.length; i++) { 1804 const contentUrl = allContentLinks[i].href.split("?")[0]; 1805 allContentLinks[i].href = (`${contentUrl}?${nonFilterQueryParams}&${newFilterQueryParams}`.replace("&lb-mode=overlay", "")); 1806 } 1807 } 1808 }; 1809 1810 function pfUpdateCheckedFiltersCount(sectionNodeId) { 1811 const section = document.querySelector(`.section-${sectionNodeId}`); 1812 const optionWrappers = section.querySelectorAll("ul[class*='pf-options-wrapper-']"); 1813 optionWrappers.forEach((wrapper) => { 1814 const f = wrapper.closest("[class*=select-container]"); 1815 1816 if (!f) return; 1817 1818 const checkboxes = Array.from(f.querySelectorAll(".pf-checkbox")); 1819 const checkedOptionsCount = checkboxes.reduce((total, cb) => { 1820 return cb.checked ? total + 1 : total; 1821 }, 0); 1822 const countLabel = f.querySelector(".pf-selected-options-count"); 1823 countLabel.style.display = checkedOptionsCount === 0 ? "none" : "inline-block"; 1824 countLabel.textContent = checkedOptionsCount > 0 ? checkedOptionsCount : ""; 1825 }); 1826 const filterContainers = section.querySelectorAll(".pf-resource-center-filters"); 1827 filterContainers.forEach((filterContainer) => { 1828 const totalCheckedFiltersLabel = filterContainer.querySelector(".pf-total-checked-filters-count"); 1829 const overallFiltersLabel = filterContainer.querySelector(".pf-filters-label"); 1830 if (totalCheckedFiltersLabel && overallFiltersLabel) { 1831 const totalChecked = Array.from(filterContainer.querySelectorAll(".pf-checkbox")).reduce((total, cb) => { 1832 return cb.checked ? total + 1 : total; 1833 }, 0); 1834 totalCheckedFiltersLabel.textContent = totalChecked; 1835 if (totalChecked > 0) { 1836 totalCheckedFiltersLabel.style.display = ""; 1837 overallFiltersLabel.textContent = "Filter by:"; 1838 } else { 1839 totalCheckedFiltersLabel.style.display = "none"; 1840 overallFiltersLabel.textContent = "Filter by"; 1841 } 1842 } 1843 }); 1844 } 1845 1846 function pfUpdateUrlsWithFilterParams(sectionNodeId) { 1847 const filterOptions = window.pfAllFilterOptions || {}; 1848 const selectedFilters = window.pfResourceCenterParams?.[sectionNodeId] || {}; 1849 const userDefinedCategoryParams = customCategoryKeys.reduce((acc, key) => { 1850 acc[key] = selectedFilters?.[key]?.map((id) => filterOptions?.dimensions?.[key]?.find((t) => t.value == id)?.label)?.filter((x) => x) || []; 1851 return acc; 1852 }, {}); 1853 reconstructUrl(convertToQueryParams({ 1854 topics: selectedFilters.topics?.map((id) => filterOptions.dimensions?.topics?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1855 languages: selectedFilters.languages?.map((id) => filterOptions.languages?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1856 personas: selectedFilters.personas?.map((id) => filterOptions.dimensions?.personas?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1857 business_units: selectedFilters.business_units?.map((id) => filterOptions.dimensions?.business_units?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1858 industries: selectedFilters.industries?.map((id) => filterOptions.dimensions?.industries?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1859 products: selectedFilters.products?.map((id) => filterOptions.dimensions?.products?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1860 solutions: selectedFilters.solutions?.map((id) => filterOptions.dimensions?.solutions?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1861 content_types: selectedFilters.content_types?.map((id) => filterOptions.contentTypes?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1862 funnel_stages: selectedFilters.funnel_stages?.map((id) => filterOptions.dimensions?.funnel_stages?.find((t) => t.value == id)?.label)?.filter((x) => x) || [], 1863 current_page: `${selectedFilters.page}`, 1864 ...userDefinedCategoryParams 1865 })); 1866 } 1867 1868 async function pfGetContents({ 1869 sectionNodeId, 1870 isLoadMore = false, 1871 updateParams = {} 1872 }) { 1873 const sectionSelector = `.section-${sectionNodeId}`; 1874 const contents = Array.from(document.querySelectorAll(`.section-${sectionNodeId} .pf-content-card`)); 1875 const contentUuids = contents.map((c) => c.dataset.uuid).filter((x) => x); 1876 const landingPageId = ""; 1877 const segmentGroupId = ""; 1878 const api_url = `${jukeboxApiHost}/api/public/v3/get_contents/${window.location.search}`; 1879 const initialParams = { 1880 sort: "", 1881 page: 1, 1882 search: "", 1883 dimensions: [], 1884 languages: [], 1885 content_types: [] 1886 }; 1887 const newParams = {
1888 ...(window.pfResourceCenterParams?.[sectionNodeId] || initialParams), 1889 ...updateParams 1890 }; 1891 window.pfResourceCenterParams = { 1892 ...(window.pfResourceCenterParams || {}), 1893 [sectionNodeId]: newParams 1894 }; 1895 const body = { 1896 ...newParams, 1897 landingPageId, 1898 sectionNodeId, 1899 clientId, 1900 baseUrl: "https://nurturenow.pathfactory.com", 1901 visitorUuid: pfGetCookie("vid"), 1902 sessionId: (pfGetCookie(/_pf_id.+/) || "").split(".")[5], 1903 segmentGroupId, 1904 loadedContentUuids: newParams.page === 1 ? [] : contentUuids 1905 }; 1906 const response = await fetch(api_url, { 1907 method: "POST", 1908 headers: { "Content-Type": "application/json" }, 1909 body: JSON.stringify(body) 1910 }); 1911 const result = await response.json(); 1912 1913 window.pfResourceCenterParams[sectionNodeId] = { 1914 ...window.pfResourceCenterParams[sectionNodeId], 1915 totalContents: result.totalContents 1916 }; 1917 window.document.dispatchEvent(new CustomEvent('pageMetadataUpdated', { detail: sectionNodeId })); 1918 1919 const section = document.querySelector(sectionSelector); 1920 const contentListWrapper = section.querySelector(".pf-resource-center-cards-wrapper"); 1921 const contentCardTemplate = section.querySelector(".pf-content-card.template"); 1922 1923 if (!contentCardTemplate || !contentListWrapper) return; 1924 1925 if (!isLoadMore) contentListWrapper.innerHTML = ""; 1926 1927 const noResultsMessage = document.querySelector(".pf-no-results"); 1928 if ((result.contents || []).length === 0 && !isLoadMore) { 1929 noResultsMessage.style.display = ""; 1930 } else { 1931 noResultsMessage.style.display = "none"; 1932 } 1933 1934 // This is for dynamically updating filter status message for screen reader 1935 const resultCountMessage = document.querySelector(`${sectionSelector} .results-count`); 1936 if(resultCountMessage) { 1937 const numberOfResults = result && result.contents ? (result.contents).length : 0; 1938 resultCountMessage.textContent = `${numberOfResults} result${numberOfResults !== 1 ? 's' : ''} found`; 1939 } 1940 1941 (result.contents || []).forEach((c) => { 1942 const contentCard = contentCardTemplate.cloneNode(true); 1943 contentCard.dataset.uuid = c.uuid; 1944 contentCard.querySelector(".pf-content-card-title").textContent = c.title; 1945 contentCard.querySelector(".pf-content-card-thumbnail").src = c.thumbnail; 1946 contentCard.querySelector(".pf-content-card-thumbnail").setAttribute("alt", c.alt_text); 1947 contentCard.querySelector(".pf-content-card-link").href = c.url; 1948 const linkNode = contentCard.querySelector(".pf-content-card-link"); 1949 if (linkNode.dataset.hasOwnProperty("lookbookOverlayHref")) { 1950 linkNode.dataset.lookbookOverlayHref = c.url; 1951 } 1952 const descriptionNode = contentCard.querySelector(".pf-content-card-description"); 1953 if (descriptionNode && c.description) { 1954 descriptionNode.textContent = c.description; 1955 descriptionNode.parentElement.style.display = ""; 1956 } 1957 const ctaLabelNode = contentCard.querySelector(".pf-content-card-cta"); 1958 if (ctaLabelNode) { 1959 ctaLabelNode.textContent = c.ctaLabel; 1960 } 1961 1962 const tagsOnCardWrapper = contentCard.querySelector(".pf-content-tag-on-card-wrapper"); 1963 const tagsBelowCardWrapper = contentCard.querySelector(".pf-content-tag-below-card-wrapper"); 1964 1965 if (tagsOnCardWrapper || tagsBelowCardWrapper) { 1966 const tagOnCardTemplate = tagsOnCardWrapper?.querySelector(".pf-content-tag-on-card"); 1967 const tagBelowCardTemplate = tagsBelowCardWrapper?.querySelector(".pf-content-tag-below-card"); 1968 const enabledTagTypes = (tagBelowCardTemplate || tagOnCardTemplate).dataset.enabledTags.split(","); 1969 if (c.contentType && tagsOnCardWrapper && enabledTagTypes.includes("content_type")) { 1970 const contentTypeTag = tagOnCardTemplate.cloneNode(); 1971 contentTypeTag.textContent = c.contentType; 1972 tagsOnCardWrapper.appendChild(contentTypeTag); 1973 } 1974 if (c.language && tagsOnCardWrapper && enabledTagTypes.includes("language")) { 1975 const languageTag = tagOnCardTemplate.cloneNode(); 1976 languageTag.textContent = c.language; 1977 tagsOnCardWrapper.appendChild(languageTag); 1978 } 1979 const customCategoryDimensionsByType = customCategoryKeys.reduce((acc, item) => { 1980 const camelizedKey = item.replace(/(_\w)/g, function (match) { 1981 return match[1].toUpperCase(); 1982 }) 1983 if (c && c[camelizedKey]) { 1984 acc[item] = c[camelizedKey]; 1985 } 1986 return acc; 1987 }, {}); 1988 1989 const dimensionsByType = { 1990 business_units: c.businessUnits, 1991 funnel_stages: c.funnelStages, 1992 industries: c.industries, 1993 personas: c.personas, 1994 products: c.products, 1995 solutions: c.solutions, 1996 topics: c.topics, 1997 ...customCategoryDimensionsByType 1998 }; 1999 if (Object.values(dimensionsByType).flat().length > 0 && tagsBelowCardWrapper) {
2000 enabledTagTypes.forEach((type) => { 2001 const dimensions = dimensionsByType[type] || []; 2002 dimensions.forEach((d) => { 2003 const dimensionTag = tagBelowCardTemplate.cloneNode(); 2004 dimensionTag.textContent = d; 2005 tagsBelowCardWrapper.appendChild(dimensionTag); 2006 }); 2007 }); 2008 } 2009 if(tagOnCardTemplate) tagOnCardTemplate.remove(); 2010 if(tagBelowCardTemplate) tagBelowCardTemplate.remove(); 2011 if (c.isPinned) { 2012 const pinnedTag = tagsOnCardWrapper.querySelector(".pf-pinned-content-tag"); 2013 pinnedTag.style.display = ""; 2014 tagsOnCardWrapper.style.display = "flex"; 2015 } 2016 } 2017 2018 contentCard.style.display = ""; 2019 contentListWrapper.appendChild(contentCard); 2020 }); 2021 pfUpdateCheckedFiltersCount(sectionNodeId); 2022 if (!isLoadMore) section.scrollIntoView(); 2023 } 2024 2025 async function pfGetFilters(sectionNodeId) { 2026 console.log("Warning: You are using a legacy version of the resource-center which is no longer supported."); 2027 const isContentPage = true; 2028 const urlParams = new URLSearchParams(window.location.search); 2029 const sectionSelector = `.section-${sectionNodeId}`; 2030 const contentPlayUuid = urlParams.get("pf_cpid"); 2031 const campaignUuid = urlParams.get("pf_cid"); 2032 const landingPageId = 2033 isContentPage 2034 ? urlParams.get("pflpid") 2035 : ""; 2036 const lpSectionNodeId = 2037 isContentPage 2038 ? urlParams.get("pfsid") 2039 : sectionNodeId; 2040 const segmentGroupId = ""; 2041 2042 const contentPageParams = isContentPage ? { 2043 isContentPage: true, 2044 contentSource: "experience", 2045 templatedExperienceId: "26766" 2046 } : {}; 2047 2048 const apiUrl = new URL(`${jukeboxApiHost}/api/public/v3/get_filter_options`); 2049 const params = { ...contentPageParams, landingPageId, sectionNodeId: lpSectionNodeId, clientId, segmentGroupId, pf_cpid: contentPlayUuid, pf_cid: campaignUuid }; 2050 apiUrl.search = new URLSearchParams(params); 2051 const response = await fetch(apiUrl); 2052 const result = await response.json(); 2053 window.pfAllFilterOptions = result; 2054 2055 if (typeof result?.totalContents === "number") { 2056 window.pfResourceCenterParams = { 2057 ...(window.pfResourceCenterParams || {}), 2058 [sectionNodeId]: { 2059 ...(window.pfResourceCenterParams?.[sectionNodeId] || {}), 2060 totalContents: result.totalContents || 0 2061 } 2062 }; 2063 window.document.dispatchEvent(new CustomEvent('pageMetadataUpdated', { detail: sectionNodeId })); 2064 } 2065 2066 const section = document.querySelector(sectionSelector); 2067 const allFiltersWrapper = section.querySelectorAll(".pf-resource-center-filters"); 2068 2069 if (allFiltersWrapper.length === 0) return; 2070 2071 allFiltersWrapper.forEach((filtersWrapper) => { 2072 const filterOptionTemplate = filtersWrapper.querySelector(".pf-options.pf-template"); 2073 const contentTypeOptionsWrapper = 2074 filtersWrapper.querySelector(".pf-options-wrapper-content_type") 2075 || filtersWrapper.querySelector(".pf-options-wrapper-content_types"); 2076 const languageOptionsWrapper = 2077 filtersWrapper.querySelector(".pf-options-wrapper-language") 2078 || filtersWrapper.querySelector(".pf-options-wrapper-languages"); 2079 2080 if (contentTypeOptionsWrapper) { 2081 if (result.contentTypes.length === 0) { 2082 filtersWrapper.querySelector("[class*='select-content_type']").style.display = "none"; 2083 } else { 2084 filtersWrapper.querySelector("[class*='select-content_type']").style.display = ""; 2085 contentTypeOptionsWrapper.innerHTML = ""; 2086 } 2087 result.contentTypes.forEach((ct) => { 2088 const contentTypeOption = filterOptionTemplate.cloneNode(true); 2089 const screenType = contentTypeOption?.querySelector(".pf-checkbox")?.getAttribute("data-screen"); 2090 const labelSlug = ct.label.replace(/\s/g, ""); 2091 const idPrefix = 2092 screenType && screenType === "desktop" 2093 ? `content_types-${labelSlug}-desktop` 2094 : `content_types-${labelSlug}`; 2095 contentTypeOption.querySelector(".pf-label").textContent = ct.label; 2096 contentTypeOption.querySelector(".pf-label").setAttribute("for", `${idPrefix}-${[sectionNodeId]}`); 2097 contentTypeOption.querySelector(".pf-checkbox").id =`${idPrefix}-${[sectionNodeId]}`; 2098 contentTypeOption.querySelector(".pf-checkbox").name = ct.value; 2099 contentTypeOption.querySelector(".pf-checkbox").dataset.label = ct.label; 2100 contentTypeOption.style.display = ""; 2101 contentTypeOption.querySelector(".pf-checkbox").addEventListener("change", (event) => { 2102 const currentCheckedValues = window.pfResourceCenterParams?.[
2102sectionNodeId]?.["content_types"] || []; 2103 const checkedContentTypes = 2104 event.target.checked 2105 ? [...currentCheckedValues, ct.value] 2106 : currentCheckedValues.filter(x => x !== ct.value); 2107 const newParams = { ["content_types"]: checkedContentTypes, page: 1 }; 2108 if (isContentPage) { 2109 pfGetContentPageContents({ sectionNodeId, updateParams: newParams }); 2110 } else { 2111 pfGetContents({ sectionNodeId, updateParams: newParams }); 2112 } 2113 }); 2114 contentTypeOptionsWrapper.appendChild(contentTypeOption); 2115 }); 2116 } 2117 2118 if (languageOptionsWrapper) { 2119 if (result.languages.length === 0) { 2120 filtersWrapper.querySelector("[class*='select-language']").style.display = "none"; 2121 } else { 2122 filtersWrapper.querySelector("[class*='select-language']").style.display = ""; 2123 languageOptionsWrapper.innerHTML = ""; 2124 } 2125 result.languages.forEach((l) => { 2126 const languageOption = filterOptionTemplate.cloneNode(true); 2127 const screenType = languageOption?.querySelector(".pf-checkbox")?.getAttribute("data-screen"); 2128 const labelSlug = l.label.replace(/\s/g, ""); 2129 const idPrefix = 2130 screenType && screenType === "desktop" 2131 ? `languages-${labelSlug}-desktop` 2132 : `languages-${labelSlug}`; 2133 languageOption.querySelector(".pf-label").textContent = l.label; 2134 languageOption.querySelector(".pf-label").setAttribute("for", `${idPrefix}-${[sectionNodeId]}`); 2135 languageOption.querySelector(".pf-checkbox").id = `${idPrefix}-${[sectionNodeId]}`; 2136 languageOption.querySelector(".pf-checkbox").name = l.value; 2137 languageOption.querySelector(".pf-checkbox").dataset.label = l.label; 2138 languageOption.style.display = ""; 2139 languageOption.querySelector(".pf-checkbox").addEventListener("change", (event) => { 2140 const currentCheckedValues = window.pfResourceCenterParams?.[sectionNodeId]?.languages || []; 2141 const checkedLanguages = 2142 event.target.checked 2143 ? [...currentCheckedValues, l.value] 2144 : currentCheckedValues.filter(x => x !== l.value); 2145 const newParams = { ["languages"]: checkedLanguages, page: 1 }; 2146 if (isContentPage) { 2147 pfGetContentPageContents({ sectionNodeId, updateParams: newParams }); 2148 } else { 2149 pfGetContents({ sectionNodeId, updateParams: newParams }); 2150 } 2151 }); 2152 languageOptionsWrapper.appendChild(languageOption); 2153 }); 2154 } 2155 2156 const dimensionTypes = [ 2157 "topics", 2158 "personas", 2159 "business_units", 2160 "industries", 2161 "products", 2162 "solutions", 2163 "funnel_stages", 2164 ...customCategoryKeys 2165 ]; 2166 2167 dimensionTypes.forEach((dt) => { 2168 const optionsWrapper = filtersWrapper.querySelector(`.pf-options-wrapper-${dt}`); 2169 if (optionsWrapper && (result.dimensions[dt] || []).length === 0) { 2170 filtersWrapper.querySelector(`.select-${dt}`).style.display = "none"; 2171 } 2172 if (optionsWrapper && (result.dimensions[dt] || []).length > 0) { 2173 filtersWrapper.querySelector(`.select-${dt}`).style.display = ""; 2174 optionsWrapper.innerHTML = ""; 2175 result.dimensions[dt].forEach((d) => { 2176 const option = filterOptionTemplate.cloneNode(true); 2177 const screenType = option.querySelector(".pf-checkbox")?.getAttribute("data-screen"); 2178 const labelSlug = d.label.replace(/\s/g, ""); 2179 const idPrefix = 2180 screenType && screenType === "desktop" 2181 ? `${dt}-${labelSlug}-desktop` 2182 : `${dt}-${labelSlug}`; 2183 option.querySelector(".pf-label").textContent = d.label; 2184 option.querySelector(".pf-label").setAttribute("for", `${idPrefix}-${[sectionNodeId]}`); 2185 option.querySelector(".pf-checkbox").id = `${idPrefix}-${[sectionNodeId]}`; 2186 option.querySelector(".pf-checkbox").name = d.value; 2187 option.querySelector(".pf-checkbox").dataset.label = d.label; 2188 option.style.display = ""; 2189 option.querySelector(".pf-checkbox").addEventListener("change", (event) => { 2190 const currentTypeCheckedValues = window.pfResourceCenterParams?.[
2190sectionNodeId]?.[dt] || []; 2191 const newCurrentTypeCheckedValues = 2192 event.target.checked 2193 ? [...currentTypeCheckedValues, d.value] 2194 : currentTypeCheckedValues.filter(x => x !== d.value); 2195 const newCheckedDimensions = [ 2196 ...dimensionTypes.map((type) => { 2197 if (type !== dt) return window.pfResourceCenterParams?.[sectionNodeId]?.[type]; 2198 }), 2199 newCurrentTypeCheckedValues 2200 ].filter(x => x); 2201 const newParams = { 2202 [dt]: newCurrentTypeCheckedValues, 2203 dimensions: newCheckedDimensions, 2204 page: 1 2205 }; 2206 if (isContentPage) { 2207 pfGetContentPageContents({ sectionNodeId, updateParams: newParams }); 2208 } else { 2209 pfGetContents({ sectionNodeId, updateParams: newParams }); 2210 } 2211 }); 2212 optionsWrapper.appendChild(option); 2213 }); 2214 } 2215 }); 2216 2217 window.document.dispatchEvent(new CustomEvent('pfFiltersRendered', { detail: sectionNodeId })); 2218 }); 2219 } 2220 2221 async function pfGetContentPageContents({ isLoadMore = false, sectionNodeId, initialLimit, pageAfterInitialLimit, updateParams = {}}) { 2222 const urlParams = new URLSearchParams(window.location.search); 2223 const filterParams = ["topics", "languages", "personas", "business_units", "industries", "products", "solutions", "content_types", "funnel_stages", ...customCategoryKeys]; 2224 filterParams.forEach((p) => urlParams.delete(p)); 2225 const templatedExperienceId = "26766"; 2226 const contentSource = "experience"; 2227 const segmentGroupId = ""; 2228 const landingPageId = urlParams.get("pflpid"); 2229 const lpSectionNodeId = urlParams.get("pfsid"); 2230 const contents = Array.from(document.querySelectorAll(`.section-${sectionNodeId} .pf-content-card`)); 2231 const contentUuids = contents.map((c) => c.dataset.uuid).filter((x) => x); 2232 const api_url = `${jukeboxApiHost}/api/public/v3/get_contents/?${urlParams.toString()}`; 2233 const initialParams = { 2234 sort: "", 2235 page: 1, 2236 search: "", 2237 dimensions: [], 2238 languages: [], 2239 content_types: [] 2240 }; 2241 const newParams = { 2242 ...(window.pfResourceCenterParams?.[sectionNodeId] || initialParams), 2243 ...updateParams 2244 }; 2245 window.pfResourceCenterParams = { 2246 ...(window.pfResourceCenterParams || {}), 2247 [sectionNodeId]: newParams 2248 }; 2249 const body = { 2250 ...newParams, 2251 templatedExperienceId, 2252 contentSource, 2253 landingPageId, 2254 sectionNodeId: lpSectionNodeId, 2255 clientId, 2256 baseUrl: "https://nurturenow.pathfactory.com", 2257 visitorUuid: pfGetCookie("vid"), 2258 sessionId: (pfGetCookie(/_pf_id.+/) || "").split(".")[5], 2259 segmentGroupId, 2260 isContentPage: true, 2261 loadedContentUuids: newParams.page === 1 ? [] : contentUuids 2262 }; 2263 if (!isLoadMore && initialLimit) { 2264 body.limit = initialLimit; 2265 } 2266 const response = await fetch(api_url, { 2267 method: "POST", 2268 headers: { "Content-Type": "application/json" }, 2269 body: JSON.stringify(body) 2270 }); 2271 const result = await response.json(); 2272 2273 window.pfResourceCenterParams[sectionNodeId] = { 2274 ...window.pfResourceCenterParams[sectionNodeId], 2275 totalContents: result.totalContents 2276 }; 2277 2278 if (!isLoadMore && pageAfterInitialLimit) { 2279 window.pfResourceCenterParams[sectionNodeId].page = pageAfterInitialLimit; 2280 } 2281 2282 window.document.dispatchEvent(new CustomEvent('pageMetadataUpdated', { detail: sectionNodeId })); 2283 2284 // The following will handle desktop and mobile content lists 2285 const contentListWrappers = document.querySelectorAll(".pf-cards-wrapper"); 2286 contentListWrappers.forEach((contentListWrapper) => { 2287 const contentCardTemplate = contentListWrapper.querySelector(".pf-content-card.template");
2288 const loadMoreButton = contentListWrapper.querySelector(".pf-load-more"); 2289 2290 if (!contentCardTemplate) return; 2291 2292 if (!isLoadMore) { 2293 contentListWrapper.innerHTML = ""; 2294 contentCardTemplate.style.display = "none"; 2295 contentListWrapper.appendChild(contentCardTemplate); 2296 2297 const noResultsMessages = document.querySelectorAll(".pf-no-results"); 2298 if ((result.contents || []).length === 0) { 2299 noResultsMessages.forEach((noResultsMessage) => { 2300 noResultsMessage.style.display = "block"; 2301 }); 2302 } else { 2303 noResultsMessages.forEach((noResultsMessage) => { 2304 noResultsMessage.style.display = "none"; 2305 }); 2306 } 2307 }; 2308 2309 (result.contents || []).forEach((c) => { 2310 const contentCard = contentCardTemplate.cloneNode(true); 2311 const thumbnail = contentCard.querySelector(".pf-content-card-thumbnail"); 2312 const pinnedTag = contentCard.querySelector(".pf-pinned-content-tag"); 2313 const tagTemplate = contentCard.querySelector(".pf-content-tag"); 2314 contentCard.dataset.uuid = c.uuid; 2315 contentCard.classList.remove("template"); 2316 contentCard.querySelector(".pf-content-card-title").textContent = c.title; 2317 if (thumbnail) { 2318 thumbnail.src = c.thumbnail; 2319 thumbnail.setAttribute("alt", c.alt_text); 2320 } 2321 contentCard.querySelector(".pf-content-card-link").href = c.url; 2322 contentCard.querySelector(".pf-content-card-link").onclick = () => { 2323 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && window['initializeContentEvents']('contentClick', {contentId: c.id}); 2324 }; 2325 if (c.isPinned && pinnedTag) { pinnedTag.style.display = "" } 2326 if (tagTemplate) { 2327 const enabledTags = (tagTemplate.dataset.enabledContentTags || "").split(",").filter(x => x); 2328 if (enabledTags.length > 0) { 2329 const tagsWrapper = contentCard.querySelector(".pf-content-tags-wrapper"); 2330 enabledTags.forEach((tagType) => { 2331 const camelizedKey = tagType.replace(/(_\w)/g, function (match) { 2332 return match[1].toUpperCase(); 2333 }); 2334 [c[camelizedKey] || []].flat().forEach((tag) => { 2335 const newTag = tagTemplate.cloneNode(true); 2336 newTag.textContent = tag; 2337 newTag.style.display = "block"; 2338 tagsWrapper.appendChild(newTag); 2339 }); 2340 }); 2341 } 2342 } 2343 contentCard.style.display = ""; 2344 contentListWrapper.appendChild(contentCard); 2345 }); 2346 2347 if (loadMoreButton) { 2348 contentListWrapper.appendChild(loadMoreButton); // Moves the button back to bottom 2349 const totalPages = Math.ceil(window.pfResourceCenterParams[sectionNodeId].totalContents / window.pfResourceCenterParams[sectionNodeId].limit); 2350 if (window.pfResourceCenterParams[sectionNodeId].page == totalPages) { 2351 loadMoreButton.style.display = "none"; 2352 } 2353 } 2354 2355 pfUpdateCheckedFiltersCount(sectionNodeId); 2356 pfUpdateUrlsWithFilterParams(sectionNodeId); 2357 }); 2358 } 2359 2360 function handleFilterChange(nodeId) { 2361 const isDeviceMobile = window.innerWidth <= 640; 2362 const isDeviceTablet = window.innerWidth <= 1024; 2363 const mobileFilters = document.querySelector(`.section-${nodeId} .mobile-filters-container`); 2364 const mobileFiltersVisible = mobileFilters && window.getComputedStyle(mobileFilters).display !== "none"; 2365 const filters = 2366 mobileFiltersVisible 2367 ? mobileFilters 2368 : document.querySelector(`.section-${nodeId} .filters-container`); 2369 const search = document.querySelector(`#search-${nodeId}`)?.value?.toLowerCase() || ""; 2370 const selectedTopics = filters.querySelector(".select-topics")?.value || []; 2371 const selectedLanguages = filters.querySelector(".select-languages")?.value || []; 2372 const selectedPersonas = filters.querySelector(".select-personas")?.value || []; 2373 const selectedBusinessUnits = filters.querySelector(".select-business_units")?.value || []; 2374 const selectedIndustries = filters.querySelector(".select-industries")?.value || []; 2375 const selectedProducts = filters.querySelector(".select-products")?.value || []; 2376 const selectedSolutions = filters.querySelector(".select-solutions")?.value || []; 2377 const selectedContentTypes = filters.querySelector(".select-content_types")?.value || []; 2378 const selectedFunnelStages = filters.querySelector(".select-funnel_stages")?.value || []; 2379 const filterObj = { 2380 topics: selectedTopics, 2381 languages: selectedLanguages, 2382 personas: selectedPersonas, 2383 business_units: selectedBusinessUnits, 2384 industries: selectedIndustries, 2385 products: selectedProducts, 2386 solutions: selectedSolutions, 2387 content_types: selectedContentTypes, 2388 funnel_stages: selectedFunnelStages 2389 }; 2390 const carouselArrow = document.querySelector(`.carousel-arrows-${nodeId}`); 2391 const carouselSection = document.querySelector(`.carousel-${nodeId}`); 2392 const configuredTilesPerRow = carouselSection ? carouselSection?.dataset?.tilesPerRow : ""; 2393 const tabletTilesPerRow = configuredTilesPerRow === "1" ? "1" : "2"; 2394 const tilesPerRow = Number(isDeviceMobile ? "1" : (isDeviceTablet ? tabletTilesPerRow : configuredTilesPerRow)); 2395
2396 customCategories.forEach(filter => { 2397 const className = `.select-${filter.value}`; 2398 const selectedValue = filters.querySelector(className)?.value || [] 2399 filterObj[filter.value] = selectedValue; 2400 }) 2401 2402 const newQueryString = convertToQueryParams(filterObj); 2403 reconstructUrl(newQueryString); 2404 window.assets = window.assets || {}; 2405 if (!window.assets[`asset-${nodeId}`]) { 2406 window.assets[`asset-${nodeId}`] = document.querySelectorAll(`.assets-${nodeId} > .asset`); 2407 } 2408 2409 const matches = Array.from(window.assets[`asset-${nodeId}`]).filter((asset) => { 2410 const topicMatches = selectedTopics.length == 0 || selectedTopics.findIndex((topic) => asset.dataset.topics.includes(topic)) > -1; 2411 const searchMatches = asset.dataset.title.toLowerCase().includes(search) || !search; 2412 const languageMatches = selectedLanguages.length == 0 || selectedLanguages.findIndex((language) => asset.dataset.language.includes(language)) > -1; 2413 const personaMatches = selectedPersonas.length == 0 || selectedPersonas.findIndex((persona) => asset.dataset.personas.includes(persona)) > -1; 2414 const businessUnitMatches = selectedBusinessUnits.length == 0 || selectedBusinessUnits.findIndex((value) => asset.dataset.businessUnits.includes(value)) > -1; 2415 const industryMatches = selectedIndustries.length == 0 || selectedIndustries.findIndex((value) => asset.dataset.industries.includes(value)) > -1; 2416 const productMatches = selectedProducts.length == 0 || selectedProducts.findIndex((value) => asset.dataset.products.includes(value)) > -1; 2417 const solutionMatches = selectedSolutions.length == 0 || selectedSolutions.findIndex((value) => asset.dataset.solutions.includes(value)) > -1; 2418 const contentTypeMatches = selectedContentTypes.length == 0 || selectedContentTypes.findIndex((value) => asset.dataset.contentType.includes(value)) > -1; 2419 const funnelStageMatches = selectedFunnelStages.length == 0 || selectedFunnelStages.findIndex((value) => asset.dataset.funnelStages.includes(value)) > -1; 2420 2421 const customCategoriesMatches = customCategories.every(category => { 2422 const customFilter = category.value; 2423 if (filterObj[customFilter].length === 0) return true; 2424 const dataSetKey = "data-" + customFilter.replaceAll("_", "-") 2425 return filterObj[customFilter].some(value => asset.getAttribute(dataSetKey)?.includes(value)); 2426 }); 2427 2428 const isPinned = asset.dataset.isPinned == "true"; 2429 2430 const assetMatchesAllFilters = 2431 isPinned || 2432 ( 2433 topicMatches && searchMatches && languageMatches && personaMatches && businessUnitMatches && 2434 industryMatches && productMatches && solutionMatches && contentTypeMatches && 2435 funnelStageMatches && customCategoriesMatches 2436 ); 2437 2438 if (assetMatchesAllFilters) { 2439 asset.style.display = ""; 2440 } else { 2441 asset.style.display = "none"; 2442 } 2443 2444 return assetMatchesAllFilters; 2445 }); 2446 if (matches.length === 0) { 2447 document.querySelectorAll(`.section-${nodeId} .no-results`).forEach((noResultsMessage) => { 2448 noResultsMessage.classList.remove("hidden"); 2449 }); 2450 2451 // This is for dynamically updating filter status message for screen reader 2452 document.querySelectorAll(`.section-${nodeId} .results-count`)?.forEach((resultCountMessage) => { 2453 resultCountMessage.textContent = `${matches.length} result found`; 2454 }); 2455 } else { 2456 document.querySelectorAll(`.section-${nodeId} .no-results`).forEach((noResultsMessage) => { 2457 noResultsMessage.classList.add("hidden"); 2458 }); 2459 2460 // This is for dynamically updating filter status message for screen reader 2461 document.querySelectorAll(`.section-${nodeId} .results-count`)?.forEach((resultCountMessage) => { 2462 resultCountMessage.textContent = `${matches.length} results found`; 2463 }); 2464 } 2465 2466 const updatedAssets = document.createDocumentFragment(); 2467 const bulletsContainer = document.querySelector(`.carousel-${nodeId} .glide__bullets`); 2468 const showCarouselArrow = matches.length > tilesPerRow; 2469 2470 if (bulletsContainer) { 2471 const updatedBulletContainer = document.createDocumentFragment(); 2472 bulletsContainer.innerHTML = '';
2473 matches.forEach((asset, index) => { 2474 updatedAssets.appendChild(matches[index]); 2475 const i = index + 1; 2476 if (tilesPerRow) { 2477 const remainder = (i + tilesPerRow) % tilesPerRow; 2478 const buttonElement = document.createElement('button'); 2479 buttonElement.className = `glide__bullet ${!(remainder == 1 || tilesPerRow == 1) && 'glide__bullet--between'}`; 2480 buttonElement.setAttribute('data-glide-dir', `=${i-1}`); 2481 buttonElement.setAttribute('aria-label', `scroll to content ${i}`); 2482 updatedBulletContainer.appendChild(buttonElement); 2483 } 2484 }); 2485 const carouselContainer = document.querySelector(`.carousel-${nodeId} .assets-${nodeId}`); 2486 if (carouselContainer) { 2487 carouselContainer.innerHTML = ''; 2488 carouselContainer.appendChild(updatedAssets); 2489 } 2490 updatedBulletContainer && bulletsContainer.appendChild(updatedBulletContainer); 2491 if (window.pfGlides && window.pfGlides[`glide-${nodeId}`]) { 2492 const mountAndGo = window.customThrottle(() => { 2493 window.pfGlides[`glide-${nodeId}`].destroy(); 2494 const carousel = document.querySelector(`.carousel-${nodeId}`); 2495 if (carousel) { 2496 window.pfGlides[`glide-${nodeId}`] = new Glide(carousel, window.carouselConfiguration ? window.carouselConfiguration[`glide-${nodeId}`] : {}); 2497 window.pfGlides[`glide-${nodeId}`].mount(); 2498 window.pfGlides[`glide-${nodeId}`].go('=0'); 2499 } 2500 }, 1000); 2501 mountAndGo(); 2502 } 2503 } 2504 2505 function showHideCarouselActions(type) { 2506 if (bulletsContainer) { 2507 bulletsContainer.style.display = type; 2508 } 2509 if (carouselArrow?.style) { 2510 carouselArrow.style.display = type; 2511 } 2512 } 2513 showHideCarouselActions(showCarouselArrow ? "" : "none"); 2514 } 2515</script>
2515 2516 2517 2518
2519<script> 2520 function trapElementFocus(wrapper, event) { 2521 if (wrapper && !wrapper.classList.contains("hidden")) { 2522 function isVisible(element) { 2523 return element.offsetParent !== null; 2524 } 2525 2526 let wrapperElements = [ 2527 ...wrapper.querySelectorAll( 2528 "button, a[href], input, select, textarea, [tabindex]:not([tabindex='-1'])" 2529 ), 2530 ].filter((el) => isVisible(el) && el.tabIndex !== -1); 2531 2532 if (wrapperElements.length > 0) { 2533 const firstElement = wrapperElements[0]; 2534 const lastElement = wrapperElements[wrapperElements.length - 1]; 2535 2536 if (event.shiftKey && document.activeElement === firstElement) { 2537 lastElement.focus(); 2538 event.preventDefault(); 2539 } else if (!event.shiftKey && document.activeElement === lastElement) { 2540 firstElement.focus(); 2541 event.preventDefault(); 2542 } 2543 } 2544 } 2545 } 2546</script>
2546 2547 2548
2549<script defer> 2550 const pfShowCookieSettingsModal = () => { 2551 const cookieSettingsContainer = document.querySelector("#qa-modal-container"); 2552 const cookieSettingsModal = document.querySelector("#qa-modal-background"); 2553 if (cookieSettingsModal && cookieSettingsContainer) { 2554 cookieSettingsModal.style.display = "block"; 2555 cookieSettingsContainer.style.display = "block"; 2556 const toggle = cookieSettingsContainer.querySelector("#optIn-checkbox"); 2557 toggle.checked = pfConsentStatus(); 2558 } 2559 }; 2560</script>
2560 2561 2562
2563<script defer> 2564 document.addEventListener("click", (event) => { 2565 document.querySelectorAll(".select-container").forEach((select) => { 2566 if (!select.contains(event.target)) { 2567 select.querySelector(".dropdown-list").classList.add("hidden"); 2568 } 2569 }); 2570 }); 2571</script>
2571 2572 2573
2574<script> 2575 document.addEventListener("DOMContentLoaded", () => { 2576 const hash = window.location.hash; 2577 if (hash) { 2578 const observer = new MutationObserver((mutations) => { 2579 const target = document.querySelector(hash); 2580 if (!target) return; 2581 setTimeout(() => { 2582 target.scrollIntoView({ behavior: "smooth" }); 2583 observer.disconnect(); 2584 }, 50); 2585 }); 2586 observer.observe(document.body, { childList: true, subtree: true }); 2587 } 2588 }); 2589</script>
2589 2590 2591 2592 2593 2594 2595
2596<script> 2597 (function(j,o,u,r,n,e,y){j["pfObject"]=n;j[n]=j[n]||function(){ 2598 (j[n].q=j[n].q||[]).push(arguments)},j[n].l=1*new Date();e=o.createElement(u), 2599 y=o.getElementsByTagName(u)[0];e.async=1;e.src=r;y.parentNode.insertBefore(e,y) 2600 })(window,document,"script","https://cdn-app.pathfactory.com/libraries/journey/current/journey.js","pf"); 2601 pf("create", "LB-931336C1-146", { 2602 appId: "01d216c5-9dcf-465b-a148-f0314ffbbbe3", 2603 collectorUrl: "spcollector.pathfactory.com", 2604 consentDeclinedCookieLifetimeDays: "1/48", 2605 contentId: '855820', 2606 contentUuid: "d64d2437-7e3c-489d-a77a-791766708af1", 2607 cookieLifetimeDays: "730", 2608 experienceId: '230169', 2609 experienceUuid: "b8cbb4cf-212e-4691-8906-8b7d57966310", 2610 gdprCookieConsentEnabled: true, 2611 marketingAutomationPlatform: "marketo", 2612 landingPageContentUuid: "", 2613 jukeboxApiHost: "https://jukebox.pathfactory.com", 2614 collectionUuid: "", 2615 childTrackExperienceUuid: "", 2616 enableDemandBase: false, 2617 enableNvidiaNcidCookie: false, 2618 baseUrl: "https://nurturenow.pathfactory.com", 2619 segmentGroupId: "", 2620 enableSixSense: true, 2621 sixSenseApiKey: "68c556039adc0a083a76b0bbdfeff500c6175795", 2622 sixSenseCustomIdToken: "PathFactory-nurturenow-68c556039adc0a083a76b0bbdfeff500c6175795", 2623 sixSenseCacheDuration: "86400", 2624 requestIp: "181.215.65.78", 2625 engagementThreshold: 150, 2626 contentTitle: "PathFactory Overview: Product Tour", 2627 contentUrl: "https://pathfactory.navattic.com/yd6k0hnh?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website", 2628 experienceTypeValue: "5", 2629 snowplowSignalsEnabled: false 2630 }); 2631</script>
2631 2632 2633 2634
2635<script> 2636 const elementInView = (elem) => { 2637 if (!elem) { 2638 return; 2639 } 2640 var bounding = elem.getBoundingClientRect(); 2641 return ( 2642 bounding.top >= 0 && 2643 bounding.left >= 0 && 2644 bounding.bottom <= 2645 (window.innerHeight || document.documentElement.clientHeight) && 2646 bounding.right <= 2647 (window.innerWidth || document.documentElement.clientWidth) 2648 ); 2649 }; 2650 window.customThrottle = (cb, delay) => { 2651 let wait = false; 2652 let storedArgs = null; 2653 2654 const checkStoredArgs = () => { 2655 if (storedArgs == null) { 2656 wait = false; 2657 } else { 2658 cb(...storedArgs); 2659 storedArgs = null; 2660 setTimeout(checkStoredArgs, delay); 2661 } 2662 }; 2663 2664 return (...args) => { 2665 if (wait) { 2666 storedArgs = args; 2667 return; 2668 } 2669 2670 cb(...args); 2671 wait = true; 2672 setTimeout(checkStoredArgs, delay); 2673 }; 2674 }; 2675</script>
2675 2676 2677
2678<script> 2679 window.viewedEmbedForms = []; 2680 const embedFormLoaded = (retryCount, formId, formType) => { 2681 setTimeout(() => { 2682 if (window["showForm"] && typeof window["showForm"] === "function") { 2683 window.showForm({ 2684 formType: formType, 2685 formData: { value: formId } 2686 }); 2687 } else if (retryCount < 5) { 2688 retryCount++; 2689 embedFormLoaded(retryCount, formId, formType); 2690 } 2691 }, 500); 2692 }; 2693 const initEmbedFormShow = (formId, formType, nodeId) => { 2694 const scrollElementToView = () => { 2695 if (window.viewedEmbedForms && !window.viewedEmbedForms.includes(nodeId)) { 2696 const embedFormView = elementInView && elementInView(document.querySelector(`.embed-form-section-${nodeId} .embed-form-container`)); 2697 if (embedFormView) { 2698 embedFormLoaded && embedFormLoaded(0, formId, formType); 2699 window.viewedEmbedForms.push(nodeId); 2700 } 2701 } 2702 } 2703 if (window.customThrottle) { 2704 document.addEventListener("scroll", window.customThrottle(scrollElementToView, 1000)); 2705 } 2706 } 2707</script>
2707 2708 2709 2710
2710<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?version=4.8.0&features=Promise"></script>
2710 2711
2711<script> 2712 if (window.Promise) { 2713 window.pfResolveJukeboxLoaded; 2714 window.pfOnJukeboxLoad = new Promise(function (resolve) { 2715 window.pfResolveJukeboxLoaded = resolve; 2716 }); 2717 } 2718 </script>
2718 2719 2720 2721
2722<script> 2723 window.getPFContact = function() { 2724 var api_host = "https://nurturenow.pathfactory.com"; 2725 return fetch(`${api_host}/get_contact`); 2726 }; 2727</script>
2727 2728 2729
2730<script defer> 2731 function handleOverlay(retries = 0) { 2732 var nextRetryCount = retries + 1; 2733 var rawOverlayUrl = 2734 window.location.search.substring(1).split("&").filter(function(query) { 2735 return query.indexOf("overlay_url=") == 0 2736 })[0] 2737 var overlayUrl = rawOverlayUrl ? decodeURIComponent(rawOverlayUrl.replace("overlay_url=", "")) : null; 2738 var overlayContentLink = document.querySelector(`a[data-lookbook-overlay-href^="${overlayUrl}"]`); 2739 const browserHost = new URL(window.location.href).hostname; 2740 const overlayUrlHost = (() => { 2741 try { 2742 const parsedUrl = new URL(overlayUrl); 2743 const parsedProtocol = parsedUrl.protocol; 2744 if (["https:", "http:"].includes(parsedProtocol)) { 2745 return parsedUrl.hostname; 2746 } else { 2747 return null; 2748 } 2749 } catch { 2750 return null; 2751 } 2752 })(); 2753 const validOverlayUrl = !!overlayUrlHost && browserHost === overlayUrlHost; 2754 if (overlayUrl && overlayContentLink) { 2755 overlayContentLink.click() 2756 } else if (overlayUrl && validOverlayUrl) { 2757 var a = document.createElement('a'); 2758 a.setAttribute("data-lookbook-overlay-href", overlayUrl); 2759 a.setAttribute("data-lookbook-close-background-color", "#5555FF"); 2760 a.href = overlayUrl; 2761 a.style.display = "hidden"; 2762 document.body.appendChild(a); 2763 a.click(); 2764 } else if (retries <= 10) { 2765 setTimeout(function() { handleOverlay(nextRetryCount) }, 500); 2766 } 2767 }; 2768 2769 document.addEventListener("DOMContentLoaded", () => { 2770 handleOverlay(); 2771 }); 2772</script>
2772 2773
2774<script> 2775 function pfSelectElements({selector, indexes}, callback) { 2776 let elements = Array.from(document.querySelectorAll(selector)); 2777 2778 if (Array.isArray(indexes)) { 2779 elements = elements.filter((_x, i) => indexes.includes(i)); 2780 } 2781 2782 elements.forEach((e, i) => callback(e, i)); 2783 } 2784 2785 function pfStripTextContent(targetNode) { 2786 let totalChars = 0; 2787 2788 function removeText(node) { 2789 if (node.nodeType === Node.TEXT_NODE) { 2790 totalChars += node.textContent.length; 2791 node.textContent = ''; 2792 } 2793 2794 if (node.nodeType === Node.ELEMENT_NODE) { 2795 if (node.tagName.toLowerCase() === "li" && node.textContent.trim() !== "") { 2796 node.style.visibility = "hidden"; 2797 } 2798 node.childNodes.forEach(removeText); 2799 } 2800 } 2801 2802 removeText(targetNode); 2803 2804 return totalChars; 2805 } 2806 2807 function pfGetTextNodes(targetNode) { 2808 const textNodes = []; 2809 const treeWalker = document.createTreeWalker( 2810 targetNode, 2811 NodeFilter.SHOW_TEXT, 2812 ); 2813 2814 while (treeWalker.nextNode()) { 2815 textNodes.push({ text: treeWalker.currentNode.data, textNode: treeWalker.currentNode}); 2816 } 2817 2818 return textNodes; 2819 } 2820 2821 function pfApplyTypewriterAnimation({ 2822 selector, 2823 indexes = undefined, 2824 duration = 3, 2825 delay = 1, 2826 loop = false, 2827 loopDelay = 0 2828 }) { 2829 pfSelectElements({ selector, indexes }, (element, i) => { 2830 element.style.visibility = "hidden"; 2831 let step = 0; 2832 setTimeout(() => { 2833 const elementOriginalHeight = element.offsetHeight; 2834 element.style["min-height"] = `${elementOriginalHeight}px`; 2835 const textNodes = pfGetTextNodes(element); 2836 const totalChars = pfStripTextContent(element); 2837 const interval = Math.floor((duration * 1000) / totalChars); 2838 element.style.visibility = ""; 2839 textNodes.forEach((tn) => { 2840 for (let i = 1; i <= tn.text.length; i++) { 2841 step++; 2842 setTimeout(() => { 2843 if (tn.textNode.parentNode.closest("li")) { 2844 tn.textNode.parentNode.closest("li").style.visibility = ""; 2845 } 2846 tn.textNode.textContent = tn.text.substring(0, i); 2847 }, interval * step); 2848 } 2849 }); 2850 2851 setTimeout(() => { 2852 element.style["min-height"] = ""; 2853 }, duration * 1000); 2854 2855 if (loop && i === 0) { 2856 setTimeout(() => { 2857 pfApplyTypewriterAnimation({ selector, indexes, duration, delay, loop, loopDelay }); 2858 }, (duration + loopDelay) * 1000); 2859 } 2860 }, delay * 1000); 2861 }); 2862 } 2863 2864 function pfApplySlideAnimation({ 2865 selector, 2866 indexes = undefined, 2867 direction = "right", 2868 duration = 2, 2869 delay = 1, 2870 loop = false, 2871 loopDelay = 0 2872 }) { 2873 pfSelectElements({ selector, indexes }, (element, i) => { 2874 const initialState = { 2875 right: { axis: "X", axisDirection: "-", unit: "vw" }, 2876 left: { axis: "X", axisDirection: "", unit: "vw" }, 2877 top: { axis: "Y", axisDirection: "", unit: "vh" }, 2878 bottom: { axis: "Y", axisDirection: "-", unit: "vh" } 2879 }[direction] || { axis: "X", axisDirection: "-", unit: "vw" }; 2880 2881 const section = element.closest("section"); 2882 section.style.overflow = "hidden"; 2883 element.style.transition = ""; 2884 element.style.transform = `translate${initialState.axis}(${initialState.axisDirection}100${initialState.unit})`; 2885 2886 setTimeout(() => { 2887 element.style.transition = `transform ${duration}s ease`; 2888 element.style.transform = `translate${initialState.axis}(0)`; 2889 element.style.transform = ""; 2890 2891 setTimeout(() => { 2892 section.style.overflow = ""; 2893 }, duration * 1000); 2894 2895 if (loop && i === 0) { 2896 setTimeout(() => { 2897 pfApplySlideAnimation({ selector, indexes, direction, duration, delay, loop, loopDelay }); 2898 }, (duration + loopDelay) * 1000); 2899 } 2900 }, delay * 1000); 2901 }); 2902 } 2903 2904 function pfApplyFadeAnimation({ 2905 selector, 2906 indexes = undefined, 2907 duration = 2, 2908 delay = 1, 2909 loop = false, 2910 loopDelay = 0 2911 }) { 2912 pfSelectElements({ selector, indexes }, (element, i) => { 2913 element.style.transition = ""; 2914 element.style.opacity = 0; 2915 element.offsetHeight; 2916 2917 setTimeout(() => { 2918 element.style.transition = `opacity ${duration}s ease`; 2919 element.style.opacity = 1; 2920 2921 if (loop && i === 0) { 2922 setTimeout(() => { 2923 pfApplyFadeAnimation({ selector, indexes, duration, delay, loop, loopDelay }); 2924 }, (duration + loopDelay) * 1000); 2925 } 2926 }, delay * 1000); 2927 }); 2928 } 2929 2930 function pfApplyExpandAnimation({ 2931 selector, 2932 indexes = undefined, 2933 duration = 2,
2934 delay = 1, 2935 loop = false, 2936 loopDelay = 0 2937 }) { 2938 pfSelectElements({ selector, indexes }, (element, i) => { 2939 element.style.transition = ""; 2940 element.style.transform = "scale(0)"; 2941 element.style.transformOrigin = "center"; 2942 element.offsetHeight; 2943 2944 setTimeout(() => { 2945 element.style.transition = `transform ${duration}s ease`; 2946 element.style.transform = "scale(1)"; 2947 element.style.transform = ""; 2948 2949 if (loop && i === 0) { 2950 setTimeout(() => { 2951 pfApplyExpandAnimation({ selector, indexes, duration, delay, loop, loopDelay }); 2952 }, (duration + loopDelay) * 1000); 2953 } 2954 }, delay * 1000); 2955 }); 2956 } 2957 2958 function pfApplySqueezeAnimation({ 2959 selector, 2960 indexes = undefined, 2961 duration = 2, 2962 delay = 1, 2963 loop = false, 2964 loopDelay = 0 2965 }) { 2966 pfSelectElements({ selector, indexes }, (element, i) => { 2967 element.style.animation = ""; 2968 element.style.transformOrigin = "center"; 2969 2970 setTimeout(() => { 2971 element.style.animation = `squeeze ${duration}s ease`; 2972 2973 if (loop && i === 0) { 2974 setTimeout(() => { 2975 pfApplySqueezeAnimation({ selector, indexes, duration, delay, loop, loopDelay }); 2976 }, (duration + loopDelay) * 1000); 2977 } 2978 }, delay * 1000); 2979 }); 2980 } 2981 2982 function pfAnimationFunctions(type) { 2983 return ( 2984 { 2985 typewriter: pfApplyTypewriterAnimation, 2986 expand: pfApplyExpandAnimation, 2987 squeeze: pfApplySqueezeAnimation, 2988 fade: pfApplyFadeAnimation, 2989 slide: pfApplySlideAnimation 2990 }[type] || (() => {}) 2991 ); 2992 } 2993</script>
2993 2994 2995<style> 2996 @keyframes squeeze { 2997 0% { 2998 transform: scale(1); 2999 } 3000 50% { 3001 transform: scale(0.5); 3002 } 3003 100% { 3004 transform: scale(1); 3005 } 3006 } 3007</style> 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022<style> 3023 .glide__arrow { 3024 color: rgba(25, 25, 25, 0.5); 3025 top: 40%; 3026 border: none; 3027 box-shadow: none; 3028 } 3029 .glide__arrow--left { 3030 left: -40px; 3031 } 3032 .glide__arrow--right { 3033 right: -40px; 3034 } 3035 .glide__bullets { 3036 bottom: 0; 3037 } 3038 .glide__bullet { 3039 width: 15px; 3040 height: 15px; 3041 background-color: rgba(125, 125, 125, 0.5); 3042 } 3043 .glide__bullet--active { 3044 background-color: #5555FF; 3045 } 3046 .glide__bullet:hover, 3047 .glide__bullet:focus { 3048 background-color: #5555FF; 3049 } 3050 .glide__bullet--between { 3051 display: none; 3052 } 3053 .glide__bullet--between.glide__bullet--active { 3054 display: block; 3055 position: relative; 3056 left: -23px; 3057 margin-right: -19px; 3058 } 3059</style> 3060 3061 3062 3063<style> 3064 #content-page { 3065 height: calc(100vh - 5.1rem); 3066 } 3067 .video-js { width: 100%; height: 100% } 3068</style> 3069 3070 3071<style> 3072 .pf-full-width-rte .pf-rte-wrapper { 3073 width: 100%; 3074 } 3075 .pf-rte-wrapper ul, .pf-rte-wrapper ol { 3076 list-style: revert; 3077 list-style-position: inside; 3078 margin: revert; 3079 padding: revert; 3080 } 3081 .pf-rte-wrapper menu { 3082 list-style: revert !important; 3083 margin: revert !important; 3084 padding: revert !important; 3085 } 3086 .pf-rte-wrapper ul p, .pf-rte-wrapper ol p { 3087 display: inline; 3088 } 3089</style> 3090 3091 3092<style> 3093 .pf-aem-fragment .container { 3094 max-width: none; 3095 } 3096</style> 3097 3098 3099<style> 3100 html { 3101 scroll-behavior: smooth; 3102 } 3103</style> 3104 3105 3106<style> 3107 .lookbook-overlay { 3108 z-index: 10000000; 3109 } 3110</style> 3111 3112 3113<style> 3114 body:has(div[class*='pf-modal'][style*='display: block']) { 3115 overflow: hidden; 3116 } 3117</style> 3118 3119 3120<style> 3121 .pf-ai-response ul { 3122 list-style: revert; 3123 margin: revert; 3124 padding: revert; 3125 } 3126</style> 3127 3128 3129<style> 3130 .visually-hidden { 3131 clip: rect(0 0 0 0); 3132 clip-path: inset(50%); 3133 height: 1px; 3134 overflow: hidden; 3135 position: absolute; 3136 white-space: nowrap; 3137 width: 1px; 3138 } 3139</style> 3140 3141 3142<style> 3143 header:has(.pf-modal[style*="display: block"]) ~ header { 3144 position: relative; 3145 z-index: 0; 3146 } 3147 header:hover ~ header { 3148 position: relative; 3149 z-index: 0; 3150 } 3151</style> 3152 3153 3154<link rel="preconnect" href="https://fonts.googleapis.com"> 3155<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 3156<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Raleway:wght@300;400;500;600;700&family=Roboto:wght@300;400;500;700&family=Lato:wght@300;400;700&display=swap" onload="this.onload=null;this.rel='stylesheet'"> 3157<noscript><link href="https://fonts.googleapis.com/css2?family=Raleway:wght@300;400;500;600;700&family=Roboto:wght@300;400;500;700&family=Lato:wght@300;400;700&display=swap" rel="stylesheet"></noscript> 3158 3159<style> 3160 @font-face { 3161 font-family: BrownProRegular; 3162 src: url('https://app.cdn.lookbookhq.com/lbhq-production/2/fonts/09488fc4-25de-4f23-9e48-9659bc49e0a4.otf') format('opentype'); 3163 } 3164 @font-face { 3165 font-family: BrownProBold; 3166 src: url('https://app.cdn.lookbookhq.com/lbhq-production/2/fonts/b7425fd2-659a-420b-938e-a76c031702a4.otf') format('opentype'); 3167 } 3168 @font-face { 3169 font-family: GE; 3170 src: url('https://cdn.pathfactory.com/assets/146/fonts/b1ab02a3-ec4b-42b4-bd89-5494cff79117.ttf') format('truetype'); 3171 } 3172 @font-face { 3173 font-family: BrownProLight; 3174 src: url('https://cdn.pathfactory.com/assets/2/fonts/714996b2-be29-462a-ab07-bb29f3e466f4.otf') format('opentype'); 3175 } 3176 @font-face { 3177 font-family: BrownProItalic; 3178 src: url('https://cdn.pathfactory.com/assets/2/fonts/e435c662-e1ca-4b92-8fd1-1c17f004c892.otf') format('opentype'); 3179 } 3180 @font-face { 3181 font-family: BrownProLightItalic; 3182 src: url('https://cdn.pathfactory.com/assets/2/fonts/e9414c1d-5704-49e8-8839-5a1e5c9c60b6.otf') format('opentype'); 3183 } 3184 @font-face { 3185 font-family: BrownProBoldItalic; 3186 src: url('https://cdn.pathfactory.com/assets/2/fonts/a59a87a9-7f47-4521-8159-b9dc7af82fb9.otf') format('opentype'); 3187 } 3188 @font-face { 3189 font-family: BrownProBoldAlt; 3190 src: url('https://cdn.pathfactory.com/assets/2/fonts/fdd2ac55-9847-41ea-9cc8-7407bc060d3a.otf') format('opentype'); 3191 } 3192 @font-face { 3193 font-family: MonaSansRegular; 3194 src: url('https://cdn.pathfactory.com/assets/2/fonts/0c2fee49-1465-4d85-a598-a06be27b3651.ttf') format('truetype'); 3195 } 3196 @font-face { 3197 font-family: MonaSansBold; 3198 src: url('https://cdn.pathfactory.com/assets/2/fonts/eb1dbfb0-4a6f-4b20-944a-77b5c01dcff7.ttf') format('truetype'); 3199 } 3200 @font-face { 3201 font-family: MonaSansLight; 3202 src: url('https://cdn.pathfactory.com/assets/2/fonts/2a6bfdb5-6582-4b87-8f87-0811554c5ef8.ttf') format('truetype'); 3203 } 3204 @font-face { 3205 font-family: MonaSansSemiBold; 3206 src: url('https://cdn.pathfactory.com/assets/2/fonts/ca40901b-fccf-492b-9fae-6acedc936f13.ttf') format('truetype'); 3207 } 3208 @font-face { 3209 font-family: MonaSansMedium; 3210 src: url('https://cdn.pathfactory.com/assets/2/fonts/94dd92fc-d5b0-4e47-b039-eea38c8208e7.ttf') format('truetype'); 3211 } 3212 @font-face { 3213 font-family: OpenSansSemiBold; 3214 src: url('https://cdn.pathfactory.com/assets/2/fonts/1df957b6-9e30-4233-8ce9-8a49bcb58cb7.ttf') format('truetype'); 3215 } 3216 @font-face { 3217 font-family: OpenSansBold; 3218 src: url('https://cdn.pathfactory.com/assets/2/fonts/b710636c-06de-4d91-ba49-33ee3d38d813.ttf') format('truetype'); 3219 } 3220 @font-face { 3221 font-family: PlusJakartaSansBold; 3222 src: url('https://cdn.pathfactory.com/assets/2/fonts/f1b350a7-b187-4925-a9c2-3afdedb8dec0.ttf') format('truetype'); 3223 } 3224 @font-face { 3225 font-family: PlusJakartaSansBoldItalic; 3226 src: url('https://cdn.pathfactory.com/assets/2/fonts/2bf26a58-11ad-4695-804b-b3bec7f0691f.ttf') format('truetype'); 3227 } 3228 @font-face { 3229 font-family: PlusJakartaSansLight; 3230 src: url('https://cdn.pathfactory.com/assets/2/fonts/43a91c81-8427-4005-9c4a-bb90a126a308.ttf') format('truetype'); 3231 } 3232 @font-face { 3233 font-family: PlusJakartaSansMedium; 3234 src: url('https://cdn.pathfactory.com/assets/2/fonts/47b37680-773b-4990-aabb-c8c99039412e.ttf') format('truetype'); 3235 } 3236 @font-face { 3237 font-family: PlusJakartaSansExtraBold; 3238 src: url('https://cdn.pathfactory.com/assets/2/fonts/0d742b44-a343-4dd1-aa4c-711a5edec86f.ttf') format('truetype'); 3239 } 3240 @font-face { 3241 font-family: PlusJakartaSansExtraBoldItalic; 3242 src: url('https://cdn.pathfactory.com/assets/2/fonts/c31db46b-6615-4420-9c85-b8efccf9069a.ttf') format('truetype'); 3243 } 3244 @font-face { 3245 font-family: PlusJakartaSansExtraLight; 3246 src: url('https://cdn.pathfactory.com/assets/2/fonts/a0850b9c-234b-4111-a39f-7a9943a5cd9c.ttf') format('truetype'); 3247 } 3248 @font-face { 3249 font-family: PlusJakartaSansExtraLightItalic; 3250 src: url('https://cdn.pathfactory.com/assets/2/fonts/8caecf64-f557-4211-bb4e-f6c0080a5f47.ttf') format('truetype'); 3251 } 3252 @font-face { 3253 font-family: PlusJakartaSansItalic; 3254 src: url('https://cdn.pathfactory.com/assets/2/fonts/5047bf1f-ab9d-4702-a1da-574fd6fcbd11.ttf') format('truetype'); 3255 } 3256 @font-face { 3257 font-family: PlusJakartaSansLightItalic; 3258 src: url('https://cdn.pathfactory.com/assets/2/fonts/4df0b5ca-3726-4dc9-9fe3-2e41c0a6e1d9.ttf') format('truetype'); 3259 } 3260 @font-face { 3261 font-family: PlusJakartaSansMediumItalic; 3262 src: url('https://cdn.pathfactory.com/assets/2/fonts/ef084e6d-f495-4e58-b620-8798194e2814.ttf') format('truetype'); 3263 } 3264 @font-face { 3265 font-family: PlusJakartaSansRegular; 3266 src: url('https://cdn.pathfactory.com/assets/2/fonts/fb417894-10c8-4c02-8c45-62b3ebf75ee5.ttf') format('truetype'); 3267 } 3268 @font-face { 3269 font-family: PlusJakartaSansSemiBold; 3270 src: url('https://cdn.pathfactory.com/assets/2/fonts/d268ad46-7153
3270-4b41-a21e-352dccadfd2d.ttf') format('truetype'); 3271 } 3272 @font-face { 3273 font-family: PlusJakartaSansSemiBoldItalic; 3274 src: url('https://cdn.pathfactory.com/assets/2/fonts/35c76fa5-afd9-4972-bee4-c4831b4c7044.ttf') format('truetype'); 3275 } 3276 @font-face { 3277 font-family: OutfitBold; 3278 src: url('https://cdn.pathfactory.com/assets/2/fonts/f5c9eb13-2b83-4b16-9160-3bbe48862056.ttf') format('truetype'); 3279 } 3280 @font-face { 3281 font-family: OutfitBlack; 3282 src: url('https://cdn.pathfactory.com/assets/2/fonts/052d12f4-6bd0-4bee-bea5-086dec770806.ttf') format('truetype'); 3283 } 3284 @font-face { 3285 font-family: OutfitExtraBold; 3286 src: url('https://cdn.pathfactory.com/assets/2/fonts/db0f4396-f418-4ec6-8437-daf3e7bb3d69.ttf') format('truetype'); 3287 } 3288 @font-face { 3289 font-family: OutfitExtraLight; 3290 src: url('https://cdn.pathfactory.com/assets/2/fonts/d02e278f-b30a-44e3-967a-4246a000d2f7.ttf') format('truetype'); 3291 } 3292 @font-face { 3293 font-family: OutfitLight; 3294 src: url('https://cdn.pathfactory.com/assets/2/fonts/f4c917ef-4c8f-43f8-82fd-d4714d037127.ttf') format('truetype'); 3295 } 3296 @font-face { 3297 font-family: OutfitMedium; 3298 src: url('https://cdn.pathfactory.com/assets/2/fonts/aeb12346-8c48-41fa-af71-eee268d37521.ttf') format('truetype'); 3299 } 3300 @font-face { 3301 font-family: OutfitRegular; 3302 src: url('https://cdn.pathfactory.com/assets/2/fonts/bc6022b3-0e10-4e8d-b5dd-ebb14ae733d4.ttf') format('truetype'); 3303 } 3304 @font-face { 3305 font-family: OutfitSemiBold; 3306 src: url('https://cdn.pathfactory.com/assets/2/fonts/2951dde0-b4ba-43ed-a848-61a31cf6773e.ttf') format('truetype'); 3307 } 3308 @font-face { 3309 font-family: OutfitThin; 3310 src: url('https://cdn.pathfactory.com/assets/2/fonts/c1c5b109-1b4e-4e2b-a4e2-fd7ca5200fc1.ttf') format('truetype'); 3311 } 3312 @font-face { 3313 font-family: SalesforceRegular; 3314 src: url('https://cdn.pathfactory.com/assets/2/fonts/c2162e08-f46b-43d7-bfb3-e35810d80942.ttf') format('truetype'); 3315 }</style> 3316<style>.pf_font_preset_0 { font-size: 36pt; font-weight: bold; font-family: inherit; line-height: ; } .pf_font_preset_1 { font-size: 24pt; font-weight: bold; font-family: inherit; line-height: ; } .pf_font_preset_2 { font-size: 24pt; font-weight: normal; font-family: inherit; line-height: ; } .pf_font_preset_3 { font-size: 20pt; font-weight: bold; font-family: inherit; line-height: ; } .pf_font_preset_4 { font-size: 20pt; font-weight: normal; font-family: inherit; line-height: ; } .pf_font_preset_5 { font-size: 18pt; font-weight: normal; font-family: inherit; line-height: ; } .pf_font_preset_6 { font-size: 14pt; font-weight: normal; font-family: inherit; line-height: ; } .pf_font_preset_7 { font-size: 12pt; font-weight: normal; font-family: inherit; line-height: ; } p[style*="line-height"] .pf_font_preset_0, h1[style*="line-height"] .pf_font_preset_0, h2[style*="line-height"] .pf_font_preset_0, h3[style*="line-height"] .pf_font_preset_0, h4[style*="line-height"] .pf_font_preset_0, blockquote[style*="line-height"] .pf_font_preset_0, li[style*="line-height"] .pf_font_preset_0, p[style*="line-height"] .pf_font_preset_1, h1[style*="line-height"] .pf_font_preset_1, h2[style*="line-height"] .pf_font_preset_1, h3[style*="line-height"] .pf_font_preset_1, h4[style*="line-height"] .pf_font_preset_1, blockquote[style*="line-height"] .pf_font_preset_1, li[style*="line-height"] .pf_font_preset_1, p[style*="line-height"] .pf_font_preset_2, h1[style*="line-height"] .pf_font_preset_2, h2[style*="line-height"] .pf_font_preset_2, h3[style*="line-height"] .pf_font_preset_2, h4[style*="line-height"] .pf_font_preset_2, blockquote[style*="line-height"] .pf_font_preset_2, li[style*="line-height"] .pf_font_preset_2, p[style*="line-height"] .pf_font_preset_3, h1[style*="line-height"] .pf_font_preset_3, h2[style*="line-height"] .pf_font_preset_3, h3[style*="line-height"] .pf_font_preset_3, h4[style*="line-height"] .pf_font_preset_3, blockquote[style*="line-height"] .pf_font_preset_3, li[style*="line-height"] .pf_font_preset_3, p[style*="line-height"] .pf_font_preset_4, h1[style*="line-height"] .pf_font_preset_4, h2[style*="line-height"] .pf_font_preset_4, h3[style*="line-height"] .pf_font_preset_4, h4[style*="line-height"] .pf_font_preset_4, blockquote[style*="line-height"] .pf_font_preset_4, li[style*="line-height"] .pf_font_preset_4, p[style*="line-height"] .pf_font_preset_5, h1[style*="line-height"] .pf_font_preset_5, h2[style*="line-height"] .pf_font_preset_5, h3[style*="line-height"] .pf_font_preset_5, h4[style*="line-height"] .pf_font_preset_5, blockquote[style*="line-height"] .pf_font_preset_5, li[style*="line-height"] .pf_font_preset_5, p[style*="line-height"] .pf_font_preset_6, h1[style*="line-height"] .pf_font_preset_6, h2[style*="line-height"] .pf_font_preset_6, h3[style*="line-height"] .pf_font_preset_6, h4[style*="line-height"] .pf_font_preset_6, blockquote[style*="line-height"] .pf_font_preset_6, li[style*="line-height"] .pf_font_preset_6, p[style*="line-height"] .pf_font_preset_7, h1[style*="line-height"] .pf_font_preset_7, h2[style*="line-height"] .pf_font_preset_7, h3[style*="line-height"] .pf_font_preset_7, h4[style*="line-height"] .pf_font_preset_7, blockquote[style*="line-height"] .pf_font_preset_7, li[style*="line-height"] .pf_font_preset_7 { line-height: inherit !important; } @media (max-width: 640px) { .pf_font_preset_0 { font-size: ; line-height: ; } .pf_font_preset_1 { font-size: ; line-height: ; } .pf_font_preset_2 { font-size: ; line-height: ; } .pf_font_preset_3 { font-size: ; line-height: ; } .pf_font_preset_4 { font-size: ; line-height: ; } .pf_font_preset_5 { font-size: ; line-height: ; } .pf_font_preset_6 { font-size: ; line-height: ; } .pf_font_preset_7 { font-size: ; line-height: ; } }</style> 3317
3318 <link rel="preconnect" href="https://fonts.googleapis.com"> 3319<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 3320<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:ital,wght@0,200..800;1,200..800&display=swap" rel="stylesheet"> 3321<style> 3322 body { 3323 font-family: "Plus Jakarta Sans", sans-serif; 3324 } 3325</style>
3326<script src="https://unpkg.com/embla-carousel/embla-carousel.umd.js"></script>
3326 3327 <!-- RTP tag -->
3328<script type='text/javascript'> 3329(function(c,h,a,f,i,e){c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 3330 c[a].a=i;c[a].e=e;var g=h.createElement("script");g.async=true;g.type="text/javascript"; 3331 g.src=f+'?aid='+i;var b=h.getElementsByTagName("script")[0];b.parentNode.insertBefore(g,b); 3332 })(window,document,"rtp","//sjrtp7-cdn.marketo.com/rtp-api/v1/rtp.js","lookbookhq"); 3333 3334rtp('send','view'); 3335rtp('get', 'campaign',true); 3336Object.defineProperty(rtp, 'd', {value:false}); // 3337</script>
3337 3338<!-- End of RTP tag --><style> 3339iframe#drift-widget { 3340 bottom: 210px !important; 3341 z-index: 1 !important; 3342} 3343 3344iframe#drift-widget.drift-widget-sidebar-half-height { 3345 max-height: 70vh !important; 3346} 3347 3348@media only screen and (max-device-width: 800px) { 3349 iframe#drift-widget.drift-widget-sidebar-half-height { 3350 bottom: 0px !important; 3351 z-index: 220000 !important; 3352 max-height: 100vh !important; 3353 } 3354} 3355 3356@media only screen and (min-device-width: 801px) { 3357 div#drift-widget-container { 3358 z-index: 1 !important; 3359 } 3360} 3361</style><style> 3362#qa-cta-button { 3363 text-transform: uppercase; 3364 padding: 14px 40px !important; 3365 line-height: 1.2 !important; 3366} 3367 3368@media (max-width: 500px) and (min-width: 100px) { 3369 div#qa-header-title { 3370 display: none; 3371 } 3372 3373#qa-cta-button { 3374 padding: 0px; 3375 margin: auto; 3376 } 3377 3378#qa-cta-button { 3379 padding: 10px 25px !important; 3380 font-size: 13px !important; 3381 } 3382} 3383</style><!-- PLACE THE CODE IN THE HEAD TAG -->
3384<script src="https://cdnjs.cloudflare.com/ajax/libs/arrive/2.4.1/arrive.min.js" integrity="sha256-WXHeZwrvHW+Qpj5u2NCVyiL5XEVf/AzrYL5i4w4aRHM=" crossorigin="anonymous"></script>
vendor: 1 bytes, line 3384
3384
3385<script> 3386 var iOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); 3387 var refreshed=0; 3388 if (iOS && window.innerWidth <= 480&&refreshed==0) { 3389 3390 document.arrive(".content", function() { 3391 var ifr=document.querySelector('.content'); 3392 ifr.scrolling="auto"; 3393 ifr.src=ifr.src; 3394 refreshed=1; 3395 }); 3396} 3397</script>
3397<!-- Google Tag Manager -->
3398<script>
vendor: 327 bytes, lines 3398-3402
3398(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 3399new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 3400j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 3401'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 3402})(window,document,'script','dataLayer','
3402GTM-NR9MTBPP
vendor: 3 bytes, line 3402
3402');
3402</script>
3402 3403<!-- End Google Tag Manager --> 3404 </head> 3405 <body un-cloak class="mb-[50px] md:mb-[0px]"> 3406 <!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 3406-3407
3406 3407<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3407GTM-NR9MTBPP
vendor: 83 bytes, lines 3407-3408
3407" 3408height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
3409<!-- End Google Tag Manager (noscript) --> 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429
3430<script> 3431 function toggleMenu() { 3432 const menuButton = document.getElementById('menuButton'); 3433 const expanded = menuButton.getAttribute('aria-expanded') === 'true'; 3434 3435 // Toggle aria-expanded 3436 menuButton.setAttribute('aria-expanded', !expanded); 3437 } 3438 3439 function showDropdown(linkElement) { 3440 if (!window.matchMedia('(max-width: 993px)').matches) { 3441 const dropdown = linkElement.nextElementSibling; 3442 if (dropdown) { 3443 dropdown.style.display = 'block'; 3444 } 3445 }; 3446 } 3447 3448 document.addEventListener("DOMContentLoaded", () => { 3449 pfOzmenuCycleFocus("section-"); 3450 }); 3451 3452 pfOzmenuEscClose("section-"); 3453</script>
3453 3454 3455<style> 3456 @media (max-width: 993px) { 3457 .dropdownitem:focus-within .dropdown { 3458 position: relative; 3459 } 3460 } 3461 .ozmenu ul li.dropdownitem > span:after { 3462 width: 15px; 3463 height: 15px; 3464 text-align: center; 3465 float: right; 3466 background-color: currentColor; 3467 content: ""; 3468 margin: 1px 0px 0px 10px; 3469 -webkit-mask-image: url('data:image/svg+xml;charset=utf-8,<svg width="12px" height="12px" xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"></path></svg>'); 3470 mask-image: url('data:image/svg+xml;charset=utf-8,<svg width="12px" height="12px" xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-chevron-down" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"></path></svg>'); 3471 -webkit-mask-repeat: no-repeat; 3472 mask-repeat: no-repeat; 3473 -webkit-mask-position: center; 3474 mask-position: center; 3475 } 3476 .ozmenu ul li.dropdownitem > a:after { 3477 margin: 1px 0px 0px 10px; 3478 } 3479</style> 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 <header> 3494 3495<section 3496 3497 id="" 3498 style="" 3499 class="section-display relative section- pf-header pf-header-background-color z-[10000] !py-0 3500 3501 section-padding 3502 3503 3504 3505 bg-[#EFEFF7] 3506 " 3507 x-data="{ open: false }" 3508> 3509 <div id=""></div> 3510 <div class=" w-full relative"> 3511 3512 <div class="relative iframe-hide"> 3513 <nav class="flex justify-between h-20" aria-label="Header Navigation"> 3514 <div class="flex items-center justify-between w-full"> 3515 <div class="flex flex-wrap"> 3516 3517 <a aria-label= "Company logo link" class="flex items-center max-w-max" href=" https://www.pathfactory.com/?lb-height=100%25&lb-width=100%25&utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website " tabindex="0"> 3518 3519 <img 3520 id="pf-header-company-logo" 3521 alt="PathFactory" 3522 class="h-10 mr-3 object-cover" 3523 src="https://cdn.pathfactory.com/assets/146/logos/768376/f3ccb325-b9b9-40f4-9ce2-7a13b98e753b.svg" 3524 > 3525 3526 <span id="pf-header-company-name" class="self-center text-lg hidden md:block font-semibold whitespace-nowrap "> 3527 3528 </span> 3529 </a> 3530 3531 3532 3533 </div> 3534 <div class="block grow mx-4"> 3535 <div class="menu-open"> 3536
3537 <button class="self-center navbar-burger lg:hidden" aria-label="open menu" aria-expanded="false" id="menuButton" onclick="toggleMenu()" onkeydown="if(event.key === 'Enter') { toggleMenu(); }"> 3538 <svg fill="none" height="35" viewbox="0 0 32 32" width="35" xmlns="http://www.w3.org/2000/svg"> 3539 <rect class="text-gray-50" fill="currentColor" height="32" rx="6" width="32"></rect> 3540 <path class="text-gray-500" d="M7 12H25C25.2652 12 25.5196 11.8946 25.7071 11.7071C25.8946 11.5196 26 11.2652 26 11C26 10.7348 25.8946 10.4804 25.7071 10.2929C25.5196 10.1054 25.2652 10 25 10H7C6.73478 10 6.48043 10.1054 6.29289 10.2929C6.10536 10.4804 6 10.7348 6 11C6 11.2652 6.10536 11.5196 6.29289 11.7071C6.48043 11.8946 6.73478 12 7 12ZM25 15H7C6.73478 15 6.48043 15.1054 6.29289 15.2929C6.10536 15.4804 6 15.7348 6 16C6 16.2652 6.10536 16.5196 6.29289 16.7071C6.48043 16.8946 6.73478 17 7 17H25C25.2652 17 25.5196 16.8946 25.7071 16.7071C25.8946 16.5196 26 16.2652 26 16C26 15.7348 25.8946 15.4804 25.7071 15.2929C25.5196 15.1054 25.2652 15 25 15ZM25 20H7C6.73478 20 6.48043 20.1054 6.29289 20.2929C6.10536 20.4804 6 20.7348 6 21C6 21.2652 6.10536 21.5196 6.29289 21.7071C6.48043 21.8946 6.73478 22 7 22H25C25.2652 22 25.5196 21.8946 25.7071 21.7071C25.8946 21.5196 26 21.2652 26 21C26 20.7348 25.8946 20.4804 25.7071 20.2929C25.5196 20.1054 25.2652 20 25 20Z" fill="currentColor"></path> 3541 </svg> 3542 </button> 3543 3544 </div> 3545 <div class="ozmenu"> 3546 <div class="flex flex-col"> 3547 <div class="menu-close"> 3548 <button class="absolute p-4 navbar-close top-5 right-3" aria-label="Close" onclick="toggleMenu()"> 3549 <svg fill="none" height="12" viewbox="0 0 12 12" width="12" xmlns="http://www.w3.org/2000/svg"> 3550 <path 3551 d="M6.94004 6L11.14 1.80667C11.2656 1.68113 11.3361 1.51087 11.3361 1.33333C11.3361 1.1558 11.2656 0.985537 11.14 0.860002C11.0145 0.734466 10.8442 0.66394 10.6667 0.66394C10.4892 0.66394 10.3189 0.734466 10.1934 0.860002L6.00004 5.06L1.80671 0.860002C1.68117 0.734466 1.51091 0.663941 1.33337 0.663941C1.15584 0.663941 0.985576 0.734466 0.860041 0.860002C0.734505 0.985537 0.66398 1.1558 0.66398 1.33333C0.66398 1.51087 0.734505 1.68113 0.860041 1.80667L5.06004 6L0.860041 10.1933C0.797555 10.2553 0.747959 10.329 0.714113 10.4103C0.680267 10.4915 0.662842 10.5787 0.662842 10.6667C0.662842 10.7547 0.680267 10.8418 0.714113 10.9231C0.747959 11.0043 0.797555 11.078 0.860041 11.14C0.922016 11.2025 0.99575 11.2521 1.07699 11.2859C1.15823 11.3198 1.24537 11.3372 1.33337 11.3372C1.42138 11.3372 1.50852 11.3198 1.58976 11.2859C1.671 11.2521 1.74473 11.2025 1.80671 11.14L6.00004 6.94L10.1934 11.14C10.2554 11.2025 10.3291 11.2521 10.4103 11.2859C10.4916 11.3198 10.5787 11.3372 10.6667 11.3372C10.7547 11.3372 10.8419 11.3198 10.9231 11.2859C11.0043 11.2521 11.0781 11.2025 11.14 11.14C11.2025 11.078 11.2521 11.0043 11.286 10.9231C11.3198 10.8418 11.3372 10.7547 11.3372 10.6667C11.3372 10.5787 11.3198 10.4915 11.286 10.4103C11.2521 10.329 11.2025 10.2553 11.14 10.1933L6.94004 6Z" 3552 fill="#556987"> 3553 </path> 3554 </svg> 3555 </button> 3556 </div> 3557 <ul class="flex justify-center pf_font_preset_6 gap-8 ozmenu-nav"> 3558 3559 </ul> 3560 3561 <div class="flex w-50 lg:hidden mx-auto flex-col gap-5"> 3562 3563 <div class="pf-mobile-primary-cta-in-header"> 3564 3565 3566 3567 3568 3569 <a 3570 class=" 3571 btn leading-none btn-md pf-cta pf_font_preset_6 3572 3573 bg-[#5555FF] border-[#5555FF] 3574 text-[#ffffff] 3575 3576 hover:bg-primary-600 3577 3578 focus:ring-[#5555FF] !rounded-[8px] 3579 " 3580 href="https://www.pathfactory.com/demo/?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website&lb-height=100%25&lb-width=100%25&utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website" 3581 3582 target="_blank" 3583 3584 data-pf-theme-artefact-id="cta-link" 3585 data-pf-theme-block-id="cta-630364840" 3586 data-pf-theme-block-type="component" 3587 data-pf-theme-block-ref="cta" 3588 data-pf-theme-block-label="Request a Demo" 3589 tabindex="0" 3590 role="button" 3591 aria-label="Request a Demo" 3592 3593> 3594 Request a Demo 3595</a> 3596 3597 3598 3599 3600 </div> 3601 3602 3603 </div> 3604 3605 </div> 3606 </div> 3607 </div> 3608 <div class="hidden lg:block"> 3609 <div class="flex items-center justify-end"> 3610 3611 <div class="pf-primary-cta-in-header"> 3612 3613 3614 3615 3616 3617 <a 3618 class=" 3619 btn leading-none btn-md pf-cta pf_font_preset_6 3620 3621 bg-[#5555FF] border-[#5555FF] 3622 text-[#ffffff] 3623 3624 hover:bg-primary-600 3625 3626 focus:ring-[#5555FF] !rounded-[8px] 3627 " 3628 href="https://www.pathfactory.com/demo/?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website&lb-height=100%25&lb-width=100%25&utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website" 3629 3630 target="_blank" 3631 3632 data-pf-theme-artefact-id="cta-link" 3633 data-pf-theme-block-id="cta-630653006" 3634 data-pf-theme-block-type="component" 3635 data-pf-theme-block-ref="cta" 3636 data-pf-theme-block-label="Request a Demo" 3637 tabindex="0" 3638 role="button" 3639 aria-label="Request a Demo" 3640 3641> 3642 Request a Demo 3643</a> 3644 3645 3646 3647 3648 </div> 3649 3650 3651 </div> 3652 </div> 3653 </div> 3654 </nav> 3655 </div> 3656 3657 </div> 3658</section> 3659 3660 </header> 3661 3662 3663 3664 3665 3666
3667<script> 3668 (() => { 3669 const animations = []; 3670 const onLoadAnimations = animations.filter((a) => a.trigger === "load"); 3671 const onScrollAnimations = animations.filter((a) => a.trigger === "scroll"); 3672 3673 onLoadAnimations.forEach((a) => pfAnimationFunctions(a.type)(a)); 3674 3675 const observer = new IntersectionObserver((entries) => { 3676 entries.forEach((entry) => { 3677 if (entry.isIntersecting) { 3678 onScrollAnimations.forEach((a) => pfAnimationFunctions(a.type)(a)); 3679 observer.disconnect(); 3680 } 3681 }); 3682 }, { threshold: 0.5 }); 3683 3684 const section = document.querySelector(".section-"); 3685 observer.observe(section); 3686 })(); 3687</script>
3687 3688 3689 3690 3691<div 3692 id="content-page" 3693 class="section-content-page relative flex " 3694 style="" 3695 data-sidebar-side="left" 3696 data-sidebar-default="expanded" 3697> 3698 3699 3700 <button 3701 id="pf-sidebar-toggle" 3702 class="flex items-center justify-center w-8 h-8 rounded-full bg-[#5555FF]" 3703 type="button" 3704 aria-controls="sidebar" 3705 aria-expanded="expanded" 3706 aria-label="Collapse sidebar" 3707 > 3708 <svg 3709 id="pf-sidebar-toggle-icon" 3710 width="16" 3711 height="16" 3712 viewBox="0 0 24 24" 3713 fill="currentColor" 3714 aria-hidden="true" 3715 class="text-[#ffffff]" 3716 > 3717 3718 <path d="M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z"/> 3719 3720 </svg> 3721 </button> 3722 3723 <aside 3724 id="sidebar" 3725 class=" 3726 hidden md:flex flex-col h-full overflow-visible 3727 border-r border-gray-200 3728 3729 bg-[#FFFFFF] 3730 3731 " 3732 aria-label="Sidebar" 3733 3734 > 3735 3736 3737 3738 3739 3740 <div class="pf-resource-center-filters filters-container flex justify-start flex-wrap flex-col border-b-1 border-white"> 3741 3742 </div> 3743 <div 3744 role="status" 3745 aria-live="polite" 3746 class="no-results pf-no-results visually-hidden text-center w-full px-[20px] py-[40px]" 3747 > 3748 10 results found 3749 </div> 3750 <div class="overflow-y-auto"> 3751 <ul 3752 role="list" 3753 aria-live="polite" 3754 class="assets-content-page pf-cards-wrapper divide-y divide-gray-200" 3755 > 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775<li 3776 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] template flex h-24 px-4 py-5 " 3777 style="display: none;" 3778 data-is-pinned="" 3779 data-topics="" 3780 data-title="" 3781 data-language="" 3782 data-personas="" 3783 data-business-units="" 3784 data-industries="" 3785 data-products="" 3786 data-solutions="" 3787 data-content-type="" 3788 data-funnel-stages="" 3789 data-uuid="" 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 data-use-cases="" 3806 3807 3808 3809 3810 data-use-in-recommendations="" 3811 3812 3813 3814 3815 data-from-the-nook="" 3816 3817 3818> 3819 <a onclick=" 3820 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 3821window.initializeContentEvents('contentClick', {contentId: }) 3822" class="pf-content-card-link flex items-center justify-between space-x-3" href=""> 3823
3824 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 3825 <img 3826 src="" 3827 alt="Sample content thumbnail" 3828 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 3829 loading="lazy" 3830 > 3831 <span 3832 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 3833 3834 style="display: none;" 3835 3836 > 3837 Featured 3838 </span> 3839 </div> 3840 3841 <div class="flex-1 min-w-0"> 3842 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 3843 3844 </p> 3845 3846 </div> 3847 </a> 3848</li> 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869<li 3870 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 3871 style="" 3872 data-is-pinned="false" 3873 data-topics="Product" 3874 data-title="PathFactory Overview: Product Tour" 3875 data-language="English" 3876 data-personas="CMO/VPABM LeadContent LeadDemand Gen LeadMarketing Ops Lead" 3877 data-business-units="MarketingProduct" 3878 data-industries="B2B" 3879 data-products="" 3880 data-solutions="" 3881 data-content-type="Product Tour" 3882 data-funnel-stages="Top of Funnel" 3883 data-uuid="d64d2437-7e3c-489d-a77a-791766708af1" 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 data-use-cases="ABMDemand GenContent StrategyBuyer Enablement" 3900 3901 3902 3903 3904 data-use-in-recommendations="Yes - ONLY if assets should be used for ChatFactory & Website Tools Recommendations" 3905 3906 3907 3908 3909 data-from-the-nook="" 3910 3911 3912> 3913 <a onclick=" 3914 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 3915window.initializeContentEvents('contentClick', {contentId: 855820}) 3916" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory_product_tour?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 3917
3918 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 3919 <img 3920 src="https://cdn.pathfactory.com/assets/146/thumbnails/932696/ca8257a0-118b-4078-8e19-3fd7a2c80de1.png" 3921 alt="Sample content thumbnail" 3922 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 3923 loading="lazy" 3924 > 3925 <span 3926 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 3927 3928 style="display: none;" 3929 3930 > 3931 Featured 3932 </span> 3933 </div> 3934 3935 <div class="flex-1 min-w-0"> 3936 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 3937 PathFactory Overview: Product Tour 3938 </p> 3939 3940 </div> 3941 </a> 3942</li> 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963<li 3964 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 3965 style="" 3966 data-is-pinned="false" 3967 data-topics="ProductAI" 3968 data-title="PathFactory Helps Reduce Costs Overview" 3969 data-language="" 3970 data-personas="" 3971 data-business-units="MarketingSales" 3972 data-industries="B2B" 3973 data-products="Advanced" 3974 data-solutions="" 3975 data-content-type="Product Marketing" 3976 data-funnel-stages="Bottom of Funnel" 3977 data-uuid="e7123187-9bcd-463a-81e7-363784311c3b" 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 data-use-cases="" 3994 3995 3996 3997 3998 data-use-in-recommendations="Yes - ONLY if assets should be used for ChatFactory & Website Tools Recommendations" 3999 4000 4001 4002 4003 data-from-the-nook="" 4004 4005 4006> 4007 <a onclick=" 4008 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4009window.initializeContentEvents('contentClick', {contentId: 305234}) 4010" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory-helps-re?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4011
4012 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4013 <img 4014 src="https://cdn.pathfactory.com/assets/146/thumbnails/565593/337a8e70-0d6d-44d3-8a68-2e6a9127daa8.png" 4015 alt="Sample content thumbnail" 4016 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4017 loading="lazy" 4018 > 4019 <span 4020 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4021 4022 style="display: none;" 4023 4024 > 4025 Featured 4026 </span> 4027 </div> 4028 4029 <div class="flex-1 min-w-0"> 4030 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4031 PathFactory Helps Reduce Costs Overview 4032 </p> 4033 4034 </div> 4035 </a> 4036</li> 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057<li 4058 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 4059 style="" 4060 data-is-pinned="false" 4061 data-topics="ProductMarketing OperationsAI" 4062 data-title="PathFactory Helps Increase Revenue Overview" 4063 data-language="" 4064 data-personas="" 4065 data-business-units="MarketingSalesProduct" 4066 data-industries="B2B" 4067 data-products="" 4068 data-solutions="" 4069 data-content-type="Product Marketing" 4070 data-funnel-stages="Bottom of Funnel" 4071 data-uuid="94f40fcc-41e3-41d0-8706-94b4595b458f" 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 data-use-cases="" 4088 4089 4090 4091 4092 data-use-in-recommendations="Yes - ONLY if assets should be used for ChatFactory & Website Tools Recommendations" 4093 4094 4095 4096 4097 data-from-the-nook="" 4098 4099 4100> 4101 <a onclick=" 4102 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4103window.initializeContentEvents('contentClick', {contentId: 305233}) 4104" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory-helps-in?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4105
4106 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4107 <img 4108 src="https://cdn.pathfactory.com/assets/146/thumbnails/565608/216e83d1-58c2-42c1-a3a7-efb2c97e8940.png" 4109 alt="Sample content thumbnail" 4110 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4111 loading="lazy" 4112 > 4113 <span 4114 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4115 4116 style="display: none;" 4117 4118 > 4119 Featured 4120 </span> 4121 </div> 4122 4123 <div class="flex-1 min-w-0"> 4124 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4125 PathFactory Helps Increase Revenue Overview 4126 </p> 4127 4128 </div> 4129 </a> 4130</li> 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151<li 4152 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 4153 style="" 4154 data-is-pinned="false" 4155 data-topics="AIChatFactory" 4156 data-title="ChatFactory Product Tour" 4157 data-language="English" 4158 data-personas="" 4159 data-business-units="MarketingSales" 4160 data-industries="B2B" 4161 data-products="" 4162 data-solutions="" 4163 data-content-type="Product Tour" 4164 data-funnel-stages="Top of Funnel" 4165 data-uuid="ca39d778-636f-426f-a99a-ff31740c1a2e" 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 data-use-cases="" 4182 4183 4184 4185 4186 data-use-in-recommendations="Yes - ONLY if assets should be used for ChatFactory & Website Tools Recommendations" 4187 4188 4189 4190 4191 data-from-the-nook="" 4192 4193 4194> 4195 <a onclick=" 4196 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4197window.initializeContentEvents('contentClick', {contentId: 646336}) 4198" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/chatfactory-tour?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4199
4200 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4201 <img 4202 src="https://cdn.pathfactory.com/assets/146/thumbnails/785785/6dc7b800-eb54-483f-b9fe-51cf8fd8a750.png" 4203 alt="Sample content thumbnail" 4204 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4205 loading="lazy" 4206 > 4207 <span 4208 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4209 4210 style="display: none;" 4211 4212 > 4213 Featured 4214 </span> 4215 </div> 4216 4217 <div class="flex-1 min-w-0"> 4218 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4219 ChatFactory Product Tour 4220 </p> 4221 4222 </div> 4223 </a> 4224</li> 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245<li 4246 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 4247 style="" 4248 data-is-pinned="false" 4249 data-topics="" 4250 data-title="What Does PathFactory Do?" 4251 data-language="English" 4252 data-personas="" 4253 data-business-units="MarketingSales" 4254 data-industries="" 4255 data-products="" 4256 data-solutions="" 4257 data-content-type="Video" 4258 data-funnel-stages="Middle of Funnel" 4259 data-uuid="0c6a0fa4-7fbe-4379-b556-4ec43fd46cb5" 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 data-use-cases="" 4276 4277 4278 4279 4280 data-use-in-recommendations="No" 4281 4282 4283 4284 4285 data-from-the-nook="" 4286 4287 4288> 4289 <a onclick=" 4290 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4291window.initializeContentEvents('contentClick', {contentId: 572576}) 4292" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory-explainer?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4293
4294 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4295 <img 4296 src="https://cdn.pathfactory.com/assets/146/thumbnails/573033/bd904b2b-3b49-4063-b097-91a4fcd320de.png" 4297 alt="Sample content thumbnail" 4298 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4299 loading="lazy" 4300 > 4301 <span 4302 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4303 4304 style="display: none;" 4305 4306 > 4307 Featured 4308 </span> 4309 </div> 4310 4311 <div class="flex-1 min-w-0"> 4312 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4313 What Does PathFactory Do? 4314 </p> 4315 4316 </div> 4317 </a> 4318</li> 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339<li 4340 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 4341 style="" 4342 data-is-pinned="false" 4343 data-topics="ProductPersonalizationAI" 4344 data-title="How PathFactory Fits Into Your Martech Stack" 4345 data-language="" 4346 data-personas="" 4347 data-business-units="MarketingSales" 4348 data-industries="B2B" 4349 data-products="Advanced" 4350 data-solutions="" 4351 data-content-type="Sales Material" 4352 data-funnel-stages="Top of Funnel" 4353 data-uuid="2eeddcd1-d69b-43ad-bc7e-78f2975f6101" 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 data-use-cases="" 4370 4371 4372 4373 4374 data-use-in-recommendations="Yes - ONLY if assets should be used for ChatFactory & Website Tools Recommendations" 4375 4376 4377 4378 4379 data-from-the-nook="" 4380 4381 4382> 4383 <a onclick=" 4384 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4385window.initializeContentEvents('contentClick', {contentId: 520286}) 4386" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/martechstackpf_final?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4387
4388 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4389 <img 4390 src="https://cdn.pathfactory.com/assets/146/contents/520286/thumbnails/600x/3b3e7d7d-c86a-4862-afd6-e822e5ed5b12-1.png" 4391 alt="Sample content thumbnail" 4392 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4393 loading="lazy" 4394 > 4395 <span 4396 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4397 4398 style="display: none;" 4399 4400 > 4401 Featured 4402 </span> 4403 </div> 4404 4405 <div class="flex-1 min-w-0"> 4406 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4407 How PathFactory Fits Into Your Martech Stack 4408 </p> 4409 4410 </div> 4411 </a> 4412</li> 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433<li 4434 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 4435 style="" 4436 data-is-pinned="false" 4437 data-topics="PFRI" 4438 data-title="[Product Tour] PathFactory For Revenue Intelligence" 4439 data-language="English" 4440 data-personas="CMO/VPABM LeadContent LeadDemand Gen Lead" 4441 data-business-units="MarketingSales" 4442 data-industries="" 4443 data-products="" 4444 data-solutions="" 4445 data-content-type="Product Tour" 4446 data-funnel-stages="Top of Funnel" 4447 data-uuid="519e4870-0caa-468d-b10a-be5ceb61a191" 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 data-use-cases="ABMDemand GenContent Strategy" 4464 4465 4466 4467 4468 data-use-in-recommendations="" 4469 4470 4471 4472 4473 data-from-the-nook="" 4474 4475 4476> 4477 <a onclick=" 4478 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4479window.initializeContentEvents('contentClick', {contentId: 912630}) 4480" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pfri_producttour?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4481
4482 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4483 <img 4484 src="https://cdn.pathfactory.com/assets/146/logos/974261/f855ee36-c0ab-4ed2-a78d-f42068c21fd1.png" 4485 alt="Sample content thumbnail" 4486 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4487 loading="lazy" 4488 > 4489 <span 4490 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4491 4492 style="display: none;" 4493 4494 > 4495 Featured 4496 </span> 4497 </div> 4498 4499 <div class="flex-1 min-w-0"> 4500 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4501 [Product Tour] PathFactory For Revenue Intelligence 4502 </p> 4503 4504 </div> 4505 </a> 4506</li> 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527<li 4528 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 4529 style="" 4530 data-is-pinned="false" 4531 data-topics="Product" 4532 data-title="ABM & Personalization Product Tour" 4533 data-language="English" 4534 data-personas="ABM Lead" 4535 data-business-units="MarketingSales" 4536 data-industries="" 4537 data-products="" 4538 data-solutions="" 4539 data-content-type="Product Tour" 4540 data-funnel-stages="Top of Funnel" 4541 data-uuid="0df8b410-fee1-42b6-8722-951a6114849b" 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 data-use-cases="ABM" 4558 4559 4560 4561 4562 data-use-in-recommendations="" 4563 4564 4565 4566 4567 data-from-the-nook="" 4568 4569 4570> 4571 <a onclick=" 4572 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4573window.initializeContentEvents('contentClick', {contentId: 892363}) 4574" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/abmtour?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4575
4576 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4577 <img 4578 src="https://cdn.pathfactory.com/assets/146/thumbnails/1035102/c36ff112-0d8f-46a6-b1f3-cf305353c06a.png" 4579 alt="Sample content thumbnail" 4580 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4581 loading="lazy" 4582 > 4583 <span 4584 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4585 4586 style="display: none;" 4587 4588 > 4589 Featured 4590 </span> 4591 </div> 4592 4593 <div class="flex-1 min-w-0"> 4594 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4595 ABM & Personalization Product Tour 4596 </p> 4597 4598 </div> 4599 </a> 4600</li> 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621<li 4622 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 4623 style="" 4624 data-is-pinned="false" 4625 data-topics="Content IntelligenceEnablement" 4626 data-title="Generative AI and the Intent-Driven Buyer’s Journey" 4627 data-language="English" 4628 data-personas="CMO/VPABM LeadContent LeadDemand Gen LeadMarketing Ops Lead" 4629 data-business-units="MarketingSalesSolutionsDemo" 4630 data-industries="" 4631 data-products="BasicAdvanced" 4632 data-solutions="" 4633 data-content-type="Report" 4634 data-funnel-stages="Middle of Funnel" 4635 data-uuid="034c2545-9576-44ac-bca4-d9e149e3fa51" 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 data-use-cases="ABMDemand GenBuyer EnablementNurture" 4652 4653 4654 4655 4656 data-use-in-recommendations="" 4657 4658 4659 4660 4661 data-from-the-nook="" 4662 4663 4664> 4665 <a onclick=" 4666 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4667window.initializeContentEvents('contentClick', {contentId: 918927}) 4668" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/genai-report?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4669
4670 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4671 <img 4672 src="https://cdn.pathfactory.com/assets/146/contents/918927/thumbnails/600x/ece9bef7-2e1f-41d1-97da-171d56ae4c1d-01.png" 4673 alt="Sample content thumbnail" 4674 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4675 loading="lazy" 4676 > 4677 <span 4678 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4679 4680 style="display: none;" 4681 4682 > 4683 Featured 4684 </span> 4685 </div> 4686 4687 <div class="flex-1 min-w-0"> 4688 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4689 Generative AI and the Intent-Driven Buyer’s Journey 4690 </p> 4691 4692 </div> 4693 </a> 4694</li> 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715<li 4716 class="asset pf-content-card pf-sidebar-card hover:bg-[rgba(50,50,50,0.25)] flex h-24 px-4 py-5 " 4717 style="" 4718 data-is-pinned="false" 4719 data-topics="ProductPersonalizationMarketoAIPathFactory Implementation" 4720 data-title="PathFactory Info Sheet" 4721 data-language="English" 4722 data-personas="ABM LeadContent LeadDemand Gen Lead" 4723 data-business-units="MarketingSales" 4724 data-industries="" 4725 data-products="" 4726 data-solutions="" 4727 data-content-type="One Pager" 4728 data-funnel-stages="Middle of Funnel" 4729 data-uuid="8f16284e-5220-4786-951c-95612d79f515" 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 data-use-cases="ABMDemand GenContent StrategyBuyer Enablement" 4746 4747 4748 4749 4750 data-use-in-recommendations="" 4751 4752 4753 4754 4755 data-from-the-nook="" 4756 4757 4758> 4759 <a onclick=" 4760 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 4761window.initializeContentEvents('contentClick', {contentId: 1009826}) 4762" class="pf-content-card-link flex items-center justify-between space-x-3" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pf-info-sheet?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 4763
4764 <div class="relative w-[64px] h-fit rounded-[9px] border border-gray-200 overflow-hidden"> 4765 <img 4766 src="https://cdn.pathfactory.com/assets/146/contents/1009826/thumbnails/600x/5f24b409-c803-4d09-85fb-679dd20df0c3-1.png" 4767 alt="Sample content thumbnail" 4768 class="pf-content-card-thumbnail object-cover w-full aspect-[16/9]" 4769 loading="lazy" 4770 > 4771 <span 4772 class="pf-pinned-content-tag absolute bottom-0 w-full text-center text-[9px] bg-[#5555FF] text-[#ffffff]" 4773 4774 style="display: none;" 4775 4776 > 4777 Featured 4778 </span> 4779 </div> 4780 4781 <div class="flex-1 min-w-0"> 4782 <p class="pf-content-card-title pf_font_preset_7 text-[#000000] line-clamp-3"> 4783 PathFactory Info Sheet 4784 </p> 4785 4786 </div> 4787 </a> 4788</li> 4789 4790 </ul> 4791 4792 </div> 4793 4794 4795 </aside> 4796 4797 <style> 4798 #sidebar { 4799 width: 300px; 4800 min-width: 300px; 4801 transition: width 0.4s ease, min-width 0.4s ease, opacity 0.4s ease; 4802 } 4803 4804 #pf-sidebar-toggle { 4805 position: fixed; 4806 top: -10px; 4807 transform: translateY(-50%); 4808 z-index: 1001; 4809 width: 32px; 4810 height: 32px; 4811 color: white; 4812 border: none; 4813 border-radius: 50%; 4814 cursor: pointer; 4815 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); 4816 transition: left 0.4s ease, right 0.4s ease, transform 0.4s ease; 4817 } 4818 4819 #pf-sidebar-toggle:focus-visible { 4820 outline: 2px solid #ffffff; 4821 outline-offset: 2px; 4822 box-shadow: 0 0 0 4px #000000, 0 2px 8px rgba(0, 0, 0, 0.2); 4823 } 4824 4825 #pf-sidebar-toggle-icon { 4826 transition: transform 0.4s ease; 4827 } 4828
4829 #cookie-settings, 4830 #cookie-settings-mobile { 4831 font: inherit; 4832 } 4833 4834 #cookie-settings:focus-visible, 4835 #cookie-settings-mobile:focus-visible, 4836 .pf-mobile-tab:focus-visible, 4837 .pf-lazy-load-button:focus-visible { 4838 outline: 2px solid #005fcc; 4839 outline-offset: 2px; 4840 } 4841 4842 [data-sidebar-side='left'] #pf-sidebar-toggle { 4843 left: calc(300px - 16px); 4844 } 4845 4846 [data-sidebar-side='right'] #pf-sidebar-toggle { 4847 right: calc(300px - 16px); 4848 } 4849 4850 #content-page.sidebar-is-collapsed[data-sidebar-side='left'] #pf-sidebar-toggle { 4851 left: 8px; 4852 } 4853 4854 #content-page.sidebar-is-collapsed[data-sidebar-side='right'] #pf-sidebar-toggle { 4855 right: 8px; 4856 } 4857 4858 #content-page.sidebar-is-collapsed #pf-sidebar-toggle-icon { 4859 transform: rotate(180deg); 4860 } 4861 4862 #content-page.sidebar-is-collapsed #sidebar { 4863 width: 0 !important; 4864 min-width: 0 !important; 4865 opacity: 0 !important; 4866 overflow: hidden !important; 4867 border: none !important; 4868 } 4869 4870 #content-page.sidebar-is-collapsed .pf-content-wrapper { 4871 width: 100% !important; 4872 } 4873 4874 #content-page.sidebar-is-collapsed { 4875 --pf-sidebar-w: 0px !important; 4876 --pf-left-safe: 16px !important; 4877 --pf-right-safe: 16px !important; 4878 } 4879 4880 #content-page .pf-content-card[data-uuid='d64d2437-7e3c-489d-a77a-791766708af1'] .pf-content-card-title { 4881 color: #000000; 4882 font-weight: bold; 4883 } 4884 4885 #content-page .pf-sidebar-card[data-uuid='d64d2437-7e3c-489d-a77a-791766708af1'] { 4886 background-color: #CCCCCC; 4887 } 4888 4889 #content-page .pf-bottombar-card[data-uuid='d64d2437-7e3c-489d-a77a-791766708af1'] .pf-bottom-bar-title-wrapper { 4890 background-color: #CCCCCC; 4891 } 4892 4893 @media (max-width: 767px) { 4894 #pf-sidebar-toggle { 4895 display: none !important; 4896 } 4897 } 4898 4899 4900 </style> 4901 4902
4902<script> 4903 document.addEventListener('DOMContentLoaded', function() { 4904 const root = document.getElementById('content-page'); 4905 const sidebar = document.getElementById('sidebar'); 4906 const toggle = document.getElementById('pf-sidebar-toggle'); 4907 const header = document.querySelector(".pf-header"); 4908 if (!root || !sidebar || !toggle) return; 4909 4910 const side = root.dataset.sidebarSide || 'left'; 4911 const STORAGE_KEY = `pf:sidebar:state:content-page`; 4912 const isPreviewMode = false; 4913 4914 if (window.matchMedia('(max-width: 767px)').matches) { 4915 sidebar.style.display = 'none'; 4916 toggle.style.display = 'none'; 4917 window.dispatchEvent(new CustomEvent('pf:sidebar:state', { detail: { expanded: false, side } })); 4918 return; 4919 } 4920 4921 let isExpanded; 4922 4923 function applyState() { 4924 const wasExpanded = toggle.getAttribute('aria-expanded') === 'true'; 4925 4926 root.classList.toggle('sidebar-is-collapsed', !isExpanded); 4927 toggle.setAttribute('aria-expanded', String(isExpanded)); 4928 toggle.setAttribute('aria-label', isExpanded ? 'Collapse sidebar' : 'Expand sidebar'); 4929 4930 if (isExpanded) { 4931 sidebar.removeAttribute('inert'); 4932 sidebar.removeAttribute('aria-hidden'); 4933 } else { 4934 sidebar.setAttribute('inert', ''); 4935 sidebar.setAttribute('aria-hidden', 'true'); 4936 if (wasExpanded && sidebar.contains(document.activeElement)) { 4937 toggle.focus(); 4938 } 4939 } 4940 4941 window.dispatchEvent(new CustomEvent('pf:sidebar:state', { detail: { expanded: isExpanded, side } })); 4942 } 4943 4944 toggle.addEventListener('click', function () { 4945 isExpanded = !isExpanded; 4946 if (!isPreviewMode) { 4947 sessionStorage.setItem(STORAGE_KEY, isExpanded ? 'expanded' : 'collapsed'); 4948 } 4949 applyState(); 4950 }); 4951 4952 const templateIsCollapsed = ('expanded' === 'collapsed'); 4953 4954 if (isPreviewMode) { 4955 isExpanded = !templateIsCollapsed; 4956 } else { 4957 const saved = sessionStorage.getItem(STORAGE_KEY); 4958 isExpanded = saved ? (saved === 'expanded') : !templateIsCollapsed; 4959 } 4960 4961 applyState(); 4962 4963 const isHeaderEnabled = header && window.getComputedStyle(header).display !== 'none'; 4964 if (isHeaderEnabled) { 4965 setTimeout(() => { 4966 if (header.offsetHeight) { 4967 toggle.style.top = `calc(${header.offsetHeight + 70}px)`; 4968 } else { 4969 toggle.style.top = "150px" 4970 } 4971 }, 500); 4972 } else { 4973 toggle.style.top = "70px" 4974 } 4975 }); 4976 </script>
4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990<style> 4991 #sidebar-contents-content-page-title #bottom-bar-button:focus-visible { 4992 outline: 2px solid #ffffff; 4993 outline-offset: 2px; 4994 box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.5); 4995 } 4996</style> 4997 4998<div role="region" aria-label="Mobile content navigation" id="sidebar-contents-content-page" class="z-[1000] fixed bottom-[calc(50px-340px)] left-0 h-[340px] w-full transition-[bottom] ease-in-out duration-300 md:hidden bg-white" x-data="{ 4999 isFilterExpanded: false, 5000 checkStyle() { 5001 this.isFilterExpanded = $el.style.bottom === '0px'; 5002 const button = $el.querySelector('#bottom-bar-button'); 5003 if (button) { 5004 const panelLabel = button.querySelector('.pf-bottom-bar-label')?.textContent?.trim() || ''; 5005 button.setAttribute('aria-expanded', this.isFilterExpanded ? 'true' : 'false'); 5006 button.setAttribute('aria-label', this.isFilterExpanded ? 'Collapse ' + panelLabel : 'Expand ' + panelLabel); 5007 } 5008 } 5009 }" 5010 x-init="checkStyle()" 5011 @sync-a11y="checkStyle()" 5012 @keyup.escape="$el.style.bottom = ''; checkStyle()" 5013 @transitionend="checkStyle()"> 5014 <div 5015 id="sidebar-contents-content-page-title" 5016 class="w-full px-5 flex justify-between items-center h-[50px] 5017 5018 text-[#000000] pf_font_preset_7 5019 5020 5021 5022 5023 bg-[#FFFFFF] 5024 5025 5026 " 5027 > 5028 <button 5029 type="button" 5030 id="bottom-bar-button" 5031 aria-expanded="false" 5032 aria-controls="sidebar-contents-content-page-content" 5033 aria-label="Expand Read More" 5034 class="flex items-center space-x-2" 5035 > 5036 <span class="pf-bottom-bar-label">Read More </span> 5037 <i class="fa-solid fa-chevron-up" aria-hidden="true"></i> 5038 </button> 5039 5040 </div> 5041 <div id="sidebar-contents-content-page-content" class="w-full flex justify-center h-full"> 5042 5043 <div x-data="{ activeTab: 'contents' }" class="pf-resource-center-filters w-full flex flex-col items-center"> 5044 5045 <div 5046 5047 x-show="activeTab == 'contents'" 5048 class="w-full flex justify-center" 5049 > 5050 <div role="status" aria-live="polite" class="no-results pf-no-results visually-hidden text-center w-full px-[20px] py-[40px]"> 5051 10 results found 5052 </div> 5053 <div class="pf-bottombar-scroller flex overflow-x-scroll snap-mandatory snap-x pt-[20px]"> 5054 <div role="list" aria-live="polite" class="assets-content-page pf-cards-wrapper flex w-full"> 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073<div 5074 class="asset pf-content-card pf-bottombar-card template snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5075 style="display: none;" 5076 data-is-pinned="" 5077 data-topics="" 5078 data-title="" 5079 data-language="" 5080 data-personas="" 5081 data-business-units="" 5082 data-industries="" 5083 data-products="" 5084 data-solutions="" 5085 data-content-type="" 5086 data-funnel-stages="" 5087 data-uuid="" 5088> 5089 <a onclick=" 5090 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5091window.initializeContentEvents('contentClick', {contentId: }) 5092" class="pf-content-card-link relative block group max-w-[280px] h-fit" href=""> 5093 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5094 5095 bg-[#FFFFFF] 5096 5097 pf-bottom-bar-title-wrapper"> 5098 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5099 5100 </div> 5101 </div> 5102 <img 5103 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5104 src="" 5105 alt="Sample content thumbnail" 5106 loading="lazy" 5107 > 5108 <span 5109 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5110 5111 style="display: none;" 5112 5113 > 5114 Featured <i class="fa fa-star" aria-hidden="true"></i> 5115 </span> 5116 </a> 5117</div> 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138<div 5139 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5140 style="" 5141 data-is-pinned="false" 5142 data-topics="Product" 5143 data-title="PathFactory Overview: Product Tour" 5144 data-language="English" 5145 data-personas="CMO/VPABM LeadContent LeadDemand Gen LeadMarketing Ops Lead" 5146 data-business-units="MarketingProduct" 5147 data-industries="B2B" 5148 data-products="" 5149 data-solutions="" 5150 data-content-type="Product Tour" 5151 data-funnel-stages="Top of Funnel" 5152 data-uuid="d64d2437-7e3c-489d-a77a-791766708af1" 5153> 5154 <a onclick=" 5155 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5156window.initializeContentEvents('contentClick', {contentId: 855820}) 5157" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory_product_tour?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5158 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5159 5160 bg-[#FFFFFF] 5161 5162 pf-bottom-bar-title-wrapper"> 5163 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5164 PathFactory Overview: Product Tour 5165 </div> 5166 </div> 5167 <img 5168 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5169 src="https://cdn.pathfactory.com/assets/146/thumbnails/932696/ca8257a0-118b-4078-8e19-3fd7a2c80de1.png" 5170 alt="Sample content thumbnail" 5171 loading="lazy" 5172 > 5173 <span
5174 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5175 5176 style="display: none;" 5177 5178 > 5179 Featured <i class="fa fa-star" aria-hidden="true"></i> 5180 </span> 5181 </a> 5182</div> 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203<div 5204 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5205 style="" 5206 data-is-pinned="false" 5207 data-topics="ProductAI" 5208 data-title="PathFactory Helps Reduce Costs Overview" 5209 data-language="" 5210 data-personas="" 5211 data-business-units="MarketingSales" 5212 data-industries="B2B" 5213 data-products="Advanced" 5214 data-solutions="" 5215 data-content-type="Product Marketing" 5216 data-funnel-stages="Bottom of Funnel" 5217 data-uuid="e7123187-9bcd-463a-81e7-363784311c3b" 5218> 5219 <a onclick=" 5220 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5221window.initializeContentEvents('contentClick', {contentId: 305234}) 5222" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory-helps-re?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5223 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5224 5225 bg-[#FFFFFF] 5226 5227 pf-bottom-bar-title-wrapper"> 5228 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5229 PathFactory Helps Reduce Costs Overview 5230 </div> 5231 </div> 5232 <img 5233 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5234 src="https://cdn.pathfactory.com/assets/146/thumbnails/565593/337a8e70-0d6d-44d3-8a68-2e6a9127daa8.png" 5235 alt="Sample content thumbnail" 5236 loading="lazy" 5237 > 5238 <span 5239 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5240 5241 style="display: none;" 5242 5243 > 5244 Featured <i class="fa fa-star" aria-hidden="true"></i> 5245 </span> 5246 </a> 5247</div> 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268<div 5269 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5270 style="" 5271 data-is-pinned="false" 5272 data-topics="ProductMarketing OperationsAI" 5273 data-title="PathFactory Helps Increase Revenue Overview" 5274 data-language="" 5275 data-personas="" 5276 data-business-units="MarketingSalesProduct" 5277 data-industries="B2B" 5278 data-products="" 5279 data-solutions="" 5280 data-content-type="Product Marketing" 5281 data-funnel-stages="Bottom of Funnel" 5282 data-uuid="94f40fcc-41e3-41d0-8706-94b4595b458f" 5283> 5284 <a onclick=" 5285 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5286window.initializeContentEvents('contentClick', {contentId: 305233}) 5287" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory-helps-in?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5288 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5289 5290 bg-[#FFFFFF] 5291 5292 pf-bottom-bar-title-wrapper"> 5293 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5294 PathFactory Helps Increase Revenue Overview 5295 </div> 5296 </div> 5297 <img 5298 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5299 src="https://cdn.pathfactory.com/assets/146/thumbnails/565608/216e83d1-58c2-42c1-a3a7-efb2c97e8940.png" 5300 alt="Sample content thumbnail" 5301 loading="lazy" 5302 > 5303 <span 5304 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5305 5306 style="display: none;" 5307 5308 > 5309 Featured <i class="fa fa-star" aria-hidden="true"></i> 5310 </span> 5311 </a> 5312</div> 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333<div 5334 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5335 style="" 5336 data-is-pinned="false" 5337 data-topics="AIChatFactory" 5338 data-title="ChatFactory Product Tour" 5339 data-language="English" 5340 data-personas="" 5341 data-business-units="MarketingSales" 5342 data-industries="B2B" 5343 data-products="" 5344 data-solutions="" 5345 data-content-type="Product Tour" 5346 data-funnel-stages="Top of Funnel" 5347 data-uuid="ca39d778-636f-426f-a99a-ff31740c1a2e" 5348> 5349 <a onclick=" 5350 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5351window.initializeContentEvents('contentClick', {contentId: 646336}) 5352" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/chatfactory-tour?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5353 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5354 5355 bg-[#FFFFFF] 5356 5357 pf-bottom-bar-title-wrapper"> 5358 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5359 ChatFactory Product Tour 5360 </div> 5361 </div> 5362 <img 5363 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5364 src="https://cdn.pathfactory.com/assets/146/thumbnails/785785/6dc7b800-eb54-483f-b9fe-51cf8fd8a750.png" 5365 alt="Sample content thumbnail" 5366 loading="lazy" 5367 > 5368 <span
5369 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5370 5371 style="display: none;" 5372 5373 > 5374 Featured <i class="fa fa-star" aria-hidden="true"></i> 5375 </span> 5376 </a> 5377</div> 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398<div 5399 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5400 style="" 5401 data-is-pinned="false" 5402 data-topics="" 5403 data-title="What Does PathFactory Do?" 5404 data-language="English" 5405 data-personas="" 5406 data-business-units="MarketingSales" 5407 data-industries="" 5408 data-products="" 5409 data-solutions="" 5410 data-content-type="Video" 5411 data-funnel-stages="Middle of Funnel" 5412 data-uuid="0c6a0fa4-7fbe-4379-b556-4ec43fd46cb5" 5413> 5414 <a onclick=" 5415 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5416window.initializeContentEvents('contentClick', {contentId: 572576}) 5417" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory-explainer?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5418 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5419 5420 bg-[#FFFFFF] 5421 5422 pf-bottom-bar-title-wrapper"> 5423 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5424 What Does PathFactory Do? 5425 </div> 5426 </div> 5427 <img 5428 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5429 src="https://cdn.pathfactory.com/assets/146/thumbnails/573033/bd904b2b-3b49-4063-b097-91a4fcd320de.png" 5430 alt="Sample content thumbnail" 5431 loading="lazy" 5432 > 5433 <span 5434 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5435 5436 style="display: none;" 5437 5438 > 5439 Featured <i class="fa fa-star" aria-hidden="true"></i> 5440 </span> 5441 </a> 5442</div> 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463<div 5464 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5465 style="" 5466 data-is-pinned="false" 5467 data-topics="ProductPersonalizationAI" 5468 data-title="How PathFactory Fits Into Your Martech Stack" 5469 data-language="" 5470 data-personas="" 5471 data-business-units="MarketingSales" 5472 data-industries="B2B" 5473 data-products="Advanced" 5474 data-solutions="" 5475 data-content-type="Sales Material" 5476 data-funnel-stages="Top of Funnel" 5477 data-uuid="2eeddcd1-d69b-43ad-bc7e-78f2975f6101" 5478> 5479 <a onclick=" 5480 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5481window.initializeContentEvents('contentClick', {contentId: 520286}) 5482" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/martechstackpf_final?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5483 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5484 5485 bg-[#FFFFFF] 5486 5487 pf-bottom-bar-title-wrapper"> 5488 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5489 How PathFactory Fits Into Your Martech Stack 5490 </div> 5491 </div> 5492 <img 5493 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5494 src="https://cdn.pathfactory.com/assets/146/contents/520286/thumbnails/600x/3b3e7d7d-c86a-4862-afd6-e822e5ed5b12-1.png" 5495 alt="Sample content thumbnail" 5496 loading="lazy" 5497 > 5498 <span 5499 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5500 5501 style="display: none;" 5502 5503 > 5504 Featured <i class="fa fa-star" aria-hidden="true"></i> 5505 </span> 5506 </a> 5507</div> 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528<div 5529 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5530 style="" 5531 data-is-pinned="false" 5532 data-topics="PFRI" 5533 data-title="[Product Tour] PathFactory For Revenue Intelligence" 5534 data-language="English" 5535 data-personas="CMO/VPABM LeadContent LeadDemand Gen Lead" 5536 data-business-units="MarketingSales" 5537 data-industries="" 5538 data-products="" 5539 data-solutions="" 5540 data-content-type="Product Tour" 5541 data-funnel-stages="Top of Funnel" 5542 data-uuid="519e4870-0caa-468d-b10a-be5ceb61a191" 5543> 5544 <a onclick=" 5545 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5546window.initializeContentEvents('contentClick', {contentId: 912630}) 5547" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pfri_producttour?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5548 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5549 5550 bg-[#FFFFFF] 5551 5552 pf-bottom-bar-title-wrapper"> 5553 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5554 [Product Tour] PathFactory For Revenue Intelligence 5555 </div> 5556 </div> 5557 <img 5558 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5559 src="https://cdn.pathfactory.com/assets/146/logos/974261/f855ee36-c0ab-4ed2-a78d-f42068c21fd1.png" 5560 alt="Sample content thumbnail" 5561 loading="lazy" 5562 > 5563 <span
5564 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5565 5566 style="display: none;" 5567 5568 > 5569 Featured <i class="fa fa-star" aria-hidden="true"></i> 5570 </span> 5571 </a> 5572</div> 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593<div 5594 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5595 style="" 5596 data-is-pinned="false" 5597 data-topics="Product" 5598 data-title="ABM & Personalization Product Tour" 5599 data-language="English" 5600 data-personas="ABM Lead" 5601 data-business-units="MarketingSales" 5602 data-industries="" 5603 data-products="" 5604 data-solutions="" 5605 data-content-type="Product Tour" 5606 data-funnel-stages="Top of Funnel" 5607 data-uuid="0df8b410-fee1-42b6-8722-951a6114849b" 5608> 5609 <a onclick=" 5610 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5611window.initializeContentEvents('contentClick', {contentId: 892363}) 5612" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/abmtour?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5613 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5614 5615 bg-[#FFFFFF] 5616 5617 pf-bottom-bar-title-wrapper"> 5618 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5619 ABM & Personalization Product Tour 5620 </div> 5621 </div> 5622 <img 5623 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5624 src="https://cdn.pathfactory.com/assets/146/thumbnails/1035102/c36ff112-0d8f-46a6-b1f3-cf305353c06a.png" 5625 alt="Sample content thumbnail" 5626 loading="lazy" 5627 > 5628 <span 5629 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5630 5631 style="display: none;" 5632 5633 > 5634 Featured <i class="fa fa-star" aria-hidden="true"></i> 5635 </span> 5636 </a> 5637</div> 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658<div 5659 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5660 style="" 5661 data-is-pinned="false" 5662 data-topics="Content IntelligenceEnablement" 5663 data-title="Generative AI and the Intent-Driven Buyer’s Journey" 5664 data-language="English" 5665 data-personas="CMO/VPABM LeadContent LeadDemand Gen LeadMarketing Ops Lead" 5666 data-business-units="MarketingSalesSolutionsDemo" 5667 data-industries="" 5668 data-products="BasicAdvanced" 5669 data-solutions="" 5670 data-content-type="Report" 5671 data-funnel-stages="Middle of Funnel" 5672 data-uuid="034c2545-9576-44ac-bca4-d9e149e3fa51" 5673> 5674 <a onclick=" 5675 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5676window.initializeContentEvents('contentClick', {contentId: 918927}) 5677" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/genai-report?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5678 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5679 5680 bg-[#FFFFFF] 5681 5682 pf-bottom-bar-title-wrapper"> 5683 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5684 Generative AI and the Intent-Driven Buyer’s Journey 5685 </div> 5686 </div> 5687 <img 5688 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5689 src="https://cdn.pathfactory.com/assets/146/contents/918927/thumbnails/600x/ece9bef7-2e1f-41d1-97da-171d56ae4c1d-01.png" 5690 alt="Sample content thumbnail" 5691 loading="lazy" 5692 > 5693 <span 5694 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5695 5696 style="display: none;" 5697 5698 > 5699 Featured <i class="fa fa-star" aria-hidden="true"></i> 5700 </span> 5701 </a> 5702</div> 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723<div 5724 class="asset pf-content-card pf-bottombar-card snap-center shrink-0 flex justify-center max-w-[280px] w-[85%] h-full mb-8 mx-[5px]" 5725 style="" 5726 data-is-pinned="false" 5727 data-topics="ProductPersonalizationMarketoAIPathFactory Implementation" 5728 data-title="PathFactory Info Sheet" 5729 data-language="English" 5730 data-personas="ABM LeadContent LeadDemand Gen Lead" 5731 data-business-units="MarketingSales" 5732 data-industries="" 5733 data-products="" 5734 data-solutions="" 5735 data-content-type="One Pager" 5736 data-funnel-stages="Middle of Funnel" 5737 data-uuid="8f16284e-5220-4786-951c-95612d79f515" 5738> 5739 <a onclick=" 5740 window['initializeContentEvents'] && typeof window['initializeContentEvents'] === 'function' && 5741window.initializeContentEvents('contentClick', {contentId: 1009826}) 5742" class="pf-content-card-link relative block group max-w-[280px] h-fit" href="https://nurturenow.pathfactory.com/pathfactory-overview--1/pf-info-sheet?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website"> 5743 <div class=" rounded-t-md h-[50px] p-[8px] flex items-center 5744 5745 bg-[#FFFFFF] 5746 5747 pf-bottom-bar-title-wrapper"> 5748 <div class="pf-content-card-title line-clamp-2 pf_font_preset_7 text-[#000000]"> 5749 PathFactory Info Sheet 5750 </div> 5751 </div> 5752 <img 5753 class="pf-content-card-thumbnail object-cover w-full mb-4 aspect-[16/9] border border-gray-200 rounded-b-md" 5754 src="https://cdn.pathfactory.com/assets/146/contents/1009826/thumbnails/600x/5f24b409-c803-4d09-85fb-6
575479dd20df0c3-1.png" 5755 alt="Sample content thumbnail" 5756 loading="lazy" 5757 > 5758 <span 5759 class="pf-pinned-content-tag absolute bottom-[15px] rounded-b-md w-full text-center text-[12px] bg-[#5555FF] text-[#ffffff]" 5760 5761 style="display: none;" 5762 5763 > 5764 Featured <i class="fa fa-star" aria-hidden="true"></i> 5765 </span> 5766 </a> 5767</div> 5768 5769 5770 </div> 5771 </div> 5772 </div> 5773 <div 5774 5775 x-show="activeTab == 'filters'" 5776 class="mobile-filters-container flex flex-col w-full overflow-scroll grow max-h-[260px]" 5777 > 5778 5779 </div> 5780 5781 </div> 5782 5783 </div> 5784</div>
5785<script> 5786 document.querySelector("#sidebar-contents-content-page-title button").onclick = (e) => { 5787 const bottombar = document.querySelector("#sidebar-contents-content-page"); 5788 const bottomBarButton = e?.currentTarget; 5789 const bottombarTitleIcon = bottomBarButton?.querySelector("i") || document.querySelector("#sidebar-contents-content-page-title > i"); 5790 const panelLabel = bottomBarButton?.querySelector(".pf-bottom-bar-label")?.textContent?.trim() || ""; 5791 if (bottombar.style.bottom == "0px") { 5792 bottombar.style.bottom = "" 5793 bottombar.classList.add("bottom-calc(50px-340px)"); 5794 bottombarTitleIcon?.setAttribute("class", "fa-solid fa-chevron-up"); 5795 } else { 5796 bottombar.classList.remove("bottom-calc(50px-340px)"); 5797 bottombar.style.bottom = "0px"; 5798 bottombarTitleIcon?.setAttribute("class", "fa-solid fa-chevron-down"); 5799 } 5800 const isExpanded = bottombar.style.bottom === "0px"; 5801 bottomBarButton.setAttribute("aria-expanded", isExpanded ? "true" : "false"); 5802 bottomBarButton.setAttribute("aria-label", isExpanded ? "Collapse " + panelLabel : "Expand " + panelLabel); 5803 bottombar.dispatchEvent(new Event('sync-a11y')); 5804 5805 (() => { 5806 const allContents = Array.from(document.querySelectorAll(".pf-bottombar-scroller .pf-content-card")); 5807 const currentContentIndex = allContents.findIndex((c) => c.dataset.uuid.includes("d64d2437-7e3c-489d-a77a-791766708af1")); 5808 const nextIndex = currentContentIndex > -1 ? currentContentIndex + 1 : 0; 5809 const nextContent = allContents[currentContentIndex + 1] || allContents[0]; 5810 nextContent.scrollIntoView(); 5811 })(); 5812 5813 } 5814 document.addEventListener("keydown", (e) => { 5815 const bottombar = document.querySelector("#sidebar-contents-content-page"); 5816 const closeButton = document.querySelector('#sidebar-contents-content-page .fa-close'); 5817 const bottomBarButton = document.querySelector("#sidebar-contents-content-page-title button"); 5818 const panelLabel = bottomBarButton?.querySelector(".pf-bottom-bar-label")?.textContent?.trim() || ""; 5819 if (e.key === "Escape") { 5820 bottombar.style.bottom = "" 5821 bottomBarButton?.setAttribute("aria-expanded", "false"); 5822 bottomBarButton?.setAttribute("aria-label", "Expand " + panelLabel); 5823 bottombar.dispatchEvent(new Event('sync-a11y')); 5824 closeButton?.setAttribute('tabindex', '-1'); 5825 } else if (e.key === "Tab" && bottombar.style.bottom === "0px") { 5826 trapElementFocus(bottombar, e); 5827 } 5828 }); 5829</script>
5829 5830 <div class="overflow-auto pf-content-wrapper h-full w-full" style=""> 5831 5832 5833 <iframe 5834 title="PathFactory Overview: Product Tour" 5835 style="width: 100%; height: 100%; border: none;" 5836 class="pf-content-page-iframe" 5837 src="https://pathfactory.navattic.com/yd6k0hnh?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website" 5838 ></iframe> 5839 5840 5841 </div> 5842</div> 5843 5844 5845 5846 5847 5848<style> 5849 @media (min-width: 768px) { 5850 #content-page { 5851 --pf-sidebar-w: expandedpx; 5852 --pf-left-safe: 16px; 5853 --pf-right-safe: 324px; 5854 } 5855 } 5856 @media (max-width: 767.98px) { 5857 #content-page { 5858 --pf-sidebar-w: 0px; 5859 --pf-left-safe: 16px; 5860 --pf-right-safe: 16px; 5861 } 5862 } 5863</style> 5864 5865 5866 5867
5868<script> 5869 (() => { 5870 const contentsApi = new PfContentsApi({ sectionNodeId: 'content-page', preset: 'contentPage' }); 5871 contentsApi.initializeContentControls(); 5872 })(); 5873</script>
5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 <style> 5981 .pf-next-promoter .pf-nav-arrow:focus-visible:not(:disabled), 5982 .pf-next-promoter .pf-dots-nav-area:focus-visible:not([aria-disabled="true"]):not(:disabled), 5983 .pf-next-promoter .pf-text-nav:focus-visible:not(:disabled) { 5984 outline: 2px solid #ffffff; 5985 outline-offset: 2px; 5986 box-shadow: 0 0 0 4px #005fcc, 0 4px 12px rgba(0, 0, 0, 0.15); 5987 } 5988 @media (max-width: 767px) { 5989 .pf-mobile-text-override { display: flex !important; } 5990 .pf-next-promoter { 5991 z-index: 1002 !important; 5992 } 5993 } 5994 @media (min-width: 768px) { 5995 .pf-mobile-text-override { display: none !important; } 5996 :root { 5997 --pf-np-left-safe: 16px; 5998 --pf-np-right-safe: 324px; 5999 --pf-np-dots-center: -150px; 6000 } 6001 .pf-next-promoter { 6002 position: fixed; 6003 inset: 0; 6004 pointer-events: none; 6005 z-index: 1000; 6006 padding-bottom: 64px; 6007 } 6008 6009 .pf-np-left-offset { 6010 left: var(--pf-np-left-safe, 16px); 6011 transition: left 0.4s ease; 6012 } 6013 .pf-np-right-offset { 6014 right: var(--pf-np-right-safe, 324px); 6015 transition: right 0.4s ease; 6016 } 6017 .pf-nav-arrow { 6018 width: 64px; 6019 height: 64px; 6020 border-radius: 32px; 6021 display: flex; 6022 align-items: center; 6023 justify-content: center; 6024 cursor: pointer; 6025 pointer-events: auto; 6026 position: fixed; 6027 bottom: calc(64px + 8px); 6028 transition: all 0.4s ease; 6029 color: #FFFFFF; 6030 border: 2px solid #FFFFFF; 6031 background-color: #5555FF; 6032 box-shadow: 0 4px 12px rgba(0,0,0,0.15); 6033 } 6034 .pf-nav-arrow:hover { 6035 background-color: rgba(0,0,0,0.5); 6036 transform: scale(1.05); 6037 } 6038 .pf-nav-arrow[aria-disabled="true"], 6039 .pf-nav-arrow:disabled { 6040 opacity: 0.5; 6041 cursor: not-allowed; 6042 pointer-events: none; 6043 } 6044 .pf-dots-container { 6045 position: fixed; 6046 bottom: calc(64px + 8px); 6047 left: 50%; 6048 transform: translateX(calc(-50% + var(--pf-np-dots-center, 0px))); 6049 display: flex; 6050 align-items: center; 6051 justify-content: center; 6052 pointer-events: auto; 6053 height: 36px; 6054 width: 250px; 6055 transition: transform 0.4s ease; 6056 } 6057 .pf-dots { 6058 display: flex; 6059 gap: 8px; 6060 align-items: center; 6061 } 6062 .pf-dot { 6063 display: inline-block; 6064 width: 18px; height: 18px; 6065 transition: all .3s ease; 6066 border: none; outline: none; padding: 0; margin: 0; 6067 transform: scale(0.9); 6068 pointer-events: none; 6069 } 6070 .pf-dot.pf-dot-active { 6071 transform: scale(1.1); 6072 opacity: 1; 6073 } 6074 .pf-dots-nav-area { 6075 position: absolute; 6076 top: 0; bottom: 0; 6077 width: 45%; 6078 cursor: pointer; 6079 border: none; 6080 background: transparent; 6081 padding: 0; 6082 margin: 0; 6083 font: inherit; 6084 appearance: none; 6085 -webkit-appearance: none; 6086 pointer-events: auto; 6087 } 6088 .pf-dots-nav-area[aria-disabled="true"], 6089 .pf-dots-nav-area:disabled {
6090 cursor: not-allowed; 6091 pointer-events: none; 6092 opacity: 0.5; 6093 } 6094 .pf-dots-nav-left { left: 0; } 6095 .pf-dots-nav-right { right: 0; } 6096 .pf-text-nav { 6097 position: fixed; 6098 bottom: calc(64px + 12px); 6099 pointer-events: auto; 6100 cursor: pointer; 6101 transition: all 0.4s ease; 6102 z-index: 1001; 6103 border: none; 6104 background: transparent; 6105 padding: 0; 6106 margin: 0; 6107 font: inherit; 6108 text-align: inherit; 6109 appearance: none; 6110 -webkit-appearance: none; 6111 } 6112 .pf-text-nav[aria-disabled="true"], 6113 .pf-text-nav:disabled { 6114 opacity: 0.5; 6115 cursor: not-allowed; 6116 pointer-events: none; 6117 } 6118 .pf-text-nav-compact { 6119 display: flex; 6120 align-items: center; 6121 justify-content: center; 6122 padding: 12px 24px; 6123 border-radius: 8px; 6124 color: #FFFFFF; 6125 background-color: rgba(37, 99, 235, 0.9); 6126 font-size: 16px; 6127 font-weight: 500; 6128 min-width: 80px; 6129 box-shadow: 0 4px 12px rgba(0,0,0,0.15); 6130 transition: all 0.3s ease; 6131 } 6132 .pf-text-nav-expanded { 6133 display: none; 6134 flex-direction: column; 6135 width: 280px; 6136 padding: 16px; 6137 border-radius: 8px; 6138 color: #FFFFFF; 6139 background-color: rgba(37, 99, 235, 1); 6140 box-shadow: 0 8px 24px rgba(0,0,0,0.25); 6141 transform: translateY(-8px); 6142 border: 1px solid rgba(255,255,255,0.2); 6143 } 6144 .pf-text-nav.has-preview-content:hover .pf-text-nav-compact { display: none; } 6145 .pf-text-nav.has-preview-content:hover .pf-text-nav-expanded { display: flex; } 6146 6147 .pf-preview-thumbnail { 6148 width: 100%; 6149 height: 120px; 6150 object-fit: cover; 6151 border-radius: 6px; 6152 margin-bottom: 12px; 6153 } 6154 .pf-preview-title { 6155 font-size: 16px; 6156 font-weight: 600; 6157 line-height: 1.3; 6158 margin-bottom: 8px; 6159 color: inherit; 6160 } 6161 .pf-preview-description { 6162 font-size: 14px; 6163 opacity: 0.9; 6164 line-height: 1.4; 6165 display: -webkit-box; 6166 -webkit-line-clamp: 3; 6167 -webkit-box-orient: vertical; 6168 overflow: hidden; 6169 color: inherit; 6170 } 6171 } 6172 @media (max-width: 767px) { 6173 .pf-next-promoter { 6174 position: fixed; 6175 inset: 0; 6176 pointer-events: none; 6177 z-index: 1002; 6178 padding-bottom: var(--pf-mobile-bottom-safe); 6179 } 6180 6181 .pf-nav-arrow { 6182 width: 48px; 6183 height: 48px; 6184 border-radius: 32px; 6185 display: flex; 6186 align-items: center; 6187 justify-content: center; 6188 cursor: pointer; 6189 pointer-events: auto; 6190 position: fixed; 6191 bottom: var(--pf-mobile-bottom-safe); 6192 transition: all 0.4s ease; 6193 color: #FFFFFF; 6194 border: 2px solid #FFFFFF; 6195 background-color: #5555FF; 6196 box-shadow: 0 4px 12px rgba(0,0,0,0.15); 6197 } 6198 .pf-nav-arrow.pf-np-left-offset { 6199 left: 16px; 6200 } 6201 .pf-nav-arrow.pf-np-right-offset { 6202 right: 16px; 6203 } 6204 .pf-nav-arrow:disabled { 6205 opacity: 0.5;
6206 cursor: not-allowed; 6207 pointer-events: none; 6208 } 6209 6210 .pf-text-nav { display: none !important; } 6211 } 6212 </style> 6213 6214 6215 6216 <div class="pf-next-promoter" role="navigation" aria-label="Content"> 6217 6218 <button 6219 type="button" 6220 class="pf-nav-arrow pf-np-left-offset" 6221 aria-label="Previous" 6222 6223 disabled 6224 aria-disabled="true" 6225 6226 > 6227 6228 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true"> 6229 <path d="M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 6230 </svg> 6231 </button> 6232 <button 6233 type="button" 6234 class="pf-nav-arrow pf-np-right-offset" 6235 aria-label="Next" 6236 6237 onclick="window.location.href='https://nurturenow.pathfactory.com/pathfactory-overview--1/pathfactory-helps-re?utm_campaign=homepage-navattic-tour&utm_content=product-tour&utm_medium=website&utm_source=website'" 6238 6239 > 6240 6241 <svg width="24" height="24" viewBox="0 0 24 24" fill="none" aria-hidden="true"> 6242 <path d="M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 6243 </svg> 6244 </button> 6245 6246 </div> 6247 6248
6248<script> 6249 document.addEventListener('DOMContentLoaded', function() { 6250 (function () { 6251 const contentPage = document.getElementById('content-page'); 6252 if (!contentPage) return; 6253 6254 const sidebarSide = contentPage.getAttribute('data-sidebar-side') || 'left'; 6255 const isLeft = sidebarSide === 'left'; 6256 const sidebarW = 300; 6257 const isMobile = window.matchMedia('(max-width: 767px)').matches; 6258 6259 function updatePositions() { 6260 if (isMobile) { 6261 updateMobilePositions(); 6262 return; 6263 } 6264 6265 const root = document.documentElement; 6266 const isCollapsed = contentPage.classList.contains('sidebar-is-collapsed'); 6267 6268 let leftSafe, rightSafe, dotsCenter; 6269 6270 if (isCollapsed) { 6271 leftSafe = '16px'; 6272 rightSafe = '16px'; 6273 dotsCenter = '0px'; 6274 } else { 6275 if (isLeft) { 6276 leftSafe = '324px'; 6277 rightSafe = '16px'; 6278 dotsCenter = '150px'; 6279 } else { 6280 leftSafe = '16px'; 6281 rightSafe = '324px'; 6282 dotsCenter = '-150px'; 6283 } 6284 } 6285 6286 root.style.setProperty('--pf-np-left-safe', leftSafe); 6287 root.style.setProperty('--pf-np-right-safe', rightSafe); 6288 root.style.setProperty('--pf-np-dots-center', dotsCenter); 6289 } 6290 6291 function updateMobilePositions() { 6292 const bottomBar = document.getElementById('sidebar-contents-content-page'); 6293 let bottomSafe = '60px'; 6294 6295 if (bottomBar) { 6296 const barRect = bottomBar.getBoundingClientRect(); 6297 const computedBottom = window.getComputedStyle(bottomBar).bottom; 6298 let isExpanded = true; 6299 if (computedBottom && computedBottom.indexOf('-') === 0) { 6300 isExpanded = false; 6301 } 6302 if (isExpanded) { 6303 bottomSafe = window.innerHeight - barRect.top + 12 + 'px'; 6304 } else { 6305 bottomSafe = '60px'; 6306 } 6307 } 6308 6309 document.documentElement.style.setProperty('--pf-mobile-bottom-safe', bottomSafe); 6310 } 6311 6312 document.addEventListener('click', function (e) { 6313 if (e.target.id === 'pf-sidebar-toggle' || e.target.closest('#pf-sidebar-toggle')) { 6314 setTimeout(updatePositions, 50); 6315 } 6316 }); 6317 6318 if (isMobile) { 6319 const bottomBarElement = document.getElementById('sidebar-contents-content-page'); 6320 if (bottomBarElement) { 6321 bottomBarElement.addEventListener('transitionend', function (e) { 6322 if (e.propertyName === 'bottom') { 6323 updateMobilePositions(); 6324 } 6325 }); 6326 } 6327 window.addEventListener('resize', updateMobilePositions); 6328 } 6329 6330 setTimeout(updatePositions, 200); 6331 6332 window.addEventListener('resize', function () { 6333 const newIsMobile = window.matchMedia('(max-width: 767px)').matches; 6334 if (newIsMobile !== isMobile) { 6335 isMobile = newIsMobile; 6336 setTimeout(updatePositions, 100); 6337 } 6338 }); 6339 })(); 6340 }); 6341 </script>
6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359
6360<script> 6361 const pfExperienceFormStrategy = `` ? JSON.parse(``) : null; 6362 const pfContentFormStrategy = `` ? JSON.parse(``) : null; 6363 const pfExperienceFormPresent = false; 6364 const pfContentFormPresent = false; 6365 const pfExperienceFormModalSelector = ".modal-pf-experience-form-strategy"; 6366 const pfContentFormModalSelector = ".modal-pf-content-form-strategy"; 6367 const pfVisitorKnown = () => { 6368 const params = new URLSearchParams(window.location.search); 6369 const pfses = params.get('_pfses'); 6370 const knownViaLbEmail = window.pfConsentStatus && pfConsentStatus() && pfses; 6371 return false || knownViaLbEmail; 6372 }; 6373 const pfIsLandingPage = false; 6374 6375 const pfExperienceFormModal = pfExperienceFormPresent && document.querySelector(pfExperienceFormModalSelector); 6376 const pfContentFormModal = pfContentFormPresent && document.querySelector(pfContentFormModalSelector); 6377 6378 if (pfExperienceFormPresent || pfContentFormPresent) { 6379 setInterval(() => { 6380 document.dispatchEvent(new CustomEvent("pf_page_ping", { 6381 detail: { 6382 interval: 5 6383 }, 6384 })); 6385 }, 5000); 6386 } 6387 6388 const pfFormConditionsMet = ({ formModal, config, toggleModal = false, pdfButtonClick = false }) => { 6389 if (!config) { return false; } 6390 if (window.pdfFormModalOpen) { return false; } 6391 6392 const currentSession = JSON.parse(localStorage.getItem("pfCurrentSession") || "{}"); 6393 const knownVisitorCondition = config.show_to_known_visitors && pfVisitorKnown(); 6394 const unknownVisitorCondition = config.show_to_unknown_visitors && !pfVisitorKnown(); 6395 const formSubmittedAlready = JSON.parse(localStorage.getItem("pfSubmittedForms") || "[]").filter((sf) => { 6396 return ( 6397 sf.experienceId == "230169" && 6398 sf.formId == config.form_id 6399 ); 6400 }).length > 0; 6401 const submittedShowAgainCondition = config.submitted_show_again || !formSubmittedAlready; 6402 const formNotDismissed = JSON.parse(localStorage.getItem("pfDismissedForms") || "[]").filter((df) => { 6403 return ( 6404 df.experienceId == "230169" && 6405 df.formId == config.form_id 6406 ); 6407 }).length == 0; 6408 const visibleModal = Array.from(document.querySelectorAll(".pf-modal")).filter((m) => m.style.display !== "none").length > 0; 6409 6410 const show = pdfButtonClick || (knownVisitorCondition || unknownVisitorCondition) && submittedShowAgainCondition && formNotDismissed && !visibleModal; 6411 6412 if (toggleModal && formModal) { 6413 formModal.style.display = show ? "block" : "none"; 6414 formModal.style.opacity = 0; 6415 setTimeout(() => formModal.style.opacity = show ? 1 : 0, 500); 6416 if (show) { 6417 if (!pdfButtonClick) { 6418 window.pfFormsShown = [...new Set((window.pfFormsShown || []).concat([config.form_id]))]; 6419 } 6420 (window.pfVideoPlayers || []).forEach((player) => { 6421 player.pause(); 6422 }); 6423 window.showForm({ 6424 formType: pfContentFormPresent ? "" : "", 6425 formData: { value: pfContentFormPresent ? "content_form_strategy" : "experience_form_strategy" } 6426 }); 6427 } 6428 } 6429 6430 return show; 6431 }; 6432 6433 const pdfButtonHandler = (e) => { 6434 e.preventDefault(); 6435 pfFormConditionsMet({ 6436 formModal: pfContentFormModal, 6437 config: pfContentFormStrategy, 6438 toggleModal: true, 6439 pdfButtonClick: true, 6440 }); 6441 setTimeout(() => window.pdfFormModalOpen = e?.target?.id, 0); 6442 } 6443 6444 const getPdfElements = () => { 6445 const pfPrint = document.getElementById("print_pf"); 6446 const pfDownload = document.getElementById("download_pf"); 6447 const printBtn = document.getElementById("print"); 6448 const downloadBtn = document.getElementById("download"); 6449 if (!pfPrint || !pfDownload || !printBtn || !downloadBtn) { 6450 return false; 6451 } 6452 return { 6453 pfPrint, 6454 pfDownload, 6455 printBtn, 6456 downloadBtn 6457 } 6458 } 6459 6460 const switchPdfButtons = ({ showCustomButtons, config }) => { 6461 const pdfElements = getPdfElements(); 6462 if (!pdfElements) { 6463 return; 6464 } 6465 6466 const { pfPrint, pfDownload, printBtn, downloadBtn } = pdfElements; 6467 if (showCustomButtons) { 6468 const { show_on_print, show_on_download } = config; 6469 if (show_on_print) { 6470 pfPrint.style.display = "inline-block"; 6471 printBtn.style.display = "none"; 6472 pfPrint.addEventListener("click", pdfButtonHandler); 6473 window.originalPrint = window.print; 6474 window.print = () => {}; 6475 } 6476 6477 if (show_on_download) { 6478 pfDownload.style.display = "inline-block"; 6479 downloadBtn.style.display = "none"; 6480 pfDownload.addEventListener("click", pdfButtonHandler); 6481 } 6482 } else { 6483 pfPrint.style.display = "none"; 6484 pfDownload.style.display = "none"; 6485 printBtn.style.display = "inline-block"; 6486 downloadBtn.style.display = "inline-block";
6487 [pfPrint, pfDownload].forEach(button => { 6488 button.removeEventListener('click', pdfButtonHandler); 6489 }); 6490 } 6491 } 6492 const pfPdfFormConditionsMet = ({ config }) => { 6493 if (!config) { return false; } 6494 6495 const { show_on_print, show_on_download } = config; 6496 if (!show_on_print && !show_on_download) { 6497 return; 6498 } 6499 6500 const knownVisitorCondition = config.show_to_known_visitors && pfVisitorKnown(); 6501 const unknownVisitorCondition = config.show_to_unknown_visitors && !pfVisitorKnown(); 6502 const formSubmittedAlready = JSON.parse(localStorage.getItem("pfSubmittedForms") || "[]").filter((sf) => { 6503 return ( 6504 sf.experienceId == "230169" && 6505 sf.formId == config.form_id 6506 ); 6507 }).length > 0; 6508 const submittedShowAgainCondition = config.submitted_show_again || !formSubmittedAlready; 6509 const showForm = (knownVisitorCondition || unknownVisitorCondition) && submittedShowAgainCondition; 6510 switchPdfButtons({ showCustomButtons: showForm, config }); 6511 }; 6512 6513 const isBypassEngagementEnabled = (config) => { 6514 if (!config) return false; 6515 const { 6516 enable_bypass_engagement, 6517 show_on_download, 6518 show_on_print, 6519 } = config; 6520 if (!getPdfElements()) { 6521 return false; 6522 } 6523 return enable_bypass_engagement && (show_on_download || show_on_print); 6524 }; 6525 6526 const resumePdfActions = (modal) => { 6527 return new Promise((resolve, reject) => { 6528 let counter = 0; 6529 const modalCloseInterval = setInterval(() => { 6530 try { 6531 if (modal.style.display === "none" || counter > 10) { 6532 clearInterval(modalCloseInterval); 6533 if (window.pdfFormModalOpen) { 6534 if (window.pdfFormModalOpen === "print_pf") { 6535 if (window.originalPrint) { 6536 window.print = window.originalPrint; 6537 } 6538 window.PDFViewerApplication?.triggerPrinting(); 6539 } else if (window.pdfFormModalOpen === "download_pf") { 6540 window.PDFViewerApplication?.downloadOrSave(); 6541 } 6542 } 6543 window.pdfFormModalOpen = false; 6544 pfPdfFormConditionsMet({ config: pfContentFormStrategy }); 6545 resolve(); 6546 } else { 6547 counter++; 6548 } 6549 } catch (error) { 6550 clearInterval(modalCloseInterval); 6551 reject(error); 6552 } 6553 }, 500); 6554 }); 6555 }; 6556 6557 const pfContentFormStrategyEligible = pfContentFormPresent && pfFormConditionsMet({ config: pfContentFormStrategy }); 6558 const pfExperienceFormStrategyEligible = pfExperienceFormPresent && pfFormConditionsMet({ config: pfExperienceFormStrategy }); 6559 const pfActiveFormStrategy = (pfContentFormStrategyEligible && "contentStrategy") || (pfExperienceFormStrategyEligible && "experienceStrategy"); 6560 const promotersClickable = (pfActiveFormStrategy === "experienceStrategy" && pfExperienceFormStrategy.promoters_clickable) || 6561 (pfActiveFormStrategy === "contentStrategy" && pfContentFormStrategy.promoters_clickable); 6562 6563 pfContentFormPresent && pfPdfFormConditionsMet({ config: pfContentFormStrategy }); 6564 6565 const pfForceExperienceFormStrategy = pfExperienceFormPresent && 6566 isBypassEngagementEnabled(pfContentFormStrategy) && 6567 pfFormConditionsMet({ config: pfExperienceFormStrategy }); 6568 6569 const pfUpdateEngagementTimes = (pagePing) => { 6570 const engagementTimes = JSON.parse(localStorage.getItem("pfExperienceEngagement") || "[]"); 6571 const engagementTimeIndex = engagementTimes.findIndex((et) => { 6572 return et.experienceId == "230169" 6573 }); 6574 let contentEngagementIndex = -1; 6575 const contentEngagements = engagementTimes[engagementTimeIndex]?.contentEngagements || []; 6576 const contentEngagement = contentEngagements.find((ce, i) => { 6577 if (ce.contentId == "855820") { 6578 contentEngagementIndex = i; 6579 return true; 6580 } 6581 }) || {}; 6582 const newContentEngagement = { 6583 ...contentEngagement, 6584 contentId: "855820", 6585 duration: (contentEngagement.duration || 0) + pagePing.interval 6586 }; 6587 const updatedEngagementTime = { 6588 experienceId: "230169", 6589 duration: (engagementTimeIndex > -1 ? engagementTimes[engagementTimeIndex].duration : 0) + pagePing.interval, 6590 contents: 6591 engagementTimeIndex > -1 6592 ? [...new Set(engagementTimes[engagementTimeIndex].contents.concat(["855820"]))] 6593 : ["855820"], 6594 contentEngagements: 6595 contentEngagementIndex > -1 6596 ? contentEngagements.map((ce) => ce.contentId == "855820" ? newContentEngagement : ce) 6597 : [...contentEngagements, newContentEngagement] 6598 }; 6599 6600 if (engagementTimeIndex > -1) { 6601 engagementTimes[engagementTimeIndex] = updatedEngagementTime; 6602 } else { 6603 engagementTimes.push(updatedEngagementTime); 6604 } 6605 localStorage.setItem("pfExperienceEngagement", JSON.stringify(engagementTimes)); 6606 localStorage.setItem("pfCurrentSession", JSON.stringify(updatedEngagementTime)); 6607 6608 if (pfActiveFormStrategy === "experienceStrategy" || pfForceExperienceFormStrategy) { 6609 const assetsViewedCondition = updatedEngagementTime.contents.length >= pfExperienceFormStrategy.assets_viewed 6610 && updatedEngagementTime.duration >= pfExperienceFormStrategy.assets_viewed_time; 6611 const timeOnExperienceCondition = updatedEngagementTime.duration >= pfExperienceFormStrategy.time_on_experience; 6612 const formNotYetShown = (window.pfFormsShown || []).indexOf(pfExperienceFormStrategy.form_id) == -1; 6613 6614 if ( 6615 (pfExperienceFormStrategy.form_trigger_type !== "assetsViewed" || assetsViewedCondition) && 6616 (pfExperienceFormStrategy.form_trigger_type !== "timeOnExperience" || timeOnExperienceCondition) && 6617 formNotYetShown 6618 ) { 6619 pfFormConditionsMet({ 6620 config: pfExperienceFormStrategy, 6621 formModal: pfExperienceFormModal, 6622 toggleModal: true 6623 }); 6624 } 6625 } 6626 6627 if (pfActiveFormStrategy === "contentStrategy") { 6628 const timeOnContentCondition = (newContentEngagement.duration >= pfContentFormStrategy.show_after_time) && !isBypassEngagementEnabled(pfContentFormStrategy); 6629 const formNotYetShown = (window.pfFormsShown || []).indexOf(pfContentFormStrategy.form_id) == -1; 6630 if (timeOnContentCondition && formNotYetShown) { 6631 pfFormConditionsMet({ 6632 formModal: pfContentFormModal, 6633 config: pfContentFormStrategy, 6634 toggleModal: true 6635 }) 6636 } 6637 } 6638 }; 6639 6640 if (promotersClickable) { 6641 const pfPromoter = document.querySelector("#sidebar"); 6642 if (pfPromoter) { 6643 pfPromoter.style["z-index"] = 1000000; 6644 } 6645 } 6646 6647 6648 document.addEventListener("pf_page_ping", (e) => { 6649 if (pfIsLandingPage && pfExperienceFormStrategy?.exclude_landing_page) { 6650 return; 6651 } 6652 6653 if (pfIsLandingPage && document.querySelector(".lookbook-overlay-content")) { 6654 return; 6655 } 6656 6657 const pagePingEvent = e.detail; 6658 pfUpdateEngagementTimes(pagePingEvent); 6659 }); 6660 6661 6662 window.addEventListener("message", (event) => { 6663 if (!(event.data?.lookbookExternalForm || event.data?.pfStandardForm)) { 6664 return; 6665 } 6666 6667 const visibleModal = Array.from(document.querySelectorAll("#pf-modal")).filter((m) => m.style.display !== "none")[0]; 6668 const visibleForm = visibleModal?.querySelector("[data-pf-theme-block-ref='form']"); 6669 const formId = visibleForm?.getAttribute("data-pf-theme-form-library-id"); 6670 6671 if (formId) { 6672 const submittedForms = JSON.parse(localStorage.getItem("pfSubmittedForms") || "[]"); 6673 const submittedForm = { 6674 experienceId: "230169", 6675 formId 6676 }; 6677 const submittedFormNotLogged = submittedForms.findIndex((x) => 6678 x.experienceId == submittedForm.experienceId && 6679 x.formId == submittedForm.formId 6680 ) === -1; 6681 if (submittedFormNotLogged) { 6682 submittedForms.push(submittedForm); 6683 localStorage.setItem("pfSubmittedForms", JSON.stringify(submittedForms)); 6684 } 6685 resumePdfActions(visibleModal).then(() => { 6686 window.resetForm(visibleModal); 6687 }) 6688 } 6689 }); 6690 6691 6692 window.addEventListener("DOMContentLoaded", () => { 6693 if (pfIsLandingPage && pfExperienceFormStrategy?.exclude_landing_page) { 6694 return; 6695 } 6696 6697 const currentSession = JSON.parse(localStorage.getItem("pfCurrentSession") || "{}"); 6698 if ( 6699 currentSession.experienceId == "230169" || 6700 (pfExperienceFormStrategy && pfExperienceFormStrategy.time_on_experience === 0) || 6701 (pfContentFormStrategy && pfContentFormStrategy.show_after_time === 0) 6702 ) { 6703 pfUpdateEngagementTimes({ interval: 0 }); 6704 } 6705 }); 6706</script>
6706 6707 6708 6709 6710 6711 6712
6712<script> 6713 (function() { 6714 document.addEventListener('alpine:init', () => { 6715 Alpine.directive('intersect', Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 6716 let evaluate = evaluateLater(expression) 6717 6718 let options = { 6719 rootMargin: getRootMargin(modifiers), 6720 threshold: getThreshold(modifiers), 6721 } 6722 6723 let observer = new IntersectionObserver(entries => { 6724 entries.forEach(entry => { 6725 // Ignore entry if intersecting in leave mode, or not intersecting in enter mode 6726 if (entry.isIntersecting === (value === 'leave')) return 6727 6728 evaluate() 6729 6730 modifiers.includes('once') && observer.disconnect() 6731 }) 6732 }, options) 6733 6734 observer.observe(el) 6735 6736 cleanup(() => { 6737 observer.disconnect() 6738 }) 6739 })); 6740 }); 6741 6742 function getThreshold(modifiers) { 6743 if (modifiers.includes('full')) return 0.99 6744 if (modifiers.includes('half')) return 0.5 6745 if (! modifiers.includes('threshold')) return 0 6746 6747 let threshold = modifiers[modifiers.indexOf('threshold') + 1] 6748 6749 if (threshold === '100') return 1 6750 if (threshold === '0') return 0 6751 6752 return Number(`.${threshold}`) 6753 } 6754 6755 function getLengthValue(rawValue) { 6756 // Supported: -10px, -20 (implied px), 30 (implied px), 40px, 50% 6757 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/) 6758 return match ? match[1] + (match[2] || 'px') : undefined 6759 } 6760 6761 function getRootMargin(modifiers) { 6762 const key = 'margin' 6763 const fallback = '0px 0px 0px 0px' 6764 const index = modifiers.indexOf(key) 6765 6766 // If the modifier isn't present, use the default. 6767 if (index === -1) return fallback 6768 6769 // Grab the 4 subsequent length values after it: x-intersect.margin.300px.0.50%.0 6770 let values = [] 6771 for (let i = 1; i < 5; i++) { 6772 values.push(getLengthValue(modifiers[index + i] || '')) 6773 } 6774 6775 // Filter out undefined values (not a valid length) 6776 values = values.filter((v) => v !== undefined) 6777 6778 return values.length ? values.join(' ').trim() : fallback 6779 } 6780 })(); 6781</script>
vendor: 1 bytes, line 6781
6781
6782<script type="text/javascript"> 6783 _linkedin_partner_id = "9909708"; 6784 window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || []; 6785 window._linkedin_data_partner_ids.push(_linkedin_partner_id); 6786 6787 (function(l) { 6788 if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])}; window.lintrk.q=[]} 6789 var s = document.getElementsByTagName("script")[0]; 6790 var b = document.createElement("script"); 6791 b.type = "text/javascript"; b.async = true; 6792 b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; 6793 s.parentNode.insertBefore(b, s); 6794 })(window.lintrk); 6795 6796 6797 const pfCTAButtons = document.querySelectorAll('.pf-cta'); 6798 6799 pfCTAButtons.forEach(function (button) { 6800 button.addEventListener('click', function () { 6801 if (window.lintrk) { 6802 window.lintrk('track'); 6803 console.log('ctaClickedLI') 6804 } 6805 }); 6806 }); 6807 const pfCTAFormButtons = document.querySelectorAll('button[class*="cta-button"]'); 6808 6809 pfCTAFormButtons.forEach(function (button) { 6810 button.addEventListener('click', function () { 6811 if (window.lintrk) { 6812 window.lintrk('track'); 6813 console.log('ctaFormClickedLI') 6814 } 6815 }); 6816 }); 6817 const contentCardLink = document.querySelectorAll('.pf-content-card-link'); 6818 6819 contentCardLink.forEach(function (button) { 6820 button.addEventListener('click', function () { 6821 if (window.lintrk) { 6822 window.lintrk('track'); 6823 console.log('contentClickedLI'); 6824 } 6825 }); 6826 }); 6827 6828 const customABMContentCardLink = document.querySelectorAll('section[data-pf-theme-artefact-filename="2025-content-list"] a'); 6829 6830 customABMContentCardLink.forEach(function (button) { 6831 button.addEventListener('click', function () { 6832 if (window.lintrk) { 6833 window.lintrk('track'); 6834 console.log('abmContentListItemClickedLI'); 6835 } 6836 }); 6837 }); 6838 6839 const contentListCardLink = document.querySelectorAll('.pf-content-list a'); 6840 6841 contentListCardLink.forEach(function (button) { 6842 button.addEventListener('click', function () { 6843 if (window.lintrk) { 6844 window.lintrk('track'); 6845 console.log('contentListItemClickedLI'); 6846 } 6847 }); 6848 }); 6849</script>
6849 6850 6851
6851<script type="text/javascript"> 6852 function cookieFirstConsentChange(e) { 6853 // if(document.location.href.indexOf('nurturenow.pathfactory.com/aichat/')>0){ 6854 // } 6855 console.log('On Cookiefirst Consent'); 6856 if (pfConsentStatus() != true && (e.detail.functional || e.detail.performance)) { 6857 try { 6858 if (window["cfTracker"]) { 6859 // Tracker for CF 6860 window["cfTracker"] && window["cfTracker"]("setConsentSettings", { accepted: true }); 6861 } else { 6862 // Tracker for Other experiences 6863 pfCookieResponse(true); 6864 } 6865 if (!e.detail.performance) { 6866 console.log('On Cookiebot Accept > 1'); 6867 pfCookieTrack([1]); 6868 } else if (e.detail.performance) { 6869 console.log('On Cookiebot Accept > 2'); 6870 pfCookieTrack([2]); 6871 } 6872 } catch (e) { 6873 console.log('On Cookiebot Accept > If Try'); 6874 } 6875 } 6876 else if (pfConsentStatus() == true && (!e.detail.functional && !e.detail.statistics)) { 6877 try { 6878 if (window["cfTracker"]) { 6879 // Tracker for CF 6880 window["cfTracker"] && window["cfTracker"]("setConsentSettings", { accepted: false }); 6881 } else { 6882 // Tracker for Other experiences 6883 pfCookieResponse(false); 6884 } 6885 console.log('On Cookiebot Accept > -1'); 6886 pfCookieTrack([-1]); 6887 } catch (e) { 6888 console.log('On Cookiebot Accept > Else If Try'); 6889 } 6890 } 6891 } 6892 6893pfOnJukeboxLoad.then(function () { 6894window.addEventListener("cf_consent_loaded", function(event) { 6895 console.log('cf_consent_loaded event listen', event); 6896 var previouslySavedConsent = event.detail; 6897 6898 if(!previouslySavedConsent) { 6899 // consent hasn't been given yet 6900 console.log('cf_consent_loaded not given yet'); 6901 } else { 6902 console.log(event); 6903 cookieFirstConsentChange(event); 6904 } 6905}); 6906window.addEventListener("cf_consent", function(event) { 6907 console.log('cf_consent event listen', event); 6908 cookieFirstConsentChange(event); 6909}); 6910window.addEventListener('message', function(event) { 6911console.log('message event listen', event); 6912 if (event.data && event.data.type === 'pf-cookie-change') { 6913 console.log('Received pf-cookie-change message:', event.data); 6914 const parentOptIn = new CustomEvent('cf_consent', { 6915 detail:{ 6916 functional: event.data.functional, 6917 performance: event.data.performance 6918 } 6919 }); 6920 dispatchEvent(parentOptIn); 6921 document.location.reload(); 6922 } 6923}); 6924}); 6925 // Add an event listener to capture opt-in from parent frame 6926 /*window.addEventListener('message', function(event) { 6927 if (event.origin === "https://www.pathfactory.com") { 6928 // Ensure the message type is 'cookie-opt-in' 6929 if (event.data && event.data.type === 'pf-cookie-change') { 6930 console.log('Cookie Opt-In message received:', event.data); 6931 Cookiebot.hide() 6932 if(pfConsentStatus() != true && Cookiebot.consent.preferences) { 6933 pfCookieResponse(true); 6934 } 6935 else if(pfConsentStatus() == true && !Cookiebot.consent.preferences){ 6936 pfCookieResponse(false); 6937 } 6938 } 6939 } 6940 }, false); 6941 */ 6942</script>
6942 6943
6943<script> 6944 function appendScriptTag(link) { 6945 var sc = document.createElement("script"); 6946 sc.setAttribute("src", link); 6947 sc.setAttribute("defer", ""); 6948 sc.setAttribute("type", "text/javascript"); 6949 var elementToAppendTo = document.getElementsByTagName('html')[0] || document. 6950 getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]; 6951 elementToAppendTo.appendChild(sc); 6952 } 6953 6954 var currentWebsiteUrl = encodeURIComponent(window.location.href); 6955 var serverUrl = "https://tracking.intentsify.io"; 6956 var link = serverUrl + '/page-tracking/intentsify-pathfactory/' + currentWebsiteUrl; 6957 6958 setTimeout(function(){ 6959 appendScriptTag(link); 6960 }, 1000); 6961</script>
6961 6962 6963 6964 </body> 6965</html> 6966 6967
6968<script> 6969 /* 6970 This script removes the promoters if content is loaded inside iframe but also checks it is not overlay and preview. 6971 This script also removes header if TE landing page is added as content and loaded inside iframe but also checks it is not overlay and preview. 6972 */ 6973 const parentWindow = window.parent; 6974 const insideContentPageIframe = parentWindow && parentWindow.document.querySelector("iframe.pf-content-page-iframe") && window.self !== window.top; 6975 if(insideContentPageIframe) { 6976 // hide promiters 6977 const contentDiv = document.querySelector('.pf-content-wrapper'); 6978 if(contentDiv) { 6979 const htmlElement = document.querySelector('html'); 6980 htmlElement.style.height = "100%"; 6981 document.body.style.height = "100%"; 6982 document.body.innerHTML = contentDiv.innerHTML; 6983 } 6984 const iframeHideDivs = document.querySelector(".iframe-hide"); 6985 iframeHideDivs && iframeHideDivs.remove(); 6986 } 6987</script>
vendor: 1 bytes, line 6987
6987
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.