1<!DOCTYPE html><!-- Last Published: Wed Sep 23 2026 14:31:00 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="wfprod.payscale.com" data-wf-page="6a33fc2df03836a6dbce5a0a" data-wf-site="678b9f42ff433e48155d0586" data-wf-intellimize-customer-id="117554229" lang="en"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>Payscale Ascent | AI-Powered Compensation Intelligence</title><meta content="Real-time market data, intelligent pricing tools, and connected compensation planning. Built for compensation professionals who need to move faster with less manual work and more strategic impact." name="description"/><meta content="Payscale Ascent | AI-Powered Compensation Intelligence" property="og:title"/><meta content="Real-time market data, intelligent pricing tools, and connected compensation planning. Built for compensation professionals who need to move faster with less manual work and more strategic impact." property="og:description"/><meta content="Payscale Ascent | AI-Powered Compensation Intelligence" name="twitter:title"/><meta content="Real-time market data, intelligent pricing tools, and connected compensation planning. Built for compensation professionals who need to move faster with less manual work and more strategic impact." name="twitter:description"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><link href="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/css/payscale-staging.shared.c331de3d5.min.css" rel="stylesheet" type="text/css" integrity="sha384-wzHePVI39iomD5IcjQrvRCcQQxRzNUN04RY6DFICAlFf8QG9NHcnMspnA8MNcBVq" crossorigin="anonymous"/><link href="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/css/payscale-staging.6a33fc2df03836a6dbce5a0a.42501ab0e.opt.min.css" rel="stylesheet" type="text/css" integrity="sha384-QlAasOtFCExfuOSKO7R+oYI5qtyXm10L6um3YAgyE+r96AXmzXILO9/bchqHsewk" crossorigin="anonymous"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/>
1<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
1<script type="text/javascript">WebFont.load({ google: { families: ["Inconsolata:400,700","Inter:300,400,500,600,700"] }});</script>
1<script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
1<link href="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/682a15238980d2afdc3f302b_payscale-favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/682a1528d7d614e5dba2f8f2_payscale-webclip.png" rel="apple-touch-icon"/><link href="https://www.payscale.com/products/software/ascent" rel="canonical"/><style>.anti-flicker, .anti-flicker * {visibility: hidden !important; opacity: 0 !important;}</style><style>[data-wf-hidden-variation], [data-wf-hidden-variation] * { 2 display: none !important; 3 }</style>
3<script type="text/javascript">if (localStorage.getItem('intellimize_data_tracking_type') !== 'optOut') { localStorage.removeItem('intellimize_opt_out_117554229'); } if (localStorage.getItem('intellimize_data_tracking_type') !== 'optOut') { localStorage.setItem('intellimize_data_tracking_type', 'optOut'); }</script>
3<script type="text/javascript">(function(e){var s={r:[]};e.wf={r:s.r,ready:t=>{s.r.push(t)}}})(window)</script>
3<script type="text/javascript">(function(e){var s={p:[],r:[]};e.intellimize={p:s.p,r:s.r,push:function(t){s.p.push(t)},ready:function(t){s.r.push(t)}}})(window)</script>
3<script type="text/javascript">(function(t,p){var n=document.documentElement;n.className+=" "+p,setTimeout(function(){n.className=n.className.replace(RegExp(" ?"+p),"")},t)})(4000, 'anti-flicker')</script>
3<link href="https://cdn.intellimize.co/snippet/117554229.js" rel="preload" as="script"/>
3<script type="text/javascript">var wfClientScript=document.createElement("script");wfClientScript.src="https://cdn.intellimize.co/snippet/117554229.js",wfClientScript.async=!0,wfClientScript.onerror=function(){document.documentElement.className=document.documentElement.className.replace(RegExp(" ?anti-flicker"),"")},document.head.appendChild(wfClientScript);</script>
3<link href="https://api.intellimize.co" rel="preconnect" crossorigin="true"/><link href="https://log.intellimize.co" rel="preconnect" crossorigin="true"/><link href="https://117554229.intellimizeio.com" rel="preconnect"/><!-- Charset & Viewport --> 4<meta charset="UTF-8" /> 5<meta name="viewport" content="width=device-width, initial-scale=1" /> 6 7<link rel="preconnect" href="https://cdn.cookielaw.org" crossorigin> 8<link rel="preconnect" href="https://www.googletagmanager.com" crossorigin> 9 10<!-- Facebook Domain Verification --> 11<meta name="facebook-domain-verification" content="zmicjcz23dwwg4wr4it2kpa201mgnt" /> 12 13<!-- Open Graph Meta Tags (for social previews) - START --> 14<meta property="og:image" content="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6826b33f1bbb33cc0befc00f_payscale-create-confidence-in-your-compensation.png" /> 15<meta property="og:image:width" content="1200" /> 16<meta property="og:image:height" content="627" /> 17<!-- Open Graph Meta Tags (for social previews) - END --> 18 19<!-- OneTrust Cookies Consent Notice - Webflow - START -->
20<script src="https://cdn.cookielaw.org/consent/832d08fb-f25f-4eb2-86ed-d72dd85e17cd/otSDKStub.js" type="text/javascript" data-domain-script="832d08fb-f25f-4eb2-86ed-d72dd85e17cd" ></script>
20 21
22<script type="text/javascript"> 23function OptanonWrapper() { } 24</script>
24 25<!-- OneTrust Cookies Consent Notice - Webflow - END --> 26 27<!-- Webflow Optimize, OneTrust - Custom Consent Checker - START -->
28<script> 29wf.ready(() => { 30// Function to opt in or out based on consent preferences 31const handleWebflowAnalyticsConsent = () => { 32 try { 33 // Logic to check consent groups from the OneTrust cookie 34 const otCookieKey = 'OptanonConsent='; 35 const otCookie = document.cookie.split('; ').find(row => row.startsWith(otCookieKey)); 36 if (!otCookie) { 37 throw new Error('OneTrust cookie not found.'); 38 } 39 const otGroupsKey = 'groups='; 40 const otGroups = decodeURIComponent(otCookie.split('&').find(row => row.startsWith(otGroupsKey)).split('=')[1]); 41 // OneTrust groups: 1 = necessary, 2 = performance, 3 = functional, 4 = targeting 42 const OT_FUNCTIONAL_CONSENT = '3:1'; // Ensure this matches your expected consent group 43 // Check for functional cookies group 44 const hasOptedIn = otGroups.indexOf(OT_FUNCTIONAL_CONSENT) !== -1; 45 // Adjust Webflow Analytics opt-in/out based on consent 46 if (hasOptedIn) { 47 wf.allowUserTracking(); 48 } else { 49 wf.denyUserTracking(); 50 } 51 } catch (e) { 52 console.error('Error handling OneTrust consent:', e); 53 } 54}; 55// Set up the OneTrust consent change listener to check when preferences change 56if (typeof OneTrust !== 'undefined' && OneTrust.OnConsentChanged) { 57 OneTrust.OnConsentChanged(() => { 58 handleWebflowAnalyticsConsent(); 59 }); 60} 61// Initial check when the page loads 62handleWebflowAnalyticsConsent(); 63}); 64</script>
64 65<!-- Webflow Optimize, OneTrust - Custom Consent Checker - END --> 66 67<!-- Webflow Optimize Experience Tracking - START -->
68<script> 69// Configure localStorage for Optimize experience data 70const optimizeStorage = 'wf_optimize_data'; 71const optimizeTTL = 30 * 60 * 1000; // 30 minutes of inactivity 72 73// Initialize Optimize data object from localStorage 74const optimizeData = (function() { 75 try { 76 const stored = localStorage.getItem(optimizeStorage); 77 if (stored) { 78 const parsed = JSON.parse(stored); 79 if (parsed.timestamp && (Date.now() - parsed.timestamp < optimizeTTL)) { 80 return parsed.data; 81 } 82 // Expired â clear it 83 localStorage.removeItem(optimizeStorage); 84 } 85 } catch (e) { 86 console.warn('Could not restore Webflow Optimize data from localStorage:', e); 87 } 88 return { 89 experienceId: [], 90 experienceName: [], 91 experienceType: [], 92 variationId: [], 93 variationName: [], 94 ccStatus: [] 95 }; 96})(); 97 98// Refresh timestamp on every page load if data exists (rolling expiry) 99if (optimizeData.experienceId.length > 0) { 100 try { 101 localStorage.setItem(optimizeStorage, JSON.stringify({ 102 data: optimizeData, 103 timestamp: Date.now() 104 })); 105 } catch (e) { 106 console.warn('Could not refresh Optimize data timestamp:', e); 107 } 108} 109 110// Define getter function for Optimize data 111function getOptimizeStrings() { 112 // Helper to check if value is meaningful 113 function hasValue(val) { 114 return val && typeof val === 'string' && val.trim().length > 0; 115 } 116 117 // Filter out empty entries and format 118 const experiments = (optimizeData.experienceName || []) 119 .reduce((acc, name, i) => { 120 if (hasValue(name) && hasValue(optimizeData.experienceId?.[i])) { 121 acc.push(`${name.trim()} (${optimizeData.experienceId[i].trim()})`); 122 } 123 return acc; 124 }, []) 125 .join(', '); 126 127 const variants = (optimizeData.variationName || []) 128 .reduce((acc, name, i) => { 129 if (hasValue(name) && hasValue(optimizeData.variationId?.[i])) { 130 acc.push(`${name.trim()} (${optimizeData.variationId[i].trim()})`); 131 } 132 return acc; 133 }, []) 134 .join(', '); 135 136 return { 137 experiment: experiments, 138 variant: variants 139 }; 140}; 141 142// Ensure Webflow's API is available before running 143if (typeof wf !== 'undefined') { 144 wf.ready(() => { 145 146 // Listen for Optimize variation assignment 147 wf.onVariationRecorded(function(result) { 148 try { 149 if (result) { 150 151 // Skip if this Optimize experience has already been recorded 152 if (result.experienceId && optimizeData.experienceId.includes(result.experienceId)) { 153 return; 154 } 155 156 optimizeData.experienceId.push(result.experienceId || ''); 157 optimizeData.experienceName.push(result.experienceName || ''); 158 optimizeData.experienceType.push(result.experienceType || ''); 159 optimizeData.variationId.push(result.variationId || ''); 160 optimizeData.variationName.push(result.variationName || ''); 161 optimizeData.ccStatus.push(result.ccStatus || ''); 162 163 // Persist Optimize experience data across page navigations and new tabs 164 try { 165 localStorage.setItem(optimizeStorage, JSON.stringify({ 166 data: optimizeData, 167 timestamp: Date.now() 168 })); 169 } catch (e) { 170 console.warn('Could not save Optimize data to localStorage:', e); 171 } 172 173 console.log('Webflow Optimize Experience data: ', optimizeData); 174 175 // Push to any Marketo forms that have already loaded 176 if (typeof MktoForms2 !== 'undefined') { 177 MktoForms2.whenReady(function(form) { 178 var opt = getOptimizeStrings(); 179 var optFields = {}; 180 181 // Populate hidden fields with experience data 182 if (opt.experiment.length > 0) { 183 optFields.Optimization_Experiment__c = opt.experiment; 184 } 185 if (opt.variant.length > 0) { 186 optFields.Optimization_Variant__c = opt.variant; 187 } 188 if (Object.keys(optFields).length > 0) { 189 form.addHiddenFields(optFields); 190 console.log('Optimize fields applied to form', form.getId(), ':', optFields); 191 } else { 192 console.log('No Optimize data available yet for form', form.getId()); 193 } 194 }); 195 } 196 } else { 197 console.log('Webflow Optimize experience not found or already recorded'); 198 } 199 } catch (err) { 200 console.error('Error parsing Webflow Optimize data:', err); 201 } 202 }); 203 }); 204} else { 205 console.warn('Webflow API not available. Optimize experience tracking will not function.'); 206}; 207</script>
207 208<!-- Webflow Optimize Experience Tracking - END --> 209 210<!-- Custom CSS - START --> 211<style> 212/* Pre-hide Marketo form containers that use field shortening. 213 This class is added in initForms() ONLY for IDs in shorteningFormIDs. 214 Enrich-only and normal forms never receive this class. */ 215.marketo-wrapper.needs-hide { 216 opacity: 0; 217 min-height: 50px; 218} 219</style> 220<!-- Custom CSS - END --> 221 222<!-- CHEQ INVOCATION TAG -->
223<script async 224src="https://ob.greencolumnart.com/i/e5d5d180836d70d64ffeb39886549972.js" 225data-ch="cheq4ppc" class="ct_clicktrue_84080" data-jsonp="onCheqResponse"> 226</script>
226 227<!-- END CHEQ INVOCATION TAG --> 228 229<!-- sha256 hashing for GTM - START -->
230<script> 231async function sha256(message) { 232 try { 233 if (!window.TextEncoder || !window.crypto?.subtle) return ''; 234 const msgUint8 = new TextEncoder().encode(message.toLowerCase().trim()); 235 const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8); 236 const hashArray = Array.from(new Uint8Array(hashBuffer)); 237 return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); 238 } catch (e) { 239 return ''; 240 } 241} 242</script>
242 243<!-- sha256 hashing for GTM - END -->
243<script src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586%2F66ba5a08efe71070f98dd10a%2F67b618c4a9d2c46c21c3513b%2Fp3cvwr-1.1.1.js" type="text/javascript"></script>
243</head><body><div class="page-wrapper"><div class="styles"><div class="global-styles w-embed"><style> 244/* Add subtle animated glow to dot elements that appear in eyebrow/labels */ 245@keyframes glow-color { 246 from { background-color: #23a4b5; } 247 to { background-color: #e2ff65; } 248} 249.glowing-dot { 250 animation: glow-color 1.5s ease-in-out infinite alternate; 251 252 253/* Make text look crisper and more legible in all browsers */ 254body { 255 -webkit-font-smoothing: antialiased; 256 -moz-osx-font-smoothing: grayscale; 257 font-smoothing: antialiased; 258 text-rendering: optimizeLegibility; 259} 260 261a { 262 color: inherit; 263} 264/* dropdown highlight active text */ 265.w-dropdown-link.w--current{ 266 color: #1c8391; 267 font-weight: 600; 268} 269 270/* Focus state style for keyboard navigation for the focusable elements */ 271*[tabindex]:focus-visible, 272 input[type="file"]:focus-visible { 273 outline: 0.125rem solid #4d65ff; 274 outline-offset: 0.125rem; 275} 276 277/* Get rid of top margin on first element in any rich text element */ 278.w-richtext > :not(div):first-child, .w-richtext > div:first-child > :first-child { 279 margin-top: 0 !important; 280} 281 282/* Get rid of bottom margin on last element in any rich text element */ 283.w-richtext>:last-child, .w-richtext ol li:last-child, .w-richtext ul li:last-child { 284 margin-bottom: 0 !important; 285} 286 287/* Adds inline flex display */ 288.display-inlineflex { 289 display: inline-flex; 290} 291 292/* These classes are never overwritten */ 293.hide { 294 display: none !important; 295} 296 297@media screen and (max-width: 991px), 298 @media screen and (max-width: 767px), 299 @media screen and (max-width: 479px){ 300 .hide, .hide-tablet{ 301 display: none !important; 302 } 303 } 304 @media screen and (max-width: 767px) 305 .hide-mobile-landscape{ 306 display: none !important; 307 } 308 } 309 @media screen and (max-width: 479px) 310 .hide-mobile{ 311 display: none !important; 312 } 313 } 314 315/* Removes native scrollbar */ 316.no-scrollbar, 317[data-scrollbar="none"] { 318 -ms-overflow-style: none; /* For Internet Explorer and Edge */ 319 overflow: -moz-scrollbars-none; /* For Firefox */ 320} 321 322.no-scrollbar::-webkit-scrollbar, 323[data-scrollbar="none"]::-webkit-scrollbar { 324 display: none; /* For Chrome, Safari, and Opera */ 325} 326 327 328</style></div><div class="project-styles w-embed"><style> 329 330.resource_card:hover .image-cover { 331 transform: scale(1.05); 332} 333 334.filter_wrapper:has(input[type="checkbox"]:checked) .filter_block-bottom { 335 opacity: 1; 336 pointer-events: auto; 337} 338 339 .w-tabs:before, .w-tabs:after { 340 display: none; 341 } 342 343 .table-row:nth-child(even) { 344 background: #f4f2ea; 345 } 346 .table-row:hover { 347 background: #e8edf1; 348 } 349 .table.is-left-aligned .table-row { 350 text-align: left; 351 } 352</style></div><div class="global-styles w-embed"><style> 353.ts-highlight::before { 354 content: ''; 355 position: absolute; 356 left: 0; 357 right: 0; 358 bottom: -2px; 359 top: 5px; 360 background: linear-gradient(90deg, #CFBDFF 30%, #B399F8 100%); 361 z-index: -1; 362 border-radius: 100px; 363} 364.ts-highlight.is-green::before { 365 background: linear-gradient(90deg, #C4EFE4 0%, #B9DCD3 100%); 366} 367.ts-highlight.is-yellow::before { 368 background: linear-gradient(90deg, #E8FF84 0%, #D1F72F 100%); 369} 370</style></div></div><div data-animation="default" class="nav_component w-nav" data-wf--navbar--variant="light" data-easing2="ease" data-easing="ease" data-collapse="medium" data-w-id="95695c20-8c4f-c284-2209-2ed9ebec047a" role="banner" data-no-scroll="1" data-duration="400"><div class="hide w-embed w-script"><style> 371 /* BASE NAVIGATION CONTAINER */ 372 .nav_component { 373 transition: background-color 0.3s ease; 374 background-color: transparent; 375 } 376 /* Light variant - white on scroll */ 377 .nav_component[data-wf--navbar--variant='light'].navbar--scrolled { 378 background-color: white !important; 379 } 380 381 /* Dark variant - #0A4444 on scroll */ 382 .nav_component[data-wf--navbar--variant='dark'].navbar--scrolled { 383 background-color: #0a4444 !important; 384 } 385 386 /* DROPDOWN ARROW (Icon within nav-link) */ 387 .nav-dropdown-arrow { 388 transition: transform 0.18s linear; 389 transform: rotateZ(0deg); 390 } 391 .nav-link:hover .nav-dropdown-arrow,
392 .nav-dropdown:has(.nav-dropdown_list:hover) .nav-dropdown-arrow { 393 transform: rotateZ(-180deg); 394 } 395 .nav-dropdown .nav-link { 396 transition: color 0.3s ease-out; 397 } 398 .nav-dropdown:hover .nav-link { 399 color: white; 400 } 401 .nav-dropdown:hover { 402 background-color: #23a4b5; 403 } 404 /* DROPDOWN LIST (Hidden menu container) */ 405 .nav-dropdown_list { 406 position: absolute; 407 z-index: 9999 !important; 408 opacity: 0; 409 visibility: hidden; 410 pointer-events: none; 411 } 412 .nav-dropdown:hover .nav-dropdown_list { 413 display: block; 414 opacity: 1; 415 visibility: visible; 416 pointer-events: auto; 417 } 418 /* DROPDOWN ITEMS (List items within dropdown) */ 419 .nav-item_text { 420 transition: color 0.3s ease-out; 421 } 422 .nav-item:hover .nav-item_text { 423 color: #886fde; 424 } 425 .nav-item_desc { 426 transition: color 0.3s ease-out; 427 } 428 .nav-item:hover .nav-item_desc { 429 color: #886fde; 430 } 431 /* DROPDOWN FOOTER ITEMS (Alternative item variant) */ 432 .nav-dropdown-footer-item { 433 transition: color 0.3s ease-out; 434 } 435 .nav-dropdown-footer-item:hover .nav-dropdown-footer-item_title { 436 color: #886fde; 437 } 438 .nav-dropdown-footer-item_desc { 439 transition: color 0.3s ease-out; 440 } 441 .nav-dropdown-footer-item:hover .nav-dropdown-footer-item_desc { 442 color: #886fde; 443 } 444</style>
445<script> 446 document.addEventListener('DOMContentLoaded', function () { 447 const navbar = document.querySelector('.nav_component'); 448 if (navbar) { 449 const scrollTrigger = 0.015; 450 let ticking = false; 451 window.addEventListener('scroll', function () { 452 if (!ticking) { 453 window.requestAnimationFrame(function () { 454 const scrollTop = window.scrollY; 455 const docHeight = document.documentElement.scrollHeight - window.innerHeight; 456 const scrollPercent = scrollTop / docHeight; 457 if (scrollPercent > scrollTrigger) { 458 navbar.classList.add('navbar--scrolled'); 459 } else { 460 navbar.classList.remove('navbar--scrolled'); 461 } 462 ticking = false; 463 }); 464 ticking = true; 465 } 466 }); 467 } 468 }); 469</script>
469 470 471</div><div class="nav_container"><a href="/" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0487" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0487" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" class="nav_logo-link w-nav-brand"><div class="nav_logo-image w-embed"><svg width="100%" height="100%" viewBox="0 0 195 46" fill="none" xmlns="http://www.w3.org/2000/svg"> 472<g clip-path="url(#clip0_1074_3915)"> 473<path d="M66.0507 19.0251C66.0507 24.2426 62.5431 28.0448 56.1025 28.0448H51.8605V37.7137C51.8605 38.0781 51.6156 38.321 51.2484 38.321H48.0281C47.6608 38.321 47.416 38.0781 47.416 37.7137V10.6126C47.416 10.2483 47.6608 10.0054 48.0281 10.0054H56.1025C62.5431 10.0054 66.0507 13.8076 66.0507 19.0251ZM61.771 19.0251C61.771 15.2649 59.0403 13.971 55.9424 13.971H51.8652V24.0838H55.9424C59.0403 24.0838 61.771 22.7479 61.771 19.0297V19.0251Z" fill="currentColor"/> 474<path d="M86.0685 19.1043V37.7089C86.0685 38.0732 85.8237 38.3161 85.4565 38.3161H82.6834C82.3162 38.3161 82.1137 38.0732 82.0713 37.7089L81.9066 35.6864C80.4 37.5454 78.1966 38.8393 75.3811 38.8393C69.7549 38.8393 65.6777 34.229 65.6777 28.4463C65.6777 22.6636 69.7549 18.0533 75.3811 18.0533C78.1919 18.0533 80.3953 19.3893 81.9442 21.2903L82.0666 19.1043C82.109 18.74 82.3114 18.4971 82.6787 18.4971H85.4518C85.819 18.4971 86.0638 18.74 86.0638 19.1043H86.0685ZM81.8689 28.4089C81.8689 24.8917 79.3406 21.9396 75.8331 21.9396C72.3256 21.9396 69.7973 24.6908 69.7973 28.4089C69.7973 32.1271 72.3679 34.9624 75.8331 34.9624C79.2983 34.9624 81.8689 31.9683 81.8689 28.4089Z" fill="currentColor"/> 475<path d="M107.798 19.184L97.2802 45.5144C97.1578 45.8367 96.8706 46.0002 96.5458 46.0002H93.4855C93.0383 46.0002 92.8311 45.7573 92.9959 45.3135L95.849 38.3958L88.1842 19.184C88.0194 18.7402 88.2266 18.4973 88.6738 18.4973H91.7718C92.0966 18.4973 92.3838 18.6608 92.5062 18.9831L97.9676 33.3838L103.429 18.9831C103.551 18.6608 103.839 18.4973 104.163 18.4973H107.304C107.751 18.4973 107.958 18.7402 107.793 19.184H107.798Z" fill="currentColor"/> 476<path d="M123.091 33.0192C123.091 36.6206 119.381 38.844 115.793 38.844C112.408 38.844 109.72 37.1858 108.293 35.5276C108.048 35.2426 108.091 34.9624 108.251 34.7195L109.513 33.0613C109.8 32.6969 110.04 32.7763 110.407 33.0613C111.754 34.0749 113.627 35.2053 115.666 35.2053C117.46 35.2053 118.929 34.5186 118.929 32.9398C118.929 29.0582 108.656 30.4315 108.656 23.7987C108.656 20.2814 111.754 18.0533 115.341 18.0533C117.705 18.0533 120.313 19.1043 121.984 21.0475C122.229 21.3324 122.149 21.6126 121.942 21.8976L120.803 23.3923C120.558 23.7146 120.233 23.5932 119.903 23.3503C118.312 22.1358 117.215 21.5286 115.581 21.5286C114.197 21.5286 112.766 22.2152 112.766 23.752C112.766 27.5962 123.081 25.8539 123.081 33.0146L123.091 33.0192Z" fill="currentColor"/> 477<path d="M140.127 32.7767C140.452 32.4917 140.739 32.4917 141.026 32.7767L142.82 34.4769C143.065 34.7198 143.107 35.0421 142.862 35.327C140.988 37.471 138.253 38.8443 135.075 38.8443C129.326 38.8443 124.962 34.2761 124.962 28.4513C124.962 22.6266 129.326 18.0583 135.075 18.0583C138.173 18.0583 140.866 19.4316 142.74 21.5756C142.985 21.8605 142.942 22.1828 142.697 22.4257L140.904 24.126C140.616 24.4109 140.334 24.3689 140.004 24.0839C138.823 23.0703 137.556 21.94 135.113 21.94C131.567 21.94 129.077 24.7285 129.077 28.4513C129.077 32.1741 131.563 34.9207 135.113 34.9207C137.641 34.9207 138.987 33.8697 140.127 32.7767Z" fill="currentColor"/> 478<path d="M165.038 19.1043V37.7089C165.038 38.0732 164.793 38.3161 164.426 38.3161H161.653C161.286 38.3161 161.083 38.0732 161.041 37.7089L160.876 35.6864C159.37 37.5454 157.166 38.8393 154.351 38.8393C148.725 38.8393 144.647 34.229 144.647 28.4463C144.647 22.6636 148.725 18.0533 154.351 18.0533C157.162 18.0533 159.365 19.3893 160.914 21.2903L161.036 19.1043C161.079 18.74 161.281 18.4971 161.648 18.4971H164.421C164.789 18.4971 165.034 18.74 165.034 19.1043H165.038ZM160.839 28.4089C160.839 24.8917 158.31 21.9396 154.803 21.9396C151.295 21.9396 148.767 24.6908 148.767 28.4089C148.767 32.1271 151.338 34.9624 154.803 34.9624C158.268 34.9624 160.839 31.9683 160.839 28.4089Z" fill="currentColor"/> 479<path d="M169.52 8.79089H172.581C172.948 8.79089 173.193 9.03379 173.193 9.39812V37.7137C173.193 38.0781 172.948 38.321 172.581 38.321H169.52C169.153 38.321 168.908 38.0781 168.908 37.7137V9.39812C168.908 9.03379 169.153 8.79089 169.52 8.79089Z" fill="currentColor"/> 480<path d="M195.001 27.8391C195.001 29.3338 194.799 30.0625 193.697 30.0625H179.836C180.368 33.2575 182.732 35.3221 186.362 35.3221C188.4 35.3221 189.869 34.6728 191.211 33.6639C191.536 33.421 191.781 33.3416 192.068 33.6218L193.372 34.8736C193.697 35.1959 193.697 35.4809 193.372 35.8032C191.498 37.7043 188.89 38.8347 185.952 38.8347C179.836 38.8347 175.637 34.2664 175.637 28.4417C175.637 22.6169 179.794 18.0487 185.543 18.0487C191.291 18.0487 195.001 22.6216 195.001 27.8391ZM179.794 27.1151H191.211C190.924 23.8407 188.64 21.6968 185.585 21.6968C182.529 21.6968 180.204 23.8407 179.794 27.1151Z" fill="currentColor"/> 481<path d="M38.1934 16.245C38.1934 17.8842 36.8784 19.1889 35.2261 19.1889C33.5739 19.1889 32.2588 17.8842 32.2588 16.245C32.2588 14.6057 33.5739 13.301 35.2261 13.301C36.8784 13.301 38.1934 14.6517 38.1934 16.245Z" fill="currentColor"/> 482<path d="M38.1934 6.91916C38.1934 8.5584 36.8784 9.8631 35.2261 9.8631C33.5739 9.8631 32.2588 8.5584 32.2588 6.91916C32.2588 5.27992 33.5739 3.97522 35.2261 3.97522C36.8784 3.97522 38.1934 5.32592 38.1934 6.91916Z" fill="currentColor"/> 483<path d="M38.1934 25.6284C38.1934 27.2676 36.8784 28.5723 35.2261 28.5723C33.5739 28.5723 32.2588 27.2676 32.2588 25.6284C32.2588 23.9891 33.5739 22.6844 35.2261 22.6844C36.8784 22.6844 38.1934 23.9891 38.1934 25.6284Z" fill="currentColor"/> 484<path d="M38.1948 35.0078C38.1948 36.6471 36.8798 37.9518 35.2275 37.9518H35.1306C33.5753 37.9016 32.3108 36.6471 32.2602 35.104C32.2096 33.4648 33.5247 32.1141 35.1306 32.0639C36.7828 32.0137 38.1443 33.3184 38.1948 34.9117V35.0078Z" fill="currentColor"/> 485<path d="M29.4239 16.2448C29.4239 17.8841 28.1088 19.1888 26.4566 19.1888C24.8043 19.1888 23.4893 17.8841 23.4893 16.2448C23.4893 14.6056 24.8043 13.3009 26.4566 13.3009C28.0625 13.3009 29.4239 14.6516 29.4239 16.2448Z" fill="currentColor"/> 486<path d="M29.4239 25.6285C29.4239 27.2677 28.1088 28.5725 26.4566 28.5725C24.8043 28.5725 23.4893 27.2677 23.4893 25.6285C23.4893 23.9893 24.8043 22.6846 26.4566 22.6846C28.0625 22.6846 29.4239 23.9893 29.4239 25.6285Z" fill="currentColor"/> 487<path d="M29.4239 35.0081C29.4239 36.6474 28.1088 37.9521 26.4566 37.9521C24.8043 37.9521 23.4893 36.6474 23.4893 35.0081C23.4893 33.3689 24.8043 32.0642 26.4566 32.0642C28.0625 32.0642 29.4239 33.3689 29.4239 35.0081Z" fill="currentColor"/> 488<path d="M20.6544 25.6285C20.6544 27.2677 19.3393 28.5725 17.687 28.5725C16.0348 28.5725 14.7197 27.2677 14.7197 25.
4886285C14.7197 23.9893 16.0348 22.6846 17.687 22.6846C19.3393 22.6846 20.6544 23.9893 20.6544 25.6285Z" fill="currentColor"/> 489<path d="M20.6544 35.0081C20.6544 36.6474 19.3393 37.9521 17.687 37.9521C16.0348 37.9521 14.7197 36.6474 14.7197 35.0081C14.7197 33.3689 16.0348 32.0642 17.687 32.0642C19.3393 32.0642 20.6544 33.3689 20.6544 35.0081Z" fill="currentColor"/> 490<path d="M11.8907 16.2484C11.8907 17.8876 10.5756 19.1923 8.92338 19.1923C7.27112 19.1923 5.95605 17.8876 5.95605 16.2986C5.95605 14.7095 7.27112 13.3546 8.92338 13.3546C10.5756 13.3044 11.8907 14.6593 11.8907 16.2484Z" fill="currentColor"/> 491<path d="M11.8907 25.6284C11.8907 27.2676 10.5756 28.5723 8.92338 28.5723C7.27112 28.5723 5.95605 27.2676 5.95605 25.6284C5.95605 23.9891 7.27112 22.6844 8.92338 22.6844C10.5756 22.6844 11.8907 23.9891 11.8907 25.6284Z" fill="currentColor"/> 492<path d="M11.8907 35.008C11.8907 36.6473 10.5756 37.952 8.92338 37.952C7.27112 37.952 5.95605 36.6473 5.95605 35.008C5.95605 33.3688 7.27112 32.0641 8.92338 32.0641C10.5756 32.0641 11.8907 33.3688 11.8907 35.008Z" fill="currentColor"/> 493</g> 494<defs> 495<clipPath id="clip0_1074_3915"> 496<rect width="100%" height="100%" fill="currentColor"/> 497</clipPath> 498</defs> 499</svg></div></a><div class="w-layout-hflex nav-menu-wrap"><div role="navigation" class="nav_menu w-nav-menu"><div class="nav-dropdown"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec048c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec048c" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/solutions" class="nav-link w-inline-block"><div>Solutions</div><div class="nav-dropdown-arrow w-embed"><svg width=" 100%" height=" 100%" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 500<path fill-rule="evenodd" clip-rule="evenodd" d="M2.55806 6.29544C2.46043 6.19781 2.46043 6.03952 2.55806 5.94189L3.44195 5.058C3.53958 4.96037 3.69787 4.96037 3.7955 5.058L8.00001 9.26251L12.2045 5.058C12.3021 4.96037 12.4604 4.96037 12.5581 5.058L13.4419 5.94189C13.5396 6.03952 13.5396 6.19781 13.4419 6.29544L8.17678 11.5606C8.07915 11.6582 7.92086 11.6582 7.82323 11.5606L2.55806 6.29544Z" fill="currentColor"/> 501</svg></div></a><div class="nav-dropdown_list"><div class="nav-dropdown_list-container"><div class="w-layout-hflex nav-dropdown_list-wrapper"><div class="w-layout-vflex nav-dropdown_list-items"><div class="text-size-medium text-weight-semibold">By Product</div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0496:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0496%22%7D%5D" href="/products/software/ascent" aria-current="page" class="nav-item w-inline-block w--current"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/694aa7c46d89792d3908b192_payfactors-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Ascent</div><div class="nav-item_desc">The modern solution for fast, defensible pay decisions.</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec049b:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec049b%22%7D%5D" href="/products/software/jobnav-recruiter" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a9eea33c33e0c438ee43c81_jobnav
501-recruiter-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">JobNav Recruiter</div><div class="nav-item_desc">Attract top talent with fast, compliant job postings.</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0498:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0498%22%7D%5D" href="/products/software/paycycle" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/694e96c7888933f40ea906fb_paycycle-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Paycycle</div><div class="nav-item_desc">Streamline merit cycles and plan confident pay raises.</div></div></a></div><div class="w-layout-vflex nav-dropdown_list-items"><div class="text-size-medium text-weight-semibold">By Use Case</div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:801c6a9e-c3b1-1db7-f1d1-8c2cdfc1a1e5:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%22801c6a9e-c3b1-1db7-f1d1-8c2cdfc1a1e5%22%7D%5D" href="/solutions/benchmarking" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a45e3d1aabf160e4d343368_benchmarking%20icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Benchmarking</div><div class="nav-item_desc">Defensible pay benchmarks powered by AI-guided data.</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:801c6a9e-c3b1-1db7-f1d1-8c2cdfc1a1e7:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%22801c6a9e-c3b1-1db7-f1d1-8c2cdfc1a1e7%22%7D%5D" href="/solutions/job-management" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a9eea580ac64f5fb06cb232_job-management-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Job Management</div><div class="nav-item_desc">Build job architecture that connects to benchmarking and planning.</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:801c6a9e-c3b1-1db7-f1d1-8c2cdfc1a1ea:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%22801c6a9e-c3b1-1db7-f1d1-8c2cdfc1a1ea%22%7D%5D" href="/solutions/compensation-planning" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/694e96d5f58bff9322d3300d_marketpay-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Compensation Planning</div><div class="nav-item_desc">End-to-end compensation planning and pay raise management.</div></div></a></div><div class="w-layout-vflex nav-dropdown_list-items"><div class="text-size-medium text-weight-semibold">By Role</div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04a1:234ca
501a01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec04a1%22%7D%5D" href="/solutions/hr-professionals" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a45e508871e5c2f09e1ba09_hr-pros-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">HR Professionals</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04a3:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec04a3%22%7D%5D" href="/solutions/compensation-professionals" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a45e5072a6ec6a0ef5d6f44_comp-pros-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Compensation Pros</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04a5:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec04a5%22%7D%5D" href="/solutions/talent-acquisition" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a9ffe7e84bc4957936401f8_personalcard-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Talent Acquisition</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04a7:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec04a7%22%7D%5D" href="/solutions/executive-leadership" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a3d9142d4e902b376197f0f_people-together-08.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Executive Leadership</div></div></a></div></div><div class="w-layout-hflex nav-dropdown_footer"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04b2" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04b2" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/solutions" class="nav-dropdown-footer-item w-inline-block"><div class="nav-dropdown-footer-item_title">Solutions Overview</div><div class="nav-dropdown-footer-item_desc">Flexible services and support for Payscale customers.</div></a><div class="nav-dropdown-footer_divider"></div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04ac" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04ac" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/marketplace" class="nav-dropdown-footer-item w-inline-block"><div class="nav-dropdown-footer-item_title">Partner Marketplace</div><div class="nav-dropdown-footer-item_desc">Extend your compensation journey with our trusted partners.</div></a><div class="nav-dropdown-footer_divider"></div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04b8" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04b8" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/products/pricing" class="nav-dropdown-footer-item w-inline-block"><div class="nav-dropdown-footer-item_title">Pricing & Plans</div><div class="nav-dropdown-footer-item_desc">Find a plan that is right for you.</div></a></div></div></div></div><a href="/products/data" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04bd" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04bd" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" class="nav-link w-nav-link">Data</a><a href="/products/pricing" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04bf" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04bf" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" class="nav-link w-nav-link">Pricing</a><div class="nav-dropdown"><div class="nav-link"><div>Resources</div><div class="nav-dropdown-arrow w-embed">
501<svg width=" 100%" height=" 100%" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 502<path fill-rule="evenodd" clip-rule="evenodd" d="M2.55806 6.29544C2.46043 6.19781 2.46043 6.03952 2.55806 5.94189L3.44195 5.058C3.53958 4.96037 3.69787 4.96037 3.7955 5.058L8.00001 9.26251L12.2045 5.058C12.3021 4.96037 12.4604 4.96037 12.5581 5.058L13.4419 5.94189C13.5396 6.03952 13.5396 6.19781 13.4419 6.29544L8.17678 11.5606C8.07915 11.6582 7.92086 11.6582 7.82323 11.5606L2.55806 6.29544Z" fill="currentColor"/> 503</svg></div></div><div class="nav-dropdown_list"><div class="nav-dropdown_list-container resources"><div class="w-layout-hflex nav-menu_resources"><div class="w-layout-vflex nav-menu_resources_column1"><div class="w-layout-vflex nav-menu_resources-learn"><div class="nav-label">Learn</div><div class="w-layout-hflex nav-menu_company_items"><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04cf:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec04cf%22%7D%5D" href="/research-and-insights-type/research-reports" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6951bb09a17ff86e7d098636_research-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Research Reports</div><div class="nav-item_desc">Free research reports, ebooks, quick guides, whitepapers, and more.</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04d2:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec04d2%22%7D%5D" href="/events" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/69651d78dae0376b0dbcca23_live-event-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Events & Webinars</div><div class="nav-item_desc">Watch live and on-demand webinars on a variety of topics that matter to you.</div></div></a></div><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04d6:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec04d6%22%7D%5D" href="/compensation-trends" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/69651d56609d6580e4375b0d_blog-icon-2.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Blog</div><div class="nav-item_desc">Stories and insights on todayâs compensation landscape.</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04d9:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c
503752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec04d9%22%7D%5D" href="/why-payscale/customer-stories" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6951bb09d99fc9052495a7e2_stories-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Customer Stories</div><div class="nav-item_desc">Learn how our customers use Payscale data to get pay right.</div></div></a></div></div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04dc" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04dc" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/research-and-insights" class="nav-see-more w-inline-block"><div>Visit the resource center â</div></a></div><div class="w-layout-vflex nav-menu_resources-topics"><div class="nav-label">Browse By Topic</div><div class="w-layout-hflex nav-menu-resources-topics-wrapper"><div class="nav-resources-item"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6966b36df794567d1baccf3f_Presentation-Chart.svg" alt=""/><div class="w-layout-vflex nav-resources-topics-list"><div class="nav-item-title">Strategy & Planning</div><div class="w-layout-hflex nav-resources-topics-item"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04e9" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04e9" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/compensation-strategy">Comp Strategy â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04eb" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04eb" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/compensation-planning">Comp Planning â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04ed" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04ed" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/total-rewards">Total Rewards â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04ef" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04ef" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/job-management">Job Management â</a></div></div></div><div class="nav-resources-item"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/69cc249ce3679eb1a2697b7d_Brain%20icon.svg" alt=""/><div class="w-layout-vflex nav-resources-topics-list"><div class="nav-item-title">Data & Technology</div><div class="w-layout-hflex nav-resources-topics-item"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04f7" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04f7" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/salary-data">Salary Data â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04f9" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04f9" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/benchmarking">Benchmarking â</a><a href="/topics/artificial-intelligence" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04fb" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04fb" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D">Artificial Intelligence â</a><a href="/topics/compensation-software" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec04fd" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec04fd" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D">Comp Software â</a></div></div></div><div class="nav-resources-item"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/69cc0a7513caf22330a2a67c_Globe-01.svg" alt=""/><div class="w-layout-vflex nav-resources-topics-list"><div class="nav-item-title">Workforce & Compliance</div><div class="w-layout-hflex nav-resources-topics-item"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0505" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0505" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/labor-market">Labor Market â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0507" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0507" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/pay-equity">Pay Equity â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0509" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0509" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/pay-transparency">Pay Transparency â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec050b" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec050b" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/compliance-risk">Compliance & Risk â</a></div></div></div></div></div></div><div class="w-layout-vflex nav-menu_resources_column2"><div class="nav-label">Featured Research</div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0510" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0510" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/featured-content/salary-budget-survey-sbs" class="nav-resources_featured-link w-inline-block"><div class="nav-resources_featured-image">
503<img sizes="(max-width: 991px) 100vw, 736px" srcset="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a70fc3903dd252aea9ecb06_collection-card-sbs-q2-2026-p-500.png 500w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a70fc3903dd252aea9ecb06_collection-card-sbs-q2-2026.png 736w" alt="Salary Budget Survey 2026-2027 by Payscale" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a70fc3903dd252aea9ecb06_collection-card-sbs-q2-2026.png" loading="lazy" class="image-contain is-widescreen"/></div><div class="w-layout-vflex nav-resources_featured-textwrap"><div class="nav-resources_featured-title">Payscaleâs 11th Annual Salary Budget Survey</div><div class="nav-read-more">Read more</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec051a" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec051a" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/featured-content/flight-risk-report" class="nav-resources_featured-link w-inline-block"><div class="nav-resources_featured-image"><img sizes="(max-width: 991px) 100vw, 736px" srcset="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a29b1adfc130bc08a66827d_collection-card-flight-risk-report-p-500.png 500w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a29b1adfc130bc08a66827d_collection-card-flight-risk-report.png 736w" alt="Flight Risk Report" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a29b1adfc130bc08a66827d_collection-card-flight-risk-report.png" loading="lazy" class="image-contain is-widescreen"/></div><div class="w-layout-vflex nav-resources_featured-textwrap"><div class="nav-resources_featured-title">Flight Risk Report</div><div class="nav-read-more">Read more</div></div></a></div></div></div></div></div><div class="nav-dropdown"><div class="nav-link"><div>Company</div><div class="nav-dropdown-arrow w-embed"><svg width=" 100%" height=" 100%" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 504<path fill-rule="evenodd" clip-rule="evenodd" d="M2.55806 6.29544C2.46043 6.19781 2.46043 6.03952 2.55806 5.94189L3.44195 5.058C3.53958 4.96037 3.69787 4.96037 3.7955 5.058L8.00001 9.26251L12.2045 5.058C12.3021 4.96037 12.4604 4.96037 12.5581 5.058L13.4419 5.94189C13.5396 6.03952 13.5396 6.19781 13.4419 6.29544L8.17678 11.5606C8.07915 11.6582 7.92086 11.6582 7.82323 11.5606L2.55806 6.29544Z" fill="currentColor"/> 505</svg></div></div><div class="nav-dropdown_list"><div class="nav-dropdown_list-container company"><div class="w-layout-hflex nav-menu_company"><div class="w-layout-hflex nav-menu_company_items"><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec052e:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec052e%22%7D%5D" href="/why-payscale" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6a58f4ae02d41a02bacc_why-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Why Payscale</div><div class="nav-item_desc">Learn why we are the industry leader in compensation intelligence.</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0531:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c
505752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0531%22%7D%5D" href="/press-releases" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6ac0abc8bdd913ea66b4_press-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Press Releases</div><div class="nav-item_desc">Explore the latest news and product announcements from Payscale.</div></div></a></div><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0535:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0535%22%7D%5D" href="/why-payscale/executive-leadership" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6acb893fba490f48ae66_leadership-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Payscale Leadership</div><div class="nav-item_desc">Meet the Industry pioneers redefining how the world thinks about pay.</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0538:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0538%22%7D%5D" href="/in-the-news" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6ad613513b178943529e_newsroom-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Newsroom</div><div class="nav-item_desc">Payscale in the spotlightâwhere trusted data meets industry influence.</div></div></a></div><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec053c:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec053c%22%7D%5D" href="/careers" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6aea350d675ae638cbd0_careers-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Careers</div><div class="nav-item_desc">Discover the power of Payscalers working together to get pay right.</div></div></a></div></div></div></div></div></div></div><div class="nav_menu-icon w-nav-button"><div class="newnav-icon-lottie"><div class="newnwav-menu-icon-line-top"></div><div class="newnwav-menu-icon-line-mid"><div class="newnwav-menu-icon-line-mid-inner"></div></div><div class="newnwav-menu-icon-line-bot"></div></div></div><div id="w-node-_95695c20-8c4f-c284-2209-2ed9ebec0545-ebec047a" class="nav_button-wrapper"><a data-nav-item="login" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0546" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0546" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/products/customer-login" class="nav_link_login w-inline-block"><div>Login</div></a><a data-wf--nav-cta-button--variant="base" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0549:a66a8b9d-c64d-2497-79e6-1722f003b8f7" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="a66a8b9d-c64d-2497-79e6-1722f003b8f7" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22a66a8b9d-c64d-2497-79e6-1722f003b8f7%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0549%22%7D%5D" href="/demo-request/contact-sales" data-wf-event-ids="157077594-157067696" class="btn is-secondary-clear is-small w-inline-block"><div>Contact Sales</div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec054b" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec054b" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/demo-request/get-a-demo" data-wf-event-ids="157077594-157067695" class="btn is-small experiment-control w-inline-block"><div data-w-id="95695c20-8c4f-c284-2209-2ed9ebec054c">Get a Demo</div></a></div></div><div class="w-layout-hflex nav-menu-wrap-mobile"><nav role="navigation" class="nav_menu mobile w-nav-menu"><div data-delay="0" data-hover="false" class="nav-dropdown-mobile w-dropdown"><div data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0554" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0554" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" class="nav-dropdown-toggle-mobile w-dropdown-toggle"><div>Solutions</div><div class="nav-dropdown-arrow w-embed">
505<svg width=" 100%" height=" 100%" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 506<path fill-rule="evenodd" clip-rule="evenodd" d="M2.55806 6.29544C2.46043 6.19781 2.46043 6.03952 2.55806 5.94189L3.44195 5.058C3.53958 4.96037 3.69787 4.96037 3.7955 5.058L8.00001 9.26251L12.2045 5.058C12.3021 4.96037 12.4604 4.96037 12.5581 5.058L13.4419 5.94189C13.5396 6.03952 13.5396 6.19781 13.4419 6.29544L8.17678 11.5606C8.07915 11.6582 7.92086 11.6582 7.82323 11.5606L2.55806 6.29544Z" fill="currentColor"/> 507</svg></div></div><nav class="nav-dropdown_list-mobile w-dropdown-list"><div class="nav-dropdown_list-container"><div class="w-layout-hflex nav-dropdown_list-wrapper"><div class="w-layout-vflex nav-dropdown_list-items"><div class="text-size-medium text-weight-semibold">By Product</div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec055e:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec055e%22%7D%5D" href="/products/software/ascent" aria-current="page" class="nav-item w-inline-block w--current"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/694aa7c46d89792d3908b192_payfactors-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Ascent</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec055f:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec055f%22%7D%5D" href="/products/software/jobnav-recruiter" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a9eea33c33e0c438ee43c81_jobnav-recruiter-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">JobNav Recruiter</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0561:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0561%22%7D%5D" href="/products/software/paycycle" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/694e96c7888933f40ea906fb_paycycle-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Paycycle</div></div></a></div><div class="w-layout-vflex nav-dropdown_list-items"><div class="text-size-medium text-weight-semibold">By Use Case</div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:ff1dba9b-86eb-fdfa-af8e-3ef221d09245:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%22ff1dba9b-86eb-fdfa-af8e-3ef221d09245%22%7D%5D" href="/solutions/benchmarking" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a45e3d1aabf160e4d343368_benchmarking%20icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Benchmarking</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:ff1dba9b-86eb-fdfa-af8e-3ef221d09248:234caa01-8866-f222-c
507752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%22ff1dba9b-86eb-fdfa-af8e-3ef221d09248%22%7D%5D" href="/solutions/job-management" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a9eea580ac64f5fb06cb232_job-management-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Job Management</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:ff1dba9b-86eb-fdfa-af8e-3ef221d09246:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%22ff1dba9b-86eb-fdfa-af8e-3ef221d09246%22%7D%5D" href="/solutions/compensation-planning" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/694e96d5f58bff9322d3300d_marketpay-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Compensation Planning</div></div></a></div><div class="w-layout-vflex nav-dropdown_list-items"><div class="text-size-medium text-weight-semibold">By Role</div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0566:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0566%22%7D%5D" href="/solutions/hr-professionals" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a45e508871e5c2f09e1ba09_hr-pros-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">HR Professionals</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0568:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0568%22%7D%5D" href="/solutions/compensation-professionals" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a45e5072a6ec6a0ef5d6f44_comp-pros-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Compensation Pros</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec056a:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec056a%22%7D%5D" href="/solutions/talent-acquisition" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a9ffe7e84bc4957936401f8_personalcard-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Talent Acquisition</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec056c:234ca
507a01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec056c%22%7D%5D" href="/solutions/executive-leadership" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a3d9142d4e902b376197f0f_people-together-08.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Executive Leadership</div></div></a></div></div><div class="nav-dropdown_footer"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec056f" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec056f" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/marketplace" class="nav-dropdown-footer-item w-inline-block"><div class="nav-dropdown-footer-item_title">Partner Marketplace</div><div class="nav-dropdown-footer-item_desc">Extend your compensation journey with our trusted partners.</div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0574" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0574" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/solutions" class="nav-dropdown-footer-item w-inline-block"><div class="nav-dropdown-footer-item_title">Solutions Overview</div><div class="nav-dropdown-footer-item_desc">One system. Faster compensation decisions.</div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0579" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0579" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/products/pricing" class="nav-dropdown-footer-item w-inline-block"><div class="nav-dropdown-footer-item_title">Pricing & Plans</div><div class="nav-dropdown-footer-item_desc">Find a plan that is right for you.</div></a></div></div></nav></div><a href="/products/data" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec057e" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec057e" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" class="nav-link w-nav-link">Data</a><a href="/products/pricing" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0580" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0580" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" class="nav-link w-nav-link">Pricing</a><div data-delay="0" data-hover="false" class="nav-dropdown-mobile w-dropdown"><div data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0583" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec0583" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" class="nav-dropdown-toggle-mobile w-dropdown-toggle"><div>Resources</div><div class="nav-dropdown-arrow w-embed">
507<svg width=" 100%" height=" 100%" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 508<path fill-rule="evenodd" clip-rule="evenodd" d="M2.55806 6.29544C2.46043 6.19781 2.46043 6.03952 2.55806 5.94189L3.44195 5.058C3.53958 4.96037 3.69787 4.96037 3.7955 5.058L8.00001 9.26251L12.2045 5.058C12.3021 4.96037 12.4604 4.96037 12.5581 5.058L13.4419 5.94189C13.5396 6.03952 13.5396 6.19781 13.4419 6.29544L8.17678 11.5606C8.07915 11.6582 7.92086 11.6582 7.82323 11.5606L2.55806 6.29544Z" fill="currentColor"/> 509</svg></div></div><nav class="nav-dropdown_list-mobile w-dropdown-list"><div class="nav-dropdown_list-container resources"><div class="w-layout-hflex nav-menu_resources"><div class="w-layout-vflex nav-menu_resources-learn"><div class="w-layout-hflex nav-menu_company_items"><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec058f:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec058f%22%7D%5D" href="/research-and-insights-type/research-reports" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6951bb09a17ff86e7d098636_research-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Research Reports</div><div class="nav-item_desc">Free research reports, ebooks, quick guides, whitepapers, and more</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0592:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0592%22%7D%5D" href="/events" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/69651d78dae0376b0dbcca23_live-event-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Webinars</div><div class="nav-item_desc">Watch live and on-demand webinars on a variety of topics that matter to you</div></div></a></div><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0596:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0596%22%7D%5D" href="/compensation-trends" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/69651d56609d6580e4375b0d_blog-icon-2.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Blog</div><div class="nav-item_desc">Stories and insights on todayâs compensation landscape</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec0599:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c
509752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec0599%22%7D%5D" href="/why-payscale/customer-stories" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6951bb09d99fc9052495a7e2_stories-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Customer Stories</div><div class="nav-item_desc">Learn how our customers use Payscale data to get pay right</div></div></a></div></div><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec059c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec059c" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/research-and-insights" class="nav-see-more w-inline-block"><div>Visit the resource center â</div></a></div><div class="w-layout-vflex nav-menu_resources-topics"><div class="text-size-medium text-weight-semibold">Browse By Topic</div><div class="w-layout-hflex nav-menu-resources-topics-wrapper"><div class="nav-resources-item"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6966b36df794567d1baccf3f_Presentation-Chart.svg" alt=""/><div class="w-layout-vflex nav-resources-topics-list"><div class="nav-item-title">Strategy & Planning</div><div class="w-layout-hflex nav-resources-topics-item"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05a9" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05a9" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/compensation-strategy">Comp Strategy â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05ab" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05ab" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/compensation-planning">Comp Planning â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05ad" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05ad" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/total-rewards">Total Rewards â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05af" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05af" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/job-management">Job Management â</a></div></div></div><div class="nav-resources-item"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/69cc249ce3679eb1a2697b7d_Brain%20icon.svg" alt=""/><div class="w-layout-vflex nav-resources-topics-list"><div class="nav-item-title">Data & Technology</div><div class="w-layout-hflex nav-resources-topics-item"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05b7" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05b7" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/salary-data">Salary Data â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05b9" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05b9" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/benchmarking">Benchmarking â</a><a href="/topics/artificial-intelligence" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05bb" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05bb" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D">Artificial Intelligence â</a><a href="/topics/compensation-software" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05bd" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05bd" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D">Comp Software â</a></div></div></div><div class="nav-resources-item"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/69cc0a7513caf22330a2a67c_Globe-01.svg" alt=""/><div class="w-layout-vflex nav-resources-topics-list"><div class="nav-item-title">Workforce & Compliance</div><div class="w-layout-hflex nav-resources-topics-item"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05c5" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05c5" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/labor-market">Labor Market â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05c7" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05c7" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/pay-equity">Pay Equity â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05c9" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05c9" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/pay-transparency">Pay Transparency â</a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05cb" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05cb" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/topics/compliance-risk">Compliance & Risk â</a></div></div></div></div></div></div></div></nav></div><div data-delay="0" data-hover="false" class="nav-dropdown-mobile w-dropdown"><div data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05ce" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05ce" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" class="nav-dropdown-toggle-mobile w-dropdown-toggle"><div>Company</div><div class="nav-dropdown-arrow w-embed">
509<svg width=" 100%" height=" 100%" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"> 510<path fill-rule="evenodd" clip-rule="evenodd" d="M2.55806 6.29544C2.46043 6.19781 2.46043 6.03952 2.55806 5.94189L3.44195 5.058C3.53958 4.96037 3.69787 4.96037 3.7955 5.058L8.00001 9.26251L12.2045 5.058C12.3021 4.96037 12.4604 4.96037 12.5581 5.058L13.4419 5.94189C13.5396 6.03952 13.5396 6.19781 13.4419 6.29544L8.17678 11.5606C8.07915 11.6582 7.92086 11.6582 7.82323 11.5606L2.55806 6.29544Z" fill="currentColor"/> 511</svg></div></div><nav class="nav-dropdown_list-mobile w-dropdown-list"><div class="nav-dropdown_list-container company"><div class="w-layout-hflex nav-menu_company"><div class="w-layout-hflex nav-menu_company_items"><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05d7:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec05d7%22%7D%5D" href="/why-payscale" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6a58f4ae02d41a02bacc_why-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Why Payscale</div><div class="nav-item_desc">Learn why we are the industry leader in compensation intelligence</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05da:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec05da%22%7D%5D" href="/press-releases" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6ac0abc8bdd913ea66b4_press-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Press Releases</div><div class="nav-item_desc">Explore the latest news and product announcements from Payscale</div></div></a></div><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05de:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec05de%22%7D%5D" href="/why-payscale/executive-leadership" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6acb893fba490f48ae66_leadership-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Payscale Leadership</div><div class="nav-item_desc">Meet the Industry pioneers redefining how the world thinks about pay</div></div></a><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05e1:234caa01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec05e1%22%7D%5D" href="/in-the-news" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6ad613513b178943529e_newsroom-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Newsroom</div><div class="nav-item_desc">Payscale in the spotlightâwhere trusted data meets industry influence</div></div></a></div><div class="nav-item-row"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05e5:234ca
511a01-8866-f222-c752-3e1578eeafca" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="234caa01-8866-f222-c752-3e1578eeafca" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%2C%7B%22componentId%22%3A%22234caa01-8866-f222-c752-3e1578eeafca%22%2C%22instanceId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec05e5%22%7D%5D" href="/careers" class="nav-item w-inline-block"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/695e6aea350d675ae638cbd0_careers-icon.svg" alt=""/><div class="w-layout-vflex nav-item-textwrap"><div class="nav-item_text">Careers</div><div class="nav-item_desc">Discover the power of Payscalers working together to get pay right</div></div></a></div></div></div></div></nav></div><div class="w-layout-vflex nav-dropdown_cta"><div class="w-layout-hflex nav-button-group"><a data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05ea" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05ea" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/demo-request/contact-sales?tk_ctg=hdr-nav&tk_cta=ctc-sls" data-wf-event-ids="157068052" class="nav-button-white w-inline-block"><div>Contact Sales</div></a><a data-w-id="95695c20-8c4f-c284-2209-2ed9ebec05ed" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05ed" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05ed" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/demo-request/get-a-demo?tk_ctg=hdr-nav&tk_cta=dmo" data-wf-event-ids="157068051" class="nav-button-primary w-inline-block"><div>Get a Demo</div></a></div><a data-nav-item="login" data-wf-native-id-path="b364214d-a85d-bcea-c849-6a7d6dd40623:95695c20-8c4f-c284-2209-2ed9ebec05f3" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="95695c20-8c4f-c284-2209-2ed9ebec05f3" data-wf-component-context="%5B%7B%22componentId%22%3A%2295695c20-8c4f-c284-2209-2ed9ebec047a%22%2C%22instanceId%22%3A%22b364214d-a85d-bcea-c849-6a7d6dd40623%22%7D%5D" href="/products/customer-login" class="nav_link_login w-inline-block"><div>Login</div></a></div></nav><div data-close-menu="true" class="nav-menu-icon w-nav-button"><div data-w-id="95695c20-8c4f-c284-2209-2ed9ebec05f7" data-is-ix2-target="1" class="nav-lottie" data-animation-type="lottie" data-src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6984f64478510ec8a9894a2d_mobile-nav-3.json" data-loop="0" data-direction="1" data-autoplay="0" data-renderer="svg" data-default-duration="0" data-duration="2.0208333333333335" data-loading="eager"></div></div></div></div></div><main class="main-wrapper"><div id="button-popup" fs-modal-element="modal-1" role="dialog" aria-modal="true" aria-labelledby="button-popup-heading" class="btn-popup w-node-f4f2fad8-2e71-f1b7-cfe7-61249cf2861d-9cf2861d"><div aria-hidden="true" fs-modal-element="close-1" class="btn-popup-cover"></div><div class="btn-popup-content"><div class="w-layout-vflex btn-popup-info"><div id="button-popup-heading" class="btn-popup-title">See Payscale in action</div><p class="btn-popup-description">Discover how Payscaleâs exceptional data quality, scalable compensation technology, and services can help you know the what and why behind pay.</p></div><div class="btn-popup-form"><div id="5900" class="marketo-component"><div class="marketo-styles w-embed"><style> 512.marketo-wrapper { 513 width: 100%; 514} 515 .mktoForm input, .mktoForm select { 516 border: 1px solid #a9b3bc; 517 border-radius: .5rem; 518 width: 100% !important; 519 height: 38px; 520 padding-left: 1rem !important; 521 color: #0A4444; 522 margin-bottom: 1rem; 523 } 524 .mktoForm { 525 width: 100% !important; 526 max-width: 480px !important; 527 font-family: var(--text-font) !important; 528 font-weight: 400 !important; 529 color: #0A4444 !important; 530 } 531 532 .mktoFormRow { 533 width: 100%; 534 margin: 0 !important; 535 display: flex; 536 gap: 1.5rem; 537 } 538 539 .mktoFieldDescriptor.mktoFormCol { 540 width: auto; 541 margin: 0 0 .3rem 0 !important; 542 flex-grow: 1; 543 } 544 545 .mktoFormCol { 546 width: 100%; 547 } 548 549 .mktoHtmlText.mktoHasWidth { 550 width: 94% !important; 551 margin-top: 20px; 552 } 553 554 .mktoFieldWrap { 555 width: 100%; 556 } 557 558 .mktoOffset { 559 display: none; 560 } 561 562 .mktoButton { 563 font-family: var(--text-font); 564 line-height: 1.5; 565 display: flex; 566 justify-content: flex-start;
567 align-items: center; 568 grid-column-gap: 1rem; 569 grid-row-gap: 1rem; 570 background-color: #1C8391 !important; 571 background-image: none !important; 572 border: 1px solid #0A4444 !important; 573 color: #ffffff !important; 574 text-align: center; 575 border-radius: 6px; 576 padding: .5rem 1.5rem !important; 577 font-size: .875rem !important; 578 font-weight: 600 !important; 579 text-decoration: none; 580 transition: background-color .3s; 581 } 582 .mktoButton:hover { 583 background-color: #816bc4 !important; 584 } 585 .mktoLabel { 586 width: auto !important; 587 font-weight: 400 !important; 588 line-height: 1.5 !important; 589 color: #0A4444; 590 margin-bottom: .25rem !important; 591 float: none !important; 592 } 593 .mktoAsterix, .mktoGutter { 594 display: none !important; 595 } 596 .mktoForm input[type="radio"], .mktoForm input[type="checkbox"] { 597 width: auto !important; 598 height: 1.25rem; 599 } 600 .mktoForm textarea { 601 width: 100% !important; 602 resize: auto !important; 603 } 604 .mktoRadioList > label, .mktoCheckboxList > label { 605 font-size: 1rem !important; 606 line-height: 1.25rem !important; 607 max-width:400px; 608 609 } 610 611 612.mktoHtmlText *, 613.mktoCaptchaDisclaimer { 614 color: #0A4444 !important; 615} 616 617 .marketo-wrapper[theme="white"] .mktoHtmlText, 618 .marketo-wrapper[theme="white"] .mktoHtmlText span, 619 .marketo-wrapper[theme="white"] a, 620 .marketo-wrapper[theme="white"] label, 621 .marketo-wrapper[theme="white"] .mktoTemplateBox, 622 .marketo-wrapper[theme="white"] .mktoNotYou, 623 .marketo-wrapper[theme="white"] .mktoCaptchaDisclaimer, 624 .mktoErrorMsg, 625 .mktoErrorDetail 626 { 627 color: white !important; 628 } 629 630 631 .marketo-wrapper[id="5900"] .marketo-prompt { 632 display:block; 633 } 634 635 636@media only screen and (max-width: 767px) { 637 .mktoForm input[type=text], .mktoForm input[type=date], 638 .mktoForm input[type=tel], .mktoForm input[type=email], 639 .mktoForm input[type=number] { 640 font-size: 12px !important; 641 } 642 643 644} 645 646 @media screen and (max-width: 600px) { 647 .mktoFormRow { 648 flex-direction: column; 649 gap: .5rem; 650 651 } 652 653 } 654 .mktoFieldWrap textarea { 655 padding: 12px 16px !important; 656 } 657 .mktoNotYou { 658 color: #0A4444 !important; 659 } 660 .mktoForm a { 661 text-decoration: underline !important; 662 padding: 0 !important; 663 } 664 @media only screen and (max-width: 480px) { 665 .mktoForm{ 666 padding: 0 !important; 667 } 668 669 .mktoFormRow .mktoField { 670 height: 2.5rem !important; 671 padding: .5rem !important; 672 673 } 674 } 675 .mktoErrorMsg, .mktoErrorArrow { 676 background-color: #23A4B5 !important; 677 border: none !important; 678 box-shadow: none !important; 679 background-image: none !important; 680 text-shadow: none !important; 681} 682</style></div><div id="6385" theme="" class="marketo-wrapper"><div class="marketo-prompt">The ID is set to default '5900', don't forget to update it if needed.</div></div></div></div><div aria-expanded="false" fs-modal-element="close-1" role="button" tabindex="0" aria-label="Close modal" aria-controls="button-popup" aria-roledescription="close-modal-trigger" class="btn-popup-close"><div class="btn-popup-close-icon w-embed"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 24 24"> 683<path fill="CurrentColor" d="M14.5,12l9-9c0.7-0.7,0.7-1.8,0-2.5c-0.7-0.7-1.8-0.7-2.5,0l-9,9l-9-9c-0.7-0.7-1.8-0.7-2.5,0 c-0.7,0.7-0.7,1.8,0,2.5l9,9l-9,9c-0.7,0.7-0.7,1.8,0,2.5c0.7,0.7,1.8,0.7,2.5,0l9-9l9,9c0.7,0.7,1.8,0.7,2.5,0 c0.7-0.7,0.7-1.8,0-2.5L14.5,12z"/> 684</svg></div></div></div></div><section class="section is-hero bg-gradient"><div class="padding-global"><div class="container-global"><div class="hero-wrapper"><div id="w-node-bd064773-6bee-1327-c014-23d5b5a66ebe-dbce5a0a" class="w-layout-hflex hero-columns"><div class="hero-column-info"><div data-wf--eyebrow-pill--variant="primary" class="eyebrow-pill w-variant-230ceb93-1cca-7081-4f2b-17ab8288db90"><div>⦠PAYSCALE ASCENt</div></div><h1 class="heading-2"><span>Compensation decisions that </span><span class="ts-highlight">move</span><span> at the speed of business</span></h1><div class="hero-g2"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/67ae031f69d1af657e362676_hero-reviews.svg" alt=""/><div>600+ 5 Star Reviews</div></div><p class="text-size-large">One connected system for pricing, planning, and execution â powered by continuously refreshed HRIS-sourced data, AI guidance, and workflows that keep your teams aligned.<br/></p><div aria-roledescription="open-modal-trigger" class="btn" data-wf--cta-button---popup--variant="primary" role="button" aria-controls="button-popup" ariahaspopup="dialog" fs-modal-element="open-1" aria-expanded="false" tabindex="0"><div class="text-block-36">Get a Demo</div></div></div><div class="hero-column-image is-align-center-vertical"><div class="w-embed w-script"><style> 685/* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 686 PAYSCALE SMART PRICE â Define · Benchmark · Align · Publish 687 Frameless, self-contained embed. Everything scoped under .spr so it 688 can't collide with the page. Layout is tuned once at a fixed native 689 size, then scaled uniformly to the column (see responsive wrapper).
690 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 691 692.spr, .spr *, .spr *::before, .spr *::after { box-sizing: border-box; margin: 0; padding: 0; } 693 694.spr { 695 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 696 â â± MOTION CONTROL â 697 â --speed scales the WHOLE animation in proportion. The script â 698 â at the bottom reads this one value. â 699 â 0 = no animation (static â shows Scene 1 fully formed) â 700 â 1 = baseline (current speed) â 701 â 2 = 200% speed · 0.5 = half speed · etc. â 702 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 703 --speed: 1; 704 --dur-scale: 1; /* derived from --speed by the script â don't edit directly */ 705 706 /* Dev play/pause button: 1 = show · 0 = hide */ 707 --show-toggle: 0; 708 /* Readiness gauge (Scene 1 flourish): 1 = show · 0 = hide */ 709 --show-gauge: 1; 710 711 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 712 â ð¨ COLOR CONTROLS â change every color from right here â 713 â Edit a swatch and every element using it updates. â 714 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 715 716 /* â Brand swatches (Payscale palette) â */ 717 --c-green: #E2FF65; /* Electric Green (brand) â key accent, used sparingly */ 718 --c-teal: #23A4B5; /* Light Teal (brand) â supporting UI, chart ramps */ 719 --c-techteal: #0A4444; /* Tech Teal (brand) â primary dark surface, headings */ 720 --c-midnight: #041E1E; /* Midnight (brand) â darkest, default body text */ 721 --c-purple: #B399F8; /* Electric Purple (brand) â secondary accent */ 722 --c-aqua: #B9DCD3; /* Aqua Blue (brand) â soft fills, "done" state */ 723 --c-offwhite: #F4F2EA; /* Off-white (brand) â text on dark surfaces */ 724 725 /* â Custom shades / accents (NOT official brand swatches) â */ 726 --c-green-dk: #B8E228; /* deeper lime â dark end of green gradients */ 727 --c-teal-soft: #4FD4C4; /* bright cyan-teal â ribbon-sweep midpoint */ 728 --c-teal-dk: #073333; /* deeper teal â dark end of bar / pill gradients */ 729 --c-aqua-dk: #76C0B3; /* deeper aqua â dark end of the aqua stat card */ 730 --c-purple-dk: #8058E0; /* deeper purple â dark end of purple gradients */ 731 --c-muted: #5C7575; /* muted gray-teal â captions, sub-labels */ 732 --c-line: rgba(10,68,68,.12); /* hairline rules / inactive tracks */ 733 734 /* â Semantic alert (non-brand; used ONLY for the above-range warning) â */ 735 --c-alert: #E07B3A; /* amber â risk/attention flag */ 736 --c-alert-bg: #FBEADC; /* soft amber tint â alert pill background */ 737 738 /* â Element gradients (built from the swatches above) â */ 739 --grad-ribbon-active: linear-gradient(90deg, var(--c-green), var(--c-teal-soft), var(--c-green)); /* active ribbon pill sweep */ 740 --grad-stripe-gt: linear-gradient(90deg, var(--c-green), var(--c-teal), var(--c-green)); /* greenâteal card top-stripe */ 741 --grad-stripe-pt: linear-gradient(90deg, var(--c-purple), var(--c-teal), var(--c-purple)); /* purpleâteal card top-stripe (AI match) */ 742 --grad-dark: linear-gradient(140deg, var(--c-techteal), var(--c-teal-dk) 60%, var(--c-midnight)); /* dark payoff surfaces */ 743 --grad-score: linear-gradient(135deg, var(--c-teal-dk), var(--c-teal)); /* match-score pill */ 744 --grad-range: linear-gradient(90deg, var(--c-purple), var(--c-teal), var(--c-teal-dk)); /* percentile bar */ 745 --grad-card-lime: linear-gradient(145deg, var(--c-green), var(--c-green-dk)); /* Scene 4 stat card 1 */ 746 --grad-card-aqua: linear-gradient(145deg, var(--c-aqua), var(--c-aqua-dk)); /* Scene 4 stat card 2 */ 747 --grad-card-purple: linear-gradient(145deg, var(--c-purple), var(--c-purple-dk));/* Scene 4 stat card 3 */ 748 749 /* â Gauge ring (Scene 1) â feeds the SVG <linearGradient> in the markup â */ 750 --gauge-from: var(--c-green); 751 --gauge-to: var(--c-teal); 752 753 /* â Card chrome (subtle, derived from Tech Teal) â */ 754 --card-bg: #FFFFFF; 755 --card-border: rgba(10,68,68,.14); 756 --card-shadow: 0 2px 9px rgba(4,30,30,.07); 757 758 font-family: 'Inter', system-ui, sans-serif; 759 -webkit-font-smoothing: antialiased; 760 line-height: normal; 761 display: inline-block; 762} 763 764/* ââ Responsive wrapper ââââââââââââââââââââââââââââââââââââââââââââââ 765 Drop the embed inside any flex column; it scales uniformly to fit that 766 column's width, so the pixel-tuned layout is preserved at EVERY breakpoint 767 (desktop 50/50, tablet/mobile stacked). Native size lives here as 768 --spr-w / --spr-h; the stage reads them, the wrapper reserves the matching 769 height via aspect-ratio, and the script sets --spr-scale from the column's 770 real width. Caps at native size so it never upscales (stays crisp). 771 To make it larger on wide screens, raise the max-width. */ 772.spr-fit { 773 --spr-w: 560; /* native width (px, unitless) */ 774 --spr-h: 430; /* native height (px, unitless) â sized to the tallest scene (Align) */ 775 position: relative; 776 width: 100%; 777 max-width: calc(var(--spr-w) * 1px); 778 aspect-ratio: var(--spr-w) / var(--spr-h); 779 margin: 0 auto; /* center within a wider column */ 780 align-self: flex-start;/* don't vertically stretch if it's itself a flex item */ 781} 782.spr-fit .spr { 783 position: absolute; top: 0; left: 0; 784 transform-origin: top left; 785 transform: scale(var(--spr-scale, 1)); 786} 787 788/* Frameless stage â transparent. Native size comes from --spr-w / --spr-h. */ 789.spr .stage { position: relative; width: calc(var(--spr-w, 560) * 1px); height: calc(var(--spr-h, 500) * 1px); } 790 791/* ââ keyframes (all prefixed spr-) ââ */ 792@keyframes spr-sweep { 0%{background-position:0% 50%} 50%{background-position:100% 50%} 100%{background-position:0% 50%} } 793@keyframes spr-fadeUp { from{opacity:0;transform:translateY(13px)} to{opacity:1;transform:translateY(0)} } 794@keyframes spr-fade { from{opacity:0}
794 to{opacity:1} } 795@keyframes spr-pop { from{opacity:0;transform:scale(.55)} to{opacity:1;transform:scale(1)} } 796@keyframes spr-countUp { from{opacity:0;transform:translateY(12px) scale(.82)} to{opacity:1;transform:translateY(0) scale(1)} } 797@keyframes spr-barGrow { from{transform:scaleX(0)} to{transform:scaleX(1)} } 798@keyframes spr-draw { to{stroke-dashoffset:0} } 799@keyframes spr-gauge { to{stroke-dashoffset:32.8} } /* 182 circumference â 82% filled */ 800@keyframes spr-pulse { 0%,100%{transform:scale(1);opacity:1} 50%{transform:scale(1.14);opacity:.82} } 801@keyframes spr-sparkle { 0%,100%{transform:scale(.9);opacity:1} 50%{transform:scale(1.18);opacity:.7} } 802@keyframes spr-borderLit { 0%{border-color:var(--card-border)} 45%{border-color:var(--c-teal)} 100%{border-color:rgba(35,164,181,.45)} } 803 804/* ââ workflow ribbon (4 steps) ââ */ 805.spr .ribbon { position: absolute; top: 16px; left: 16px; right: 16px; display: flex; align-items: center; gap: 4px; z-index: 20; } 806.spr .ribbon .step { 807 flex: 1; height: 31px; border-radius: 999px; 808 border: 1px solid rgba(10,68,68,.22); /* inactive pill border */ 809 background: rgba(10,68,68,.04); /* inactive pill fill */ 810 display: flex; align-items: center; padding: 0 10px; 811 font-size: 11.5px; font-weight: 600; color: var(--c-muted); 812 position: relative; z-index: 0; /* stacking context for the gradient overlay */ 813 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out, border-color calc(.6s * var(--dur-scale,1)) ease-in-out; 814 white-space: nowrap; overflow: hidden; 815} 816/* gradient overlay â crossfades in/out behind the label + number (color: --grad-ribbon-active) */ 817.spr .ribbon .step::before { 818 content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; 819 background: var(--grad-ribbon-active); background-size: 200% 100%; 820 opacity: 0; pointer-events: none; 821 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out; /* fade-OUT â starts immediately */ 822} 823.spr .ribbon .step .num { 824 width: 16px; height: 16px; border-radius: 50%; 825 background: rgba(10,68,68,.1); color: var(--c-muted); 826 font-size: 10px; font-weight: 700; 827 display: flex; align-items: center; justify-content: center; 828 margin-right: 7px; flex-shrink: 0; 829 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out, color calc(.6s * var(--dur-scale,1)) ease-in-out; 830} 831.spr .ribbon .connector { width: 5px; height: 1px; background: rgba(10,68,68,.18); flex-shrink: 0; } 832/* active step â gradient fades IN delayed ~85% of the fade-out, so outgoing/incoming pills overlap ~15% */ 833.spr .ribbon .step.active { 834 border-color: transparent; color: var(--c-midnight); 835 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), 836 border-color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 837} 838.spr .ribbon .step.active::before { 839 opacity: 1; 840 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); /* fade-IN â delayed */ 841 animation: spr-sweep calc(3.2s * var(--dur-scale,1)) ease-in-out infinite; 842} 843.spr .ribbon .step.active .num { 844 background: rgba(4,30,30,.22); color: var(--c-midnight); 845 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 846} 847/* done step */ 848.spr .ribbon .step.done { background: rgba(10,68,68,.04); border-color: rgba(10,68,68,.15); color: rgba(10,68,68,.4); } 849.spr .ribbon .step.done .num { background: rgba(10,68,68,.08); color: rgba(10,68,68,.45); } 850.spr .ribbon .step.done::after { content: "\2713"; font-size: 10px; font-weight: 700; color: rgba(10,68,68,.4); margin-left: auto; } 851 852/* ââ scenes ââ */ 853.spr .scene { 854 position: absolute; top: 60px; left: 16px; right: 16px; bottom: 16px; 855 display: flex; flex-direction: column; 856 opacity: 0; pointer-events: none; transition: opacity calc(.5s * var(--dur-scale,1)) ease; 857} 858.spr .scene.active { opacity: 1; } 859 860/* shared scene heading â 4px left pad to sit just inside the card edges below */ 861.spr .sc-label { font-family: 'Zodiak', Georgia, serif; font-size: 21px; font-weight: 600; letter-spacing: -.01em; color: var(--c-techteal); padding-left: 4px; } 862.spr .sc-sub { font-size: 12.5px; color: var(--c-muted); line-height: 1.4; margin-top: 4px; margin-bottom: 14px; max-width: 94%; padding-left: 4px; } 863 864/* âââââââââ SCENE 1 â DEFINE (two-column: job list + stat/gauge rail) âââââââââ */ 865.spr .s1-row { display: flex; gap: 13px; align-items: stretch; } 866.spr .s1-jobs { flex: 1.18; display: flex; flex-direction: column; gap: 8px; } 867.spr .s1-job { 868 display: flex; align-items: center; gap: 10px; 869 background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 10px; 870 box-shadow: 0 1px 5px rgba(4,30,30,.05); padding: 9px 12px; opacity: 0; 871} 872.spr .scene.active .s1-job:nth-child(1) { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.30s * var(--dur-scale,1)) both, spr-borderLit calc(.55s * var(--dur-scale,1)) ease calc(1.45s * var(--dur-scale,1)) forwards; } 873.spr .scene.active .s1-job:nth-child(2) { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.50s * var(--dur-scale,1)) both, spr-borderLit calc(.55s * var(--dur-scale,1)) ease calc(1.80s * var(--dur-scale,1)) forwards; } 874.spr .scene.active .s1-job:nth-child(3) { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.70s * var(--dur-scale,1)) both, spr-borderLit calc(.55s * var(--dur-scale,1)) ease calc(2.15s * var(--dur-scale,1)) forwards; } 875.spr .scene.active .s1-job:nth-child(4) { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.90s * var(--dur-scale,1)) both, spr-borderLit calc(.55s * var(--dur-scale,1)) ease calc(2.50s * var(--dur-scale,1)) forwards; } 876.spr .s1-checkbox { 877 width: 17px; height: 17px; border: 1.5px solid var(--c-techteal); border-radius: 4px; 878 background: var(--c-techteal); flex-shrink: 0; position: relative; 879} 880.spr .s1-checkbox svg { position: absolute; top: 1.5px; left: 1.5px; } 881.spr .s1-checkbox .cpath { stroke: #fff; stroke-width: 2; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 18; stroke-dashoffset: 18; } 882.spr .scene.active .s1-job:nth-child(1) .cpath { animation: spr-draw calc(.35s * var(--dur-scale,1)) ease calc(.60s * var(--dur-scale,1)) forwards; } 883.spr .scene.active .s1-job:nth-child(2) .cpath { animation: spr-draw calc(.35s * var(--dur-scale,1)) ease calc(.80s * var(--dur-scale,1)) forwards; } 884.spr .scene.active .s1-job:nth-child(3) .cpath { animation: spr-draw calc(.35s * var(--dur-scale,1)) ease calc(1.00s * var(--dur-scale,1)) forwards; } 885.spr .scene.active .s1-job:nth-child(4) .cpath { animation: spr-draw calc(.35s * var(--dur-scale,1)) ease calc(1.20s * var(--dur-scale,1)) forwards; } 886.spr .s1-job-title { font-size: 12.5px; font-weight: 600; color: var(--c-midnight); } 887.spr .s1-job-meta { font-size: 9.5px; color: var(--c-muted); margin-top: 2px; } 888.spr .s1-job-meta b { color: var(--c-techteal); font-weight: 600; } 889 890/* right rail */ 891.spr .s1-rail { flex: 1; display: flex; flex-direction: column; gap: 9px; } 892.spr .s1-stat { 893 background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 10px; 894 box-shadow: var(--card-shadow); padding: 14px 16px; opacity: 0; 895 position: relative; overflow: hidden; 896} 897.spr .s1-stat::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--grad-stripe-gt); background-size: 250% 100%; animation: spr-sweep calc(5s * var(--dur-scale,1)) linear infinite; } 898.spr .scene.active .s1-stat { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.30s * var(--dur-scale,1)) both; } 899.spr .s1-stat .lbl { font-size: 8.5px; font-weight: 600; letter-spacing: .16em; color: var(--c-muted); text-transform: uppercase; } 900.spr .s1-stat .val { font-family: 'Zodiak', Georgia, serif; font-size: 33px; font-weight: 700; color: var(--c-techteal); line-height: 1; letter-spacing: -.02em; margin-top: 4px; } 901.spr .s1-stat .val.sm { font-size: 23px; } 902.spr .s1-stat .sub { font-size: 9.5px; color: var(--c-muted); margin-top: 4px; line-height: 1.3; } 903.spr .s1-stat .divider { height: 1px; background: var(--c-line); margin: 11px 0; } 904 905.spr .s1-gauge { 906 flex: 1; display: flex; align-items: center; gap: 12px; 907 background: var(--grad-dark); border-radius: 10px; padding: 12px 15px; opacity: 0; 908 box-shadow: 0 4px 16px rgba(4,30,30,.18); 909} 910.spr .scene.active .s1-gauge { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.2s * var(--dur-scale,1)) both; } 911.spr .s1-gauge svg { flex-shrink: 0; display: block; } 912.spr .s1-gauge .ring-bg { stroke: rgba(255,255,255,.15); } 913.spr .s1-gauge .ring { stroke: url(#spr-gauge-grad); stroke-dasharray: 182; stroke-dashoffset: 182; } 914.spr .scene.active .s1-gauge .ring { animation: spr-gauge calc(1.2s * var(--dur-scale,1)) ease calc(1.6s * var(--dur-scale,1)) forwards; } 915.spr .s1-gauge .gnum { font-family: 'Zodiak', Georgia, serif; fill: var(--c-offwhite); } 916.spr .s1-gauge .glbl { font-size: 8.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: rgba(255,255,255,.6); } 917.spr .s1-gauge .gsub { font-size: 11px; font-weight: 600; color: var(--c-offwhite); margin-top: 3px; line-height: 1.25; } 918 919/* âââââââââ SCENE 2 â BENCHMARK âââââââââ */ 920.spr .s2-card { background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 10px; box-shadow: var(--card-shadow); position: relative; overflow: hidden; } 921.spr .s2-job { padding: 13px 16px; opacity: 0; } 922.spr .scene.active .s2-job { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.20s * var(--dur-scale,1)) both; } 923.spr .s2-cap { font-size: 8.5px; font-weight: 600; letter-spacing: .16em; color: var(--c-muted); text-transform: uppercase; } 924.spr .s2-job .title { font-size: 14px; font-weight: 600; color: var(--c-midnight); margin-top: 3px; } 925.spr .s2-tags { display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap; } 926.spr .s2-tag { font-size: 9.5px; font-weight: 600; padding: 3px 9px; border-radius: 999px; background: rgba(10,68,68,.06); color: var(--c-techteal); } 927.spr .s2-tag.alt { background: var(--c-aqua); } 928 929.spr .s2-arrow { 930 display: flex; align-items: center; gap: 10px; margin: 9px 0; 931 font-size: 10px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; 932 color: var(--c-teal); opacity: 0; 933} 934.spr .s2-arrow::before, .spr .s2-arrow::after { content: ""; flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--c-line), transparent); } 935.spr .scene.active .s2-arrow { animation: spr-fade calc(.4s * var(--dur-scale,1)) ease calc(.80s * var(--dur-scale,1)) both; } 936 937.spr .s2-result { display: flex; align-items: center; gap: 12px; padding: 13px 16px; opacity: 0; } 938.spr .s2-result::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--grad-stripe-pt); background-size: 250% 100%; animation: spr-sweep calc(4s * var(--dur-scale,1)) linear infinite; } 939.spr .scene.active .s2-result { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.00s * var(--dur-scale,1)) both; } 940.spr .s2-result .sparkle { color: var(--c-purple); font-size: 17px; flex-shrink: 0; } 941.spr .scene.active .s2-result .sparkle { animation: spr-sparkle calc(2s * var(--dur-scale,1)) ease-in-out infinite calc(1.4s * var(--dur-scale,1)); } 942.spr .s2-result .title { font-size: 13px; font-weight: 600; color: var(--c-midnight); } 943.spr .s2-result .src { font-size: 9.5px; color: var(--c-muted); margin-top: 2px; } 944.spr .s2-result .score { margin-left: auto; background: var(--grad-score); color: #fff; padding: 5px 13px; border-radius: 999px; font-size: 13px; font-weight: 700; opacity: 0; box-shadow: 0 2px 12px rgba(35,164,181,.4); flex-shrink: 0; } 945.spr .scene.active .s2-result .score { animation: spr-pop calc(.5s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(1.42s * var(--dur-scale,1)) both; } 946 947.spr .s2-range { padding: 14px 16px 15px; margin-top: 9px; opacity: 0; } 948.spr .scene.active .s2-range { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.85s * var(--dur-scale,1)) both; } 949.spr .s2-range .rlbl { font-size: 8.5px; font-weight: 600; letter-spacing: .14em; color: var(--c-muted); text-transform: uppercase; margin-bottom: 11px; } 950.spr .s2-range .pcts { display: flex; justify-content: space-between; font-size: 8.5px; font-weight: 600; color: var(--c-muted); margin-bottom: 6px; } 951.spr .s2-barwrap { position: relative; height: 12px; } 952.spr .s2-bar { height: 8px; border-radius: 4px; background: var(--grad-range); background-size: 200% 100%; transform: scaleX(0); transform-origin: left; } 953.spr .scene.active .s2-bar { animation: spr-barGrow calc(.9s * var(--dur-scale,1)) ease calc(2.25s * var(--dur-scale,1)) both, spr-sweep calc(4s * var(--dur-scale,1)) ease calc(2.25s * var(--dur-scale,1)) infinite; } 954.spr .s2-marker { position: absolute; left: 50%; top: -2.5px; width: 13px; height: 13px; margin-left: -6.5px; background: #fff; border: 2px solid var(--c-techteal); border-radius: 50%; opacity: 0; box-shadow: 0 1px 4px rgba(4,30,30,.25); } 955.spr .scene.active .s2-marker { animation: spr-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(3.0s * var(--dur-scale,1)) both; } 956.spr .s2-dollars { display: flex; justify-content: space-between; margin-top: 10px; font-size: 11px; font-weight: 700; color: var(--c-techteal); } 957.spr .s2-dollars span { opacity: 0; } 958.spr .s2-dollars span:nth-child(2) { color: var(--c-midnight); } 959.spr .scene.active .s2-dollars span:nth-child(1) { animation: spr-fade calc(.4s * var(--dur-scale,1)) ease calc(3.15s * var(--dur-scale,1)) both; } 960.spr .scene.active .s2-dollars span:nth-child(2) { animation: spr-fade calc(.4s * var(--dur-scale,1)) ease calc(3.30s * var(--dur-scale,1)) both; } 961.spr .scene.active .s2-dollars span:nth-child(3) { animation: spr-fade calc(.4s * var(--dur-scale,1)) ease calc(3.45s * var(--dur-scale,1)) both; } 962 963/* âââââââââ SCENE 3 â ALIGN âââââââââ */ 964.spr .s3-warn { background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 10px; box-shadow: var(--card-shadow); padding: 15px 17px; opacity: 0; } 965.spr .scene.active .s3-warn { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.20s * var(--dur-scale,1)) both; } 966.spr .s3-whead { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; } 967.spr .s3-tri { width: 19px; height: 19px; flex-shrink: 0; background: var(--c-alert); clip-path: polygon(50% 4%, 4% 96%, 96% 96%); position: relative; } 968.spr .s3-tri::after { content: "!"; position: absolute; left: 50%; top: 56%; transform: translate(-50%,-50%); color: #fff; font-weight: 800; font-size: 9px; } 969.spr .scene.active .s3-tri { animation: spr-pulse calc(1.6s * var(--dur-scale,1)) ease-in-out infinite calc(1.2s * var(--dur-scale,1)); } 970.spr .s3-wtitle { font-size: 13.5px; font-weight: 600; color: var(--c-midnight); } 971.spr .s3-index { margin-left: auto; background: var(--c-alert-bg); border: 1px solid var(--c-alert); color: var(--c-alert); padding: 3px 10px; border-radius: 999px; font-size: 10px; font-weight: 700; opacity: 0; } 972.spr .scene.active .s3-index { animation: spr-pop calc(.5s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(.70s * var(--dur-scale,1)) both; } 973.spr .s3-wmeta { font-size: 9.5px; color: var(--c-muted); line-height: 1.35; margin-bottom: 9px; } 974.spr .s3-rows { margin-top: 2px; } 975.spr .s3-row { display: flex; align-items: center; justify-content: space-between; padding: 7px 0; border-bottom: 1px solid rgba(10,68,68,.07); font-size: 11.5px; opacity: 0; } 976.spr .s3-row:last-child { border-bottom: none; } 977.spr .scene.active .s3-rows .s3-row:nth-child(1) { animation: spr-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(1.00s * var(--dur-scale,1)) both; } 978.spr .scene.active .s3-rows .s3-row:nth-child(2) { animation: spr-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(1.18s * var(--dur-scale,1)) both; } 979.spr .scene.active .s3-rows .s3-row:nth-child(3) { animation: spr-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(1.36s * var(--dur-scale,1)) both; } 980.spr .scene.active .s3-rows .s3-row:nth-child(4) { animation: spr-fadeUp calc(.4s *
980 var(--dur-scale,1)) ease calc(1.54s * var(--dur-scale,1)) both; } 981.spr .s3-name { color: var(--c-midnight); font-weight: 500; flex: 1; } 982.spr .s3-sal { font-weight: 700; color: var(--c-midnight); margin-right: 12px; } 983.spr .s3-flag { color: var(--c-alert); font-weight: 700; font-size: 8.5px; letter-spacing: .04em; background: var(--c-alert-bg); padding: 3px 8px; border-radius: 999px; flex-shrink: 0; } 984 985.spr .s3-insight { background: var(--grad-dark); border-radius: 10px; padding: 14px 17px; margin-top: 12px; opacity: 0; box-shadow: 0 4px 16px rgba(4,30,30,.18); position: relative; overflow: hidden; } 986.spr .s3-insight::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--grad-stripe-gt); background-size: 250% 100%; animation: spr-sweep calc(5.5s * var(--dur-scale,1)) linear infinite; } 987.spr .scene.active .s3-insight { animation: spr-fadeUp calc(.55s * var(--dur-scale,1)) ease calc(2.1s * var(--dur-scale,1)) both; } 988.spr .s3-insight .lbl { font-size: 8.5px; font-weight: 600; letter-spacing: .18em; text-transform: uppercase; color: var(--c-aqua); margin-bottom: 5px; } 989.spr .s3-insight .body { font-size: 12.5px; font-weight: 500; line-height: 1.45; color: var(--c-offwhite); } 990.spr .s3-insight .body b { color: var(--c-green); font-weight: 700; } 991 992/* âââââââââ SCENE 4 â PUBLISH âââââââââ */ 993.spr .s4-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; margin-bottom: 11px; } 994.spr .s4-stat { border-radius: 11px; padding: 14px 15px; opacity: 0; position: relative; overflow: hidden; } 995.spr .s4-stat::after { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 42%; background: linear-gradient(to bottom, rgba(255,255,255,.22), transparent); pointer-events: none; } 996.spr .s4-stat.c1 { background: var(--grad-card-lime); } 997.spr .s4-stat.c2 { background: var(--grad-card-aqua); } 998.spr .s4-stat.c3 { background: var(--grad-card-purple); } 999.spr .scene.active .s4-stat.c1 { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.20s * var(--dur-scale,1)) both; } 1000.spr .scene.active .s4-stat.c2 { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.38s * var(--dur-scale,1)) both; } 1001.spr .scene.active .s4-stat.c3 { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.56s * var(--dur-scale,1)) both; } 1002.spr .s4-stat .lbl { font-size: 8.5px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; margin-bottom: 9px; } 1003.spr .s4-stat .val { font-family: 'Zodiak', Georgia, serif; font-size: 27px; font-weight: 700; line-height: 1; letter-spacing: -.02em; opacity: 0; } 1004.spr .scene.active .s4-stat.c1 .val { animation: spr-countUp calc(.6s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(.80s * var(--dur-scale,1)) both; } 1005.spr .scene.active .s4-stat.c2 .val { animation: spr-countUp calc(.6s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(.98s * var(--dur-scale,1)) both; } 1006.spr .scene.active .s4-stat.c3 .val { animation: spr-countUp calc(.6s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(1.16s * var(--dur-scale,1)) both; } 1007.spr .s4-stat .sub { font-size: 8.5px; margin-top: 6px; line-height: 1.35; opacity: .72; } 1008/* text contrast: lime + aqua â midnight ; purple â offwhite */ 1009.spr .s4-stat.c1 .lbl, .spr .s4-stat.c1 .val, .spr .s4-stat.c1 .sub, 1010.spr .s4-stat.c2 .lbl, .spr .s4-stat.c2 .val, .spr .s4-stat.c2 .sub { color: var(--c-midnight); } 1011.spr .s4-stat.c3 .lbl, .spr .s4-stat.c3 .val, .spr .s4-stat.c3 .sub { color: var(--c-offwhite); } 1012 1013.spr .s4-hero { flex: 1; border-radius: 11px; padding: 18px 19px; opacity: 0; background: var(--grad-dark); position: relative; overflow: hidden; box-shadow: 0 6px 18px rgba(4,30,30,.2); display: flex; flex-direction: column; justify-content: center; } 1014.spr .s4-hero::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px; background: var(--grad-stripe-gt); background-size: 250% 100%; animation: spr-sweep calc(5s * var(--dur-scale,1)) linear infinite; } 1015.spr .scene.active .s4-hero { animation: spr-fadeUp calc(.6s * var(--dur-scale,1)) ease calc(1.5s * var(--dur-scale,1)) both; } 1016.spr .s4-hcap { font-size: 8.5px; font-weight: 600; letter-spacing: .18em; text-transform: uppercase; color: var(--c-aqua); margin-bottom: 6px; } 1017.spr .s4-htitle { font-family: 'Zodiak', Georgia, serif; font-size: 18px; font-weight: 600; letter-spacing: -.01em; color: var(--c-offwhite); margin-bottom: 16px; opacity: 0; } 1018.spr .scene.active .s4-htitle { animation: spr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.7s * var(--dur-scale,1)) both; } 1019.spr .s4-pillars { display: flex; gap: 16px; } 1020.spr .s4-pillar { display: flex; align-items: flex-start; gap: 9px; flex: 1; opacity: 0; } 1021.spr .scene.active .s4-pillar:nth-child(1) { animation: spr-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(1.9s * var(--dur-scale,1)) both; } 1022.spr .scene.active .s4-pillar:nth-child(2) { animation: spr-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(2.05s * var(--dur-scale,1)) both; } 1023.spr .scene.active .s4-pillar:nth-child(3) { animation: spr-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(2.2s * var(--dur-scale,1)) both; } 1024.spr .s4-pillar .dot { width: 7px; height: 7px; border-radius: 50%; margin-top: 4px; flex-shrink: 0; } 1025.spr .s4-pillar .dot.lime { background: var(--c-green); box-shadow: 0 0 8px rgba(226,255,101,.75); } 1026.spr .s4-pillar .dot.teal { background: var(--c-teal); box-shadow: 0 0 8px rgba(35,164,181,.75); } 1027.spr .s4-pillar .dot.purple { background: var(--c-purple); box-shadow: 0 0 8px rgba(179,153,248,.75); } 1028.spr .s4-pillar .ttl { font-size: 11.5px; font-weight: 600; color: var(--c-offwhite); line-height: 1.2; } 1029.spr .s4-pillar .psub { font-size: 9.5px; color: var(--c-aqua); margin-top: 2px; line-height: 1.3; } 1030 1031/* âââââââââââ play / pause toggle (dev convenience â delete this block + the 1032 <button> + the JS listener to remove it entirely for production) âââââââââââ */ 1033.spr .spr-toggle { 1034 position: absolute; bottom: 8px; right: 8px; z-index: 40; 1035 width: 24px; height: 24px; border-radius: 50%; padding: 0; 1036 border: 1px solid rgba(10,68,68,.2); background: rgba(255,255,255,.7); 1037 display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: .5; 1038 transition: opacity .2s ease, background .2s ease; 1039} 1040.spr .spr-toggle:hover { opacity: 1; background: #fff; } 1041.spr .spr-toggle svg { width: 11px; height: 11px; display: block; fill: var(--c-techteal); }
1042.spr .spr-toggle .ic-play { display: none; } 1043.spr .spr-toggle.paused .ic-pause { display: none; } 1044.spr .spr-toggle.paused .ic-play { display: block; } 1045/* when paused, freeze every animation in the embed so you get a still frame */ 1046.spr .stage.is-paused *, .spr .stage.is-paused *::before, .spr .stage.is-paused *::after { animation-play-state: paused !important; } 1047</style> 1048 1049<!-- ââââââââââââââââ 1050 â MARKUP â 1051 ââââââââââââââââ --> 1052<div class="spr-fit"> 1053<div class="spr"> 1054<div class="stage" id="spr-stage"> 1055 1056 <!-- Phase ribbon (4 steps) --> 1057 <div class="ribbon"> 1058 <div class="step" data-step="0"><span class="num">1</span>Define</div> 1059 <div class="connector"></div> 1060 <div class="step" data-step="1"><span class="num">2</span>Benchmark</div> 1061 <div class="connector"></div> 1062 <div class="step" data-step="2"><span class="num">3</span>Align</div> 1063 <div class="connector"></div> 1064 <div class="step" data-step="3"><span class="num">4</span>Publish</div> 1065 </div> 1066 1067 <!-- ââ SCENE 1: DEFINE ââ --> 1068 <div class="scene" id="spr-scene-0"> 1069 <div class="sc-label">Choose the jobs to price</div> 1070 <div class="sc-sub">Select roles and Smart Price preps them for benchmarking — no setup required.</div> 1071 1072 <div class="s1-row"> 1073 <div class="s1-jobs"> 1074 <div class="s1-job"> 1075 <div class="s1-checkbox"><svg width="14" height="14" viewBox="0 0 14 14"><polyline class="cpath" points="2,7 6,11 12,3"/></svg></div> 1076 <div><div class="s1-job-title">Account Manager</div><div class="s1-job-meta"><b>10600-CNS</b> · Sales · USA — National</div></div> 1077 </div> 1078 <div class="s1-job"> 1079 <div class="s1-checkbox"><svg width="14" height="14" viewBox="0 0 14 14"><polyline class="cpath" points="2,7 6,11 12,3"/></svg></div> 1080 <div><div class="s1-job-title">Accountant I</div><div class="s1-job-meta"><b>10007-CNS</b> · Accounting · USA — National</div></div> 1081 </div> 1082 <div class="s1-job"> 1083 <div class="s1-checkbox"><svg width="14" height="14" viewBox="0 0 14 14"><polyline class="cpath" points="2,7 6,11 12,3"/></svg></div> 1084 <div><div class="s1-job-title">Sales Analyst I</div><div class="s1-job-meta"><b>JC10546</b> · Sales · USA — National</div></div> 1085 </div> 1086 <div class="s1-job"> 1087 <div class="s1-checkbox"><svg width="14" height="14" viewBox="0 0 14 14"><polyline class="cpath" points="2,7 6,11 12,3"/></svg></div> 1088 <div><div class="s1-job-title">Director, Finance</div><div class="s1-job-meta"><b>10031-CNS</b> · Finance · USA — National</div></div> 1089 </div> 1090 </div> 1091 1092 <div class="s1-rail"> 1093 <div class="s1-stat"> 1094 <div class="lbl">JOBS SELECTED</div> 1095 <div class="val">26</div> 1096 <div class="sub">of 328 jobs · 114 employees</div> 1097 <div class="divider"></div> 1098 <div class="lbl">ANNUAL SPEND</div> 1099 <div class="val sm">$8.7M</div> 1100 <div class="sub">Avg. salary $76K</div> 1101 </div> 1102 1103 <div class="s1-gauge"> 1104 <svg width="52" height="52" viewBox="0 0 68 68"> 1105 <defs> 1106 <linearGradient id="spr-gauge-grad" x1="0%" y1="0%" x2="100%" y2="100%"> 1107 <stop offset="0%" stop-color="var(--gauge-from)"/> 1108 <stop offset="100%" stop-color="var(--gauge-to)"/> 1109 </linearGradient> 1110 </defs> 1111 <circle class="ring-bg" cx="34" cy="34" r="29" fill="none" stroke-width="6"/> 1112 <circle class="ring" cx="34" cy="34" r="29" fill="none" stroke-width="6" stroke-linecap="round" transform="rotate(-90 34 34)"/> 1113 <text class="gnum" x="34" y="41" text-anchor="middle" font-size="20" font-weight="700">82</text> 1114 </svg> 1115 <div> 1116 <div class="glbl">Readiness score</div> 1117 <div class="gsub">Ready to benchmark</div> 1118 </div> 1119 </div> 1120 </div> 1121 </div> 1122 </div> 1123 1124 <!-- ââ SCENE 2: BENCHMARK ââ --> 1125 <div class="scene" id="spr-scene-1"> 1126 <div class="sc-label">AI matches every job to market</div> 1127 <div class="sc-sub">One click maps your title to verified market data — with a confidence score.</div> 1128 1129 <div class="s2-card s2-job"> 1130 <div class="s2-cap">MY COMPANY JOB</div> 1131 <div class="title">Account Manager</div> 1132 <div class="s2-tags">
1133 <span class="s2-tag">10600-CNS</span> 1134 <span class="s2-tag alt">Sales</span> 1135 <span class="s2-tag alt">USA — National</span> 1136 </div> 1137 </div> 1138 1139 <div class="s2-arrow">↓ AI Match</div> 1140 1141 <div class="s2-card s2-result"> 1142 <span class="sparkle">✦</span> 1143 <div> 1144 <div class="title">Account Executive II</div> 1145 <div class="src">Payscale Verse · USA — National</div> 1146 </div> 1147 <span class="score">91</span> 1148 </div> 1149 1150 <div class="s2-card s2-range"> 1151 <div class="rlbl">MARKET DATA · 25TH–75TH PERCENTILE</div> 1152 <div class="pcts"><span>10TH</span><span>25TH</span><span>50TH</span><span>75TH</span><span>90TH</span></div> 1153 <div class="s2-barwrap"> 1154 <div class="s2-bar"></div> 1155 <div class="s2-marker"></div> 1156 </div> 1157 <div class="s2-dollars"><span>$72,459</span><span>$92,742</span><span>$119,474</span></div> 1158 </div> 1159 </div> 1160 1161 <!-- ââ SCENE 3: ALIGN ââ --> 1162 <div class="scene" id="spr-scene-2"> 1163 <div class="sc-label">Catch risk before you publish</div> 1164 <div class="sc-sub">Smart Price surfaces above-range pay and compression so you can act early.</div> 1165 1166 <div class="s3-warn"> 1167 <div class="s3-whead"> 1168 <div class="s3-tri"></div> 1169 <div class="s3-wtitle">Above-range employees</div> 1170 <div class="s3-index">141% INDEX</div> 1171 </div> 1172 <div class="s3-wmeta">Buyer · 60028-CNS · USA — Seattle · 4 employees above the 90th percentile</div> 1173 <div class="s3-rows"> 1174 <div class="s3-row"><span class="s3-name">Keanu Sanford</span><span class="s3-sal">$116,350</span><span class="s3-flag">ABOVE RANGE</span></div> 1175 <div class="s3-row"><span class="s3-name">Jayson Winfred</span><span class="s3-sal">$120,500</span><span class="s3-flag">ABOVE RANGE</span></div> 1176 <div class="s3-row"><span class="s3-name">Jovani McCall</span><span class="s3-sal">$134,350</span><span class="s3-flag">ABOVE RANGE</span></div> 1177 <div class="s3-row"><span class="s3-name">Alphonso Jordan</span><span class="s3-sal">$138,500</span><span class="s3-flag">ABOVE RANGE</span></div> 1178 </div> 1179 </div> 1180 1181 <div class="s3-insight"> 1182 <div class="lbl">Equity signal</div> 1183 <div class="body">4 employees flagged. Smart Price surfaces compression risk <b>before publish</b> — adjust ranges or model exceptions first.</div> 1184 </div> 1185 </div> 1186 1187 <!-- ââ SCENE 4: PUBLISH ââ --> 1188 <div class="scene" id="spr-scene-3"> 1189 <div class="sc-label">Publish with confidence</div> 1190 <div class="sc-sub">A defensible, costed plan — ready to roll out across the org.</div> 1191 1192 <div class="s4-grid"> 1193 <div class="s4-stat c1"> 1194 <div class="lbl">JOBS PRICED</div> 1195 <div class="val">26</div> 1196 <div class="sub">of 328 · 114 employees</div> 1197 </div> 1198 <div class="s4-stat c2"> 1199 <div class="lbl">ANNUAL SPEND</div> 1200 <div class="val">$8.7M</div> 1201 <div class="sub">+$736.9K to reach target</div> 1202 </div> 1203 <div class="s4-stat c3"> 1204 <div class="lbl">MIDPOINT MOVE</div> 1205 <div class="val">+45.3%</div> 1206 <div class="sub">from prior benchmark</div> 1207 </div> 1208 </div> 1209 1210 <div class="s4-hero"> 1211 <div class="s4-hcap">THE PAYOFF</div> 1212 <div class="s4-htitle">Confident pricing, end to end.</div> 1213 <div class="s4-pillars"> 1214 <div class="s4-pillar"> 1215 <div class="dot lime"></div> 1216 <div><div class="ttl">Price like a pro</div><div class="psub">AI guidance at any skill level</div></div> 1217 </div> 1218 <div class="s4-pillar"> 1219 <div class="dot teal"></div> 1220 <div><div class="ttl">Confidence you can trust</div><div class="psub">Proven AI, transparent logic</div></div> 1221 </div> 1222 <div class="s4-pillar"> 1223 <div class="dot purple"></div> 1224 <div><div class="ttl">More time for strategy</div><div class="psub">Less pricing, more impact</div></div> 1225 </div> 1226 </div> 1227 </div> 1228 </div> 1229 1230 <!-- play / pause toggle (dev convenience) --> 1231 <button class="spr-toggle" id="spr-toggle" type="button" aria-label="Pause animation"> 1232 <svg class="ic-pause" viewBox="0 0 12 12"><rect x="2" y="1.5" width="2.6" height="9" rx="0.6"/><rect x="7.4" y="1.5" width="2.6" height="9" rx="0.6"/></svg>
1233 <svg class="ic-play" viewBox="0 0 12 12"><path d="M3.8 2.4 L10.8 6 L3.8 9.6 Z"/></svg> 1234 </button> 1235 1236</div><!-- /.stage --> 1237</div><!-- /.spr --> 1238</div><!-- /.spr-fit --> 1239
1240<script> 1241(function () { 1242 /* Scoped to this embed's root â safe if multiple embeds live on the page */ 1243 var root = document.getElementById('spr-stage'); 1244 var scenes = root.querySelectorAll('.scene'); 1245 var steps = root.querySelectorAll('.ribbon .step'); 1246 var btn = document.getElementById('spr-toggle'); 1247 1248 /* ââ responsive scaling ââ 1249 Scale the whole embed to its column's width (measured directly â robust in 1250 any layout). The wrapper's aspect-ratio reserves the matching height. */ 1251 var fit = root.closest('.spr-fit'); 1252 if (fit) { 1253 var nativeW = parseFloat(getComputedStyle(fit).getPropertyValue('--spr-w')) || 560; 1254 var rescale = function () { 1255 fit.style.setProperty('--spr-scale', (fit.clientWidth / nativeW).toFixed(4)); 1256 }; 1257 rescale(); 1258 if (window.ResizeObserver) new ResizeObserver(rescale).observe(fit); 1259 else window.addEventListener('resize', rescale); 1260 } 1261 1262 /* ââ read the --speed flag set at the top of the CSS ââ 1263 >0 scales both the scene timing AND every CSS animation/transition 1264 (via --dur-scale). 0 = static: reveal Scene 1 fully formed, no loop. */ 1265 var speed = parseFloat(getComputedStyle(root).getPropertyValue('--speed')); 1266 if (isNaN(speed)) speed = 1; 1267 var animate = speed > 0; 1268 root.style.setProperty('--dur-scale', animate ? (1 / speed) : 0); 1269 1270 /* show / hide the dev play-pause button (reads --show-toggle from the CSS) */ 1271 if (parseFloat(getComputedStyle(root).getPropertyValue('--show-toggle')) === 0) { 1272 btn.style.display = 'none'; 1273 } 1274 1275 /* show / hide the readiness gauge (reads --show-gauge from the CSS) */ 1276 if (parseFloat(getComputedStyle(root).getPropertyValue('--show-gauge')) === 0) { 1277 root.querySelectorAll('.s1-gauge').forEach(function (g) { g.style.display = 'none'; }); 1278 } 1279 1280 var times = [5500, 6500, 6000, 6000].map(function (t) { /* base scene durations (ms) */ 1281 return animate ? t / speed : 0; 1282 }); 1283 1284 var cur = 0, timer = null, paused = false; 1285 1286 function show(i) { 1287 clearTimeout(timer); 1288 scenes.forEach(function (s, j) { s.classList.toggle('active', j === i); }); 1289 steps.forEach(function (s, j) { 1290 s.classList.remove('active', 'done'); 1291 if (j < i) s.classList.add('done'); 1292 else if (j === i) s.classList.add('active'); 1293 }); 1294 cur = i; 1295 if (animate && !paused) timer = setTimeout(next, times[i]); 1296 } 1297 function next() { show((cur + 1) % scenes.length); } 1298 1299 /* play / pause toggle (dev convenience â remove btn + this listener for production) */ 1300 btn.addEventListener('click', function () { 1301 paused = !paused; 1302 btn.classList.toggle('paused', paused); 1303 btn.setAttribute('aria-label', paused ? 'Play animation' : 'Pause animation'); 1304 root.classList.toggle('is-paused', paused); /* freezes all CSS motion */ 1305 if (paused) clearTimeout(timer); 1306 else if (animate) timer = setTimeout(next, times[cur]); /* resume current scene */ 1307 }); 1308 1309 /* Starts when scrolled into view, then fires once. 1310 To play immediately on page load instead, delete the observer 1311 block below and replace it with a single line: show(0); */ 1312 var observer = new IntersectionObserver(function (entries) { 1313 entries.forEach(function (entry) { 1314 if (entry.isIntersecting) { show(0); observer.disconnect(); } 1315 }); 1316 }, { threshold: 0.25 }); 1317 1318 observer.observe(root); 1319}()); 1320</script>
1320 1321</div></div></div></div></div></div></section><div class="anchor-scroll"><div class="hide w-embed w-script"><style> 1322 .section { 1323 scroll-margin-top: calc(var(--navbar-height) + var(--anchorMenu-height)); 1324 } 1325</style> 1326
1327<script> 1328var Webflow = Webflow || []; 1329 1330function updateNavbarHeight() { 1331 const navbar = document.querySelector('.nav_component'); 1332 const height = navbar?.offsetHeight || 80; 1333 document.documentElement.style.setProperty('--navbar-height', height + 'px'); 1334} 1335 1336function updateAnchorHeight() { 1337 const menu = document.querySelector('.anchor-scroll'); 1338 const height = menu?.offsetHeight || 80; 1339 document.documentElement.style.setProperty('--anchorMenu-height', height + 'px'); 1340} 1341 1342function updateHeights() { 1343 updateNavbarHeight(); 1344 updateAnchorHeight(); 1345} 1346 1347function initSticky() { 1348 const hero = document.querySelector('section'); 1349 const menu = document.querySelector('.anchor-scroll'); 1350 if (!hero || !menu) return; 1351 const observer = new IntersectionObserver((entries) => { 1352 entries.forEach(entry => { 1353 menu.classList.toggle('is-sticky', !entry.isIntersecting); 1354 }); 1355 }, { threshold: 0 }); 1356 observer.observe(hero); 1357} 1358 1359// Capture-phase handler runs BEFORE Webflow's document-level scroll 1360// handler, regardless of when Webflow binds it. This makes anchor 1361// scrolling work on first load, refresh, and back/forward alike. 1362document.addEventListener('click', function (e) { 1363 const link = e.target.closest('a[href]'); 1364 if (!link) return; 1365 1366 // Skip Webflow components that use #hrefs but manage their own clicks 1367 if ( 1368 link.hasAttribute('data-w-tab') || 1369 link.getAttribute('role') === 'tab' || 1370 link.closest('.w-tab-menu, .w-dropdown-toggle') 1371 ) return; 1372 1373 const href = link.getAttribute('href'); 1374 if (!href || href.charAt(0) !== '#' || href === '#') return; 1375 const target = document.querySelector(href); 1376 if (!target) return; 1377 1378 e.preventDefault(); 1379 e.stopImmediatePropagation(); // block Webflow's smooth scroll 1380 updateHeights(); // keep the offset vars current 1381 target.scrollIntoView({ behavior: 'auto', block: 'start' }); // respects scroll-margin-top 1382 history.pushState(null, '', href); 1383}, true); 1384 1385Webflow.push(function () { 1386 updateHeights(); 1387 initSticky(); 1388}); 1389 1390// Recompute offsets after a back/forward (bfcache) restore 1391window.addEventListener('pageshow', function (event) { 1392 if (event.persisted) { 1393 setTimeout(updateHeights, 0); 1394 } 1395}); 1396 1397window.addEventListener('resize', updateHeights); 1398</script>
1398</div><div class="anchor-scroll_wrapper"><a data-wf-native-id-path="a3742239-0d5f-38e7-c7cc-23dc2b39854d:a623f63e-9ee7-8be5-efe9-d5d7a80c6c37" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="a623f63e-9ee7-8be5-efe9-d5d7a80c6c37" data-wf-component-context="%5B%7B%22componentId%22%3A%22a623f63e-9ee7-8be5-efe9-d5d7a80c6c37%22%2C%22instanceId%22%3A%22a3742239-0d5f-38e7-c7cc-23dc2b39854d%22%7D%5D" href="#overview" class="anchor-scroll-button w-inline-block"><div>Overview</div></a><a data-wf-native-id-path="21423d3f-5793-c844-31f0-1ab9392d17f2:a623f63e-9ee7-8be5-efe9-d5d7a80c6c37" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="a623f63e-9ee7-8be5-efe9-d5d7a80c6c37" data-wf-component-context="%5B%7B%22componentId%22%3A%22a623f63e-9ee7-8be5-efe9-d5d7a80c6c37%22%2C%22instanceId%22%3A%2221423d3f-5793-c844-31f0-1ab9392d17f2%22%7D%5D" href="#key-features" class="anchor-scroll-button w-inline-block"><div>Key features</div></a><a data-wf-native-id-path="626c722b-3cce-88da-5310-3c3a49fff4f8:a623f63e-9ee7-8be5-efe9-d5d7a80c6c37" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="a623f63e-9ee7-8be5-efe9-d5d7a80c6c37" data-wf-component-context="%5B%7B%22componentId%22%3A%22a623f63e-9ee7-8be5-efe9-d5d7a80c6c37%22%2C%22instanceId%22%3A%22626c722b-3cce-88da-5310-3c3a49fff4f8%22%7D%5D" href="#who-ascent-helps" class="anchor-scroll-button w-inline-block"><div>Who Ascent helps</div></a><a data-wf-native-id-path="6bfbcf67-7b73-ba7c-3417-e1ea015a6f60:a623f63e-9ee7-8be5-efe9-d5d7a80c6c37" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="a623f63e-9ee7-8be5-efe9-d5d7a80c6c37" data-wf-component-context="%5B%7B%22componentId%22%3A%22a623f63e-9ee7-8be5-efe9-d5d7a80c6c37%22%2C%22instanceId%22%3A%226bfbcf67-7b73-ba7c-3417-e1ea015a6f60%22%7D%5D" href="#why-payscale" class="anchor-scroll-button w-inline-block"><div>Why Payscale</div></a></div></div><section id="overview" class="section bg-offwhite"><div class="padding-global"><div class="container-global"><div class="content-component"><div id="w-node-_254bf8fd-7337-bb7a-0329-386d066396bf-dbce5a0a" class="content-info-wrapper"><h2>Business moves fast. Most compensation tools donât.</h2><p>Most compensation tools force teams to react to requests instead of leading with strategy. <br/><br/>Payscale Ascent changes that â bringing always-current market data, purpose-built AI, and connected workflows into one intelligent system that keeps pace with the business, so you can price roles faster, defend decisions with confidence, and lead with proactive strategy.</p><div class="button-group-center"><div aria-roledescription="open-modal-trigger" class="btn" data-wf--cta-button---popup--variant="primary" role="button" aria-controls="button-popup" ariahaspopup="dialog" fs-modal-element="open-1" aria-expanded="false" tabindex="0"><div class="text-block-36">Get a Demo</div></div><a data-wf--cta-button--variant="secondary" data-wf-native-id-path="8928ad52-a8c2-b541-f7d4-6acc984b4521:6157d6ee-89f4-e1e2-60a0-be9475d4791e" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="6157d6ee-89f4-e1e2-60a0-be9475d4791e" data-wf-component-context="%5B%7B%22componentId%22%3A%226157d6ee-89f4-e1e2-60a0-be9475d4791e%22%2C%22instanceId%22%3A%228928ad52-a8c2-b541-f7d4-6acc984b4521%22%7D%5D" href="/products/pricing" class="btn w-variant-8ed9b6cf-be54-3813-b2a0-34405b5d0c8a w-inline-block"><div class="text-block-37 w-variant-8ed9b6cf-be54-3813-b2a0-34405b5d0c8a">Get Pricing</div></a></div></div><div class="counter-cards-grid-wrapper"><div id="w-node-_3eb60c3a-2ad9-12ab-460e-528c99807260-dbce5a0a" class="counter-card-grid-stack"><div class="counter-card_shadow card-light"><div class="counter-text-wrap"><div class="counter-number"><div class="counterup counter-sm">4.5</div><div class="counter-percent counter-sm">K+</div></div><p class="text-size-medium">Organizations within contributory network<br/></p></div></div></div><div class="counter-card-grid-stack"><div class="counter-card_shadow card-light"><div class="counter-text-wrap"><div class="counter-number counter-sm"><div class="counterup counter-sm">10.2</div><div class="counter-percent counter-sm">M+</div></div><p class="text-size-medium">Employee records</p></div></div></div><div class="counter-card-grid-stack"><div class="counter-card_shadow card-light"><div class="counter-text-wrap"><div class="counter-number counter-sm"><div class="counterup counter-sm">$2</div><div class="counter-percent counter-sm">T+</div></div><p class="text-size-medium">In employee salaries managed</p></div></div></div></div></div></div></div></section><section id="key-features" class="section bottom-4"><div class="padding-global"><div class="container-global"><div class="header-wrapper bottom-3"><div data-wf--eyebrow-pill--variant="primary" class="eyebrow-pill w-variant-230ceb93-1cca-7081-4f2b-17ab8288db90"><div>⦠Features & Functionality</div></div><h2>
1398Benchmarking quick enough to act on â and <span class="ts-highlight">credible</span> enough to defend</h2></div><div class="w-layout-vflex persona-cards-wrapper"><div class="persona-card bg-offwhite"><div class="persona-card_content"><div class="persona-card_content_rt w-richtext"><h3>AI-guided job matching & pricing </h3><p><br/>Match roles to the right benchmarks in minutes, not hours. Engage our intuitive, purpose-built LLMs to analyze your internal job architecture, skills data, and Peer benchmarks to recommend accurate, defensible pay ranges with clear confidence scores. <br/>â</p><ul role="list"><li><strong>AI-powered </strong>job matching reduces manual effort by weeks</li><li><strong>Contextual recommendations </strong>with confidence scoring</li><li><strong>Seamless flow </strong>into offer, planning, and equity workflows</li></ul></div><div class="w-layout-hflex button-text-group"><div aria-roledescription="open-modal-trigger" class="btn" data-wf--cta-button---popup--variant="primary" role="button" aria-controls="button-popup" ariahaspopup="dialog" fs-modal-element="open-1" aria-expanded="false" tabindex="0"><div class="text-block-36">Get a Demo</div></div></div></div><div class="persona-card_embed"><div class="w-embed w-script"><style> 1399/* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1400 PAYSCALE EXPLORE â Search · Price · Trends (frameless embed) 1401 Everything is scoped under .exp so it can't collide with the page. 1402 Layout is tuned once at a fixed native size, then scaled uniformly. 1403 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 1404 1405.exp, .exp *, .exp *::before, .exp *::after { box-sizing: border-box; margin: 0; padding: 0; } 1406 1407.exp { 1408 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1409 â â± MOTION CONTROL â 1410 â --speed scales the WHOLE animation in proportion. The script â 1411 â at the bottom reads this one value. â 1412 â 0 = no animation (static â shows Scene 1 fully formed) â 1413 â 1 = baseline (current speed) â 1414 â 2 = 200% speed · 0.5 = half speed · etc. â 1415 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 1416 --speed: 1; 1417 --dur-scale: 1; /* derived from --speed by the script â don't edit directly */ 1418 1419 /* Dev play/pause button: 1 = show · 0 = hide */ 1420 --show-toggle: 0; 1421 1422 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1423 â ð¨ COLOR CONTROLS â change every color from right here â 1424 â Edit a swatch and every element using it updates. â 1425 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 1426 1427 /* â Brand swatches (Payscale palette) â */ 1428 --c-green: #E2FF65; /* Electric Green (brand) â key-stat highlight, used sparingly */ 1429 --c-teal: #23A4B5; /* Light Teal (brand) â primary data series, chart ramp light end */ 1430 --c-techteal: #0A4444; /* Tech Teal (brand) â primary dark surface, borders, headings */ 1431 --c-midnight: #041E1E; /* Midnight (brand) â darkest, default body text */ 1432 --c-purple: #B399F8; /* Electric Purple (brand) â distribution curve, data series 2 (kept away from green) */ 1433 --c-aqua: #B9DCD3; /* Aqua Blue (brand) â soft fills, chips, "done" state */ 1434 --c-offwhite: #F4F2EA; /* Off-white (brand) â text on dark surfaces */ 1435 1436 /* â Custom shades / accents (NOT official brand swatches) â */ 1437 --c-teal-dk: #073333; /* deeper teal â dark end of bar / surface gradients */ 1438 --c-muted: #5C7575; /* muted gray-teal â captions, sub-labels */ 1439 --c-line: rgba(10,68,68,.12); /* hairline rules / inactive tracks */ 1440 --c-coral: #E8845C; /* warm coral â 4th data series only, for chart legibility */ 1441 1442 /* â Element gradients (built from the swatches above) â */ 1443 --grad-ribbon-active: linear-gradient(90deg, var(--c-techteal), var(--c-teal), var(--c-techteal)); /* active ribbon pill sweep */ 1444 --grad-bar: linear-gradient(90deg, var(--c-teal-dk), var(--c-teal)); /* horizontal bars â dark teal â teal */ 1445 --grad-surface-dark: linear-gradient(150deg, var(--c-techteal), var(--c-teal-dk)); /* callout + insight bar dark surface */ 1446 1447 /* â Card chrome (subtle, derived from Tech Teal) â */ 1448 --card-bg: #FFFFFF; 1449 --card-border: rgba(10,68,68,.14); 1450 --card-shadow: 0 2px 9px rgba(4,30,30,.07); 1451 1452 font-family: 'Inter', system-ui, sans-serif; 1453 -webkit-font-smoothing: antialiased; 1454 line-height: normal; 1455 display: inline-block; 1456} 1457 1458/* ââ Responsive wrapper ââââââââââââââââââââââââââââââââââââââââââââââ 1459 Drop the embed inside any flex column; it scales uniformly to fit that 1460 column's width, so the pixel-tuned layout is preserved at EVERY breakpoint 1461 (desktop 50/50, tablet/mobile stacked). Native size lives here as 1462 --exp-w / --exp-h; the stage reads them, the wrapper reserves the matching 1463 height via aspect-ratio, and the script sets --exp-scale from the column's 1464 real width. Caps at native size so it never upscales (stays crisp). 1465 To make it larger on wide screens, raise the max-width. */ 1466.exp-fit { 1467 --exp-w: 600; /* native width (px, unitless) */ 1468 --exp-h: 552; /* native height (px, unitless) â sized to the tallest scene (Price) */ 1469 position: relative; 1470 width: 100%; 1471 max-width: calc(var(--exp-w) * 1px); 1472 aspect-ratio: var(--exp-w) / var(--exp-h); 1473 margin: 0 auto; /* center within a wider column */ 1474 align-self: flex-start;/* don't vertically stretch if it's itself a flex item */ 1475} 1476.exp-fit .exp { 1477 position: absolute; top: 0; left: 0; 1478 transform-origin: top left; 1479 transform: scale(var(--exp-scale, 1)); 1480} 1481 1482/* Frameless stage â transparent. Native size comes from --exp-w / --exp-h. */ 1483.exp .stage { position: relative; width: calc(var(--exp-w, 600) * 1px); height: calc(var(--exp-h, 552) * 1px); } 1484 1485/* ââ keyframes (all prefixed exp-) ââ */ 1486@keyframes exp-sweep { 0%{background-position:0% 50%} 50%{background-position:100% 50%} 100%{background-position:0% 50%} } 1487@keyframes exp-fadeUp { from{opacity:0;transform:translateY(13px)} to{opacity:1;transform:translateY(0)} } 1488@keyframes exp-fade { from{opacity:0}
1488 to{opacity:1} } 1489@keyframes exp-scaleIn { from{opacity:0;transform:scale(.85)} to{opacity:1;transform:scale(1)} } 1490@keyframes exp-pop { from{opacity:0;transform:scale(.55)} to{opacity:1;transform:scale(1)} } 1491@keyframes exp-barGrow { from{transform:scaleX(0)} to{transform:scaleX(1)} } 1492@keyframes exp-pulse { 0%,100%{transform:scale(1);opacity:1} 50%{transform:scale(1.28);opacity:.7} } 1493@keyframes exp-type { from{width:0} to{width:100%} } 1494@keyframes exp-draw { to{stroke-dashoffset:0} } 1495 1496/* ââ workflow ribbon (the single step indicator) ââ */ 1497.exp .ribbon { position: absolute; top: 16px; left: 16px; right: 16px; display: flex; align-items: center; gap: 6px; z-index: 20; } 1498.exp .ribbon .step { 1499 flex: 1; height: 32px; border-radius: 999px; 1500 border: 1.5px solid rgba(10,68,68,.25); /* inactive pill border */ 1501 background: var(--card-bg); /* inactive pill fill */ 1502 display: flex; align-items: center; padding: 0 12px; 1503 font-size: 12.5px; font-weight: 600; color: var(--c-muted); 1504 position: relative; z-index: 0; /* stacking context for the gradient overlay */ 1505 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out, border-color calc(.6s * var(--dur-scale,1)) ease-in-out; 1506 white-space: nowrap; overflow: hidden; 1507} 1508/* gradient overlay â crossfades in/out behind the label + number (color: --grad-ribbon-active) */ 1509.exp .ribbon .step::before { 1510 content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; 1511 background: var(--grad-ribbon-active); background-size: 200% 100%; 1512 opacity: 0; pointer-events: none; 1513 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out; /* fade-OUT â starts immediately */ 1514} 1515.exp .ribbon .step .num { 1516 width: 16px; height: 16px; border-radius: 50%; 1517 background: rgba(10,68,68,.1); color: var(--c-muted); 1518 font-size: 10px; font-weight: 700; 1519 display: flex; align-items: center; justify-content: center; 1520 margin-right: 8px; flex-shrink: 0; 1521 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out, color calc(.6s * var(--dur-scale,1)) ease-in-out; 1522} 1523/* active step â gradient fades IN delayed ~85% of the fade-out, so outgoing/incoming pills overlap ~15% */ 1524.exp .ribbon .step.active { 1525 border-color: transparent; color: var(--c-offwhite); 1526 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), 1527 border-color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 1528} 1529.exp .ribbon .step.active::before { 1530 opacity: 1; 1531 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); /* fade-IN â delayed */ 1532 animation: exp-sweep calc(3.4s * var(--dur-scale,1)) ease-in-out infinite; 1533} 1534.exp .ribbon .step.active .num { 1535 background: var(--c-green); color: var(--c-techteal); 1536 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 1537} 1538/* done step */ 1539.exp .ribbon .step.done { background: var(--c-aqua); border-color: var(--c-aqua); color: var(--c-techteal); } 1540.exp .ribbon .step.done .num { background: var(--c-techteal); color: var(--c-green); } 1541.exp .ribbon .step.done::after { content: "\2713"; font-size: 11px; font-weight: 700; color: var(--c-techteal); margin-left: auto; } 1542 1543/* ââ scenes ââ */ 1544.exp .scene { 1545 position: absolute; top: 60px; left: 16px; right: 16px; bottom: 16px; 1546 display: flex; flex-direction: column; 1547 opacity: 0; pointer-events: none; transition: opacity calc(.5s * var(--dur-scale,1)) ease; 1548} 1549.exp .scene.active { opacity: 1; } 1550 1551/* shared scene heading â 18px left pad lines the text up with the card body text below (cards sit at the scene edge with 18px inner padding) */ 1552.exp .sc-label { font-family: 'Zodiak', Georgia, serif; font-size: 22px; font-weight: 600; letter-spacing: -.01em; color: var(--c-techteal); padding-left: 18px; } 1553.exp .sc-sub { font-size: 13px; color: var(--c-muted); line-height: 1.45; max-width: 88%; margin-top: 5px; padding-left: 18px; } 1554 1555/* âââââââââââ SCENE 1 â AI SEARCH âââââââââââ */
1556.exp .se-card { 1557 margin-top: 16px; 1558 background: var(--card-bg); border: 1.5px solid var(--c-techteal); border-radius: 13px; 1559 box-shadow: var(--card-shadow); padding: 16px 18px; opacity: 0; 1560} 1561.exp .scene.active .se-card { animation: exp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 1562.exp .se-cap { font-size: 10.5px; font-weight: 600; letter-spacing: .14em; color: var(--c-muted); text-transform: uppercase; margin-bottom: 11px; } 1563 1564.exp .se-bar { 1565 display: flex; align-items: center; 1566 background: var(--c-offwhite); border: 1.5px solid var(--c-techteal); border-radius: 999px; 1567 padding: 10px 14px; 1568} 1569.exp .se-bar .spark { color: var(--c-teal); font-size: 15px; font-weight: 700; margin-right: 11px; flex-shrink: 0; } 1570.exp .se-bar .qt { font-size: 13.5px; font-weight: 500; color: var(--c-midnight); flex: 1; overflow: hidden; white-space: nowrap; } 1571.exp .scene.active .se-bar .qt { animation: exp-type calc(1.6s * var(--dur-scale,1)) steps(38,end) calc(.6s * var(--dur-scale,1)) both; } 1572.exp .se-bar .go { width: 27px; height: 27px; border-radius: 50%; background: var(--c-techteal); color: var(--c-green); font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center; margin-left: 10px; flex-shrink: 0; opacity: 0; } 1573.exp .scene.active .se-bar .go { animation: exp-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(2.3s * var(--dur-scale,1)) both; } 1574 1575.exp .se-filters { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 13px; } 1576.exp .se-chip { padding: 5px 12px; border-radius: 999px; font-size: 11px; font-weight: 500; color: var(--c-techteal); background: var(--c-aqua); opacity: 0; } 1577.exp .scene.active .se-chip:nth-child(1) { animation: exp-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(2.5s * var(--dur-scale,1)) both; } 1578.exp .scene.active .se-chip:nth-child(2) { animation: exp-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(2.62s * var(--dur-scale,1)) both; } 1579.exp .scene.active .se-chip:nth-child(3) { animation: exp-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(2.74s * var(--dur-scale,1)) both; } 1580 1581.exp .se-reslabel { font-size: 10.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: var(--c-muted); margin: 18px 0 9px 18px; opacity: 0; } 1582.exp .scene.active .se-reslabel { animation: exp-fade calc(.4s * var(--dur-scale,1)) ease calc(3.0s * var(--dur-scale,1)) both; } 1583 1584.exp .se-results { display: flex; flex-direction: column; gap: 8px; } 1585.exp .se-result { 1586 display: flex; align-items: center; gap: 12px; 1587 background: var(--card-bg); border: 1.5px solid var(--c-line); border-radius: 11px; 1588 box-shadow: var(--card-shadow); padding: 11px 15px; opacity: 0; 1589} 1590.exp .scene.active .se-result:nth-child(1) { animation: exp-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(3.2s * var(--dur-scale,1)) both; } 1591.exp .scene.active .se-result:nth-child(2) { animation: exp-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(3.35s * var(--dur-scale,1)) both; } 1592.exp .scene.active .se-result:nth-child(3) { animation: exp-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(3.5s * var(--dur-scale,1)) both; } 1593.exp .se-result .rt { font-size: 12.5px; font-weight: 600; color: var(--c-midnight); } 1594.exp .se-result .rm { font-size: 10.5px; color: var(--c-muted); margin-top: 2px; } 1595.exp .se-result .rgo { margin-left: auto; color: var(--c-teal); font-size: 15px; font-weight: 700; flex-shrink: 0; } 1596 1597/* âââââââââââ SCENE 2 â MARKET PRICING (distribution) âââââââââââ */ 1598.exp .pr-card { 1599 margin-top: 16px; 1600 background: var(--card-bg); border: 1.5px solid var(--c-techteal); border-radius: 13px; 1601 box-shadow: var(--card-shadow); padding: 16px 18px; opacity: 0; position: relative; 1602} 1603.exp .scene.active .pr-card { animation: exp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.15s * var(--dur-scale,1)) both; } 1604.exp .pr-cap { font-size: 10.5px; font-weight: 600; letter-spacing: .14em; color: var(--c-muted); text-transform: uppercase; } 1605.exp .pr-sub { font-size: 11.5px; color: var(--c-midnight); font-weight: 500; margin-top: 3px; } 1606 1607.exp .pr-wrap { position: relative; width: 100%; aspect-ratio: 600 / 260; margin-top: 6px; } 1608.exp .pr-wrap svg { width: 100%; height: 100%; display: block; overflow: visible; } 1609 1610.exp .pr-guides { opacity: 0; } 1611.exp .scene.active .pr-guides { animation: exp-fade calc(.6s * var(--dur-scale,1)) ease calc(1.4s * var(--dur-scale,1)) forwards; } 1612 1613.exp .pr-line { stroke: var(--c-purple); stroke-width: 2.5; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1000; stroke-dashoffset: 1000; } 1614.exp .scene.active .pr-line { animation: exp-draw calc(1.5s * var(--dur-scale,1)) ease-out calc(.5s * var(--dur-scale,1)) forwards; } 1615.exp .pr-area { fill: url(#exp-curve-grad); opacity: 0; } 1616.exp .scene.active .pr-area { animation: exp-fade calc(.8s * var(--dur-scale,1)) ease calc(1.7s * var(--dur-scale,1)) forwards; } 1617 1618/* percentile dots â pop in from the tails inward; positions computed to sit exactly on the curve */
1619.exp .pr-dot { opacity: 0; transform-box: fill-box; transform-origin: center; } 1620.exp .scene.active .pr-dot { animation: exp-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) both; } 1621.exp .scene.active .pr-dot.p1, .exp .scene.active .pr-dot.p5 { animation-delay: calc(2.0s * var(--dur-scale,1)); } 1622.exp .scene.active .pr-dot.p2, .exp .scene.active .pr-dot.p4 { animation-delay: calc(2.15s * var(--dur-scale,1)); } 1623.exp .scene.active .pr-dot.p3 { animation-delay: calc(2.4s * var(--dur-scale,1)); } 1624 1625.exp .pr-tick, .exp .pr-val { opacity: 0; } 1626.exp .scene.active .pr-tick, .exp .scene.active .pr-val { animation: exp-fade calc(.4s * var(--dur-scale,1)) ease both; } 1627.exp .scene.active .pr-tick.t1, .exp .scene.active .pr-val.w1 { animation-delay: calc(2.6s * var(--dur-scale,1)); } 1628.exp .scene.active .pr-tick.t2, .exp .scene.active .pr-val.w2 { animation-delay: calc(2.72s * var(--dur-scale,1)); } 1629.exp .scene.active .pr-tick.t3, .exp .scene.active .pr-val.w3 { animation-delay: calc(2.84s * var(--dur-scale,1)); } 1630.exp .scene.active .pr-tick.t4, .exp .scene.active .pr-val.w4 { animation-delay: calc(2.96s * var(--dur-scale,1)); } 1631.exp .scene.active .pr-tick.t5, .exp .scene.active .pr-val.w5 { animation-delay: calc(3.08s * var(--dur-scale,1)); } 1632 1633/* median callout â sits above the apex dot, generous padding, sizes to content */ 1634.exp .pr-callout { 1635 position: absolute; left: 50%; top: -8px; transform: translateX(-50%); 1636 background: var(--grad-surface-dark); color: var(--c-offwhite); 1637 padding: 9px 18px; border-radius: 10px; text-align: center; white-space: nowrap; 1638 box-shadow: 0 4px 14px rgba(4,30,30,.22); opacity: 0; z-index: 5; 1639} 1640.exp .scene.active .pr-callout { animation: exp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(2.5s * var(--dur-scale,1)) both; } 1641.exp .pr-callout .cl { font-size: 9px; font-weight: 600; letter-spacing: .14em; color: var(--c-aqua); } 1642.exp .pr-callout .cv { font-family: 'Zodiak', Georgia, serif; font-size: 19px; font-weight: 700; color: var(--c-green); letter-spacing: -.01em; margin-top: 2px; } 1643 1644/* insight bar (dark) */ 1645.exp .pr-insight { 1646 display: flex; gap: 18px; margin-top: 12px; 1647 background: var(--grad-surface-dark); color: var(--c-offwhite); 1648 border-radius: 13px; padding: 14px 18px; opacity: 0; box-shadow: 0 6px 18px rgba(4,30,30,.16); 1649} 1650.exp .scene.active .pr-insight { animation: exp-fadeUp calc(.55s * var(--dur-scale,1)) ease calc(3.4s * var(--dur-scale,1)) both; } 1651.exp .pr-insight .ic-range { flex: .8; border-right: 1px solid rgba(255,255,255,.14); padding-right: 18px; } 1652.exp .pr-insight .ic-data { flex: 1.5; } 1653.exp .pr-insight .lbl { font-size: 9px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase; color: var(--c-aqua); margin-bottom: 5px; } 1654.exp .pr-insight .val { font-family: 'Zodiak', Georgia, serif; font-size: 19px; font-weight: 700; color: var(--c-green); line-height: 1; letter-spacing: -.01em; } 1655.exp .pr-insight .sub { font-size: 10px; color: var(--c-aqua); margin-top: 5px; } 1656.exp .pr-darow { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 5px 0; border-bottom: 1px solid rgba(255,255,255,.1); } 1657.exp .pr-darow:last-child { border-bottom: none; } 1658.exp .pr-darow .dj { font-size: 10.5px; color: var(--c-offwhite); font-weight: 500; } 1659.exp .pr-darow .dc { font-size: 10.5px; color: var(--c-aqua); white-space: nowrap; } 1660.exp .pr-darow .dc b { color: var(--c-green); font-weight: 700; } 1661 1662/* âââââââââââ SCENE 3 â TRENDS & DEMAND âââââââââââ */ 1663.exp .tr-row { display: flex; gap: 12px; margin-top: 16px; } 1664.exp .tr-card { 1665 flex: 1; background: var(--card-bg); border: 1.5px solid var(--c-techteal); border-radius: 12px; 1666 box-shadow: var(--card-shadow); padding: 14px 16px; opacity: 0; 1667} 1668.exp .scene.active .tr-card.c1 { animation: exp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 1669.exp .scene.active .tr-card.c2 { animation: exp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.4s * var(--dur-scale,1)) both; } 1670.exp .scene.active .tr-card.c3 { animation: exp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.6s * var(--dur-scale,1)) both; } 1671.exp .scene.active .tr-card.c4 { animation: exp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.8s * var(--dur-scale,1)) both; } 1672.exp .tr-card .cap { font-size: 9.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: var(--c-muted); margin-bottom: 4px; } 1673.exp .tr-card .ttl { font-size: 12px; font-weight: 600; color: var(--c-midnight); margin-bottom: 11px; } 1674 1675/* skill-impact horizontal bars */ 1676.exp .tr-skill { display: flex; align-items: center; gap: 9px; margin-bottom: 8px; } 1677.exp .tr-skill:last-child { margin-bottom: 0; } 1678.exp .tr-skill .name { width: 98px; font-size: 10.5px; font-weight: 500; color: var(--c-midnight); flex-shrink: 0; white-space: nowrap; } 1679.exp .tr-skill .track { flex: 1; height: 7px; border-radius: 999px; background: rgba(10,68,68,.07); overflow: hidden; } 1680.exp .tr-skill .fill { display: block; height: 100%; border-radius: 999px; background: var(--grad-bar); transform-origin: left; transform: scaleX(0); } 1681.exp .tr-skill .pct { width: 34px; text-align: right; font-size: 10.5px; font-weight: 600; color: var(--c-teal); flex-shrink: 0; } 1682.exp .scene.active .tr-skill:nth-child(1) .fill { animation: exp-barGrow calc(.7s * var(--dur-scale,1)) ease calc(.8s * var(--dur-scale,1)) both; } 1683.exp .scene.active .tr-skill:nth-child(2) .fill { animation: exp-barGrow calc(.7s * var(--dur-scale,1)) ease calc(.92s * var(--dur-scale,1)) both; } 1684.exp .scene.active .tr-skill:nth-child(3) .fill { animation: exp-barGrow calc(.7s * var(--dur-scale,1)) ease calc(1.04s * var(--dur-scale,1)) both; } 1685.exp .scene.active .tr-skill:nth-child(4) .fill { animation: exp-barGrow calc(.7s * var(--dur-scale,1)) ease calc(1.16s * var(--dur-scale,1)) both; } 1686 1687/* skill-trends multi-line chart */ 1688.exp .tr-trend { width: 100%; height: 82px; display: block; } 1689.exp .tr-trend .grid { stroke: var(--c-techteal); stroke-opacity: .08; stroke-width: .5; } 1690.exp .tr-trend .ln { fill: none; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1000; stroke-dashoffset: 1000; } 1691.exp .tr-trend .l1 { stroke: var(--c-purple); } 1692.exp .tr-trend .l2 { stroke: var(--c-teal); } 1693.exp .tr-trend .l3 { stroke: var(--c-techteal); } 1694.exp .tr-trend .l4 { stroke: var(--c-coral); } 1695.exp .scene.active .tr-trend .l1 { animation: exp-draw calc(1.2s * var(--dur-scale,1)) ease-out calc(.9s * var(--dur-scale,1)) forwards; } 1696.exp .scene.active .tr-trend .l2 { animation: exp-draw calc(1.2s * var(--dur-scale,1)) ease-out calc(1.05s * var(--dur-scale,1)) forwards; } 1697.exp .scene.active .tr-trend .l3 { animation: exp-draw calc(1.2s * var(--dur-scale,1)) ease-out calc(1.2s * var(--dur-scale,1)) forwards; } 1698.exp .scene.active .tr-trend .l4 { animation: exp-draw calc(1.2s * var(--dur-scale,1)) ease-out calc(1.35s * var(--dur-scale,1)) forwards; } 1699.exp .tr-legend { display: flex; flex-wrap: wrap; gap: 8px 12px; margin-top: 9px; } 1700.exp .tr-legend .li { display: inline-flex; align-items: center; gap: 5px; font-size: 9px; font-weight: 500; color: var(--c-muted); } 1701.exp .tr-legend .li .d { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; } 1702.exp .tr-legend .d1 { background: var(--c-purple); } 1703.exp .tr-legend .d2 { background: var(--c-teal); } 1704.exp .tr-legend .d3 { background: var(--c-techteal); } 1705.exp .tr-legend .d4 { background: var(--c-coral); } 1706 1707/* demand: postings line */ 1708.exp .tr-post { width: 100%; height: 60px; display: block; margin-top: 2px; } 1709.exp .tr-post .grid { stroke: var(--c-techteal); stroke-opacity: .08; stroke-width: .5; } 1710.exp .tr-post .ln { fill: none; stroke: var(--c-teal); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1000; stroke-dashoffset: 1000; } 1711.exp .scene.active .tr-post .ln { animation: exp-draw calc(1.3s * var(--dur-scale,1)) ease-out calc(1.0s * var(--dur-scale,1)) forwards; } 1712.exp .tr-axis { display: flex; justify-content: space-between; font-size: 8.5px; font-weight: 500; color: var(--c-muted); margin-top: 6px; } 1713 1714/* demand: top locations */ 1715.exp .tr-loc { display: flex; align-items: center; gap: 8px; font-size: 10.5px; padding: 6px 0; border-bottom: 1px solid var(--c-line); opacity: 0; } 1716.exp .tr-loc:last-child { border-bottom: none; } 1717.exp .scene.active .tr-loc:nth-child(1) { animation: exp-fadeUp calc(.35s * var(--dur-scale,1)) ease calc(1.1s * var(--dur-scale,1)) both; } 1718.exp .scene.active .tr-loc:nth-child(2) { animation: exp-fadeUp calc(.35s * var(--dur-scale,1)) ease calc(1.22s * var(--dur-scale,1)) both; } 1719.exp .scene.active .tr-loc:nth-child(3) { animation: exp-fadeUp calc(.35s * var(--dur-scale,1)) ease calc(1.34s * var(--dur-scale,1)) both; } 1720.exp .scene.active .tr-loc:nth-child(4) { animation: exp-fadeUp calc(.35s * var(--dur-scale,1)) ease calc(1.46s * var(--dur-scale,1)) both; } 1721.exp .tr-loc .ln-name { flex: 1; color: var(--c-midnight); font-weight: 500; } 1722.exp .tr-loc .ln-posts { width: 36px; text-align: right; color: var(--c-muted); font-weight: 600; } 1723.exp .tr-loc .ln-sal { width: 56px; text-align: right; font-family: 'Zodiak', Georgia, serif; font-weight: 700; color: var(--c-techteal); letter-spacing: -.01em; } 1724 1725/* âââââââââââ play / pause toggle (dev convenience â delete this block + the 1726 <button> + the JS listener to remove it entirely for production) âââââââââââ */ 1727.exp .exp-toggle { 1728 position: absolute; bottom: 8px; right: 8px; z-index: 40; 1729 width: 24px; height: 24px; border-radius: 50%; padding: 0; 1730 border: 1px solid rgba(10,68,68,.2); background: rgba(255,255,255,.7); 1731 display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: .5; 1732 transition: opacity .2s ease, background .2s ease; 1733} 1734.exp .exp-toggle:hover { opacity: 1; background: var(--card-bg); } 1735.exp .exp-toggle svg { width: 11px; height: 11px; display: block; fill: var(--c-techteal); }
1736.exp .exp-toggle .ic-play { display: none; } 1737.exp .exp-toggle.paused .ic-pause { display: none; } 1738.exp .exp-toggle.paused .ic-play { display: block; } 1739/* when paused, freeze every animation in the embed so you get a still frame */ 1740.exp .stage.is-paused *, .exp .stage.is-paused *::before, .exp .stage.is-paused *::after { animation-play-state: paused !important; } 1741</style> 1742 1743<!-- ââââââââââââââââ 1744 â MARKUP â 1745 ââââââââââââââââ --> 1746<div class="exp-fit"> 1747<div class="exp"> 1748<div class="stage" id="exp-stage"> 1749 1750 <!-- Phase ribbon (single step indicator) --> 1751 <div class="ribbon"> 1752 <div class="step" data-step="0"><span class="num">1</span>AI Search</div> 1753 <div class="step" data-step="1"><span class="num">2</span>Market Pricing</div> 1754 <div class="step" data-step="2"><span class="num">3</span>Trends & Demand</div> 1755 </div> 1756 1757 <!-- ââ SCENE 1: AI SEARCH ââ --> 1758 <div class="scene" id="exp-scene-0"> 1759 <div class="sc-label">Find any job, fast</div> 1760 <div class="sc-sub">Search in plain language — Payscale maps it to the right role and market.</div> 1761 1762 <div class="se-card"> 1763 <div class="se-cap">AI-powered search</div> 1764 <div class="se-bar"> 1765 <span class="spark">✦</span> 1766 <span class="qt">Firmware / Embedded Software Engineer</span> 1767 <span class="go">→</span> 1768 </div> 1769 <div class="se-filters"> 1770 <span class="se-chip">Technology</span> 1771 <span class="se-chip">USA — National</span> 1772 <span class="se-chip">500–1,000 employees</span> 1773 </div> 1774 </div> 1775 1776 <div class="se-reslabel">Suggested matches</div> 1777 <div class="se-results"> 1778 <div class="se-result"> 1779 <div> 1780 <div class="rt">Firmware Engineer II</div> 1781 <div class="rm">USA — National · Technology</div> 1782 </div> 1783 <span class="rgo">→</span> 1784 </div> 1785 <div class="se-result"> 1786 <div> 1787 <div class="rt">Embedded Software Engineer</div> 1788 <div class="rm">USA — National · Technology</div> 1789 </div> 1790 <span class="rgo">→</span> 1791 </div> 1792 <div class="se-result"> 1793 <div> 1794 <div class="rt">IoT Firmware Developer</div> 1795 <div class="rm">USA — National · Technology</div> 1796 </div> 1797 <span class="rgo">→</span> 1798 </div> 1799 </div> 1800 </div> 1801 1802 <!-- ââ SCENE 2: MARKET PRICING ââ --> 1803 <div class="scene" id="exp-scene-1"> 1804 <div class="sc-label">Price the role in real time</div> 1805 <div class="sc-sub">A live pay distribution, benchmarked to fresh market data.</div> 1806 1807 <div class="pr-card"> 1808 <div class="pr-cap">Market distribution</div> 1809 <div class="pr-sub">Firmware / Embedded Software Engineer · USA</div> 1810 1811 <div class="pr-wrap"> 1812 <svg viewBox="0 0 600 260" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg"> 1813 <defs> 1814 <linearGradient id="exp-curve-grad" x1="0" x2="0" y1="0" y2="1"> 1815 <stop offset="0" stop-color="var(--c-purple)" stop-opacity="0.45"/> 1816 <stop offset="1" stop-color="var(--c-purple)" stop-opacity="0.04"/> 1817 </linearGradient> 1818 </defs> 1819 1820 <!-- percentile vertical guides (revealed with the curve) --> 1821 <g class="pr-guides" stroke="var(--c-techteal)" stroke-opacity="0.12" stroke-width="1" stroke-dasharray="2 4"> 1822 <line x1="90" y1="44" x2="90" y2="202"/> 1823 <line x1="210" y1="44" x2="210" y2="202"/> 1824 <line x1="300" y1="44" x2="300" y2="202"/> 1825 <line x1="390" y1="44" x2="390" y2="202"/> 1826 <line x1="510" y1="44" x2="510" y2="202"/> 1827 </g> 1828 1829 <!-- filled area under the curve --> 1830 <path class="pr-area" d="M0,197.3 L5,196.9 L10,196.5 L15,196.0 L20,195.5 L25,194.9 L30,194.3 L35,193.6 L40,192.8 L45,191.9 L50,191.0 L55,190.0 L60,188.9 L65,187.6 L70,186.3 L75,184.9 L80,183.4 L85,181.7 L90,180.0 L95,178.1 L100,176.1 L105,173.9 L110,171.6 L115,169.2 L120,166.7 L125,164.0 L130,161.2 L135,158.3 L140,155.3 L145,152.1 L150,148.8 L155,145.4 L160,141.9 L165,138.4 L170,134.7 L175,131.0 L180,127.2 L185,123.4 L190,119.6 L195,115.7 L200,111.9 L205,108.1 L2
183010,104.3 L215,100.6 L220,97.0 L225,93.5 L230,90.1 L235,86.8 L240,83.7 L245,80.7 L250,78.0 L255,75.4 L260,73.1 L265,71.0 L270,69.2 L275,67.6 L280,66.3 L285,65.3 L290,64.6 L295,64.1 L300,64.0 L305,64.1 L310,64.6 L315,65.3 L320,66.3 L325,67.6 L330,69.2 L335,71.0 L340,73.1 L345,75.4 L350,78.0 L355,80.7 L360,83.7 L365,86.8 L370,90.1 L375,93.5 L380,97.0 L385,100.6 L390,104.3 L395,108.1 L400,111.9 L405,115.7 L410,119.6 L415,123.4 L420,127.2 L425,131.0 L430,134.7 L435,138.4 L440,141.9 L445,145.4 L450,148.8 L455,152.1 L460,155.3 L465,158.3 L470,161.2 L475,164.0 L480,166.7 L485,169.2 L490,171.6 L495,173.9 L500,176.1 L505,178.1 L510,180.0 L515,181.7 L520,183.4 L525,184.9 L530,186.3 L535,187.6 L540,188.9 L545,190.0 L550,191.0 L555,191.9 L560,192.8 L565,193.6 L570,194.3 L575,194.9 L580,195.5 L585,196.0 L590,196.5 L595,196.9 L600,197.3 L600,200 L0,200 Z"/> 1831 1832 <!-- the curve stroke (pathLength normalized so the draw-on works regardless of real length) --> 1833 <path class="pr-line" pathLength="1000" d="M0,197.3 L5,196.9 L10,196.5 L15,196.0 L20,195.5 L25,194.9 L30,194.3 L35,193.6 L40,192.8 L45,191.9 L50,191.0 L55,190.0 L60,188.9 L65,187.6 L70,186.3 L75,184.9 L80,183.4 L85,181.7 L90,180.0 L95,178.1 L100,176.1 L105,173.9 L110,171.6 L115,169.2 L120,166.7 L125,164.0 L130,161.2 L135,158.3 L140,155.3 L145,152.1 L150,148.8 L155,145.4 L160,141.9 L165,138.4 L170,134.7 L175,131.0 L180,127.2 L185,123.4 L190,119.6 L195,115.7 L200,111.9 L205,108.1 L210,104.3 L215,100.6 L220,97.0 L225,93.5 L230,90.1 L235,86.8 L240,83.7 L245,80.7 L250,78.0 L255,75.4 L260,73.1 L265,71.0 L270,69.2 L275,67.6 L280,66.3 L285,65.3 L290,64.6 L295,64.1 L300,64.0 L305,64.1 L310,64.6 L315,65.3 L320,66.3 L325,67.6 L330,69.2 L335,71.0 L340,73.1 L345,75.4 L350,78.0 L355,80.7 L360,83.7 L365,86.8 L370,90.1 L375,93.5 L380,97.0 L385,100.6 L390,104.3 L395,108.1 L400,111.9 L405,115.7 L410,119.6 L415,123.4 L420,127.2 L425,131.0 L430,134.7 L435,138.4 L440,141.9 L445,145.4 L450,148.8 L455,152.1 L460,155.3 L465,158.3 L470,161.2 L475,164.0 L480,166.7 L485,169.2 L490,171.6 L495,173.9 L500,176.1 L505,178.1 L510,180.0 L515,181.7 L520,183.4 L525,184.9 L530,186.3 L535,187.6 L540,188.9 L545,190.0 L550,191.0 L555,191.9 L560,192.8 L565,193.6 L570,194.3 L575,194.9 L580,195.5 L585,196.0 L590,196.5 L595,196.9 L600,197.3"/> 1834 1835 <!-- percentile dots â each sits exactly on the curve --> 1836 <g class="pr-dot p1"><circle cx="90" cy="180.0" r="5" fill="var(--card-bg)" stroke="var(--c-techteal)" stroke-width="2"/></g> 1837 <g class="pr-dot p2"><circle cx="210" cy="104.3" r="5" fill="var(--card-bg)" stroke="var(--c-techteal)" stroke-width="2"/></g> 1838 <g class="pr-dot p3"><circle cx="300" cy="64.0" r="6.5" fill="var(--c-green)" stroke="var(--c-techteal)" stroke-width="2"/></g> 1839 <g class="pr-dot p4"><circle cx="390" cy="104.3" r="5" fill="var(--card-bg)" stroke="var(--c-techteal)" stroke-width="2"/></g> 1840 <g class="pr-dot p5"><circle cx="510" cy="180.0" r="5" fill="var(--card-bg)" stroke="var(--c-techteal)" stroke-width="2"/></g> 1841 1842 <!-- percentile labels + dollar values --> 1843 <g font-family="Inter" font-size="9" font-weight="500" fill="var(--c-muted)" text-anchor="middle"> 1844 <text class="pr-tick t1" x="90" y="224">10TH</text> 1845 <text class="pr-tick t2" x="210" y="224">25TH</text> 1846 <text class="pr-tick t3" x="300" y="224">50TH</text> 1847 <text class="pr-tick t4" x="390" y="224">75TH</text> 1848 <text class="pr-tick t5" x="510" y="224">90TH</text> 1849 </g> 1850 <g font-family="Zodiak, Georgia, serif" font-size="13.5" font-weight="700" fill="var(--c-techteal)" text-anchor="middle" letter-spacing="-0.2"> 1851 <text class="pr-val w1" x="90" y="243">$88.1K</text> 1852 <text class="pr-val w2" x="210" y="243">$96.2K</text> 1853 <text class="pr-val w3" x="300" y="243">$107.2K</text> 1854 <text class="pr-val w4" x="390" y="243">$132.8K</text> 1855 <text class="pr-val w5" x="510" y="243">$158.9K</text> 1856 </g> 1857 </svg> 1858 1859 <!-- median callout sits above the apex dot --> 1860 <div class="pr-callout"> 1861 <div class="cl">50TH · MEDIAN</div> 1862 <div class="cv">$107.2K</div> 1863 </div> 1864 </div> 1865 </div> 1866 1867 <div class="pr-insight"> 1868 <div class="ic-range"> 1869 <div class="lbl">Range</div> 1870 <div class="val">$88K – $159K</div> 1871 <div class="sub">10th to 90th percentile</div> 1872 </div> 1873 <div class="ic-data"> 1874 <div class="lbl">Data analyzed</div> 1875 <div class="pr-darow">
1876 <span class="dj">Firmware/Embedded SW Eng · USA</span> 1877 <span class="dc"><b>98</b> orgs · <b>2,221</b> incs</span> 1878 </div> 1879 <div class="pr-darow"> 1880 <span class="dj">Firmware/Embedded SW Eng · Technology</span> 1881 <span class="dc"><b>10</b> orgs · <b>134</b> incs</span> 1882 </div> 1883 </div> 1884 </div> 1885 </div> 1886 1887 <!-- ââ SCENE 3: TRENDS & DEMAND ââ --> 1888 <div class="scene" id="exp-scene-2"> 1889 <div class="sc-label">Explore trends and demand</div> 1890 <div class="sc-sub">Skill premiums, hiring momentum, and where the jobs are.</div> 1891 1892 <div class="tr-row"> 1893 <div class="tr-card c1"> 1894 <div class="cap">Skill impact</div> 1895 <div class="ttl">Pay lift for in-demand skills</div> 1896 <div class="tr-skills"> 1897 <div class="tr-skill"><span class="name">Embedded C/C++</span><span class="track"><span class="fill" style="width:92%"></span></span><span class="pct">+12%</span></div> 1898 <div class="tr-skill"><span class="name">RTOS</span><span class="track"><span class="fill" style="width:74%"></span></span><span class="pct">+8%</span></div> 1899 <div class="tr-skill"><span class="name">Device drivers</span><span class="track"><span class="fill" style="width:55%"></span></span><span class="pct">+5%</span></div> 1900 <div class="tr-skill"><span class="name">Bluetooth LE</span><span class="track"><span class="fill" style="width:38%"></span></span><span class="pct">+3%</span></div> 1901 </div> 1902 </div> 1903 1904 <div class="tr-card c2"> 1905 <div class="cap">Skill trends</div> 1906 <div class="ttl">% of postings, last 7 quarters</div> 1907 <svg class="tr-trend" viewBox="0 0 220 82" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg"> 1908 <g class="grid"> 1909 <line x1="0" y1="2" x2="220" y2="2"/> 1910 <line x1="0" y1="28" x2="220" y2="28"/> 1911 <line x1="0" y1="54" x2="220" y2="54"/> 1912 <line x1="0" y1="80" x2="220" y2="80"/> 1913 </g> 1914 <polyline class="ln l1" points="0,20 37,16 73,11 110,3 147,9 183,5 220,4" pathLength="1000"/> 1915 <polyline class="ln l2" points="0,14 37,22 73,30 110,40 147,44 183,44 220,46" pathLength="1000"/> 1916 <polyline class="ln l3" points="0,30 37,36 73,44 110,52 147,54 183,56 220,58" pathLength="1000"/> 1917 <polyline class="ln l4" points="0,60 37,64 73,62 110,64 147,60 183,58 220,62" pathLength="1000"/> 1918 </svg> 1919 <div class="tr-legend"> 1920 <span class="li"><span class="d d1"></span>Embedded C/C++</span> 1921 <span class="li"><span class="d d2"></span>RTOS</span> 1922 <span class="li"><span class="d d3"></span>Device drivers</span> 1923 <span class="li"><span class="d d4"></span>Bluetooth LE</span> 1924 </div> 1925 </div> 1926 </div> 1927 1928 <div class="tr-row"> 1929 <div class="tr-card c3"> 1930 <div class="cap">Demand · job postings</div> 1931 <div class="ttl">Postings over last 8 quarters</div> 1932 <svg class="tr-post" viewBox="0 0 220 60" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg"> 1933 <g class="grid"> 1934 <line x1="0" y1="4" x2="220" y2="4"/> 1935 <line x1="0" y1="30" x2="220" y2="30"/> 1936 <line x1="0" y1="56" x2="220" y2="56"/> 1937 </g> 1938 <polyline class="ln" points="0,40 31,34 63,38 94,26 126,25 157,36 189,35 220,16" pathLength="1000"/> 1939 </svg> 1940 <div class="tr-axis"><span>Q2 ’24</span><span>Q4 ’24</span><span>Q2 ’25</span><span>Q4 ’25</span></div> 1941 </div> 1942 1943 <div class="tr-card c4"> 1944 <div class="cap">Demand · top locations</div> 1945 <div class="ttl">Postings & median by metro</div> 1946 <div class="tr-locs"> 1947 <div class="tr-loc"><span class="ln-name">San Jose, CA</span><span class="ln-posts">532</span><span class="ln-sal">$195.1K</span></div> 1948 <div class="tr-loc"><span class="ln-name">Los Angeles, CA</span><span class="ln-posts">309</span><span class="ln-sal">$167.7K</span></div> 1949 <div class="tr-loc"><span class="ln-name">Seattle, WA</span><span class="ln-posts">188</span><span class="ln-sal">$176.6K</span></div> 1950 <div class="tr-loc"><span class="ln-name">Boston, MA</span><span class="ln-posts">182</span><span class="ln-sal">$145.2K</span></div> 1951 </div> 1952 </div> 1953 </div> 1954 </div> 1955 1956 <!-- play / pause toggle (dev convenience) --> 1957 <button class="exp-toggle" id="exp-toggle" type="button" aria-label="Pause animation"> 1958 <svg class="ic-pause" viewBox="0 0 12 12"><rect x="2" y="1.5" width="2.6" height="9" rx="0.6"/><rect x="7.4" y="1.5" width="2.6" height="9" rx="0.6"/></svg>
1959 <svg class="ic-play" viewBox="0 0 12 12"><path d="M3.8 2.4 L10.8 6 L3.8 9.6 Z"/></svg> 1960 </button> 1961 1962</div><!-- /.stage --> 1963</div><!-- /.exp --> 1964</div><!-- /.exp-fit --> 1965
1966<script> 1967(function () { 1968 /* Scoped to this embed's root â safe if multiple embeds live on the page */ 1969 var root = document.getElementById('exp-stage'); 1970 var scenes = root.querySelectorAll('.scene'); 1971 var steps = root.querySelectorAll('.ribbon .step'); 1972 var btn = document.getElementById('exp-toggle'); 1973 1974 /* ââ responsive scaling ââ 1975 Scale the whole embed to its column's width (measured directly â robust in 1976 any layout). The wrapper's aspect-ratio reserves the matching height. */ 1977 var fit = root.closest('.exp-fit'); 1978 if (fit) { 1979 var nativeW = parseFloat(getComputedStyle(fit).getPropertyValue('--exp-w')) || 600; 1980 var rescale = function () { 1981 fit.style.setProperty('--exp-scale', (fit.clientWidth / nativeW).toFixed(4)); 1982 }; 1983 rescale(); 1984 if (window.ResizeObserver) new ResizeObserver(rescale).observe(fit); 1985 else window.addEventListener('resize', rescale); 1986 } 1987 1988 /* ââ read the --speed flag set at the top of the CSS ââ 1989 >0 scales both the scene timing AND every CSS animation/transition 1990 (via --dur-scale). 0 = static: reveal Scene 1 fully formed, no loop. */ 1991 var speed = parseFloat(getComputedStyle(root).getPropertyValue('--speed')); 1992 if (isNaN(speed)) speed = 1; 1993 var animate = speed > 0; 1994 root.style.setProperty('--dur-scale', animate ? (1 / speed) : 0); 1995 1996 /* show / hide the dev play-pause button (reads --show-toggle from the CSS) */ 1997 if (parseFloat(getComputedStyle(root).getPropertyValue('--show-toggle')) === 0) { 1998 btn.style.display = 'none'; 1999 } 2000 2001 var times = [7000, 8000, 7000].map(function (t) { /* base scene durations (ms) */ 2002 return animate ? t / speed : 0; 2003 }); 2004 2005 var cur = 0, timer = null, paused = false; 2006 2007 function show(i) { 2008 clearTimeout(timer); 2009 scenes.forEach(function (s, j) { s.classList.toggle('active', j === i); }); 2010 steps.forEach(function (s, j) { 2011 s.classList.remove('active', 'done'); 2012 if (j < i) s.classList.add('done'); 2013 else if (j === i) s.classList.add('active'); 2014 }); 2015 cur = i; 2016 if (animate && !paused) timer = setTimeout(next, times[i]); 2017 } 2018 function next() { show((cur + 1) % scenes.length); } 2019 2020 /* play / pause toggle (dev convenience â remove btn + this listener for production) */ 2021 btn.addEventListener('click', function () { 2022 paused = !paused; 2023 btn.classList.toggle('paused', paused); 2024 btn.setAttribute('aria-label', paused ? 'Play animation' : 'Pause animation'); 2025 root.classList.toggle('is-paused', paused); /* freezes all CSS motion */ 2026 if (paused) clearTimeout(timer); 2027 else if (animate) timer = setTimeout(next, times[cur]); /* resume current scene */ 2028 }); 2029 2030 /* Starts when scrolled into view, then fires once. 2031 To play immediately on page load instead, delete the observer 2032 block below and replace it with a single line: show(0); */ 2033 var observer = new IntersectionObserver(function (entries) { 2034 entries.forEach(function (entry) { 2035 if (entry.isIntersecting) { show(0); observer.disconnect(); } 2036 }); 2037 }, { threshold: 0.25 }); 2038 2039 observer.observe(root); 2040}()); 2041</script>
2041 2042</div></div></div><div class="persona-card bg-offwhite"><div class="persona-card_embed"><div class="w-embed w-script"><style> 2043/* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2044 PAYSCALE SMART REPORTING â Ask · Analyze · Decide (frameless embed) 2045 Everything is scoped under .smr so it can't collide with the page. 2046 Layout is tuned once at a fixed native size, then scaled uniformly. 2047 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 2048 2049.smr, .smr *, .smr *::before, .smr *::after { box-sizing: border-box; margin: 0; padding: 0; } 2050 2051.smr { 2052 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2053 â â± MOTION CONTROL â 2054 â --speed scales the WHOLE animation in proportion. The script â 2055 â at the bottom reads this one value. â 2056 â 0 = no animation (static â shows Scene 1 fully formed) â 2057 â 1 = baseline (current speed) â 2058 â 2 = 200% speed · 0.5 = half speed · etc. â 2059 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 2060 --speed: 1; 2061 --dur-scale: 1; /* derived from --speed by the script â don't edit directly */ 2062 2063 /* Dev play/pause button: 1 = show · 0 = hide */ 2064 --show-toggle: 0; 2065 2066 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2067 â ð¨ COLOR CONTROLS â change every color from right here â 2068 â Edit a swatch and every element using it updates. â 2069 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 2070 2071 /* â Brand swatches (Payscale palette) â */ 2072 --c-green: #E2FF65; /* Electric Green (brand) â CTA / key-stat highlight, used sparingly */ 2073 --c-teal: #23A4B5; /* Light Teal (brand) â supporting UI, chart ramp light end */ 2074 --c-techteal: #0A4444; /* Tech Teal (brand) â primary dark surface, borders, headings */ 2075 --c-midnight: #041E1E; /* Midnight (brand) â darkest, default body text */ 2076 --c-purple: #B399F8; /* Electric Purple (brand) â spare; kept away from green */ 2077 --c-aqua: #B9DCD3; /* Aqua Blue (brand) â soft fills, "done" state, secondary card */ 2078 --c-offwhite: #F4F2EA; /* Off-white (brand) â text on dark surfaces */ 2079 2080 /* â Custom shades / accents (not official brand swatches) â */ 2081 --c-teal-dk: #073333; /* deeper teal â dark end of the bar / qbar / outcome gradients */ 2082 --c-muted: #5C7575; /* muted gray-teal â captions, sub-labels */ 2083 --c-line: rgba(10,68,68,.12); /* hairline rules / inactive tracks */ 2084 2085 /* â Element gradients (built from the swatches above) â */ 2086 --grad-ribbon-active: linear-gradient(90deg, var(--c-techteal), var(--c-teal), var(--c-techteal)); /* active ribbon pill sweep */ 2087 --grad-bar: linear-gradient(90deg, var(--c-teal-dk), var(--c-teal)); /* chart bars â dark teal â teal */ 2088 --grad-qbar: linear-gradient(120deg, var(--c-techteal), var(--c-teal-dk)); /* Scene 2 query bar */ 2089 --grad-outcome: linear-gradient(150deg, var(--c-techteal), var(--c-teal-dk)); /* Scene 3 outcome card */ 2090 2091 /* â Card chrome (subtle, derived from Tech Teal) â */ 2092 --card-bg: #FFFFFF; 2093 --card-border: rgba(10,68,68,.14); 2094 --card-shadow: 0 2px 9px rgba(4,30,30,.07); 2095 2096 font-family: 'Inter', system-ui, sans-serif; 2097 -webkit-font-smoothing: antialiased; 2098 line-height: normal; 2099 display: inline-block; 2100} 2101 2102/* ââ Responsive wrapper ââââââââââââââââââââââââââââââââââââââââââââââ 2103 Drop the embed inside any flex column; it scales uniformly to fit that 2104 column's width, so the pixel-tuned layout is preserved at EVERY breakpoint 2105 (desktop 50/50, tablet/mobile stacked). Native size lives here as 2106 --smr-w / --smr-h; the stage reads them, the wrapper reserves the matching 2107 height via aspect-ratio, and the script sets --smr-scale from the column's 2108 real width. Caps at native size so it never upscales (stays crisp). 2109 To make it larger on wide screens, raise the max-width. */ 2110.smr-fit { 2111 --smr-w: 560; /* native width (px, unitless) */ 2112 --smr-h: 508; /* native height (px, unitless) â keep in step with the stage; sized to the tallest scene (Decide) */ 2113 position: relative; 2114 width: 100%; 2115 max-width: calc(var(--smr-w) * 1px); 2116 aspect-ratio: var(--smr-w) / var(--smr-h); 2117 margin: 0 auto; /* center within a wider column */ 2118 align-self: flex-start;/* don't vertically stretch if it's itself a flex item */ 2119} 2120.smr-fit .smr { 2121 position: absolute; top: 0; left: 0; 2122 transform-origin: top left; 2123 transform: scale(var(--smr-scale, 1)); 2124} 2125 2126/* Frameless stage â transparent. Native size comes from --smr-w / --smr-h. */ 2127.smr .stage { position: relative; width: calc(var(--smr-w, 560) * 1px); height: calc(var(--smr-h, 480) * 1px); } 2128 2129/* ââ keyframes (all prefixed smr-) ââ */ 2130@keyframes smr-sweep { 0%{background-position:0% 50%} 50%{background-position:100% 50%} 100%{background-position:0% 50%} } 2131@keyframes smr-fadeUp { from{opacity:0;transform:translateY(13px)} to{opacity:1;transform:translateY(0)} } 2132@keyframes smr-fade { from{opacity:0}
2132 to{opacity:1} } 2133@keyframes smr-scaleIn { from{opacity:0;transform:scale(.85)} to{opacity:1;transform:scale(1)} } 2134@keyframes smr-pop { from{opacity:0;transform:scale(.6)} to{opacity:1;transform:scale(1)} } 2135@keyframes smr-barGrow { from{transform:scaleX(0)} to{transform:scaleX(1)} } 2136@keyframes smr-pulse { 0%,100%{transform:scale(1);opacity:1} 50%{transform:scale(1.18);opacity:.8} } 2137@keyframes smr-blink { 0%,50%{opacity:1} 51%,100%{opacity:0} } 2138@keyframes smr-type { from{width:0} to{width:100%} } 2139@keyframes smr-typecap { from{max-width:0} to{max-width:100%} } /* reveal that stops at the text's own width, so a trailing caret rests right after the last character */ 2140@keyframes smr-draw { to{stroke-dashoffset:0} } 2141 2142/* ââ workflow ribbon (the single step indicator) ââ */ 2143.smr .ribbon { position: absolute; top: 16px; left: 16px; right: 16px; display: flex; align-items: center; gap: 6px; z-index: 20; } 2144.smr .ribbon .step { 2145 flex: 1; height: 32px; border-radius: 999px; 2146 border: 1.5px solid rgba(10,68,68,.25); /* inactive pill border */ 2147 background: var(--card-bg); /* inactive pill fill */ 2148 display: flex; align-items: center; padding: 0 12px; 2149 font-size: 12.5px; font-weight: 600; color: var(--c-muted); 2150 position: relative; z-index: 0; /* stacking context for the gradient overlay */ 2151 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out, border-color calc(.6s * var(--dur-scale,1)) ease-in-out; 2152 white-space: nowrap; overflow: hidden; 2153} 2154/* gradient overlay â crossfades in/out behind the label + number (color: --grad-ribbon-active) */ 2155.smr .ribbon .step::before { 2156 content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; 2157 background: var(--grad-ribbon-active); background-size: 200% 100%; 2158 opacity: 0; pointer-events: none; 2159 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out; /* fade-OUT â starts immediately */ 2160} 2161.smr .ribbon .step .num { 2162 width: 16px; height: 16px; border-radius: 50%; 2163 background: rgba(10,68,68,.1); color: var(--c-muted); 2164 font-size: 10px; font-weight: 700; 2165 display: flex; align-items: center; justify-content: center; 2166 margin-right: 8px; flex-shrink: 0; 2167 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out, color calc(.6s * var(--dur-scale,1)) ease-in-out; 2168} 2169/* active step â gradient fades IN delayed ~85% of the fade-out, so outgoing/incoming pills overlap ~15% */ 2170.smr .ribbon .step.active { 2171 border-color: transparent; color: var(--c-offwhite); 2172 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), 2173 border-color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 2174} 2175.smr .ribbon .step.active::before { 2176 opacity: 1; 2177 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); /* fade-IN â delayed */ 2178 animation: smr-sweep calc(3.4s * var(--dur-scale,1)) ease-in-out infinite; 2179} 2180.smr .ribbon .step.active .num { 2181 background: var(--c-green); color: var(--c-techteal); 2182 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 2183} 2184/* done step */ 2185.smr .ribbon .step.done { background: var(--c-aqua); border-color: var(--c-aqua); color: var(--c-techteal); } 2186.smr .ribbon .step.done .num { background: var(--c-techteal); color: var(--c-green); } 2187.smr .ribbon .step.done::after { content: "\2713"; font-size: 11px; font-weight: 700; color: var(--c-techteal); margin-left: auto; } 2188 2189/* ââ scenes ââ */ 2190.smr .scene { 2191 position: absolute; top: 60px; left: 16px; right: 16px; bottom: 16px; 2192 display: flex; flex-direction: column; 2193 opacity: 0; pointer-events: none; transition: opacity calc(.5s * var(--dur-scale,1)) ease; 2194} 2195.smr .scene.active { opacity: 1; } 2196 2197/* shared scene heading â 16px left pad lines the text up with the card body text below (cards sit at the scene edge with ~16px inner padding) */ 2198.smr .sc-label { font-family: 'Zodiak', Georgia, serif; font-size: 22px; font-weight: 600; letter-spacing: -.01em; color: var(--c-techteal); padding-left: 16px; } 2199.smr .sc-sub { font-size: 13px; color: var(--c-muted); line-height: 1.45; max-width: 92%; margin-top: 5px; padding-left: 16px; } 2200 2201/* âââââââââââ SCENE 1 â ASK âââââââââââ */ 2202.smr .ask-chat { 2203 margin-top: 16px; 2204 background: var(--card-bg); border: 1.5px solid var(--c-techteal); border-radius: 13px; 2205 box-shadow: var(--card-shadow); padding: 15px 17px; opacity: 0; 2206} 2207.smr .scene.active .ask-chat { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 2208.smr .ask-chat .q { display: flex; align-items: baseline; font-size: 13.5px; line-height: 1.3; } 2209.smr .ask-chat .spark { color: var(--c-teal); font-size: 14px; font-weight: 700; margin-right: 9px; flex-shrink: 0; } 2210.smr .ask-chat .qtext { color: var(--c-midnight); font-weight: 500; overflow: hidden; white-space: nowrap; display: inline-block; } 2211.smr .scene.active .ask-chat .qtext { animation: smr-typecap calc(1.7s * var(--dur-scale,1)) steps(42,end) calc(.6s * var(--dur-scale,1)) both; } 2212.smr .ask-chat .caret { display: inline-block; width: 1.5px; height: 13px; background: var(--c-techteal); margin-left: 2px; align-self: center; animation: smr-blink calc(.8s * var(--dur-scale,1)) step-end infinite; } 2213.smr .ask-chat .divider { height: 1px; background: var(--c-line); margin: 12px 0 11px; } 2214.smr .ask-chat .meta { display: flex; justify-content: space-between; align-items: center; } 2215.smr .ask-chat .about { font-size: 11.5px; color: var(--c-muted); } 2216.smr .ask-chat .about b { color: var(--c-techteal); font-weight: 600; } 2217.smr .ask-chat .ask-btn { background: var(--c-green); color: var(--c-midnight); border-radius: 999px; padding: 6px 16px; font-size: 11.5px; font-weight: 700; display: inline-flex; align-items: center; gap: 6px; } 2218.smr .ask-chat .ask-btn::before { content: "\25B6"; font-size: 8px; } 2219 2220.smr .tryask { font-size: 11px; color: var(--c-muted); font-weight: 600; letter-spacing: .06em; text-transform: uppercase; margin: 16px 0 9px 16px; opacity: 0; } 2221.smr .scene.active .tryask { animation: smr-fade calc(.5s * var(--dur-scale,1)) ease calc(2.3s * var(--dur-scale,1)) both; } 2222 2223/* suggested-question chips â a clean flex stack (no overlap, no hardcoded tops) */ 2224.smr .chips { display: flex; flex-direction: column; gap: 8px; } 2225.smr .chip { 2226 display: flex; align-items: center; gap: 9px; 2227 background: var(--card-bg); border: 1.5px solid var(--c-line); border-radius: 999px; 2228 padding: 8px 16px; font-size: 12px; font-weight: 500; color: var(--c-techteal); 2229 white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
2229 opacity: 0; 2230} 2231.smr .chip .ci { color: var(--c-teal); font-size: 12px; flex-shrink: 0; } 2232.smr .chip .ct { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } 2233.smr .scene.active .chip:nth-child(1) { animation: smr-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(2.55s * var(--dur-scale,1)) both; } 2234.smr .scene.active .chip:nth-child(2) { animation: smr-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(2.68s * var(--dur-scale,1)) both; } 2235.smr .scene.active .chip:nth-child(3) { animation: smr-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(2.81s * var(--dur-scale,1)) both; } 2236.smr .scene.active .chip:nth-child(4) { animation: smr-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(2.94s * var(--dur-scale,1)) both; } 2237.smr .scene.active .chip:nth-child(5) { animation: smr-fadeUp calc(.4s * var(--dur-scale,1)) ease calc(3.07s * var(--dur-scale,1)) both; } 2238 2239/* âââââââââââ SCENE 2 â ANALYZE âââââââââââ */ 2240.smr .qbar { 2241 margin-top: 16px; 2242 display: flex; align-items: center; 2243 background: var(--grad-qbar); color: var(--c-offwhite); 2244 border-radius: 999px; padding: 11px 16px; font-size: 13px; opacity: 0; 2245} 2246.smr .scene.active .qbar { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.15s * var(--dur-scale,1)) both; } 2247.smr .qbar .qdot { width: 9px; height: 9px; border-radius: 50%; background: var(--c-green); margin-right: 12px; flex-shrink: 0; } 2248.smr .scene.active .qbar .qdot { animation: smr-pulse calc(1.5s * var(--dur-scale,1)) ease-in-out infinite calc(.8s * var(--dur-scale,1)); } 2249.smr .qbar .qt { font-weight: 500; flex: 1; overflow: hidden; white-space: nowrap; } 2250.smr .scene.active .qbar .qt { animation: smr-type calc(1.5s * var(--dur-scale,1)) steps(44,end) calc(.55s * var(--dur-scale,1)) both; } 2251.smr .qbar .qgo { width: 26px; height: 26px; border-radius: 50%; background: var(--c-green); color: var(--c-midnight); font-size: 10px; font-weight: 700; display: flex; align-items: center; justify-content: center; margin-left: 10px; flex-shrink: 0; } 2252 2253.smr .a-row { display: flex; gap: 13px; margin-top: 18px; } 2254.smr .a-card { background: var(--card-bg); border: 1.5px solid var(--c-techteal); border-radius: 12px; box-shadow: var(--card-shadow); padding: 14px 16px; opacity: 0; } 2255.smr .a-card .head { font-size: 12px; font-weight: 700; color: var(--c-techteal); margin-bottom: 11px; display: flex; align-items: center; gap: 6px; } 2256.smr .a-card .head .hd-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--c-teal); flex-shrink: 0; } 2257 2258/* bar chart card */ 2259.smr .a-chart { flex: 1.7; } 2260.smr .scene.active .a-chart { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(2.1s * var(--dur-scale,1)) both; } 2261.smr .a-chart .row { display: flex; align-items: center; gap: 9px; margin-bottom: 7px; } 2262.smr .a-chart .row:last-child { margin-bottom: 0; } 2263.smr .a-chart .lbl { width: 70px; font-size: 10.5px; font-weight: 500; color: var(--c-midnight); text-align: right; flex-shrink: 0; } 2264.smr .a-chart .track { flex: 1; height: 8px; border-radius: 999px; background: rgba(10,68,68,.07); overflow: hidden; } 2265.smr .a-chart .fill { height: 100%; border-radius: 999px; background: var(--grad-bar); transform-origin: left; transform: scaleX(0); } 2266.smr .a-chart .pct { width: 42px; font-size: 10.5px; font-weight: 600; color: var(--c-muted); text-align: right; flex-shrink: 0; } 2267.smr .scene.active .a-chart .row:nth-child(2) .fill { animation: smr-barGrow calc(.7s * var(--dur-scale,1)) ease calc(2.5s * var(--dur-scale,1)) both; } 2268.smr .scene.active .a-chart .row:nth-child(3) .fill { animation: smr-barGrow calc(.7s * var(--dur-scale,1)) ease calc(2.62s * var(--dur-scale,1)) both; } 2269.smr .scene.active .a-chart .row:nth-child(4) .fill { animation: smr-barGrow calc(.7s * var(--dur-scale,1)) ease calc(2.74s * var(--dur-scale,1)) both; } 2270.smr .scene.active .a-chart .row:nth-child(5) .fill { animation: smr-barGrow calc(.7s * var(--dur-scale,1)) ease calc(2.86s * var(--dur-scale,1)) both; } 2271.smr .scene.active .a-chart .row:nth-child(6) .fill { animation: smr-barGrow calc(.7s * var(--dur-scale,1)) ease calc(2.98s * var(--dur-scale,1)) both; } 2272 2273/* sparkline card */ 2274.smr .a-spark { flex: 1; display: flex; flex-direction: column; } 2275.smr .scene.active .a-spark { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(2.3s * var(--dur-scale,1)) both; } 2276.smr .a-spark .stat { font-family: 'Zodiak', Georgia, serif; font-size: 30px; font-weight: 700; color: var(--c-techteal); line-height: 1; letter-spacing: -.02em; } 2277.smr .a-spark .statsub { font-size: 10px; color: var(--c-muted); margin-top: 5px; margin-bottom: 10px; line-height: 1.35; } 2278.smr .a-spark svg { width: 100%; height: 40px; margin-top: auto; display: block; } 2279.smr .a-spark .sk-line { fill: none; stroke: var(--c-techteal); stroke-width: 1.6; stroke-dasharray: 220; stroke-dashoffset: 220; } 2280.smr .scene.active .a-spark .sk-line { animation: smr-draw calc(1.1s * var(--dur-scale,1)) ease calc(2.7s * var(--dur-scale,1)) forwards; } 2281.smr .a-spark .sk-dot { opacity: 0; fill: var(--c-green); stroke: var(--c-techteal); stroke-width: 1; } 2282.smr .scene.active .a-spark .sk-dot { animation: smr-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(3.7s * var(--dur-scale,1)) both; } 2283 2284/* stat row */ 2285.smr .s-row { display: flex; gap: 13px; margin-top: 16px; } 2286.smr .s-card { flex: 1; border-radius: 11px; padding: 13px 15px; opacity: 0; } 2287.smr .s-card.feat { background: var(--c-green); } 2288.smr .s-card.soft { background: var(--c-offwhite); } 2289.smr .scene.active .s-card.feat { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(3.5s * var(--dur-scale,1)) both; } 2290.smr .scene.active .s-card.soft { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(3.62s * var(--dur-scale,1)) both; } 2291.smr .s-card .sl { font-size: 10px; font-weight: 600; color: var(--c-techteal); margin-bottom: 5px; } 2292.smr .s-card .sv { font-family: 'Zodiak', Georgia, serif; font-size: 25px; font-weight: 700; color: var(--c-midnight); line-height: 1; letter-spacing: -.015em; } 2293.smr .s-card .st { font-size: 10px; color: var(--c-midnight); margin-top: 5px; font-weight: 500; opacity: .8; display: flex; align-items: center; gap: 4px; } 2294 2295/* âââââââââââ SCENE 3 â DECIDE âââââââââââ */ 2296.smr .insights { display: flex; flex-direction: column; gap: 8px; margin-top: 16px; } 2297.smr .ins { 2298 background: var(--card-bg); border: 1.5px solid var(--c-techteal); border-radius: 11px; 2299 box-shadow: var(--card-shadow); padding: 12px 15px; opacity: 0; 2300} 2301.smr .ins.act { border-width: 2px; } 2302.smr .scene.active .ins:nth-child(1) { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.25s * var(--dur-scale,1)) both; } 2303.smr .scene.active .ins:nth-child(2) { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.55s * var(--dur-scale,1)) both; } 2304.smr .scene.active .ins:nth-child(3) { animation: smr-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.85s * var(--dur-scale,1)) both; } 2305.smr .ins .ihead { display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px; } 2306.smr .ins .ititle { font-size: 11.5px; font-weight: 700; color: var(--c-techteal); } 2307.smr .ins .tag { font-size: 9px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; padding: 3px 10px; border-radius: 999px; background: var(--c-aqua); color: var(--c-techteal); } 2308.smr .ins.act .tag { background: var(--c-green); color: var(--c-midnight); } 2309.smr .ins .ibody { font-size: 11.5px; color: var(--c-midnight); line-height: 1.4; } 2310.smr .ins .ibody b { color: var(--c-techteal); font-weight: 700; } 2311 2312/* outcome card (dark payoff) */ 2313.smr .outcome { margin-top: 14px; background: var(--grad-outcome); border-radius: 13px; padding: 17px 20px; color: var(--c-offwhite); opacity: 0; box-shadow: 0 6px 18px rgba(4,30,30,.18); } 2314.smr .scene.active .outcome { animation: smr-fadeUp calc(.55s * var(--dur-scale,1)) ease calc(1.5s * var(--dur-scale,1)) both; } 2315.smr .outcome .ol { font-size: 10px; font-weight: 600; letter-spacing: .16em; text-transform: uppercase; color: var(--c-aqua); margin-bottom: 6px; } 2316.smr .outcome .ot { font-family: 'Zodiak', Georgia, serif; font-size: 19px; font-weight: 600; line-height: 1.2; letter-spacing: -.01em; margin-bottom: 14px; } 2317.smr .outcome .ogrid { display: flex; gap: 26px; } 2318.smr .outcome .ogrid > div { flex: 1; } 2319.smr .outcome .ov { font-family: 'Zodiak', Georgia, serif; font-size: 24px; font-weight: 700; color: var(--c-green); line-height: 1; letter-spacing: -.01em; display: flex; align-items: center; gap: 5px; } 2320.smr .outcome .od { font-size: 10.5px; color: var(--c-offwhite); opacity: .82; margin-top: 6px; line-height: 1.35; } 2321.smr .scene.active .outcome .ov { animation: smr-scaleIn calc(.5s * var(--dur-scale,1)) cubic-bezier(.4,0,.2,1.4) both; } 2322.smr .scene.active .outcome .o1 .ov { animation-delay: calc(2s * var(--dur-scale,1)); } 2323.smr .scene.active .outcome .o2 .ov { animation-delay: calc(2.15s * var(--dur-scale,1)); } 2324 2325/* small up-triangle used in stat trends */ 2326.smr .up { display: inline-block; width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 7px solid currentColor; } 2327.smr .outcome .up { border-bottom-color: var(--c-green); } 2328 2329/* âââââââââââ play / pause toggle (dev convenience â delete this block + the 2330 <button> + the JS listener to remove it entirely for production) âââââââââââ */ 2331.smr .smr-toggle { 2332 position: absolute; bottom: 8px; right: 8px; z-index: 40; 2333 width: 24px; height: 24px; border-radius: 50%; padding: 0; 2334 border: 1px solid rgba(10,68,68,.2); background: rgba(255,255,255,.7); 2335 display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: .5; 2336 transition: opacity .2s ease, background .2s ease; 2337} 2338.smr .smr-toggle:hover { opacity: 1; background: #fff; } 2339.smr .smr-toggle svg { width: 11px; height: 11px; display: block; fill: var(--c-techteal); }
2340.smr .smr-toggle .ic-play { display: none; } 2341.smr .smr-toggle.paused .ic-pause { display: none; } 2342.smr .smr-toggle.paused .ic-play { display: block; } 2343/* when paused, freeze every animation in the embed so you get a still frame */ 2344.smr .stage.is-paused *, .smr .stage.is-paused *::before, .smr .stage.is-paused *::after { animation-play-state: paused !important; } 2345</style> 2346 2347<!-- ââââââââââââââââ 2348 â MARKUP â 2349 ââââââââââââââââ --> 2350<div class="smr-fit"> 2351<div class="smr"> 2352<div class="stage" id="smr-stage"> 2353 2354 <!-- Phase ribbon (single step indicator) --> 2355 <div class="ribbon"> 2356 <div class="step" data-step="0"><span class="num">1</span>Ask Anything</div> 2357 <div class="step" data-step="1"><span class="num">2</span>Analyze Insights</div> 2358 <div class="step" data-step="2"><span class="num">3</span>Drive Decisions</div> 2359 </div> 2360 2361 <!-- ââ SCENE 1: ASK ââ --> 2362 <div class="scene" id="smr-scene-0"> 2363 <div class="sc-label">Query data, in plain language</div> 2364 <div class="sc-sub">Ask the way you'd say it — get a report back.</div> 2365 2366 <div class="ask-chat"> 2367 <div class="q"> 2368 <span class="spark">✦</span> 2369 <span class="qtext">Generate a report showing pay equity by department</span> 2370 <span class="caret"></span> 2371 </div> 2372 <div class="divider"></div> 2373 <div class="meta"> 2374 <div class="about">Asking about: <b>Compensation data</b> ▾</div> 2375 <div class="ask-btn">Ask</div> 2376 </div> 2377 </div> 2378 2379 <div class="tryask">Try asking</div> 2380 <div class="chips"> 2381 <div class="chip"><span class="ci">✦</span><span class="ct">Average compa-ratio by job family?</span></div> 2382 <div class="chip"><span class="ci">✦</span><span class="ct">Top 10 jobs with low pay outliers?</span></div> 2383 <div class="chip"><span class="ci">✦</span><span class="ct">Who's paid below their range minimum?</span></div> 2384 <div class="chip"><span class="ci">✦</span><span class="ct">Which jobs aren't market-priced?</span></div> 2385 <div class="chip"><span class="ci">✦</span><span class="ct">New-hire vs. tenured pay in the same title?</span></div> 2386 </div> 2387 </div> 2388 2389 <!-- ââ SCENE 2: ANALYZE ââ --> 2390 <div class="scene" id="smr-scene-1"> 2391 <div class="sc-label">Surface key findings</div> 2392 <div class="sc-sub">Your question becomes a live, drillable report.</div> 2393 2394 <div class="qbar"> 2395 <span class="qdot"></span> 2396 <span class="qt">Show gender pay gaps by department, descending</span> 2397 <span class="qgo">▶</span> 2398 </div> 2399 2400 <div class="a-row"> 2401 <!-- bar chart --> 2402 <div class="a-card a-chart"> 2403 <div class="head"><span class="hd-dot"></span>Pay gap by department</div> 2404 <div class="row"><div class="lbl">Sales</div><div class="track"><div class="fill" style="width:96%"></div></div><div class="pct">−3.2%</div></div> 2405 <div class="row"><div class="lbl">Engineering</div><div class="track"><div class="fill" style="width:75%"></div></div><div class="pct">−2.4%</div></div> 2406 <div class="row"><div class="lbl">Marketing</div><div class="track"><div class="fill" style="width:58%"></div></div><div class="pct">−1.8%</div></div> 2407 <div class="row"><div class="lbl">Finance</div><div class="track"><div class="fill" style="width:38%"></div></div><div class="pct">−1.1%</div></div> 2408 <div class="row"><div class="lbl">Operations</div><div class="track"><div class="fill" style="width:24%"></div></div><div class="pct">−0.6%</div></div> 2409 </div> 2410 <!-- sparkline --> 2411 <div class="a-card a-spark"> 2412 <div class="head"><span class="hd-dot"></span>Avg. gap closed</div> 2413 <div class="stat">−2.1%</div> 2414 <div class="statsub">YoY across all departments</div> 2415 <svg viewBox="0 0 130 42" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg"> 2416 <defs> 2417 <linearGradient id="smr-spark" x1="0" x2="0" y1="0" y2="1"> 2418 <stop offset="0" stop-color="var(--c-teal)" stop-opacity="0.40"/> 2419 <stop offset="1" stop-color="var(--c-teal)" stop-opacity="0"/> 2420 </linearGradient> 2421 </defs> 2422 <path d="M0,30 C20,28 32,18 48,16 C66,14 80,22 96,12 C108,6 116,8 130,6 L130,42 L0,42 Z" fill="url(#smr-spark)"/> 2423 <path class="sk-line" d="M0,30 C20,28 32,18 48,16 C66,14 80,22 96,12 C108,6 116,8 130,6"/> 2424 <circle class="sk-dot" cx="125" cy="7" r="3"/> 2425 </svg> 2426 </div> 2427 </div> 2428 2429 <div class="s-row"> 2430 <div class="s-card feat"> 2431 <div class="sl">Employees above midpoint</div> 2432 <div class="sv">68.4%</div> 2433 <div class="st"><span class="up"></span>4.2 pts vs last quarter</div> 2434 </div> 2435 <div class="s-card soft"> 2436 <div class="sl">Roles ready to price</div> 2437 <div class="sv">1,247</div> 2438 <div class="st">Updated this morning</div> 2439 </div> 2440 </div> 2441 </div> 2442 2443 <!-- ââ SCENE 3: DECIDE ââ --> 2444 <div class="scene" id="smr-scene-2"> 2445 <div class="sc-label">Benchmark with confidence</div> 2446 <div class="sc-sub">Analysis becomes a defensible, costed action plan.</div> 2447 2448 <div class="insights"> 2449 <div class="ins"> 2450 <div class="ihead"><div class="ititle">Market intelligence</div><div class="tag">Insight</div></div> 2451 <div class="ibody">Engineering salaries trail market by <b>3.8%</b> — top-quartile risk in 14 roles.</div> 2452 </div> 2453 <div class="ins"> 2454 <div class="ihead"><div class="ititle">Pay equity signal</div><div class="tag">Insight</div></div> 2455 <div class="ibody">Gap closing fastest in Marketing — <b>−1.8% YoY</b>. Sales needs attention next.</div> 2456 </div> 2457 <div class="ins act"> 2458 <div class="ihead"><div class="ititle">Recommended action</div><div class="tag">Act now</div></div> 2459 <div class="ibody">Allocate <b>$420K</b> across 14 engineering roles to close the gap and protect retention.</div> 2460 </div> 2461 </div> 2462 2463 <div class="outcome"> 2464 <div class="ol">Projected outcome</div> 2465 <div class="ot">Retention up. Risk down. Budget defended.</div> 2466 <div class="ogrid"> 2467 <div class="o1"> 2468 <div class="ov"><span class="up"></span>22%</div> 2469 <div class="od">Lower flight risk for top performers</div> 2470 </div> 2471 <div class="o2"> 2472 <div class="ov">$1.4M</div> 2473 <div class="od">Avoided cost of unwanted attrition</div> 2474 </div> 2475 </div> 2476 </div> 2477 </div> 2478 2479 <!-- play / pause toggle (dev convenience) --> 2480 <button class="smr-toggle" id="smr-toggle" type="button" aria-label="Pause animation"> 2481 <svg class="ic-pause" viewBox="0 0 12 12"><rect x="2" y="1.5" width="2.6" height="9" rx="0.6"/><rect x="7.4" y="1.5" width="2.6" height="9" rx="0.6"/></svg>
2482 <svg class="ic-play" viewBox="0 0 12 12"><path d="M3.8 2.4 L10.8 6 L3.8 9.6 Z"/></svg> 2483 </button> 2484 2485</div><!-- /.stage --> 2486</div><!-- /.smr --> 2487</div><!-- /.smr-fit --> 2488
2489<script> 2490(function () { 2491 /* Scoped to this embed's root â safe if multiple embeds live on the page */ 2492 var root = document.getElementById('smr-stage'); 2493 var scenes = root.querySelectorAll('.scene'); 2494 var steps = root.querySelectorAll('.ribbon .step'); 2495 var btn = document.getElementById('smr-toggle'); 2496 2497 /* ââ responsive scaling ââ 2498 Scale the whole embed to its column's width (measured directly â robust in 2499 any layout). The wrapper's aspect-ratio reserves the matching height. */ 2500 var fit = root.closest('.smr-fit'); 2501 if (fit) { 2502 var nativeW = parseFloat(getComputedStyle(fit).getPropertyValue('--smr-w')) || 560; 2503 var rescale = function () { 2504 fit.style.setProperty('--smr-scale', (fit.clientWidth / nativeW).toFixed(4)); 2505 }; 2506 rescale(); 2507 if (window.ResizeObserver) new ResizeObserver(rescale).observe(fit); 2508 else window.addEventListener('resize', rescale); 2509 } 2510 2511 /* ââ read the --speed flag set at the top of the CSS ââ 2512 >0 scales both the scene timing AND every CSS animation/transition 2513 (via --dur-scale). 0 = static: reveal Scene 1 fully formed, no loop. */ 2514 var speed = parseFloat(getComputedStyle(root).getPropertyValue('--speed')); 2515 if (isNaN(speed)) speed = 1; 2516 var animate = speed > 0; 2517 root.style.setProperty('--dur-scale', animate ? (1 / speed) : 0); 2518 2519 /* show / hide the dev play-pause button (reads --show-toggle from the CSS) */ 2520 if (parseFloat(getComputedStyle(root).getPropertyValue('--show-toggle')) === 0) { 2521 btn.style.display = 'none'; 2522 } 2523 2524 var times = [7400, 7200, 6800].map(function (t) { /* base scene durations (ms) */ 2525 return animate ? t / speed : 0; 2526 }); 2527 2528 var cur = 0, timer = null, paused = false; 2529 2530 function show(i) { 2531 clearTimeout(timer); 2532 scenes.forEach(function (s, j) { s.classList.toggle('active', j === i); }); 2533 steps.forEach(function (s, j) { 2534 s.classList.remove('active', 'done'); 2535 if (j < i) s.classList.add('done'); 2536 else if (j === i) s.classList.add('active'); 2537 }); 2538 cur = i; 2539 if (animate && !paused) timer = setTimeout(next, times[i]); 2540 } 2541 function next() { show((cur + 1) % scenes.length); } 2542 2543 /* play / pause toggle (dev convenience â remove btn + this listener for production) */ 2544 btn.addEventListener('click', function () { 2545 paused = !paused; 2546 btn.classList.toggle('paused', paused); 2547 btn.setAttribute('aria-label', paused ? 'Play animation' : 'Pause animation'); 2548 root.classList.toggle('is-paused', paused); /* freezes all CSS motion */ 2549 if (paused) clearTimeout(timer); 2550 else if (animate) timer = setTimeout(next, times[cur]); /* resume current scene */ 2551 }); 2552 2553 /* Starts when scrolled into view, then fires once. 2554 To play immediately on page load instead, delete the observer 2555 block below and replace it with a single line: show(0); */ 2556 var observer = new IntersectionObserver(function (entries) { 2557 entries.forEach(function (entry) { 2558 if (entry.isIntersecting) { show(0); observer.disconnect(); } 2559 }); 2560 }, { threshold: 0.25 }); 2561 2562 observer.observe(root); 2563}()); 2564</script>
2564</div></div><div class="persona-card_content"><div class="persona-card_content_rt w-richtext"><h3>Get answers in seconds. Build reports that actually land.</h3><p><br/>Ask complex compensation questions in plain language and get instant, AI-powered answers â or build the exact dashboards and reports leadership needs without living in Excel.<br/>â</p><ul role="list"><li>Stop wrestling with spreadsheets. Ask in plain language and get clear, governed answers in seconds â powered by Payscaleâs compensation-trained AI</li><li>Build robust, configurable reports and dashboards designed for leadership storytelling</li><li>Access expert-curated standard reports built on proven compensation best practices</li></ul></div><div class="w-layout-hflex button-text-group"><div aria-roledescription="open-modal-trigger" class="btn" data-wf--cta-button---popup--variant="primary" role="button" aria-controls="button-popup" ariahaspopup="dialog" fs-modal-element="open-1" aria-expanded="false" tabindex="0"><div class="text-block-36">Get a Demo</div></div></div></div></div><div class="persona-card bg-offwhite"><div class="persona-card_content"><div class="persona-card_content_rt w-richtext"><h3>Turn compensation into competitive advantage</h3><p><br/>Get continuous visibility into how your compensation program is performing across four strategic dimensions: Investment, Competitiveness, Workforce Health, and Job Architecture. Know where youâre strong, where youâre exposed, and what to fix next.<br/>â</p><ul role="list"><li>Walk into leadership conversations with clear positioning you can defend</li><li>Spot which workforce segments are supporting your strategy â and which ones are at risk</li><li>Get actionable recommendations tied directly to your data, not generic benchmarks</li></ul></div><div class="w-layout-hflex button-text-group"><div aria-roledescription="open-modal-trigger" class="btn" data-wf--cta-button---popup--variant="primary" role="button" aria-controls="button-popup" ariahaspopup="dialog" fs-modal-element="open-1" aria-expanded="false" tabindex="0"><div class="text-block-36">Get a Demo</div></div></div></div><div class="persona-card_embed"><div class="w-embed w-script"><style> 2565/* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2566 PAYSCALE COMPASS â Orientation · Indicators · Trends · Signals 2567 Frameless Webflow embed. Everything is scoped under .cmp so it can't 2568 collide with the page. Layout is tuned once at a fixed native size, 2569 then scaled uniformly to whatever column width it's dropped into. 2570 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 2571 2572.cmp, .cmp *, .cmp *::before, .cmp *::after { box-sizing: border-box; margin: 0; padding: 0; } 2573 2574.cmp { 2575 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2576 â â± MOTION CONTROL â 2577 â --speed scales the WHOLE animation in proportion. The script â 2578 â at the bottom reads this one value. â 2579 â 0 = no animation (static â shows Scene 1 fully formed) â 2580 â 1 = baseline (current speed) â 2581 â 2 = 200% speed · 0.5 = half speed · etc. â 2582 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 2583 --speed: 1.2; 2584 --dur-scale: 1; /* derived from --speed by the script â don't edit directly */ 2585 2586 /* Dev play/pause button: 1 = show · 0 = hide */ 2587 --show-toggle: 0; 2588 2589 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2590 â ð¨ COLOR CONTROLS â change every color from right here â 2591 â Edit a swatch and every element using it updates. â 2592 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 2593 2594 /* â Brand swatches (Payscale palette) â */ 2595 --c-green: #E2FF65; /* Electric Green (brand) â highlight / "leading" / CTA, used sparingly */ 2596 --c-teal: #23A4B5; /* Light Teal (brand) â Investment series, polygon, links */ 2597 --c-techteal: #0A4444; /* Tech Teal (brand) â Health series, headings, borders, dark surfaces */ 2598 --c-midnight: #041E1E; /* Midnight (brand) â default body text */ 2599 --c-purple: #B399F8; /* Electric Purple (brand) â Competitiveness series + "attention" state */ 2600 --c-aqua: #B9DCD3; /* Aqua Blue (brand) â "aligned" / neutral fills, done state */ 2601 --c-offwhite: #F4F2EA; /* Off-white (brand) â text on dark surfaces, soft fills */ 2602 2603 /* â Custom shades / accents (NOT official brand swatches) â */ 2604 --c-teal-dk: #073333; /* deeper teal â dark end of tonal track gradients */ 2605 --c-cyan: #4FD4C4; /* bright cyan-teal â Architecture series (the 4th distinct line) */ 2606 --c-green-dk: #B8E228; /* deeper lime â dark end of the check-badge gradient */ 2607 --c-purple-dk: #7C57DE; /* deeper purple â readable purple text on tints */ 2608 --c-purple-tint:#EDE5FC; /* soft lavender â "trailing"/attention pill background */ 2609 --c-muted: #5C7575; /* muted gray-teal â captions, sub-labels, axis labels */ 2610 --c-line: rgba(10,68,68,.12); /* hairlines, inactive tracks, chart grid */ 2611 --c-track: rgba(10,68,68,.08); /* benchmark-bar track fill */ 2612 2613 /* â Series colors (the 4 indicators â SINGLE SOURCE OF TRUTH) â 2614 reused by the radar dots, indicator cards, trend lines and legend so the 2615 colorâindicator mapping stays identical across every scene. */ 2616 --s-invest: var(--c-teal); /* Investment */ 2617 --s-compet: var(--c-purple); /* Competitiveness */ 2618 --s-health: var(--c-techteal); /* Health */ 2619 --s-arch: var(--c-cyan); /* Architecture */ 2620 2621 /* â Element gradients (built from the swatches above) â */ 2622 --grad-ribbon-active: linear-gradient(90deg, var(--c-techteal), var(--c-teal), var(--c-techteal)); /* active ribbon pill sweep */ 2623 --grad-track: linear-gradient(90deg, var(--c-aqua), var(--c-teal)); /* benchmark-bar fill â aqua â teal */ 2624 --grad-check: linear-gradient(135deg, var(--c-green), var(--c-green-dk)); /* Scene 4 confirmed-segment check badge */ 2625 2626 /* â Card chrome (subtle, derived from Tech Teal) â */ 2627 --card-bg: #FFFFFF; 2628 --card-border: rgba(10,68,68,.14); 2629 --card-shadow: 0 2px 9px rgba(4,30,30,.07); 2630 2631 font-family: 'Inter', system-ui, sans-serif; 2632 -webkit-font-smoothing: antialiased; 2633 line-height: normal; 2634 display: inline-block; 2635} 2636 2637/* ââ Responsive wrapper ââââââââââââââââââââââââââââââââââââââââââââââ 2638 Drop the embed inside any flex column; it scales uniformly to fit that 2639 column's width, so the pixel-tuned layout is preserved at EVERY breakpoint 2640 (desktop 50/50, tablet/mobile stacked). Native size lives here as 2641 --cmp-w / --cmp-h; the stage reads them, the wrapper reserves the matching 2642 height via aspect-ratio, and the script sets --cmp-scale from the column's 2643 real width. Caps at native size so it never upscales (stays crisp). 2644 To make it larger on wide screens, raise the max-width. */ 2645.cmp-fit {
2646 --cmp-w: 580; /* native width (px, unitless) */ 2647 --cmp-h: 528; /* native height (px, unitless) â sized to the tallest scene (Signals) with a small bottom margin */ 2648 position: relative; 2649 width: 100%; 2650 max-width: calc(var(--cmp-w) * 1px); 2651 aspect-ratio: var(--cmp-w) / var(--cmp-h); 2652 margin: 0 auto; /* center within a wider column */ 2653 align-self: flex-start;/* don't vertically stretch if it's itself a flex item */ 2654} 2655.cmp-fit .cmp { 2656 position: absolute; top: 0; left: 0; 2657 transform-origin: top left; 2658 transform: scale(var(--cmp-scale, 1)); 2659} 2660 2661/* Frameless stage â transparent. Native size comes from --cmp-w / --cmp-h. */ 2662.cmp .stage { position: relative; width: calc(var(--cmp-w, 580) * 1px); height: calc(var(--cmp-h, 556) * 1px); } 2663 2664/* ââ keyframes (all prefixed cmp-) ââ */ 2665@keyframes cmp-sweep { 0%{background-position:0% 50%} 50%{background-position:100% 50%} 100%{background-position:0% 50%} } 2666@keyframes cmp-fadeUp { from{opacity:0;transform:translateY(13px)} to{opacity:1;transform:translateY(0)} } 2667@keyframes cmp-fade { from{opacity:0} to{opacity:1} } 2668@keyframes cmp-pop { from{opacity:0;transform:scale(.55)} to{opacity:1;transform:scale(1)} } 2669@keyframes cmp-popk { from{opacity:0;transform:translate(-50%,-50%) scale(.55)} to{opacity:1;transform:translate(-50%,-50%) scale(1)} } 2670@keyframes cmp-barGrow { from{transform:scaleX(0)} to{transform:scaleX(1)} } 2671@keyframes cmp-draw { to{stroke-dashoffset:0} } 2672@keyframes cmp-polyFill{ to{fill-opacity:.16} } 2673@keyframes cmp-pulse { 0%,100%{transform:scale(1);opacity:1} 50%{transform:scale(1.16);opacity:.82} } 2674 2675/* ââ workflow ribbon (the single step indicator) ââ */ 2676.cmp .ribbon { position: absolute; top: 16px; left: 16px; right: 16px; display: flex; align-items: center; gap: 6px; z-index: 20; } 2677.cmp .ribbon .step { 2678 flex: 1; height: 32px; border-radius: 999px; 2679 border: 1.5px solid rgba(10,68,68,.25); /* inactive pill border */ 2680 background: var(--card-bg); /* inactive pill fill */ 2681 display: flex; align-items: center; padding: 0 11px; 2682 font-size: 12px; font-weight: 600; color: var(--c-muted); 2683 position: relative; z-index: 0; /* stacking context for the gradient overlay */ 2684 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out, border-color calc(.6s * var(--dur-scale,1)) ease-in-out; 2685 white-space: nowrap; overflow: hidden; 2686} 2687/* gradient overlay â crossfades in/out behind the label + number (color: --grad-ribbon-active) */ 2688.cmp .ribbon .step::before { 2689 content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; 2690 background: var(--grad-ribbon-active); background-size: 200% 100%; 2691 opacity: 0; pointer-events: none; 2692 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out; /* fade-OUT â starts immediately */ 2693} 2694.cmp .ribbon .step .num { 2695 width: 16px; height: 16px; border-radius: 50%; 2696 background: rgba(10,68,68,.1); color: var(--c-muted); 2697 font-size: 10px; font-weight: 700; 2698 display: flex; align-items: center; justify-content: center; 2699 margin-right: 7px; flex-shrink: 0; 2700 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out, color calc(.6s * var(--dur-scale,1)) ease-in-out; 2701} 2702/* active step â gradient fades IN delayed ~85% of the fade-out, so outgoing/incoming pills overlap ~15% */ 2703.cmp .ribbon .step.active { 2704 border-color: transparent; color: var(--c-offwhite); 2705 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), 2706 border-color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 2707} 2708.cmp .ribbon .step.active::before { 2709 opacity: 1; 2710 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); /* fade-IN â delayed */ 2711 animation: cmp-sweep calc(3.4s * var(--dur-scale,1)) ease-in-out infinite; 2712} 2713.cmp .ribbon .step.active .num { 2714 background: var(--c-green); color: var(--c-techteal); 2715 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 2716} 2717/* done step */
2718.cmp .ribbon .step.done { background: var(--c-aqua); border-color: var(--c-aqua); color: var(--c-techteal); } 2719.cmp .ribbon .step.done .num { background: var(--c-techteal); color: var(--c-green); } 2720.cmp .ribbon .step.done::after { content: "\2713"; font-size: 11px; font-weight: 700; color: var(--c-techteal); margin-left: auto; } 2721 2722/* ââ scenes ââ */ 2723.cmp .scene { 2724 position: absolute; top: 60px; left: 16px; right: 16px; bottom: 16px; 2725 display: flex; flex-direction: column; 2726 opacity: 0; pointer-events: none; transition: opacity calc(.5s * var(--dur-scale,1)) ease; 2727} 2728.cmp .scene.active { opacity: 1; } 2729 2730/* shared scene heading */ 2731.cmp .sc-label { font-family: 'Zodiak', Georgia, serif; font-size: 22px; font-weight: 600; letter-spacing: -.01em; color: var(--c-techteal); padding-left: 4px; } 2732.cmp .sc-sub { font-size: 13px; color: var(--c-muted); line-height: 1.45; max-width: 94%; margin-top: 5px; padding-left: 4px; } 2733 2734/* âââââââââ SCENE 1 â ORIENTATION (compass / radar) âââââââââ */ 2735.cmp .orient { flex: 1; display: flex; align-items: center; justify-content: center; margin-top: 4px; opacity: 0; } 2736.cmp .scene.active .orient { animation: cmp-fade calc(.5s * var(--dur-scale,1)) ease calc(.1s * var(--dur-scale,1)) both; } 2737.cmp .orient svg { width: 100%; height: 100%; max-width: 472px; overflow: visible; } 2738 2739.cmp .o-ring { fill: none; stroke: var(--c-techteal); stroke-opacity: .1; stroke-width: 1; opacity: 0; } 2740.cmp .o-disc { fill: var(--card-bg); filter: drop-shadow(0 3px 12px rgba(4,30,30,.10)); } /* opaque white field behind the compass so it lifts off the page */ 2741.cmp .scene.active .o-ring { animation: cmp-fade calc(.6s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 2742.cmp .o-axes { stroke: var(--c-techteal); stroke-opacity: .12; stroke-width: 1; stroke-dasharray: 3 4; opacity: 0; } 2743.cmp .scene.active .o-axes { animation: cmp-fade calc(.6s * var(--dur-scale,1)) ease calc(.3s * var(--dur-scale,1)) both; } 2744 2745.cmp .o-axis-label { font-size: 11px; font-weight: 700; letter-spacing: .06em; fill: var(--c-techteal); opacity: 0; } 2746.cmp .scene.active .o-axis-label.a1 { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(.45s * var(--dur-scale,1)) both; } 2747.cmp .scene.active .o-axis-label.a2 { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(.6s * var(--dur-scale,1)) both; } 2748.cmp .scene.active .o-axis-label.a3 { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(.75s * var(--dur-scale,1)) both; } 2749.cmp .scene.active .o-axis-label.a4 { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(.9s * var(--dur-scale,1)) both; } 2750 2751.cmp .o-poly { fill: var(--c-teal); fill-opacity: 0; stroke: var(--c-teal); stroke-width: 2; stroke-linejoin: round; stroke-dasharray: 620; stroke-dashoffset: 620; } 2752.cmp .scene.active .o-poly { animation: cmp-draw calc(1.5s * var(--dur-scale,1)) ease-out calc(1.1s * var(--dur-scale,1)) forwards, cmp-polyFill calc(.6s * var(--dur-scale,1)) ease-out calc(2.2s * var(--dur-scale,1)) forwards; } 2753 2754.cmp .o-dot { opacity: 0; transform-box: fill-box; transform-origin: center; } 2755.cmp .scene.active .o-dot { animation: cmp-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) both; } 2756.cmp .scene.active .o-dot.d1 { animation-delay: calc(1.35s * var(--dur-scale,1)); } 2757.cmp .scene.active .o-dot.d2 { animation-delay: calc(1.5s * var(--dur-scale,1)); } 2758.cmp .scene.active .o-dot.d3 { animation-delay: calc(1.65s * var(--dur-scale,1)); } 2759.cmp .scene.active .o-dot.d4 { animation-delay: calc(1.8s * var(--dur-scale,1)); } 2760 2761.cmp .o-pct { font-size: 11px; font-weight: 700; fill: var(--c-techteal); opacity: 0; } 2762.cmp .scene.active .o-pct.p1 { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(1.5s * var(--dur-scale,1)) both; } 2763.cmp .scene.active .o-pct.p2 { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(1.65s * var(--dur-scale,1)) both; } 2764.cmp .scene.active .o-pct.p3 { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(1.8s * var(--dur-scale,1)) both; } 2765.cmp .scene.active .o-pct.p4 { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(1.95s * var(--dur-scale,1)) both; } 2766 2767.cmp .o-center { opacity: 0; } 2768.cmp .scene.active .o-center { animation: cmp-pop calc(.5s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(.9s * var(--dur-scale,1)) both; } 2769.cmp .o-center .o-core { animation: cmp-pulse calc(2.6s * var(--dur-scale,1)) ease-in-out infinite calc(2.4s * var(--dur-scale,1)); transform-box: fill-box; transform-origin: center; } 2770 2771.cmp .o-cap { margin-top: 6px; text-align: center; font-size: 12px; color: var(--c-muted); font-style: italic;
2771 opacity: 0; padding: 0 8px; } 2772.cmp .scene.active .o-cap { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(2.4s * var(--dur-scale,1)) both; } 2773 2774/* âââââââââ SCENE 2 â INDICATORS (4 cards) âââââââââ */ 2775.cmp .ind-grid { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 16px; } 2776.cmp .ind { 2777 width: calc(50% - 6px); background: var(--card-bg); border: 1.5px solid var(--card-border); 2778 border-radius: 12px; box-shadow: var(--card-shadow); padding: 14px 16px 15px; 2779 position: relative; overflow: hidden; opacity: 0; 2780} 2781.cmp .ind .accent { position: absolute; top: 0; left: 0; right: 0; height: 4px; } 2782.cmp .ind.c1 .accent { background: var(--s-invest); } 2783.cmp .ind.c2 .accent { background: var(--s-compet); } 2784.cmp .ind.c3 .accent { background: var(--s-health); } 2785.cmp .ind.c4 .accent { background: var(--s-arch); } 2786.cmp .scene.active .ind.c1 { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.25s * var(--dur-scale,1)) both; } 2787.cmp .scene.active .ind.c2 { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.42s * var(--dur-scale,1)) both; } 2788.cmp .scene.active .ind.c3 { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.59s * var(--dur-scale,1)) both; } 2789.cmp .scene.active .ind.c4 { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.76s * var(--dur-scale,1)) both; } 2790 2791.cmp .ind .title { font-size: 11.5px; font-weight: 600; color: var(--c-midnight); margin-top: 4px; } 2792.cmp .ind .pct { font-family: 'Zodiak', Georgia, serif; font-size: 34px; font-weight: 700; color: var(--c-techteal); letter-spacing: -.02em; line-height: 1; margin-top: 4px; } 2793.cmp .ind .status { display: inline-block; margin-top: 9px; padding: 4px 11px; border-radius: 999px; font-size: 9px; font-weight: 700; letter-spacing: .09em; } 2794.cmp .ind .status.lead { background: var(--c-green); color: var(--c-midnight); } 2795.cmp .ind .status.align { background: var(--c-aqua); color: var(--c-techteal); } 2796.cmp .ind .status.trail { background: var(--c-purple-tint); color: var(--c-purple-dk); } 2797 2798.cmp .ind .bar-wrap { margin-top: 12px; } 2799.cmp .ind .bar-label { font-size: 8px; font-weight: 700; letter-spacing: .12em; color: var(--c-muted); margin-bottom: 6px; } 2800.cmp .ind .track { position: relative; height: 8px; border-radius: 999px; background: var(--c-track); } 2801.cmp .ind .fill { height: 100%; border-radius: 999px; background: var(--grad-track); transform-origin: left; transform: scaleX(0); } 2802.cmp .ind .knob { 2803 position: absolute; top: 50%; width: 13px; height: 13px; border-radius: 50%; 2804 background: #fff; transform: translate(-50%,-50%) scale(0); 2805 box-shadow: 0 1px 4px rgba(4,30,30,.25); 2806} 2807.cmp .ind.c1 .knob { border: 3px solid var(--s-invest); } 2808.cmp .ind.c2 .knob { border: 3px solid var(--s-compet); } 2809.cmp .ind.c3 .knob { border: 3px solid var(--s-health); } 2810.cmp .ind.c4 .knob { border: 3px solid var(--s-arch); } 2811.cmp .scene.active .ind.c1 .fill { animation: cmp-barGrow calc(.7s * var(--dur-scale,1)) ease calc(.7s * var(--dur-scale,1)) both; } 2812.cmp .scene.active .ind.c2 .fill { animation: cmp-barGrow calc(.7s * var(--dur-scale,1)) ease calc(.87s * var(--dur-scale,1)) both; } 2813.cmp .scene.active .ind.c3 .fill { animation: cmp-barGrow calc(.7s * var(--dur-scale,1)) ease calc(1.04s* var(--dur-scale,1)) both; } 2814.cmp .scene.active .ind.c4 .fill { animation: cmp-barGrow calc(.7s * var(--dur-scale,1)) ease calc(1.21s* var(--dur-scale,1)) both; } 2815.cmp .scene.active .ind.c1 .knob { animation: cmp-popk calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(1.15s * var(--dur-scale,1)) both; } 2816.cmp .scene.active .ind.c2 .knob { animation: cmp-popk calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(1.32s * var(--dur-scale,1)) both; } 2817.cmp .scene.active .ind.c3 .knob { animation: cmp-popk calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(1.49s * var(--dur-scale,1)) both; } 2818.cmp .scene.active .ind.c4 .knob { animation: cmp-popk calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(1.66s * var(--dur-scale,1)) both; } 2819 2820/* âââââââââ SCENE 3 â TRENDS (multi-line history) âââââââââ */ 2821.cmp .trend-card { 2822 margin-top: 16px; flex: 1; display: flex; flex-direction: column; 2823 background: var(--card-bg); border: 1.5px solid var(--card-border); 2824 border-radius: 13px; box-shadow: var(--card-shadow); padding: 16px 18px 14px; opacity: 0; 2825} 2826.cmp .scene.active .trend-card { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 2827.cmp .trend-card .head { font-size: 12px; font-weight: 700; color: var(--c-techteal); display: flex; align-items: center; gap: 6px; } 2828.cmp .trend-card .head .hd-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--c-teal); flex-shrink: 0; } 2829.cmp .trend-card .sub { font-size: 10.5px; color: var(--c-muted); margin-top: 3px; } 2830 2831.cmp .chart { flex: 1; display: flex; align-items: center; margin-top: 10px; min-height: 0; } 2832.cmp .plot { position: relative; width: 100%; } 2833.cmp .plot svg { width: 100%; height: auto; display: block; overflow: visible; } 2834.cmp .chart .grid { stroke: var(--c-techteal); stroke-opacity: .07; stroke-width: 1; } 2835.cmp .chart .axis { font-size: 13px; font-weight: 600; fill: var(--c-muted); } 2836 2837.cmp .chart .line { fill: none; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 760; stroke-dashoffset: 760; } 2838.cmp .chart .line.l1 { stroke: var(--s-invest); } 2839.cmp .chart .line.l2 { stroke: var(--s-compet); } 2840.cmp .chart .line.l3 { stroke: var(--s-health); } 2841.cmp .chart .line.l4 { stroke: var(--s-arch); } 2842.cmp .scene.active .chart .line.l1 { animation: cmp-draw calc(1.3s * var(--dur-scale,1)) ease-out calc(.55s * var(--dur-scale,1)) forwards; } 2843.cmp .scene.active .chart .line.l2 { animation: cmp-draw calc(1.3s * var(--dur-scale,1)) ease-out calc(.72s * var(--dur-scale,1)) forwards; } 2844.cmp .scene.active .chart .line.l3 { animation: cmp-draw calc(1.3s * var(--dur-scale,1)) ease-out calc(.89s * var(--dur-scale,1)) forwards; } 2845.cmp .scene.active .chart .line.l4 { animation: cmp-draw calc(1.3s * var(--dur-scale,1)) ease-out calc(1.06s* var(--dur-scale,1)) forwards; } 2846.cmp .chart .endpt { opacity: 0; transform-box: fill-box; transform-origin: center; } 2847.cmp .scene.active .chart .endpt.e1 { animation: cmp-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(1.75s * var(--dur-scale,1)) both; } 2848.cmp .scene.active .chart .endpt.e2 { animation: cmp-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(1.9s * var(--dur-scale,1)) both; } 2849.cmp .scene.active .chart .endpt.e3 { animation: cmp-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(2.05s * var(--dur-scale,1)) both; } 2850.cmp .scene.active .chart .endpt.e4 { animation: cmp-pop calc(.4s * var(--dur-scale,1)) cubic-bezier(.34,1.56,.64,1) calc(2.2s * var(--dur-scale,1)) both; } 2851 2852.cmp .tip { 2853 position: absolute; right: 0; top: 0; 2854 background: var(--card-bg); border: 1.5px solid var(--c-techteal); border-radius: 10px; 2855 padding: 9px 12px; box-shadow: 0 6px 16px rgba(4,30,30,.14); 2856 opacity: 0; min-width: 168px; 2857} 2858.cmp .scene.active .tip { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(2.35s * var(--dur-scale,1)) both; } 2859.cmp .tip .tdate { font-size: 10.5px; font-weight: 700; color: var(--c-midnight); margin-bottom: 6px; } 2860.cmp .tip .trow { display: flex; align-items: center; gap: 7px; font-size: 10px; color: var(--c-muted); margin-top: 3px; } 2861.cmp .tip .trow .tdot { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; } 2862.cmp .tip .trow b { color: var(--c-midnight); font-weight: 700; margin-left: auto; } 2863 2864.cmp .legend { display: flex; flex-wrap: wrap; gap: 6px 16px; justify-content: center; margin-top: 12px; font-size: 10px; color: var(--c-muted); } 2865.cmp .legend .li { display: inline-flex; align-items: center; gap: 6px; } 2866.cmp .legend .li .ld { width: 9px; height: 9px; border-radius: 50%; flex-shrink: 0; } 2867 2868/* âââââââââ SCENE 4 â SIGNALS (segment drill-down) âââââââââ */ 2869.cmp .seg-head { 2870 display: flex; align-items: center; gap: 13px; margin-top: 16px; 2871 background: var(--card-bg); border: 1.5px solid var(--card-border); 2872 border-radius: 12px; box-shadow: var(--card-shadow); padding: 12px 16px; opacity: 0; 2873} 2874.cmp .scene.active .seg-head { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 2875/* confirmed-segment check badge (replaces the old back arrow) */ 2876.cmp .seg-check { width: 30px; height: 30px; border-radius: 50%; background: var(--grad-check); display: flex; align-items: center; justify-content: center; flex-shrink: 0; box-shadow: 0 0 10px rgba(226,255,101,.45); } 2877.cmp .seg-check svg { display: block; } 2878.cmp .seg-check .cpath { stroke: var(--c-midnight); stroke-width: 2.6; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 20; stroke-dashoffset: 20; } 2879.cmp .scene.active .seg-check .cpath { animation: cmp-draw calc(.45s * var(--dur-scale,1)) ease calc(.55s * var(--dur-scale,1)) forwards; } 2880.cmp .seg-head .info { flex: 1; } 2881.cmp .seg-head .lbl { font-size: 9px; font-weight: 700; letter-spacing: .14em; color: var(--c-muted); } 2882.cmp .seg-head .name { font-size: 15px; font-weight: 600; color: var(--c-midnight); margin-top: 2px; } 2883 2884.cmp .mini-grid { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; } 2885.cmp .mini { 2886 width: calc(50% - 4px); background: var(--card-bg); border: 1.5px solid var(--card-border); 2887 border-radius: 10px; box-shadow: var(--card-shadow); padding: 10px 13px; position: relative; overflow: hidden; opacity: 0; 2888} 2889.cmp .mini .accent { position: absolute; top: 0; left: 0; right: 0; height: 3px; } 2890.cmp .mini.m1 .accent { background: var(--s-invest); } 2891.cmp .mini.m2 .accent { background: var(--s-compet); } 2892.cmp .mini.m3 .accent { background: var(--s-health); } 2893.cmp .mini.m4 .accent { background: var(--s-arch); } 2894.cmp .scene.active .mini.m1 { animation: cmp-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(.5s * var(--dur-scale,1)) both; } 2895.cmp .scene.active .mini.m2 { animation: cmp-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(.63s * var(--dur-scale,1)) both; } 2896.cmp .scene.active .mini.m3 { animation: cmp-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(.76s * var(--dur-scale,1)) both; } 2897.cmp .scene.active .mini.m4 { animation: cmp-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(.89s * var(--dur-scale,1)) both; } 2898.cmp .mini .mlbl { font-size: 8px; font-weight: 700; letter-spacing: .11em; color: var(--c-muted); margin-top: 4px; } 2899.cmp .mini .mval { font-family: 'Zodiak', Georgia, serif; font-size: 22px; font-weight: 700; color: var(--c-techteal); letter-spacing: -.02em; line-height: 1; margin-top: 4px; } 2900.cmp .mini .mdelta { display: inline-block; margin-top: 7px; padding: 2px 9px; border-radius: 999px; font-size: 8.5px; font-weight: 700; letter-spacing: .04em; } 2901.cmp .mini .mdelta.up { background: var(--c-aqua); color: var(--c-techteal); } 2902.cmp .mini .mdelta.down { background: var(--c-purple-tint); color: var(--c-purple-dk); } 2903 2904.cmp .signals { display: flex; gap: 10px; margin-top: 10px; } 2905.cmp .sig { 2906 flex: 1; background: var(--card-bg); border: 1.5px solid var(--card-border); 2907 border-radius: 12px; box-shadow: var(--card-shadow); padding: 11px 13px 12px; opacity: 0; 2908} 2909.cmp .scene.active .sig.sig1 { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.15s * var(--dur-scale,1)) both; } 2910.cmp .scene.active .sig.sig2 { animation: cmp-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.32s * var(--dur-scale,1)) both; } 2911.cmp .sig .head { display: flex; align-items: center; gap: 9px; margin-bottom: 9px; } 2912.cmp .sig .icon { width: 24px; height: 24px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; flex-shrink: 0; } 2913.cmp .sig.sig1 .icon { background: var(--c-green); color: var(--c-midnight); } 2914.cmp .sig.sig2 .icon { background: var(--c-techteal); } 2915.cmp .sig.sig2 .icon svg { display: block; } 2916.cmp .sig .stitle { font-size: 11.5px; font-weight: 600; color: var(--c-midnight); } 2917.cmp .sig .row { display: flex; justify-content: space-between; align-items: center; margin-top: 6px; } 2918.cmp .sig .row .k { font-size: 9px; font-weight: 700; letter-spacing: .1em; color: var(--c-muted); } 2919.cmp .sig .row .v { font-family: 'Zodiak', Georgia, serif; font-size: 16px; font-weight: 700; color: var(--c-midnight); } 2920.cmp .sig .spill { 2921 display: inline-flex; align-items: center; gap: 5px; margin-top: 11px; 2922 padding: 5px 11px; border-radius: 999px; font-size: 10px; font-weight: 700; opacity: 0; 2923} 2924.cmp .sig.sig1 .spill { background: var(--c-aqua); color: var(--c-techteal); } 2925.cmp .sig.sig2 .spill { background: var(--c-purple-tint); color: var(--c-purple-dk); } 2926.cmp .scene.active .sig.sig1 .spill { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(1.7s * var(--dur-scale,1)) both; } 2927.cmp .scene.active .sig.sig2 .spill { animation: cmp-fade calc(.4s * var(--dur-scale,1)) ease calc(1.87s * var(--dur-scale,1)) both; } 2928 2929/* âââââââââââ play / pause toggle (dev convenience â delete this block + the 2930 <button> + the JS listener to remove it entirely for production) âââââââââââ */ 2931.cmp .cmp-toggle { 2932 position: absolute; bottom: 8px; right: 8px; z-index: 40; 2933 width: 24px; height: 24px; border-radius: 50%; padding: 0; 2934 border: 1px solid rgba(10,68,68,.2); background: rgba(255,255,255,.7); 2935 display: flex; align-items: center; justify-content: center; cursor: pointer; opacity: .5; 2936 transition: opacity .2s ease, background .2s ease; 2937} 2938.cmp .cmp-toggle:hover { opacity: 1; background: #fff; } 2939.cmp .cmp-toggle svg { width: 11px; height: 11px; display: block; fill: var(--c-techteal); }
2940.cmp .cmp-toggle .ic-play { display: none; } 2941.cmp .cmp-toggle.paused .ic-pause { display: none; } 2942.cmp .cmp-toggle.paused .ic-play { display: block; } 2943/* when paused, freeze every animation in the embed so you get a still frame */ 2944.cmp .stage.is-paused *, .cmp .stage.is-paused *::before, .cmp .stage.is-paused *::after { animation-play-state: paused !important; } 2945</style> 2946 2947<!-- ââââââââââââââââ 2948 â MARKUP â 2949 ââââââââââââââââ --> 2950<div class="cmp-fit"> 2951<div class="cmp"> 2952<div class="stage" id="cmp-stage"> 2953 2954 <!-- Phase ribbon (single step indicator) --> 2955 <div class="ribbon"> 2956 <div class="step" data-step="0"><span class="num">1</span>Orientation</div> 2957 <div class="step" data-step="1"><span class="num">2</span>Indicators</div> 2958 <div class="step" data-step="2"><span class="num">3</span>Trends</div> 2959 <div class="step" data-step="3"><span class="num">4</span>Signals</div> 2960 </div> 2961 2962 <!-- ââ SCENE 1: ORIENTATION ââ --> 2963 <div class="scene" id="cmp-scene-0"> 2964 <div class="sc-label">See where you stand</div> 2965 <div class="sc-sub">Four indicators map your position within your cohort — at a glance.</div> 2966 2967 <div class="orient"> 2968 <svg viewBox="-255 -168 510 336" xmlns="http://www.w3.org/2000/svg"> 2969 <!-- Concentric rings --> 2970 <circle class="o-ring o-disc" r="128"/> 2971 <circle class="o-ring" r="96"/> 2972 <circle class="o-ring" r="64"/> 2973 <circle class="o-ring" r="32"/> 2974 2975 <!-- Cross axes --> 2976 <g class="o-axes"> 2977 <line x1="-128" y1="0" x2="128" y2="0"/> 2978 <line x1="0" y1="-128" x2="0" y2="128"/> 2979 </g> 2980 2981 <!-- Axis labels (kept clear of the rings + percentile readouts) --> 2982 <text class="o-axis-label a1" x="0" y="-142" text-anchor="middle">INVESTMENT</text> 2983 <text class="o-axis-label a2" x="140" y="4" text-anchor="start">COMPETITIVENESS</text> 2984 <text class="o-axis-label a3" x="0" y="150" text-anchor="middle">HEALTH</text> 2985 <text class="o-axis-label a4" x="-140" y="4" text-anchor="end">ARCHITECTURE</text> 2986 2987 <!-- Position polygon â Investment 35 · Competitiveness 97 · Health 50 · Architecture 63 (scaled to r=128) --> 2988 <polygon class="o-poly" points="0,-45 124,0 0,64 -81,0"/> 2989 2990 <!-- Anchor dots (series colors) --> 2991 <g class="o-dot d1"><circle cx="0" cy="-45" r="6" fill="var(--s-invest)" stroke="#fff" stroke-width="2"/></g> 2992 <g class="o-dot d2"><circle cx="124" cy="0" r="6" fill="var(--s-compet)" stroke="#fff" stroke-width="2"/></g> 2993 <g class="o-dot d3"><circle cx="0" cy="64" r="6" fill="var(--s-health)" stroke="#fff" stroke-width="2"/></g> 2994 <g class="o-dot d4"><circle cx="-81" cy="0" r="6" fill="var(--s-arch)" stroke="#fff" stroke-width="2"/></g> 2995 2996 <!-- Percentile readouts (offset toward center so they never collide with axis labels) --> 2997 <text class="o-pct p1" x="12" y="-40" >35th</text> 2998 <text class="o-pct p2" x="116" y="-12" text-anchor="end">97th</text> 2999 <text class="o-pct p3" x="12" y="68" >50th</text> 3000 <text class="o-pct p4" x="-73" y="-12" text-anchor="start">63rd</text> 3001 3002 <!-- Center pin --> 3003 <g class="o-center"> 3004 <circle r="11" fill="var(--c-techteal)"/> 3005 <circle class="o-core" r="4.5" fill="var(--c-green)"/> 3006 </g> 3007 </svg> 3008 </div> 3009 3010 <div class="o-cap">Each indicator is a <b>position</b> within your cohort — not a score.</div> 3011 </div> 3012 3013 <!-- ââ SCENE 2: INDICATORS ââ --> 3014 <div class="scene" id="cmp-scene-1"> 3015 <div class="sc-label">Read the four indicators</div> 3016 <div class="sc-sub">Each percentile is benchmarked against the strategy cohort.</div> 3017 3018 <div class="ind-grid"> 3019 <div class="ind c1"> 3020 <div class="accent"></div> 3021 <div class="title">Workforce Investment</div> 3022 <div class="pct">35th</div> 3023 <div class="status trail">TRAILING THE COHORT</div> 3024 <div class="bar-wrap"> 3025 <div class="bar-label">STRATEGY BENCHMARK</div> 3026 <div class="track"><div class="fill" style="width:35%"></div><div class="knob" style="left:35%"></div></div> 3027 </div> 3028 </div> 3029 <div class="ind c2"> 3030 <div class="accent"></div> 3031 <div class="title">Market Competitiveness</div> 3032 <div class="pct">97th</div> 3033 <div class="status lead">LEADING THE COHORT</div> 3034 <div class="bar-wrap"> 3035 <div class="bar-label">STRATEGY BENCHMARK</div> 3036 <div class="track"><div class="fill" style="width:97%"></div><div class="knob" style="left:97%"></div></div> 3037 </div> 3038 </div> 3039 <div class="ind c3"> 3040 <div class="accent"></div> 3041 <div class="title">Workforce Health</div> 3042 <div class="pct">50th</div> 3043 <div class="status align">ALIGNED WITH COHORT</div> 3044 <div class="bar-wrap"> 3045 <div class="bar-label">STRATEGY BENCHMARK</div> 3046 <div class="track"><div class="fill" style="width:50%"></div><div class="knob" style="left:50%"></div></div> 3047 </div> 3048 </div> 3049 <div class="ind c4"> 3050 <div class="accent"></div> 3051 <div class="title">Workforce Architecture</div> 3052 <div class="pct">63rd</div> 3053 <div class="status align">ALIGNED WITH COHORT</div> 3054 <div class="bar-wrap"> 3055 <div class="bar-label">STRATEGY BENCHMARK</div> 3056 <div class="track"><div class="fill" style="width:63%"></div><div class="knob" style="left:63%"></div></div> 3057 </div> 3058 </div> 3059 </div> 3060 </div> 3061 3062 <!-- ââ SCENE 3: TRENDS ââ --> 3063 <div class="scene" id="cmp-scene-2"> 3064 <div class="sc-label">Watch your position move</div> 3065 <div class="sc-sub">How each indicator has tracked against the cohort over time.</div> 3066 3067 <div class="trend-card"> 3068 <div class="head"><span class="hd-dot"></span>Position trends over time</div> 3069 <div class="sub">Percentile vs. cohort — Mar to May 2026</div> 3070 3071 <div class="chart"> 3072 <div class="plot"> 3073 <svg viewBox="0 0 600 300" xmlns="http://www.w3.org/2000/svg"> 3074 <!-- gridlines (plot area y: 12 â 240) --> 3075 <g class="grid"> 3076 <line x1="42" y1="12" x2="590" y2="12"/> 3077 <line x1="42" y1="69" x2="590" y2="69"/>
3077 3078 <line x1="42" y1="126" x2="590" y2="126"/> 3079 <line x1="42" y1="183" x2="590" y2="183"/> 3080 <line x1="42" y1="240" x2="590" y2="240"/> 3081 </g> 3082 <!-- Y axis labels (right-aligned, padded clear of the plot at x=34) --> 3083 <g class="axis" text-anchor="end"> 3084 <text x="34" y="16">100</text> 3085 <text x="34" y="73">75</text> 3086 <text x="34" y="130">50</text> 3087 <text x="34" y="187">25</text> 3088 <text x="34" y="244">0</text> 3089 </g> 3090 <!-- X axis labels (below the plot at y=266, ends anchored inward so they never clip) --> 3091 <g class="axis"> 3092 <text x="42" y="266" text-anchor="start" >1 Mar</text> 3093 <text x="316" y="266" text-anchor="middle">1 Apr</text> 3094 <text x="590" y="266" text-anchor="end" >1 May</text> 3095 </g> 3096 3097 <!-- trend lines (latest point = scene-1/2 values: Inv 35 · Comp 97 · Health 50 · Arch 63) --> 3098 <polyline class="line l1" points="42,131 316,144 590,160"/> <!-- Investment --> 3099 <polyline class="line l2" points="42,48 316,33 590,19"/> <!-- Competitiveness --> 3100 <polyline class="line l3" points="42,99 316,140 590,126"/> <!-- Health --> 3101 <polyline class="line l4" points="42,112 316,103 590,96"/> <!-- Architecture --> 3102 3103 <!-- endpoints --> 3104 <g class="endpt e1"><circle cx="590" cy="160" r="5" fill="var(--s-invest)" stroke="#fff" stroke-width="1.6"/></g> 3105 <g class="endpt e2"><circle cx="590" cy="19" r="5" fill="var(--s-compet)" stroke="#fff" stroke-width="1.6"/></g> 3106 <g class="endpt e3"><circle cx="590" cy="126" r="5" fill="var(--s-health)" stroke="#fff" stroke-width="1.6"/></g> 3107 <g class="endpt e4"><circle cx="590" cy="96" r="5" fill="var(--s-arch)" stroke="#fff" stroke-width="1.6"/></g> 3108 </svg> 3109 3110 <div class="tip"> 3111 <div class="tdate">May 2026 — latest</div> 3112 <div class="trow"><span class="tdot" style="background:var(--s-invest)"></span>Investment <b>35th</b></div> 3113 <div class="trow"><span class="tdot" style="background:var(--s-compet)"></span>Competitiveness <b>97th</b></div> 3114 <div class="trow"><span class="tdot" style="background:var(--s-health)"></span>Health <b>50th</b></div> 3115 <div class="trow"><span class="tdot" style="background:var(--s-arch)"></span>Architecture <b>63rd</b></div> 3116 </div> 3117 </div> 3118 </div> 3119 3120 <div class="legend"> 3121 <span class="li"><span class="ld" style="background:var(--s-invest)"></span>Investment</span> 3122 <span class="li"><span class="ld" style="background:var(--s-compet)"></span>Competitiveness</span> 3123 <span class="li"><span class="ld" style="background:var(--s-health)"></span>Health</span> 3124 <span class="li"><span class="ld" style="background:var(--s-arch)"></span>Architecture</span> 3125 </div> 3126 </div> 3127 </div> 3128 3129 <!-- ââ SCENE 4: SIGNALS (segment drill-down) ââ --> 3130 <div class="scene" id="cmp-scene-3"> 3131 <div class="sc-label">Drill into a segment</div> 3132 <div class="sc-sub">Zoom to one group and surface the signals worth acting on.</div> 3133 3134 <div class="seg-head"> 3135 <div class="seg-check"> 3136 <svg width="15" height="15" viewBox="0 0 16 16"><polyline class="cpath" points="3,8.5 6.6,12 13,4"/></svg> 3137 </div> 3138 <div class="info"> 3139 <div class="lbl">SEGMENT · PEOPLE</div> 3140 <div class="name">5 jobs · 13 employees</div> 3141 </div> 3142 </div> 3143 3144 <div class="mini-grid"> 3145 <div class="mini m1"> 3146 <div class="accent"></div> 3147 <div class="mlbl">INVESTMENT</div> 3148 <div class="mval">34th</div> 3149 <div class="mdelta down">−1pp vs org</div> 3150 </div> 3151 <div class="mini m2"> 3152 <div class="accent"></div> 3153 <div class="mlbl">COMPETITIVENESS</div> 3154 <div class="mval">76th</div> 3155 <div class="mdelta down">−21pp vs org</div> 3156 </div> 3157 <div class="mini m3"> 3158 <div class="accent"></div> 3159 <div class="mlbl">HEALTH</div> 3160 <div class="mval">75th</div> 3161 <div class="mdelta up">+25pp vs org</div> 3162 </div> 3163 <div class="mini m4"> 3164 <div class="accent"></div> 3165 <div class="mlbl">ARCHITECTURE</div> 3166 <div class="mval">41st</div> 3167 <div class="mdelta down">−22pp vs org</div> 3168 </div> 3169 </div> 3170 3171 <div class="signals"> 3172 <div class="sig sig1"> 3173 <div class="head"> 3174 <div class="icon">$</div> 3175 <div class="stitle">Investment Signal</div> 3176 </div> 3177 <div class="row"><span class="k">SPEND</span><span class="v">$2.6M</span></div> 3178 <div class="row"><span class="k">% OF ORG</span><span class="v">4.2%</span></div> 3179 <div class="spill">↗ High investment</div> 3180 </div> 3181 <div class="sig sig2"> 3182 <div class="head"> 3183 <!-- "optimization signal" â a target/dial glyph that rhymes with the Scene 1 compass --> 3184 <div class="icon">
3185 <svg width="16" height="16" viewBox="0 0 24 24"> 3186 <circle cx="12" cy="12" r="8.5" fill="none" stroke="#fff" stroke-width="2"/> 3187 <circle cx="12" cy="12" r="3.4" fill="var(--c-green)"/> 3188 <line x1="12" y1="1.5" x2="12" y2="5" stroke="#fff" stroke-width="2" stroke-linecap="round"/> 3189 <line x1="12" y1="19" x2="12" y2="22.5" stroke="#fff" stroke-width="2" stroke-linecap="round"/> 3190 <line x1="1.5" y1="12" x2="5" y2="12" stroke="#fff" stroke-width="2" stroke-linecap="round"/> 3191 <line x1="19" y1="12" x2="22.5" y2="12" stroke="#fff" stroke-width="2" stroke-linecap="round"/> 3192 </svg> 3193 </div> 3194 <div class="stitle">Optimization Signal</div> 3195 </div> 3196 <div class="row"><span class="k">TENURE</span><span class="v">6Y</span></div> 3197 <div class="row"><span class="k">AVG PIR</span><span class="v">56.1%</span></div> 3198 <div class="spill">⚠ Retention risk</div> 3199 </div> 3200 </div> 3201 </div> 3202 3203 <!-- play / pause toggle (dev convenience) --> 3204 <button class="cmp-toggle" id="cmp-toggle" type="button" aria-label="Pause animation"> 3205 <svg class="ic-pause" viewBox="0 0 12 12"><rect x="2" y="1.5" width="2.6" height="9" rx="0.6"/><rect x="7.4" y="1.5" width="2.6" height="9" rx="0.6"/></svg> 3206 <svg class="ic-play" viewBox="0 0 12 12"><path d="M3.8 2.4 L10.8 6 L3.8 9.6 Z"/></svg> 3207 </button> 3208 3209</div><!-- /.stage --> 3210</div><!-- /.cmp --> 3211</div><!-- /.cmp-fit --> 3212
3213<script> 3214(function () { 3215 /* Scoped to this embed's root â safe if multiple embeds live on the page */ 3216 var root = document.getElementById('cmp-stage'); 3217 var scenes = root.querySelectorAll('.scene'); 3218 var steps = root.querySelectorAll('.ribbon .step'); 3219 var btn = document.getElementById('cmp-toggle'); 3220 3221 /* ââ responsive scaling ââ 3222 Scale the whole embed to its column's width (measured directly â robust in 3223 any layout). The wrapper's aspect-ratio reserves the matching height. */ 3224 var fit = root.closest('.cmp-fit'); 3225 if (fit) { 3226 var nativeW = parseFloat(getComputedStyle(fit).getPropertyValue('--cmp-w')) || 580; 3227 var rescale = function () { 3228 fit.style.setProperty('--cmp-scale', (fit.clientWidth / nativeW).toFixed(4)); 3229 }; 3230 rescale(); 3231 if (window.ResizeObserver) new ResizeObserver(rescale).observe(fit); 3232 else window.addEventListener('resize', rescale); 3233 } 3234 3235 /* ââ read the --speed flag set at the top of the CSS ââ 3236 >0 scales both the scene timing AND every CSS animation/transition 3237 (via --dur-scale). 0 = static: reveal Scene 1 fully formed, no loop. */ 3238 var speed = parseFloat(getComputedStyle(root).getPropertyValue('--speed')); 3239 if (isNaN(speed)) speed = 1; 3240 var animate = speed > 0; 3241 root.style.setProperty('--dur-scale', animate ? (1 / speed) : 0); 3242 3243 /* show / hide the dev play-pause button (reads --show-toggle from the CSS) */ 3244 if (parseFloat(getComputedStyle(root).getPropertyValue('--show-toggle')) === 0) { 3245 btn.style.display = 'none'; 3246 } 3247 3248 var times = [7000, 7200, 7400, 7600].map(function (t) { /* base scene durations (ms) */ 3249 return animate ? t / speed : 0; 3250 }); 3251 3252 var cur = 0, timer = null, paused = false; 3253 3254 function show(i) { 3255 clearTimeout(timer); 3256 scenes.forEach(function (s, j) { s.classList.toggle('active', j === i); }); 3257 steps.forEach(function (s, j) { 3258 s.classList.remove('active', 'done'); 3259 if (j < i) s.classList.add('done'); 3260 else if (j === i) s.classList.add('active'); 3261 }); 3262 cur = i; 3263 if (animate && !paused) timer = setTimeout(next, times[i]); 3264 } 3265 function next() { show((cur + 1) % scenes.length); } 3266 3267 /* play / pause toggle (dev convenience â remove btn + this listener for production) */ 3268 btn.addEventListener('click', function () { 3269 paused = !paused; 3270 btn.classList.toggle('paused', paused); 3271 btn.setAttribute('aria-label', paused ? 'Play animation' : 'Pause animation'); 3272 root.classList.toggle('is-paused', paused); /* freezes all CSS motion */ 3273 if (paused) clearTimeout(timer); 3274 else if (animate) timer = setTimeout(next, times[cur]); /* resume current scene */ 3275 }); 3276 3277 /* Starts when scrolled into view, then fires once. 3278 To play immediately on page load instead, delete the observer 3279 block below and replace it with a single line: show(0); */ 3280 var observer = new IntersectionObserver(function (entries) { 3281 entries.forEach(function (entry) { 3282 if (entry.isIntersecting) { show(0); observer.disconnect(); } 3283 }); 3284 }, { threshold: 0.25 }); 3285 3286 observer.observe(root); 3287}()); 3288</script>
3288</div></div></div><div class="persona-card bg-offwhite"><div class="persona-card_embed"><div class="w-embed"><!-- ============================================================ 3289 Payscale · Particle Cloud Embed · DARK · namespace: pcl (v9) 3290 Self-contained. Drop into a Webflow HTML Embed inside a dark 3291 image container. Auto-sizes to hug its visible content, scales 3292 to any container size, all breakpoints. 3293 3294 WHAT'S NEW IN v9 3295 ⢠Avatars re-exported at higher quality (64px source, less 3296 compression) â nothing else changed from v8. 3297 3298 No external resources (Inter / Zodiak assumed loaded site-wide). 3299 ============================================================ --> 3300 3301<style> 3302.pcl{ 3303/* === PANEL-START === */ 3304 3305 /* === GLOBAL === */ 3306 --slide-speed: 1; /* slide cycle tempo. 0 = no auto-advance (show scene 1 only) */ 3307 --particle-spin: 0.4; /* particle CLOUD ROTATION speed. 0 = cloud frozen (no rotation) */ 3308 --particle-motion: 0.7; /* INDIVIDUAL particle drift. 1 = current · 0 = frozen in place (cloud still spins) */ 3309 --particle-energy: 0.6; /* how much particles wander / shoot outward. 1 = lively · lower = calmer, fewer "escaping" particles */ 3310 --allow-upscale: 1; /* 1 = fill container even past native size · 0 = never upscale (crisper) */ 3311 --hug-pad: 0; /* transparent breathing room around content so glow/shadow never clips (px) */ 3312 /* Dev play/pause button: 1 = show · 0 = hide */ 3313 --show-toggle: 0; 3314 --dur-scale: 1; /* derived from --slide-speed in JS â don't hand-edit */ 3315 3316 /* === PARTICLE CLOUD === */ 3317 --cloud-size: 290; /* base diameter of the cloud (px). Smaller = tighter to the logo */ 3318 --particle-spread: 1.1; /* how far particles fan out past the logo (Ã) */ 3319 --particle-volume: 0.9; /* particle density (Ã) */ 3320 --particle-size: 2.4; /* radius of each particle dot (px) */ 3321 --logo-size: 0.32; /* logo width as a FRACTION of cloud diameter (relative size) */ 3322 --logo-fill: #0a4444; /* logo mark color */ 3323 --logo-url: default; /* "default" = built-in Payscale mark · or "https://...png" */ 3324 --particle-colors: #F4F2EA, #B9DCD3, #23A4B5, #1C8391, #0A4444, #B399F8, #E2FF65; 3325 3326 /* === PILLS (shared) === */ 3327 --pill-radius: 150; /* DEFAULT distance from cloud center to each pill (px) */ 3328 /* GLASS LOOK: --pill-tint is the dark color under the glass; --pill-tint-strength 3329 is its opacity (0 = clear glass, 1 = solid, hides blur). --pill-blur blurs 3330 whatever's behind the pill (the particle cloud) through that glass. */ 3331 --pill-tint: 10,68,68; /* R,G,B only (no alpha) â the glass tint color */ 3332 --pill-tint-strength: 0.6; /* 0â1 opacity of the tint over the blurred backdrop */ 3333 --pill-bg: rgba(var(--pill-tint), var(--pill-tint-strength)); /* derived â don't hand-edit, use the two above */ 3334 --pill-blur: 22px; /* blur radius applied to whatever's behind the pill (the cloud) */ 3335 --pill-border: rgba(244,242,234,.22); 3336 --pill-text-color: #FFFFFF; 3337 --pill-text-size: 16px; 3338 --pill-text-weight: 500; 3339 --pill-pad-y: 11px; 3340 --pill-pad-x: 20px; 3341 --pill-radius-corner: 999px; 3342 /* the small glowing status dot on each pill */ 3343 --show-dot: 1; 3344 --dot-size: 7px; 3345 --dot-color-a: #23A4B5; /* glow color A (teal) */ 3346 --dot-color-b: #E2FF65; /* glow color B (lime) */ 3347 --dot-glow-dur: 2s; /* full tealâlimeâteal cycle */ 3348 --dot-stagger: 0.33s; /* offset between each dot's glow so they don't pulse in unison (0 = all in sync) */ 3349 3350 /* === STAT TEXT (data scene) === */ 3351 --stat-metric-color: #FFFFFF; 3352 --stat-metric-size: 38px; 3353 --stat-metric-weight: 700; 3354 --stat-suffix-color: #E2FF65; /* the "M+" / "K+" unit */ 3355 --stat-suffix-size: 30px; 3356 --stat-label-color: rgba(255,255,255,.8); 3357 --stat-label-size: 11px; 3358 --stat-label-weight: 600; 3359 --stat-gap: 8px; /* vertical space between metric and label */ 3360 --stat-min-width: 0px;
3360 /* 0 = cards hug their own content (so they vary in size) */ 3361 --stat-pad-y: 14px; /* default stat-card vertical padding */ 3362 --stat-pad-x: 16px; /* default stat-card horizontal padding (tighter than before so it hugs) */ 3363 3364 /* === KICKER === */ 3365 --show-kicker: 1; /* 0 = hide eyebrow; layout shifts up to hug */ 3366 --kicker-color: #E2FF65; 3367 --kicker-color-dark: #0A4444; 3368 --kicker-size: 12px; 3369 --kicker-weight: 600; 3370 --kicker-tracking: .16em; 3371 --kicker-gap: 40; /* distance from the kicker down to the TOP-MOST pill â kept equal across all scenes (px) */ 3372 3373 /* === RIBBON === */ 3374 --show-ribbon: 0; /* scene indicator dots (auto-matches the number of scenes) */ 3375 --ribbon-off: rgba(244,242,234,.18); 3376 --ribbon-on: linear-gradient(90deg,#23A4B5,#E2FF65); 3377 --ribbon-gap: 16px; /* gap between content and ribbon */ 3378 3379 /* ================================================================ 3380 PER-SCENE PILL PLACEMENT â each scene is config'd by a NAMED KEY 3381 (not a position number); every scene reads its config off its own 3382 `data-key` attribute, so REORDERING SCENES IS FREE â cut/paste a 3383 whole `.pcl-scene[data-key]` block anywhere and timing/spacing/ 3384 padding follow. Per KEY you set: 3385 --KEY-mode auto â pills spread EVENLY (360°/count), rotated 3386 by --KEY-start · manual â exact angle (--KEY-a1â¦a8) 3387 --KEY-start AUTO only: rotation of the even spread. 3388 --KEY-radius distance of pills from center. 3389 --KEY-dur dwell time on screen (ms). 3390 --KEY-a1â¦a8 MANUAL only: exact angle of each pill. 3391 ANGLES ARE CLOCK POSITIONS, 0/360=12 o'clock, CLOCKWISE: 3392 30=1·60=2·90=3·120=4·150=5·180=6·210=7·240=8·270=9·300=10·330=11 3393 ================================================================ */ 3394 3395 /* ---------- KEY "cards" · Powered by ---------- */ 3396 --cards-mode: auto; /* evenly spread â 3 active cards land at exact thirds, 120° apart */ 3397 --cards-start: 55deg; /* rotation of the even spread */ 3398 --cards-radius: 152; /* cards are wider, a bit more room */ 3399 --cards-dur: 4900; 3400 --cards-pad-y: var(--stat-pad-y); /* per-scene card padding */ 3401 --cards-pad-x: var(--stat-pad-x); 3402 --cards-a1: 55deg; --cards-a2: 145deg; --cards-a3: 235deg; --cards-a4: 325deg; /* only used if mode:manual */ 3403 --cards-a5: 0deg; --cards-a6: 90deg; --cards-a7: 180deg; --cards-a8: 270deg; 3404 3405 /* ---------- KEY "sol" · Solutions (icon-led) ---------- */ 3406 --sol-mode: auto; /* auto = evenly spread, each 1/3 of the arc (120°) apart */ 3407 --sol-start: 20deg; /* staggered off vertical so it's not symmetrical */ 3408 --sol-radius: var(--pill-radius); 3409 --sol-dur: 4500; 3410 --sol-pad-y: var(--pill-pad-y); /* per-scene pill padding */ 3411 --sol-pad-x: var(--pill-pad-x); 3412 --sol-a1: 50deg; --sol-a2: 145deg; --sol-a3: 275deg; --sol-a4: 90deg; /* only used if mode:manual */ 3413 --sol-a5: 150deg; --sol-a6: 210deg; --sol-a7: 270deg; --sol-a8: 330deg; 3414 3415 /* ---------- KEY "built" · Built for (avatar-led) ---------- */ 3416 --built-mode: manual; 3417 --built-start: 30deg; /* 4 pills â 1·4·7·10 o'clock */ 3418 --built-radius: var(--pill-radius); 3419 --built-dur: 5400; 3420 --built-pad-y: var(--pill-pad-y); /* per-scene pill padding */ 3421 --built-pad-x: var(--pill-pad-x); 3422 --built-a1: 30deg; --built-a2: 110deg; --built-a3: 210deg; --built-a4: 287deg; /* only used if mode:manual */ 3423 --built-a5: 60deg; --built-a6: 150deg; --built-a7: 240deg; --built-a8: 330deg; 3424 3425 /* To add a scene: copy a .pcl-scene block with a fresh data-key, then add a 3426 matching --KEY-mode/-start/-radius/-dur/-a1â¦a8 block here. Auto-picked up. */ 3427 3428 /* === ICON CHIP (Solutions scene) === */ 3429 --icon-chip-show: 1; /* 1 = show icon chip leading each pill · 0 = hide (pill text only) */ 3430 --icon-chip-size: 27px; /* width/height of the chip */ 3431 --icon-chip-radius: 9px; /* corner radius â rounded rect centers non-square icon art better than a circle */ 3432 --icon-chip-bg: #F4F2EA; /* light backing so the icons' dark strokes stay legible on the dark glass */ 3433 --icon-chip-ring: rgba(4,30,30,.18); /* thin inner ring for definition against the light chip */ 3434 --icon-chip-icon-size: 19px; /* icon size inside the chip */ 3435 3436 /* === AVATAR (Built-for scene) === */ 3437 --avatar-show: 1; /* 1 = show persona headshot leading each pill · 0 = hide (pill text only) */ 3438 --avatar-size: 32px; /* diameter of each avatar */ --avatar-ring-color: rgba(244,242,234,.4); /* border ring around each photo */ 3439 --avatar-ring-width: 2px; 3440 --avatar-grayscale: 0;
3440 /* 0â1 · 1 = fully desaturate headshots if you want a cooler, quieter look */ 3441 3442/* === PANEL-END === */ 3443 3444 position: relative; 3445 font-family: 'Inter', system-ui, sans-serif; 3446 isolation: isolate; 3447 background: transparent; 3448} 3449 3450/* ---------- responsive wrapper: scales the whole pixel-tuned stage ---------- */ 3451.pcl-fit{ 3452 --pcl-w: 720; /* set by JS from auto-hug â placeholder only */ 3453 --pcl-h: 480; 3454 --pcl-scale: 1; 3455 position: relative; 3456 display: block; 3457 width: 100%; 3458 min-width: 0; 3459 max-width: calc(var(--pcl-w) * 1px); /* JS removes this cap when --allow-upscale:1 */ 3460 aspect-ratio: var(--pcl-w) / var(--pcl-h); 3461 margin: 0 auto; 3462} 3463.pcl-fit .pcl{ 3464 position: absolute; top: 0; left: 0; 3465 width: calc(var(--pcl-w) * 1px); 3466 height: calc(var(--pcl-h) * 1px); 3467 transform-origin: top left; 3468 transform: scale(var(--pcl-scale, 1)); 3469} 3470 3471/* ---------- canvas cloud (the constant hero) ---------- */ 3472.pcl-canvas{ 3473 position:absolute; inset:0; width:100%; height:100%; 3474 display:block; pointer-events:none; z-index:1; 3475} 3476 3477/* ---------- scenes ---------- */ 3478.pcl-scene{ 3479 position:absolute; inset:0; z-index:4; 3480 opacity:0; pointer-events:none; 3481 transition: opacity calc(620ms * var(--dur-scale,1)) cubic-bezier(0.16,1,0.3,1); 3482} 3483.pcl-scene.active{ opacity:1; } 3484 3485.pcl-kicker{ 3486 position:absolute; transform:translate(-50%,-50%); 3487 color:var(--kicker-color-dark); 3488 font-size:var(--kicker-size); font-weight:var(--kicker-weight); 3489 letter-spacing:var(--kicker-tracking); text-transform:uppercase; 3490 white-space:nowrap; opacity:0; 3491} 3492.pcl-scene.active .pcl-kicker{ 3493 animation: pcl-rise calc(640ms * var(--dur-scale,1)) cubic-bezier(0.16,1,0.3,1) both; 3494} 3495 3496.pcl-item{ 3497 position:absolute; transform:translate(-50%,-50%); 3498 opacity:0; will-change:opacity, transform; 3499} 3500.pcl-item.pcl-off{ display:none !important; } /* disabled pill â delete "pcl-off" to enable */ 3501.pcl-scene.active .pcl-item{ 3502 animation: pcl-rise calc(720ms * var(--dur-scale,1)) cubic-bezier(0.16,1,0.3,1) both; 3503 animation-delay: calc((140ms + var(--i,0) * 120ms) * var(--dur-scale,1)); 3504} 3505@keyframes pcl-rise{ 3506 from{ opacity:0; transform:translate(-50%,calc(-50% + 12px)) scale(.94); } 3507 to { opacity:1; transform:translate(-50%,-50%) scale(1); } 3508} 3509 3510/* ---------- glass pill ---------- */ 3511.pcl-pill{ 3512 display:inline-flex; align-items:center; gap:9px; 3513 padding:var(--pill-pad-y) var(--pill-pad-x); 3514 border-radius:var(--pill-radius-corner); 3515 background:var(--pill-bg); 3516 -webkit-backdrop-filter:blur(var(--pill-blur)) saturate(150%); 3517 backdrop-filter:blur(var(--pill-blur)) saturate(150%); 3518 border:1px solid var(--pill-border); 3519 box-shadow:0 14px 40px rgba(4,30,30,.45), inset 0 1px 0 rgba(244,242,234,.20); 3520 color:var(--pill-text-color); 3521 font-size:var(--pill-text-size); font-weight:var(--pill-text-weight); letter-spacing:.005em; 3522 white-space:nowrap; position:relative; overflow:hidden; 3523} 3524.pcl-pill::before{ 3525 content:''; position:absolute; left:0; top:0; right:0; height:46%; 3526 background:linear-gradient(to bottom, rgba(244,242,234,.16), transparent); 3527 pointer-events:none; 3528} 3529.pcl-dot{ 3530 width:var(--dot-size); height:var(--dot-size); border-radius:50%; flex:0 0 auto; 3531 background:var(--dot-color-a); box-shadow:0 0 8px var(--dot-color-a); 3532 animation: pcl-dot-glow var(--dot-glow-dur) ease-in-out infinite; 3533 animation-delay: calc(var(--i,0) * var(--dot-stagger,0s) * -1); /* negative = instantly desynced */ 3534} 3535.pcl[data-dot="0"] .pcl-dot{ display:none; } 3536@keyframes pcl-dot-glow{ 3537 0%,100%{ background:var(--dot-color-a); box-shadow:0 0 8px var(--dot-color-a); } 3538 50% { background:var(--dot-color-b); box-shadow:0 0 11px var(--dot-color-b); } 3539} 3540 3541/* ---------- icon chip (Solutions: pill leads with an icon, not a dot) ---------- */ 3542.pcl-icon-chip{ 3543 width:var(--icon-chip-size); height:var(--icon-chip-size); flex:0 0 auto; 3544 border-radius:var(--icon-chip-radius); background:var(--icon-chip-bg); 3545 display:flex; align-items:center; justify-content:center; 3546 box-shadow:inset 0 0 0 1px var(--icon-chip-ring), 0 2px 6px rgba(4,30,30,.35); 3547} 3548.pcl-icon-chip svg{ width:var(--icon-chip-icon-size); height:var(--icon-chip-icon-size); display:block; } 3549.pcl[data-icon="0"] .pcl-icon-chip{ display:none; } 3550 3551/* ---------- avatar (Built-for: pill leads with a headshot, not a dot) ---------- */ 3552.pcl-avatar{ 3553 width:var(--avatar-size); height:var(--avatar-size); flex:0 0 auto; 3554 border-radius:50%; overflow:hidden; 3555 box-shadow:0 0 0 var(--avatar-ring-width) var(--avatar-ring-color), 0 2px 6px rgba(4,30,30,.35); 3556} 3557.pcl-avatar img{ width:100%; height:100%; object-fit:cover; display:block; filter:grayscale(var(--avatar-grayscale,0)); } 3558.pcl[data-avatar="0"] .pcl-avatar{ display:none; } 3559 3560
3561/* ---------- glass stat card ---------- */ 3562.pcl-stat{ 3563 min-width:var(--stat-min-width); 3564 padding:var(--stat-pad-y) var(--stat-pad-x); 3565 border-radius:16px; 3566 background:var(--pill-bg); 3567 -webkit-backdrop-filter:blur(var(--pill-blur)) saturate(150%); 3568 backdrop-filter:blur(var(--pill-blur)) saturate(150%); 3569 border:1px solid var(--pill-border); 3570 box-shadow:0 14px 40px rgba(4,30,30,.45), inset 0 1px 0 rgba(244,242,234,.20); 3571 text-align:center; position:relative; overflow:hidden; 3572} 3573.pcl-stat::before{ 3574 content:''; position:absolute; left:0; top:0; right:0; height:40%; 3575 background:linear-gradient(to bottom, rgba(244,242,234,.16), transparent); 3576 pointer-events:none; 3577} 3578.pcl-metricrow{ 3579 font-family:'Zodiak', Georgia, serif; line-height:1; letter-spacing:-.01em; 3580 display:flex; align-items:baseline; justify-content:center; 3581} 3582.pcl-metric{ color:var(--stat-metric-color); font-size:var(--stat-metric-size); font-weight:var(--stat-metric-weight); } 3583.pcl-suffix{ color:var(--stat-suffix-color); font-size:var(--stat-suffix-size); font-weight:var(--stat-metric-weight); margin-left:1px; } 3584.pcl-lab{ 3585 margin-top:var(--stat-gap); 3586 color:var(--stat-label-color); font-size:var(--stat-label-size); font-weight:var(--stat-label-weight); 3587 letter-spacing:.12em; text-transform:uppercase; white-space:nowrap; 3588} 3589 3590/* ---------- per-scene padding (set --KEY-pad-x/-y in the panel) â keyed off 3591 data-key, not DOM order, so reordering .pcl-scene blocks just works. */ 3592.pcl-scene[data-key="cards"] .pcl-pill, .pcl-scene[data-key="cards"] .pcl-stat{ padding:var(--cards-pad-y) var(--cards-pad-x); } 3593.pcl-scene[data-key="sol"] .pcl-pill, .pcl-scene[data-key="sol"] .pcl-stat{ padding:var(--sol-pad-y) var(--sol-pad-x); } 3594.pcl-scene[data-key="built"] .pcl-pill, .pcl-scene[data-key="built"] .pcl-stat{ padding:var(--built-pad-y) var(--built-pad-x); } 3595 3596/* ---------- ribbon ---------- */ 3597.pcl-ribbon{ position:absolute; transform:translate(-50%,-50%); z-index:5; display:flex; gap:8px; } 3598.pcl-seg{ 3599 width:22px; height:4px; border-radius:999px; background:var(--ribbon-off); 3600 transition: width calc(420ms * var(--dur-scale,1)) cubic-bezier(0.16,1,0.3,1), 3601 background calc(420ms * var(--dur-scale,1)) ease; 3602} 3603.pcl-seg.active{ width:40px; background:var(--ribbon-on); } 3604 3605/* ---------- slide-static (when --slide-speed:0) ---------- */ 3606.pcl.is-slidestatic .pcl-scene.active .pcl-item, 3607.pcl.is-slidestatic .pcl-scene.active .pcl-kicker{ animation:none; opacity:1; transform:translate(-50%,-50%); } 3608 3609/* === dev play/pause toggle (see --show-toggle) === */ 3610.pcl-toggle{ 3611 position:absolute; right:10px; bottom:10px; z-index:20; 3612 width:28px; height:28px; border-radius:50%; display:none; 3613 align-items:center; justify-content:center; padding:0; 3614 background:rgba(4,30,30,.6); border:1px solid rgba(244,242,234,.3); 3615 color:#F4F2EA; font-size:11px; line-height:1; cursor:pointer; 3616} 3617.pcl[data-toggle="1"] .pcl-toggle{ display:flex; } 3618.pcl.pcl-paused .pcl-item, .pcl.pcl-paused .pcl-kicker, .pcl.pcl-paused .pcl-dot{ animation-play-state:paused !important; } 3619</style> 3620 3621<div class="pcl-fit"> 3622 <div class="pcl"> 3623 <canvas class="pcl-canvas"></canvas> 3624 3625 <!-- ===== Scene · Powered by (data cards) · data-key="cards" ===== --> 3626 <div class="pcl-scene" data-key="cards"> 3627 <span class="pcl-kicker">Powered by</span> 3628 <!-- visible cards (3 active â auto-mode spaces them at exact thirds, 120° apart) --> 3629 <div class="pcl-item" style="--i:2; --angle:var(--cards-a3)"><div class="pcl-stat"><div class="pcl-metricrow"><span class="pcl-metric">29</span></div><div class="pcl-lab">Industries</div></div></div> 3630 <div class="pcl-item" style="--i:0; --angle:var(--cards-a1)"><div class="pcl-stat"><div class="pcl-metricrow"><span class="pcl-metric">10</span><span class="pcl-suffix">M+</span></div><div class="pcl-lab">Employee Records</div></div></div> 3631 <div class="pcl-item" style="--i:3; --angle:var(--cards-a4)"><div class="pcl-stat"><div class="pcl-metricrow"><span class="pcl-metric">4.5</span><span class="pcl-suffix">K+</span></div><div class="pcl-lab">Contributing Orgs</div></div></div> 3632 <!-- spare cards (delete "pcl-off" to enable) --> 3633 <div class="pcl-item pcl-off" style="--i:4; --angle:var(--cards-a5)"><div class="pcl-stat"><div class="pcl-metricrow"><span class="pcl-metric">00</span><span class="pcl-suffix">+</span></div><div class="pcl-lab">New Metric 5</div></div></div> 3634 <div class="pcl-item pcl-off" style="--i:5; --angle:var(--cards-a6)"><div class="pcl-stat"><div class="pcl-metricrow"><span class="pcl-metric">00</span><span class="pcl-suffix">+</span></div><div class="pcl-lab">New Metric 6</div></div></div> 3635 <div class="pcl-item pcl-off" style="--i:6; --angle:var(--cards-a7)"><div class="pcl-stat"><div class="pcl-metricrow"><span class="pcl-metric">00</span><span class="pcl-suffix">+</span></div><div class="pcl-lab">New Metric 7</div></div></div> 3636 <div class="pcl-item pcl-off" style="--i:7; --angle:var(--cards-a8)"><div class="pcl-stat"><div class="pcl-metricrow"><span class="pcl-metric">00</span><span class="pcl-suffix">+</span></div><div class="pcl-lab">New Metric 8</div></div></div> 3637 </div> 3638 3639 <!-- ===== Scene · Solutions (icon-led pills) · data-key="sol" ===== --> 3640 <div class="pcl-scene" data-key="sol">
3641 <span class="pcl-kicker">Built for</span> 3642 <!-- visible pills, each paired with its brand icon --> 3643 <div class="pcl-item" style="--i:0; --angle:var(--sol-a1); --r:132"><span class="pcl-pill"><span class="pcl-icon-chip"><svg viewBox="-2.02 -2.02 33.29 30" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2.69134 14.6227V13.7484C2.69134 11.7602 4.30312 10.1484 6.29134 10.1484H22.9542C24.9424 10.1484 26.5542 11.7602 26.5542 13.7484V14.6227C26.5542 17.9175 23.8833 20.5884 20.5885 20.5884H14.6228H8.65706C5.36229 20.5884 2.69134 17.9175 2.69134 14.6227Z" fill="#B399F8"/><path d="M14.6227 20.5884V28.0455M23.5713 26.5541L14.6227 20.5884L5.67415 26.5541M8.657 14.6227V13.1312M14.6227 14.6227V10.1484M20.5884 14.6227V7.16553" stroke="#0A4444" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/><path d="M1.19994 1.19995H2.69137M2.69137 1.19995V14.6228C2.69137 17.9176 5.36231 20.5885 8.65708 20.5885H14.6228H20.5885C23.8833 20.5885 26.5542 17.9176 26.5542 14.6228V1.19995M2.69137 1.19995H26.5542M26.5542 1.19995H28.0457" stroke="#0A4444" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>Benchmarking</span></div> 3644 <div class="pcl-item" style="--i:1; --angle:var(--sol-a2)"><span class="pcl-pill"><span class="pcl-icon-chip"><svg viewBox="-0.48 -0.48 29.97 29.97" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M8.31323 21.9312V19.4299" stroke="#0A4444" stroke-width="2.4" stroke-linecap="round"/><path d="M14.5 21.9312V16.9287" stroke="#0A4444" stroke-width="2.4" stroke-linecap="round"/><path d="M20.6868 21.9311V14.4153" stroke="#0A4444" stroke-width="2.4" stroke-linecap="round"/><path d="M20.6866 7.06836L20.1307 7.72086C17.0495 11.3217 12.917 13.8713 8.31323 15.0192" stroke="#B399F8" stroke-width="2.4" stroke-linecap="round"/><path d="M17.1467 7.06836H20.6871V10.5967" stroke="#B399F8" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/><path d="M10.8751 26.5834H18.1251C24.1667 26.5834 26.5834 24.1667 26.5834 18.1251V10.8751C26.5834 4.83341 24.1667 2.41675 18.1251 2.41675H10.8751C4.83341 2.41675 2.41675 4.83341 2.41675 10.8751V18.1251C2.41675 24.1667 4.83341 26.5834 10.8751 26.5834Z" stroke="#0A4444" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round"/></svg></span>Compensation Planning</span></div> 3645 <div class="pcl-item" style="--i:2; --angle:var(--sol-a3)"><span class="pcl-pill"><span class="pcl-icon-chip"><svg viewBox="-3.47 -2.78 33.60 33.60" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M20.1072 12.615L22.2097 14.7175L26.4147 10.5125" stroke="#B399F8" stroke-width="3.33333" stroke-linecap="round" stroke-linejoin="round"/><path d="M9.59457 12.6149C12.691 12.6149 15.2012 10.1048 15.2012 7.00828C15.2012 3.9118 12.691 1.40161 9.59457 1.40161C6.49809 1.40161 3.9879 3.9118 3.9879 7.00828C3.9879 10.1048 6.49809 12.6149 9.59457 12.6149Z" fill="#B399F8"/><path d="M17.07 25.23C17.07 21.1014 13.7233 17.7546 9.59463 17.7546C5.46599 17.7546 2.11925 21.1014 2.11925 25.23C2.11925 25.488 2.32825 25.697 2.58629 25.697H16.603C16.861 25.697 17.07 25.488 17.07 25.23ZM14.2667 7.00833C14.2667 4.42794 12.175 2.33629 9.59463 2.33629C7.01423 2.33629 4.92259 4.42794 4.92259 7.00833C4.92259 9.58873 7.01423 11.6804 9.59463 11.6804C12.175 11.6804 14.2667 9.58873 14.2667 7.00833ZM18.9393 25.23C18.9393 26.5202 17.8932 27.5663 16.603 27.5663H2.58629C1.2961 27.5663 0.25 26.5202 0.25 25.23C0.25 20.0692 4.43383 15.8854 9.59463 15.8854C14.7554 15.8854 18.9393 20.0692 18.9393 25.23ZM16.1359 7.00833C16.1359 10.6209 13.2072 13.5496 9.59463 13.5496C5.98207 13.5496 3.05333 10.6209 3.05333 7.00833C3.05333 3.39578 5.98207 0.467041 9.59463 0.467041C13.2072 0.467041 16.1359 3.39578 16.1359 7.00833Z" fill="#0A4444" stroke="#0A4444" stroke-width="0.5" stroke-linecap="round" stroke-linejoin="round"/></svg></span>Job Management</span></div> 3646 <!-- spare pills (delete "pcl-off" to enable; auto mode re-spaces everything) --> 3647 <div class="pcl-item pcl-off" style="--i:3; --angle:var(--sol-a4)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 4</span></div> 3648 <div class="pcl-item pcl-off" style="--i:4; --angle:var(--sol-a5)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 5</span></div> 3649 <div class="pcl-item pcl-off" style="--i:5; --angle:var(--sol-a6)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 6</span></div> 3650 <div class="pcl-item pcl-off" style="--i:6; --angle:var(--sol-a7)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 7</span></div> 3651 <div class="pcl-item pcl-off" style="--i:7; --angle:var(--sol-a8)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 8</span></div> 3652 </div> 3653
3654 <!-- ===== Scene · Built for (avatar-led pills) · data-key="built" ===== --> 3655 <div class="pcl-scene" data-key="built"> 3656 <span class="pcl-kicker">Made for</span> 3657 <!-- visible pills, each paired with a persona headshot (pairing is illustrative, not literal) --> 3658 <div class="pcl-item" style="--i:0; --angle:var(--built-a1)"><span class="pcl-pill"><span class="pcl-avatar"><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBUODAsLDBkSEw8VHhsgHx4bHR0hJTApISMtJB0dKjkqLTEzNjY2ICg7Pzo0PjA1NjP/2wBDAQkJCQwLDBgODhgzIh0iMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzP/wAARCAAwADADASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAABgcDBAUC/8QAMBAAAgIBAgMGBQMFAAAAAAAAAQIDBBEABQYSIRMxQVFhcQcUFTKBIpGxIzNCYqH/xAAYAQEBAQEBAAAAAAAAAAAAAAAEBQIAA//EACARAAICAQQDAQAAAAAAAAAAAAECABEDFCEiMQQSQVH/2gAMAwEAAhEDEQA/AExFFJPKsUSF5HOFVRkk6J9v4dStLG1yNJ3OSYi2FGPMjv1NwptarF867ASPkJ5hfP8AOta3SlMa8jsWaJ+X3zga5mniifs6h4n2+iwrQ7cqMDjEIUAa1INw2/eIzHYqx82P7c6A8w8wfEa44V4P22dA9yFppfFmY9CPbRVe4I2+7Qd6cb17aqeykQkfv5jRNQLqUNGfW4u964MqTK0u2MIJh17Fmyjex8P40ByxSQStFKhSRDhlYdQdN+SC7Tc1ZolaWL9DPn7iPHQnxftUs0H1ARKHiAEhXxXuyfbS1b4ZPdPojSocK1K+3wxLH1jRVz7DWXu2wiOnLNCzBoIJCP3J0wKk0Fzhzb70OCliFJAR6gHVKNYpb0sciAo8bAr5g6yQZtWHcWlaq9KIbkLCpM86iPOAc569fbw0aV9rUcQyXY7ilyA/Z4U8nmAe/wBMZ0FfKiS/EiQtYirzshTPRh4Z9iNHVSiJJ47aRGuqoE7MfaT3kj18O/U8qZZDKRKV2qH3GT+mzM36i2O8nv1Vm2QXK1mBomKyxshHuNF7ovzER5R3aiuTx0KVu7JhY68DyMT6AnTlB6kd2BJIgB8LuOIW2H6BuEqLJTJauztjnjJzyjzIJPTyPprY3fiGwHdaKdmzjl7Q/cMnwHh00goJ5as6TwSNHKh5lZTgg6YW0cdU7Scm6IILRABnUZSTHdny/j20zEqE8oVmYDaHLbDLRavulMla8uEnA68rev56g+uNb9Cy1yzJGnWGlH2lmT/FRjoo/wBm/jJ8tXNkuVbvD8IqW60/bADCSKw6nGCPzqDcptt4S2KSmliCGtMAHMkgBZywJfJ6keHsB5aGcF5ava5SHk1iuuVdzq1dNNYrDR88YwHx3rnx9tL74pcYRptf0Sp0nsgNOQc8secgfkgfgeuoOLPibQWvLT2cfNTOOUzsCI09QD1Y/wDPfSmnnlszvNPI0krnmZmOSTpuYY749yYjNVGf/9k="/></span>Compensation Professionals</span></div> 3659 <div class="pcl-item" style="--i:1; --angle:var(--built-a2)"><span class="pcl-pill"><span class="pcl-avatar"><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBUODAsLDBkSEw8VHhsgHx4bHR0hJTApISMtJB0dKjkqLTEzNjY2ICg7Pzo0PjA1NjP/2wBDAQkJCQwLDBgODhgzIh0iMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzP/wAARCAAwADADASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAABwMFBgQI/8QAMxAAAgIBAgMGBAQHAQAAAAAAAQIDBAUAEQYhcQcSMUFhkRMiUYEUFSMyFjNCQ6GxweH/xAAXAQEBAQEAAAAAAAAAAAAAAAAFBAYD/8QAIREAAgIBAwUBAAAAAAAAAAAAAQIAAxEEEkEFEzJRYTH/2gAMAwEAAhEDEQA/ABqrVnu2o61aJ5Z5WCoiDcsT5DSrj+z3C8L4dsxxbL+IdACKsbfIGPgvLm7ew+3PXd2TcLpVxhz9mMGzZ3WvuP2RjkSPVjv9h66re0+5LkeI6WHjciNHSLYeTvzY9Quw99U4CJvaHLutt7azP2+P8o1v4GBq1MXWTmsVWBS2w8O823M6nx3aHasXlXiKpUyOPk/mq9de+g8yvT6aRsTw1jaGLCRU4ogF5sQAT1J0d8bYaokLZLHtEzxtvJ8E7gjz8OR1GmsYt8ir9PrCfZoeIuzPGZGr+N4ckWCRlDrCX3ilBG47pPNd/bpoks1pqdmSvYiaKaNiro42KkeWlfs+zrSYY0JX3NVv09z/AG25gfY7j21D2kYOO/jhm66AWK+yz7f1p4An1B2+x9NINWHTesEW1q7TU8UMdBHj8ZUpRjZIIUjA6ADQlnLQyHG0kjMApvDYk8tu93f+aacfYS/jalyI7pPCkinqAdeeuIHavPabfaQS7A+u5Oues8QBKOmebMeIwUcN+VxSxSWVn+KhYhUVVA6DUVrFYqDGWpFnlnaZCpR5Sw8NvDfb21WcM5WPiSjBPD3Jiq92evIwVlf694g8tcvFuQbB12Qy/EvWOUUKsWWJR9N+u+/poXDZxzNNldueJkOHZzj8nX2OySL8Jv8An+dJCst6hYqyc0miZCOo20UwK6TVwP3CQH3P/mkNLa1as1hzssUbOfsNO6BsowMyfWE22qy/pnR2R8QrkaH8PzSKLVbd64Y85I99yB9Sp3PQ+mstxDwZlrmSLQwIyT96Ysr7qgI32IHMEeH3GsNTuWMfcit1JnhsQsHjkQ7MpHgQdOHCXa9hslFHT4niSlZ3HetRx/pTEHcFgOanfqOmprCzAD1LaAlbE8mGvCEOSryHGpi5VaSbvmw/eQwjbYjf7av+I8PXoSSzM7PK6H55GLH30rZSDC35zfxs1OxHZ+YzVpVb5vPfY+fj76ocpicReaGPMXIYIFO7yyziPZfPr00Y5bu4xG6yvazmDtBJ5MxVQRuzvOoCgfTVxxjcmxtf8qkjeKxKA0ityKp4jfr/AK661fFXaBwripFThfHwXL8W/wAO68ZEcJ+q783PXl10QW7di/bltWpnmnlYvJI53LE+Z0pS7VoV9wLVpXdYr+p//9k="/></span>HR Professionals</span></div> 3660 <div class="pcl-item" style="--i:2; --angle:var(--built-a3)"><span class="pcl-pill"><span class="pcl-avatar"><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBUODAsLDBkSEw8VHhsgHx4bHR0hJTApISMtJB0dKjkqLTEzNjY2ICg7Pzo0PjA1NjP/2wBDAQkJCQwLDBgODhgzIh0iMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzP/wAARCAAwADADASIAAhEBAxEB/8QAGwAAAgIDAQAAAAAAAAAAAAAABQcDBgIECAH/xAAxEAABAwIEBAUDAwUAAAAAAAABAgMEBREABhIhBzFBYRMUIlFxM4GRFjKhJEJSYuH/xAAYAQADAQEAAAAAAAAAAAAAAAACBAUDAf/EAB4RAAICAgIDAAAAAAAAAAAAAAABAhEDMRMhEhRB/9oADAMBAAIRAxEAPwBNxYr86U1FisrefdUEobQLlRPQDDhofCmm0WlrquaXQ6ppHiLZCiGmgOhI3UfjbpvgxwSygzBpBzNMbSZUvUiLqH02gbFQ7qII+B3wR4xre/R7cWMq3mprTJSnmq9yB+QDbrbBtmMMf1ixkcRpDcry+W6bEgQ0mydLCSsjv0H84iZzZW1KW5V4saow7nW3KjJKef8AkBdOMadAhQnHIiihL7ainSo+q45/fF2oUylBQp8kNOLcFlNhkqJHcgbDC3M/Kih6q47sHL4b0nO1CVWMo/0UtGzsF1y6NfPSCd036Hke2FNMhyIEx2JLZWzIZUUONrFikjmDjoPILbeWc61+kNEiA5GblMoG4SNVgL9rkfFsA+MeXGp8P9QxW7SGbB+w/e3yBPdJt9j2wynYhkx1oZmXmfAgRKY2yG0RY6G+fIAAYhzLGivxiiU3r8i63MbVb9q21BQP4uPvjPKkxuovLqDartymG3U/cXxPVW3HnZyWUIcdWwpKErNkqJTsCegxxhxYhDACZhd82pSlkq0KNwN+fbB+VAp3moFSMtabEIWlk+lKv9rHmcCJVOdp+YHYkxRKUbKShQGsdCCQdu1sHxAg1GiuxoQmR9KrgKd1hZ9rEAAdxvhBpp9ssRcXG0uhlZbisPzJctAK2zFQ2VG3q3J363sPfGvUoKKjTnYbidTb7K21D5SRghk2KtjLDbpkB1mQ2lxtOixRtY733va+NabMbp1KfmukBuOwtxRPsEk4ex2o9krM05Ohb8HM4RkRF0ifJQy5HSSypxVgpu9yLnqCfwe2GDWa7HgMy5CH0+Ilu6VaCtKSR6dVum18crsPuxZDb7C1NutqCkLTzSRyOGll7iHHnRHolYmqgyHSoqdLIWw8SLeoD1JPT2+MEzDHJaZVkz509wTZDxVKXutXucWOj1J6OlapTp0AFRA2GC1Ly3Q
366058NKYr48RB+ow6laVD3t/zHtRyrCiQpKZlYYZaU2dLhISeXKyjzxMlJtlyDhGOxrZUqDT2UKarw0NB6MlSEtm4GoXsfbnhYcXM1Nw6OjL8ZwGVKAVI0n6bYNwD3UR+B3wMm8VIlJy1ApdEhsuTGYzaDIsQhtSQNwP7j/G/XCqly5E6W7KlPLefdUVuOLNyonmTilHREyzWkf/2Q=="/></span>Executive Leadership</span></div> 3661 <div class="pcl-item" style="--i:3; --angle:var(--built-a4)"><span class="pcl-pill"><span class="pcl-avatar"><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBUODAsLDBkSEw8VHhsgHx4bHR0hJTApISMtJB0dKjkqLTEzNjY2ICg7Pzo0PjA1NjP/2wBDAQkJCQwLDBgODhgzIh0iMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzP/wAARCAAwADADASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAABgUHBAL/xAAtEAACAgECBQIFBAMAAAAAAAABAgMEEQAFBhIhMUETUQcUYXGBIiPB0RZisf/EABcBAQEBAQAAAAAAAAAAAAAAAAQDAgD/xAAeEQACAgICAwAAAAAAAAAAAAAAAQIRAyEEMRITQf/aAAwDAQACEQMRAD8AxurVsXrUVWrC808rBUjRcsxPgDVytwzdr7otW3SeR+QuURgRgfnWtfBThelt2znia88It2yY6vqOB6cYOCRnyxB/A+ugG6W/ld0sLWtM3zc0kJkVs+mHkOcH7dvvrOST6RnDji9yI1ziFKmYNqihRAvLKxAwT9Mf9zqaN1SdgliCJObI9Veqn7g9tbVs3DuzpAlaOvUYxjpHhSw+uO+hPGu37NaaVarwtZjBz6J8jxkdM/TUVlT+C5cel2B5oYJI19JHSXsR3Dfb21xMjIxV1KsO4IwRrYfhNHSlbZp7KRiVZCOdwPBYL+e2kHxw4Pr3doHEtNUFuphbIUjMkROAx9ypI/B+mkQb6YLJBVaMo2DeZdtLrEidRjLKD4117Zbff91+XsiOL04zKjJGBl1IPXH21FqxctdZAc8512bHN8vu5Yd+Rs6k0Ii+jT6Wy7dtl6K7LdjV5QRzMQuA2e5HfRyb/G/kLTmyGtVlJCrnBGcZx+Rou9t9qsRjcKUdiqIykEshblCliwzjyM4xqfa3GbdpRX26CGJXXEhgTlBGQep9ug6al639Yn3KtIY7TKsnDVeKCsxjeLBIIHXr/OjUxswQzVZA0hAKfr6nGn+1RbXX4PpRx8xuekQAucsRn+dBrk8hmlmlP6hknx2GrrWgj27ZH22dXi+Xfm5gQVwfGeure3U2qbnJdnT0qiKx5pP60QjkeKRZI2KupyCO40u2ziatOiw3wIWHT1AMqf61ZQi3sPHJSoQ7NbTc73LJVdK0y8sazIBkr5x7HPn2127tFU2yNqu304nuSd1VcKg/2x7+2vFOWrND+zLFIp6qUcHB17mliowkz2IUYrlpGblyT3PU658aLn5XoSuQ1DxRO2vcp6EriauQGJJjJzynyVOj/FO4QCA1IlRpZZDIzjOVU+Net14lrxq0VL96Q5HqEYVft76JSSPLI0kjFnY5JPnW5qN6Cynqkf/Z"/></span>Talent Acquisition</span></div> 3662 <!-- spare pills (delete "pcl-off" to enable) --> 3663 <div class="pcl-item pcl-off" style="--i:4; --angle:var(--built-a5)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 5</span></div> 3664 <div class="pcl-item pcl-off" style="--i:5; --angle:var(--built-a6)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 6</span></div> 3665 <div class="pcl-item pcl-off" style="--i:6; --angle:var(--built-a7)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 7</span></div> 3666 <div class="pcl-item pcl-off" style="--i:7; --angle:var(--built-a8)"><span class="pcl-pill"><span class="pcl-dot"></span>Pill 8</span></div> 3667 </div> 3668 3669 <div class="pcl-ribbon"></div> <!-- segments generated by JS to match scene count --> 3670 <button type="button" class="pcl-toggle" aria-label="Play or pause animation">ââ</button> 3671 </div> 3672</div> 3673 3674</div></div><div class="persona-card_content"><div class="persona-card_content_rt w-richtext"><h3>Connected intelligence across the platform</h3><p><br/>Ascent is the benchmarking intelligence layer within the Payscale Intelligence Cloud. Powered by Peer Global â daily-refreshed data from thousands of organizations â it connects to Paycycle and job management solutions so your teams work from consistent, current information across job ar
3674chitecture, planning, and pay decisions.</p></div><div class="w-layout-hflex button-text-group"><div aria-roledescription="open-modal-trigger" class="btn" data-wf--cta-button---popup--variant="primary" role="button" aria-controls="button-popup" ariahaspopup="dialog" fs-modal-element="open-1" aria-expanded="false" tabindex="0"><div class="text-block-36">Get a Demo</div></div></div></div></div></div></div></div></section><section class="section is-partners"><div class="pd-global"><div class="c-large"><div class="header-wrapper"><h2 class="heading-1"><span>Work smarter with helpful </span><span class="ts-highlight is-dark product-hero-highlight">integrations</span></h2><div class="max-width-50"><p class="text-size-large">Effortless API integrations connect your systems, so you can make real-time, informed pay decisions â no more wasting time jumping between tools.</p></div><div class="button-group"><a data-wf-native-id-path="3144156a-e9f1-34c6-d0eb-30ae3e5fa572:d9e6c37f-c697-9899-548a-1a0ac6654ebd" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="d9e6c37f-c697-9899-548a-1a0ac6654ebd" data-wf-component-context="%5B%7B%22componentId%22%3A%22d9e6c37f-c697-9899-548a-1a0ac6654eb0%22%2C%22instanceId%22%3A%223144156a-e9f1-34c6-d0eb-30ae3e5fa572%22%7D%5D" href="/marketplace" class="btn w-inline-block"><div>Learn More</div></a></div></div><div class="partners-grid"><div class="partners-line is-1"><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6819392991bef3e64ac4f530_remote-logo.avif" loading="lazy" alt="" class="partner-logo"/></div><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939971c2a98c29ae2bb26_bamboohr.avif" loading="lazy" alt="" class="partner-logo"/></div></div><div class="partners-line is-gap"><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939ee8dfb4aa34a049200_sap.avif" loading="lazy" alt="" class="partner-logo"/></div><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939eeec1e501b040c7a8a_gusto.avif" loading="lazy" alt="" class="partner-logo"/></div><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939eee746e5e042f0d11f_paylocity.avif" loading="lazy" alt="" class="partner-logo"/></div></div><div class="partners-line is-2"><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939ee795553640f10b068_ukg.avif" loading="lazy" alt="" class="partner-logo"/></div><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939ee8dfb4aa34a04920a_oracle.avif" loading="lazy" alt="" class="partner-logo"/></div></div><div class="partners-line is-gap"><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939ee16d84e0b4bd81f01_adp.avif" loading="lazy" alt="" class="partner-logo"/></div><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939ee2c341eb46f024615_namely.avif" loading="lazy" alt="" class="partner-logo"/></div><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939ee7560175626a39b74_workday.avif" loading="lazy" alt="" class="partner-logo"/></div></div><div id="w-node-d9e6c37f-c697-9899-548a-1a0ac6654ed9-c6654eb0" class="partners-line"><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939ee6ba0f761df3dbf58_humi.avif" loading="lazy" alt="" class="partner-logo"/></div><div class="partner"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681939eeb257799070ea5f61_paycom.avif" loading="lazy" alt="" class="partner-logo"/></div></div></div></div></div><div class="partners-gradient"></div></section><section id="who-ascent-helps" class="section"><div class="padding-global"><div class="container-global"><div class="w-layout-vflex header-wrapper max-width-50 is-align-center"><h2>Compensation intelligence that meets you at every stage of maturity</h2><p class="text-size-large">Whether youâre building your first structured compensation process or running a sophisticated global program, Ascent scales with how complex your needs are.</p></div><div class="_4col-layout gap-2"><div class="card-white-shadow"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a3bef5fd7992f6d6580b5f7_check%20icon%20yellow-2.svg" loading="lazy" alt="" height="Auto" class="check-icon"/><div class="card-title-wrapper"><h3 class="heading-4">Compensation professionals</h3></div><p>
3674Teams ready to move from reactive work to strategic impact.</p><a data-wf-native-id-path="c7a14387-e43d-afa6-260f-2b22e7f9fc55" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c7a14387-e43d-afa6-260f-2b22e7f9fc55" href="/solutions/compensation-professionals" class="text-link margin-top-auto">Learn more</a></div><div class="card-white-shadow"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a3bef5f53b80f86e9280823_check%20icon%20yellow-mint.svg" loading="lazy" alt="" class="check-icon"/><div class="card-title-wrapper"><h3 class="heading-4">HR professionals</h3></div><p>Leaders who need reliable tools without deep compensation expertise.</p><a data-wf-native-id-path="c7a14387-e43d-afa6-260f-2b22e7f9fc5e" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c7a14387-e43d-afa6-260f-2b22e7f9fc5e" href="/solutions/hr-professionals" class="text-link margin-top-auto">Learn more</a></div><div class="card-white-shadow"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a3bef5fb6519d9fe3fe252c_check%20icon%20yellow-mint-teal.svg" loading="lazy" alt="" class="check-icon"/><div class="card-title-wrapper"><h3 class="heading-4">Talent acquisition</h3></div><p>Recruiters who want fast, compliant offers without constant back-and-forth.</p><a data-wf-native-id-path="c7a14387-e43d-afa6-260f-2b22e7f9fc67" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c7a14387-e43d-afa6-260f-2b22e7f9fc67" href="/solutions/talent-acquisition" class="text-link margin-top-auto">Learn more</a></div><div class="card-white-shadow"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a3bf2090ef955aff579c970_check%20icon%20yellow-mint-teal-purple-2.svg" loading="lazy" width="Auto" alt="" class="check-icon"/><div class="card-title-wrapper"><h3 class="heading-4">Executive leadership</h3></div><p>Leaders who need clear visibility and defensible answers.</p><a data-wf-native-id-path="c7a14387-e43d-afa6-260f-2b22e7f9fc70" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c7a14387-e43d-afa6-260f-2b22e7f9fc70" href="/solutions/executive-leadership" class="text-link margin-top-auto">Learn more</a></div></div></div></div></section><section id="expert-support" class="section bg-offwhite"><div class="padding-global"><div class="container-global"><div class="content-component"><div id="w-node-d6615125-6290-019f-8f97-76427bfe9c03-dbce5a0a" class="content-info-wrapper"><h2>Expert help when the work gets complicated</h2><p>What happens when you bring Intelligence to your benchmarking strategy? Faster pricing. Deeper insights. Zero guesswork.</p><ul role="list"><li>Implementation & change management support</li><li>Manager enablement training</li><li>Custom workshops and ongoing advisory</li></ul><div aria-roledescription="open-modal-trigger" class="btn" data-wf--cta-button---popup--variant="primary" role="button" aria-controls="button-popup" ariahaspopup="dialog" fs-modal-element="open-1" aria-expanded="false" tabindex="0"><div class="text-block-36">Get a Demo</div></div></div><div id="w-node-d6615125-6290-019f-8f97-76427bfe9c2d-dbce5a0a" class="content-image-wrapper"><div class="w-embed w-script"><style> 3675/* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 3676 PAYSCALE SERVICES â Identify / Model / Implement (frameless embed) 3677 Everything is scoped under .sbm so it can't collide with the page. 3678 Type scaled ~1.2x for legibility; stage height grown to suit (width fixed). 3679 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 3680 3681.sbm, .sbm *, .sbm *::before, .sbm *::after { box-sizing: border-box; margin: 0; padding: 0; } 3682 3683.sbm { 3684 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 3685 â â± MOTION CONTROL â 3686 â --speed scales the WHOLE animation in proportion. The script â 3687 â at the bottom reads this one value. â 3688 â 0 = no animation (static â shows Scene 1 fully formed) â 3689 â 1 = baseline (current speed) â 3690 â 2 = 200% speed · 0.5 = half speed · etc. â 3691 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 3692 --speed: 1; 3693 --dur-scale: 1; /* derived from --speed by the script â don't edit directly */ 3694 3695 /* Dev play/pause button: 1 = show · 0 = hide */ 3696 --show-toggle: 0; 3697 3698 /* Expert badge: 1 = show · 0 = hide */ 3699 --show-badge: 0; 3700 3701 /* ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 3702 â ð¨ COLOR CONTROLS â change every color from right here â 3703 â Edit a swatch and every element using it updates. â 3704 ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ */ 3705 3706 /* â Brand swatches (Payscale palette) â */ 3707 --c-green: #E2FF65; /* Electric Green (brand) â lime-chartreuse accent */ 3708 --c-teal: #23A4B5; /* Light Teal (brand) */ 3709 --c-techteal: #0A4444; /* Tech Teal (brand) â primary dark */ 3710 --c-midnight: #041E1E; /* Midnight (brand) â darkest, default body text */ 3711 --c-purple: #B399F8; /* Electric Purple (brand) */ 3712 --c-purple-lt: #CFBDFF; /* Light Purple */ 3713 --c-aqua: #B9DCD3; /* Aqua Blue (brand) â spare, not currently referenced */ 3714 --c-offwhite: #F4F2EA; /* Off-white (brand) â Scene 1 gap-callout tint */ 3715 3716 /* â Custom shades / accents (not official brand swatches) â */ 3717 --c-green-dk: #b8e228; /* deeper lime â darker end of the check-circle gradient */ 3718 --c-teal-soft: #4fd4c4; /* bright cyan-teal â ribbon-sweep midpoint + badge star fill */ 3719 --c-purple-dk: #8058e0; /* deeper purple â darker end of the purple gradients */ 3720 --c-lime: #A8D439; /* yellow-green lime â start of the Group B (gap) bar */ 3721 --c-muted: #5C7575; /* muted gray-teal â captions & sub-labels */ 3722 3723 /* â Element gradients (built from the swatches above) â */ 3724 --grad-ribbon-active: linear-gradient(90deg, var(--c-purple), var(--c-teal-soft), var(--c-purple)); /* active ribbon pill â purple â cyan-teal sweep */ 3725 --grad-stripe-identify:linear-gradient(90deg, var(--c-green), var(--c-teal), var(--c-green)); /* Scene 1 card top-stripe â green â teal */ 3726 --grad-stripe-model: linear-gradient(90deg, var(--c-purple), var(--c-teal), var(--c-purple)); /* Scene 2 card top-stripe â purple â teal */ 3727 --grad-hero-stripe: linear-gradient(90deg, var(--c-green), var(--c-teal), var(--c-green)); /* Scene 3 card top-stripe â green â teal */ 3728 --grad-hero-bg: linear-gradient(160deg, #FFFFFF, #EFF7F6); /* Scene 3 card background â white â faint cool tint */ 3729 --grad-bar-groupA: linear-gradient(90deg, var(--c-techteal), var(--c-teal)); /* Group A pay bar (Scenes 1 & 2) â dark teal â teal */ 3730 --grad-bar-groupB: linear-gradient(90deg, var(--c-lime), var(--c-green)); /* Group B (gap) pay bar (Scene 1) â lime â green */ 3731 --grad-bar-fix: linear-gradient(90deg, var(--c-purple-dk), var(--c-purple-lt)); /* Group B remediated bar (Scene 2) â purple */ 3732 --grad-bar-add: linear-gradient(90deg, var(--c-purple-dk), var(--c-purple)); /* "added" top-up overlay (Scene 2) â purple (same ramp as bar-fix) */ 3733 --grad-check-circle: linear-gradient(135deg, var(--c-green), var(--c-green-dk)); /* Scene 3 checklist circles â lime */ 3734 --grad-closed-icon: linear-gradient(135deg, var(--c-purple-dk),var(--c-purple)); /* Scene 2 "gap closed" check icon â purple (same ramp as bar-fix) */ 3735 --grad-gap-callout: linear-gradient(0deg, var(--c-offwhite), #FFFFFF); /* Scene 1 flagged-gap box â off-white â white (barely-there) */ 3736 --grad-closed-box: linear-gradient(135deg, #EDE5FC, #ddd0fa); /* Scene 2 "gap closed" box â soft lavender */ 3737 3738 /* â Shield (Scene 3 payoff) â */ 3739 --shield-from: var(--c-techteal); /* shield body gradient START â feeds the SVG <linearGradient> in the markup */ 3740 --shield-to: var(--c-teal); /* shield body gradient END */ 3741 --shield-stroke: none; /* shield outline (the border) */ 3742 --shield-check: #FFFFFF; /* checkmark inside the shield */ 3743 3744 /* â Card chrome (subtle, derived from Tech Teal) â */ 3745 --card-bg: #fff; 3746 --card-border: rgba(10,68,68,.12); 3747 --card-shadow: 0 2px 8px rgba(4,30,30,.06); 3748 3749 font-family: 'Inter', system-ui, sans-serif; 3750 -webkit-font-smoothing: antialiased; 3751 line-height: normal; 3752 display: inline-block; 3753} 3754 3755/* ââ Responsive wrapper ââââââââââââââââââââââââââââââââââââââââââââââ 3756 Drop the embed inside any flex column; it scales uniformly to fit that 3757 column's width, so the pixel-tuned layout is preserved at EVERY breakpoint 3758 (desktop 50/50, tablet/mobile stacked). The native size lives here as 3759 --sbm-w / --sbm-h; the stage below reads them, the wrapper reserves the 3760 matching height via aspect-ratio, and the script sets --sbm-scale from the 3761 column's real width. Caps at native size so it never upscales (stays crisp). 3762 To make it larger on wide screens, raise the max-width. */ 3763.sbm-fit { 3764 --sbm-w: 557; /* native width (px, unitless) */ 3765 --sbm-h: 535; /* native height (px, unitless) â keep in step with the stage */ 3766 position: relative; 3767 width: 100%; 3768 max-width: calc(var(--sbm-w) * 1px); 3769 aspect-ratio: var(--sbm-w) / var(--sbm-h); 3770 margin: 0 auto; /* center within a wider column */ 3771 align-self: flex-start;/* don't vertically stretch if it's itself a flex item */ 3772} 3773.sbm-fit .sbm { 3774 position: absolute; top: 0; left: 0; 3775 transform-origin: top left; 3776 transform: scale(var(--sbm-scale, 1)); 3777} 3778 3779/* Frameless stage â transparent. Native size comes from --sbm-w / --sbm-h. */ 3780.sbm .stage { position: relative; width: calc(var(--sbm-w, 557) * 1px); height: calc(var(--sbm-h, 535) * 1px); } 3781 3782/* ââ keyframes (all prefixed sbm-) ââ */ 3783@keyframes sbm-sweep { 0%{background-position:0% 50%} 50%{background-position:100% 50%} 100%{background-position:0% 50%} } 3784@keyframes sbm-fadeUp { from{opacity:0;transform:translateY(14px)} to{opacity:1;transform:translateY(0)} } 3785@keyframes sbm-fade { from{opacity:0}
3785 to{opacity:1} } 3786@keyframes sbm-barGrow { from{transform:scaleX(0)} to{transform:scaleX(1)} } 3787@keyframes sbm-sparkle { 0%,100%{transform:scale(0.82);opacity:1} 50%{transform:scale(1.12);opacity:.78} } 3788@keyframes sbm-drawCheck{ to{stroke-dashoffset:0} } 3789@keyframes sbm-mdFix { from{transform:scaleX(.78)} to{transform:scaleX(1)} } 3790 3791/* ââ workflow ribbon ââ */ 3792.sbm .ribbon { position: absolute; top: 16px; left: 16px; right: 16px; display: flex; align-items: center; gap: 4px; z-index: 20; } 3793.sbm .ribbon .step { 3794 flex: 1; height: 30px; border-radius: 999px; 3795 border: 1px solid rgba(10,68,68,.28); /* inactive pill border */ 3796 background: rgba(10,68,68,.05); /* inactive pill fill */ 3797 display: flex; align-items: center; padding: 0 11px; 3798 font-size: 14px; font-weight: 600; color: rgba(10,68,68,.6); 3799 position: relative; z-index: 0; /* stacking context for the gradient overlay */ 3800 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out, border-color calc(.6s * var(--dur-scale,1)) ease-in-out; 3801 white-space: nowrap; overflow: hidden; 3802} 3803/* gradient overlay â crossfades in/out behind the label + number (color: --grad-ribbon-active) */ 3804.sbm .ribbon .step::before { 3805 content: ""; position: absolute; inset: 0; z-index: -1; border-radius: inherit; 3806 background: var(--grad-ribbon-active); background-size: 200% 100%; 3807 opacity: 0; pointer-events: none; 3808 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out; /* fade-OUT â starts immediately */ 3809} 3810.sbm .ribbon .step .num { 3811 width: 16px; height: 16px; border-radius: 50%; 3812 background: rgba(10,68,68,.1); color: rgba(10,68,68,.55); 3813 font-size: 11px; font-weight: 700; 3814 display: flex; align-items: center; justify-content: center; 3815 margin-right: 7px; flex-shrink: 0; 3816 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out, color calc(.6s * var(--dur-scale,1)) ease-in-out; 3817} 3818.sbm .ribbon .connector { width: 5px; height: 1px; background: rgba(10,68,68,.18); flex-shrink: 0; } 3819/* active step â gradient fades IN delayed ~85% of the fade-out, so outgoing/incoming pills overlap ~15% */ 3820.sbm .ribbon .step.active { 3821 border-color: transparent; color: var(--c-midnight); 3822 transition: color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), 3823 border-color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 3824} 3825.sbm .ribbon .step.active::before { 3826 opacity: 1; 3827 transition: opacity calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); /* fade-IN â delayed */ 3828 animation: sbm-sweep calc(3.2s * var(--dur-scale,1)) ease-in-out infinite; 3829} 3830.sbm .ribbon .step.active .num { 3831 background: rgba(4,30,30,.22); color: var(--c-midnight); 3832 transition: background calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)), color calc(.6s * var(--dur-scale,1)) ease-in-out calc(.51s * var(--dur-scale,1)); 3833} 3834/* done step */ 3835.sbm .ribbon .step.done { background: rgba(10,68,68,.04); border-color: rgba(10,68,68,.15); color: rgba(10,68,68,.35); } 3836.sbm .ribbon .step.done .num { background: rgba(10,68,68,.08); color: rgba(10,68,68,.4); } 3837.sbm .ribbon .step.done::after{ content: "\2713"; font-size: 11px; font-weight: 700; color: rgba(10,68,68,.35); margin-left: auto; } 3838 3839/* ââ scenes ââ */ 3840.sbm .scene { position: absolute; top: 58px; left: 16px; right: 16px; bottom: 16px; opacity: 0; pointer-events: none; transition: opacity calc(.5s * var(--dur-scale,1)) ease; } 3841.sbm .scene.active { opacity: 1; } 3842 3843/* shared scene heading â 15px left pad to line up with the text above/below; 10px above the label & below the sub (none between) */ 3844.sbm .sc-label { font-size: 20px; font-weight: 600; color: var(--c-techteal); margin-bottom: 3px; padding: 10px 0 0 15px; } 3845.sbm .sc-sub { font-size: 13px; color: var(--c-muted); margin-bottom: 13px; line-height: 1.4; max-width: 74%; padding: 0 0 10px 15px; } 3846 3847/* expert badge (shared motif) */ 3848.sbm .expert-badge { 3849 position: absolute; right: 0; top: 0; 3850 display: inline-flex; align-items: center; gap: 7px; 3851 background: #FFFFFF; color: var(--c-techteal); 3852 padding: 5px 13px 5px 6px; border-radius: 999px; 3853 font-size: 12px; font-weight: 600; letter-spacing: .03em; opacity: 0; 3854 box-shadow: 0 2px 10px rgba(4,30,30,.18); 3855} 3856.sbm .scene.active .expert-badge { animation: sbm-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.4s * var(--dur-scale,1)) both; }
3857.sbm .expert-badge .star { width: 20px; height: 20px; border-radius: 50%; background: var(--c-teal-soft); color: #FFFFFF; display: flex; align-items: center; justify-content: center; font-size: 13px; } 3858.sbm .scene.active .expert-badge .star { animation: sbm-sparkle calc(2.4s * var(--dur-scale,1)) ease-in-out infinite calc(1s * var(--dur-scale,1)); } 3859 3860/* âââââââââ SCENE 1 â IDENTIFY âââââââââ */ 3861.sbm .id-card { background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 10px; box-shadow: var(--card-shadow); padding: 30px; opacity: 0; position: relative; overflow: hidden; } 3862/* top stripe (color: --grad-stripe-identify) */ 3863.sbm .id-card::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 5.5px; background: var(--grad-stripe-identify); background-size: 250% 100%; animation: sbm-sweep calc(5s * var(--dur-scale,1)) linear infinite; } 3864.sbm .scene.active .id-card { animation: sbm-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 3865.sbm .id-cap { font-size: 11.5px; font-weight: 600; letter-spacing: .14em; color: var(--c-muted); margin-bottom: 14px; text-transform: uppercase; } 3866 3867.sbm .id-grp { margin-bottom: 15px; } 3868.sbm .id-grp .gl { display: flex; justify-content: space-between; font-size: 14px; margin-bottom: 5px; } 3869.sbm .id-grp .gl .gn { color: var(--c-midnight); font-weight: 600; } 3870.sbm .id-grp .gl .gv { color: var(--c-muted); font-weight: 600; } 3871.sbm .id-bar-bg { height: 16px; border-radius: 8px; background: rgba(10,68,68,.07); overflow: hidden; position: relative; } 3872.sbm .id-bar { height: 100%; border-radius: 8px; transform-origin: left; transform: scaleX(0); } 3873.sbm .id-bar.bar-a { background: var(--grad-bar-groupA); } /* Group A bar color */ 3874.sbm .id-bar.bar-b { background: var(--grad-bar-groupB); } /* Group B (gap) bar color */ 3875.sbm .scene.active .id-grp:nth-child(2) .id-bar { animation: sbm-barGrow calc(.8s * var(--dur-scale,1)) ease calc(.7s * var(--dur-scale,1)) both; } 3876.sbm .scene.active .id-grp:nth-child(3) .id-bar { animation: sbm-barGrow calc(.8s * var(--dur-scale,1)) ease calc(1.0s * var(--dur-scale,1)) both; } 3877 3878.sbm .id-gapcallout { display: flex; align-items: center; gap: 12px; background: var(--grad-gap-callout); border: 1.5px solid var(--c-teal); border-radius: 10px; padding: 12px 16px; margin-top: 4px; opacity: 0; } 3879.sbm .scene.active .id-gapcallout { animation: sbm-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.5s * var(--dur-scale,1)) both; } 3880.sbm .id-gapcallout .gpct { font-family: 'Zodiak', serif; font-size: 32px; font-weight: 700; color: var(--c-techteal); line-height: 1; } 3881.sbm .id-gapcallout .gtxt .gt { font-size: 14px; font-weight: 600; color: var(--c-midnight); } 3882.sbm .id-gapcallout .gtxt .gs { font-size: 12px; color: var(--c-midnight); margin-top: 2px; } 3883 3884/* âââââââââ SCENE 2 â MODEL âââââââââ */ 3885.sbm .md-card { background: var(--card-bg); border: 1px solid var(--card-border); border-radius: 10px; box-shadow: var(--card-shadow); padding: 30px; opacity: 0; position: relative; overflow: hidden; } 3886/* top stripe (color: --grad-stripe-model) */ 3887.sbm .md-card::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 5.5px; background: var(--grad-stripe-model); background-size: 250% 100%; animation: sbm-sweep calc(4s * var(--dur-scale,1)) linear infinite; } 3888.sbm .scene.active .md-card { animation: sbm-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 3889.sbm .md-cap { font-size: 11.5px; font-weight: 600; letter-spacing: .14em; color: var(--c-muted); margin-bottom: 14px; text-transform: uppercase; } 3890 3891.sbm .md-grp { margin-bottom: 14px; } 3892.sbm .md-grp .gl { display: flex; justify-content: space-between; font-size: 14px; margin-bottom: 5px; } 3893.sbm .md-grp .gl .gn { color: var(--c-midnight); font-weight: 600; } 3894.sbm .md-grp .gl .gv { color: var(--c-muted); font-weight: 600; } 3895.sbm .md-bar-bg { height: 16px; border-radius: 8px; background: rgba(10,68,68,.07); overflow: hidden; position: relative; } 3896.sbm .md-bar { height: 100%; border-radius: 8px; transform-origin: left; } 3897.sbm .md-bar.base { background: var(--grad-bar-groupA); } /* Group A bar color */ 3898.sbm .md-bar.fix { background: var(--grad-bar-fix); transform: scaleX(.78); } /* Group B remediated bar */ 3899.sbm .scene.active .md-bar.fix { animation: sbm-mdFix calc(1.1s * var(--dur-scale,1)) ease calc(.9s * var(--dur-scale,1)) forwards; } 3900.sbm .md-bar.add { position: absolute; top: 0; height: 100%; left: 78%; width: 22%; background: var(--grad-bar-add); opacity: 0; border-radius: 8px; } /* top-up overlay */ 3901.sbm .scene.active .md-bar.add { animation: sbm-fade calc(.6s * var(--dur-scale,1)) ease calc(1.2s * var(--dur-scale,1)) both; } 3902 3903.sbm .md-closed { display: flex; align-items: center; gap: 12px; background: var(--grad-closed-box); border: 1.5px solid var(--c-purple); border-radius: 10px; padding: 12px 16px; margin-top: 4px; opacity: 0; } 3904.sbm .scene.active .md-closed { animation: sbm-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.6s * var(--dur-scale,1)) both; } 3905.sbm .md-closed .ci { width: 28px; height: 28px; border-radius: 50%; background: var(--grad-closed-icon); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 17px; font-weight: 700; flex-shrink: 0; } 3906.sbm .md-closed .ctxt .ct { font-size: 14px; font-weight: 600; color: var(--c-midnight); } 3907.sbm .md-closed .ctxt .cs { font-size: 12px; color: #6a5a86; margin-top: 2px; } /* muted purple sub-text */ 3908 3909/* âââââââââ SCENE 3 â IMPLEMENT (LIGHT card â same family as id/md, faint cool tint) âââââââââ */ 3910.sbm .im-hero { 3911 border-radius: 10px; 3912 padding: 30px;
3913 opacity: 0; 3914 color: var(--c-midnight); 3915 background: var(--grad-hero-bg); /* light tint (color: --grad-hero-bg) */ 3916 border: 1px solid var(--card-border); 3917 box-shadow: 0 4px 16px rgba(4,30,30,.10); /* a touch deeper than id/md so the finale lifts */ 3918 position: relative; overflow: hidden; 3919} 3920/* top stripe (color: --grad-hero-stripe) */ 3921.sbm .im-hero::before { content: ""; position: absolute; top: 0; left: 0; right: 0; height: 5.5px; background: var(--grad-hero-stripe); background-size: 350% 200%; animation: sbm-sweep calc(5s * var(--dur-scale,1)) linear infinite; } 3922.sbm .scene.active .im-hero { animation: sbm-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(.2s * var(--dur-scale,1)) both; } 3923.sbm .im-cap { font-size: 11.5px; font-weight: 600; letter-spacing: .14em; color: var(--c-techteal); margin-bottom: 5px; text-transform: uppercase; } 3924.sbm .im-h { font-family: 'Zodiak', serif; font-size: 22px; font-weight: 600; color: var(--c-midnight); margin-bottom: 13px; } 3925 3926.sbm .im-list { display: flex; flex-direction: column; gap: 7px; margin-bottom: 13px; } 3927.sbm .im-item { display: flex; align-items: center; gap: 11px; background: rgba(10,68,68,.04); border: 1px solid var(--card-border); border-radius: 9px; padding: 9px 13px; opacity: 0; } 3928.sbm .scene.active .im-item:nth-child(1) { animation: sbm-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(.7s * var(--dur-scale,1)) both; } 3929.sbm .scene.active .im-item:nth-child(2) { animation: sbm-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(.9s * var(--dur-scale,1)) both; } 3930.sbm .scene.active .im-item:nth-child(3) { animation: sbm-fadeUp calc(.45s * var(--dur-scale,1)) ease calc(1.1s * var(--dur-scale,1)) both; } 3931.sbm .im-item .chk { width: 22px; height: 22px; border-radius: 50%; background: var(--grad-check-circle); display: flex; align-items: center; justify-content: center; flex-shrink: 0; box-shadow: 0 0 8px rgba(226,255,101,.35); } 3932.sbm .im-item .chk svg { display: block; } 3933.sbm .im-item .chk .cpath { stroke: var(--c-midnight); stroke-width: 2.5; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 18; stroke-dashoffset: 18; } 3934.sbm .scene.active .im-item:nth-child(1) .cpath { animation: sbm-drawCheck calc(.4s * var(--dur-scale,1)) ease calc(1.0s * var(--dur-scale,1)) forwards; } 3935.sbm .scene.active .im-item:nth-child(2) .cpath { animation: sbm-drawCheck calc(.4s * var(--dur-scale,1)) ease calc(1.2s * var(--dur-scale,1)) forwards; } 3936.sbm .scene.active .im-item:nth-child(3) .cpath { animation: sbm-drawCheck calc(.4s * var(--dur-scale,1)) ease calc(1.4s * var(--dur-scale,1)) forwards; } 3937.sbm .im-item .itxt { font-size: 14px; font-weight: 600; color: var(--c-midnight); } 3938.sbm .im-item .itxt .isub { font-size: 12px; font-weight: 400; color: var(--c-muted);
3938 margin-top: 1px; } 3939 3940.sbm .im-payoff { display: flex; align-items: center; gap: 13px; border-top: 1px solid var(--card-border); padding-top: 12px; opacity: 0; } 3941.sbm .scene.active .im-payoff { animation: sbm-fadeUp calc(.5s * var(--dur-scale,1)) ease calc(1.5s * var(--dur-scale,1)) both; } 3942.sbm .im-shield { flex-shrink: 0; } 3943.sbm .im-shield .body { fill: url(#sbm-shield-grad); stroke: var(--shield-stroke); stroke-width: 2; } /* shield body (gradient defined in SVG <defs>) + outline */ 3944.sbm .im-shield .spath { stroke: var(--shield-check); stroke-width: 4; fill: none; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 50; stroke-dashoffset: 50; } 3945.sbm .scene.active .im-shield .spath { animation: sbm-drawCheck calc(.6s * var(--dur-scale,1)) ease calc(1.9s * var(--dur-scale,1)) forwards; } 3946.sbm .im-payoff .ptxt { font-size: 14px; font-weight: 600; color: var(--c-midnight); line-height: 1.35; } 3947.sbm .im-payoff .ptxt b { color: var(--c-techteal); } 3948 3949/* âââââââââââ play / pause toggle (dev convenience â delete this block + the 3950 <button> + the JS listener to remove it entirely for production) âââââââââââ */ 3951.sbm .sbm-toggle { 3952 position: absolute; bottom: 10px; right: 10px; z-index: 40; 3953 width: 24px; height: 24px; border-radius: 50%; padding: 0; 3954 border: 1px solid rgba(10,68,68,.2); 3955 background: rgba(255,255,255,.7); 3956 display: flex; align-items: center; justify-content: center; 3957 cursor: pointer; opacity: .5; 3958 transition: opacity .2s ease, background .2s ease; 3959} 3960.sbm .sbm-toggle:hover { opacity: 1; background: #fff; } 3961.sbm .sbm-toggle svg { width: 11px; height: 11px; display: block; fill: var(--c-techteal); } 3962.sbm .sbm-toggle .ic-play { display: none; } 3963.sbm .sbm-toggle.paused .ic-pause { display: none; } 3964.sbm .sbm-toggle.paused .ic-play { display: block; } 3965/* when paused, freeze every animation in the embed so you get a still frame */ 3966.sbm .stage.is-paused *, .sbm .stage.is-paused *::before, .sbm .stage.is-paused *::after { animation-play-state: paused !important; } 3967</style> 3968 3969<!-- ââââââââââââââââ 3970 â MARKUP â 3971 ââââââââââââââââ --> 3972<div class="sbm-fit"> 3973<div class="sbm"> 3974<div class="stage" id="sbm-stage"> 3975 3976 <!-- Phase ribbon --> 3977 <div class="ribbon"> 3978 <div class="step" data-step="0"><span class="num">1</span>Identify</div> 3979 <div class="connector"></div> 3980 <div class="step" data-step="1"><span class="num">2</span>Model</div> 3981 <div class="connector"></div> 3982 <div class="step" data-step="2"><span class="num">3</span>Implement</div> 3983 </div> 3984 3985 <!-- ââ SCENE 1: IDENTIFY ââ --> 3986 <div class="scene" id="sbm-scene-0"> 3987 <div class="sc-label">Identify the gaps</div> 3988 <div class="sc-sub">Experts pinpoint real, statistically significant pay gaps in your data.</div> 3989 <div class="expert-badge"><span class="star">★</span> Expert-led analysis</div> 3990 3991 <div class="id-card"> 3992 <div class="id-cap">PAY EQUITY DIAGNOSIS</div> 3993 3994 <div class="id-grp"> 3995 <div class="gl"><span class="gn">Group A</span><span class="gv">$104,200</span></div> 3996 <div class="id-bar-bg"><div class="id-bar bar-a" style="width:100%"></div></div> 3997 </div> 3998 <div class="id-grp"> 3999 <div class="gl"><span class="gn">Group B</span><span class="gv">$95,900</span></div> 4000 <div class="id-bar-bg"><div class="id-bar bar-b" style="width:78%"></div></div> 4001 </div> 4002 4003 <div class="id-gapcallout"> 4004 <div class="gpct">−8%</div> 4005 <div class="gtxt"> 4006 <div class="gt">Statistically significant gap flagged</div> 4007 <div class="gs">Surfaced from your data, not a rule of thumb</div> 4008 </div> 4009 </div> 4010 </div> 4011 </div> 4012 4013 <!-- ââ SCENE 2: MODEL ââ --> 4014 <div class="scene" id="sbm-scene-1"> 4015 <div class="sc-label">Model the fixes</div> 4016 <div class="sc-sub">Specialists model remediation scenarios — costed and ready to act on.</div> 4017 <div class="expert-badge"><span class="star">★</span> Scenario modeling</div> 4018 4019 <div class="md-card"> 4020 <div class="md-cap">REMEDIATION SCENARIO</div> 4021 4022 <div class="md-grp"> 4023 <div class="gl"><span class="gn">Group A</span><span class="gv">$104,200</span></div> 4024 <div class="md-bar-bg"><div class="md-bar base" style="width:100%"></div></div> 4025 </div> 4026 <div class="md-grp"> 4027 <div class="gl"><span class="gn">Group B</span><span class="gv">$103,800</span></div> 4028 <div class="md-bar-bg"> 4029 <div class="md-bar fix" style="width:100%"></div> 4030 <div class="md-bar add"></div> 4031 </div> 4032 </div> 4033 4034 <div class="md-closed"> 4035 <div class="ci">✓</div> 4036 <div class="ctxt"> 4037 <div class="ct">Gap closed — modeled to cost</div> 4038 <div class="cs">Adjustment: +$148K across 32 employees</div> 4039 </div> 4040 </div> 4041 </div> 4042 </div> 4043 4044 <!-- ââ SCENE 3: IMPLEMENT ââ --> 4045 <div class="scene" id="sbm-scene-2"> 4046 <div class="sc-label">Implement with confidence</div> 4047 <div class="sc-sub">Hands-on rollout and a defensible record — so the plan holds and sticks.</div> 4048 <div class="expert-badge"><span class="star">★</span> Change management</div> 4049 4050 <div class="im-hero"> 4051 <div class="im-cap">IMPLEMENTATION & CHANGE MANAGEMENT</div> 4052 <div class="im-h">A plan that holds up.</div> 4053 4054 <div class="im-list"> 4055 <div class="im-item"> 4056 <div class="chk"><svg width="13" height="13" viewBox="0 0 14 14"><polyline class="cpath" points="2,7 6,11 12,3"/></svg></div> 4057 <div class="itxt">Documented methodology<div class="isub">Every decision traceable end to end</div></div> 4058 </div> 4059 <div class="im-item"> 4060 <div class="chk"><svg width="13" height="13" viewBox="0 0 14 14"><polyline class="cpath" points="2,7 6,11 12,3"/></svg></div> 4061 <div class="itxt">Audit-ready evidence<div class="isub">Holds up under scrutiny</div></div> 4062 </div> 4063 <div class="im-item"> 4064 <div class="chk"><svg width="13" height="13" viewBox="0 0 14 14"><polyline class="cpath" points="2,7 6,11 12,3"/></svg></div> 4065 <div class="itxt">Trained on your real data<div class="isub">Workflows stick, value lands fast</div></div> 4066 </div> 4067 </div> 4068 4069 <div class="im-payoff">
4070 <svg class="im-shield" width="44" height="50" viewBox="0 0 46 52"> 4071 <defs> 4072 <!-- shield fill gradient â stop colors come from --shield-from / --shield-to --> 4073 <linearGradient id="sbm-shield-grad" x1="0" y1="0" x2="1" y2="0"> 4074 <stop offset="0%" stop-color="var(--shield-from)"/> 4075 <stop offset="100%" stop-color="var(--shield-to)"/> 4076 </linearGradient> 4077 </defs> 4078 <path class="body" d="M23,3 L43,10 L43,30 C43,42 34,50 23,50 C12,50 3,42 3,30 L3,10 Z"/> 4079 <polyline class="spath" points="14,27 21,34 33,19"/> 4080 </svg> 4081 <div class="ptxt">From flagged gap to <b>defensible, implemented plan</b> — without adding headcount.</div> 4082 </div> 4083 </div> 4084 </div> 4085 4086 <!-- play / pause toggle (dev convenience) --> 4087 <button class="sbm-toggle" id="sbm-toggle" type="button" aria-label="Pause animation"> 4088 <svg class="ic-pause" viewBox="0 0 12 12"><rect x="2" y="1.5" width="2.6" height="9" rx="0.6"/><rect x="7.4" y="1.5" width="2.6" height="9" rx="0.6"/></svg> 4089 <svg class="ic-play" viewBox="0 0 12 12"><path d="M3.8 2.4 L10.8 6 L3.8 9.6 Z"/></svg> 4090 </button> 4091 4092</div><!-- /.stage --> 4093</div><!-- /.sbm --> 4094</div><!-- /.sbm-fit --> 4095
4096<script> 4097(function () { 4098 /* Scoped to this embed's root â safe if multiple embeds live on the page */ 4099 var root = document.getElementById('sbm-stage'); 4100 var scenes = root.querySelectorAll('.scene'); 4101 var steps = root.querySelectorAll('.ribbon .step'); 4102 var btn = document.getElementById('sbm-toggle'); 4103 4104 /* ââ responsive scaling ââ 4105 Scale the whole embed to its column's width (measured directly â robust in 4106 any layout). The wrapper's aspect-ratio reserves the matching height. */ 4107 var fit = root.closest('.sbm-fit'); 4108 if (fit) { 4109 var nativeW = parseFloat(getComputedStyle(fit).getPropertyValue('--sbm-w')) || 557; 4110 var rescale = function () { 4111 fit.style.setProperty('--sbm-scale', (fit.clientWidth / nativeW).toFixed(4)); 4112 }; 4113 rescale(); 4114 if (window.ResizeObserver) new ResizeObserver(rescale).observe(fit); 4115 else window.addEventListener('resize', rescale); 4116 } 4117 4118 /* ââ read the --speed flag set at the top of the CSS ââ 4119 >0 scales both the scene timing AND every CSS animation/transition 4120 (via --dur-scale). 0 = static: reveal Scene 1 fully formed, no loop. */ 4121 var speed = parseFloat(getComputedStyle(root).getPropertyValue('--speed')); 4122 if (isNaN(speed)) speed = 1; 4123 var animate = speed > 0; 4124 root.style.setProperty('--dur-scale', animate ? (1 / speed) : 0); 4125 4126 /* show / hide the dev play-pause button (reads --show-toggle from the CSS) */ 4127 if (parseFloat(getComputedStyle(root).getPropertyValue('--show-toggle')) === 0) { 4128 btn.style.display = 'none'; 4129 } 4130 4131 /* show / hide the expert badge (reads --show-badge from the CSS) */ 4132 if (parseFloat(getComputedStyle(root).getPropertyValue('--show-badge')) === 0) { 4133 root.querySelectorAll('.expert-badge').forEach(function (b) { b.style.display = 'none'; }); 4134 } 4135 4136 var times = [6000, 6500, 7000].map(function (t) { /* base scene durations (ms) */ 4137 return animate ? t / speed : 0; 4138 }); 4139 4140 var cur = 0; 4141 var timer = null; 4142 var paused = false; 4143 4144 function show(i) { 4145 clearTimeout(timer); 4146 scenes.forEach(function (s, j) { s.classList.toggle('active', j === i); }); 4147 steps.forEach(function (s, j) { 4148 s.classList.remove('active', 'done'); 4149 if (j < i) s.classList.add('done'); 4150 else if (j === i) s.classList.add('active'); 4151 }); 4152 cur = i; 4153 if (animate && !paused) timer = setTimeout(next, times[i]); 4154 } 4155 function next() { show((cur + 1) % scenes.length); } 4156 4157 /* play / pause toggle (dev convenience â remove btn + this listener for production) */ 4158 btn.addEventListener('click', function () { 4159 paused = !paused; 4160 btn.classList.toggle('paused', paused); 4161 btn.setAttribute('aria-label', paused ? 'Play animation' : 'Pause animation'); 4162 root.classList.toggle('is-paused', paused); /* freezes all CSS motion */ 4163 if (paused) clearTimeout(timer); 4164 else if (animate) timer = setTimeout(next, times[cur]); /* resume current scene */ 4165 }); 4166 4167 /* Starts when scrolled into view, then fires once. 4168 To play immediately on page load instead, delete the observer 4169 block below and replace it with a single line: show(0); */ 4170 var observer = new IntersectionObserver(function (entries) { 4171 entries.forEach(function (entry) { 4172 if (entry.isIntersecting) { show(0); observer.disconnect(); } 4173 }); 4174 }, { threshold: 0.25 }); 4175 4176 observer.observe(root); 4177}()); 4178</script>
4178</div></div></div></div></div></section><section id="why-payscale" class="section bg-dark-gradient bottom-pad-2"><div class="padding-global"><div class="container-global"><div class="awards-wrapper is-white"><div class="awards-top-wrapper"><div class="max-width-50"><div class="header-wrapper"><div data-wf--eyebrow-pill--variant="yellow" class="eyebrow-pill"><div>⦠Customer success</div></div><h2>Donât just take our word for it</h2><p class="text-size-large">Hear from comp leaders how Payscale delivers clarity, scale, and trust in their compensation strategy.</p></div></div><div class="awards-g2-wrapper"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6818937c3a4a53d8df1a4ffb_g2.svg" alt="" class="awards-g2-logo"/><div>600+ 5 Star Reviews</div></div></div><div data-wf--g2-awards-only--variant="base" class="awards-logo-wrapper"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f089878ebdf322fe98b_CompensationManagement_BestRelationship_Enterprise_Total.png" loading="lazy" width="105.5" alt="" sizes="106px" srcset="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f089878ebdf322fe98b_CompensationManagement_BestRelationship_Enterprise_Total-p-500.png 500w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f089878ebdf322fe98b_CompensationManagement_BestRelationship_Enterprise_Total-p-800.png 800w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f089878ebdf322fe98b_CompensationManagement_BestRelationship_Enterprise_Total.png 868w" class="awards-logo"/><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08155acb812c86eced_SalaryBenchmarking_HighestUserAdoption_Adoption.png" loading="lazy" width="Auto" height="Auto" alt="" sizes="100vw" srcset="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08155acb812c86eced_SalaryBenchmarking_HighestUserAdoption_Adoption-p-500.png 500w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08155acb812c86eced_SalaryBenchmarking_HighestUserAdoption_Adoption-p-800.png 800w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08155acb812c86eced_SalaryBenchmarking_HighestUserAdoption_Adoption.png 868w" class="awards-logo"/><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08600315f8665fc23e_CompensationManagement_Leader_Leader%20(1).png" loading="lazy" width="105.5" alt="" sizes="106px" srcset="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08600315f8665fc23e_CompensationManagement_Leader_Leader%20(1)-p-500.png 500w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08600315f8665fc23e_CompensationManagement_Leader_Leader%20(1)-p-800.png 800w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08600315f8665fc23e_CompensationManagement_Leader_Leader%20(1).png 868w" class="awards-logo"/><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08a1772d0863bb7fd7_CompensationManagement_BestEstimatedROI_Enterprise_Roi%20(1).png" loading="lazy" width="105.5" alt="" sizes="106px" srcset="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08a1772d0863bb7fd7_CompensationManagement_BestEstimatedROI_Enterprise_Roi%20(1)-p-500.png 500w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08a1772d0863bb7fd7_CompensationManagement_BestEstimatedROI_Enterprise_Roi%20(1)-p-800.png 800w, https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6ab18f08a1772d0863bb7fd7_CompensationManagement_BestEstimatedROI_Enterprise_Roi%20(1).png 868w" class="awards-logo"/></div><div class="awards-quote-wrapper-with-logo max-width-54 top-2"><div class="fdbck-content-card"><p class="txt-quote is-gap">âPayscale changed my life. I canât imagine doing compensation work without it now.</p><div class="quote-sub-content"><div><span class="quote-text-small">The three things I can attribute to Payscale directly are quality, consistency, and efficiency.â</span></div><div class="quote-logo-head-name"><img loading="lazy" height="35" alt="" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a3aee230268cec0e3d1ce96_Baylor-University-Logo-white.svg" class="quote-logo-icon"/><div class="quote-title-wrapper"><div class="quote-headshot-wrapper"><img loading="lazy" src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6a34013256c5c38fefd30bf1_Michelle%20Huse.jpg" alt="Michelle Huse, Baylor University" class="quote-headshot-white"/></div><div class="quote-name-wrapper"><div><strong>Michelle Huse</strong></div><div>Associate Vice President for Culture & Talent, Baylor University<br/></div></div></div></div></div></div></div><div class="button-group"><div aria-roledescription="open-modal-trigger" class="btn" data-wf--cta-button---popup--variant="primary" role="button" aria-controls="button-popup" ariahaspopup="dialog" fs-modal-element="open-1" aria-expanded="false" tabindex="0"><div class="text-block-36">Get a Demo</div></div><a data-wf-native-id-path="5dab46b8-66f3-76cc-4156-90accc2bb440:3b6dd756-5793-28ee-8729-70c68f0f55cc" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="3b6dd756-5793-28ee-8729-70c68f0f55cc" data-wf-component-context="%5B%7B%22componentId%22%3A%223b6dd756-5793-28ee-8729-70c68f0f55a2%22%2C%22instanceId%22%3A%225dab46b8-66f3-76cc-4156-90accc2bb440%22%7D%5D" href="/why-payscale/customer-stories" class="btn is-transparent w-inline-block"><div>View Case Studies</div></a></div></div></div></div></section><section id="security" class="section bg-offwhite"><div class="pd-global"><div class="c-large"><div class="header-wrapper"><h2 class="heading-1">Enterprise-grade security & partnerships</h2><div class="max-width-50"><p class="text-size-large">Strategic partnership with Trusaic for advanced pay equity remediation when deeper analysis is required.</p></div></div><div class="c-small"><div class="_4col-layout legal"><div id="w-node-acf48348-4f51-ae2c-2c85-bb3fbdcd4632-bdcd4624" class="legal-item"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681c65b1c493cae9942720d7_aicpa.png" loading="lazy" width="149.5" alt=""/></div><div class="legal-item"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681c65b1b9a706b5e2272958_gdpr.png" loading="lazy" width="149.5" alt=""/></div><div class="legal-item"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681c65b17e56661d83bfcff9_ccpa.png" loading="lazy" width="149.5" alt=""/></div><div class="legal-item"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/681c65b1a450f489995ee72d_tx.png" loading="lazy" width="149.5" alt=""/></div><div class="legal-item"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/68af23dfe8bc3eb7127b8395_preview-full-Snipped-Version-of-Banner.jpg" loading="lazy" width="149.5" alt=""/></div></div></div></div></div></section><section data-wf--cta-section--variant="base" class="section bg-primary"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/68189b80e0f66cab07117ee9_cta.svg" loading="lazy" alt="" class="cta-bg"/><div class="padding-global"><div class="container-global"><div class="cta-wrapper"><div class="cta-content"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/68189b97d97ab763d9c3d6c5_logo-icon.svg" loading="lazy" alt=""/><h2 class="heading-3 tc-white">Ready to move from reactive compensation to continuous intelligence?</h2><p class="text-size-large">See how Payscale Ascent helps teams reduce manual work, get fresher data, and make faster, more defensible decisions across the entire compensation lifecycle.</p></div><a data-wf-native-id-path="cda4c53e-718d-d158-ea9a-13aee50001f0:3193e798-386b-6955-4452-ef6f2aab26d5" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="3193e798-386b-6955-4452-ef6f2aab26d5" data-wf-component-context="%5B%7B%22componentId%22%3A%22a7c5f524-bb1f-7742-7c07-1912d09824f9%22%2C%22instanceId%22%3A%22cda4c53e-718d-d158-ea9a-13aee50001f0%22%7D%5D" href="/demo-request/get-a-demo" class="btn is-yellow w-inline-block"><div>Talk to Sales</div></a></div></div></div></section></main><footer class="sct is-footer"><div class="padding-global"><div class="container-global"><div class="footer_top-group"><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cf98" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cf98" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/" class="footer-logo w-inline-block"><img src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/6815002921cb0e40bdfaaa83_logo-dark.svg" loading="lazy" alt=""/></a><div class="footer_group"><div class="footer_link-group"><div class="text-overline">Solutions</div><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cf9e" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cf9e" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/products/software/ascent" aria-current="page" class="footer_link w-inline-block w--current"><div>
4178Payscale Ascent</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfa2" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfa2" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/solutions/benchmarking" class="footer_link w-inline-block"><div>Benchmarking</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfa6" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfa6" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/solutions/compensation-planning" class="footer_link w-inline-block"><div>Compensation Strategy</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfaa" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfaa" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/solutions/job-management" class="footer_link w-inline-block"><div>Job Management</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfae" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfae" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/marketplace" class="footer_link w-inline-block"><div>Partners & integrations</div></a></div><div class="footer_link-group"><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:f83df64e-3c68-9de6-8806-5c4e4968c0fc" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="f83df64e-3c68-9de6-8806-5c4e4968c0fc" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/products/data" class="link-overline text-overline w-inline-block"><div>Data</div><div class="embed-icon w-embed"><svg width="5" height="8" viewBox="0 0 5 8" fill="none" xmlns="http://www.w3.org/2000/svg"> 4179<path d="M4.44 4.34922L0.84 7.94922L-3.67176e-08 7.10922L2.76 4.34922L-2.78004e-07 1.58922L0.84 0.749219L4.44 4.34922Z" fill="#1C8391"/> 4180</svg></div></a></div><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:bd70530b-003e-2e9d-3507-574dc79ebe56" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="bd70530b-003e-2e9d-3507-574dc79ebe56" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/demo-request/get-a-demo" class="link-overline text-overline w-inline-block"><div>Get started</div><div class="embed-icon w-embed"><svg width="5" height="8" viewBox="0 0 5 8" fill="none" xmlns="http://www.w3.org/2000/svg"> 4181<path d="M4.44 4.34922L0.84 7.94922L-3.67176e-08 7.10922L2.76 4.34922L-2.78004e-07 1.58922L0.84 0.749219L4.44 4.34922Z" fill="#1C8391"/> 4182</svg></div></a><div class="footer_link-group"><div class="text-overline">Support</div><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfc0" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfc0" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/about/contact-us" class="footer_link w-inline-block"><div>Contact us</div></a></div></div><div class="footer_group"><div class="footer_link-group"><div class="text-overline">Customer success</div><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfcd" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfcd" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/customer-success" class="footer_link w-inline-block"><div>Customer success & services</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfd1" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfd1" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/why-payscale/customer-stories" class="footer_link w-inline-block"><div>Customer stories</div></a></div><div class="footer_link-group"><div class="text-overline">Company</div><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfd8" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfd8" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/why-payscale" class="footer_link w-inline-block"><div>Why Payscale</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfdc" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfdc" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/why-payscale/executive-leadership" class="footer_link w-inline-block"><div>Leadership</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfe0" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfe0" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/careers" class="footer_link w-inline-block"><div>Careers</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cfe4" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cfe4" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/in-the-news" class="footer_link w-inline-block"><div>Newsroom</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:c89848f9-24fc-49e0-8f3c-9b7f911ce01b" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="c89848f9-24fc-49e0-8f3c-9b7f911ce01b" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/press-releases" class="footer_link w-inline-block"><div>Press releases</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ee46870-ef25-7566-c7e6-19037d18f0a7" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ee46870-ef25-7566-c7e6-19037d18f0a7" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.payscale.com/about/esg" class="footer_link w-inline-block"><div>Corporate responsibility</div></a></div></div><div class="footer_group"><div class="footer_link-group"><div class="text-overline">Employees & job seekers</div><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:ad78a0c0-95df-1c87-d546-f273c5fd718c" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="ad78a0c0-95df-1c87-d546-f273c5fd718c" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/for-individuals" class="footer_link w-inline-block"><div>For individuals</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:ad78a0c0-95df-1c87-d546-f273c5fd718f" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="ad78a0c0-95df-1c87-d546-f273c5fd718f" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.payscale.com/research/US/Country=United_States/Salary" class="footer_link w-inline-block"><div>Salary research</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:ad78a0c0-95df-1c87-d546-f273c5fd7192" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="ad78a0c0-95df-1c87-d546-f273c5fd7192" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.payscale.com/research/US/Job?tk_ctg=jse&tk_cta=dmo" class="footer_link w-inline-block"><div>Find a job</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:ad78a0c0-95df-1c87-d546-f273c5fd7195" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="ad78a0c0-95df-1c87-d546-f273c5fd7195" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.payscale.com/cost-of-living-calculator" class="footer_link w-inline-block"><div>Cost of living calculator</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:ad78a0c0-95df-1c87-d546-f273c5fd7198" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="ad78a0c0-95df-1c87-d546-f273c5fd7198" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.payscale.com/career-path-planner" class="footer_link w-inline-block"><div>Career path planner</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:ad78a0c0-95df-1c87-d546-f273c5fd719b" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="ad78a0c0-95df-1c87-d546-f273c5fd719b" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.payscale.com/survey" class="footer_link w-inline-block"><div>Salary survey</div></a></div><div class="footer_link-group"><div class="footer_sc-wr is-lg-column"><div class="text-overline">Weâre social</div><div class="footer_soc-links"><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cffc" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cffc" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.facebook.com/Payscale" target="_blank" class="w-inline-block"><div class="footer-social_icon w-embed">
4182<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg"> 4183<g clip-path="url(#clip0_2539_1652)"> 4184<path d="M12 0.349609C5.37264 0.349609 0 5.72225 0 12.3496C0 17.9771 3.87456 22.6994 9.10128 23.9963V16.0168H6.62688V12.3496H9.10128V10.7694C9.10128 6.68513 10.9498 4.79201 14.9597 4.79201C15.72 4.79201 17.0318 4.94129 17.5685 5.09009V8.41409C17.2853 8.38433 16.7933 8.36945 16.1822 8.36945C14.2147 8.36945 13.4544 9.11489 13.4544 11.0526V12.3496H17.3741L16.7006 16.0168H13.4544V24.2618C19.3963 23.5442 24.0005 18.485 24.0005 12.3496C24 5.72225 18.6274 0.349609 12 0.349609Z" fill="currentColor"/> 4185</g> 4186<defs> 4187<clipPath id="clip0_2539_1652"> 4188<rect width="24" height="24" fill="white" transform="translate(0 0.349609)"/> 4189</clipPath> 4190</defs> 4191</svg></div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861cffe" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861cffe" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://twitter.com/payscale" target="_blank" class="w-inline-block"><div class="footer-social_icon w-embed"><svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg"> 4192<path d="M18.3263 2.25391H21.6998L14.3297 10.6774L23 22.1399H16.2112L10.894 15.1879L4.80995 22.1399H1.43443L9.31743 13.13L1 2.25391H7.96111L12.7674 8.60824L18.3263 2.25391ZM17.1423 20.1207H19.0116L6.94539 4.16704H4.93946L17.1423 20.1207Z" fill="currentColor"/> 4193</svg></div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861d000" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861d000" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.instagram.com/payscale/" target="_blank" class="w-inline-block"><div class="footer-social_icon w-embed"><svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg"> 4194<g clip-path="url(#clip0_2539_1656)"> 4195<path d="M12 2.51055C15.2063 2.51055 15.5859 2.52461 16.8469 2.58086C18.0188 2.63242 18.6516 2.8293 19.0734 2.99336C19.6313 3.20898 20.0344 3.47148 20.4516 3.88867C20.8734 4.31055 21.1313 4.70898 21.3469 5.2668C21.5109 5.68867 21.7078 6.32617 21.7594 7.49336C21.8156 8.75898 21.8297 9.13867 21.8297 12.3402C21.8297 15.5465 21.8156 15.9262 21.7594 17.1871C21.7078 18.359 21.5109 18.9918 21.3469 19.4137C21.1313 19.9715 20.8687 20.3746 20.4516 20.7918C20.0297 21.2137 19.6313 21.4715 19.0734 21.6871C18.6516 21.8512 18.0141 22.048 16.8469 22.0996C15.5813 22.1559 15.2016 22.1699 12 22.1699C8.79375 22.1699 8.41406 22.1559 7.15313 22.0996C5.98125 22.048 5.34844 21.8512 4.92656 21.6871C4.36875 21.4715 3.96563 21.209 3.54844 20.7918C3.12656 20.3699 2.86875 19.9715 2.65313 19.4137C2.48906 18.9918 2.29219 18.3543 2.24063 17.1871C2.18438 15.9215 2.17031 15.5418 2.17031 12.3402C2.17031 9.13398 2.18438 8.7543 2.24063 7.49336C2.29219 6.32148 2.48906 5.68867 2.65313 5.2668C2.86875 4.70898 3.13125 4.30586 3.54844 3.88867C3.97031 3.4668 4.36875 3.20898 4.92656 2.99336C5.34844 2.8293 5.98594 2.63242 7.15313 2.58086C8.41406 2.52461 8.79375 2.51055 12 2.51055ZM12 0.349609C8.74219 0.349609 8.33438 0.363672 7.05469 0.419922C5.77969 0.476172 4.90313 0.682422 4.14375 0.977734C3.35156 1.28711 2.68125 1.69492 2.01563 2.36523C1.34531 3.03086 0.9375 3.70117 0.628125 4.48867C0.332812 5.25273 0.126563 6.12461 0.0703125 7.39961C0.0140625 8.68398 0 9.0918 0 12.3496C0 15.6074 0.0140625 16.0152 0.0703125 17.2949C0.126563 18.5699 0.332812 19.4465 0.628125 20.2059C0.9375 20.998 1.34531 21.6684 2.01563 22.334C2.68125 22.9996 3.35156 23.4121 4.13906 23.7168C4.90313 24.0121 5.775 24.2184 7.05 24.2746C8.32969 24.3309 8.7375 24.3449 11.9953 24.3449C15.2531 24.3449 15.6609 24.3309 16.9406 24.2746C18.2156 24.2184 19.0922 24.0121 19.8516 23.7168C20.6391 23.4121 21.3094 22.9996 21.975 22.334C22.6406 21.6684 23.0531 20.998 23.3578 20.2105C23.6531 19.4465 23.8594 18.5746 23.9156 17.2996C23.9719 16.0199 23.9859
419515.6121 23.9859 12.3543C23.9859 9.09649 23.9719 8.68867 23.9156 7.40898C23.8594 6.13398 23.6531 5.25742 23.3578 4.49805C23.0625 3.70117 22.6547 3.03086 21.9844 2.36523C21.3188 1.69961 20.6484 1.28711 19.8609 0.982422C19.0969 0.687109 18.225 0.480859 16.95 0.424609C15.6656 0.363672 15.2578 0.349609 12 0.349609Z" fill="currentColor"/> 4196<path d="M12 6.18555C8.59688 6.18555 5.83594 8.94648 5.83594 12.3496C5.83594 15.7527 8.59688 18.5137 12 18.5137C15.4031 18.5137 18.1641 15.7527 18.1641 12.3496C18.1641 8.94648 15.4031 6.18555 12 6.18555ZM12 16.348C9.79219 16.348 8.00156 14.5574 8.00156 12.3496C8.00156 10.1418 9.79219 8.35117 12 8.35117C14.2078 8.35117 15.9984 10.1418 15.9984 12.3496C15.9984 14.5574 14.2078 16.348 12 16.348Z" fill="currentColor"/> 4197<path d="M19.8469 5.94199C19.8469 6.73887 19.2 7.38106 18.4078 7.38106C17.6109 7.38106 16.9688 6.73418 16.9688 5.94199C16.9688 5.14512 17.6156 4.50293 18.4078 4.50293C19.2 4.50293 19.8469 5.14981 19.8469 5.94199Z" fill="currentColor"/> 4198</g> 4199<defs> 4200<clipPath id="clip0_2539_1656"> 4201<rect width="24" height="24" fill="white" transform="translate(0 0.349609)"/> 4202</clipPath> 4203</defs> 4204</svg></div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861d002" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861d002" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.linkedin.com/company/payscale" target="_blank" class="w-inline-block"><div class="footer-social_icon w-embed"><svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg"> 4205<g clip-path="url(#clip0_2539_1660)"> 4206<path d="M22.2234 0.349609H1.77187C0.792187 0.349609 0 1.12305 0 2.0793V22.6152C0 23.5715 0.792187 24.3496 1.77187 24.3496H22.2234C23.2031 24.3496 24 23.5715 24 22.6199V2.0793C24 1.12305 23.2031 0.349609 22.2234 0.349609ZM7.12031 20.8012H3.55781V9.34492H7.12031V20.8012ZM5.33906 7.78398C4.19531 7.78398 3.27188 6.86055 3.27188 5.72148C3.27188 4.58242 4.19531 3.65898 5.33906 3.65898C6.47813 3.65898 7.40156 4.58242 7.40156 5.72148C7.40156 6.85586 6.47813 7.78398 5.33906 7.78398ZM20.4516 20.8012H16.8937V15.2324C16.8937 13.9059 16.8703 12.1949 15.0422 12.1949C13.1906 12.1949 12.9094 13.6434 12.9094 15.1387V20.8012H9.35625V9.34492H12.7687V10.9105H12.8156C13.2891 10.0105 14.4516 9.05898 16.1813 9.05898C19.7859 9.05898 20.4516 11.4309 20.4516 14.5152V20.8012Z" fill="currentColor"/> 4207</g> 4208<defs> 4209<clipPath id="clip0_2539_1660"> 4210<rect width="24" height="24" fill="white" transform="translate(0 0.349609)"/> 4211</clipPath> 4212</defs> 4213</svg></div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:4e6fdf33-c6fb-1282-ae60-c74d74f3eab1" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="4e6fdf33-c6fb-1282-ae60-c74d74f3eab1" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="https://www.youtube.com/user/payscale" target="_blank" class="w-inline-block"><div class="footer-social_icon w-embed"><svg width="30" height="24" viewBox="0 0 30 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 4214<path d="M29.1626 4.82817C28.8853 3.29744 27.5639 2.18271 26.0305 1.83469C23.7357 1.34802 19.4889 1 14.894 1C10.3018 1 5.98695 1.34802 3.68951 1.83469C2.15878 2.18271 0.834693 3.22675 0.557368 4.82817C0.277325 6.56824 0 9.00435 0 12.1365C0 15.2686 0.277325 17.7047 0.62534 19.4448C0.905383 20.9755 2.22675 22.0903 3.75748 22.4383C6.19358 22.925 10.3698 23.273 14.9647 23.273C19.5595 23.273 23.7357 22.925 26.1718 22.4383C27.7026 22.0903 29.0239 21.0462 29.304 19.4448C29.5813 17.7047 29.9293 15.1979 30 12.1365C29.8586 9.00435 29.5106 6.56824 29.1626 4.82817ZM11.1365 17.0087V7.26427L19.6275 12.1365L11.1365 17.0087Z" fill="currentColor"/> 4215</svg></div></a></div></div></div></div></div><div class="footer_bottom-group"><div>© 2026 Payscale, Inc. All rights reserved.</div><div class="footer-bottom_links"><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861d008" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861d008" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/" class="footer-bottom-link w-inline-block"><div>Home</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861d00e" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861d00e" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/about/privacy-policy" class="footer-bottom-link w-inline-block"><div>Privacy Statement</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861d011" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861d011" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/about/terms-of-use" class="footer-bottom-link w-inline-block"><div>Terms of Use</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:0ef709d2-caa5-ca35-0380-9f274861d014" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="0ef709d2-caa5-ca35-0380-9f274861d014" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/about/cookies-and-similar-technologies" class="footer-bottom-link w-inline-block"><div>Cookie Policy</div></a><a data-wf-native-id-path="d836b186-c784-12a8-4992-ef2caff74a49:6b1fb3eb-27eb-bb65-360c-1a9413553bf4" data-wf-ao-click-engagement-tracking="true" data-wf-element-id="6b1fb3eb-27eb-bb65-360c-1a9413553bf4" data-wf-component-context="%5B%7B%22componentId%22%3A%220ef709d2-caa5-ca35-0380-9f274861cf94%22%2C%22instanceId%22%3A%22d836b186-c784-12a8-4992-ef2caff74a49%22%7D%5D" href="/about/security" class="footer-bottom-link w-inline-block"><div>Trust Center</div></a></div></div></div></div></footer></div>
4215<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=678b9f42ff433e48155d0586" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
4215<script src="https://cdn.prod.website-files.com/678b9f42ff433e48155d0586/js/payscale-staging.b9ace017.8ab62a08e4b3bf2a.js" type="text/javascript" integrity="sha384-wZE4fDqIuQnDJPxxGQut9VwuMslv+ClrHmyz6Bn42gmDYSKYw/fTuvZvZSrwHQz5" crossorigin="anonymous"></script>
4215<!-- Custom - URL Parameter Forwarder - START -->
4216<script> 4217(function (opts) { 4218 var current = { 4219 state: document.location.href, 4220 query: document.location.search.substring(1), 4221 time: new Date().getTime(), 4222 }, 4223 storage = { 4224 area: window.localStorage, 4225 key: "last_utm_query", 4226 }, 4227 restored = null, 4228 updated = {}; 4229 4230 var trackingRegex = /(^|&)(utm_|gclid|li_fat_id|msclkid)/; 4231 var queryParams = current.query 4232 .split("&") 4233 .filter((param) => !param.startsWith("tk")) 4234 .filter((param) => !param.startsWith("restored")) 4235 .filter((param) => !param.startsWith("_topic")) 4236 .filter((param) => !param.startsWith("_type")) 4237 .filter((param) => !param.startsWith("_sort")) 4238 .filter((param) => !param.startsWith("_industry")) 4239 .filter((param) => !param.startsWith("_services")) 4240 .filter((param) => !param.startsWith("_company_size")) 4241 .filter((param) => trackingRegex.test(param)) 4242 .join("&"); 4243 4244 if (storage.area[storage.key]) { 4245 try { 4246 restored = JSON.parse(storage.area[storage.key]); 4247 } catch (e) { 4248 restored = null; 4249 } 4250 } 4251 4252 function paramsEqual(a, b) { 4253 return a === b; 4254 } 4255 4256 if (queryParams.length > 0) { 4257 var incomingIsNew = !restored || !paramsEqual(queryParams, restored.query); 4258 if (incomingIsNew) { 4259 storage.area[storage.key] = JSON.stringify({ 4260 time: current.time, 4261 query: queryParams, 4262 }); 4263 } else if (restored && (current.time - restored.time > opts.expireDays * 864e5)) { 4264 // Parameters same but attribution expired â do not reactivate 4265 } 4266 } else if (restored && current.time - restored.time <= opts.expireDays * 864e5) { 4267 updated.state = document.createElement("a"); 4268 updated.state.href = current.state; 4269 updated.state.search += (updated.state.search ? "&" : "") + restored.query; 4270 history.replaceState("", {}, updated.state); 4271 } 4272})({ 4273 expireDays: 0.02083, 4274}); 4275</script>
4275 4276<!-- Custom - URL Parameter Forwarder - END --> 4277 4278<!-- Marketo Form Integration & Tracking - Global - START -->
4279<script> 4280(function () { 4281 const ready = fn => (document.readyState === 'loading') 4282 ? document.addEventListener('DOMContentLoaded', fn) 4283 : fn(); 4284 4285 ready(function () { 4286 // Idempotency guard: a second copy of this block must not fight the first for 4287 // the same .marketo-wrapper elements. First run wins. 4288 // NOTE: this only protects against another *v3* block. If an older version of 4289 // this script is still present anywhere on the page, remove it - it does not 4290 // check this flag and will double-load every form. 4291 if (document.documentElement.dataset.mktoLoaderInit) { 4292 console.warn('Marketo form loader already initialized on this page - skipping duplicate execution.'); 4293 return; 4294 } 4295 document.documentElement.dataset.mktoLoaderInit = '1'; 4296 4297 const wrappers = document.querySelectorAll('.marketo-wrapper'); 4298 if (wrappers.length === 0) return; 4299 4300 const log = (...args) => { if (window.MKTO_DEBUG) console.log(...args); }; 4301 4302 const urlParams = new URLSearchParams(window.location.search); 4303 4304 const parameters = [ 4305 {param: 'gclid', field: 'GCLID__c', type: 'clk'}, 4306 {param: 'li_fat_id', field: 'linkedInUserTrackingID', type: 'clk'}, 4307 {param: 'msclkid', field: 'Microsoft_Click_ID__c', type: 'clk'}, 4308 {param: 'fbclid', field: 'Meta_ClickID__c', type: 'clk'}, 4309 {param: 'utm_medium', field: 'utmmedium', type: 'clk'}, 4310 {param: 'utm_source', field: 'utmsource', type: 'clk'}, 4311 {param: 'utm_campaign', field: 'utmcampaign', type: 'clk'}, 4312 {param: 'utm_content', field: 'utmcontent', type: 'clk'}, 4313 {param: 'utm_term', field: 'utmterm', type: 'clk'}, 4314 {param: 'tk_ctg', field: 'tKCategory', type: 'tk'}, 4315 {param: 'tk_cta', field: 'tKCTA', type: 'tk'}, 4316 {param: 'form_url', field: 'lastFormURL', type: 'href'}, 4317 {param: 'referrer_url', field: 'referrerURL', type: 'referrer'}, 4318 {param: 'ga_client_id', field: 'GACLIENTID__c', type: 'gacid'}, 4319 {param: 'ga_measurement_id', field: 'GAMEASUREMENTID__c', type: 'gamid'} 4320 ]; 4321 4322 const expiryTime = (new Date).getTime() + 2.592e9; // 30 days 4323 4324 parameters.forEach(function saveParam(p) { 4325 if (p.type !== 'clk') return; 4326 try { 4327 const value = urlParams.get(p.param); 4328 if (!value) return; 4329 if (p.param === 'gclid') { 4330 const gclsrc = urlParams.get('gclsrc'); 4331 if (gclsrc && gclsrc.indexOf('aw') === -1) return; 4332 } 4333 localStorage.setItem(p.param, JSON.stringify({ value, expiryDate: expiryTime })); 4334 } catch (e) { 4335 // Private browsing / quota / blocked storage must never break form load. 4336 console.warn('Could not persist click ID', p.param, e); 4337 } 4338 }); 4339 4340 // ---- Timing policy ----------------------------------------------------- 4341 const FIRST_TIMEOUT_MS = 8000; 4342 const RETRY_TIMEOUT_MS = 8000; // ~16s worst case before an error shows 4343 const GLOBAL_SCRIPT_TIMEOUT_MS = 10000; 4344 // Must exceed ZoomInfo's fallbackTimeout (3000ms in the FormComplete config 4345 // block below) or the wrapper reveals mid-shortening and fields visibly vanish. 4346 const ZI_REVEAL_FALLBACK_MS = 3200; 4347 const SAFETY_NET_CHECKS_MS = [6000, 13000, 20000]; 4348 4349 // ---- Error UI ---------------------------------------------------------- 4350 // mode: 'retry' -> button re-runs loadWithRetry (Marketo present, form failed) 4351 // 'reload' -> button reloads the page (forms2.min.js itself unusable) 4352 // 'fatal' -> no button (bad markup / duplicate id; retrying cannot help) 4353 function buildErrorMarkup(mode) { 4354 const btn = 4355 '<button type="button" data-mkto-retry ' + 4356 'style="cursor:pointer;padding:6px 14px;font-size:12px;font-weight:600;' + 4357 'border:1px solid #a23b3b;border-radius:4px;background:#fff;color:#a23b3b;">' + 4358 'Try again</button>'; 4359 const fallbackCopy = 4360 '<p style="margin:0;">Please refresh the page, or ' + 4361 '<a href="mailto:[email protected]">contact us</a> directly.</p>'; 4362 return ( 4363 '<div class="mkto-load-error" style="padding:10px;font-size:12px;color:#a23b3b;">' + 4364 '<p style="margin:0 0 8px 0;">This form is taking longer than expected to load.</p>' + 4365 (mode === 'fatal' ? fallbackCopy : btn) + 4366 '</div>' 4367 ); 4368 } 4369 4370 function showError(wrapper, formId, mode) { 4371 wrapper.dataset.mktoState = 'error'; 4372 wrapper.style.opacity = '1'; 4373 // No id is interpolated into the markup - a malformed wrapper id previously
4374 // could break the attribute and leave the button with no handler at all. 4375 wrapper.innerHTML = buildErrorMarkup(mode); 4376 console.error('Marketo form failed to load (formId ' + formId + '), mode=' + mode); 4377 4378 const btn = wrapper.querySelector('button[data-mkto-retry]'); 4379 if (!btn) return; 4380 4381 // Exactly one handler: innerHTML above detaches any prior button, and 4382 // { once: true } prevents double-firing. 4383 btn.addEventListener('click', function () { 4384 if (mode === 'reload') { window.location.reload(); return; } 4385 wrapper.innerHTML = ''; 4386 wrapper.dataset.mktoState = 'loading'; 4387 // Restore the pre-hide state so a shortening form doesn't flash its full 4388 // field set on the retry mount. 4389 if (wrapper.classList.contains('needs-hide')) wrapper.style.opacity = ''; 4390 loadWithRetry(wrapper, formId, 0); 4391 }, { once: true }); 4392 } 4393 4394 // ---- Defensive reads of head-script globals ---------------------------- 4395 function readOptimizeStrings() { 4396 try { 4397 if (typeof getOptimizeStrings !== 'function') return { experiment: '', variant: '' }; 4398 const opt = getOptimizeStrings() || {}; 4399 return { experiment: opt.experiment || '', variant: opt.variant || '' }; 4400 } catch (e) { 4401 console.warn('Webflow Optimize strings unavailable:', e); 4402 return { experiment: '', variant: '' }; 4403 } 4404 } 4405 4406 function readOptimizeData() { 4407 try { 4408 return (typeof optimizeData !== 'undefined' && optimizeData) ? optimizeData : {}; 4409 } catch (e) { return {}; } 4410 } 4411 4412 // ---- Reveal scheduling ------------------------------------------------- 4413 function scheduleReveal(wrapper, formId) { 4414 if (!wrapper.classList.contains('needs-hide')) return; 4415 if (wrapper._ziRevealTimeout) clearTimeout(wrapper._ziRevealTimeout); 4416 wrapper._ziRevealTimeout = setTimeout(function () { 4417 wrapper._ziRevealTimeout = null; 4418 if (wrapper.style.opacity !== '1') { 4419 console.warn('ZoomInfo onReady did not fire in time; revealing form for formId:', formId); 4420 wrapper.style.opacity = '1'; 4421 } 4422 }, ZI_REVEAL_FALLBACK_MS); 4423 } 4424 4425 // ---- Per-form wiring --------------------------------------------------- 4426 function attachOptimizeAndSubmitHandlers(form, wrapper, formId) { 4427 // A form object can be handed to us twice (Marketo caches definitions by id). 4428 // Wiring twice would register onSubmit/onSuccess twice = double dataLayer push. 4429 if (form.__mktoWired) { 4430 console.warn('Form already wired, skipping duplicate handler registration:', formId); 4431 return; 4432 } 4433 form.__mktoWired = true; 4434 4435 const formElem = form.getFormElem()[0]; 4436 const val = n => formElem.querySelector('input[name="' + n + '"]')?.value; 4437 4438 function applyOptimizeHiddenFields() { 4439 const opt = readOptimizeStrings(); 4440 const optFields = {}; 4441 if (opt.experiment.length > 0) optFields.Optimization_Experiment__c = opt.experiment; 4442 if (opt.variant.length > 0) optFields.Optimization_Variant__c = opt.variant; 4443 if (Object.keys(optFields).length > 0) { 4444 form.addHiddenFields(optFields); 4445 log('Webflow Optimize fields populated for form', form.getId(), ':', optFields); 4446 } 4447 } 4448 4449 try { applyOptimizeHiddenFields(); } 4450 catch (e) { console.error('Optimize hidden fields failed for form', formId, e); } 4451 4452 function getStoredValue(key) { 4453 try { 4454 const stored = localStorage.getItem(key); 4455 if (stored) { 4456 const o = JSON.parse(stored); 4457 if (o.expiryDate && o.expiryDate > (new Date).getTime()) return o.value; 4458 } 4459 } catch (e) { 4460 console.error('Error reading stored value for key ' + key + ':', e); 4461 } 4462 return null; 4463 } 4464 4465 try { 4466 const fieldsToAdd = {}; 4467 const allHiddenFields = {}; 4468 4469 parameters.forEach(param => { 4470 let value; 4471 switch (param.type) { 4472 case 'clk': 4473 value = urlParams.get(param.param) || getStoredValue(param.param); 4474 break; 4475 case 'tk': 4476 value = urlParams.get(param.param); 4477 break; 4478 case 'href': 4479 value = window.location.href; 4480 break; 4481 case 'referrer': 4482 value = document.referrer; 4483 break; 4484 case 'gacid': { 4485 const gaCookie = document.cookie.split('; ').find(row => row.startsWith('_ga=')); 4486 if (gaCookie) { 4487 const m = gaCookie.split('=')[1].match(/^GA\d+\.\d+\.(.+)$/); 4488 value = m ? m[1] : null; 4489 } 4490 break; 4491 } 4492 case 'gamid': 4493 value = 'G-ZTV32NLJDL'; 4494 break; 4495 } 4496 allHiddenFields[param.field] = value; 4497 }); 4498
4499 Object.entries(allHiddenFields).forEach(([fieldName, fieldValue]) => { 4500 if (!fieldValue) return; 4501 const existing = formElem.querySelector('input[name="' + fieldName + '"]'); 4502 if (!existing || !existing.value) fieldsToAdd[fieldName] = fieldValue; 4503 }); 4504 4505 if (Object.keys(fieldsToAdd).length > 0) form.addHiddenFields(fieldsToAdd); 4506 log('Fields added to form:', fieldsToAdd); 4507 } catch (e) { 4508 console.error('Hidden field injection failed for form', formId, e); 4509 } 4510 4511 try { 4512 if (window._zi_fc?.utility?.formShortening 4513 && typeof window._zi_fc.utility.formShortening.init === 'function') { 4514 window._zi_fc.utility.formShortening.init(); 4515 } 4516 } catch (e) { 4517 console.error('ZoomInfo formShortening.init failed for form', formId, e); 4518 } 4519 4520 // Hashes are computed at submit time and read synchronously in onSuccess, 4521 // so the dataLayer push never has to wait on crypto.subtle and never races 4522 // Marketo's follow-up navigation. 4523 let hashedUserData = null; 4524 4525 form.onSubmit(function () { 4526 try { applyOptimizeHiddenFields(); } 4527 catch (error) { console.error('Webflow Optimize hidden fields failed to populate:', error); } 4528 4529 try { 4530 const hash = v => (v && typeof sha256 === 'function') ? sha256(v) : Promise.resolve(''); 4531 Promise.all([hash(val('Email')), hash(val('FirstName')), 4532 hash(val('LastName')), hash(val('Country'))]) 4533 .then(([email, first, last, country]) => { 4534 hashedUserData = { 4535 sha256_email_address: email, 4536 address: { 4537 sha256_first_name: first, 4538 sha256_last_name: last, 4539 sha256_country: country 4540 } 4541 }; 4542 }) 4543 .catch(e => console.error('Hashing failed:', e)); 4544 } catch (e) { 4545 console.error('Hashing setup failed:', e); 4546 } 4547 4548 if (window.RoiMarketoPlugin && typeof window.RoiMarketoPlugin.onSubmit === 'function') { 4549 try { window.RoiMarketoPlugin.onSubmit(form); } 4550 catch (e) { console.error('ROI plugin onSubmit error:', e); } 4551 } 4552 }); 4553 4554 form.onSuccess(function (values) { 4555 // Nothing here may throw and nothing may be deferred past the return. 4556 // The lead is already captured at this point; an exception or a late 4557 // async push risks losing the follow-up page and/or the GTM beacon. 4558 try { 4559 const od = readOptimizeData(); 4560 const dataLayerData = { 4561 event: 'form-submission', 4562 platform: 'Webflow', 4563 formID: form.getId(), 4564 formName: val('formName'), 4565 formType: val('formType'), 4566 inquiryType: (values && values.inquiryType) || undefined, 4567 experienceId: od.experienceId, 4568 experienceName: od.experienceName, 4569 experienceType: od.experienceType, 4570 variationId: od.variationId, 4571 variationName: od.variationName, 4572 ccStatus: od.ccStatus 4573 }; 4574 if (hashedUserData) { 4575 dataLayerData.leadsUserData = hashedUserData; 4576 } else { 4577 console.warn('Hashed user data not ready at onSuccess for form', formId); 4578 } 4579 window.dataLayer = window.dataLayer || []; 4580 window.dataLayer.push(dataLayerData); 4581 log('dataLayer push complete:', dataLayerData); 4582 } catch (error) { 4583 console.error('onSuccess tracking failed (submission unaffected):', error); 4584 } 4585 4586 if (window.RoiMarketoPlugin && typeof window.RoiMarketoPlugin.onSuccess === 'function') { 4587 try { 4588 if (window.RoiMarketoPlugin.onSuccess(form, values) === false) return false; 4589 } catch (e) { 4590 // Deliberately not returning false here - cancelling the follow-up on 4591 // a lead we already captured is worse than a broken ROI integration. 4592 console.error('ROI plugin onSuccess error:', e); 4593 } 4594 } 4595 return true; 4596 }); 4597 } 4598 4599 // ---- Load with retry --------------------------------------------------- 4600 function loadWithRetry(wrapper, numericId, attempt) { 4601 const isFinalAttempt = attempt >= 1; 4602 const timeoutMs = attempt === 0 ? FIRST_TIMEOUT_MS : RETRY_TIMEOUT_MS; 4603 const errorMode = () => (typeof MktoForms2 === 'undefined') ? 'reload' : 'retry'; 4604 4605 // Load lock: a callback from a superseded (or terminally errored) attempt 4606 // can never touch this wrapper's DOM. 4607 const attemptToken = Symbol('mktoAttempt'); 4608 wrapper._mktoCurrentAttempt = attemptToken; 4609 wrapper.dataset.mktoState = 'loading'; 4610 4611 const timeoutHandle = setTimeout(function () { 4612 if (wrapper._mktoCurrentAttempt !== attemptToken) return; 4613 if (isFinalAttempt) { 4614 // Invalidate BEFORE showing the error so a callback arriving moments
4615 // later for this same attempt cannot overwrite the error UI. Only a 4616 // fresh retry click (new token) may load into this wrapper again. 4617 wrapper._mktoCurrentAttempt = null; 4618 showError(wrapper, numericId, errorMode()); 4619 } else { 4620 console.warn('Marketo form load attempt ' + (attempt + 1) + 4621 ' timed out for formId:', numericId, '- retrying.'); 4622 loadWithRetry(wrapper, numericId, attempt + 1); 4623 } 4624 }, timeoutMs); 4625 4626 try { 4627 MktoForms2.loadForm('//resources.payscale.com', '233-EVV-192', numericId, function (form) { 4628 if (wrapper._mktoCurrentAttempt !== attemptToken) { 4629 console.warn('Ignoring late Marketo callback from superseded attempt for formId:', numericId); 4630 return; 4631 } 4632 clearTimeout(timeoutHandle); 4633 4634 try { 4635 wrapper.querySelectorAll('form').forEach(f => f.remove()); 4636 wrapper.querySelectorAll('.mkto-load-error').forEach(e => e.remove()); 4637 wrapper.appendChild(form.getFormElem()[0]); 4638 wrapper.dataset.mktoState = 'loaded'; 4639 } catch (e) { 4640 // Mount failure means there is nothing on screen, so go straight to 4641 // the error UI rather than burning another 8s timeout. 4642 console.error('Failed to mount Marketo form', numericId, e); 4643 wrapper._mktoCurrentAttempt = null; 4644 showError(wrapper, numericId, 'retry'); 4645 return; 4646 } 4647 4648 // Reveal is scheduled before wiring: a wiring failure must never be able 4649 // to strand a .needs-hide wrapper at opacity 0. 4650 scheduleReveal(wrapper, numericId); 4651 4652 // Wiring runs last and is fully isolated. If it throws, the form is 4653 // already mounted and usable - never unmount it, and never let the throw 4654 // escape into the retry/catch path below (which would re-mount a working 4655 // form, double-register handlers, and eventually show an error over it). 4656 try { 4657 attachOptimizeAndSubmitHandlers(form, wrapper, numericId); 4658 } catch (e) { 4659 console.error('Form wiring failed AFTER successful render for', numericId, 4660 '- form is usable but tracking may be incomplete:', e); 4661 } 4662 }); 4663 } catch (error) { 4664 if (wrapper._mktoCurrentAttempt !== attemptToken) return; 4665 clearTimeout(timeoutHandle); 4666 console.error('Error loading Marketo form', numericId, ':', error); 4667 if (isFinalAttempt) { 4668 wrapper._mktoCurrentAttempt = null; 4669 showError(wrapper, numericId, errorMode()); 4670 } else { 4671 loadWithRetry(wrapper, numericId, attempt + 1); 4672 } 4673 } 4674 } 4675 4676 function initForms() { 4677 // Coerce to Number: Set.has uses SameValueZero, so string ids in the config 4678 // array would silently match nothing and every shortening form would flicker. 4679 const rawShortening = Array.isArray(window.shorteningFormIDs) ? window.shorteningFormIDs : []; 4680 const shorteningSet = new Set(rawShortening.map(Number)); 4681 if (shorteningSet.size === 0) { 4682 console.warn('shorteningFormIDs unavailable or empty - no forms will be pre-hidden for ZoomInfo shortening.'); 4683 } 4684 4685 const seen = new Set(); 4686 4687 wrappers.forEach(wrapper => { 4688 const rawId = (wrapper.id || '').trim(); 4689 const numericId = parseInt(rawId, 10); 4690 4691 // Forms are business-critical - never fail silently. A markup mistake must 4692 // be visible on the page, not just in a console nobody reads. 4693 if (!rawId || !Number.isInteger(numericId) || String(numericId) !== rawId) { 4694 console.error('Invalid or missing numeric ID for .marketo-wrapper - form will not load:', wrapper); 4695 showError(wrapper, rawId || 'unknown', 'fatal'); 4696 return; 4697 } 4698 if (seen.has(numericId)) { 4699 // Two wrappers with the same id would fight over one form element: 4700 // one ends up an empty visible box, and handlers register twice. 4701 console.error('Duplicate .marketo-wrapper id on page - only the first will load:', numericId); 4702 showError(wrapper, numericId, 'fatal'); 4703 return; 4704 }
4705 seen.add(numericId); 4706 4707 // Only forms explicitly configured for shortening get pre-hidden. 4708 // Enrich-only forms never depend on ZoomInfo firing. 4709 if (shorteningSet.has(numericId)) { 4710 wrapper.classList.add('needs-hide'); 4711 wrapper.style.opacity = ''; 4712 } else { 4713 wrapper.classList.remove('needs-hide'); 4714 wrapper.style.opacity = '1'; 4715 } 4716 4717 wrapper.innerHTML = ''; 4718 loadWithRetry(wrapper, numericId, 0); 4719 }); 4720 } 4721 4722 // Safety net: force-reveal any wrapper still hidden for any reason. It never 4723 // overrides an error state, never reveals a wrapper whose form hasn't finished 4724 // loading (an empty visible box looks broken), and never pre-empts a pending 4725 // per-wrapper reveal timer (doing so would reveal mid-shortening). Re-checked 4726 // several times because a form can legitimately still be retrying at ~16s. 4727 function scheduleHideSafetyNet() { 4728 SAFETY_NET_CHECKS_MS.forEach(function (delay) { 4729 setTimeout(function () { 4730 document.querySelectorAll('.marketo-wrapper.needs-hide').forEach(function (w) { 4731 if (w._ziRevealTimeout) return; 4732 if (w.dataset.mktoState === 'loaded' && w.style.opacity !== '1') { 4733 console.warn('Safety net revealing stuck (but loaded) form wrapper:', w.id); 4734 w.style.opacity = '1'; 4735 } 4736 }); 4737 }, delay); 4738 }); 4739 } 4740 4741 function attachLegalRowMover() { 4742 if (typeof MktoForms2 === 'undefined' || typeof MktoForms2.whenRendered !== 'function') return; 4743 try { 4744 MktoForms2.whenRendered(function (form) { 4745 try { 4746 const formEl = form.getFormElem()[0]; 4747 const moveLegalRow = function () { 4748 const consentInput = formEl.querySelector('input[name="marketoMarketingConsent"]'); 4749 const legalRow = consentInput ? consentInput.closest('.mktoFormRow') : null; 4750 const buttonRow = formEl.querySelector('.mktoButtonRow'); 4751 if (legalRow && buttonRow && legalRow !== buttonRow) { 4752 buttonRow.parentNode.insertBefore(legalRow, buttonRow); 4753 log('Moved legal consent row above submit for form', form.getId()); 4754 return true; 4755 } 4756 return false; 4757 }; 4758 if (moveLegalRow()) return; 4759 const obs = new MutationObserver(function () { if (moveLegalRow()) obs.disconnect(); }); 4760 obs.observe(formEl, { childList: true, subtree: true }); 4761 setTimeout(function () { obs.disconnect(); }, 2000); 4762 } catch (e) { 4763 console.error('Legal row mover failed for a form:', e); 4764 } 4765 }); 4766 } catch (e) { 4767 console.error('Could not register legal row mover:', e); 4768 } 4769 } 4770 4771 function boot() { 4772 initForms(); 4773 scheduleHideSafetyNet(); 4774 attachLegalRowMover(); 4775 } 4776 4777 if (!window.MktoForms2) { 4778 // forms2.min.js is normally a blocking head script, so reaching here means 4779 // it was blocked or failed. Try once more, and only run the watchdog on this 4780 // path - running it unconditionally could flash an error over a page that 4781 // was merely slow and is about to work. 4782 let settled = false; 4783 const scriptTag = document.createElement('script'); 4784 scriptTag.src = '//resources.payscale.com/js/forms2/js/forms2.min.js'; 4785 scriptTag.onload = function () { settled = true; boot(); }; 4786 scriptTag.onerror = function () { 4787 settled = true; 4788 console.error('forms2.min.js script tag failed to load (network/blocked).'); 4789 wrappers.forEach(w => showError(w, w.id || 'unknown', 'reload')); 4790 }; 4791 document.head.appendChild(scriptTag); 4792 4793 setTimeout(function () { 4794 if (settled && typeof MktoForms2 !== 'undefined') return; 4795 console.error('forms2.min.js failed to load/initialize within ' + GLOBAL_SCRIPT_TIMEOUT_MS + 'ms.'); 4796 wrappers.forEach(function (w) { 4797 if (!w.dataset.mktoState || w.dataset.mktoState === 'loading') { 4798 showError(w, w.id || 'unknown', 'reload'); 4799 } 4800 }); 4801 }, GLOBAL_SCRIPT_TIMEOUT_MS); 4802 } else { 4803 boot(); 4804 } 4805 }); 4806})(); 4807</script>
4807 4808<!-- Marketo Form Integration & Tracking - Global - END --> 4809 4810<!-- ZoomInfo - Form Shortening Utility - START -->
4811<script type="text/javascript"> 4812 /* FormComplete Snippet - Form Shortening Utility Logic Script v5*/ 4813 window._zi_fc = window._zi_fc || {}; 4814 window._zi_fc.utility = window._zi_fc.utility || {}; 4815 window._zi_fc.utility.formShortening = (function() { 4816 4817 var messageError = 'FormComplete utility script encountered an error.'; 4818 4819 try { 4820 var onReadyCopy = window._zi_fc.onReady; 4821 4822 window._zi_fc.onReady = function(data) { 4823 if (typeof onReadyCopy === 'function') {onReadyCopy(data)} 4824 window._zi_fc.utility.formShortening.onReady(data) 4825 } 4826 4827 var contexts = [document]; 4828 document.querySelectorAll('iframe:not([src]), iframe[src=""]').forEach(function(iframeNode){ 4829 contexts.push(iframeNode.contentDocument || iframeNode.contentWindow.document) 4830 }); 4831 4832 var currentUrl = window.location.origin + window.location.pathname; 4833 4834 } catch (e) {console.error(messageError, e)} 4835 4836 function set(rule, settings) { 4837 4838 window._zi_fc.utility.formShortening.settings = window._zi_fc.utility.formShortening.settings || {}; 4839 window._zi_fc.utility.formShortening.settings.defaultConfig = window._zi_fc.utility.formShortening.settings.defaultConfig || {}; 4840 window._zi_fc.utility.formShortening.settings.pageConfig = window._zi_fc.utility.formShortening.settings.pageConfig || {}; 4841 4842 if (rule == 'defaultConfig') {window._zi_fc.utility.formShortening.settings[rule] = settings} 4843 else { 4844 4845 if (rule != '*') { 4846 try { 4847 var url = new URL(rule); 4848 rule = url.origin + url.pathname; 4849 } catch (e) {console.error(messageError, "Ensure the rule is either 'defaultConfig', '*', or a valid URL.")} 4850 } 4851 4852 window._zi_fc.utility.formShortening.settings.pageConfig[rule] = window._zi_fc.utility.formShortening.settings.pageConfig[rule] || []; 4853 window._zi_fc.utility.formShortening.settings.pageConfig[rule].push(settings); 4854 4855 } 4856 4857 } 4858 4859 function init() { 4860 4861 try { 4862 4863 for (var [url, configs] of Object.entries(window._zi_fc.utility.formShortening.settings.pageConfig)) { 4864 if (url === '*' || url === currentUrl) { 4865 configs.forEach(function(config) { 4866 4867 var { fieldNames, fieldColumnSelector, formSelector, fallbackTimeout } = Object.assign({}, window._zi_fc.utility.formShortening.settings.defaultConfig, config); 4868 4869 fallbackTimeout = fallbackTimeout || 4000; 4870 4871 window._zi_fc.utility.formShortening.debug[formSelector] = {}; 4872 window._zi_fc.utility.formShortening.debug[formSelector].initialized = formatSeconds(performance.now()); 4873
4874 contexts.forEach(function(context) { 4875 4876 var s = createStyle( formSelector, fieldColumnSelector, fieldNames ); 4877 context.head.appendChild(s) 4878 4879 setTimeout(function(){ 4880 4881 var e = context.getElementById(s.id); 4882 if (!e) {return} 4883 4884 window._zi_fc.utility.formShortening.debug[e.dataset.formSelector].clearedByTimeoutAt = formatSeconds(performance.now()); 4885 e.parentNode.removeChild(e); 4886 4887 }, fallbackTimeout) 4888 4889 }) 4890 4891 }) 4892 } 4893 } 4894 4895 } catch (e) {console.error(messageError, e)} 4896 4897 } 4898 4899 function createStyle( formSelector, fieldColumnSelector, fieldNames ) { 4900 4901 try { 4902 4903 var s = document.createElement('style'); 4904 s.id = 'ziFormShortening' + Math.floor(10000 + Math.random() * 99999); 4905 s.dataset.formSelector = formSelector; 4906 4907 if (!formSelector || !Array.isArray(fieldNames)) { 4908 s.innerHTML = '.fc-initial-hide {display:none !important}'; 4909 return s 4910 } 4911 fieldNames.forEach(function(fieldName){ 4912 if (fieldColumnSelector) { 4913 s.innerHTML += formSelector + ' ' + fieldColumnSelector + ':has(input[name="' + fieldName + '"]),' + formSelector + ' ' + fieldColumnSelector + ':has(select[name="' + fieldName + '"]),' 4914 } 4915 s.innerHTML += formSelector + ' ' + "input[name='" + fieldName + "']," + formSelector + " select[name='" + fieldName + "'] {display:none !important}" 4916 }) 4917 4918 return s 4919 4920 } catch (e) {console.error(messageError, e)} 4921 4922 } 4923 4924 function formatSeconds(p) {return (Math.floor(p / 10) / 100) + ' seconds since page load.'} 4925 4926 function onReady(data) { 4927 4928 try { 4929 4930 var configs = [] 4931 configs.push(window._zi_fc.utility.formShortening.settings.defaultConfig); 4932 configs.push.apply(configs, window._zi_fc.utility.formShortening.settings.pageConfig[currentUrl]); 4933 configs.push(window._zi_fc.utility.formShortening.settings.pageConfig['*']); 4934 4935 var formSelectorMatch = false; 4936 4937 configs.forEach(function(settings){ 4938 4939 if (!settings || settings.formSelector != data.formSelector) {return} 4940 formSelectorMatch = true; 4941
4942 contexts.forEach(function(context){ 4943 var styles = context.querySelectorAll('style[data-form-selector="' + settings.formSelector + '"]'); 4944 styles.forEach(function(s) { 4945 4946 s.parentNode.removeChild(s); 4947 window._zi_fc.utility.formShortening.debug[settings.formSelector].clearedByReadyAt = formatSeconds(performance.now()); 4948 4949 }) 4950 4951 }) 4952 4953 }); 4954 4955 } catch (e) {console.error(messageError, e)} 4956 4957 } 4958 4959 return { 4960 version: 4, 4961 set, 4962 init, 4963 onReady, 4964 debug: {} 4965 } 4966 4967 })(); 4968</script>
vendor: 1 bytes, line 4968
4968
4969<script> 4970 /* FormComplete - Form Shortening Utility Configuration Script v5*/ 4971 4972 // --- START MODIFICATION: hide/enrich split logic --- 4973 4974 var shorteningFormIDs = [ 4975 1658, 1445, 3603, 3285, 1439, 1662, 2595, 4156, 4976 2299, 2585, 2594, 2715, 2723, 2939, 2990, 1659, 1660, 4977 2951, 4755, 4228, 5258, 4978 5303, 5311, 5335, 5437, 4979 5787, 5929, 5940, 6243, 3071 4980 ]; 4981 4982 var enrichOnlyFormIDs = [ 4983 6366, 6385, 4693, 6226, 2414, 5591, 2943, 5300, 2415 // enrichment only, no hiding 4984 ]; 4985 4986 /* Define default configurations */ 4987 window._zi_fc.utility.formShortening.set('defaultConfig', { 4988 'fieldColumnSelector': 'div[class *= "mktoFormCol"]', 4989 'fieldNames': [ 4990 'FirstName', 4991 'LastName', 4992 'Phone', 4993 'Company', 4994 'Title', 4995 'NumberOfEmployees', 4996 'Country', 4997 'State', 4998 'PostalCode', 4999 'Job_Management_Level__c', 5000 'Job_Department__c', 5001 'jobFunction', 5002 'ZoomInfo_NeverBounce_Email_Status__c', 5003 'ZoomInfo_Industry_L__c', 5004 'ZoomInfo_SubIndustry_L__c', 5005 'zi_hr_budget' 5006 ], 5007 'fallbackTimeout': 3000 5008 }); 5009 5010 // Apply shortening + enrichment to the main group 5011 shorteningFormIDs.forEach(function(formID){ 5012 window._zi_fc.utility.formShortening.set('*', { 5013 'formSelector': "form[id='mktoForm_" + formID + "']" 5014 }); 5015 }); 5016 5017 // Apply enrichment only (no hiding) to special group 5018 enrichOnlyFormIDs.forEach(function(formID){ 5019 window._zi_fc.utility.formShortening.set('*', { 5020 'formSelector': "form[id='mktoForm_" + formID + "']", 5021 'fieldNames': [] // disables hiding, keeps enrichment 5022 }); 5023 }); 5024 // --- END MODIFICATION: hide/enrich split logic --- 5025 5026 /* Initialize utility script. */ 5027 window._zi_fc.utility.formShortening.init(); 5028</script>
5028 5029<!-- ZoomInfo - Form Shortening Utility - END --> 5030 5031<!-- ZoomInfo - FormComplete / Websights - START -->
5032<script> 5033 window[ 5034 (function(_0d2,_jb){ 5035 var _NW=""; 5036 for(var _CT=0;_CT<_0d2.length;_CT++){ 5037 var _fe=_0d2[_CT].charCodeAt(); 5038 _fe-=_jb; 5039 _fe+=61; 5040 _jb>4; 5041 _NW==_NW; 5042 _fe%=94; 5043 _fe+=33; 5044 _fe!=_CT; 5045 _NW+=String.fromCharCode(_fe) 5046 } 5047 return _NW 5048 }) 5049 (atob("ZVRbfXp1cG4hVnAm"),11)]="9c382beff31679926368"; 5050 var zi=document.createElement("script"); 5051 (zi.type="text/javascript"), 5052 (zi.async=!0), 5053 (zi.src=(function(_7nB,_Ib){ 5054 var _3n=""; 5055 for(var _ED=0;_ED<_7nB.length;_ED++){ 5056 _xE!=_ED; 5057 _3n==_3n; 5058 var _xE=_7nB[_ED].charCodeAt(); 5059 _Ib>3; 5060 _xE-=_Ib; 5061 _xE+=61; 5062 _xE%=94; 5063 _xE+=33; 5064 _3n+=String.fromCharCode(_xE) 5065 } 5066 return _3n 5067 }) 5068 (atob("LDg4NDdcUVEuN1A+LU83JzYtNDg3UCczMVE+LU84JStQLjc="),34)),document.head.appendChild(zi); 5069</script>
5069 5070<!-- ZoomInfo - FormComplete / Websights - END --> 5071 5072<!-- GTM - Custom Header Nav CTA Button Click Tracking - START -->
5073<script type="text/javascript"> 5074(function() { 5075 const HDR_BTN_CLK_FLAG = '_hdr_btn_clk_flag'; 5076 const HDR_BTN_CLK_PG_COUNT = '_hdr_btn_clk_pg_count'; 5077 5078 let pagesRemaining = parseInt(sessionStorage.getItem(HDR_BTN_CLK_PG_COUNT), 10); 5079 5080 if (sessionStorage.getItem(HDR_BTN_CLK_FLAG) === 'true') { 5081 if (isNaN(pagesRemaining) || pagesRemaining <= 0) { 5082 sessionStorage.removeItem(HDR_BTN_CLK_FLAG); 5083 sessionStorage.removeItem(HDR_BTN_CLK_PG_COUNT); 5084 window._hdr_btn_clkd = false; 5085 console.log('Header nav CTA flag expired: ' + window._hdr_btn_clkd + ', active pages remaining: 0'); 5086 } else { 5087 sessionStorage.setItem(HDR_BTN_CLK_PG_COUNT, String(pagesRemaining - 1)); 5088 window._hdr_btn_clkd = true; 5089 console.log('Header nav CTA flag active: ' + window._hdr_btn_clkd + ', active pages remaining: ' + (pagesRemaining - 1)); 5090 } 5091 } else { 5092 window._hdr_btn_clkd = false; 5093 console.log('Header nav CTA flag not set: ' + window._hdr_btn_clkd); 5094 } 5095 5096 const desktopHeaderCTA = '.nav_button-wrapper > a.btn.is-small'; 5097 const mobileHeaderCTA = '.nav-dropdown_cta > div > a.nav-button-primary.w-inline-block'; 5098 5099 document.addEventListener('click', function(e) { 5100 if (e.target.closest(desktopHeaderCTA) || e.target.closest(mobileHeaderCTA)) { 5101 sessionStorage.setItem(HDR_BTN_CLK_FLAG, 'true'); 5102 sessionStorage.setItem(HDR_BTN_CLK_PG_COUNT, '1'); 5103 window._hdr_btn_clkd = true; 5104 console.log('Header nav CTA button clicked: ' + window._hdr_btn_clkd + ', active pages remaining: 1'); 5105 } 5106 }); 5107})(); 5108</script>
5108 5109<!-- GTM - Custom Header Nav CTA Button Click Tracking - END --><!-- [Attributes by Finsweet] Accordion -->
5110<script defer src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-accordion@1/accordion.js"></script>
5110 5111 5112<!-- [Finsweet Attributes] Modal -->
5113<script>(()=>{var t="https://cdn.jsdelivr.net/npm/@finsweet/attributes-modal@1/modal.js",e=document.querySelector(`script[src="${t}"]`);e||(e=document.createElement("script"),e.async=!0,e.src=t,document.head.append(e));})();</script>
5113 5114 5115<!-- GRADIENT HALO - START --> 5116
5117<script> 5118(function () { 5119 'use strict'; 5120 5121 var all = document.querySelectorAll('.pcl'); 5122 var root = all[all.length - 1]; 5123 if (!root || root.dataset.pclInit) return; 5124 root.dataset.pclInit = '1'; 5125 5126 var TAU = Math.PI * 2; 5127 var fit = root.closest('.pcl-fit'); 5128 var canvas = root.querySelector('.pcl-canvas'); 5129 var ctx = canvas.getContext('2d'); 5130 var cs = function () { return getComputedStyle(root); }; 5131 5132 /* ---------- flag readers ---------- */ 5133 function num(name, fb) { var v = parseFloat(cs().getPropertyValue(name)); return isNaN(v) ? fb : v; } 5134 function raw(name) { return cs().getPropertyValue(name).trim(); } 5135 // resolve one level of var() if the browser didn't already 5136 function rootResolve(name) { 5137 var v = cs().getPropertyValue(name).trim(); 5138 if (v.indexOf('var(') === 0) { var t = v.slice(4, v.indexOf(')')).trim(); v = cs().getPropertyValue(t).trim(); } 5139 return v; 5140 } 5141 function propOn(el, name) { 5142 var v = getComputedStyle(el).getPropertyValue(name).trim(); 5143 if (v.indexOf('var(') === 0) { var t = v.slice(4, v.indexOf(')')).trim(); v = cs().getPropertyValue(t).trim(); } 5144 return v; 5145 } 5146 5147 var slideSpeed = num('--slide-speed', 1); 5148 var particleSpin = num('--particle-spin', 1); 5149 var pMotion = num('--particle-motion', 1); 5150 var pEnergy = num('--particle-energy', 1); 5151 var allowUpscale = num('--allow-upscale', 1) === 1; 5152 var PAD = num('--hug-pad', 18); 5153 var pillRadius = num('--pill-radius', 150); 5154 5155 root.style.setProperty('--dur-scale', slideSpeed > 0 ? 1 / slideSpeed : 0); 5156 root.setAttribute('data-dot', num('--show-dot', 1) === 1 ? '1' : '0'); 5157 root.setAttribute('data-toggle', num('--show-toggle', 0) === 1 ? '1' : '0'); 5158 root.setAttribute('data-icon', num('--icon-chip-show', 1) === 1 ? '1' : '0'); 5159 root.setAttribute('data-avatar', num('--avatar-show', 1) === 1 ? '1' : '0'); 5160 if (allowUpscale && fit) fit.style.maxWidth = 'none'; 5161 5162 var scenes = root.querySelectorAll('.pcl-scene'); 5163 var ribbonEl = root.querySelector('.pcl-ribbon'); 5164 var L = { cx: 360, cy: 240, w: 720, h: 480 }; 5165 5166 /* build ribbon segments to match scene count (adding a scene just works) */ 5167 ribbonEl.innerHTML = ''; 5168 for (var ri = 0; ri < scenes.length; ri++) { var sgs = document.createElement('span'); sgs.className = 'pcl-seg'; ribbonEl.appendChild(sgs); } 5169 var segs = ribbonEl.querySelectorAll('.pcl-seg'); 5170 5171 /* per-scene dwell durations (ms), keyed off each scene's data-key */ 5172 var sceneDur = []; 5173 scenes.forEach(function (sc) { var d = parseFloat(rootResolve('--' + (sc.dataset.key || 'scene') + '-dur')); sceneDur.push(isNaN(d) ? 4800 : d); }); 5174 5175 function enabledItems(sc) { 5176 return Array.prototype.filter.call(sc.querySelectorAll('.pcl-item'), function (it) { return !it.classList.contains('pcl-off'); }); 5177 } 5178 function sceneCfg(sc) { 5179 var p = '--' + (sc.dataset.key || 'scene'); 5180 var mode = (rootResolve(p + '-mode') || 'auto').toLowerCase(); 5181 var start = parseFloat(rootResolve(p + '-start')) || 0; 5182 var rad = parseFloat(rootResolve(p + '-radius')); if (isNaN(rad)) rad = pillRadius; 5183 return { mode: mode === 'manual' ? 'manual' : 'auto', start: start, radius: rad }; 5184 } 5185 function itemAngle(it, cfg, idx, count) { 5186 if (cfg.mode === 'manual') { var a = propOn(it, '--angle'); return a === '' ? (cfg.start + idx * 360 / count) : (parseFloat(a) || 0); } 5187 return cfg.start + idx * 360 / count; 5188 } 5189 function itemRadius(it, cfg) { var r = propOn(it, '--r'); return r === '' ? cfg.radius : (parseFloat(r) || cfg.radius); } 5190 5191 /* === layout / auto-hug === */ 5192 function layout() { 5193 var showK = num('--show-kicker', 1) === 1; 5194 var showR = num('--show-ribbon', 1) === 1; 5195 var kickers = root.querySelectorAll('.pcl-kicker'); 5196 kickers.forEach(function (k) { k.style.display = showK ? 'block' : 'none'; }); 5197 ribbonEl.style.display = showR ? 'flex' : 'none'; 5198 5199 var k0 = scenes[0].querySelector('.pcl-kicker'); 5200 var kickerH = showK && k0 ? k0.offsetHeight : 0; 5201 var gap = num('--kicker-gap', 40); 5202 var ribbonH = showR ? ribbonEl.offsetHeight : 0; 5203 var ribbonGap = num('--ribbon-gap', 16); 5204 5205 var cloudR = num('--cloud-size', 280) / 2 * num('--particle-spread', 1); 5206 var gUp = cloudR, gDown = cloudR, gLeft = cloudR, gRight = cloudR; 5207 5208 var data = [];
5209 scenes.forEach(function (sc) { 5210 var cfg = sceneCfg(sc); 5211 var en = enabledItems(sc); 5212 var pillUp = 0; 5213 var placed = en.map(function (it, i) { 5214 var ang = itemAngle(it, cfg, i, en.length); 5215 var R = itemRadius(it, cfg); 5216 var th = ang * Math.PI / 180; 5217 var x = R * Math.sin(th), y = -R * Math.cos(th); 5218 var hw = it.offsetWidth / 2, hh = it.offsetHeight / 2; 5219 gRight = Math.max(gRight, x + hw); gLeft = Math.max(gLeft, hw - x); 5220 gUp = Math.max(gUp, hh - y); gDown = Math.max(gDown, y + hh); 5221 pillUp = Math.max(pillUp, hh - y); 5222 return { it: it, x: x, y: y }; 5223 }); 5224 data.push({ sc: sc, placed: placed, pillUp: pillUp }); 5225 }); 5226 5227 var topReserve = showK ? (kickerH + gap) : 0; 5228 var cx = PAD + gLeft; 5229 var cy = PAD + topReserve + gUp; 5230 var w = PAD + gLeft + gRight + PAD; 5231 var h = PAD + topReserve + gUp + gDown + (showR ? (ribbonH + ribbonGap) : 0) + PAD; 5232 L = { cx: cx, cy: cy, w: w, h: h }; 5233 if (fit) { fit.style.setProperty('--pcl-w', w.toFixed(1)); fit.style.setProperty('--pcl-h', h.toFixed(1)); } 5234 5235 data.forEach(function (sd) { 5236 sd.placed.forEach(function (pp) { pp.it.style.left = (cx + pp.x) + 'px'; pp.it.style.top = (cy + pp.y) + 'px'; }); 5237 var k = sd.sc.querySelector('.pcl-kicker'); 5238 if (k && showK) { // each scene's kicker sits a constant gap above ITS top pill 5239 var topPillEdge = cy - sd.pillUp; 5240 k.style.left = cx + 'px'; 5241 k.style.top = (topPillEdge - gap - kickerH / 2) + 'px'; 5242 } 5243 }); 5244 if (showR) { ribbonEl.style.left = cx + 'px'; ribbonEl.style.top = (h - PAD - ribbonEl.offsetHeight / 2) + 'px'; } 5245 } 5246 5247 /* === particle cloud engine === */ 5248 var COLORS = raw('--particle-colors').split(',').map(function (c) { return c.trim(); }).filter(Boolean); 5249 if (!COLORS.length) COLORS = ['#F4F2EA', '#23A4B5']; 5250 5251 var CFG = { 5252 spinBase: TAU / 1200, attack: 50, hold: 50, decay: 100, 5253 stuckBase: 90, stuckJitter: 20, focalLength: 330, zeroAlphaDepth: -750, 5254 clusterMin: 3, clusterMax: 12, clusterSpread: 0.08, clusterRadialJitter: 0.015, 5255 springStrength: 0.002, erraticness: 0.05, logoDepthZ: -20, logoOpacity: 0.92 5256 }; 5257 var VOL = num('--particle-volume', 1); 5258 var shellPPF = Math.max(1, Math.round(5 * VOL)); 5259 var clusterPPF = Math.max(1, Math.round(3 * VOL)); 5260 var pRad = num('--particle-size', 2.4); 5261 5262 var dpr = Math.min(window.devicePixelRatio || 1, 2); 5263 var W = 720, H = 480, projCX = 360, projCY = 240; 5264 var sphereRad = 0, sphereCZ = 0; 5265 var fLen = CFG.focalLength, zMax = fLen - 2; 5266 var turnSpeed = CFG.spinBase * particleSpin * 0.5; 5267 var pList = { first: null }, rBin = { first: null }, cluster = null; 5268 var logoImg = null, rafId = null, running = false, formed = false, lastScale = 1; 5269 5270 function applyCloudGeom() { 5271 W = L.w; H = L.h; projCX = L.cx; projCY = L.cy; 5272 sphereRad = Math.max(10, num('--cloud-size', 280) / 2 * num('--particle-spread', 1)); 5273 sphereCZ = -3 - sphereRad; 5274 } 5275 function hexToRgb(h) { 5276 h = h.replace('#', ''); if (h.length === 3) h = h.split('').map(function (c) { return c + c; }).join(''); 5277 var n = parseInt(h, 16); return (n >> 16 & 255) + ',' + (n >> 8 & 255) + ',' + (n & 255); 5278 } 5279 function addP(x, y, z, vx, vy, vz, col, spring, am) { 5280 var p; if (rBin.first) { p = rBin.first; rBin.first = p.next; if (rBin.first) rBin.first.prev = null; } else p = {}; 5281 p.next = pList.first; p.prev = null; if (pList.first) pList.first.prev = p; pList.first = p; 5282 p.rgb = 'rgba(' + hexToRgb(col) + ','; p.x = x; p.y = y; p.z = z; p.vx = vx; p.vy = vy; p.vz = vz; 5283 p.age = 0; p.dead = false; p.attack = CFG.attack; p.hold = CFG.hold; p.decay = CFG.decay; 5284 p.holdV = am; p.alpha = 0; p.stuck = CFG.stuckBase + Math.random() * CFG.stuckJitter; p.spring = spring; 5285 } 5286 function recycle(p) { 5287 if (pList.first === p) { pList.first = p.next; if (p.next) p.next.prev = null; } 5288 else { p.prev.next = p.next; if (p.next) p.next.prev = p.prev; } 5289 p.next = rBin.first; p.prev = null; if (rBin.first) rBin.first.prev = p; rBin.first = p; 5290 } 5291 function spawnShell() { 5292 for (var i = 0; i < shellPPF; i++) { 5293 var th = Math.random() * TAU, ph = Math.acos(Math.random() * 2 - 1); 5294 var x = sphereRad * Math.sin(ph) * Math.cos(th), y = sphereRad * Math.sin(ph) * Math.sin(th), z = sphereRad * Math.cos(ph); 5295 var col = COLORS[Math.floor(Math.random() * COLORS.length)], v = 0.002; 5296 addP(x, y, sphereCZ + z, v * x, v * y, v * z, col, false, 1); 5297 } 5298 } 5299 function spawnCluster() { 5300 for (var i = 0; i < clusterPPF; i++) { 5301 if (!cluster || cluster.spawned >= cluster.size) { 5302 cluster = { th: Math.random() * TAU, ph: Math.acos(Math.random() * 2 - 1), 5303 col: COLORS[Math.floor(Math.random() * COLORS.length)], 5304 size: CFG.clusterMin + Math.floor(Math.random() * (CFG.clusterMa
5304x - CFG.clusterMin + 1)), spawned: 0 }; 5305 } 5306 var c = cluster; c.spawned++; 5307 var th = c.th + (Math.random() * 2 - 1) * CFG.clusterSpread; 5308 var ph = Math.max(0.001, Math.min(Math.PI - 0.001, c.ph + (Math.random() * 2 - 1) * CFG.clusterSpread)); 5309 var r = sphereRad * (1 + (Math.random() * 2 - 1) * CFG.clusterRadialJitter); 5310 var x = r * Math.sin(ph) * Math.cos(th), y = r * Math.sin(ph) * Math.sin(th), z = r * Math.cos(ph); 5311 var v = 0.002; addP(x, y, sphereCZ + z, v * x, v * y, v * z, c.col, true, 0.9); 5312 } 5313 } 5314 function drawLogo() { 5315 if (!logoImg) return; 5316 var lz = sphereCZ + CFG.logoDepthZ, m = fLen / (fLen - lz); 5317 var ar = (logoImg.naturalWidth || 190.12) / (logoImg.naturalHeight || 200); 5318 var lw = num('--cloud-size', 280) * num('--logo-size', 0.42); 5319 var dw = lw * m, dh = dw / ar; 5320 ctx.save(); ctx.globalAlpha = CFG.logoOpacity; 5321 ctx.drawImage(logoImg, projCX - dw / 2, projCY - dh / 2, dw, dh); ctx.restore(); 5322 } 5323 function drawP(p, rotZ, m) { 5324 var daf = Math.max(0, Math.min(1, 1 - rotZ / CFG.zeroAlphaDepth));
5325 ctx.fillStyle = p.rgb + (daf * p.alpha) + ')'; 5326 ctx.beginPath(); ctx.arc(p.projX, p.projY, m * pRad, 0, TAU, false); ctx.fill(); 5327 } 5328 var turnAngle = 0; 5329 function step(advance) { 5330 if (advance) { spawnShell(); spawnCluster(); turnAngle = (turnAngle + turnSpeed) % TAU; } 5331 var sinA = Math.sin(turnAngle), cosA = Math.cos(turnAngle); 5332 ctx.clearRect(0, 0, W, H); 5333 var bg = [], fg = [], p = pList.first; 5334 while (p) { 5335 var np = p.next; 5336 if (advance && pMotion !== 0) { // individual-particle drift (scaled by --particle-motion) 5337 p.age++; 5338 if (p.age > p.stuck) { 5339 var ra = CFG.erraticness * pMotion * pEnergy; 5340 p.vx += ra * (Math.random() * 2 - 1); p.vy += ra * (Math.random() * 2 - 1); p.vz += ra * (Math.random() * 2 - 1); 5341 if (p.spring) { 5342 var dx = p.x, dy = p.y, dz = p.z - sphereCZ, dist = Math.sqrt(dx * dx + dy * dy + dz * dz) || 1; 5343 var sp = (sphereRad - dist) * CFG.springStrength * pMotion; 5344 p.vx += dx / dist * sp; p.vy += dy / dist * sp; p.vz += dz / dist * sp; 5345 } 5346 p.x += p.vx * pMotion; p.y += p.vy * pMotion; p.z += p.vz * pMotion; 5347 } 5348 } else if (advance) { // motion frozen â still age so dots twinkle, but no drift 5349 p.age++; 5350 } 5351 var rotX = cosA * p.x + sinA * (p.z - sphereCZ); 5352 var rotZ = -sinA * p.x + cosA * (p.z - sphereCZ) + sphereCZ; 5353 var m = fLen / (fLen - rotZ); 5354 p.projX = rotX * m + projCX; p.projY = p.y * m + projCY; 5355 var tot = p.attack + p.hold + p.decay; 5356 if (p.age < tot) { 5357 if (p.age < p.attack) p.alpha = p.holdV * (p.age / p.attack); 5358 else if (p.age < p.attack + p.hold) p.alpha = p.holdV; 5359 else p.alpha = p.holdV * (1 - (p.age - p.attack - p.hold) / p.decay); 5360 } else p.dead = true; 5361 if (p.projX > W || p.projX < 0 || p.projY < 0 || p.projY > H || rotZ > zMax || p.dead) recycle(p); 5362 else (rotZ < sphereCZ + CFG.logoDepthZ ? bg : fg).push({ p: p, rotZ: rotZ, m: m }); 5363 p = np; 5364 } 5365 bg.forEach(function (d) { drawP(d.p, d.rotZ, d.m); }); 5366 drawLogo(); 5367 fg.forEach(function (d) { drawP(d.p, d.rotZ, d.m); }); 5368 } 5369 function loop() { step(true); rafId = requestAnimationFrame(loop); } 5370 function buildFormed() { 5371 if (formed) return; formed = true; 5372 for (var n = 0; n < 70; n++) { spawnShell(); spawnCluster(); } 5373 // spread ages across the lifecycle so the cloud starts calm 5374 // (seeding them all mid-life made them drift outward together in a burst) 5375 var span = CFG.attack + CFG.hold + CFG.decay; 5376 var p = pList.first; while (p) { p.age = Math.floor(Math.random() * span); p = p.next; } 5377 }
5378 function renderStaticOnce() { buildFormed(); step(false); } 5379 5380 /* ---------- canvas sizing + responsive scaler (crisp, never collapses to 0) ---------- */ 5381 function rescale() { 5382 if (!fit) return; 5383 var cw = fit.clientWidth; 5384 if (cw > 0) { // guard: a 0-width read must NOT scale everything to nothing 5385 var scale = cw / L.w; 5386 if (!allowUpscale && scale > 1) scale = 1; 5387 lastScale = scale; 5388 fit.style.setProperty('--pcl-scale', scale.toFixed(4)); 5389 } 5390 var eff = dpr * lastScale; 5391 canvas.style.width = L.w + 'px'; canvas.style.height = L.h + 'px'; 5392 canvas.width = Math.round(L.w * eff); canvas.height = Math.round(L.h * eff); 5393 ctx.setTransform(eff, 0, 0, eff, 0, 0); 5394 if (!running || particleSpin === 0) { applyCloudGeom(); if (formed) step(false); } 5395 } 5396 5397 /* === scene cycler === */ 5398 var sIdx = 0, sTimer = null; 5399 function show(i) { 5400 scenes.forEach(function (s, k) { s.classList.toggle('active', k === i); }); 5401 segs.forEach(function (s, k) { s.classList.toggle('active', k === i); }); 5402 sIdx = i; 5403 } 5404 function cycle() { 5405 clearTimeout(sTimer); 5406 sTimer = setTimeout(function () { show((sIdx + 1) % scenes.length); cycle(); }, sceneDur[sIdx] / slideSpeed); 5407 } 5408 5409 /* === logo (inline default, or external via --logo-url) === */ 5410 var LOGO_PATH = 'M190.11,72.22c0,9.65-7.75,17.33-17.5,17.33s-17.5-7.68-17.5-17.33,7.76-17.33,17.5-17.33,17.5,7.95,17.5,17.33ZM190.11,17.33c0,9.65-7.75,17.33-17.5,17.33s-17.5-7.68-17.5-17.33S162.87,0,172.61,0s17.5,7.95,17.5,17.33h0ZM190.11,127.46c0,9.65-7.75,17.33-17.5,17.33s-17.5-7.68-17.5-17.33,7.76-17.33,17.5-17.33,17.5,7.68,17.5,17.33ZM190.12,182.67c0,9.65-7.75,17.33-17.5,17.33h-.57c-9.17-.3-16.63-7.68-16.93-16.76-.3-9.65,7.46-17.6,16.93-17.9,9.74-.3,17.77,7.38,18.07,16.76v.57ZM138.39,72.22c0,9.65-7.76,17.33-17.5,17.33s-17.5-7.68-17.5-17.33,7.75-17.33,17.5-17.33,17.5,7.95,17.5,17.33ZM138.39,127.46c0,9.65-7.76,17.33-17.5,17.33s-17.5-7.68-17.5-17.33,7.75-17.33,17.5-17.33,17.5,7.68,17.5,17.33ZM138.39,182.67c0,9.65-7.76,17.33-17.5,17.33s-17.5-7.68-17.5-17.33,7.75-17.33,17.5-17.33,17.5,7.68,17.5,17.33ZM86.68,127.46c0,9.65-7.76,17.33-17.5,17.33s-17.5-7.68-17.5-17.33,7.76-17.33,17.5-17.33,17.5,7.68,17.5,17.33ZM86.68,182.67c0,9.65-7.76,17.33-17.5,17.33s-17.5-7.68-17.5-17.33,7.76-17.33,17.5-17.33,17.5,7.68,17.5,17.33ZM35,72.24c0,9.65-7.76,17.33-17.5,17.33S0,81.89,0,72.54s7.76-17.33,17.5-17.33c9.74-.29,17.5,7.68,17.5,17.03ZM35,127.46c0,9.65-7.76,17.33-17.5,17.33S0,137.11,0,127.46s7.76-17.33,17.5-17.33,17.5,7.68,17.5,17.33ZM35,182.67c0,9.65-7.76,17.33-17.5,17.33S0,192.32,0,182.67s7.76-17.33,17.5-17.33,17.5,7.68,17.5,17.33h0Z'; 5411 function loadLogo() { 5412 var urlFlag = raw('--logo-url').replace(/^url\(|\)$/g, '').replace(/^["']|["']$/g, '').trim(); 5413 var fill = raw('--logo-fill') || '#F4F2EA'; 5414 var img = new Image(); 5415 var done = function () { logoImg = img; if (!running) step(false); else if (particleSpin === 0) renderStaticOnce(); }; 5416 if (urlFlag && urlFlag !== 'default') { img.crossOrigin = 'anonymous'; img.onload = done; img.src = urlFlag; return; } 5417 var svg = '<svg xmlns="http://www.w3.org/2000/svg" width="190.12" height="200" viewBox="0 0 190.12 200"><path fill="' + fill + '" d="' + LOGO_PATH + '"/></svg>'; 5418 var blob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }), u = URL.createObjectURL(blob); 5419 img.onload = function () { URL.revokeObjectURL(u); done(); }; 5420 img.src = u; 5421 } 5422 5423 /* === boot === */ 5424 var inited = false; 5425 function setupOnce() { 5426 if (inited) return; inited = true; 5427 if (window.ResizeObserver) { 5428 var ro = new ResizeObserver(function () { rescale(); }); 5429 ro.observe(fit || root); 5430 if (fit && fit.parentElement) ro.observe(fit.parentElement); // catch Webflow column resizes too 5431 } else window.addEventListener('resize', rescale); 5432 loadLogo(); 5433 } 5434 function relayout() { layout(); applyCloudGeom(); rescale(); if (!running) { buildFormed(); step(false); } } 5435 5436 setupOnce(); 5437 relayout(); // formed cloud paints immediately â never blank 5438 if (document.fonts && document.fonts.ready) document.fonts.ready.then(relayout); 5439 window.addEventListener('load', relayout); 5440 setTimeout(relayout, 450); 5441 5442 function start() { 5443 if (running) return; running = true; 5444 if (particleSpin > 0) loop(); else renderStaticOnce(); 5445 if (slideSpeed > 0) { show(0); cycle(); } else { root.classList.add('is-slidestatic'); show(0); } 5446 } 5447 if (particleSpin === 0 && slideSpeed === 0) { root.classList.add('is-slidestatic'); show(0); renderStaticOnce(); } 5448 else { 5449 if ('IntersectionObserver' in window) { 5450 var io = new IntersectionObserver(function (es) { es.forEac
5450h(function (e) { if (e.isIntersecting) { start(); io.disconnect(); } }); }, { threshold: 0 }); 5451 io.observe(root); 5452 } else start(); 5453 setTimeout(function () { if (!running) start(); }, 2200); // fallback: never stay idle (e.g. Webflow preview quirks) 5454 } 5455 5456 /* === dev play/pause toggle (see --show-toggle) === */ 5457 var toggleBtn = root.querySelector('.pcl-toggle'), paused = false; 5458 function setPaused(v) { 5459 paused = v; 5460 root.classList.toggle('pcl-paused', paused); 5461 if (toggleBtn) toggleBtn.textContent = paused ? 'âº' : 'ââ'; 5462 if (paused) { 5463 if (rafId) { cancelAnimationFrame(rafId); rafId = null; } 5464 clearTimeout(sTimer); 5465 } else if (running) { 5466 if (particleSpin > 0 && !rafId) loop(); 5467 if (slideSpeed > 0) cycle(); 5468 } 5469 } 5470 if (toggleBtn) toggleBtn.addEventListener('click', function () { setPaused(!paused); }); 5471 5472})(); 5473</script>
5473 5474 5475 5476<!-- GRADIENT HALO - END --> 5477 5478</body></html>
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.