1<!DOCTYPE html><!-- Last Published: Wed Sep 30 2026 17:22:25 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="jim-page.webflow.io" data-wf-page="67699fcc85e15fffb5ca64c8" data-wf-site="65fc1fa2c1e7707c3f051403" lang="en"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>Jim Blog â Tips & Guides to Get Paid and Grow</title><meta content="Read the Jim blog for payment tips, growth strategies, and AI tools. Practical guides to help you get paid and grow your business." name="description"/><meta content="Jim Blog â Tips & Guides to Get Paid and Grow" property="og:title"/><meta content="Read the Jim blog for payment tips, growth strategies, and AI tools. Practical guides to help you get paid and grow your business." property="og:description"/><meta content="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a6ccb4438c2b6b758191031_Opengraph-HomePage.webp" property="og:image"/><meta content="Jim Blog â Tips & Guides to Get Paid and Grow" name="twitter:title"/><meta content="Read the Jim blog for payment tips, growth strategies, and AI tools. Practical guides to help you get paid and grow your business." name="twitter:description"/><meta content="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a6ccb4438c2b6b758191031_Opengraph-HomePage.webp" name="twitter:image"/><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/65fc1fa2c1e7707c3f051403/css/jim-page.shared.4b85bb181.min.css" rel="stylesheet" type="text/css" integrity="sha384-S4W7GBlREAt/JJhgXHbtCi9xVbe+eNfzTgAXPEmiaTBKQmzJAToQGqaW8gaZfBqn" crossorigin="anonymous"/><link href="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/css/jim-page.67699fcc85e15fffb5ca64c8.656498df0.opt.min.css" rel="stylesheet" type="text/css" integrity="sha384-ZWSY3wNeexRkrLE2DSTURAElPCn9XdZVQMyRrqqc+eTImjy6jQVG1RzEe2Z6Mgvh" crossorigin="anonymous"/>
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/65fc1fa2c1e7707c3f051403/6a748574a9ff2542ecfd4346_Favicon.png" rel="icon" type="image/png" sizes="32x32" media="(prefers-color-scheme: light)"/><link href="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a748574a9ff2542ecfd4346_Favicon.png" rel="icon" type="image/png" sizes="32x32" media="(prefers-color-scheme: dark)"/><link href="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a748574b0105968a76870b7_Favicon.png" rel="icon" type="image/png" sizes="48x48"/><link href="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a74857ca9ff2542ecfd44a0_Webclip.png" rel="apple-touch-icon" sizes="180x180"/><link href="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a74857ca9ff2542ecfd449c_Webclip.png" rel="icon" type="image/png" sizes="192x192"/><link href="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a74857ccbd18bea6bdce292_Webclip.png" rel="icon" type="image/png" sizes="512x512"/>
1<script>(function(w,i,g){w[g]=w[g]||[];if(typeof w[g].push=='function')w[g].push.apply(w[g],Array.isArray(i)?i:[i]);})(window,['G-559072CGWW'],'google_tags_first_party');</script>
1<script async="" src="/haqt6iy0yx2eNjVmYzFmYTJjMWU3NzA3YzNmMDUxNDAz/PEFDjlnwN8gRTeJEElRetEFQ4G0"></script>
1<script type="text/javascript">window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('set', 'developer_id.dZGVlNj', true);gtag('set', 'developer_id.dYWYxNW', true);gtag('js', new Date());gtag('config', 'G-559072CGWW');</script>
1<link rel="preconnect" href="cdn.prod.website-files.com" crossorigin> 2<link rel="preconnect" href="www.googletagmanager.com" crossorigin> 3<!-- Preconnect RudderStack --> 4<link rel="preconnect" href="https://cdn.rudderlabs.com" crossorigin> 5<link rel="preconnect" href="https://jimussagosqd.dataplane.rudderstack.com" crossorigin> 6 7<style> 8 /*lenis -- IMPORTANT*/ 9 .lenis.lenis-smooth [data-lenis-prevent] { 10 overscroll-behavior: contain; 11 } 12</style> 13 14<!-- Google Tag Manager -->
15<script>
vendor: 327 bytes, lines 15-19
15(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 16new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 17j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 18'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 19})(window,document,'script','dataLayer','
19GTM-5X4DKQFL
vendor: 3 bytes, line 19
19');
19</script>
19 20<!-- End Google Tag Manager --> 21 22<link rel="shortcut icon" href="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a748574a9ff2542ecfd4346_Favicon.png"> 23 24<!-- ===== Restore Params from Cookie (Safari ITP workaround) ===== -->
25<script> 26(function() { 27 "use strict"; 28 29 var COOKIE_NAME = "_exp_ctx"; 30 31 // Get cookie value 32 var getCookie = function(name) { 33 var needle = name + "="; 34 var hit = document.cookie.split("; ").find(function(c) { return c.startsWith(needle); }); 35 return hit ? hit.slice(needle.length) : null; 36 }; 37 38 // Delete cookie 39 var deleteCookie = function(name, domain) { 40 document.cookie = name + "=; Path=/; Domain=" + domain + "; Secure; SameSite=Lax; Max-Age=0"; 41 }; 42 43 // Get domain for cookie (e.g., ".jim.com") 44 var getCookieDomain = function() { 45 var host = window.location.hostname; 46 if (host.startsWith("www.")) host = host.slice(4); 47 return "." + host; 48 }; 49 50 try { 51 var raw = getCookie(COOKIE_NAME); 52 if (!raw) return; // No backup cookie, nothing to do 53 54 var params = JSON.parse(decodeURIComponent(raw)); 55 if (!params || typeof params !== "object") return; 56 57 var url = new URL(window.location.href); 58 var changed = false; 59 60 // Only restore params that are missing from current URL 61 for (var key in params) { 62 if (params.hasOwnProperty(key) && !url.searchParams.has(key)) { 63 url.searchParams.set(key, params[key]); 64 changed = true; 65 } 66 } 67 68 // Update URL if we restored any params 69 if (changed && window.history && window.history.replaceState) { 70 window.history.replaceState(null, "", url.pathname + url.search + url.hash); 71 } 72 73 // Always delete the cookie after reading (one-time use) 74 deleteCookie(COOKIE_NAME, getCookieDomain()); 75 76 } catch (e) { 77 // Silently fail - don't break the page 78 } 79})(); 80</script>
80 81<!-- ===== End Restore Params ===== --> 82 83<!-- ===== RudderStack SDK v3.2.0 ===== -->
84<script type="text/javascript"> 85(function() { 86 "use strict"; 87 88 // Helper functions for cookies 89 var CLICK_ID_COOKIE_NAMES = ["_fbp", "_ttp"]; 90 91 var getCookie = function(name) { 92 var needle = name + "="; 93 var hit = document.cookie.split("; ").find(function(c) { return c.startsWith(needle); }); 94 return hit ? hit.slice(needle.length) : undefined; 95 }; 96 97 var getAllCookiesAsObject = function() { 98 var obj = {}; 99 if (!document.cookie) return obj; 100 document.cookie.split("; ").forEach(function(pair) { 101 var idx = pair.indexOf("="); 102 var key = idx >= 0 ? pair.slice(0, idx) : pair; 103 var val = idx >= 0 ? pair.slice(idx + 1) : ""; 104 obj[key] = val; 105 }); 106 return obj; 107 }; 108 109 var browserIds = CLICK_ID_COOKIE_NAMES 110 .map(function(k) { return getCookie(k); }) 111 .filter(Boolean); 112 113 var cookiesObj = getAllCookiesAsObject(); 114 115 // RudderStack SDK v3.2.0 snippet 116 window.RudderSnippetVersion = "3.2.0"; 117 var identifier = "rudderanalytics"; 118 if (!window[identifier]) { 119 window[identifier] = []; 120 } 121 var rudderanalytics = window[identifier]; 122 if (Array.isArray(rudderanalytics)) { 123 if (rudderanalytics.snippetExecuted === true && window.console && console.error) { 124 console.error("RudderStack JavaScript SDK snippet included more than once."); 125 } else { 126 rudderanalytics.snippetExecuted = true; 127 window.rudderAnalyticsBuildType = "legacy"; 128 var sdkBaseUrl = "https://cdn.rudderlabs.com"; 129 var sdkVersion = "v3"; 130 var sdkFileName = "rsa.min.js"; 131 var scriptLoadingMode = "async"; 132 var methods = [ "setDefaultInstanceKey", "load", "ready", "page", "track", "identify", "alias", "group", "reset", "setAnonymousId", "startSession", "endSession", "consent", "addCustomIntegration" ]; 133 for (var i = 0; i < methods.length; i++) { 134 var method = methods[i]; 135 rudderanalytics[method] = function(methodName) { 136 return function() { 137 if (Array.isArray(window[identifier])) { 138 rudderanalytics.push([ methodName ].concat(Array.prototype.slice.call(arguments))); 139 } else { 140 var _methodName; 141 (_methodName = window[identifier][methodName]) === null || _methodName === undefined || _methodName.apply(window[identifier], arguments); 142 } 143 }; 144 }(method); 145 } 146 try { 147 new Function('class Test{field=()=>{};test({prop=[]}={}){return prop?(prop?.property??[...prop]):import("");}}'); 148 window.rudderAnalyticsBuildType = "modern"; 149 } catch (e) {} 150 var head = document.head || document.getElementsByTagName("head")[0]; 151 var body = document.body || document.getElementsByTagName("body")[0]; 152 window.rudderAnalyticsAddScript = function(url, extraAttributeKey, extraAttributeVal) { 153 var scriptTag = document.createElement("script"); 154 scriptTag.src = url; 155 scriptTag.setAttribute("data-loader", "RS_JS_SDK"); 156 if (extraAttributeKey && extraAttributeVal) { 157 scriptTag.setAttribute(extraAttributeKey, extraAttributeVal); 158 } 159 if (scriptLoadingMode === "async") { 160 scriptTag.async = true; 161 } else if (scriptLoadingMode === "defer") { 162 scriptTag.defer = true; 163 } 164 if (head) { 165 head.insertBefore(scriptTag, head.firstChild); 166 } else { 167 body.insertBefore(scriptTag, body.firstChild); 168 } 169 }; 170 window.rudderAnalyticsMount = function() { 171 (function() { 172 if (typeof globalThis === "undefined") { 173 var getGlobal = function getGlobal() { 174 if (typeof self !== "undefined") { 175 return self; 176 } 177 if (typeof window !== "undefined") { 178 return window; 179 } 180 return null; 181 }; 182 var global = getGlobal(); 183 if (global) { 184 Object.defineProperty(global, "globalThis", { 185 value: global, 186 configurable: true 187 }); 188 } 189 } 190 })(); 191 window.rudderAnalyticsAddScript("".concat(sdkBaseUrl, "/").concat(sdkVersion, "/").concat(window.rudderAnalyticsBuildType, "/").concat(sdkFileName), "data-rsa-write-key", "2p4R4M1dTCH2cp4vzLXhSYpEikO"); 192 }; 193 if (typeof Promise === "undefined" || typeof globalThis === "undefined") { 194 window.rudderAnalyticsAddScript("https://polyfill-fastly.io/v3/polyfill.min.js?ver
194sion=3.111.0&features=Symbol%2CPromise&callback=rudderAnalyticsMount"); 195 } else { 196 window.rudderAnalyticsMount(); 197 } 198 var loadOptions = {}; 199 rudderanalytics.load("2p4R4M1dTCH2cp4vzLXhSYpEikO", "https://jimussagosqd.dataplane.rudderstack.com", loadOptions); 200 201 // Set anonymousId from exp_device_id cookie (for experiments tracking consistency) 202 var expDeviceId = cookiesObj["exp_device_id"] || ""; 203 if (expDeviceId) { 204 rudderanalytics.setAnonymousId(expDeviceId); 205 } 206 var FIRST_TOUCH_KEY = "_jim_first_touch_v1"; 207 var FIRST_TOUCH_KEYS = [ 208 "utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term", "utm_name", 209 "utm_id", "gclid", "fbclid", "ttclid", "click_id", 210 "gbraid", "wbraid", "gad_source", "gad_campaignid" 211 ]; 212 var cookieMap = (typeof cookiesObj === "object" && cookiesObj) ? cookiesObj : {}; 213 var parseSearch = function (raw) { 214 var out = {}; 215 if (!raw) return out; 216 var q = String(raw); 217 var qIdx = q.indexOf("?"); 218 if (qIdx >= 0) q = q.slice(qIdx + 1); 219 var hashIdx = q.indexOf("#"); 220 if (hashIdx >= 0) q = q.slice(0, hashIdx); 221 try { 222 var sp = new URLSearchParams(q); 223 FIRST_TOUCH_KEYS.forEach(function (k) { 224 var v = sp.get(k); 225 if (v) out[k] = v; 226 }); 227 } catch (e) {} 228 return out; 229 }; 230 var fbclidFromFbc = function (fbc) { 231 if (!fbc) return ""; 232 var parts = String(fbc).split("."); 233 if (parts.length >= 4) return parts.slice(3).join("."); 234 return ""; 235 }; 236 var pickIncoming = function () { 237 var out = parseSearch(window.location.search); 238 var fromCookie = parseSearch(cookieMap.search_params || cookieMap.ifp_search_params || ""); 239 FIRST_TOUCH_KEYS.forEach(function (k) { 240 if (!out[k] && fromCookie[k]) out[k] = fromCookie[k]; 241 }); 242 if (!out.fbclid) { 243 var fromFbc = fbclidFromFbc(cookieMap._fbc); 244 if (fromFbc) out.fbclid = fromFbc; 245 } 246 return out; 247 }; 248 var storedFirst = {}; 249 try { 250 storedFirst = JSON.parse(localStorage.getItem(FIRST_TOUCH_KEY) || "{}") || {}; 251 } catch (e) { 252 storedFirst = {}; 253 } 254 var incoming = pickIncoming(); 255 var merged = {}; 256 var wroteNew = false; 257 FIRST_TOUCH_KEYS.forEach(function (k) { 258 if (storedFirst[k]) merged[k] = storedFirst[k]; 259 else if (incoming[k]) { 260 merged[k] = incoming[k]; 261 wroteNew = true; 262 } 263 }); 264 if (Object.keys(merged).length) { 265 try { localStorage.setItem(FIRST_TOUCH_KEY, JSON.stringify(merged)); } catch (e) {} 266 if (wroteNew) { 267 var traits = {}; 268 if (merged.utm_source) traits.initial_utm_source = merged.utm_source; 269 if (merged.utm_medium) traits.initial_utm_medium = merged.utm_medium; 270 if (merged.utm_campaign || merged.utm_name) traits.initial_utm_campaign = merged.utm_campaign || merged.utm_name; 271 if (merged.utm_content) traits.initial_utm_content = merged.utm_content; 272 if (merged.utm_term) traits.initial_utm_term = merged.utm_term; 273 if (merged.utm_id) traits.initial_utm_id = merged.utm_id; 274 if (merged.gclid) traits.initial_gclid = merged.gclid; 275 if (merged.fbclid) traits.initial_fbclid = merged.fbclid; 276 if (merged.ttclid || merged.click_id) traits.initial_ttclid = merged.ttclid || merged.click_id; 277 if (merged.gbraid) traits.initial_gbraid = merged.gbraid; 278 if (merged.wbraid) traits.initial_wbraid = merged.wbraid; 279 if (merged.gad_source) traits.initial_gad_source = merged.gad_source; 280 if (merged.gad_campaignid) traits.initial_gad_campaignid = merged.gad_campaignid; 281 rudderanalytics.identify(traits); 282 } 283 } 284 rudderanalytics.page({ 285 browser_id: browserIds, 286 cookies: cookiesObj 287 }); 288 } 289 } 290})(); 291</script>
291 292<!-- ===== End RudderStack SDK ===== --> 293 294<!-- ===== Experiments - Exposure Tracking ===== -->
295<script> 296(function () { 297 "use strict"; 298 299 var LS_KEY = "exp_pending_exposure"; 300 301 var getCookieMap = function() { 302 var obj = {}; 303 if (!document.cookie) return obj; 304 document.cookie.split("; ").forEach(function(pair) { 305 var idx = pair.indexOf("="); 306 var key = idx >= 0 ? pair.slice(0, idx) : pair; 307 var val = idx >= 0 ? pair.slice(idx + 1) : ""; 308 obj[key] = decodeURIComponent(val); 309 }); 310 return obj; 311 }; 312 313 var cookies = getCookieMap(); 314 var assignment = cookies["exp_assignment"]; 315 var flagKey, variant, expDeviceId, source; 316 317 // 1. Try to get assignment from cookie 318 if (assignment) { 319 var sep = assignment.indexOf(":"); 320 if (sep >= 1) { 321 flagKey = assignment.substring(0, sep); 322 variant = assignment.substring(sep + 1); 323 source = "cookie"; 324 } 325 } 326 327 // 2. Fallback: try query params 328 if (!flagKey || !variant) { 329 var params = new URLSearchParams(window.location.search); 330 flagKey = params.get("_exp_flag") || ""; 331 variant = params.get("_exp_variant") || ""; 332 if (flagKey && variant) source = "query_param"; 333 } 334 335 // 3. Fallback: try localStorage (retry from previous failed attempt) 336 if (!flagKey || !variant) { 337 try { 338 var stored = localStorage.getItem(LS_KEY); 339 if (stored) { 340 var pending = JSON.parse(stored); 341 if (pending.status === "beacon_sent") { 342 localStorage.removeItem(LS_KEY); 343 } else if (pending.flagKey && pending.variant && pending.status === "pending") { 344 flagKey = pending.flagKey; 345 variant = pending.variant; 346 expDeviceId = pending.expDeviceId || ""; 347 source = "localStorage_retry"; 348 } 349 } 350 } catch (e) {} 351 } 352 353 // No experiment assignment found 354 if (!flagKey || !variant) return; 355 356 // Get device ID 357 if (!expDeviceId) expDeviceId = cookies["exp_device_id"] || ""; 358 if (!expDeviceId) { 359 var qp = new URLSearchParams(window.location.search); 360 expDeviceId = qp.get("_exp_device_id") || ""; 361 } 362 363 // Clean experiment params from URL (better UX) 364 if (window.history && window.history.replaceState) { 365 var url = new URL(window.location.href); 366 if (url.searchParams.has("_exp_flag") || url.searchParams.has("_exp_variant") || url.searchParams.has("_exp_device_id")) { 367 url.searchParams.delete("_exp_flag"); 368 url.searchParams.delete("_exp_variant"); 369 url.searchParams.delete("_exp_device_id"); 370 window.history.replaceState(null, "", url.pathname + url.search + url.hash); 371 } 372 } 373 374 // Persist to localStorage (for retry if exposure fails) 375 try { 376 localStorage.setItem(LS_KEY, JSON.stringify({ 377 flagKey: flagKey, 378 variant: variant, 379 expDeviceId: expDeviceId, 380 status: "pending", 381 ts: Date.now() 382 })); 383 } catch (e) {} 384 385 var exposureFired = false; 386 387 // Fire exposure event via RudderStack 388 var fireExposure = function() { 389 window.rudderanalytics.track("$exposure", { 390 flag_key: flagKey, 391 variant: variant, 392 exp_device_id: expDeviceId 393 }, {}, function () { 394 exposureFired = true; 395 // Clear assignment cookie 396 document.cookie = "exp_assignment=; Path=/; Domain=.jim.com; Secure; SameSite=Lax; Max-Age=0"; 397 try { localStorage.removeItem(LS_KEY); } catch (e) {} 398 }); 399 }; 400 401 // Fallback: sendBeacon on page unload 402 document.addEventListener("pagehide", function () { 403 if (exposureFired) return; 404 if (navigator.sendBeacon) { 405 var sent = navigator.sendBeacon("/exp/exposure-fallback", JSON.stringify({ 406 flag_key: flagKey, 407 variant: variant, 408 exp_device_id: expDeviceId, 409 ts: Date.now() 410 })); 411 if (sent) { 412 exposureFired = true; 413 try { 414 localStorage.setItem(LS_KEY, JSON.stringify({ 415 flagKey: flagKey, 416 variant: variant, 417 expDeviceId: expDeviceId, 418 status: "beacon_sent", 419 ts: Date.now() 420 })); 421 } catch (e) {} 422 } 423 } 424 }); 425 426 fireExposure(); 427})(); 428</script>
428 429<!-- ===== End Experiments - Exposure Tracking ===== --><link rel="canonical" href="https://www.jim.com/blog"/> 430 431 432<!-- START Data Structure .Schema -->
433<script type="application/ld+json"> 434{ 435 "@context": "https://schema.org", 436 "@graph": [ 437 { 438 "@type": "CollectionPage", 439 "name": "JIM Blog", 440 "description": "Sell anywhere, anytime. Get paid instantly. AI Magic.", 441 "url": "https://www.jim.com/blog", 442 "publisher": { 443 "@type": "Organization", 444 "@id": "https://www.jim.com/blog", 445 "name": "JIM", 446 "logo": { 447 "@type": "ImageObject", 448 "url": "https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/65fcae8dd405deb75e3dc056_jim_logo_black.svg" 449 }, 450 "description": "Sell anywhere, anytime. Get paid instantly. AI Magic." 451 }, 452 "about": { 453 "@type": "Thing", 454 "name": "Sell anywhere, anytime. Get paid instantly. AI Magic." 455 }, 456 "image": { 457 "@type": "ImageObject", 458 "url": "https://cdn.prod.website-files.com/6409f1c56b3da52147058438/64ac1451f7b4cd036e9e060e_infinitepay_logo_round.svg" 459 }, 460 "inLanguage": "en", 461 "isPartOf": { 462 "@type": "WebSite", 463 "@id": "https://www.jim.com", 464 "name": "JIM", 465 "url": "https://www.jim.com/" 466 } 467 }, 468 { 469 "@type": "BreadcrumbList", 470 "@id": "https://www.jim.com/blog#breadcrumb", 471 "name": "Breadcrumb", 472 "itemListElement": [ 473 { 474 "@type": "ListItem", 475 "position": 1, 476 "name": "JIM", 477 "item": "https://www.jim.com/" 478 }, 479 { 480 "@type": "ListItem", 481 "position": 2, 482 "name": "Blog", 483 "item": "https://www.jim.com/blog" 484 } 485 ] 486 } 487 ] 488} 489</script>
489 490<!-- END Data Structure .Schema --> 491</head><body class="rb_jim-body"><div class="rb_page-wrapper"><div class="hide"><div class="css w-embed"><style> 492 /* Make text look crisper and more legible in all browsers */ 493 body { 494 -webkit-font-smoothing: antialiased; 495 -moz-osx-font-smoothing: grayscale; 496 font-smoothing: antialiased; 497 text-rendering: optimizeLegibility; 498 } 499 500 /* Focus state style for keyboard navigation for the focusable elements */ 501 *[tabindex]:focus-visible, 502 input[type='file']:focus-visible { 503 outline: 0.125rem solid #4d65ff; 504 outline-offset: 0.125rem; 505 } 506 507 video { 508 width: 100%; 509 object-fit: cover; 510 } 511 512 /* Set color style to inherit */ 513 .inherit-color * { 514 color: inherit; 515 } 516 517 /* Get rid of top margin on first element in any rich text element */ 518 .w-richtext > :not(div):first-child, 519 .w-richtext > div:first-child > :first-child { 520 margin-top: 0 !important; 521 } 522 523 /* Get rid of bottom margin on last element in any rich text element */ 524 .w-richtext > :last-child, 525 .w-richtext ol li:last-child, 526 .w-richtext ul li:last-child { 527 margin-bottom: 0 !important; 528 } 529 530 /* Make sure containers never lose their center alignment */ 531 .container-medium, 532 .container-small, 533 .rb_container-large { 534 margin-right: auto !important; 535 margin-left: auto !important; 536 } 537 538 /* 539Make the following elements inherit typography styles from the parent and not have hardcoded values. 540Important: You will not be able to style for example "All Links" in Designer with this CSS applied. 541Uncomment this CSS to use it in the project. Leave this message for future hand-off. 542*/ 543 /* 544a, 545.w-input, 546.w-select, 547.w-tab-link, 548.w-nav-link, 549.w-dropdown-btn, 550.w-dropdown-toggle, 551.w-dropdown-link { 552 color: inherit; 553 text-decoration: inherit; 554 font-size: inherit; 555} 556*/ 557 558 /* Apply "..." after 3 lines of text */ 559 .text-style-3lines { 560 display: -webkit-box; 561 overflow: hidden; 562 -webkit-line-clamp: 3; 563 -webkit-box-orient: vertical; 564 } 565 566 /* Apply "..." after 2 lines of text */ 567 .text-style-2lines { 568 display: -webkit-box; 569 overflow: hidden; 570 -webkit-line-clamp: 2; 571 -webkit-box-orient: vertical; 572 } 573 574 /* These classes are never overwritten */ 575 .hide { 576 display: none !important; 577 } 578 579 @media screen and (max-width: 991px) { 580 .hide, 581 .hide-tablet { 582 display: none !important; 583 } 584 } 585 @media screen and (max-width: 767px) { 586 .hide-mobile-landscape { 587 display: none !important; 588 } 589 } 590 @media screen and (max-width: 479px) { 591 .hide-mobile { 592 display: none !important; 593 } 594 } 595 596 .margin-0 { 597 margin: 0rem !important; 598 } 599 600 .padding-0 { 601 padding: 0rem !important; 602 } 603 604 .spacing-clean { 605 padding: 0rem !important; 606 margin: 0rem !important; 607 } 608 609 .margin-top { 610 margin-right: 0rem !important; 611 margin-bottom: 0rem !important; 612 margin-left: 0rem !important; 613 } 614 615 .padding-top { 616 padding-right: 0rem !important; 617 padding-bottom: 0rem !important; 618 padding-left: 0rem !important; 619 } 620 621 .margin-right { 622 margin-top: 0rem !important; 623 margin-bottom: 0rem !important; 624 margin-left: 0rem !important; 625 } 626 627 .padding-right { 628 padding-top: 0rem !important; 629 padding-bottom: 0rem !important; 630 padding-left: 0rem !important; 631 } 632 633 .margin-bottom { 634 margin-top: 0rem !important; 635 margin-right: 0rem !important; 636 margin-left: 0rem !important; 637 } 638 639 .padding-bottom { 640 padding-top: 0rem !important; 641 padding-right: 0rem !important; 642 padding-left: 0rem !important; 643 } 644 645 .margin-left { 646 margin-top: 0rem !important; 647 margin-right: 0rem !important; 648 margin-bottom: 0rem !important; 649 } 650 651 .padding-left { 652 padding-top: 0rem !important; 653 padding-right: 0rem !important; 654 padding-bottom: 0rem !important; 655 } 656 657 .margin-horizontal { 658 margin-top: 0rem !important; 659 margin-bottom: 0rem !important; 660 } 661 662 .padding-horizontal { 663 padding-top: 0rem !important; 664 padding-bottom: 0rem !important; 665 } 666 667 .margin-vertical { 668 margin-right: 0rem !important; 669 margin-left: 0rem !important; 670 } 671 672 .padding-vertical { 673 padding-right: 0rem !important; 674 padding-left: 0rem !important; 675 } 676 677 html.wf-design-mode .link-full { 678 pointer-events: none; 679 } 680 681 [data-hover='scale'] img:not([data-hover='none']) { 682 transition: transform 0.8s ease; 683 } 684 685 [data-hover='scale']:hover img:not([data-hover='none']) { 686 transform: scale(1.05); 687 } 688 .u-icon.rb_is-mobile { 689 display: flex !important; 690 } 691 692 [data-state] { 693 --_state---true: 1; 694 --_state---false: 0; 695 } 696 697 .is-active, 698 [data-state~='open']:is(.w--open, :has(.w--open)), 699 [data-state~='expanded']:is([aria-expanded='true'], :has([aria-expanded='true'])) { 700 --_state---true: 0; 701 --_state---false: 1; 702 } 703 704 html.wf-design-mode [lottie-stack='1'] { 705 opacity: 1; 706 } 707 708 html.is-safari [button-sticky="spacer"].is-collapsed { 709 height: 3.5rem; 710 } 711 712 html.is-safari [button-sticky="spacer"].is-collapsed.is-scrolled { 713 height: 1rem; 714 } 715 716 html, body {
717 overscroll-behavior: none; 718} 719 720 [safari-ignore-tint] { 721 backdrop-filter: blur(0.1px); 722 -webkit-backdrop-filter: blur(0.1px); 723} 724</style> 725 726<style> 727 html { font-size: 1rem; } 728 @media screen and (max-width:1920px) { html { font-size: 1rem; } } 729 @media screen and (max-width:1440px) { html { font-size: calc(0.39866369710467703rem + 0.6681514476614699vw); } } 730 @media screen and (max-width:991px) { html { font-size: 1rem; } } 731</style> 732 733<!-- Text Style Start --> 734<style> 735 ::selection { 736 background-color:#FF5C19; 737 color: #1A0000; 738</style> 739<!-- Text Style End --></div><div class="css w-embed w-script"><style> 740 [data-button='bg'] { 741 opacity: 0; 742 transition: opacity 0.4s; 743 } 744 745 [data-button='trigger']:hover [data-button='bg'] { 746 opacity: 1; 747 } 748 749 @media screen and (max-width: 767px) { 750 [data-button='bg'] { 751 opacity: 1; 752 } 753 } 754 755 /* o .u-icon cobre os link_wrapper que nao tem o atributo link='icon' */ 756 [link='icon'], 757 [link='hover'] .u-icon { 758 transition: transform 0.3s ease; 759 } 760 761 [link='hover']:hover [link='icon'], 762 [link='hover']:hover .u-icon { 763 transform: translateX(0.25rem); 764 } 765 766 @keyframes rb_button-icon-nudge { 767 0% { 768 transform: translateX(0); 769 animation-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94); 770 } 771 40% { 772 transform: translateX(-0.75rem); 773 animation-timing-function: cubic-bezier(0.33, 1, 0.68, 1); 774 } 775 100% { 776 transform: translateX(0); 777 } 778 } 779</style> 780
781<script> 782 (function () { 783 "use strict"; 784 785 var REDUZIDO = 786 window.matchMedia && 787 window.matchMedia("(prefers-reduced-motion: reduce)").matches; 788 789 var FINE = 790 window.matchMedia && 791 window.matchMedia("(hover: hover) and (pointer: fine)").matches; 792 793 if (REDUZIDO || !FINE) return; 794 795 var VOLTA_MS = 450; 796 var VOLTA_EASE = "cubic-bezier(0.33, 1, 0.68, 1)"; 797 798 function limparIcon(icon) { 799 icon.style.animation = ""; 800 icon.style.transition = ""; 801 icon.style.transform = ""; 802 } 803 804 function lerX(icon) { 805 var t = getComputedStyle(icon).transform; 806 if (!t || t === "none") return 0; 807 return new DOMMatrixReadOnly(t).m41; 808 } 809 810 function init(trigger) { 811 var icon = trigger.querySelector("[button=\"icon\"]"); 812 if (!icon) return; 813 814 trigger.addEventListener("mouseenter", function () { 815 limparIcon(icon); 816 icon.style.animation = "rb_button-icon-nudge 0.85s"; 817 }); 818 819 trigger.addEventListener("mouseleave", function () { 820 /* lê a posição ainda com a keyframe rodando: se corta a animação 821 antes, o browser zera o transform e a seta pula */ 822 var x = lerX(icon); 823 824 icon.style.animation = "none"; 825 826 if (Math.abs(x) < 0.5) { 827 limparIcon(icon); 828 return; 829 } 830 831 icon.style.transform = "translateX(" + x + "px)"; 832 void icon.offsetWidth; 833 834 icon.style.transition = 835 "transform " + VOLTA_MS + "ms " + VOLTA_EASE; 836 icon.style.transform = "translateX(0)"; 837 838 function onEnd(e) { 839 if (e.target !== icon || e.propertyName !== "transform") return; 840 icon.removeEventListener("transitionend", onEnd); 841 limparIcon(icon); 842 } 843 844 icon.addEventListener("transitionend", onEnd); 845 }); 846 } 847 848 function boot() { 849 Array.prototype.slice 850 .call(document.querySelectorAll("[data-button=\"trigger\"]")) 851 .forEach(init); 852 } 853 854 if (document.readyState === "loading") { 855 document.addEventListener("DOMContentLoaded", boot); 856 } else { 857 boot(); 858 } 859 })(); 860</script>
860 861</div><div class="css w-embed"><style> 862 [marquee='gradient'] { 863 background: linear-gradient(90deg, #ffffff 9.38%, rgba(255, 255, 255, 0) 73.72%); 864 } 865 [feature='overlay'] { 866 background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.4) 100%); 867 } 868 [cascading-glass] { 869 backdrop-filter: blur(20px); 870 871 box-shadow: 872 -0.5px -0.5px 1px 0px #ffffff66 inset, 873 0.5px 0.5px 0px 0px #ffffff66 inset, 874 0px 4px 4px 0px #0000001a inset, 875 0px -4px 10px 0px #0000001a inset; 876 } 877 [marquee='gradient-dark'] { 878 background: linear-gradient(90deg, #1a0000 9.38%, rgba(26, 0, 0, 0) 73.72%); 879 } 880 881 [nav='backdrop'] { 882 backdrop-filter: blur(20px); 883 -webkit-backdrop-filter: blur(20px); 884 box-shadow: 885 -0.5px -0.5px 1px 0px #ffffff66 inset, 886 0.5px 0.5px 0px 0px #ffffff66 inset, 887 0px 4px 4px 0px #0000001a inset, 888 0px -4px 10px 0px #0000001a inset; 889 } 890</style></div><div class="hide"><div class="js w-embed w-script">
890<script> 891(function () { 892 const DEFAULT_PIXELS_PER_SECOND = 115; 893 let lastWindowWidth = 0; 894 895 function build(marquee) { 896 const source = 897 marquee.querySelector('[data-css-marquee-source]') || 898 marquee.querySelector('[data-css-marquee-list]'); 899 if (!source) return; 900 source.setAttribute('data-css-marquee-source', ''); 901 902 marquee 903 .querySelectorAll('[data-css-marquee-list]:not([data-css-marquee-source])') 904 .forEach(function (clone) { 905 clone.remove(); 906 }); 907 908 // sem isso a emenda entre cópias fica sem o espaçamento que separa os itens 909 const gap = parseFloat(getComputedStyle(source).columnGap) || 0; 910 source.style.paddingRight = gap + 'px'; 911 912 const listWidth = source.offsetWidth; 913 if (!listWidth) return; 914 915 // Ao fim do ciclo a primeira cópia já saiu de cena, então as restantes precisam 916 // alcançar a borda da janela sozinhas. Alguns wrappers são centralizados e se 917 // deslocam a cada cópia, por isso a cobertura é remedida a cada passo. 918 let copies = 1; 919 while (copies < 20) { 920 const left = marquee.getBoundingClientRect().left; 921 if (copies >= 2 && left + (copies - 1) * listWidth >= window.innerWidth) break; 922 const clone = source.cloneNode(true); 923 clone.removeAttribute('data-css-marquee-source'); 924 clone.setAttribute('aria-hidden', 'true'); 925 marquee.appendChild(clone); 926 copies++; 927 } 928 929 const speedAttr = parseFloat(marquee.dataset.cssMarqueeSpeed); 930 const pixelsPerSecond = 931 !isNaN(speedAttr) && speedAttr > 0 ? speedAttr : DEFAULT_PIXELS_PER_SECOND; 932 const lists = marquee.querySelectorAll('[data-css-marquee-list]'); 933 934 lists.forEach(function (list) {
935 list.style.animation = 'none'; 936 }); 937 void marquee.offsetWidth; // reinicia todas as cópias em fase 938 const shouldRun = marquee.dataset.inView === 'true'; 939 lists.forEach(function (list) { 940 list.style.animation = ''; 941 list.style.animationDuration = listWidth / pixelsPerSecond + 's'; 942 list.style.animationPlayState = shouldRun ? 'running' : 'paused'; 943 }); 944 945 marquee.dataset.cssMarqueeReady = 'true'; 946 } 947 948 function buildAll() { 949 lastWindowWidth = window.innerWidth; 950 document.querySelectorAll('[data-css-marquee]').forEach(build); 951 } 952 953 function initCSSMarquee() { 954 const marquees = document.querySelectorAll('[data-css-marquee]'); 955 if (!marquees.length) return; 956 957 const observer = new IntersectionObserver( 958 function (entries) { 959 entries.forEach(function (entry) { 960 const marquee = entry.target; 961 marquee.dataset.inView = entry.isIntersecting; 962 if (entry.isIntersecting && !marquee.dataset.cssMarqueeReady) build(marquee); 963 marquee.querySelectorAll('[data-css-marquee-list]').forEach(function (list) { 964 list.style.animationPlayState = entry.isIntersecting ? 'running' : 'paused'; 965 }); 966 }); 967 }, 968 { threshold: 0 }, 969 ); 970 971 marquees.forEach(function (marquee) { 972 if (marquee.dataset.cssMarqueeObserved) return; 973 marquee.dataset.cssMarqueeObserved = 'true'; 974 marquee.dataset.inView = 'false'; 975 observer.observe(marquee); 976 }); 977 978 buildAll(); 979 980 // fontes e imagens de CMS mudam a largura da lista depois da primeira medição 981 if (document.fonts && document.fonts.ready) document.fonts.ready.then(buildAll); 982 window.addEventListener('load', buildAll); 983 984 let resizeTimer; 985 window.addEventListener('resize', function () { 986 if (window.innerWidth === lastWindowWidth) return; 987 clearTimeout(resizeTimer); 988 resizeTimer = setTimeout(buildAll, 200); 989 }); 990 } 991 992 window.initCSSMarquee = initCSSMarquee; 993 if (document.readyState === 'loading') { 994 document.addEventListener('DOMContentLoaded', initCSSMarquee); 995 } else {
996 initCSSMarquee(); 997 } 998})(); 999</script>
999</div><div class="css w-embed"><style> 1000@keyframes translateX { 1001 to { 1002 transform: translateX(-100%); 1003 } 1004} 1005 1006[data-css-marquee-list] { 1007 animation: translateX 30s linear; 1008 animation-iteration-count: infinite; 1009 animation-play-state: paused; 1010} 1011 1012/* O backdrop-filter da nav re-rasteriza o que está atrás a cada frame e o marquee 1013 em movimento pisca, então ele para enquanto a nav está aberta (atrás do blur 1014 não dá pra perceber). !important porque o script escreve play-state inline. */ 1015body:has(.nav_component .nav_dropdown_component > [aria-expanded='true']) [data-css-marquee-list], 1016body:has(.nav_component .w-nav-button.w--open) [data-css-marquee-list] { 1017 animation-play-state: paused !important; 1018} 1019 1020</style></div></div><div class="hide"><div class="js w-embed w-script">
1020<script> 1021 function initVimeoLightboxAdvanced() { 1022 // Single lightbox container 1023 const lightbox = document.querySelector('[data-vimeo-lightbox-init]'); 1024 if (!lightbox) return; 1025 1026 // Open & close buttons 1027 const openButtons = document.querySelectorAll('[data-vimeo-lightbox-control="open"]'); 1028 const closeButtons = document.querySelectorAll('[data-vimeo-lightbox-control="close"]'); 1029 1030 // Core elements inside lightbox 1031 let iframe = lightbox.querySelector('iframe'); // â now let 1032 const placeholder = lightbox.querySelector('.vimeo-lightbox__placeholder'); 1033 const calcEl = lightbox.querySelector('.vimeo-lightbox__calc'); 1034 const wrapEl = lightbox.querySelector('.vimeo-lightbox__calc-wrap'); 1035 const playerContainer = lightbox.querySelector('[data-vimeo-lightbox-player]'); 1036 1037 // State 1038 let player = null; 1039 let currentVideoID = null; 1040 let videoAspectRatio = null; 1041 let globalMuted = lightbox.getAttribute('data-vimeo-muted') === 'true'; 1042 const isTouch = ('ontouchstart' in window) || navigator.maxTouchPoints > 0; 1043 const playedOnce = new Set(); // track first play on touch 1044 1045 // Format time (seconds â "m:ss") 1046 function formatTime(s) { 1047 const m = Math.floor(s / 60); 1048 const sec = Math.floor(s % 60).toString().padStart(2, '0'); 1049 return `${m}:${sec}`; 1050 } 1051 1052 // Clamp wrap height 1053 function clampWrapSize(ar) { 1054 const w = calcEl.offsetWidth; 1055 const h = calcEl.offsetHeight; 1056 wrapEl.style.maxWidth = Math.min(w, h / ar) + 'px'; 1057 } 1058 1059 // Adjust sizing in "cover" mode 1060 function adjustCoverSizing() { 1061 if (!videoAspectRatio) return; 1062 const cH = playerContainer.offsetHeight; 1063 const cW = playerContainer.offsetWidth; 1064 const r = cH / cW; 1065 const wEl = lightbox.querySelector('.vimeo-lightbox__iframe'); 1066 if (r > videoAspectRatio) { 1067 wEl.style.width = (r / videoAspectRatio * 100) + '%'; 1068 wEl.style.height = '100%'; 1069 } else { 1070 wEl.style.height = (videoAspectRatio / r * 100) + '%'; 1071 wEl.style.width = '100%'; 1072 } 1073 } 1074 1075 // Close & pause lightbox 1076 function closeLightbox() { 1077 lightbox.setAttribute('data-vimeo-activated', 'false'); 1078 if (player) { 1079 player.pause(); 1080 lightbox.setAttribute('data-vimeo-playing', 'false'); 1081 } 1082 } 1083 1084 // Wire Escape key & close buttons 1085 document.addEventListener('keydown', e => { 1086 if (e.key === 'Escape') closeLightbox(); 1087 }); 1088 closeButtons.forEach(btn => btn.addEventListener('click', closeLightbox)); 1089 1090 // Setup Vimeo Player event handlers 1091 function setupPlayerEvents() { 1092 // Hide placeholder when playback starts 1093 player.on('play', () => { 1094 lightbox.setAttribute('data-vimeo-loaded', 'true'); 1095 lightbox.setAttribute('data-vimeo-playing', 'true'); 1096 }); 1097 // Close on video end 1098 player.on('ended', closeLightbox); 1099 1100 // Paused 1101 player.on('pause', () => { 1102 lightbox.setAttribute('data-vimeo-playing', 'false'); 1103 }); 1104 1105 // Duration UI 1106 const durEl = lightbox.querySelector('[data-vimeo-duration]'); 1107 player.getDuration().then(d => { 1108 if (durEl) durEl.textContent = formatTime(d); 1109 lightbox.querySelectorAll('[data-vimeo-control="timeline"],progress') 1110 .forEach(el => el.max = d); 1111 }); 1112 1113 // Timeline & progress updates 1114 const tl = lightbox.querySelector('[data-vimeo-control="timeline"]'); 1115 const pr = lightbox.querySelector('progress'); 1116 player.on('timeupdate', data => { 1117 if (tl) tl.value = data.seconds; 1118 if (pr) pr.value = data.seconds; 1119 if (durEl) durEl.textContent = formatTime(Math.trunc(data.seconds)); 1120 }); 1121 if (tl) { 1122 ['input','change'].forEach(evt => 1123 tl.addEventListener(evt, e => { 1124 const v = e.target.value; 1125 player.setCurrentTime(v); 1126 if (pr) pr.value = v; 1127 }) 1128 ); 1129 } 1130 1131 // Hover â hide controls after a timeout 1132 let hoverTimer; 1133 playerContainer.addEventListener('mousemove', () => { 1134 lightbox.setAttribute('data-vimeo-hover', 'true'); 1135 clearTimeout(hoverTimer); 1136 hoverTimer = setTimeout(() => { 1137 lightbox.setAttribute('data-vimeo-hover', 'false'); 1138 }, 3000); 1139 }); 1140 1141 // Fullscreen toggle on player container
1142 const fsBtn = lightbox.querySelector('[data-vimeo-control="fullscreen"]'); 1143 if (fsBtn) { 1144 const isFS = () => document.fullscreenElement || document.webkitFullscreenElement; 1145 if (!(document.fullscreenEnabled || document.webkitFullscreenEnabled)) { 1146 fsBtn.style.display = 'none'; 1147 } 1148 fsBtn.addEventListener('click', () => { 1149 if (isFS()) { 1150 lightbox.setAttribute('data-vimeo-fullscreen', 'false'); 1151 (document.exitFullscreen || document.webkitExitFullscreen).call(document); 1152 } else { 1153 lightbox.setAttribute('data-vimeo-fullscreen', 'true'); 1154 (playerContainer.requestFullscreen || playerContainer.webkitRequestFullscreen) 1155 .call(playerContainer); 1156 } 1157 }); 1158 ['fullscreenchange','webkitfullscreenchange'].forEach(evt => 1159 document.addEventListener(evt, () => 1160 lightbox.setAttribute('data-vimeo-fullscreen', isFS() ? 'true' : 'false') 1161 )); 1162 } 1163 } 1164 1165 // Run sizing logic 1166 async function runSizing() { 1167 const mode = lightbox.getAttribute('data-vimeo-update-size'); 1168 const w = await player.getVideoWidth(); 1169 const h = await player.getVideoHeight(); 1170 const ar = h / w; 1171 const bef = lightbox.querySelector('.vimeo-lightbox__before'); 1172 1173 if (mode === 'true') { 1174 if (bef) bef.style.paddingTop = (ar * 100) + '%'; 1175 clampWrapSize(ar); 1176 } else if (mode === 'cover') { 1177 videoAspectRatio = ar; 1178 if (bef) bef.style.paddingTop = '0%'; 1179 adjustCoverSizing(); 1180 } else { 1181 clampWrapSize(ar); 1182 } 1183 } 1184 1185 // Re-run sizing on viewport resize 1186 window.addEventListener('resize', () => { 1187 if (player) runSizing(); 1188 }); 1189 1190 // Open or switch video 1191 async function openLightbox(id, placeholderBtn) { 1192 // Enter loading state immediately 1193 lightbox.setAttribute('data-vimeo-activated', 'loading'); 1194 lightbox.setAttribute('data-vimeo-loaded', 'false'); 1195 1196 // â FULL RESET if new video ID â 1197 if (player && id !== currentVideoID) { 1198 await player.pause(); 1199 await player.unload(); 1200 1201 // Replace old iframe with a fresh one 1202 const oldIframe = iframe; 1203 const newIframe = document.createElement('iframe'); 1204 newIframe.className = oldIframe.className; 1205 newIframe.setAttribute('allow', oldIframe.getAttribute('allow')); 1206 newIframe.setAttribute('frameborder', '0'); 1207 newIframe.setAttribute('allowfullscreen', 'true'); 1208 newIframe.setAttribute('allow', 'autoplay; encrypted-media'); 1209 oldIframe.parentNode.replaceChild(newIframe, oldIframe); 1210 1211 // Reset state 1212 iframe = newIframe; 1213 player = null; 1214 currentVideoID = null; 1215 lightbox.setAttribute('data-vimeo-playing', 'false'); 1216 } 1217 1218 // Update placeholder image attributes 1219 if (placeholderBtn) { 1220 ['src','srcset','sizes','alt','width'].forEach(attr => { 1221 const val = placeholderBtn.getAttribute(attr); 1222 if (val != null) placeholder.setAttribute(attr, val); 1223 }); 1224 } 1225 1226 // Build a brand-new player if needed 1227 if (!player) { 1228 iframe.src = `https://player.vimeo.com/video/${id}?api=1&background=1&autoplay=0&loop=0&muted=0`; 1229 player = new Vimeo.Player(iframe); 1230 setupPlayerEvents(); 1231 currentVideoID = id; 1232 await runSizing(); 1233 } 1234 1235 // Now sizing is ready â show lightbox 1236 lightbox.setAttribute('data-vimeo-activated', 'true'); 1237 1238 // Autoplay logic 1239 if (!isTouch) { 1240 player.setVolume(globalMuted ? 0 : 1).then(() => { 1241 lightbox.setAttribute('data-vimeo-playing', 'true'); 1242 setTimeout(() => player.play(), 50); 1243 }); 1244 } else if (playedOnce.has(currentVideoID)) { 1245 player.setVolume(globalMuted ? 0 : 1).then(() => { 1246 lightbox.setAttribute('data-vimeo-playing', 'true'); 1247 player.play(); 1248 }); 1249 } 1250 } 1251 1252 // Internal controls 1253 lightbox.querySelector('[data-vimeo-control="play"]').addEventListener('click', () => { 1254 if (isTouch) { 1255 if (!playedOnce.has(currentVideoID)) { 1256 player.setVolume(0).then(() => { 1257 lightbox.setAttribute('data-vimeo-playing', 'true'); 1258 player.play(); 1259 if (!globalMuted) { 1260 setTimeout(() => { 1261 player.setVolume(1); 1262 lightbox.setAttribute('data-vimeo-muted', 'false'); 1263 }, 100); 1264 } 1265 playedOnce.add(currentVideoID); 1266 }); 1267 } else { 1268 player.setVolume(globalMuted ? 0 : 1).then(() => { 1269 lightbox.setAttribute('data-vimeo-playing', 'true'); 1270 player.play(); 1271 }); 1272 } 1273 } else { 1274 player.setVolume(globalMuted ? 0 : 1).then(() => { 1275 lightbox.setAttribute('data-vimeo-playing', 'true'); 1276 setTimeout(() => player.play(), 50); 1277 }); 1278 } 1279 }); 1280
1281 lightbox.querySelector('[data-vimeo-control="pause"]').addEventListener('click', () => { 1282 player.pause(); 1283 }); 1284 1285 lightbox.querySelector('[data-vimeo-control="mute"]').addEventListener('click', () => { 1286 globalMuted = !globalMuted; 1287 player.setVolume(globalMuted ? 0 : 1).then(() => 1288 lightbox.setAttribute('data-vimeo-muted', globalMuted ? 'true' : 'false') 1289 ); 1290 }); 1291 1292 // Wire up open buttons 1293 openButtons.forEach(btn => { 1294 btn.addEventListener('click', () => { 1295 const vid = btn.getAttribute('data-vimeo-lightbox-id'); 1296 const img = btn.querySelector('[data-vimeo-lightbox-placeholder]'); 1297 openLightbox(vid, img); 1298 }); 1299 }); 1300} 1301 1302// Initialize Vimeo Lightbox (Advanced) 1303document.addEventListener('DOMContentLoaded', function() { 1304 initVimeoLightboxAdvanced(); 1305}); 1306</script>
1306</div><div class="css w-embed"><style> 1307 .vimeo-lightbox__player { 1308 transition: all 0.3s cubic-bezier(0.625, 0.05, 0, 1); 1309 opacity: 0; 1310 visibility: hidden; 1311 transform: scale(0.9) rotate(0.001deg) translateX(0); 1312} 1313 1314.vimeo-lightbox[data-vimeo-activated="true"] .vimeo-lightbox__player { 1315 opacity: 1; 1316 visibility: visible; 1317 transform: scale(1) rotate(0.001deg) translateX(0); 1318} 1319 1320/* Dark BG */ 1321.vimeo-lightbox__bg { 1322 transition: all 0.3s cubic-bezier(0.625, 0.05, 0, 1); 1323 opacity: 0; 1324 visibility: hidden; 1325} 1326 1327.vimeo-lightbox[data-vimeo-activated="loading"] .vimeo-lightbox__bg, 1328.vimeo-lightbox[data-vimeo-activated="true"] .vimeo-lightbox__bg{ 1329 opacity: 1; 1330 visibility: visible; 1331} 1332 1333/* Close Button */ 1334.vimeo-lightbox__close { 1335 transition: all 0.5s cubic-bezier(0.625, 0.05, 0, 1); 1336 opacity: 0; 1337 visibility: hidden; 1338} 1339 1340.vimeo-lightbox[data-vimeo-activated="true"] .vimeo-lightbox__close { 1341 opacity: 1; 1342 visibility: visible; 1343} 1344 1345/* Cover */ 1346.vimeo-lightbox[data-vimeo-update-size="cover"] .vimeo-lightbox__calc-wrap { 1347 height: 100%; 1348} 1349 1350.vimeo-lightbox[data-vimeo-update-size="cover"] [data-vimeo-lightbox-player] { 1351 width: 100%; 1352 min-width: 100%; 1353 max-width: 100%; 1354 height: 100%; 1355 min-height: 100%; 1356 max-height: 100%; 1357} 1358 1359/* Placeholder */ 1360.vimeo-lightbox[data-vimeo-loaded="true"] .vimeo-lightbox__placeholder { 1361 opacity: 0; 1362} 1363 1364/* Dark (Overlay) */ 1365.vimeo-lightbox[data-vimeo-playing="false"] .vimeo-lightbox__dark { 1366 opacity: 0.33; 1367} 1368 1369.vimeo-lightbox[data-vimeo-activated="false"][data-vimeo-playing="false"] .vimeo-lightbox__dark { 1370 opacity: 0; 1371} 1372 1373.vimeo-lightbox[data-vimeo-activated="true"][data-vimeo-loaded="true"] .vimeo-lightbox__dark { 1374 opacity: 0; 1375} 1376 1377@media (hover: hover) and (pointer: fine) { 1378 .vimeo-lightbox[data-vimeo-hover="true"]:hover .vimeo-lightbox__dark { 1379 opacity: 0.33 !important; 1380 } 1381} 1382 1383/* Pause */ 1384.vimeo-lightbox .vimeo-lightbox__pause { 1385 display: none; 1386} 1387 1388.vimeo-lightbox[data-vimeo-playing="true"] .vimeo-lightbox__pause { 1389 display: flex; 1390} 1391 1392.vimeo-lightbox .vimeo-lightbox__pause .vimeo-lightbox__btn { 1393 opacity: 0; 1394} 1395 1396.vimeo-lightbox[data-vimeo-activated="true"][data-vimeo-playing="false"] .vimeo-lightbox__pause .vimeo-lightbox__btn, 1397.vimeo-lightbox[data-vimeo-activated="true"][data-vimeo-hover="true"]:hover .vimeo-lightbox__pause .vimeo-lightbox__btn { 1398 opacity: 1; 1399} 1400 1401@media (hover: none) and (pointer: coarse) { 1402 .vimeo-lightbox[data-vimeo-activated="true"][data-vimeo-playing="true"] .vimeo-lightbox__pause .vimeo-lightbox__btn { 1403 opacity: 0 !important; 1404 } 1405} 1406 1407/* Play */ 1408.vimeo-lightbox[data-vimeo-playing="true"] .vimeo-lightbox__play { 1409 opacity: 0; 1410} 1411 1412/* Loading */ 1413.vimeo-lightbox .vimeo-lightbox__loading { 1414 opacity: 0; 1415} 1416 1417.vimeo-lightbox[data-vimeo-playing="true"] .vimeo-lightbox__loading { 1418 opacity: 1; 1419} 1420 1421.vimeo-lightbox[data-vimeo-playing="true"][data-vimeo-loaded="true"] .vimeo-lightbox__loading { 1422 opacity: 0; 1423} 1424 1425/* Interface */ 1426.vimeo-lightbox .vimeo-lightbox__interface { 1427 opacity: 0; 1428} 1429 1430.vimeo-lightbox[data-vimeo-activated="false"][data-vimeo-playing="false"] .vimeo-lightbox__interface { 1431 opacity: 1; 1432} 1433 1434.vimeo-lightbox .vimeo-lightbox__interface * { 1435 pointer-events: all; /* Make children of div clickable by user */ 1436} 1437 1438.vimeo-lightbox[data-vimeo-activated="true"][data-vimeo-playing="false"] .vimeo-lightbox__interface, 1439.vimeo-lightbox[data-vimeo-activated="true"][data-vimeo-hover="true"]:hover .vimeo-lightbox__interface { 1440 opacity: 1; 1441} 1442 1443@media (hover: none) and (pointer: coarse) { 1444 .vimeo-lightbox[data-vimeo-activated="true"][data-vimeo-playing="true"] .vimeo-lightbox__interface { 1445 opacity: 0 !important; 1446 } 1447} 1448 1449/* Interface - Variables */ 1450.vimeo-lightbox { 1451 --timeline-rounded-corners: 1.5em; 1452 --timeline-dot-height: 0.75em; 1453 --timeline-dot-color: #FF4C24; 1454 --progress-bg: rgba(239, 238, 236, 0.2); 1455 --progress-fill-bg: #FF4C24; 1456 --progress-height: 0.2em; 1457} 1458 1459/* Interface - Timeline */ 1460.vimeo-lightbox progress::-webkit-progress-bar { 1461 border-radius: var(--timeline-rounded-corners); 1462 background-color: var(--progress-bg); 1463 box-shadow: 0; 1464} 1465 1466.vimeo-lightbox progress::-webkit-progress-value { 1467 background: var(--progress-fill-bg); 1468} 1469 1470.vimeo-lightbox progress::-moz-progress-bar{ 1471 border-radius: var(--timeline-rounded-corners); 1472 background: var(--progress-fill-bg); 1473 box-shadow: 0; 1474} 1475 1476.vimeo-lightbox progress::-ms-fill { 1477 border-radius: var(--timeline-rounded-corners); 1478} 1479 1480/* Interface - Range */ 1481.vimeo-lightbox [type="range"]::-webkit-slider-thumb { 1482 -webkit-appearance: none; 1483} 1484 1485.vimeo-lightbox [type="range"]:focus { 1486 outline: none; 1487} 1488 1489.vimeo-lightbox [type="range"]::-ms-track { 1490 width: 100%; 1491 cursor: pointer; 1492 background-color: transparent; 1493 border-color: transparent; 1494 color: transparent; 1495} 1496 1497.vimeo-lightbox [type="range"]::-webkit-slider-runnable-track{ 1498 width: 100%; 1499 height: var(--progress-height); 1500 cursor: pointer; 1501 background-color: var(--progress-bg); 1502 border-radius: var(--timeline-rounded-corners); 1503 background-color: transparent; 1504 border-color: transparent; 1505 color: transparent; 1506} 1507 1508.vimeo-lightbox [type="range"]::-webkit-slider-thumb { 1509 box-shadow: 0; 1510 height: var(--timeline-dot-height); 1511 width: var(--timeline-dot-height); 1512 border-radius: var(--timeline-rounded-corners); 1513 background-color: var(--timeline-dot-color); 1514 cursor: pointer; 1515 -webkit-appearance: none; 1516 margin-top: calc((var(--progress-height) / 2) - (var(--timeline-dot-height) / 2)); 1517} 1518 1519.vimeo-lightbox [type="range"]::-webkit-slider-runnable-track, 1520.vimeo-lightbox [type="range"]:focus::-webkit-slider-runnable-track { 1521 background-color: transparent; 1522 border-color: transparent; 1523 color: transparent; 1524} 1525 1526.vimeo-lightbox [type="range"]::-moz-range-track { 1527 width: 100%; 1528 height: var(--progress-height); 1529 cursor: pointer; 1530 background: var(--progress-bg); 1531 border-radius: 0; 1532 border: 0; 1533 border-radius: var(--timeline-rounded-corners); 1534 overflow: hidden; 1535 opacity: 1 !important; 1536} 1537 1538.vimeo-lightbox [type="range"]::-moz-range-thumb { 1539 box-shadow: 0; 1540 border: 0; 1541 height: var(--timeline-dot-height); 1542 width: var(--timeline-dot-height); 1543 border-radius: var(--timeline-rounded-corners); 1544 background: var(--timeline-dot-color); 1545 cursor: pointer; 1546 box-shadow: 0; 1547} 1548 1549/* Interface - Mute */ 1550.vimeo-lightbox .vimeo-lightbox__mute svg:nth-child(2), 1551.vimeo-lightbox[data-vimeo-muted="true"] .vimeo-lightbox__mute svg:nth-child(1) { 1552 display: none; 1553} 1554 1555.vimeo-lightbox .vimeo-lightbox__mute svg:nth-child(1), 1556.vimeo-lightbox[data-vimeo-muted="true"] .vimeo-lightbox__mute svg:nth-child(2) { 1557 display: block; 1558} 1559 1560/* Interface - Fullscreen */ 1561.vimeo-lightbox .vimeo-lightbox__fullscreen svg:nth-child(2), 1562.vimeo-lightbox[data-vimeo-fullscreen="true"] .vimeo-lightbox__fullscreen svg:nth-child(1) { 1563 display: none; 1564} 1565 1566.vimeo-lightbox .vimeo-lightbox__fullscreen svg:nth-child(1), 1567.vimeo-lightbox[data-vimeo-fullscreen="true"] .vimeo-lightbox__fullscreen svg:nth-child(2) { 1568 display: block; 1569} 1570</style></div></div><div class="hide"><div class="js w-embed w-script">
1570<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
vendor: 1 bytes, line 1570
1570
1571<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/ScrollTrigger.min.js"></script>
1571 1572
1573<script> 1574gsap.registerPlugin(ScrollTrigger); 1575 1576function initNumberOdometer() { 1577 const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches 1578 const initFlag = 'data-odometer-initialized' 1579 const activeTweens = new WeakMap() 1580 1581 const defaults = { 1582 duration: 1, 1583 ease: 'power3.out', 1584 elementStagger: 0.1, 1585 digitStagger: 0.04, 1586 revealDuration: 0.5, 1587 revealEase: 'power2.out', 1588 triggerStart: 'top 80%', 1589 staggerOrder: 'left', 1590 digitCycles: 2 1591 } 1592 1593 document.querySelectorAll('[data-odometer-group]').forEach(group => { 1594 if (group.hasAttribute(initFlag)) return 1595 group.setAttribute(initFlag, '') 1596 1597 const elements = Array.from(group.querySelectorAll('[data-odometer-element]')).filter( 1598 el => el.getAttribute('data-odometer-element') !== 'none' 1599 ) 1600 if (!elements.length || prefersReducedMotion) return 1601 1602 const staggerOrder = group.getAttribute('data-odometer-stagger-order') || defaults.staggerOrder 1603 const triggerStart = group.getAttribute('data-odometer-trigger-start') || defaults.triggerStart 1604 const elementStagger = parseFloat(group.getAttribute('data-odometer-stagger')) || defaults.elementStagger 1605 1606 const elementData = elements.map(el => { 1607 const originalText = el.textContent.trim() 1608 const hasExplicitStart = el.hasAttribute('data-odometer-start') 1609 const startValue = parseFloat(el.getAttribute('data-odometer-start')) || 0 1610 const duration = parseFloat(el.getAttribute('data-odometer-duration')) || defaults.duration 1611 const step = getLineHeightRatio(el) 1612 1613 let segments = parseSegments(originalText) 1614 segments = mapStartDigits(segments, startValue) 1615 segments = markHiddenSegments(segments, startValue) 1616 1617 const grow = shouldGrow(el, hasExplicitStart, startValue, segments) 1618 const { rollers, revealEls } = buildRollerDOM(el, segments, step, grow) 1619 1620 const fontSize = parseFloat(getComputedStyle(el).fontSize) 1621 const revealData = revealEls.map(revealEl => { 1622 const widthEm = revealEl.offsetWidth / fontSize 1623 gsap.set(revealEl, { width: 0, overflow: 'hidden' }) 1624 return { el: revealEl, widthEm } 1625 }) 1626 1627 return { el, rollers, duration, step, revealData, originalText } 1628 }) 1629 1630 const ordered = applyStaggerOrder(elementData, staggerOrder) 1631 1632 const tl = gsap.timeline({ 1633 scrollTrigger: { 1634 trigger: group, 1635 start: triggerStart, 1636 once: true 1637 }, 1638 onComplete() { 1639 elementData.forEach(({ el, originalText }) => { 1640 cleanupElement(el, originalText) 1641 }) 1642 } 1643 }) 1644 1645 ordered.forEach((data, orderIdx) => { 1646 const { rollers, duration, step, revealData } = data 1647 const offset = orderIdx * elementStagger 1648 1649 revealData.forEach(({ el, widthEm }) => { 1650 tl.to(el, { 1651 width: widthEm + 'em', 1652 opacity: 1, 1653 duration: defaults.revealDuration, 1654 ease: defaults.revealEase 1655 }, offset) 1656 }) 1657 1658 rollers.forEach(({ roller, targetPos }, digitIdx) => { 1659 const reversedIdx = rollers.length - 1 - digitIdx 1660 tl.to(roller, { 1661 y: -targetPos * step + 'em', 1662 duration, 1663 ease: defaults.ease, 1664 force3D: true 1665 }, offset + reversedIdx * defaults.digitStagger) 1666 }) 1667 }) 1668 }) 1669 1670 return function updateOdometer(el, newText, options = {}) { 1671 const currentText = el.textContent.trim() 1672 if (currentText === newText) return 1673 if (el.getAttribute('data-odometer-element') === 'none') return 1674 1675 const duration = options.duration || defaults.duration 1676 const ease = options.ease || defaults.ease 1677 const step = getLineHeightRatio(el) 1678 1679 const existing = activeTweens.get(el) 1680 if (existing) { 1681 existing.kill() 1682 gsap.set(el, { clearProps: 'width,overflow' }) 1683 } 1684 1685 const fontSize = parseFloat(getComputedStyle(el).fontSize) 1686 const oldWidthEm = el.getBoundingClientRect().width / fontSize 1687 1688 const startSegments = parseSegments(currentText) 1689 const startDigitsStr = startSegments 1690 .filter(s => s.type === 'digit') 1691 .map(s => s.char) 1692 .join('') 1693 const startValue = parseInt(startDigitsStr, 10) || 0 1694 1695 let segments = parseSegments(newText) 1696 segments = mapStartDigits(segments, startValue) 1697 segments = markHiddenSegments(segments, startValue) 1698 const { rollers, revealEls } = buildRollerDOM(el, segments, step, true) 1699 1700 const newWidthEm = el.getBoundingClientRect().width / fontSize 1701 const widthChanged = Math.abs(oldWidthEm - newWidthEm) > 0.01 1702 1703 if (widthChanged) { 1704 gsap.set(el, { width: oldWidthEm + 'em', overflow: 'hidden' }) 1705 } 1706 1707 const tl = gsap.timeline({ 1708 onComplete() { 1709 cleanupElement(el, newText) 1710 activeTweens.delete(el) 1711 } 1712 }) 1713 activeTweens.set(el, tl) 1714 1715 if (widthChanged) { 1716 tl.to(el, { 1717 width: newWidthEm + 'em', 1718 duration: defaults.revealDuration, 1719 ease: defaults.revealEase 1720 }, 0) 1721 } 1722
1723 revealEls.forEach(revealEl => { 1724 if (revealEl.getAttribute('data-odometer-part') === 'static') { 1725 tl.to(revealEl, { opacity: 1, duration: 0.2 }, 0) 1726 } 1727 }) 1728 1729 rollers.forEach(({ roller, targetPos }, digitIdx) => { 1730 const reversedIdx = rollers.length - 1 - digitIdx 1731 tl.to(roller, { 1732 y: -targetPos * step + 'em', 1733 duration, 1734 ease, 1735 force3D: true 1736 }, reversedIdx * defaults.digitStagger) 1737 }) 1738 } 1739 1740 function getLineHeightRatio(el) { 1741 const cs = getComputedStyle(el) 1742 const lh = cs.lineHeight 1743 if (lh === 'normal') return 1.2 1744 return parseFloat(lh) / parseFloat(cs.fontSize) 1745 } 1746 1747 function parseSegments(text) { 1748 return [...text].map(char => ({ 1749 type: /\d/.test(char) ? 'digit' : 'static', 1750 char 1751 })) 1752 } 1753 1754 function mapStartDigits(segments, startValue) { 1755 const digitSlots = segments.filter(s => s.type === 'digit') 1756 const padded = String(Math.floor(Math.abs(startValue))) 1757 .padStart(digitSlots.length, '0') 1758 .slice(-digitSlots.length) 1759 let di = 0 1760 return segments.map(s => 1761 s.type === 'digit' 1762 ? { ...s, startDigit: parseInt(padded[di++], 10) } 1763 : s 1764 ) 1765 } 1766 1767 function markHiddenSegments(segments, startValue) { 1768 const totalDigits = segments.filter(s => s.type === 'digit').length 1769 const absStart = Math.floor(Math.abs(startValue)) 1770 const startDigitCount = absStart === 0 ? 1 : String(absStart).length 1771 const leadingZeros = Math.max(0, totalDigits - startDigitCount) 1772 if (leadingZeros === 0) return segments 1773 let digitsSeen = 0 1774 let firstDigitSeen = false 1775 let prevDigitHidden = false 1776 return segments.map(seg => { 1777 if (seg.type === 'digit') { 1778 firstDigitSeen = true 1779 const hidden = digitsSeen < leadingZeros 1780 prevDigitHidden = hidden 1781 digitsSeen++ 1782 return { ...seg, hidden } 1783 } 1784 const hidden = firstDigitSeen && prevDigitHidden 1785 return { ...seg, hidden } 1786 }) 1787 } 1788 1789 function shouldGrow(el, hasExplicitStart, startValue, segments) { 1790 if (el.hasAttribute('data-odometer-grow')) { 1791 return el.getAttribute('data-odometer-grow') !== 'false' 1792 } 1793 if (!hasExplicitStart) return false 1794 const absStart = Math.floor(Math.abs(startValue)) 1795 const startDigitCount = absStart === 0 ? 1 : String(absStart).length 1796 const endDigitCount = segments.filter(s => s.type === 'digit').length 1797 return startDigitCount < endDigitCount 1798 } 1799 1800 function buildRollerDOM(el, segments, step, grow) { 1801 el.innerHTML = '' 1802 el.style.height = '' 1803 const rollers = [] 1804 const revealEls = [] 1805 const totalCells = 10 * defaults.digitCycles 1806 segments.forEach(seg => { 1807 if (seg.type === 'static') { 1808 const span = document.createElement('span') 1809 span.setAttribute('data-odometer-part', 'static') 1810 span.style.height = step + 'em' 1811 span.style.lineHeight = step 1812 span.textContent = seg.char 1813 el.appendChild(span) 1814 if (grow && seg.hidden) { 1815 gsap.set(span, { opacity: 0 }) 1816 revealEls.push(span) 1817 } 1818 return 1819 } 1820 const mask = document.createElement('span') 1821 mask.setAttribute('data-odometer-part', 'mask') 1822 mask.style.height = step + 'em' 1823 mask.style.lineHeight = step 1824 const roller = document.createElement('span') 1825 roller.setAttribute('data-odometer-part', 'roller') 1826 roller.style.lineHeight = step 1827 1828 const digits = [] 1829 for (let d = 0; d < totalCells; d++) { 1830 digits.push(d % 10) 1831 } 1832 roller.textContent = digits.join('\n') 1833 mask.appendChild(roller) 1834 el.appendChild(mask) 1835 const startDigit = seg.startDigit || 0 1836 const isReveal = grow && seg.hidden 1837 gsap.set(roller, { y: isReveal ? step + 'em' : -startDigit * step + 'em' }) 1838 const endDigit = parseInt(seg.char, 10) 1839 const targetPos = endDigit > startDigit ? endDigit : 10 + endDigit 1840 rollers.push({ roller, targetPos }) 1841 if (isReveal) revealEls.push(mask) 1842 }) 1843 return { rollers, revealEls } 1844 } 1845 1846 function cleanupElement(el, originalText) { 1847 el.style.overflow = '' 1848 el.style.height = '' 1849 1850 const digits = [...originalText].filter(c => /\d/.test(c)) 1851 let di = 0 1852 1853 el.querySelectorAll('[data-odometer-part="mask"]').forEach(mask => { 1854 const roller = mask.querySelector('[data-odometer-part="roller"]') 1855 if (roller) roller.remove() 1856 mask.textContent = digits[di++] || '' 1857 mask.style.opacity = '' 1858 mask.style.overflow = '' 1859 }) 1860 1861 el.querySelectorAll('[data-odometer-part="static"]').forEach(stat => { 1862 stat.style.opacity = '' 1863 }) 1864 } 1865 1866 function recalcOnResize() { 1867 document.querySelectorAll('[data-odometer-element]').forEach(el => { 1868 if (el.getAttribute('data-odometer-element') === 'none') return 1869 1870 const running = activeTweens.get(el) 1871 if (running) { 1872 running.progress(1) 1873 activeTweens.delete(el) 1874 } 1875 1876 const hasRollers = el.querySelector('[data-odometer-part="roller"]') 1877 1878 if (hasRollers) { 1879 const step = getLineHeightRatio(el) 1880 el.querySelectorAll('[data-odometer-part="mask"]').forEach(mask => { 1881 mask.style.height = step + 'em' 1882 mask.style.lineHeight = step 1883 }) 1884 el.querySelectorAll('[data-odometer-part="roller"]').forEach(roller => { 1885 roller.style.lineHeight = step 1886 }) 1887 el.querySelectorAll('[data-odometer-part="static"]').forEach(stat => { 1888 stat.style.lineHeight = step 1889 }) 1890 } 1891 }) 1892 ScrollTrigger.refresh() 1893 } 1894 1895 let resizeTimer 1896 let lastWidth = window.innerWidth 1897 window.addEventListener('resize', () => { 1898 clearTimeout(resizeTimer) 1899 resizeTimer = setTimeout(() => { 1900 if (window.innerWidth === lastWidth) return 1901 lastWidth = window.innerWidth 1902 recalcOnResize() 1903 }, 250) 1904 }) 1905 1906 function applyStaggerOrder(items, order) { 1907 const arr = [...items] 1908 if (order === 'right') return arr.reverse() 1909 if (order === 'random') return shuffleArray(arr) 1910 return arr 1911 } 1912 1913 function shuffleArray(arr) { 1914 for (let i = arr.length - 1; i > 0; i--) { 1915 const j = Math.floor(Math.random() * (i + 1)) 1916 ;[arr[i], arr[j]] = [arr[j], arr[i]] 1917 } 1918 return arr 1919 } 1920} 1921 1922document.addEventListener("DOMContentLoaded", () => { 1923 initNumberOdometer(); 1924}); 1925</script>
1925</div><div class="js w-embed"><style> 1926 [data-odometer-element] { 1927 display: inline-flex; 1928 align-items: center; 1929} 1930[data-odometer-part="mask"] { 1931 display: inline-block; 1932 overflow: clip; 1933 padding: 0.05em; 1934 margin: -0.05em; 1935 width: 0.63em; 1936 text-align: center; 1937} 1938[data-odometer-part="static"] { 1939 display: inline-block; 1940 overflow: clip; 1941 padding: 0.05em; 1942 margin: -0.05em; 1943} 1944[data-odometer-part="roller"] { 1945 display: block; 1946 white-space: pre; 1947 text-align: center; 1948 will-change: transform; 1949} 1950</style></div></div><div class="js w-embed w-script">
1950<script> 1951document.addEventListener('DOMContentLoaded', function () { 1952 var TOTAL_LOTTIES = 3; 1953 var POLL_DELAY = 150; 1954 var SKIP_DELAY = 3000; 1955 var FALLBACK_DURATION = 4000; 1956 1957 function findLottieInstance(el) { 1958 var lib; 1959 try { 1960 lib = window.Webflow && window.Webflow.require('lottie').lottie; 1961 } catch (e) { 1962 return null; 1963 } 1964 if (!lib) return null; 1965 var instances = lib.getRegisteredAnimations(); 1966 for (var i = 0; i < instances.length; i++) { 1967 if (el.contains(instances[i].wrapper)) return instances[i]; 1968 } 1969 return null; 1970 } 1971 1972 function setupSingle(el) { 1973 el.style.opacity = '1'; 1974 var anim = null; 1975 var poll = null; 1976 1977 function whenReady(callback) { 1978 if (anim) { 1979 callback(anim); 1980 return; 1981 } 1982 if (poll) return; 1983 poll = setInterval(function () { 1984 anim = findLottieInstance(el); 1985 if (!anim) return; 1986 clearInterval(poll); 1987 poll = null; 1988 callback(anim); 1989 }, POLL_DELAY); 1990 } 1991 1992 new IntersectionObserver( 1993 function (entries) { 1994 entries.forEach(function (entry) { 1995 if (entry.isIntersecting) { 1996 whenReady(function (instance) { 1997 instance.play(); 1998 }); 1999 } else if (anim) { 2000 anim.pause(); 2001 } 2002 }); 2003 }, 2004 { threshold: 0 } 2005 ).observe(el); 2006 } 2007 2008 function setupSequence(wrapper, slots) { 2009 var current = 0; 2010 var visible = false; 2011 var waiting = false; 2012 var token = 0; 2013 var timer = null; 2014 var poll = null; 2015 2016 function paint() { 2017 slots.forEach(function (slot, i) { 2018 slot.el.style.opacity = i === current ? '1' : '0'; 2019 }); 2020 } 2021 2022 function stopTimer() { 2023 if (timer) { 2024 clearTimeout(timer); 2025 timer = null; 2026 } 2027 } 2028 2029 function stopPolling() { 2030 if (poll) { 2031 clearInterval(poll); 2032 poll = null; 2033 } 2034 } 2035 2036 function staticValue(prop, fallback) { 2037 var raw = prop && prop.k; 2038 if (typeof raw === 'undefined') return fallback; 2039 if (Array.isArray(raw) && raw.length && typeof raw[0] === 'object') { 2040 return raw[0].s || fallback; 2041 } 2042 return raw; 2043 } 2044 2045 function rootLayer(data) { 2046 for (var i = 0; i < data.layers.length; i++) { 2047 var parent = data.layers[i].parent; 2048 if (parent === undefined || parent === null) return data.layers[i]; 2049 } 2050 return null; 2051 } 2052 2053 function collectVertices(shapes, out) { 2054 shapes.forEach(function (shape) { 2055 if (shape.ty === 'gr') { 2056 var items = shape.it || []; 2057 var transform = null; 2058 var nested = []; 2059 2060 items.forEach(function (item) { 2061 if (item.ty === 'tr') transform = item; 2062 }); 2063 2064 collectVertices( 2065 items.filter(function (item) { 2066 return item.ty !== 'tr'; 2067 }), 2068 nested 2069 ); 2070 2071 if (transform) { 2072 var p = staticValue(transform.p, [0, 0]); 2073 var a = staticValue(transform.a, [0, 0]); 2074 var s = staticValue(transform.s, [100, 100]); 2075 nested = nested.map(function (point) { 2076 return [ 2077 p[0] + (s[0] / 100) * (point[0] - a[0]), 2078 p[1] + (s[1] / 100) * (point[1] - a[1]), 2079 ]; 2080 }); 2081 } 2082 2083 out.push.apply(out, nested); 2084 } else if (shape.ty === 'sh') { 2085 var path = staticValue(shape.ks, null); 2086 if (Array.isArray(path)) path = path[0]; 2087 if (path && path.v) { 2088 path.v.forEach(function (point) { 2089 out.push([point[0], point[1]]); 2090 }); 2091 } 2092 } 2093 }); 2094 } 2095 2096 // O logo "jim" e o unico desenho comum as tres composicoes, entao a caixa 2097 // dele em coordenadas da composicao serve de referencia de alinhamento. As 2098 // letras sao as camadas numeradas; as marcadas com td sao apenas matte. 2099 function measureWordmark(anim) { 2100 var data = anim && anim.animationData; 2101 if (!data || !data.layers) return null; 2102 2103 var root = rootLayer(data); 2104 if (!root || !root.ks) return null; 2105 2106 var rootP = staticValue(root.ks.p, [0, 0]); 2107 var rootA = staticValue(root.ks.a, [0, 0]); 2108 var rootS = staticValue(root.ks.s, [100, 100]); 2109 var rootK = rootS[0] / 100; 2110 if (!rootK) return null; 2111 2112 var minX = Infinity; 2113 var minY = Infinity; 2114 var maxX = -Infinity; 2115 var maxY = -Infinity; 2116
2117 data.layers.forEach(function (layer) { 2118 if (layer.ty !== 4 || layer.td || layer.hd) return; 2119 if (layer.parent !== root.ind) return; 2120 if (!/^[0-9]+$/.test(String(layer.nm || ''))) return; 2121 2122 var p = staticValue(layer.ks.p, [0, 0]); 2123 var a = staticValue(layer.ks.a, [0, 0]); 2124 var s = staticValue(layer.ks.s, [100, 100]); 2125 var k = s[0] / 100; 2126 var points = []; 2127 collectVertices(layer.shapes || [], points); 2128 2129 points.forEach(function (point) { 2130 var x = rootP[0] + rootK * (p[0] + k * (point[0] - a[0]) - rootA[0]); 2131 var y = rootP[1] + rootK * (p[1] + k * (point[1] - a[1]) - rootA[1]); 2132 if (x < minX) minX = x; 2133 if (x > maxX) maxX = x; 2134 if (y < minY) minY = y; 2135 if (y > maxY) maxY = y; 2136 }); 2137 }); 2138 2139 if (!isFinite(minX) || maxX <= minX) return null; 2140 2141 return { 2142 w: data.w, 2143 h: data.h, 2144 width: maxX - minX, 2145 cx: (minX + maxX) / 2, 2146 cy: (minY + maxY) / 2, 2147 }; 2148 } 2149 2150 function frameOf(slot) { 2151 if (!slot.anim) return null; 2152 if (!slot.frame) slot.frame = measureWordmark(slot.anim); 2153 return slot.frame; 2154 } 2155 2156 // Cada arquivo entrega o logo com escala e posicao proprias. Reescrever o 2157 // viewBox a partir da caixa do logo deixa as tres do mesmo tamanho e no 2158 // mesmo lugar, sem mexer nos JSONs. 2159 function normalizeFraming() { 2160 var reference = frameOf(slots[0]); 2161 if (!reference) return; 2162 2163 slots.forEach(function (slot) { 2164 var frame = frameOf(slot); 2165 if (!frame) return; 2166 2167 var svg = slot.el.querySelector('svg'); 2168 if (!svg) return; 2169 2170 var ratio = frame.width / reference.width; 2171 var minX = frame.cx - ratio * reference.cx; 2172 var minY = frame.cy - ratio * reference.cy; 2173 2174 svg.setAttribute( 2175 'viewBox', 2176 minX + ' ' + minY + ' ' + reference.w * ratio + ' ' + reference.h * ratio 2177 ); 2178 }); 2179 } 2180 2181 function onFinish(index) { 2182 return function () { 2183 if (!visible || index !== current) return; 2184 advance(); 2185 }; 2186 } 2187 2188 function attach(slot, index) { 2189 var anim = findLottieInstance(slot.el); 2190 if (!anim) return false; 2191 slot.anim = anim; 2192 anim.loop = false; 2193 if (typeof anim.setLoop === 'function') anim.setLoop(false); 2194 anim.setDirection(1); 2195 anim.addEventListener('complete', onFinish(index)); 2196 anim.addEventListener('loopComplete', onFinish(index)); 2197 if (index !== current) anim.goToAndStop(0, true); 2198 return true; 2199 } 2200 2201 // O Webflow instancia as Lotties com lazy loading, so quando entram na 2202 // viewport, entao a busca pelas instancias precisa continuar enquanto 2203 // o stack estiver visivel. 2204 function startPolling() { 2205 if (poll) return; 2206 poll = setInterval(function () { 2207 var pending = false; 2208 slots.forEach(function (slot, i) { 2209 if (slot.anim) return; 2210 if (!attach(slot, i)) pending = true; 2211 }); 2212 normalizeFraming(); 2213 if (waiting && visible && slots[current].anim) { 2214 waiting = false; 2215 play(current); 2216 } 2217 if (!pending) stopPolling(); 2218 }, POLL_DELAY); 2219 } 2220 2221 function play(index) { 2222 stopTimer(); 2223 token += 1; 2224 var myToken = token; 2225 current = index; 2226 paint(); 2227 2228 var anim = slots[index].anim; 2229 2230 if (!anim) { 2231 waiting = true; 2232 startPolling(); 2233 timer = setTimeout(function () { 2234 if (myToken !== token || !visible) return; 2235 waiting = false; 2236 advance(); 2237 }, SKIP_DELAY); 2238 return; 2239 } 2240 2241 anim.loop = false; 2242 if (typeof anim.setLoop === 'function') anim.setLoop(false); 2243 anim.goToAndPlay(0, true); 2244 2245 var seconds = typeof anim.getDuration === 'function' ? anim.getDuration(false) : 0; 2246 var wait = seconds > 0 && isFinite(seconds) ? seconds * 1000 : FALLBACK_DURATION; 2247 timer = setTimeout(function () { 2248 if (myToken === token && visible) advance(); 2249 }, wait + 200); 2250 } 2251 2252 function advance() { 2253 play((current + 1) % slots.length); 2254 } 2255
2256 paint(); 2257 2258 new IntersectionObserver( 2259 function (entries) { 2260 entries.forEach(function (entry) { 2261 visible = entry.isIntersecting; 2262 if (visible) { 2263 startPolling(); 2264 play(current); 2265 return; 2266 } 2267 stopTimer(); 2268 stopPolling(); 2269 waiting = false; 2270 var anim = slots[current].anim; 2271 if (anim) anim.pause(); 2272 }); 2273 }, 2274 { threshold: 0 } 2275 ).observe(wrapper); 2276 2277 var resizeTimer = null; 2278 window.addEventListener('resize', function () { 2279 clearTimeout(resizeTimer); 2280 resizeTimer = setTimeout(normalizeFraming, 120); 2281 }); 2282 2283 return { slots: slots, normalize: normalizeFraming }; 2284 } 2285 2286 var registry = []; 2287 2288 document.querySelectorAll('[lottie-stack="wrapper"]').forEach(function (wrapper) { 2289 var slots = []; 2290 for (var i = 1; i <= TOTAL_LOTTIES; i++) { 2291 var el = wrapper.querySelector('[lottie-stack="' + i + '"]'); 2292 if (el) slots.push({ el: el, anim: null, frame: null }); 2293 } 2294 if (!slots.length) return; 2295 2296 if (slots.length === 1) { 2297 setupSingle(slots[0].el); 2298 return; 2299 } 2300 2301 registry.push(setupSequence(wrapper, slots)); 2302 }); 2303 2304 window.lottieStackDebug = function () { 2305 return registry.map(function (stack) { 2306 return stack.slots.map(function (slot, i) { 2307 var svg = slot.el.querySelector('svg'); 2308 return { 2309 slot: i + 1, 2310 loaded: !!slot.anim, 2311 seconds: slot.anim ? slot.anim.getDuration(false) : null, 2312 logoWidth: slot.frame ? Math.round(slot.frame.width) : null,
2313 viewBox: svg ? svg.getAttribute('viewBox') : null, 2314 opacity: slot.el.style.opacity, 2315 }; 2316 }); 2317 }); 2318 }; 2319}); 2320</script>
2320 2321</div><div class="css w-embed"><style> 2322[lottie-stack="wrapper"] { 2323 position: relative; 2324} 2325 2326[lottie-stack="1"], 2327[lottie-stack="2"], 2328[lottie-stack="3"] { 2329 position: absolute; 2330 inset: 0; 2331 opacity: 0; 2332 pointer-events: none; 2333} 2334</style></div></div><div data-nav-theme="" nav="component" class="nav_component"><div class="js w-embed w-script">
2334<script> 2335document.addEventListener('DOMContentLoaded', function () { 2336 const MOBILE_BREAKPOINT = 767; 2337 const SCROLL_THRESHOLD = 80; 2338 const LOAD_GRACE_PERIOD = 500; 2339 // fracao da viewport onde o meio da secao gatilho revela o botao sticky 2340 const REVEAL_ANCHOR = 0.5; 2341 const nav = document.querySelector("[nav='component']"); 2342 const spacer = document.querySelector("[button-sticky='spacer']"); 2343 const stickyButton = document.querySelector("[mobile-button-sticky]"); 2344 const revealTrigger = document.querySelector("[button-sticky='trigger']"); 2345 const hideTrigger = document.querySelector("[button-sticky='end']"); 2346 2347 let lastScrollY = window.scrollY; 2348 let justLoaded = true; 2349 2350 if (spacer && window.innerWidth <= MOBILE_BREAKPOINT) { 2351 spacer.classList.add('is-collapsed'); 2352 spacer.classList.add('is-scrolled'); 2353 } 2354 2355 function isButtonRevealed(scrollY) { 2356 // no fim da pagina o botao sai antes de encostar no elemento de saida 2357 if (hideTrigger && hideTrigger.getBoundingClientRect().top <= window.innerHeight) { 2358 return false; 2359 } 2360 // sem secao gatilho na pagina, mantem o comportamento antigo 2361 if (!revealTrigger) return scrollY > SCROLL_THRESHOLD; 2362 const rect = revealTrigger.getBoundingClientRect(); 2363 return rect.top + rect.height / 2 <= window.innerHeight * REVEAL_ANCHOR; 2364 } 2365 2366 function applyState(scrollY) { 2367 if (nav) nav.classList.toggle('is-scrolled', scrollY > SCROLL_THRESHOLD); 2368 if (stickyButton) stickyButton.classList.toggle('is-visible', isButtonRevealed(scrollY)); 2369 } 2370 2371 applyState(window.scrollY); 2372 2373 setTimeout(function () { 2374 justLoaded = false; 2375 }, LOAD_GRACE_PERIOD); 2376 2377 window.addEventListener('scroll', function () { 2378 const currentScrollY = window.scrollY; 2379 2380 if (justLoaded) { 2381 lastScrollY = currentScrollY; 2382 return; 2383 } 2384 2385 applyState(currentScrollY); 2386 2387 if (spacer && window.innerWidth <= MOBILE_BREAKPOINT) { 2388 if (currentScrollY > lastScrollY) { 2389 spacer.classList.add('is-scrolled'); 2390 } else if (currentScrollY < lastScrollY) { 2391 spacer.classList.remove('is-scrolled'); 2392 } 2393 } 2394 2395 lastScrollY = currentScrollY; 2396 }); 2397 2398 window.addEventListener('resize', function () { 2399 applyState(window.scrollY); 2400 }); 2401}); 2402</script>
2402</div><div class="u-embed-js w-embed w-script">
2402<script> 2403function centerDropdowns() { 2404 const dropdowns = document.querySelectorAll('.nav_dropdown_main_content.is-desktop'); 2405 2406 const updates = []; 2407 2408 dropdowns.forEach(function(el) { 2409 const component = el.closest('.nav_dropdown_component'); 2410 const link = component ? component.querySelector('.nav_links_link') : null; 2411 if (!link) return; 2412 2413 const offsetParent = el.offsetParent || component; 2414 const linkRect = link.getBoundingClientRect(); 2415 const parentRect = offsetParent.getBoundingClientRect(); 2416 const centerX = linkRect.left + linkRect.width / 2 - parentRect.left; 2417 2418 updates.push({ el: el, centerX: centerX }); 2419 }); 2420 2421 updates.forEach(function(update) { 2422 update.el.style.left = update.centerX + 'px'; 2423 update.el.style.transform = 'translateX(-50%)'; 2424 }); 2425} 2426 2427document.addEventListener('DOMContentLoaded', centerDropdowns); 2428 2429let resizeTimer; 2430window.addEventListener('resize', function() { 2431 clearTimeout(resizeTimer); 2432 resizeTimer = setTimeout(centerDropdowns, 100); 2433}); 2434</script>
2434</div><div class="u-embed-css w-embed"><style> 2435:root { 2436 --nav--menu-open-duration: 300ms; 2437 --nav--menu-close-duration: 300ms; 2438 --nav--dropdown-open-duration: 300ms; 2439 --nav--dropdown-close-duration: 300ms; 2440} 2441body:has(.nav_component .w-nav-button.w--open):not(:has(.nav_desktop_wrap:not(.w-condition-invisible))) { overflow: hidden; } 2442/* on smaller screens */ 2443@media (width < 65em) { 2444 /* disable scroll when mobile menu is open */ 2445 body:has(.nav_component .w-nav-button.w--open) { overflow: hidden; } 2446 .nav_bar_bg { display: none; } 2447} 2448/* on larger screens */ 2449@container (min-width: 65em) { 2450 /* show desktop nav & dropdown backdrop */ 2451 .nav_desktop_wrap, .nav_dropdown_backdrop { display: block; } 2452 /* hide mobile nav & mobile menu backdrop */ 2453 .nav_desktop_wrap:not(.w-condition-invisible) ~ .nav_mobile_wrap, .nav_desktop_wrap:not(.w-condition-invisible) ~ .nav_menu_backdrop { display: none; } 2454} 2455/* dropdown list: initial state */ 2456html:not(.wf-design-mode) .nav_dropdown_component > .w-dropdown-list { 2457 display: grid !important; 2458 grid-template-columns: minmax(0, 1fr); 2459 grid-template-rows: 0fr; 2460 transition: grid-template-rows var(--nav--dropdown-close-duration); 2461 visibility: hidden; 2462 opacity: 0; 2463} 2464html:not(.wf-design-mode) .nav_dropdown_component > .w-dropdown-list.w--open { 2465 visibility: visible; 2466 opacity: 1; 2467} 2468.nav_dropdown_component > .w-dropdown-list > * { 2469 overflow: hidden; 2470} 2471.nav_dropdown_component:has(> .w-dropdown-toggle[aria-expanded="true"]) > .w-dropdown-list { 2472 --nav--dropdown-close-duration: var(--nav--dropdown-open-duration); 2473 grid-template-rows: 1fr; 2474} 2475.nav_desktop_wrap:has(.nav_dropdown_component > .w-dropdown-toggle.w--open[aria-expanded="false"]) .nav_dropdown_component:has(> .w--open[aria-expanded="true"]) > .w-dropdown-list { 2476 transition-delay: var(--nav--dropdown-close-duration); 2477} 2478.nav_dropdown_backdrop { 2479 transition: opacity var(--nav--dropdown-close-duration); 2480} 2481.nav_component:has(.nav_dropdown_component > [aria-expanded="true"]) .nav_dropdown_backdrop { 2482 opacity: 1; 2483} 2484.nav_menu_backdrop { 2485 transition: opacity var(--nav--menu-close-duration); 2486} 2487.nav_component:has(.w-nav-button.w--open) .nav_menu_backdrop { 2488 opacity: 1; 2489} 2490@keyframes menuOpen { 2491 from { clip-path: polygon(0 0, 100% 0, 100% 0, 0 0); } 2492 to { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); } 2493} 2494@keyframes menuClose { 2495 from { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); } 2496 to { clip-path: polygon(0 0, 100% 0, 100% 0, 0 0); } 2497} 2498.nav_component:has(.w-nav-button.w--open) .w-nav-menu { 2499 animation: menuOpen var(--nav--menu-open-duration) ease-in-out forwards; 2500} 2501.nav_component:has(.w-nav-button:not(.w--open)) .w-nav-menu { 2502 animation: menuClose var(--nav--menu-close-duration) ease-in-out forwards; 2503} 2504.nav_component .w-nav-overlay { 2505 top: 0; 2506 min-height: 100vh; 2507} 2508.nav_mobile_wrap [data-open-on-mobile] > .w-dropdown-toggle { 2509 display: none; 2510} 2511.nav_mobile_wrap [data-open-on-mobile] > .w-dropdown-list { 2512 visibility: visible !important; 2513 opacity: 1 !important; 2514 display: block !important; 2515 grid-template-rows: 1fr !important; 2516} 2517html:has(.nav_banner_wrap:not(.w-condition-invisible)):not(.hide-nav-banner) { 2518 --nav--height-total: calc(var(--nav--banner-height) + var(--nav--height) + var(--nav--spacing-outer-vertical)); 2519} 2520.hide-nav-banner .nav_banner_wrap { 2521 display: none; 2522} 2523.wf-design-mode .nav_mobile_menu_wrap { 2524 width: 100%; 2525} 2526.nav_component { 2527 transition: background-color 0.3s ease, transform 0.8s ease; 2528} 2529.nav_component.is-scrolled, 2530.nav_component:has(.w-nav-button.w--open) { 2531 color: var(--base-color-brand--jim-maroon); 2532 background-color: white; 2533} 2534.nav_links_link.is-desktop { 2535 transition: color 0.3s ease, background-color 0.3s ease !important; 2536} 2537.nav_button_wrap { --nav--button-open: 0; } 2538.nav_button_wrap.w--open { --nav--button-open: 1; } 2539.nav_button_line.is-1 { 2540 transform: translateY(calc((1px * 0.5 + 0.5625rem * 0.5) * var(--nav--button-open, 0))) rotate(calc(-45deg * var(--nav--button-open, 0))); 2541} 2542.nav_button_line.is-2 { 2543 transform: translateY(calc((1px * -0.5 + 0.5625rem * -0.5) * var(--nav--button-open, 0))) rotate(calc(45deg * var(--nav--button-open, 0))); 2544} 2545.nav_button_line.is-center { opacity: calc(1 - var(--nav--button-open, 0)); } 2546.nav_mobile_layout { transition: color var(--nav--menu-close-duration); } 2547.nav_component:has(.w-nav-button.w--open) .nav_mobile_layout { 2548 --nav--menu-close-duration: var(--nav--menu-open-duration); 2549 color: var(--base-color-brand--jim-maroon); 2550} 2551.nav_dropdown_list .nav_dropdown_item:last-child { border-bottom: none; } 2552.nav_links_svg { transition: transform 0.3s ease; } 2553.nav_dropdown_component:has(>
2553 .w-dropdown-toggle[aria-expanded="true"]) .nav_links_svg { transform: rotate(180deg); } 2554[mobile-button-sticky] { opacity: 0; pointer-events: none; transition: opacity 0.35s ease; } 2555[mobile-button-sticky].is-visible { opacity: 1; pointer-events: none; } 2556[mobile-button-sticky]:not(.is-visible) .mobile_sticky_inner { pointer-events: none; } 2557[data-theme="dark"] { 2558 background-color: var(--_rb_jim---color--background--background-secondary, #1a0000); 2559 color: var(--_rb_jim---color--text--text-secondary, #ffffff); 2560} 2561[data-theme="maroon"] { 2562 background-color: var(--_rb_jim---color--neutral--color-maroon-50, #f5f3f3); 2563 color: var(--_rb_jim---color--text--text-primary, #1a0000); 2564} 2565[data-theme="dark"] .marquee_text_inner { 2566 border-right-color: rgba(255, 255, 255, 0.12); 2567 background-color: var(--_rb_jim---color--background--background-secondary, #1a0000); 2568} 2569[data-theme="dark"] [marquee="gradient"] { 2570 background-image: linear-gradient(90deg, #1a0000 0%, rgba(26, 0, 0, 0) 100%); 2571} 2572</style> 2573 2574<style> 2575 /* Prop Theme = light â páginas com fundo claro. 2576 Estado inicial = mesmo visual do scrolled (fill branco + texto maroon). 2577 Scroll e menu aberto continuam usando as regras .is-scrolled / :has(.w--open). */ 2578 .nav_component[data-nav-theme='light'] { 2579 color: var(--base-color-brand--jim-maroon); 2580 background-color: white; 2581 } 2582</style></div><a href="#main" class="nav_skip_wrap w-inline-block"><div class="nav_skip_text u-text-style-small">Skip to main content</div></a><header class="nav_desktop_wrap"><div class="nav_desktop_contain"><div class="nav_desktop_layout"><a href="/" aria-label="Home Page" class="nav_desktop_logo w-inline-block"><div class="u-icon w-embed"><svg width="92" height="40" viewBox="0 0 92 40" fill="none" xmlns="http://www.w3.org/2000/svg"> 2583<path d="M87.3957 18.9077C85.5881 19.3147 83.6397 19.9332 81.6823 20.7427C82.6141 17.9475 83.9838 15.1747 85.9679 13.144C86.7679 12.3255 86.4997 10.9537 85.4563 10.4927L83.709 9.72137C82.5269 9.19965 81.1729 9.25138 80.0289 9.85405C74.3289 12.8584 69.411 16.8006 65.3265 21.4781C65.9208 18.4422 66.8749 15.3883 68.1753 13.0946C68.6535 12.249 68.3094 11.1741 67.4223 10.7828L65.2751 9.83606C63.9478 9.25138 62.415 9.38405 61.2129 10.1981C56.8335 13.162 52.7981 16.8725 49.2298 21.5905C49.518 18.4624 50.2017 15.3119 51.3413 13.0856C51.7703 12.2468 51.4128 11.2213 50.557 10.8413L48.7092 10.0205C47.2858 9.38855 45.6257 9.84281 44.7006 11.1021C41.8026 15.0465 38.3817 18.6199 34.5519 21.8964C35.4725 18.7728 35.9686 15.3951 36.2188 12.5683C36.2702 11.9927 35.9484 11.4507 35.4234 11.2191L32.5119 9.92826C31.1891 9.34133 29.6496 9.62243 28.6084 10.6299C26.3584 12.8045 23.8201 14.5968 21.2103 16.2024C21.7376 15.0308 22.2426 13.8727 22.7252 12.7348C22.9889 12.1118 22.7073 11.39 22.0906 11.1179L19.568 9.99798C18.1961 9.38855 16.6029 9.65841 15.4924 10.6704C12.4492 13.4454 7.15584 16.5442 1.24805 18.7098C0.77436 18.883 0.756485 19.5486 1.21901 19.7443L3.39979 20.6708C3.85338 20.8642 4.35835 20.9001 4.83652 20.7697C7.48876 20.0456 10.6817 18.811 13.6379 17.3088C12.8022 18.8717 11.9174 20.4504 10.9901 22.0245C5.33032 25.409 0.781063 29.1802 0.016895 35.8029C-0.11717 36.961 0.557622 38.0584 1.65025 38.4407L5.71017 39.862C6.738 40.2218 7.88202 39.862 8.51436 38.9715C11.2046 35.171 13.7518 30.9478 16.0734 26.6346C20.2986 22.8431 25.259 19.4924 29.1044 15.7347C28.2889 18.8043 27.0421 21.8199 25.297 24.2171C24.6714 25.0761 25.0378 26.295 26.0366 26.6436L30.7445 28.2919C31.1735 28.4426 31.6472 28.3999 32.0382 28.1705C35.8032 25.9487 39.3514 23.0612 42.7343 19.6655C42.245 21.4871 41.892 23.2299 41.7691 24.6466C41.7065 25.3662 42.1355 26.0341 42.8148 26.2725L47.9763 28.0783C48.689 28.3279 49.4778 28.0288 49.8487 27.3654C51.7301 24.0035 54.8337 21.0598 58.5987 18.296C57.9864 20.5583 57.5909 22.8139 57.3854 24.7186C57.3072 25.4427 57.7406 26.1241 58.4221 26.3647L63.5188 28.1682C64.1467 28.3909 64.8483 28.193 65.2594 27.6668C67.6882 24.5477 71.0756 21.7884 75.0864 19.1191C74.2395 21.0935 73.5737 23.0275 73.1603 24.6354C72.9547 25.4337 73.3949 26.2545 74.1703 26.5199L79.0189 28.1817C79.5976 28.3796 80.2389 28.2245 80.6568 27.7769C83.0342 25.2156 87.6706 22.4203 91.5115 20.9406C92.0746 20.7247 92.0858 19.9264 91.5294 19.6903L90.2692 19.1551C89.362 18.7705 88.3565 18.6873 87.3957 18.9032V18.9077Z" fill="currentColor"/> 2584<path d="M25.4065 0.555289L20.969 0.00658332C20.4886 -0.0518854 20.0484 0.285434 19.9769 0.766676C19.6909 2.71863 19.2619 4.48843 18.6966 6.0491C18.5312 6.50335 18.7457 7.00933 19.1904 7.19373L23.3196 8.91856C23.7866 9.1142 24.3228 8.88258 24.4993 8.40583C25.2568 6.36393 25.8199 4.07465 26.1796 1.57849C26.2511 1.07926 25.9025 0.613758 25.4043 0.553041L25.4065 0.555289Z" fill="currentColor"/> 2585<path d="M38.5068 0.555289L34.0693 0.00658332C33.5889 -0.0518854 33.1487 0.285434 33.0772 0.766676C32.7912 2.71863 32.3622 4.48843 31.7969 6.0491C31.6316 6.50335 31.8461 7.00933 32.2907 7.19373L36.4199 8.91856C36.8869 9.1142 37.4232 8.88258 37.5997 8.40583C38.3571 6.36393 38.9202 4.07465 39.2799 1.57849C39.3514 1.07926 39.0029 0.613758 38.5046 0.553041L38.5068 0.555289Z" fill="currentColor"/> 2586</svg> 2587</div></a><nav aria-label="Main" class="nav_links_component desktop">
2587<ul role="list" class="nav_links_wrap is-desktop w-list-unstyled"><li class="nav_links_item is-desktop"><div data-delay="400" data-hover="true" class="nav_dropdown_component is-desktop w-dropdown"><div data-state="expanded" class="nav_links_link is-desktop w-dropdown-toggle"><div class="text-size-secondary">Payments</div><div class="nav_links_svg is-desktop"><div class="u-icon w-embed"><svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 2588<path d="M6 7.7L3 4.7L3.7 4L6 6.3L8.3 4L9 4.7L6 7.7Z" fill="currentColor"/> 2589</svg> 2590</div></div></div><nav class="nav_dropdown_main_wrap is-desktop w-dropdown-list"><div class="nav_dropdown_main_content is-desktop"><div data-lenis-prevent="" class="nav_dropdown_main_scroll is-desktop"><ul role="list" class="nav_dropdown_list is-desktop"><li class="nav_dropdown_item is-desktop"><a href="/tap" class="nav_dropdown_link is-desktop w-inline-block"><div>Tap to Pay</div></a></li><li class="nav_dropdown_item is-desktop"><a href="/payment-link" class="nav_dropdown_link is-desktop w-inline-block"><div>Payment Links</div></a></li></ul></div></div></nav></div></li><li class="nav_links_item is-desktop"><div data-delay="400" data-hover="true" class="nav_dropdown_component is-desktop w-dropdown"><div data-state="expanded" class="nav_links_link is-desktop w-dropdown-toggle"><div class="text-size-secondary">Solutions</div><div class="nav_links_svg is-desktop"><div class="u-icon w-embed"><svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"> 2591<path d="M6 7.7L3 4.7L3.7 4L6 6.3L8.3 4L9 4.7L6 7.7Z" fill="currentColor"/> 2592</svg> 2593</div></div></div><nav class="nav_dropdown_main_wrap is-desktop w-dropdown-list"><div class="nav_dropdown_main_content is-desktop"><div data-lenis-prevent="" class="nav_dropdown_main_scroll is-desktop"><ul role="list" class="nav_dropdown_list is-desktop"><li class="nav_dropdown_item is-desktop"><a href="/booking" class="nav_dropdown_link is-desktop w-inline-block"><div>Booking</div></a></li><li class="nav_dropdown_item is-desktop"><a href="/website-builder" class="nav_dropdown_link is-desktop w-inline-block"><div>Website Builder</div></a></li><li class="nav_dropdown_item is-desktop"><a href="/jim-card" class="nav_dropdown_link is-desktop w-inline-block"><div>Jim Card</div></a></li><li class="nav_dropdown_item is-desktop"><a href="/calculator" class="nav_dropdown_link is-desktop w-inline-block"><div>Calculator</div></a></li><li class="nav_dropdown_item is-desktop"><a href="/materials" class="nav_dropdown_link is-desktop w-inline-block"><div>Materials</div></a></li></ul></div></div></nav></div></li><li class="nav_links_item is-desktop"><a href="/chat" class="nav_links_link is-desktop w-inline-block"><div class="text-size-secondary">Ask Jim</div></a></li><li class="nav_links_item is-desktop"><a href="/pricing" class="nav_links_link is-desktop w-inline-block"><div class="text-size-secondary">Pricing</div></a></li><li class="nav_links_item is-desktop"><a href="/blog" aria-current="page" class="nav_links_link is-desktop w-inline-block w--current"><div class="text-size-secondary">Blog</div></a></li></ul><ul role="list" class="nav_actions_wrap desktop-77 w-list-unstyled"><li class="nav_buttons_item desktop-110"><a data-button="trigger" href="https://onboarding.jim.com/login" class="rb_button small w-inline-block"><div class="cta_button small-2">Get Jim</div><div data-button="bg" class="button_bg small-3"><img loading="lazy" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a69042703b2d33049b13366_button-bg-main.svg" alt="This is a plain white button background with no text or meaningful visual content. Screen readers should skip it; the buttonâs label carries the meaning." class="rb_image small-4"/></div></a></li></ul></nav></div></div></header><div data-animation="default" data-collapse="all" data-duration="400" data-easing="ease" data-easing2="ease" role="banner" class="nav_mobile_wrap w-nav"><div class="nav_mobile_contain"><div class="nav_mobile_layout">
2593<a href="/" aria-label="Home Page" class="nav_mobile_logo w-inline-block"><div class="u-icon w-embed"><svg width="74" height="32" viewBox="0 0 74 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 2594<path d="M69.9166 15.1262C68.4705 15.4518 66.9117 15.9465 65.3459 16.5942C66.0913 14.358 67.187 12.1398 68.7744 10.5152C69.4143 9.86038 69.1998 8.76297 68.365 8.39417L66.9672 7.7771C66.0216 7.35972 64.9383 7.4011 64.0231 7.88324C59.4631 10.2868 55.5288 13.4405 52.2612 17.1825C52.7366 14.7538 53.4999 12.3107 54.5403 10.4757C54.9228 9.79922 54.6475 8.93928 53.9379 8.62625L52.2201 7.86885C51.1583 7.4011 49.932 7.50724 48.9703 8.15849C45.4668 10.5296 42.2385 13.498 39.3838 17.2724C39.6144 14.77 40.1614 12.2495 41.073 10.4685C41.4162 9.79742 41.1302 8.97706 40.4456 8.67302L38.9673 8.01637C37.8287 7.51084 36.5005 7.87425 35.7605 8.88171C33.4421 12.0372 30.7054 14.8959 27.6415 17.5171C28.378 15.0182 28.7748 12.3161 28.975 10.0547C29.0162 9.59413 28.7587 9.16056 28.3387 8.97526L26.0095 7.94261C24.9513 7.47306 23.7197 7.69794 22.8867 8.50391C21.0867 10.2436 19.0561 11.6774 16.9682 12.9619C17.3901 12.0246 17.7941 11.0981 18.1802 10.1878C18.3911 9.68948 18.1659 9.11198 17.6725 8.8943L15.6544 7.99838C14.5568 7.51084 13.2823 7.72673 12.3939 8.53629C9.95932 10.7563 5.72467 13.2354 0.998444 14.9678C0.619488 15.1064 0.605188 15.6389 0.975206 15.7954L2.71983 16.5366C3.0827 16.6913 3.48668 16.7201 3.86921 16.6158C5.99101 16.0365 8.54539 15.0488 10.9103 13.847C10.2418 15.0974 9.53389 16.3603 8.79207 17.6196C4.26426 20.3272 0.624851 23.3442 0.013516 28.6423C-0.0937357 29.5688 0.446098 30.4468 1.3202 30.7526L4.56814 31.8896C5.3904 32.1774 6.30561 31.8896 6.81148 31.1772C8.96367 28.1368 11.0015 24.7582 12.8587 21.3076C16.2389 18.2745 20.2072 15.5939 23.2836 12.5877C22.6311 15.0434 21.6337 17.4559 20.2376 19.3737C19.7371 20.0609 20.0303 21.036 20.8293 21.3148L24.5956 22.6335C24.9388 22.7541 25.3178 22.7199 25.6306 22.5364C28.6426 20.7589 31.4812 18.449 34.1875 15.7324C33.796 17.1897 33.5136 18.5839 33.4153 19.7173C33.3652 20.293 33.7084 20.8273 34.2518 21.018L38.381 22.4626C38.9512 22.6623 39.5822 22.4231 39.879 21.8923C41.3841 19.2028 43.8669 16.8478 46.8789 14.6368C46.3891 16.4467 46.0727 18.2511 45.9083 19.7749C45.8457 20.3542 46.1925 20.8993 46.7377 21.0918L50.8151 22.5346C51.3174 22.7127 51.8786 22.5544 52.2075 22.1334C54.1506 19.6381 56.8605 17.4307 60.0691 15.2953C59.3916 16.8748 58.8589 18.422 58.5282 19.7083C58.3638 20.347 58.7159 21.0036 59.3362 21.2159L63.2151 22.5454C63.6781 22.7037 64.1911 22.5796 64.5254 22.2216C66.4273 20.1725 70.1364 17.9363 73.2092 16.7525C73.6597 16.5798 73.6686 15.9411 73.2235 15.7522L72.2153 15.3241C71.4896 15.0164 70.6852 14.9499 69.9166 15.1226V15.1262Z" fill="currentColor"/> 2595<path d="M20.3252 0.444231L16.7752 0.00526665C16.3908 -0.0415083 16.0387 0.228347 15.9815 0.613341C15.7527 2.1749 15.4095 3.59075 14.9573 4.83928C14.825 5.20268 14.9966 5.60746 15.3523 5.75499L18.6556 7.13485C19.0292 7.29136 19.4582 7.10606 19.5995 6.72467C20.2054 5.09114 20.6559 3.25972 20.9437 1.26279C21.0009 0.863407 20.722 0.491006 20.3234 0.442432L20.3252 0.444231Z" fill="currentColor"/> 2596<path d="M30.8055 0.444231L27.2554 0.00526665C26.8711 -0.0415083 26.519 0.228347 26.4618 0.613341C26.233 2.1749 25.8898 3.59075 25.4375 4.83928C25.3053 5.20268 25.4769 5.60746 25.8326 5.75499L29.1359 7.13485C29.5095 7.29136 29.9385 7.10606 30.0797 6.72467C30.6857 5.09114 31.1362 3.25972 31.424 1.26279C31.4812 0.863407 31.2023 0.491006 30.8037 0.442432L30.8055 0.444231Z" fill="currentColor"/> 2597</svg> 2598</div></a><nav role="navigation" class="nav_mobile_menu_wrap w-nav-menu"><div data-lenis-prevent="" class="nav_mobile_menu_scroll"><nav aria-label="Main" class="nav_links_component desktop-111"><ul role="list" class="nav_links_wrap desktop-112 w-list-unstyled"><li class="nav_links_item desktop-146"><div data-delay="400" data-hover="false" class="nav_dropdown_component desktop-150 w-dropdown"><div data-state="expanded" class="nav_links_link desktop-151 w-dropdown-toggle"><div class="rb_heading-style-h6 desktop-152">Payments</div><div class="nav_links_svg desktop-153"><div class="u-icon w-embed"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 2599<path d="M12 15.4L6 9.4L7.4 8L12 12.6L16.6 8L18 9.4L12 15.4Z" fill="#1A0000"/> 2600</svg> 2601</div></div></div><nav class="nav_dropdown_main_wrap desktop-154 w-dropdown-list"><div class="nav_dropdown_main_content desktop-155"><div data-lenis-prevent="" class="nav_dropdown_main_scroll desktop-156"><ul role="list" class="nav_dropdown_list desktop-157 w-list-unstyled"><li class="nav_dropdown_item desktop-161"><a href="/tap" class="nav_dropdown_link desktop-162 w-inline-block"><div class="text-size-primary desktop-163">Tap to Pay</div></a></li><li class="nav_dropdown_item desktop-161"><a href="/payment-link" class="nav_dropdown_link desktop-162 w-inline-block"><div class="text-size-primary desktop-163">Payment Links</div></a></li></ul></div></div></nav></div></li><li class="nav_links_item desktop-146"><div data-delay="400" data-hover="false" class="nav_dropdown_component desktop-150 w-dropdown"><div data-state="expanded" class="nav_links_link desktop-151 w-dropdown-toggle">
2601<div class="rb_heading-style-h6 desktop-152">Solutions</div><div class="nav_links_svg desktop-153"><div class="u-icon w-embed"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 2602<path d="M12 15.4L6 9.4L7.4 8L12 12.6L16.6 8L18 9.4L12 15.4Z" fill="#1A0000"/> 2603</svg> 2604</div></div></div><nav class="nav_dropdown_main_wrap desktop-154 w-dropdown-list"><div class="nav_dropdown_main_content desktop-155"><div data-lenis-prevent="" class="nav_dropdown_main_scroll desktop-156"><ul role="list" class="nav_dropdown_list desktop-157 w-list-unstyled"><li class="nav_dropdown_item desktop-161"><a href="/booking" class="nav_dropdown_link desktop-162 w-inline-block"><div class="text-size-primary desktop-163">Booking</div></a></li><li class="nav_dropdown_item desktop-161"><a href="/website-builder" class="nav_dropdown_link desktop-162 w-inline-block"><div class="text-size-primary desktop-163">Website Builder</div></a></li><li class="nav_dropdown_item desktop-161"><a href="/jim-card" class="nav_dropdown_link desktop-162 w-inline-block"><div class="text-size-primary desktop-163">Jim Card</div></a></li><li class="nav_dropdown_item desktop-161"><a href="/calculator" class="nav_dropdown_link desktop-162 w-inline-block"><div class="text-size-primary desktop-163">Calculator</div></a></li><li class="nav_dropdown_item desktop-161"><a href="/materials" class="nav_dropdown_link desktop-162 w-inline-block"><div class="text-size-primary desktop-163">Materials</div></a></li></ul></div></div></nav></div></li><li class="nav_links_item desktop-146"><a href="/chat" class="nav_links_link desktop-151 w-inline-block"><div class="rb_heading-style-h6 desktop-152">Ask Jim</div></a></li><li class="nav_links_item desktop-146"><a href="/pricing" class="nav_links_link desktop-151 w-inline-block"><div class="rb_heading-style-h6 desktop-152">Pricing</div></a></li><li class="nav_links_item desktop-146 is-last desktop-149"><a href="/blog" aria-current="page" class="nav_links_link desktop-151 w-inline-block w--current"><div class="rb_heading-style-h6 desktop-152">Blog</div></a></li></ul><ul role="list" class="nav_actions_wrap desktop-164 w-list-unstyled"><li class="nav_buttons_item desktop-165"><a data-button="trigger" href="https://onboarding.jim.com/login" class="rb_button navbar w-inline-block u-text-button-center"><div class="cta_button navbar-2">Get Jim</div><div data-button="bg" class="button_bg navbar-3"><img loading="lazy" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a69042703b2d33049b13366_button-bg-main.svg" alt="This is a plain white button background with no text or meaningful visual content. Screen readers should skip it; the buttonâs label carries the meaning." class="rb_image navbar-4"/></div></a></li></ul></nav></div></nav><div data-state="open" class="nav_button_wrap w-nav-button"><div class="nav_button_layout"><div class="nav_button_line is-1"></div><div class="nav_button_line is-center"></div><div class="nav_button_line is-2"></div></div></div></div></div></div><div nav="backdrop" class="nav_dropdown_backdrop"></div><div class="nav_bar_bg"></div></div><main class="main"><section class="benfits_section u-theme-dark"><div class="rb_padding-global padding-section-large"><div class="rb_container-large"><div class="benefits_content is-hero"><h1 class="rb_heading-style-h2">The Jim Insider</h1><div class="blog_hero-wrapper"><div class="rb_main-blog-wrapper w-dyn-list"><div role="list" class="rb_main-blog-list w-dyn-items"><div role="listitem" class="rb_main-blog-item w-dyn-item"><div data-hover="scale" class="rb_main-blog-card"><div class="rb_main-blog-content"><div class="rb_blog-tags-row"><div class="blog_category u-white"><div class="text-size-tertiary">JIM</div></div><div class="blog_category"><p class="text-size-tertiary">Sep 17, 2026</p></div></div><div class="rb_main-blog-content-inner"><h2 class="rb_heading-style-h4">How to start a food truck business: a 9-step guide</h2><div class="text-opacity-60"><p class="text-size-medium">How to start a food truck business and avoid costly mistakes. Follow our 9-step guide to navigate permits, create your brand, and launch for profit.</p></div></div></div><div class="rb_main-blog-img-wrap"><div class="u-image-wrapper"><img classes=" " loading="lazy" alt="" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6a7f360b1e3636ef1868a7fa_6a7f35d90a601d764cd380f5_how-to-start-a-food-truck.webp" class="u-image"/></div></div><a href="/blog/how-to-start-a-food-truck" class="link-full w-inline-block"></a></div></div></div></div></div></div></div></div></section><div class="blog-inner_section"><div class="css w-embed"><style> 2605 /* Ratios alternados â mesmo padrão do [RB] [GLOBAL] Blog Section (swiper da home). 2606 Na inner page o wrapper é .rb_card-img-wrap em vez de [blog='image']. */ 2607 .blog-inner_section .rb_blog-item:nth-child(3n + 1) .rb_card-img-wrap { 2608 aspect-ratio: 1 / 1; 2609 } 2610 2611 .blog-inner_section .rb_blog-item:nth-child(3n + 2) .rb_card-img-wrap { 2612 aspect-ratio: 318 / 385; 2613 } 2614 2615 .blog-inner_section .rb_blog-item:nth-child(3n) .rb_card-img-wrap { 2616 aspect-ratio: 318 / 256; 2617 } 2618 2619 /* Mobile: todas as thumbs em 1:1 */ 2620 @media screen and (max-width: 767px) { 2621 .blog-inner_section .rb_blog-item .rb_card-img-wrap { 2622 aspect-ratio: 1 / 1; 2623 } 2624 } 2625 2626 /* Hero: hover de imagem vem do Global Styles ([data-hover='scale'] no .rb_main-blog-card) */ 2627</style></div><div class="rb_padding-global padding-section-medium"><div class="rb_container-large"><div class="blogs_content"><div class="blogs_top mobile-vertical"><div class="blogs_heading"><h2 class="rb_heading-style-h2">The latest</h2></div><div class="blogs_right"><div link="hover" class="link_wrapper"><div class="link_text_wrapper"><div class="rb_heading-style-h6">View all</div></div><div><div class="u-icon w-embed"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 2628<path d="M16.175 13H4V11H16.175L10.575 5.4L12 4L20 12L12 20L10.575 18.6L16.175 13Z" fill="#1A0000"/> 2629</svg> 2630</div></div><a href="/all-posts" class="link-full w-inline-block"></a></div></div></div><div data-swiper-group-blogs="" class="swiper-group"><div class="rb_blog-wrapper w-dyn-list"><div role="list" class="rb_blog-list w-dyn-items"><div role="listitem" class="rb_blog-item w-dyn-item"><div data-hover="scale" class="blog_card"><div class="rb_card-img-wrap"><div class="u-image-wrapper"><img classes=" " loading="lazy" alt="" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6abd0536eab845cc34442c7b_6aac25bfb73e6d648ddc80dd_Blog04.
2630webp" class="u-image"/></div></div><div class="blog_category u-white"><div class="text-size-tertiary">Flexible Options</div></div><div class="blog_text_wrapper"><h3 class="text-size-primary text-weight-normal">How to Make Money on Your Phone in 2026: 3 Real Routes</h3></div><a href="/blog/how-to-make-money-on-your-phone" class="link-full w-inline-block"></a></div></div><div role="listitem" class="rb_blog-item w-dyn-item"><div data-hover="scale" class="blog_card"><div class="rb_card-img-wrap"><div class="u-image-wrapper"><img classes=" " loading="lazy" alt="Payment interface showing Car Detailing $85, options Tap to Pay or Payment Link, with Charge $85 button." src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6a84ad5f573a47599c81e47d_6a7489fb221db92a09c64c2d_payment-link.webp" class="u-image"/></div></div><div class="blog_category u-white"><div class="text-size-tertiary">Instant Access</div></div><div class="blog_text_wrapper"><h3 class="text-size-primary text-weight-normal">Is Link Payment Safe? How to Pay and Get Paid Safely</h3></div><a href="/blog/is-link-payment-safe" class="link-full w-inline-block"></a></div></div><div role="listitem" class="rb_blog-item w-dyn-item"><div data-hover="scale" class="blog_card"><div class="rb_card-img-wrap"><div class="u-image-wrapper"><img classes=" " loading="lazy" alt="" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6a7f360b1e3636ef1868a7fa_6a7f35d90a601d764cd380f5_how-to-start-a-food-truck.webp" class="u-image"/></div></div><div class="blog_category u-white"><div class="text-size-tertiary">Ready to Grow</div></div><div class="blog_text_wrapper"><h3 class="text-size-primary text-weight-normal">How to start a food truck business: a 9-step guide</h3></div><a href="/blog/how-to-start-a-food-truck" class="link-full w-inline-block"></a></div></div><div role="listitem" class="rb_blog-item w-dyn-item"><div data-hover="scale" class="blog_card"><div class="rb_card-img-wrap"><div class="u-image-wrapper"><img classes=" " loading="lazy" alt="" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6aac26de10d81f31081b182e_Blog02.webp" sizes="100vw" srcset="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6aac26de10d81f31081b182e_Blog02-p-500.webp 500w, https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6aac26de10d81f31081b182e_Blog02-p-800.webp 800w, https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6aac26de10d81f31081b182e_Blog02-p-1080.webp 1080w, https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6aac26de10d81f31081b182e_Blog02.webp 1264w" class="u-image"/></div></div><div class="blog_category u-white"><div class="text-size-tertiary">Scaling Smart</div></div><div class="blog_text_wrapper"><h3 class="text-size-primary text-weight-normal">How to accept credit card payment without machine and get paid anywhere</h3></div><a href="/blog/how-to-accept-credit-card-payment-without-machine" class="link-full w-inline-block"></a></div></div></div></div></div></div></div></div></div><div class="cta_section u-theme-dark"><div class="css w-embed"><style> 2631 .cta_section.rb-cta-armed .rb_cta-img { 2632 opacity: 0; 2633 } 2634</style></div><div class="js w-embed w-script">
2634<script> 2635 (function () { 2636 "use strict"; 2637 2638 var root = document.currentScript 2639 ? document.currentScript.closest(".cta_section") 2640 : null; 2641 2642 if (!root) return; 2643 2644 var REDUZIDO = 2645 window.matchMedia && 2646 window.matchMedia("(prefers-reduced-motion: reduce)").matches; 2647 2648 /* esconde ainda na análise do HTML, antes das imagens serem criadas: sem 2649 isso elas piscam na posição final até o GSAP carregar. quem estiver sem 2650 JS nunca recebe a classe e continua vendo a seção inteira */ 2651 root.classList.add("rb-cta-armed"); 2652 2653 function revelar() { 2654 root.classList.remove("rb-cta-armed"); 2655 } 2656 2657 var tentativas = 0; 2658 2659 /* o embed é o primeiro filho da seção, então as imagens ainda não existem 2660 quando este script roda: sem esperar o DOM, a busca volta vazia */ 2661 if (document.readyState === "loading") { 2662 document.addEventListener("DOMContentLoaded", esperarGSAP); 2663 } else { 2664 esperarGSAP(); 2665 } 2666 2667 function esperarGSAP() { 2668 if (window.gsap && window.ScrollTrigger) return iniciar(); 2669 if (++tentativas > 60) return revelar(); 2670 setTimeout(esperarGSAP, 50); 2671 } 2672 2673 function paraDireita(el) { 2674 return /right_/.test(el.className); 2675 } 2676 2677 function iniciar() { 2678 var wrap = root.querySelector(".rb_cta-img-wrap"); 2679 var imgs = wrap 2680 ? Array.prototype.slice.call(wrap.querySelectorAll(".rb_cta-img")) 2681 : []; 2682 2683 if (!imgs.length) return revelar(); 2684 2685 /* cascata de cima para baixo em vez da ordem do HTML, que resolve um 2686 lado inteiro antes de tocar no outro */ 2687 imgs.sort(function (a, b) { 2688 return a.getBoundingClientRect().top - b.getBoundingClientRect().top; 2689 }); 2690 2691 if (REDUZIDO) { 2692 gsap.set(imgs, { opacity: 0 }); 2693 } else { 2694 /* estoura no lugar, sem deslocamento: com a escala saindo do zero um 2695 translate junto vira dois movimentos disputando o mesmo instante. 2696 a opacidade fica em 1 porque a escala já esconde tudo â um fade por 2697 cima só deixaria a imagem lavada enquanto ela cresce */ 2698 gsap.set(imgs, { 2699 opacity: 1, 2700 scale: 0, 2701 rotation: function (i, alvo) { 2702 return paraDireita(alvo) ? 15 : -15; 2703 }, 2704 willChange: "transform, opacity", 2705 force3D: true 2706 }); 2707 } 2708 2709 // o estado inicial agora está inline, então a classe já cumpriu o papel 2710 revelar(); 2711 2712 ScrollTrigger.create({ 2713 trigger: root, 2714 start: "top 70%", 2715 once: true, 2716 onEnter: function () { 2717 gsap.to(imgs, { 2718 opacity: 1, 2719 scale: 1, 2720 rotation: 0, 2721 duration: REDUZIDO ? 0.4 : 0.7, 2722 // o leve passo além de 1 é o que tira o ar de balão inflando 2723 ease: REDUZIDO ? "none" : "back.out(1.6)", 2724 stagger: REDUZIDO ? 0 : 0.08, 2725 clearProps: "willChange" 2726 }); 2727 } 2728 }); 2729 } 2730 })(); 2731</script>
2731 2732</div><div class="rb_padding-global"><div class="rb_container-large"><div class="rb_cta-component padding-section-large"><div class="rb_cta-content"><div class="text-wrap-balance"><h2 class="rb_heading-style-display">Sell and get paid in seconds with Jim</h2></div><a data-button="trigger" href="https://onboarding.jim.com/login" class="rb_button w-inline-block u-hide-mobile"><div button="icon" class="u-icon z-index-2 w-embed"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 2733<path d="M16.175 13H4V11H16.175L10.575 5.4L12 4L20 12L12 20L10.575 18.6L16.175 13Z" fill="#1A0000"/> 2734</svg> 2735</div><div class="cta_button">Get Jim</div><div data-button="bg" class="button_bg"><img loading="lazy" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a69042703b2d33049b13366_button-bg-main.svg" alt="This is a plain white button background with no text or meaningful visual content. Screen readers should skip it; the buttonâs label carries the meaning." class="rb_image"/></div></a></div></div></div></div><div class="rb_cta-img-wrap"><img loading="lazy" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a7480f703daeefa12c40d45_cta_img-1.png" alt="Barista in green apron holds pink and mango smoothies in clear cups with straws" class="rb_cta-img left_image1"/><img loading="lazy" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a70aeab2b4d1b6805c7a0f6_44560420e2b8b2352918bd85d202a394_img-2.webp" alt="Laughing fast-food worker holds phone showing $42.00 contactless payment to customer at drive-thru" class="rb_cta-img left_image2"/><img width="295" loading="lazy" alt="Woman in yellow sweatshirt dispenses frozen yogurt at topping bar in sunlit shop" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a70aeab42e18f5a186e62e6_ed7368d4aeeeeced368cf7e9a322f5f0_img-3.webp" class="rb_cta-img left_image3"/><img loading="lazy" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a70aeab4bcc6a69b521a41b_32772b133625637fb71ca76b74171f0c_img-4.webp" alt="Woman in orange work shirt unloads cardboard boxes from white delivery van on sunny street" class="rb_cta-img right_image1"/><img loading="lazy" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a70aeab9b444ee630f4921b_eb5fc9219a69b0940c4747b5472b34bc_img-5.webp" alt="Hairstylist Keisha trims client hair with scissors in busy sunlit salon" class="rb_cta-img right_image2"/><img loading="lazy" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/6a70aeab33ec04d31b2ddcc8_2c58af24c2e3c56f55ec790013f9ad7d_img-6.webp" alt="Pizza maker slides pizza into wood-fired brick oven in bright kitchen" class="rb_cta-img right_image3"/></div></div><div class="blog-inner_section"><div class="rb_padding-global padding-section-medium"><div class="rb_container-large"><div class="blogs_content"><div class="blogs_top"><div class="blogs_heading"><h2 class="rb_heading-style-h2">Empower growth</h2></div><div class="blogs_right"><div link="hover" class="link_wrapper"><div class="link_text_wrapper"><div class="rb_heading-style-h6">View all</div></div><div><div class="u-icon w-embed"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 2736<path d="M16.175 13H4V11H16.175L10.575 5.4L12 4L20 12L12 20L10.575 18.6L16.175 13Z" fill="#1A0000"/> 2737</svg> 2738</div></div><a href="https://www.jim.com/category/entrepreneurship" class="link-full w-inline-block"></a></div></div></div><div data-swiper-group-blogs="" class="swiper-group"><div class="rb_blog-wrapper w-dyn-list"><div role="list" class="rb_blog-list w-dyn-items"><div role="listitem" class="rb_blog-item w-dyn-item"><div data-hover="scale" class="blog_card"><div class="rb_card-img-wrap"><div class="u-image-wrapper"><img classes=" " alt="Is Cost of Goods Sold a Debit or Credit?" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6abd1e219d29440311fa3309_03963859-9251-4257-9861-a497b2824cac.webp" loading="lazy" class="u-image"/></div></div><div class="blog_category u-white"><div class="text-size-tertiary">Driving Growth</div></div><div class="blog_text_wrapper"><h3 class="text-size-primary text-weight-normal">Is Cost of Goods Sold a Debit or Credit? (With Examples)</h3></div><a href="/blog/is-cost-of-goods-sold-a-debit-or-a-credit" class="link-full w-inline-block"></a></div></div><div role="listitem" class="rb_blog-item w-dyn-item"><div data-hover="scale" class="blog_card"><div class="rb_card-img-wrap"><div class="u-image-wrapper"><img classes=" " alt="Young farmer arranging rainbow chard and heirloom tomatoes at her farmers market stall" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6abbee3362190794df627b54_6abbeb83b8958915cb339a37_how-to-become-a-farmers-market-vendor-thumb-v4.webp" loading="lazy" class="u-image"/></div></div><div class="blog_category u-white"><div class="text-size-tertiary">Ready to Grow</div></div><div class="blog_text_wrapper"><h3 class="text-size-primary text-weight-normal">
2738How to Become a Vendor at a Farmers Market in 7 Steps</h3></div><a href="/blog/how-to-become-a-farmers-market-vendor" class="link-full w-inline-block"></a></div></div><div role="listitem" class="rb_blog-item w-dyn-item"><div data-hover="scale" class="blog_card"><div class="rb_card-img-wrap"><div class="u-image-wrapper"><img classes=" " alt="Young street food vendor handing tacos to a customer from his sidewalk food cart" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6abbee1614bc93235b8f143c_6abbeb7f6fed61f9c2815f84_street-vendor-license-thumb-v4.webp" loading="lazy" class="u-image"/></div></div><div class="blog_category u-white"><div class="text-size-tertiary">Ready to Grow</div></div><div class="blog_text_wrapper"><h3 class="text-size-primary text-weight-normal">Street Vendor License: What You Need and How to Apply</h3></div><a href="/blog/street-vendor-license" class="link-full w-inline-block"></a></div></div><div role="listitem" class="rb_blog-item w-dyn-item"><div data-hover="scale" class="blog_card"><div class="rb_card-img-wrap"><div class="u-image-wrapper"><img classes=" " alt="Young vendor wrapping a handmade ceramic mug for a customer at her holiday market stall on Small Business Saturday" src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051466/6abbede45e4dbfba70a36587_6abbeb7b9a17c9a61e2577ec_small-business-saturday-thumb-v4.webp" loading="lazy" class="u-image"/></div></div><div class="blog_category u-white"><div class="text-size-tertiary">Ready to Grow</div></div><div class="blog_text_wrapper"><h3 class="text-size-primary text-weight-normal">Small Business Saturday 2026: A Prep Checklist for Solo Sellers</h3></div><a href="/blog/small-business-saturday" class="link-full w-inline-block"></a></div></div></div></div></div></div></div></div></div></main><aside data-wf--rb-global-footer-corner--variant="base" class="blog_corner_wrapper"><div class="blog_corner_inner"></div></aside><div button-sticky="end" class="footer-section u-theme-extra-light"><div class="rb_padding-global"><div class="rb_container-large"><div class="footer-content"><div class="footer_top"><div class="footer_heading"><h2 class="rb_heading-style-h2">Run your business solo, with a partner.</h2></div><div class="footer_bottom"><div class="footer_links"><div class="footer_column"><div class="text-size-secondary">Payments</div><a href="/tap" class="footer_link w-inline-block"><div class="text-size-secondary">Tap to Pay</div></a><a href="/payment-link" class="footer_link w-inline-block"><div class="text-size-secondary">Payment Links</div></a></div><div class="footer_column"><div class="text-size-secondary">Solutions</div><a href="/booking" class="footer_link w-inline-block"><div class="text-size-secondary">Booking</div></a><a href="/website-builder" class="footer_link w-inline-block"><div class="text-size-secondary">Website Builder</div></a><a href="/jim-card" class="footer_link w-inline-block"><div class="text-size-secondary">Jim Card</div></a><a href="/calculator" class="footer_link w-inline-block"><div class="text-size-secondary">Calculator</div></a><a href="/materials" class="footer_link w-inline-block"><div class="text-size-secondary">Materials</div></a></div><div class="footer_column"><a href="/chat" class="footer_link w-inline-block"><div class="text-size-secondary">Ask Jim</div></a><a href="/pricing" class="footer_link w-inline-block"><div class="text-size-secondary">Pricing</div></a><a href="/blog" aria-current="page" class="footer_link w-inline-block w--current"><div class="text-size-secondary">Blog</div></a><a href="/" class="footer_link w-inline-block"><div class="text-size-secondary">Selling with Jim</div></a></div><div class="footer_column"><a href="/behind-the-curtain" class="footer_link w-inline-block"><div class="text-size-secondary">Terms & Privacy</div></a><a href="https://www.jim.com/behind-the-curtain/privacy-agreements" class="footer_link w-inline-block"><div class="text-size-secondary">Data Protection Policy</div></a><a href="https://help.jim.com/en/" class="footer_link w-inline-block"><div class="text-size-secondary">Help center</div></a><a href="mailto:[email protected]?subject=Jim%20Support%20Request" class="footer_link w-inline-block"><div class="text-size-secondary">[email protected]</div></a></div></div><div class="footer_copy_wrapper"><div class="text-size-secondary u-op-60">Powered by CloudWalk, Inc.</div><div class="footer_legals hide"><a href="#" class="footer_link w-inline-block"><div class="text-size-secondary">Privacy</div></a><a href="#" class="footer_link w-inline-block"><div class="text-size-secondary">Terms</div></a><a href="#" class="footer_link w-inline-block"><div class="text-size-secondary">Data Protection Policy</div></a></div></div><div class="footer_social_wrapper"><div class="u-language-button"><div class="u-icon w-embed"><svg width="34" height="26" viewBox="0 0 34 26" fill="none" xmlns="http://www.w3.org/2000/svg"> 2739<g clip-path="url(#clip0_12144_14927)"> 2740<path d="M17 24.29C23.0751 24.29 28 19.3651 28 13.29C28 7.21491 23.0751 2.29004 17 2.29004M17 24.29C10.9249 24.29 6 19.3651 6 13.29C6 7.21491 10.9249 2.29004 17 2.29004M17 24.29C17 24.29 13 20.99 13 13.29C13 5.59004 17 2.29004 17 2.29004M17 24.29C17 24.29 21 20.99 21 13.29C21 5.59004 17 2.29004 17 2.29004M6 10.29H28M6 16.29H28" stroke="#1A0000" stroke-width="2"/> 2741</g> 2742<defs> 2743<clipPath id="clip0_12144_14927"> 2744<rect width="24" height="24" fill="white" transform="translate(5 1.29004)"/> 2745</clipPath> 2746</defs> 2747</svg> 2748</div><div class="text-size-secondary">United States (English)</div></div><div class="footer_social"><div class="u-social-link-wrapper"><a aria-label="Access Jim TikTok" href="https://www.tiktok.com/@jim" target="_blank" class="u-social-link w-inline-block"></a><div><div class="u-icon w-embed"><svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg"> 2749<g clip-path="url(#clip0_12144_14934)"> 2750<g clip-path="url(#clip1_12144_14934)"> 2751<g clip-path="url(#clip2_12144_14934)"> 2752<path d="M15.2961 4.40339C15.1759 4.34126 15.0588 4.27315 14.9454 4.19931C14.6156 3.98126 14.3132 3.7243
27526 14.0448 3.43411C13.3731 2.66556 13.1222 1.8859 13.0299 1.34002H13.0336C12.9564 0.886915 12.9883 0.59375 12.9931 0.59375H9.9338V12.4235C9.9338 12.5823 9.9338 12.7393 9.92713 12.8944C9.92713 12.9137 9.92527 12.9315 9.92416 12.9523C9.92416 12.9608 9.92416 12.9697 9.92231 12.9786C9.92231 12.9808 9.92231 12.9831 9.92231 12.9853C9.89005 13.4098 9.75399 13.8198 9.52608 14.1793C9.29818 14.5388 8.98541 14.8368 8.61532 15.0471C8.22957 15.2665 7.79331 15.3817 7.34951 15.3811C5.92413 15.3811 4.76893 14.2188 4.76893 12.7834C4.76893 11.3481 5.92413 10.1858 7.34951 10.1858C7.61934 10.1855 7.88748 10.228 8.14402 10.3116L8.14773 7.19663C7.36894 7.09602 6.57776 7.15792 5.82408 7.37839C5.07042 7.59888 4.3706 7.97316 3.76882 8.47763C3.24152 8.93579 2.79823 9.48245 2.45887 10.093C2.32973 10.3157 1.84248 11.2104 1.78348 12.6625C1.74637 13.4867 1.99389 14.3406 2.1119 14.6935V14.7009C2.18612 14.9087 2.47371 15.6179 2.94239 16.2157C3.32033 16.6952 3.76685 17.1165 4.26757 17.4659V17.4585L4.27501 17.4659C5.75603 18.4723 7.39813 18.4062 7.39813 18.4062C7.68239 18.3948 8.6346 18.4062 9.71599 17.8938C10.9154 17.3256 11.5982 16.4792 11.5982 16.4792C12.0344 15.9734 12.3812 15.397 12.6239 14.7747C12.9007 14.047 12.9931 13.1742 12.9931 12.8254V6.54944C13.0302 6.5717 13.5245 6.89864 13.5245 6.89864C13.5245 6.89864 14.2366 7.35509 15.3477 7.65232C16.1448 7.86384 17.2188 7.90837 17.2188 7.90837V4.87134C16.8425 4.91216 16.0784 4.79342 15.2961 4.40339Z" fill="#240A13"/> 2753</g> 2754</g> 2755</g> 2756<defs> 2757<clipPath id="clip0_12144_14934"> 2758<rect width="19" height="19" fill="white"/> 2759</clipPath> 2760<clipPath id="clip1_12144_14934"> 2761<rect width="19" height="19" fill="white"/> 2762</clipPath> 2763<clipPath id="clip2_12144_14934"> 2764<rect width="19" height="19" fill="white"/> 2765</clipPath> 2766</defs> 2767</svg> 2768</div></div></div><div class="u-social-link-wrapper"><a aria-label="Access Jim Instagram" href="https://www.instagram.com/chatwithjim" target="_blank" class="u-social-link w-inline-block"></a><div><div class="u-icon w-embed"><svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg"> 2769<g clip-path="url(#clip0_12144_14939)"> 2770<g clip-path="url(#clip1_12144_14939)"> 2771<path d="M16.6116 4.0625H9.38763C7.97563 4.06357 6.62181 4.62494 5.62338 5.62338C4.62494 6.62181 4.06357 7.97563 4.0625 9.38763V16.6116C4.06335 18.0237 4.62465 19.3777 5.62309 20.3763C6.62155 21.3749 7.9755 21.9364 9.38763 21.9375H16.6116C18.0236 21.9362 19.3774 21.3746 20.3758 20.3761C21.3742 19.3775 21.9356 18.0236 21.9367 16.6116V9.38763C21.936 7.9755 21.3748 6.62142 20.3763 5.62292C19.3778 4.62439 18.0237 4.06315 16.6116 4.0625ZM20.1394 16.6116C20.1392 17.5471 19.7675 18.4443 19.1059 19.1059C18.4444 19.7675 17.5471 20.1392 16.6116 20.1394H9.38763C8.92437 20.1394 8.46567 20.0482 8.03771 19.8709C7.60971 19.6936 7.22085 19.4337 6.89332 19.1061C6.56581 18.7785 6.30601 18.3896 6.12882 17.9615C5.95159 17.5336 5.86047 17.0748 5.86056 16.6116V9.38763C5.86047 8.9244 5.95163 8.46573 6.12882 8.03774C6.30604 7.60978 6.56585 7.22092 6.89338 6.89338C7.22092 6.56585 7.60978 6.30604 8.03774 6.12882C8.46573 5.95163 8.9244 5.86046 9.38763 5.86056H16.6116C17.5469 5.86079 18.4439 6.23246 19.1053 6.89387C19.7667 7.55527 20.1384 8.45224 20.1386 9.38763L20.1394 16.6116Z" fill="#240A13"/> 2772<path d="M13 8.37849C10.4504 8.37849 8.37849 10.4512 8.37849 13C8.37849 15.5488 10.4512 17.6215 13 17.6215C15.5488 17.6215 17.6215 15.5488 17.6215 13C17.6215 10.4512 15.5496 8.37849 13 8.37849ZM13 15.8234C12.2512 15.8235 11.533 15.5262 11.0034 14.9968C10.4738 14.4673 10.1763 13.7492 10.1761 13.0004C10.176 12.2516 10.4734 11.5334 11.0028 11.0038C11.5322 10.4742 12.2504 10.1766 12.9992 10.1766C13.748 10.1765 14.4662 10.4738 14.9958 11.0032C15.5253 11.5326 15.8229 12.2508 15.823 12.9996C15.8231 13.7484 15.5258 14.4666 14.9963 14.9962C14.4669 15.5258 13.7488 15.8233 13 15.8234ZM17.6312 7.30518C17.8502 7.30534 18.0642 7.3704 18.2462 7.49215C18.4282 7.61389 18.57 7.78686 18.6537 7.98917C18.7374 8.19152 18.7593 8.41411 18.7165 8.62887C18.6738 8.8436 18.5683 9.04087 18.4135 9.1957C18.2587 9.35053 18.0614 9.45596 17.8467 9.49873C17.6319 9.5415 17.4093 9.51963 17.207 9.43591C17.0047 9.35219 16.8317 9.21036 16.71 9.02839C16.5882 8.84639 16.5232 8.63238 16.523 8.41343C16.523 7.80243 16.9374 7.30518 17.6312 7.30518Z" fill="#240A13"/> 2773</g> 2774</g> 2775<defs> 2776<clipPath id="clip0_12144_14939"> 2777<rect width="26" height="26" fill="white"/> 2778</clipPath> 2779<clipPath id="clip1_12144_14939"> 2780<rect width="26" height="26" fill="white"/> 2781</clipPath> 2782</defs> 2783</svg> 2784</div></div></div><div class="u-social-link-wrapper"><a aria-label="Access Jim Youtube" href="https://www.youtube.com/@chatwithjim" target="_blank" class="u-social-link w-inline-block"></a><div><div class="u-icon w-embed"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 2785<g clip-path="url(#clip0_12144_14945)"> 2786<g clip-path="url(#clip1_12144_14945)"> 2787<g clip-path="url(#clip2_12144_14945)"> 2788<path d="M16.5547 2.97656H3.44533C3.44533 2.97656 0 2.97654 0 6.42186V13.5703C0 13.5703 7.62939e-07 17.0156 3.44533 17.0156H16.5547C16.5547 17.0156 20 17.0156 20 13.5703V6.42186C20 6.42186 20 2.97656 16.5547 2.97656ZM7.33593 13.8437V6.14841L13.8828 9.99999L7.33593 13.8437Z" fill="#240A13"/> 2789</g> 2790</g> 2791</g> 2792<defs> 2793<clipPath id="clip0_12144_14945"> 2794<rect width="20" height="20" fill="white"/> 2795</clipPath> 2796<clipPath id="clip1_12144_14945"> 2797<rect width="20" height="20" fill="white"/> 2798</clipPath> 2799<clipPath id="clip2_12144_14945"> 2800<rect width="20" height="20" fill="white"/> 2801</clipPath> 2802</defs> 2803</svg> 2804</div></div></div><div class="u-social-link-wrapper"><a aria-label="Access Jim Facebook" href="https://www.facebook.com/people/JIM/61559815860551/" target="_blank" class="u-social-link w-inline-block"></a><div><div class="u-icon w-embed"><svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"> 2805<g clip-path="url(#clip0_12144_14950)"> 2806<g clip-path="url(#clip1_12144_14950)"> 2807<path d="M19.2062 4.37935L16.3135 4.37585C13.5082 4.37585 11.6961 6.23435 11.6961 9.11398V11.2971H8.79375V15.2477H11.6961L11.6926 23.6259H15.7535L15.757 15.2477H19.0872L19.0846 11.298H15.757V9.4456C15.757 8.55485 15.9679 8.10423 17.1272 8.10423L19.1975 8.10335L19.2062 4.37935Z" fill="#240A13"/> 2808</g> 2809</g> 2810<defs> 2811<clipPath id="clip0_12144_14950"> 2812<rect width="28" height="28" fill="white"/> 2813</clipPath> 2814<clipPath id="clip1_12144_14950"> 2815<rect width="28" height="28" fill="white"/> 2816</clipPath> 2817</defs> 2818</svg> 2819</div></div></div><div class="u-social-link-wrapper"><a aria-label="Access Jim Threads" href="https://x.com/GetJIMnow" target="_blank" class="u-social-link w-inline-block"></a><div><div class="u-icon w-embed"><svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 2820<g clip-path="url(#clip0_12144_14955)"> 2821<g clip-path="url(#clip1_12144_14955)"> 2822<g clip-path="url(#clip2_12144_14955)"> 2823<path d="M-0.384002 0L7.67349 10.7735L-0.434784 19.5328H1.39021L8.48913 11.8637L14.2247 19.5328H20.4348L11.9237 8.15345L19.471 0H17.646L11.1084 7.06287L5.82609 0H-0.384002ZM2.29973 1.34414H5.15262L17.7507 18.1886H14.8978L2.29973 1.34414Z" fill="#1A0000"/> 2824</g> 2825</g> 2826</g> 2827<defs> 2828<clipPath id="clip0_12144_14955"> 2829<rect width="20" height="20" fill="white"/> 2830</clipPath> 2831<clipPath id="clip1_12144_14955"> 2832<rect width="20" height="20" fill="white"/> 2833</clipPath> 2834<clipPath id="clip2_12144_14955"> 2835<rect width="20.8696" height="20" fill="white" transform="translate(-0.434784)"/> 2836</clipPath> 2837</defs> 2838</svg> 2839</div></div></div></div></div><div class="footer_text_wrapper"><p class="text-size-tertiary u-op-60">jim.com is not a bank. jim.com is a financial technology company. Banking services are provided by Lead Bank, Member FDIC. The Jim.com Visa Prepaid Card (the âJ
2839imâ Card) is issued by Lead Bank pursuant to licensing by Visa® U.S.A. Inc. and is available to commercial entities in select industries. Fees and eligibility requirements apply. See Jim.com for more details. Funds held in the Jim.com Prepaid Card Account are held with Lead Bank, Member FDIC, and are insured up to $250,000 in the event Lead Bank fails and if specific deposit insurance requirements are met and your card is registered. FDIC insurance does not protect funds in the event of Jim.comâs failure or from the risk of theft or fraud. See FDIC Prepaid Cards and Deposit Insurance Coverage. See FDIC Prepaid Cards and Deposit Insurance Coverage. Instant settlements subject to terms. Fees and T&C apply. See Jim.com for more details.</p></div></div></div><div class="footer_video_wrapper"><div class="footer_video"><div class="footer_lottie_inner"><div lottie-stack="wrapper" class="lotties_stack"><div lottie-stack="1" class="lottie_item" data-w-id="750898c0-7c89-b7d6-a82f-63ce6bd6a400" data-animation-type="lottie" data-src="https://cdn.prod.website-files.com/6a4cad18edad9e1058b02d0c/6a5a47a3b1a73a84a5c48add_Jim_Logo-LookAround_Maroon.json" data-loop="0" data-direction="1" data-autoplay="1" data-is-ix2-target="0" data-renderer="svg" data-default-duration="0" data-duration="2.6666666666666665" data-loading="lazy"></div><div lottie-stack="2" class="lottie_item" data-w-id="750898c0-7c89-b7d6-a82f-63ce6bd6a401" data-animation-type="lottie" data-src="https://cdn.prod.website-files.com/6a4cad18edad9e1058b02d0c/6a5a47a3b3f5f2061f69a049_Jim_Logo-Love_Maroon.json" data-loop="1" data-direction="1" data-autoplay="1" data-is-ix2-target="0" data-renderer="svg" data-default-duration="0" data-duration="4.333333333333333" data-loading="lazy"></div><div lottie-stack="3" class="lottie_item" data-w-id="750898c0-7c89-b7d6-a82f-63ce6bd6a402" data-animation-type="lottie" data-src="https://cdn.prod.website-files.com/6a4cad18edad9e1058b02d0c/6a5a47a39dedb12276828055_JIM_Logo-Angry_Maroon.json" data-loop="0" data-direction="1" data-autoplay="1" data-is-ix2-target="0" data-renderer="svg" data-default-duration="0" data-duration="3.566666666666667" data-loading="lazy"></div></div></div></div></div></div></div></div></div></div>
2839<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=65fc1fa2c1e7707c3f051403" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
2839<script src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/js/jim-page.schunk.4af75a3dcc103563.js" type="text/javascript" integrity="sha384-uHxK7OkjtK+CcSL+rHWk+cmafP3nhlxH8gPcAzqBwInsfkNcuGpgT4VrVHoX9Xx0" crossorigin="anonymous"></script>
2839<script src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/js/jim-page.schunk.cab433597726e409.js" type="text/javascript" integrity="sha384-wZO+2UXoZX2OuA5KjUBlLHGYPu+XsDS5H6vOuInr1UWgEhakQj2ZYWTxByj5zD56" crossorigin="anonymous"></script>
2839<script src="https://cdn.prod.website-files.com/65fc1fa2c1e7707c3f051403/js/jim-page.ca2433cb.d308288248e8e7b8.js" type="text/javascript" integrity="sha384-BCXGIoFsGlSYEETrdt+ALLWaphj7PbfNbR1xGYcqHIorAbZsEV/1U7Tvvg+FJGnQ" crossorigin="anonymous"></script>
2839<script src="https://cdn.prod.website-files.com/gsap/3.15.0/gsap.min.js" type="text/javascript"></script>
2839<script src="https://cdn.prod.website-files.com/gsap/3.15.0/ScrollToPlugin.min.js" type="text/javascript"></script>
2839<script src="https://cdn.prod.website-files.com/gsap/3.15.0/SplitText.min.js" type="text/javascript"></script>
2839<script src="https://cdn.prod.website-files.com/gsap/3.15.0/ScrollTrigger.min.js" type="text/javascript"></script>
2839<script src="https://cdn.prod.website-files.com/gsap/3.15.0/Flip.min.js" type="text/javascript"></script>
2839<script src="https://cdn.prod.website-files.com/gsap/3.15.0/Draggable.min.js" type="text/javascript"></script>
2839<script src="https://cdn.prod.website-files.com/gsap/3.15.0/InertiaPlugin.min.js" type="text/javascript"></script>
2839<script src="https://cdn.prod.website-files.com/gsap/3.15.0/CustomEase.min.js" type="text/javascript"></script>
2839<script type="text/javascript">gsap.registerPlugin(ScrollToPlugin,SplitText,ScrollTrigger,Flip,Draggable,InertiaPlugin,CustomEase);</script>
2839<!-- Search Params Data -->
2840<script> 2841 const saveQueryParams = () => { 2842 const setCookie = (name, value) => { 2843 const datePlus = (qtd, type, date) => { 2844 if (!type) { 2845 type = "d"; 2846 } 2847 if (!date) { 2848 date = new Date(); 2849 } 2850 const increase = { 2851 d: 0, 2852 m: 0, 2853 y: 0, 2854 }; 2855 increase[type] = qtd; 2856 return new Date( 2857 date.getFullYear() + increase.y, 2858 date.getMonth() + increase.m, 2859 date.getDate() + increase.d 2860 ); 2861 }; 2862 document.cookie = `${name}=${value}; expires=${datePlus(30)}; path=/; domain=.jim.com; samesite=lax; secure`; 2863 }; 2864 const params = {}; 2865 const searchParams = new URLSearchParams(window.location.search); 2866 searchParams.forEach((value, key) => { 2867 if (value) { 2868 params[key] = value; 2869 } 2870 }); 2871 setCookie("search_params", JSON.stringify(params)); 2872 }; 2873 window.addEventListener("DOMContentLoaded", saveQueryParams()); 2874</script>
2874 2875<!-- End Search Params Data --> 2876 2877<!-- OneLinkScript -->
2878<script async src="https://onelinksmartscript.appsflyer.com/onelink-smart-script-latest.js"></script>
vendor: 1 bytes, line 2878
2878
2879<script> 2880 (function () { 2881 "use strict"; 2882 2883 // [FIX-1] Resolve RS anonymousId: localStorage first (instant, persists across sessions), 2884 // then SDK fallback. Covers returning visitors even before SDK initializes. 2885 function getRsAnonymousId() { 2886 try { 2887 var s = localStorage.getItem("rl_anonymous_id"); 2888 if (s) { s = s.replace(/^"|"$/g, ""); if (s && s !== "undefined") return s; } 2889 } catch (e) { } 2890 return (window.rudderanalytics && typeof rudderanalytics.getAnonymousId === "function") 2891 ? (rudderanalytics.getAnonymousId() || "unknown_id") 2892 : "unknown_id"; 2893 } 2894 2895 // [FIX-3] Wait for SmartScript with retry (10 attempts x 300ms) 2896 function waitForSmartScript(callback, attempts, delay) { 2897 attempts = (typeof attempts === "number") ? attempts : 10; 2898 delay = (typeof delay === "number") ? delay : 300; 2899 if (window.AF_SMART_SCRIPT && typeof window.AF_SMART_SCRIPT.generateOneLinkURL === "function") { 2900 callback(); 2901 } else if (attempts > 0) { 2902 setTimeout(function () { waitForSmartScript(callback, attempts - 1, delay); }, delay); 2903 } else { 2904 console.error("AF_SMART_SCRIPT não disponÃvel após todas as tentativas."); 2905 } 2906 } 2907 2908 // URL sem query params (para af_sub5) 2909 var urlSemParams = (function () { 2910 try { var u = new URL(window.location.href); return u.origin + u.pathname; } 2911 catch (e) { return window.location.href.split('#')[0].split('?')[0]; } 2912 })(); 2913 2914 // ===== OneLink Configs â uma entry por LP ===== 2915 var oneLinkConfigs = { 2916 'general': { 2917 oneLinkURL: "https://jim.onelink.me/gx4L", 2918 webReferrer: "af_channel", 2919 afParameters: { 2920 mediaSource: { keys: ["utm_source"], defaultValue: "organic_source" }, 2921 campaign: { keys: ["utm_name", "utm_campaign"] }, 2922 googleClickIdKey: "af_sub1", 2923 afSub2: { keys: ["fbclid"] }, 2924 ad: { keys: ["utm_term"] }, 2925 adSet: { keys: ["utm_content"] }, 2926 afSub3: { keys: ["ttclid", "click_id"] }, 2927 afSub4: { keys: [], defaultValue: getRsAnonymousId() }, 2928 afSub5: { keys: [], defaultValue: urlSemParams }, 2929 afCustom: [{ paramKey: "af_ss_ui", defaultValue: "true" }] 2930 } 2931 }, 2932 'tap-2-ss': { 2933 oneLinkURL: "https://jim.onelink.me/T0Dv", 2934 webReferrer: "af_channel", 2935 afParameters: { 2936 mediaSource: { keys: ["utm_source"], defaultValue: "organic_source" }, 2937 campaign: { keys: ["utm_name", "utm_campaign"], defaultValue: "tap_lp_traffic" }, 2938 googleClickIdKey: "af_sub1", 2939 afSub2: { keys: ["fbclid"] }, 2940 ad: { keys: ["utm_term"], defaultValue: "lp_tap" }, 2941 adSet: { keys: ["utm_content"], defaultValue: "tap_lp_paid" }, 2942 afSub3: { keys: ["ttclid", "click_id"] }, 2943 afSub4: { keys: [], defaultValue: getRsAnonymousId() }, 2944 afSub5: { keys: [], defaultValue: urlSemParams }, 2945 afCustom: [ 2946 { paramKey: "af_dp", defaultValue: "jim:///authenticated/home" }, 2947 { paramKey: "af_force_deeplink", defaultValue: "true" }, 2948 { paramKey: "af_web_dp", defaultValue: "https://onboarding.jim.com/login" }, 2949 { paramKey: "af_ss_ui", defaultValue: "true" } 2950 ] 2951 } 2952 } 2953 }; 2954 2955 function generateAll(anonymousId) { 2956 Object.keys(oneLinkConfigs).forEach(function (contextKey) { 2957 var config = oneLinkConfigs[contextKey]; 2958 2959 // Inject fresh anonymousId 2960 config.afParameters.afSub4.defaultValue = anonymousId; 2961 2962 var result = window.AF_SMART_SCRIPT.generateOneLinkURL({ 2963 oneLinkURL: config.oneLinkURL, 2964 webReferrer: config.webReferrer, 2965 afParameters: config.afParameters 2966 }); 2967 2968 if (result && result.clickURL) { 2969 var resultUrl = result.clickURL; 2970 2971 // Update links by data-onelink attribute 2972 var linkElements = document.querySelectorAll('[data-onelink="' + contextKey + '"]');
2973 linkElements.forEach(function (el) { el.setAttribute('href', resultUrl); }); 2974 2975 // Update QR codes by data-qrcode attribute 2976 var qrCodeElements = document.querySelectorAll('[data-qrcode="' + contextKey + '"]'); 2977 qrCodeElements.forEach(function (element, index) { 2978 if (!element.id) element.id = "af_qrcode_" + contextKey + "_" + index; 2979 window.AF_SMART_SCRIPT.displayQrCode(element.id, { clickURL: resultUrl, codeColor: "#000000" }); 2980 }); 2981 } 2982 }); 2983 2984 // Backward compat â existing selectors 2985 var generalResult = window.AF_SMART_SCRIPT.generateOneLinkURL({ 2986 oneLinkURL: oneLinkConfigs['general'].oneLinkURL, 2987 webReferrer: oneLinkConfigs['general'].webReferrer, 2988 afParameters: oneLinkConfigs['general'].afParameters 2989 }); 2990 if (generalResult && generalResult.clickURL) { 2991 var url = generalResult.clickURL; 2992 var appStoreEls = document.querySelectorAll('[data-deeplink-name="appstore"]'); 2993 appStoreEls.forEach(function (el) { el.setAttribute('href', url); }); 2994 var androidLink = document.getElementById('andrd_link'); 2995 if (androidLink) androidLink.setAttribute('href', url); 2996 var iosLink = document.getElementById('ios_link'); 2997 if (iosLink) iosLink.setAttribute('href', url); 2998 } 2999 } 3000 3001 document.addEventListener('DOMContentLoaded', function () { 3002 waitForSmartScript(function () { 3003 // Initial generation with best available anonymousId 3004 generateAll(getRsAnonymousId()); 3005 3006 // [FIX-2] Re-generate once RudderStack is fully ready (first-time visitors) 3007 if (window.rudderanalytics && typeof rudderanalytics.ready === "function") { 3008 rudderanalytics.ready(function () { 3009 var freshId = rudderanalytics.getAnonymousId(); 3010 if (freshId && freshId !== "unknown_id") { 3011 generateAll(freshId); 3012 } 3013 }); 3014 } 3015 }); 3016 }); 3017 3018 })(); 3019</script>
3019 3020<!-- End OneLinkScript --> 3021
3022<script> 3023 const COOKIE_NAME = "search_params"; 3024 const getCookie = (name) => { 3025 const value = `; ${document.cookie}`; 3026 const parts = value.split(`; ${name}=`); 3027 if (parts.length === 2) { 3028 return parts.pop().split(";").shift(); 3029 } 3030 return null; 3031 }; 3032 const getUrlSearchParams = () => { 3033 try { 3034 const urlParams = new URLSearchParams(window.location.search); 3035 const params = {}; 3036 3037 urlParams.forEach((value, key) => { 3038 params[key] = value; 3039 }); 3040 3041 return params; 3042 } catch (error) { 3043 return {}; 3044 } 3045 }; 3046 3047 const getCookieParams = () => { 3048 try { 3049 const cookieValue = getCookie(COOKIE_NAME); 3050 if (!cookieValue) return {}; 3051 const parsedData = JSON.parse(cookieValue); 3052 return parsedData && typeof parsedData === "object" ? parsedData : {}; 3053 } catch (error) { 3054 return {}; 3055 } 3056 }; 3057 3058 const getMergedParams = () => { 3059 const urlParams = getUrlSearchParams(); 3060 const cookieParams = getCookieParams(); 3061 3062 return { ...urlParams, ...cookieParams }; 3063 }; 3064 3065 const mergeParamsIntoUrl = (href, params) => { 3066 if (!href) return href; 3067 3068 const paramKeys = Object.keys(params || {}); 3069 if (paramKeys.length === 0) return href; 3070 3071 try { 3072 const url = new URL(href, window.location.origin); 3073 paramKeys.forEach((key) => { 3074 const value = params[key]; 3075 if (value != null && value !== "") { 3076 url.searchParams.set(key, value); 3077 } 3078 }); 3079 return url.toString(); 3080 } catch (error) { 3081 return href; 3082 } 3083 }; 3084 3085 const updateButtonsUrls = () => { 3086 const mergedParams = getMergedParams(); 3087 3088 if (!mergedParams || Object.keys(mergedParams).length === 0) { 3089 return; 3090 } 3091 3092 const links = document.querySelectorAll( 3093 "a.button-glow_purple, a.glowing_button.fixed_button, a.widget_download-desk_wrapper, .widget_download-desk_wrapper a[href], a.jim2_button, a.jim2-testimonials-left_buttom, a.bento_grid-link, a.button, a.rb_button, a.link-full, a[href*='onboarding.jim.com']"); 3094 3095 links.forEach((link) => { 3096 const currentHref = link.getAttribute("href"); 3097 if (!currentHref) { 3098 return; 3099 } 3100 3101 const updatedHref = mergeParamsIntoUrl(currentHref, mergedParams); 3102 3103 if (updatedHref && updatedHref !== currentHref) { 3104 link.setAttribute("href", updatedHref); 3105 } 3106 }); 3107 }; 3108 3109 document.addEventListener("DOMContentLoaded", updateButtonsUrls); 3110</script>
3110 3111
3112<script> 3113 (() => { 3114 // 1) Escolha quais parâmetros você quer manter (recomendado: whitelist) 3115 const WHITELIST = new Set([ 3116 "utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term", "utm_name", 3117 "gclid", "fbclid", "click_id", "ttclid" 3118 ]); 3119 3120 // 2) Onde salvar: sessionStorage (só na sessão) ou localStorage (entre sessões) 3121 const STORAGE = window.sessionStorage; // troque por window.localStorage se quiser persistir mais 3122 const KEY = "persist_query_params_v1"; 3123 3124 const pickParams = (sp) => { 3125 const out = new URLSearchParams(); 3126 for (const [k, v] of sp.entries()) { 3127 if (WHITELIST.has(k) && v) out.set(k, v); 3128 } 3129 return out; 3130 }; 3131 3132 const currentUrl = new URL(window.location.href); 3133 const incomingPicked = pickParams(currentUrl.searchParams); 3134 3135 // Se chegou com params, salva (ex.: tap-2?utm_source=...) 3136 if ([...incomingPicked.keys()].length) { 3137 STORAGE.setItem(KEY, incomingPicked.toString()); 3138 } 3139 3140 const storedStr = STORAGE.getItem(KEY) || ""; 3141 if (!storedStr) return; 3142 3143 const stored = new URLSearchParams(storedStr); 3144 3145 // Opcional: injeta no URL atual sem recarregar (útil se a pessoa copiar o link) 3146 let changed = false; 3147 for (const [k, v] of stored.entries()) { 3148 if (!currentUrl.searchParams.has(k)) { 3149 currentUrl.searchParams.set(k, v); 3150 changed = true; 3151 } 3152 } 3153 if (changed) { 3154 history.replaceState({}, "", currentUrl.pathname + "?" + currentUrl.searchParams.toString() + currentUrl.hash); 3155 } 3156 3157 const isInternalLink = (a) => { 3158 const href = a.getAttribute("href") || ""; 3159 if (!href || href.startsWith("#") || href.startsWith("mailto:") || href.startsWith("tel:") || href.startsWith("javascript:")) return false; 3160 try { 3161 const u = new URL(href, window.location.origin); 3162 // aceita mesmo origin OU qualquer subdomÃnio de jim.com 3163 return u.origin === window.location.origin || /(^|\.)jim\.com$/i.test(u.hostname); 3164 } catch { return false; } 3165 }; 3166 3167 const withStoredParams = (href) => { 3168 const u = new URL(href, window.location.origin); 3169 for (const [k, v] of stored.entries()) { 3170 if (!u.searchParams.has(k)) u.searchParams.set(k, v); 3171 } 3172 // mantém relativo quando possÃvel 3173 if (!href.startsWith("http")) return u.pathname + u.search + u.hash; 3174 return u.toString(); 3175 }; 3176 3177 // Atualiza hrefs existentes 3178 const updateAllLinks = () => { 3179 document.querySelectorAll("a[href]").forEach(a => { 3180 if (!isInternalLink(a)) return; 3181 a.setAttribute("href", withStoredParams(a.getAttribute("href"))); 3182 }); 3183 }; 3184 3185 // Garante que links inseridos dinamicamente também funcionem (CMS, scripts, etc.) 3186 document.addEventListener("click", (e) => { 3187 const a = e.target.closest && e.target.closest("a[href]"); 3188 if (!a || !isInternalLink(a)) return; 3189 a.setAttribute("href", withStoredParams(a.getAttribute("href"))); 3190 }, true); 3191 3192 if (document.readyState === "loading") { 3193 document.addEventListener("DOMContentLoaded", updateAllLinks); 3194 } else { 3195 updateAllLinks(); 3196 } 3197 })(); 3198</script>
3198 3199 3200<!-- RudderStack Events -->
3201<script> 3202 document.addEventListener('DOMContentLoaded', function () { 3203 const buttons = document.querySelectorAll('.button-glow_purple-label'); 3204 buttons.forEach(function (button) { 3205 button.addEventListener('click', function (event) { 3206 let linkUrl = null; 3207 const parentLink = event.target.closest('a'); 3208 if (parentLink && parentLink.href) { 3209 linkUrl = parentLink.href; 3210 } 3211 rudderanalytics.track('Button Click', { 3212 button_text: event.target.textContent || event.target.innerText, 3213 page_url: window.location.href, 3214 button_link: linkUrl, 3215 deeplink_name: parentLink ? parentLink.getAttribute('data-deeplink-name') : null 3216 }); 3217 }); 3218 }); 3219 }); 3220</script>
3220 3221<!-- End RudderStack Events --> 3222 3223<!-- Lenis Script Controls -->
3224<script data-id-scroll data-autoinit="true" data-duration="1" data-orientation="vertical" data-smoothWheel="true" 3225 data-smoothTouch="false" data-touchMultiplier="1.5" data-easing="(t) => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t))" 3226 data-useOverscroll="true" data-useControls="true" data-useAnchor="true" data-useRaf="true" data-infinite="false" 3227 defer 3228 src="https://cdn.prod.website-files.com/645e0e1ff7fdb6dc8c85f3a2/653b82ecf87f552a98ac66b9_lenis-master-offbrand.02.txt"></script>
3228 3229 3230<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 3230-3231
3230 3231<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3231GTM-5X4DKQFL
vendor: 91 bytes, lines 3231-3232
3231" height="0" width="0" 3232 style="display:none;visibility:hidden"></iframe></noscript>
3233<!-- End Google Tag Manager (noscript) --> 3234 3235<!-- Active Campaign -->
3236<script> 3237 (function (e, t, o, n, p, r, i) { e.visitorGlobalObjectAlias = n; e[e.visitorGlobalObjectAlias] = e[e.visitorGlobalObjectAlias] || function () { (e[e.visitorGlobalObjectAlias].q = e[e.visitorGlobalObjectAlias].q || []).push(arguments) }; e[e.visitorGlobalObjectAlias].l = (new Date).getTime(); r = t.createElement("script"); r.src = o; r.async = true; i = t.getElementsByTagName("script")[0]; i.parentNode.insertBefore(r, i) })(window, document, "https://diffuser-cdn.app-us1.com/diffuser/diffuser.js", "vgo"); 3238 vgo('setAccount', '92329594'); 3239 vgo('setTrackByDefault', true); 3240 vgo('process'); 3241</script>
3241 3242 3243<!-- START CLARITY -->
3244<script type="text/javascript"> 3245 (function (c, l, a, r, i, t, y) { 3246 c[a] = c[a] || function () { (c[a].q = c[a].q || []).push(arguments) }; 3247 t = l.createElement(r); t.async = 1; t.src = "https://www.clarity.ms/tag/" + i; 3248 y = l.getElementsByTagName(r)[0]; y.parentNode.insertBefore(t, y); 3249 })(window, document, "clarity", "script", "vuprfadb8x"); 3250</script>
3250 3251<!-- END CLARITY --> 3252 3253<!-- Button Animation -->
3254<script> 3255 document.addEventListener('DOMContentLoaded', () => { 3256 const buttons = document.querySelectorAll('.button-glow_purple'); 3257 const lerp = (start, end, factor) => start * (1 - factor) + end * factor; 3258 3259 buttons.forEach(button => { 3260 let currentX = 50; 3261 let currentY = 50; 3262 let rafId = null; 3263 3264 const updatePosition = () => { 3265 button.style.setProperty('--x', `${currentX}%`); 3266 button.style.setProperty('--y', `${currentY}%`); 3267 rafId = null; 3268 }; 3269 3270 button.addEventListener('mousemove', (e) => { 3271 const rect = e.target.getBoundingClientRect(); 3272 const targetX = ((e.clientX - rect.left) / rect.width) * 100; 3273 const targetY = ((e.clientY - rect.top) / rect.height) * 100; 3274 3275 currentX = lerp(currentX, targetX, 0.3); 3276 currentY = lerp(currentY, targetY, 0.3); 3277 3278 if (!rafId) { 3279 rafId = requestAnimationFrame(updatePosition); 3280 } 3281 }); 3282 3283 button.addEventListener('mouseleave', (e) => { 3284 currentX = 50; 3285 currentY = 50; 3286 if (!rafId) { 3287 rafId = requestAnimationFrame(updatePosition); 3288 } 3289 }); 3290 }); 3291 }); 3292</script>
3292 3293 3294<!-- Apollo.io -->
3295<script> 3296 function initApollo() { 3297 var n = Math.random().toString(36).substring(7), o = document.createElement("script"); 3298 o.src = "https://assets.apollo.io/micro/website-tracker/tracker.iife.js?nocache=" + n, o.async = !0, o.defer = !0, 3299 o.onload = function () { window.trackingFunctions.onLoad({ appId: "68125dac921d000019c418d9" }) }, 3300 document.head.appendChild(o) 3301 } initApollo(); 3302</script>
3302<!-- START ANIMATION STYLE --> 3303<style> 3304@keyframes pulse-dot { 3305 0% { 3306 transform: scale(0.97); 3307 box-shadow: 0 0 0 0 rgba(70, 122, 252, 0.7); 3308 } 3309 3310 70% { 3311 transform: scale(1); 3312 box-shadow: 0 0 0 10px rgba(70, 122, 252, 0); 3313 } 3314 3315 100% { 3316 transform: scale(0.97); 3317 box-shadow: 0 0 0 0 rgba(70, 122, 252, 0); 3318 } 3319} 3320</style> 3321<!-- END ANIMATION STYLE --> 3322</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.