301 durum kodu, istenen kaynağın kalıcı olarak yeni bir URL'ye taşındığı anlamına gelir. Gelecekteki tüm istekler yeni adresi kullanmalıdır.
Tarayıcı kullanıcıyı otomatik olarak yeni adrese yönlendirecek ve arama motorları dizinlerini güncelleyecektir.
GET / HTTP/1.1 Host: cemm.com Accept: */* User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; [email protected])
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no"> <link rel="stylesheet" href="/application/themes/cemm/assets/css/styles.css" /> <script type="text/javascript" src="/application/themes/cemm/assets/js/main.js"></script> <script type="text/javascript" src="/application/themes/cemm/assets/js/shared-observer.js"></script> <title>Competitive Edge: A Branding, Marketing and Media Agency</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="description" content="We are a diverse team of marketing and media experts helping clients define, create, and bring their unique brand edge to life."> <meta name="generator" content="Concrete CMS"> <meta name="msapplication-TileImage" content="https://cemm.com/application/files/9317/4594/8415/144-icon-ce.png"> <link rel="shortcut icon" href="https://cemm.com/application/files/9017/4594/8457/favicon.ico" type="image/x-icon"> <link rel="icon" href="https://cemm.com/application/files/9017/4594/8457/favicon.ico" type="image/x-icon"> <link rel="apple-touch-icon" href="https://cemm.com/application/files/7417/4594/8414/57-icon-ce.png"> <link rel="canonical" href="https://cemm.com/"> <script type="text/javascript"> var CCM_DISPATCHER_FILENAME = "/index.php"; var CCM_CID = 1; var CCM_EDIT_MODE = false; var CCM_ARRANGE_MODE = false; var CCM_IMAGE_PATH = "/concrete/images"; var CCM_APPLICATION_URL = "https://cemm.com"; var CCM_REL = ""; var CCM_ACTIVE_LOCALE = "en_US"; var CCM_USER_REGISTERED = false; </script> <link href="/concrete/css/fontawesome/all.css?ccm_nocache=c203874f7d5a8cae09b7b1a8553930e592d6a839" rel="stylesheet" type="text/css" media="all"> <script type="text/javascript" src="/concrete/js/jquery.js?ccm_nocache=c203874f7d5a8cae09b7b1a8553930e592d6a839"></script> <link href="/concrete/css/features/navigation/frontend.css?ccm_nocache=c203874f7d5a8cae09b7b1a8553930e592d6a839" rel="stylesheet" type="text/css" media="all"> <link href="/application/blocks/hero_header/view.css?ccm_nocache=c203874f7d5a8cae09b7b1a8553930e592d6a839" rel="stylesheet" type="text/css" media="all"> <link href="/concrete/css/features/imagery/frontend.css?ccm_nocache=c203874f7d5a8cae09b7b1a8553930e592d6a839" rel="stylesheet" type="text/css" media="all"> <link href="/application/blocks/full_width_image/view.css?ccm_nocache=c203874f7d5a8cae09b7b1a8553930e592d6a839" rel="stylesheet" type="text/css" media="all"> <script async src="https://www.googletagmanager.com/gtag/js?id=G-YXWN28L21G"></script><script>window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('set', 'developer_id.dZjQwMz', true);gtag('config', 'G-YXWN28L21G');</script> <script async src="https://www.googletagmanager.com/gtm.js?id=GTM-T75RFBL2"></script> <script type="text/javascript" async src="https://www.googletagmanager.com/gtag/js?id=G-YXWN28L21G&l=dataLayer&cx=c>m=45He5521v9181984981za200&tag_exp=101509156~103101750~103101752~103116026~103200004~103231718~103231720~103233424~103251618~103251620~103252644~103252646"></script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-T75RFBL2');</script> <!-- End Google Tag Manager --> <script type="text/javascript"> _linkedin_partner_id = "6014772"; window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || []; window._linkedin_data_partner_ids.push(_linkedin_partner_id); </script><script type="text/javascript"> (function(l) { if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])}; window.lintrk.q=[]} var s = document.getElementsByTagName("script")[0]; var b = document.createElement("script"); b.type = "text/javascript";b.async = true; b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; s.parentNode.insertBefore(b, s);})(window.lintrk); </script> </head> <body class=""> <div id="page-wrapper" class="ccm-page ccm-page-id-1 page-type-page page-template-full ccm-production-mode-development"> <div id="header"> <div id="header-content"> <a id="collogo" href="/"> <svg width="114" height="32" viewBox="0 0 114 32" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M17.0934 7.184C13.3152 6.5024 9.66121 8.3008 7.77988 11.8784C7.54704 12.32 7.36077 12.784 7.22417 13.2672C5.9979 17.536 7.7271 21.8432 11.5239 23.968C11.9492 24.2048 12.3963 24.3968 12.8588 24.5408C16.1186 25.5392 19.4 24.6496 21.657 22.3264C21.9302 22.0448 22.1817 21.7472 22.4145 21.4368L27.273 26.448C27.0216 26.7424 26.7608 27.0336 26.4938 27.3088C25.0688 28.7808 23.4079 29.9296 21.5639 30.7392C19.6453 31.5744 17.6118 31.9968 15.5194 31.9968C13.427 31.9968 11.3935 31.5744 9.47804 30.7392C7.63086 29.9328 5.96995 28.7808 4.54809 27.3088C3.12313 25.8432 2.00551 24.1312 1.22007 22.2272C0.409794 20.2528 0 18.1568 0 16C0 13.8432 0.409794 11.7472 1.22007 9.7728C2.0024 7.8688 3.12002 6.1536 4.54809 4.688C5.97306 3.2192 7.63086 2.0672 9.47804 1.2608C11.3935 0.4256 13.4301 0 15.5194 0C17.6087 0 19.6453 0.4224 21.5639 1.2608C23.411 2.0672 25.0719 3.2192 26.4938 4.688C26.7639 4.9696 27.0247 5.2576 27.273 5.552L22.4145 10.56C21.8277 9.7696 21.1013 9.0688 20.2476 8.4864C19.2945 7.8368 18.2234 7.3984 17.0934 7.1936M20.3624 19.2448H10.6422V12.7584H20.3624V19.2448Z" fill="currentColor"/> <path d="M41.1038 9.8752C41.0572 11.1008 40.0265 12.3392 38.4805 12.3392C36.4656 12.3392 35.168 10.8576 35.168 9.04C35.168 6.9312 36.7295 5.1904 38.5736 5.1904C39.6664 5.1904 40.8213 5.6896 40.8213 6.688C40.8213 7.1712 40.4611 7.4944 40.07 7.4944C39.5888 7.4944 39.3218 7.1392 39.3218 6.8C39.3218 6.1568 39.7099 6.1888 39.7099 5.9456C39.7099 5.5936 38.9896 5.4464 38.5395 5.4464C37.0276 5.4464 36.6643 6.464 36.6643 7.9904V9.392C36.6643 10.7936 36.7264 12.08 38.4774 12.08C40.0545 12.08 40.7405 10.8576 40.8523 9.8752H41.1038Z" fill="currentColor"/> <path d="M45.7266 5.1936C47.7414 5.1936 49.0391 6.9152 49.0391 8.768C49.0391 10.6208 47.7445 12.3424 45.7266 12.3424C43.7086 12.3424 42.4141 10.6208 42.4141 8.768C42.4141 6.9152 43.7086 5.1936 45.7266 5.1936ZM47.5365 8.1376C47.5365 6.736 47.4744 5.4496 45.7266 5.4496C43.9787 5.4496 43.9166 6.7392 43.9166 8.1376V9.3952C43.9166 10.7968 43.9787 12.0832 45.7266 12.0832C47.4744 12.0832 47.5365 10.7968 47.5365 9.3952V8.1376Z" fill="currentColor"/> <path d="M50.1484 11.888H51.3809V5.80159H50.1484V5.54559H51.3809C52.1322 5.54559 52.4116 5.54559 52.6941 5.19039V6.76799H52.7283C53.1474 5.97759 53.8055 5.19039 54.9759 5.19039C55.9756 5.19039 56.9752 5.47839 57.1149 6.91199H57.146C57.4595 5.99359 58.2388 5.17439 59.4123 5.19039C61.0049 5.20639 61.5357 6.14079 61.5357 7.15519V11.888H62.7713V12.1472H58.987V11.888H60.2256V6.86719C60.2256 5.70559 59.7227 5.44959 59.1329 5.44959C58.2263 5.44959 57.4316 6.46399 57.118 7.59039V11.888H58.304V12.1472H54.5692V11.888H55.8048V6.55999C55.8048 5.75679 55.4137 5.44959 54.7897 5.44959C53.849 5.44959 53.1474 6.20799 52.6972 7.35039V11.8912H53.8832V12.1504H50.1484V11.8912V11.888Z" fill="currentColor"/> <path d="M64.5109 5.8016H63.4336V5.5456H64.5109C65.0138 5.5456 65.5105 5.5104 65.8241 5.1904V6.832H65.8551C66.1376 6.0736 66.8858 5.1904 68.0096 5.1904C69.8847 5.1904 71.1203 7.184 71.1203 8.7648C71.1203 10.6464 69.8537 12.3392 67.901 12.3392C66.8237 12.3392 66.0879 11.52 65.8551 10.9728H65.8241V16.2368H67.0286V16.496H63.4336V16.2368H64.5109V5.8016ZM65.8241 9.8272C65.8241 11.0848 66.7647 12.0832 67.9041 12.0832C69.4346 12.0832 69.6209 11.1648 69.6209 8.7648C69.6209 6.56 69.388 5.4464 68.0127 5.4464C66.7182 5.4464 65.8241 6.768 65.8241 7.9424V9.824V9.8272Z" fill="currentColor"/> <path d="M74.3706 9.6512C74.355 10.7968 74.5103 12.0832 75.9787 12.0832C77.2919 12.0832 78.2605 11.184 78.4778 9.8624H78.7293C78.4778 11.344 77.4161 12.3424 75.9787 12.3424C74.1501 12.3424 72.8711 10.896 72.8711 8.768C72.8711 7.2032 74.0881 5.1936 75.7924 5.1936C77.6365 5.1936 78.5865 7.3184 78.5865 7.9936C78.5865 8.0896 78.5399 8.1376 78.4468 8.1376H74.3706V9.6512ZM77.087 7.4304C77.087 6.4 76.8231 5.4496 75.7924 5.4496C74.6996 5.4496 74.3706 6.4 74.3706 7.4304V7.8816H76.9783C77.056 7.8816 77.087 7.8336 77.087 7.7696V7.4304Z" fill="currentColor"/> <path d="M81.0434 5.80159H79.6836V5.54559C81.3072 5.57439 81.9033 4.87039 82.1672 3.29279H82.3535V5.54559H84.508V5.80159H82.3535V11.2128C82.3535 11.8752 82.6173 12.0832 83.1203 12.0832C83.8995 12.0832 84.2441 11.344 84.3372 11.0688L84.5732 11.1168C84.4614 11.504 84.0113 12.3424 82.8564 12.3424C81.7636 12.3424 81.0434 11.9712 81.0434 10.9088V5.80479V5.80159Z" fill="currentColor"/> <path d="M86.5527 5.80478H85.3047V5.54879H86.5527C87.0525 5.54879 87.5523 5.51678 87.8659 5.19358V11.8912H89.1139V12.1504H85.3047V11.8912H86.5527V5.80478ZM87.2109 1.47198C87.6486 1.47198 88.0056 1.84318 88.0056 2.29438C88.0056 2.74558 87.6455 3.11358 87.2109 3.11358C86.7762 3.11358 86.4161 2.74238 86.4161 2.29438C86.4161 1.84638 86.7762 1.47198 87.2109 1.47198Z" fill="currentColor"/> <path d="M91.2074 5.80159H89.8477V5.54559C91.4713 5.57439 92.0674 4.87039 92.3313 3.29279H92.5175V5.54559H94.6721V5.80159H92.5175V11.2128C92.5175 11.8752 92.7814 12.0832 93.2843 12.0832C94.0636 12.0832 94.4082 11.344 94.5013 11.0688L94.7372 11.1168C94.6255 11.504 94.1753 12.3424 93.0205 12.3424C91.9277 12.3424 91.2074 11.9712 91.2074 10.9088V5.80479V5.80159Z" fill="currentColor"/> <path d="M96.7238 5.80478H95.4727V5.54879H96.7238C97.2236 5.54879 97.7234 5.51678 98.037 5.19358V11.8912H99.285V12.1504H95.4727V11.8912H96.7238V5.80478ZM97.3819 1.47198C97.8197 1.47198 98.1767 1.84318 98.1767 2.29438C98.1767 2.74558 97.8166 3.11358 97.3819 3.11358C96.9473 3.11358 96.5872 2.74238 96.5872 2.29438C96.5872 1.84638 96.9473 1.47198 97.3819 1.47198Z" fill="currentColor"/> <path d="M100.586 5.80159H99.6797V5.54559H103.259V5.80159H102.101L104.073 10.6976L105.603 7.10399C105.774 6.70079 105.867 6.39679 105.867 6.21759C105.867 5.84639 105.429 5.79839 105.162 5.79839H104.619V5.54239H107.335V5.79839C106.615 5.79839 106.429 5.86559 106.1 6.61759L103.554 12.528H103.43L100.589 5.79839L100.586 5.80159Z" fill="currentColor"/> <path d="M109.515 9.6512C109.5 10.7968 109.655 12.0832 111.123 12.0832C112.436 12.0832 113.405 11.184 113.622 9.8624H113.874C113.622 11.344 112.561 12.3424 111.123 12.3424C109.295 12.3424 108.016 10.896 108.016 8.768C108.016 7.2032 109.233 5.1936 110.937 5.1936C112.781 5.1936 113.734 7.3184 113.734 7.9936C113.734 8.0896 113.688 8.1376 113.594 8.1376H109.518V9.6512H109.515ZM112.232 7.4304C112.232 6.4 111.968 5.4496 110.937 5.4496C109.844 5.4496 109.515 6.4 109.515 7.4304V7.8816H112.123C112.2 7.8816 112.232 7.8336 112.232 7.7696V7.4304Z" fill="currentColor"/> <path d="M36.6674 24.9888C36.6519 26.1344 36.8071 27.4208 38.2756 27.4208C39.5888 27.4208 40.5574 26.5216 40.7747 25.2H41.0262C40.7747 26.6816 39.713 27.68 38.2756 27.68C36.447 27.68 35.168 26.2336 35.168 24.1056C35.168 22.5408 36.3849 20.5312 38.0893 20.5312C39.9334 20.5312 40.8865 22.656 40.8865 23.3312C40.8865 23.4272 40.8399 23.4752 40.7468 23.4752H36.6705V24.9888H36.6674ZM39.3839 22.768C39.3839 21.7376 39.12 20.7872 38.0893 20.7872C36.9965 20.7872 36.6674 21.7376 36.6674 22.768V23.2192H39.2752C39.3528 23.2192 39.3839 23.1712 39.3839 23.1072V22.768Z" fill="currentColor"/> <path d="M47.7103 26.3136H47.6762C47.4434 26.8608 46.7076 27.68 45.6334 27.68C43.6776 27.68 42.4141 25.9904 42.4141 24.1056C42.4141 22.528 43.6528 20.5312 45.5248 20.5312C46.6517 20.5312 47.3999 21.4144 47.6793 22.1728H47.7134V16.3104H46.4654V16.0544H47.7134C48.2133 16.0544 48.7131 16.0224 49.0266 15.6512V27.2256H50.1039V27.4816H47.7134V26.3072L47.7103 26.3136ZM47.7103 23.2864C47.7103 22.112 46.8225 20.7904 45.5217 20.7904C44.1464 20.7904 43.9135 21.9008 43.9135 24.1088C43.9135 26.5088 44.0998 27.4272 45.6303 27.4272C46.6921 27.4272 47.7228 26.5088 47.7072 25.1744V23.2896L47.7103 23.2864Z" fill="currentColor"/> <path d="M55.9013 26.7456C56.7768 26.7456 57.6367 27.1168 57.6367 28.5984C57.6367 30.7872 55.9168 31.9936 54.0262 31.9936C52.5857 31.9936 51.0117 31.4656 51.0117 29.92C51.0117 29.0176 51.8996 28.3424 52.5733 28.0352V28.0032C51.7133 28.0032 51.3066 27.3952 51.3066 26.5056C51.3066 25.3792 51.8375 24.928 52.8372 24.912V24.88C52.1324 24.4128 51.6668 23.9168 51.6668 23.0432C51.6668 21.6128 52.8682 20.5344 54.2621 20.5344C54.9948 20.5344 55.6529 20.7584 56.0876 21.2256C56.3701 20.9024 56.7581 20.5344 57.2921 20.5344C57.7454 20.5344 58.0869 20.7904 58.0869 21.2576C58.0869 21.6416 57.7888 21.8208 57.4629 21.8208C57.1648 21.8208 56.9599 21.5648 56.9599 21.3216C56.9599 20.9824 57.0376 20.8864 57.1307 20.7872C56.8202 20.8032 56.4446 21.0784 56.2428 21.3856C56.5874 21.7696 56.8513 22.384 56.8513 22.9952C56.8513 24.3328 55.476 25.3632 54.259 25.3632C53.5853 25.3632 53.2594 25.152 53.0886 25.072C52.2442 25.088 51.5581 25.3312 51.5581 26.0864C51.5581 26.4896 51.8686 26.7456 52.2442 26.7456H55.8982H55.9013ZM53.1849 28.0032C52.2473 28.2144 51.7661 28.7744 51.7661 29.8528C51.7661 31.2064 52.8868 31.7376 54.1069 31.7376C55.6995 31.7376 57.2611 30.6912 57.2611 29.0784C57.2611 28.24 56.6029 28 55.7926 28H53.1849V28.0032ZM54.2621 25.104C55.5443 25.104 55.5443 24.0928 55.5443 22.9472C55.5443 21.6608 55.5443 20.7904 54.2621 20.7904C52.98 20.7904 52.98 22.096 52.98 22.9472C52.98 23.9776 52.98 25.104 54.2621 25.104Z" fill="currentColor"/> <path d="M60.687 24.9888C60.6715 26.1344 60.8267 27.4208 62.2951 27.4208C63.6083 27.4208 64.5769 26.5216 64.7942 25.2H65.0457C64.7942 26.6816 63.7325 27.68 62.2951 27.68C60.4666 27.68 59.1875 26.2336 59.1875 24.1056C59.1875 22.5408 60.4045 20.5312 62.1088 20.5312C63.9529 20.5312 64.906 22.656 64.906 23.3312C64.906 23.4272 64.8594 23.4752 64.7663 23.4752H60.6901V24.9888H60.687ZM63.4034 22.768C63.4034 21.7376 63.1395 20.7872 62.1088 20.7872C61.0161 20.7872 60.687 21.7376 60.687 22.768V23.2192H63.2948C63.3724 23.2192 63.4034 23.1712 63.4034 23.1072V22.768Z" fill="currentColor"/> <path d="M68.5266 24.2112H67.8902V21.1168H66.7539V20.5152H69.6597V21.1168H68.5266V24.2112Z" fill="currentColor"/> <path d="M72.1852 23.3024H72.1666L71.0459 21.5712V24.2112H70.4219V20.5152H71.0956L72.1852 22.2624L73.278 20.5152H73.9486V24.2112H73.3184V21.5616L72.1852 23.3024Z" fill="currentColor"/> </svg> </a> <nav id="nav"> <ul class="nav"><li class="nav-selected nav-path-selected"><a href="https://cemm.com/" target="_self" class="nav-selected nav-path-selected">Home</a></li><li class=""><a href="https://cemm.com/branding" target="_self" class="">Branding</a></li><li class=""><a href="https://cemm.com/media" target="_self" class="">Media</a></li><li class=""><a href="https://cemm.com/marketing" target="_self" class="">Marketing</a></li><li class=""><a href="https://cemm.com/about" target="_self" class="">About</a></li></ul> </nav> <a href="/about#gridContactForm-landing" class="contact-button">Contact</a> <i class="fas fa-bars mobile-strike" onclick="$('#nav').toggleClass('open');"></i> </div> </div> <script> // Function to update logo color based on data-logoColor attributes function setupLogoColorObserver() { console.log('setupLogoColorObserver'); // Get the header element to use as the root const header = document.getElementById('header'); if (!header) return; // Keep track of the current color let currentColor = '#000000'; // Create an Intersection Observer to detect when elements with data-logoColor come into view const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { const logoColor = entry.target.getAttribute('data-logoColor'); // Only change color when a section enters the intersection area if (entry.isIntersecting && logoColor) { currentColor = logoColor; $('#collogo').css('color', currentColor); // Also update the mobile-strike color $('.mobile-strike').css('color', currentColor); console.log('Color changed to:', currentColor); } }); }, { root: null, // Use viewport as root rootMargin: `-${header.offsetHeight}px 0px 0px 0px`, // Negative margin equal to header height threshold: 0 // Trigger as soon as any part of the element intersects }); // Observe all elements with data-logoColor attribute document.querySelectorAll('[data-logoColor]').forEach(element => { observer.observe(element); }); } // Initialize when DOM is loaded document.addEventListener('DOMContentLoaded', setupLogoColorObserver); </script> <div id="main"> <div class="fullvideo" id="hero-header-520" data-logoColor="rgb(0, 0, 0)"> <video autoplay muted playsinline> <source src="/application/files/9917/4603/3205/home-page-vid-reverse-3.mp4" type="video/mp4"> </video> <div class="content-output"> <h1> <style type="text/css"><!--td {border: 1px solid #cccccc;}br {mso-data-placement:same-cell;}--> </style> Weʼre Competitive Edge. Nice to meet you!</h1> </div> </div> <style> #hero-header-520 { color: rgb(0, 0, 0); } #hero-header-520 .content-output { display: none; } </style> <script type="text/javascript"> $(document).ready(function() { setTimeout(function() { $('#hero-header-520 .content-output').fadeIn('slow'); console.log("This message appears after headlineIn seconds."); }, 10000); // Delay of 2000 milliseconds (2 seconds) }); </script> <div class="cemm-content-block" data-logoColor="#000000"><h3>At the core of our agency's success is a team of passionate and fun loving professionals. Our strong work ethic and positive team environment make us great partners and great friends.</h3> </div> <div class="gallery-section layout-1"> <div class="columns-container"> <div class="column col-4"> <div class="gallery-image image1"> <img src="/application/files/7417/4560/4590/hoz-case-hope-solutions-people.jpg" alt=""> <div class="gallery-copy"><p><span class="heading"><strong>Branding and Design</strong></span></p> <p>Ground-up identity? Standout package design? We are a go-to resource for brand-related needs. Learn about our <span class="promo-link"><a href="https://web.cemm.media/index.php?cID=241">Branding and Design</a></span></p> </div> </div> </div> <div class="column col-3"> <div class="gallery-image image2"> <img src="/application/files/1517/4549/7683/smile.jpg" alt=""> <div class="gallery-copy"><p><span class="heading"><strong>Integrated Marketing</strong></span></p> <p>Our strategic marketing plans help clients effectively reach and engage with their audiences. Learn about our <span class="promo-link"><a href="https://web.cemm.media/index.php?cID=242">Marketing Capabilities</a></span></p> </div> </div> </div> <div class="column col-5"> <div class="gallery-image image3"> <img src="/application/files/4817/4551/4570/sm_header_img.jpg" alt=""> <div class="gallery-copy"><p> <style type="text/css"><!--td {border: 1px solid #cccccc;}br {mso-data-placement:same-cell;}--> </style> <style type="text/css"><!--td {border: 1px solid #cccccc;}br {mso-data-placement:same-cell;}--> </style> <span class="heading">Powered by Our Team</span></p> <p>What can we say? Our team is smart, passionate and fun! <span class="promo-link">Meet our <a href="https://web.cemm.media/index.php?cID=237">People</a></span></p> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Handle smooth movement for all layout-1 instances document.querySelectorAll('.layout-1').forEach(layout1 => { const image1 = layout1.querySelector('.image1'); const image2 = layout1.querySelector('.image2'); const image3 = layout1.querySelector('.image3'); if (image1 && image2 && image3) { // Define movement ranges for each image const image1Range = { start: -10, // Changed from -40 to -20 to start lower end: 10, // Keep end position property: 'top' }; const image2Range = { start: 30, // Keep the same end: -2, // Keep the same property: 'top' }; const image3Range = { start: -5, end: 10, property: 'top' }; // Set initial positions for this instance image1.style.position = 'relative'; image2.style.position = 'relative'; image3.style.position = 'relative'; image1.style.top = `${image1Range.start}vh`; image2.style.top = `${image2Range.start}vh`; image3.style.top = `${image3Range.start}vh`; // Add will-change to optimize performance image1.style.willChange = 'top'; image2.style.willChange = 'top'; image3.style.willChange = 'top'; // Create instance-specific scroll handler const handleScroll = () => { const rect = layout1.getBoundingClientRect(); const viewportHeight = window.innerHeight; // Calculate how far through the viewport the element is (0 to 1) const elementProgress = Math.min(Math.max( ((viewportHeight * 0.7) - rect.top) / (viewportHeight * 0.7), 0 ), 1); // Apply smooth transitions to each image in this instance [ { el: image1, range: image1Range }, { el: image2, range: image2Range }, { el: image3, range: image3Range } ].forEach(({ el, range }) => { const movement = range.start + (elementProgress * (range.end - range.start)); el.style.transition = `${range.property} 0.1s linear`; el.style[range.property] = `${movement}vh`; }); }; // Create instance-specific observer const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { window.addEventListener('scroll', handleScroll); handleScroll(); // Initial position } else { window.removeEventListener('scroll', handleScroll); } }); }, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }); // Start observing this specific layout instance observer.observe(layout1); } }); // Create an Intersection Observer to detect when elements come into view const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('animate'); // For layout sections, animate child images with different delays if (entry.target.classList.contains('layout-section-images')) { const images = entry.target.querySelectorAll('.layout-section-image'); images.forEach((image, index) => { setTimeout(() => { image.classList.add('animate'); }, 100 * index); // Reduced delay between images }); // Animate headline and copy with reduced delays const headline = entry.target.querySelector('.headline'); if (headline) { setTimeout(() => { headline.classList.add('animate'); }, 50); } const copy = entry.target.querySelector('.layout-section-copy'); if (copy) { setTimeout(() => { copy.classList.add('animate'); }, 100); } } } }); }, { threshold: 0.1, // Reduced threshold to trigger earlier rootMargin: '0px 0px -50px 0px' // Adjusted to trigger sooner }); // Observe all layout sections document.querySelectorAll('.layout-section-images').forEach(section => { observer.observe(section); }); // Add pop-in animation for mobile devices function isMobile() { return window.innerWidth <= 768; } // Mobile observer (keep existing code for pop-in animations) const mobileObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting && isMobile()) { entry.target.classList.add('pop-in'); } }); }, { threshold: 0.2, rootMargin: '0px 0px -50px 0px' }); // Observe all gallery images for mobile pop-in animation document.querySelectorAll('.gallery-image').forEach(image => { mobileObserver.observe(image); }); // Handle resize events let resizeTimeout; window.addEventListener('resize', () => { const scrollPosition = window.scrollY; clearTimeout(resizeTimeout); resizeTimeout = setTimeout(() => { if (isMobile()) { // Reset all animations on mobile document.querySelectorAll('.layout-1 .gallery-image').forEach(image => { image.style.position = ''; image.style.top = ''; image.style.willChange = ''; image.style.transition = ''; }); document.querySelectorAll('.gallery-image').forEach(image => { if (isElementInViewport(image)) { image.classList.add('pop-in'); } }); } window.scrollTo(0, scrollPosition); }, 100); }); // Helper function to check if an element is in the viewport function isElementInViewport(el) { const rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } }); </script> <style> /* Base styles */ .gallery-section { width: 90%; max-width: var(--max-width); margin: 0 auto; padding: 4rem 0; } .gallery-image img { width: 100%; height: auto; border-radius: 20px; display: block; } .gallery-copy { font-family: SaansTRIAL, sans-serif; font-size: 24px; line-height: 34px; margin-top: 10px; padding: 0 10px; } .layout-1 .column.col-3 .gallery-copy { width: 130%; box-sizing: border-box; } /* Layout 1 specific styles */ .layout-1 .columns-container { display: flex; gap: 2rem; align-items: flex-start; } .layout-1 .column { display: flex; flex-direction: column; } .layout-1 .col-4 { width: 33.333%; } .layout-1 .col-3 { width: 25%; } .layout-1 .col-5 { width: 41.667%; } .layout-1 .column.col-4 > * { position: relative; left: 10%; } .layout-1 .col-3 { width: 25%; align-self: flex-end; } .layout-1 .col-4 img { z-index: 3; position: relative; } .layout-1 .col-3 img { width: 130%; z-index: 2; position: relative; } .layout-1 .col-5 { width: 41.667%; position: relative; top: -60px; } .layout-1 .gallery-image.image3 { width: 80%; } .gallery-section.layout-1 { margin: 60px auto 120px; } .layout-1 .image3 .gallery-copy { padding-left: 20%; } /* Mobile styles - disable animations and stack items */ @media (max-width: 768px) { /* Replace the disabled animations with pop-in animation */ .gallery-image img { opacity: 0; transform: scale(0.1); transition: opacity 0.8s ease, transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform-origin: center center; } .gallery-image.pop-in img { opacity: 1; transform: scale(1); } /* Add a slight delay for staggered animations */ .gallery-image:nth-child(1) { transition-delay: 0.1s; } .gallery-image:nth-child(2) { transition-delay: 0.2s; } .gallery-image:nth-child(3) { transition-delay: 0.3s; } .gallery-image:nth-child(4) { transition-delay: 0.4s; } /* Make all items stack at full width */ .layout-1 .columns-container { flex-direction: column; width: 94%; margin: 0 auto; } .layout-1 .column, .layout-1 .col-4, .layout-1 .col-3, .layout-1 .col-5 { width: 100% !important; margin-bottom: 30px; position: relative !important; left: 0 !important; top: 0 !important; align-self: flex-start !important; } .layout-1 .col-3 img { width: 100% !important; } .layout-1 .gallery-image.image3 { width: 100% !important; } /* Reset any absolute positioning */ .layout-1 .column.col-4 > * { position: relative !important; left: 0 !important; } /* Adjust font sizes for mobile */ .gallery-copy { /* font-size: 16px; margin: 20px auto !important; */ } /* Ensure all images are properly sized */ .gallery-image, .gallery-image > img { width: 100% !important; margin: 10px auto !important; } .gallery-section { width: 94%; padding: 2rem 0; } .gallery-section.layout-1 { margin-top: 30px; } } /* Base styles */ .gallery-section { width: 90%; max-width: 1400px; margin: 0 auto; padding: 2rem 0; } .columns-container { display: flex; gap: 24px; } .column { display: flex; flex-direction: column; gap: 24px; } .col-3 { width: 25%; } .col-4 { width: 33.333%; } .col-5 { width: 41.667%; } .gallery-image { width: 100%; position: relative; } .gallery-image img { width: 100%; height: auto; display: block; } /* Specific styles for layout 2 */ .layout-2 .stacked-images { display: flex; flex-direction: column; gap: 24px; } .layout-2 .image4 { margin-top: 0; } .layout-2 .gallery-image.image1 { width: 110%; padding-top: 40%; } .layout-2 .gallery-image.image2 { width: 120%; } .layout-2 .gallery-image.image3 { position: relative; top: -10%; } .layout-2 .gallery-image.image4 { margin-top: 20%; z-index: -1; } .gallery-section.layout-1 .gallery-copy { padding-right: 40px; } @media (max-width: 768px) { .columns-container { flex-direction: column; gap: 16px; } .column { width: 100% !important; gap: 16px; } .layout-2 .stacked-images { gap: 16px; } } /* Add new column widths for layout 3 */ .layout-3 .col-7 { width: 70%; } .gallery-section.layout-3 { margin-top: 14%; } /* Layout 3 specific styles */ .layout-3 .columns-container { display: flex; gap: 2rem; align-items: flex-start; } .layout-3 .gallery-image.image1 { width: 110%; position: relative; z-index: 2; } .layout-3 .gallery-image.image2 { width: 120%; position: relative; left: -20%; top: -160px; z-index: 2; } @media (max-width: 768px) { .layout-3 .columns-container { flex-direction: column; width: 94%; margin: 0 auto; gap: 16px; } .layout-3 .column { width: 100% !important; } .layout-3 .gallery-image.image1, .layout-3 .gallery-image.image2 { width: 100% !important; left: 0 !important; margin-top: 0 !important; } } /* Override animation styles for layout-1 */ .layout-1 .gallery-image { opacity: 1; transform: none; transition: none; } /* Mobile styles */ @media (max-width: 768px) { .layout-1 .gallery-image { position: relative !important; top: 0 !important; transform: none !important; transition: none !important; will-change: auto !important; } /* Replace scroll animations with pop-in on mobile */ .layout-1 .gallery-image img { opacity: 0; transform: scale(0.1); transition: opacity 0.8s ease, transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform-origin: center center; } .layout-1 .gallery-image.pop-in img { opacity: 1; transform: scale(1); } } .gallery-image video { width: 100%; height: 100%; object-fit: cover; border-radius: 20px; display: block; } @media (max-width: 768px) { .gallery-image video { width: 100% !important; margin: 10px auto !important; border-radius: 20px; } /* Inline | https://web.cemm.media/ */ .gallery-section.layout-1 { margin-bottom: 0px !important; } .gallery-section.layout-3 { padding-top: 0; margin-top: 0; } } </style> <div class="gallery-section layout-3"> <div class="columns-container"> <div class="column col-7"> <div class="gallery-image image1"> <video autoplay muted loop playsinline> <source src="/application/files/1317/4594/5453/ce-st-anywhere-ext-qr-pos-1.mp4" type="video/mp4"> </video> <div class="gallery-copy"><p><span class="heading">Full-Suite Media</span></p> <p>Our insight driven media plans are tailored to deliver tangible results and ROI. <span class="promo-link"><a href="https://web.cemm.media/index.php?cID=235">Learn More</a></span></p> </div> </div> </div> <div class="column col-5"> <div class="gallery-image image2"> <img src="/application/files/2217/4585/7974/SkyTrak_at_PGA_2024_ST_End_Wall_1080x1080.jpg" alt=""> <div class="gallery-copy"><p> </p> <p> </p> <p> <style type="text/css"><!--td {border: 1px solid #cccccc;}br {mso-data-placement:same-cell;}--> </style> </p> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Handle smooth movement for all layout-1 instances document.querySelectorAll('.layout-1').forEach(layout1 => { const image1 = layout1.querySelector('.image1'); const image2 = layout1.querySelector('.image2'); const image3 = layout1.querySelector('.image3'); if (image1 && image2 && image3) { // Define movement ranges for each image const image1Range = { start: -10, // Changed from -40 to -20 to start lower end: 10, // Keep end position property: 'top' }; const image2Range = { start: 30, // Keep the same end: -2, // Keep the same property: 'top' }; const image3Range = { start: -5, end: 10, property: 'top' }; // Set initial positions for this instance image1.style.position = 'relative'; image2.style.position = 'relative'; image3.style.position = 'relative'; image1.style.top = `${image1Range.start}vh`; image2.style.top = `${image2Range.start}vh`; image3.style.top = `${image3Range.start}vh`; // Add will-change to optimize performance image1.style.willChange = 'top'; image2.style.willChange = 'top'; image3.style.willChange = 'top'; // Create instance-specific scroll handler const handleScroll = () => { const rect = layout1.getBoundingClientRect(); const viewportHeight = window.innerHeight; // Calculate how far through the viewport the element is (0 to 1) const elementProgress = Math.min(Math.max( ((viewportHeight * 0.7) - rect.top) / (viewportHeight * 0.7), 0 ), 1); // Apply smooth transitions to each image in this instance [ { el: image1, range: image1Range }, { el: image2, range: image2Range }, { el: image3, range: image3Range } ].forEach(({ el, range }) => { const movement = range.start + (elementProgress * (range.end - range.start)); el.style.transition = `${range.property} 0.1s linear`; el.style[range.property] = `${movement}vh`; }); }; // Create instance-specific observer const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { window.addEventListener('scroll', handleScroll); handleScroll(); // Initial position } else { window.removeEventListener('scroll', handleScroll); } }); }, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }); // Start observing this specific layout instance observer.observe(layout1); } }); // Create an Intersection Observer to detect when elements come into view const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('animate'); // For layout sections, animate child images with different delays if (entry.target.classList.contains('layout-section-images')) { const images = entry.target.querySelectorAll('.layout-section-image'); images.forEach((image, index) => { setTimeout(() => { image.classList.add('animate'); }, 100 * index); // Reduced delay between images }); // Animate headline and copy with reduced delays const headline = entry.target.querySelector('.headline'); if (headline) { setTimeout(() => { headline.classList.add('animate'); }, 50); } const copy = entry.target.querySelector('.layout-section-copy'); if (copy) { setTimeout(() => { copy.classList.add('animate'); }, 100); } } } }); }, { threshold: 0.1, // Reduced threshold to trigger earlier rootMargin: '0px 0px -50px 0px' // Adjusted to trigger sooner }); // Observe all layout sections document.querySelectorAll('.layout-section-images').forEach(section => { observer.observe(section); }); // Add pop-in animation for mobile devices function isMobile() { return window.innerWidth <= 768; } // Mobile observer (keep existing code for pop-in animations) const mobileObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting && isMobile()) { entry.target.classList.add('pop-in'); } }); }, { threshold: 0.2, rootMargin: '0px 0px -50px 0px' }); // Observe all gallery images for mobile pop-in animation document.querySelectorAll('.gallery-image').forEach(image => { mobileObserver.observe(image); }); // Handle resize events let resizeTimeout; window.addEventListener('resize', () => { const scrollPosition = window.scrollY; clearTimeout(resizeTimeout); resizeTimeout = setTimeout(() => { if (isMobile()) { // Reset all animations on mobile document.querySelectorAll('.layout-1 .gallery-image').forEach(image => { image.style.position = ''; image.style.top = ''; image.style.willChange = ''; image.style.transition = ''; }); document.querySelectorAll('.gallery-image').forEach(image => { if (isElementInViewport(image)) { image.classList.add('pop-in'); } }); } window.scrollTo(0, scrollPosition); }, 100); }); // Helper function to check if an element is in the viewport function isElementInViewport(el) { const rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } }); </script> <style> /* Base styles */ .gallery-section { width: 90%; max-width: var(--max-width); margin: 0 auto; padding: 4rem 0; } .gallery-image img { width: 100%; height: auto; border-radius: 20px; display: block; } .gallery-copy { font-family: SaansTRIAL, sans-serif; font-size: 24px; line-height: 34px; margin-top: 10px; padding: 0 10px; } .layout-1 .column.col-3 .gallery-copy { width: 130%; box-sizing: border-box; } /* Layout 1 specific styles */ .layout-1 .columns-container { display: flex; gap: 2rem; align-items: flex-start; } .layout-1 .column { display: flex; flex-direction: column; } .layout-1 .col-4 { width: 33.333%; } .layout-1 .col-3 { width: 25%; } .layout-1 .col-5 { width: 41.667%; } .layout-1 .column.col-4 > * { position: relative; left: 10%; } .layout-1 .col-3 { width: 25%; align-self: flex-end; } .layout-1 .col-4 img { z-index: 3; position: relative; } .layout-1 .col-3 img { width: 130%; z-index: 2; position: relative; } .layout-1 .col-5 { width: 41.667%; position: relative; top: -60px; } .layout-1 .gallery-image.image3 { width: 80%; } .gallery-section.layout-1 { margin: 60px auto 120px; } .layout-1 .image3 .gallery-copy { padding-left: 20%; } /* Mobile styles - disable animations and stack items */ @media (max-width: 768px) { /* Replace the disabled animations with pop-in animation */ .gallery-image img { opacity: 0; transform: scale(0.1); transition: opacity 0.8s ease, transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform-origin: center center; } .gallery-image.pop-in img { opacity: 1; transform: scale(1); } /* Add a slight delay for staggered animations */ .gallery-image:nth-child(1) { transition-delay: 0.1s; } .gallery-image:nth-child(2) { transition-delay: 0.2s; } .gallery-image:nth-child(3) { transition-delay: 0.3s; } .gallery-image:nth-child(4) { transition-delay: 0.4s; } /* Make all items stack at full width */ .layout-1 .columns-container { flex-direction: column; width: 94%; margin: 0 auto; } .layout-1 .column, .layout-1 .col-4, .layout-1 .col-3, .layout-1 .col-5 { width: 100% !important; margin-bottom: 30px; position: relative !important; left: 0 !important; top: 0 !important; align-self: flex-start !important; } .layout-1 .col-3 img { width: 100% !important; } .layout-1 .gallery-image.image3 { width: 100% !important; } /* Reset any absolute positioning */ .layout-1 .column.col-4 > * { position: relative !important; left: 0 !important; } /* Adjust font sizes for mobile */ .gallery-copy { /* font-size: 16px; margin: 20px auto !important; */ } /* Ensure all images are properly sized */ .gallery-image, .gallery-image > img { width: 100% !important; margin: 10px auto !important; } .gallery-section { width: 94%; padding: 2rem 0; } .gallery-section.layout-1 { margin-top: 30px; } } /* Base styles */ .gallery-section { width: 90%; max-width: 1400px; margin: 0 auto; padding: 2rem 0; } .columns-container { display: flex; gap: 24px; } .column { display: flex; flex-direction: column; gap: 24px; } .col-3 { width: 25%; } .col-4 { width: 33.333%; } .col-5 { width: 41.667%; } .gallery-image { width: 100%; position: relative; } .gallery-image img { width: 100%; height: auto; display: block; } /* Specific styles for layout 2 */ .layout-2 .stacked-images { display: flex; flex-direction: column; gap: 24px; } .layout-2 .image4 { margin-top: 0; } .layout-2 .gallery-image.image1 { width: 110%; padding-top: 40%; } .layout-2 .gallery-image.image2 { width: 120%; } .layout-2 .gallery-image.image3 { position: relative; top: -10%; } .layout-2 .gallery-image.image4 { margin-top: 20%; z-index: -1; } .gallery-section.layout-1 .gallery-copy { padding-right: 40px; } @media (max-width: 768px) { .columns-container { flex-direction: column; gap: 16px; } .column { width: 100% !important; gap: 16px; } .layout-2 .stacked-images { gap: 16px; } } /* Add new column widths for layout 3 */ .layout-3 .col-7 { width: 70%; } .gallery-section.layout-3 { margin-top: 14%; } /* Layout 3 specific styles */ .layout-3 .columns-container { display: flex; gap: 2rem; align-items: flex-start; } .layout-3 .gallery-image.image1 { width: 110%; position: relative; z-index: 2; } .layout-3 .gallery-image.image2 { width: 120%; position: relative; left: -20%; top: -160px; z-index: 2; } @media (max-width: 768px) { .layout-3 .columns-container { flex-direction: column; width: 94%; margin: 0 auto; gap: 16px; } .layout-3 .column { width: 100% !important; } .layout-3 .gallery-image.image1, .layout-3 .gallery-image.image2 { width: 100% !important; left: 0 !important; margin-top: 0 !important; } } /* Override animation styles for layout-1 */ .layout-1 .gallery-image { opacity: 1; transform: none; transition: none; } /* Mobile styles */ @media (max-width: 768px) { .layout-1 .gallery-image { position: relative !important; top: 0 !important; transform: none !important; transition: none !important; will-change: auto !important; } /* Replace scroll animations with pop-in on mobile */ .layout-1 .gallery-image img { opacity: 0; transform: scale(0.1); transition: opacity 0.8s ease, transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform-origin: center center; } .layout-1 .gallery-image.pop-in img { opacity: 1; transform: scale(1); } } .gallery-image video { width: 100%; height: 100%; object-fit: cover; border-radius: 20px; display: block; } @media (max-width: 768px) { .gallery-image video { width: 100% !important; margin: 10px auto !important; border-radius: 20px; } /* Inline | https://web.cemm.media/ */ .gallery-section.layout-1 { margin-bottom: 0px !important; } .gallery-section.layout-3 { padding-top: 0; margin-top: 0; } } </style> <div class="cemm-content-block" data-logoColor="#000000"><h2>We help define, create, and bring your brand to life.</h2> </div> <div class="gallery-section layout-1"> <div class="columns-container"> <div class="column col-4"> <div class="gallery-image image1"> <img src="/application/files/3017/4560/4458/4_plus_Chi.jpg" alt=""> <div class="gallery-copy"><p><span class="heading">Commerce-Driving Shopper</span></p> <p>We create sales driving shopper marketing plans across retail channels. Learn about our <span class="promo-link"><a href="https://web.cemm.media/index.php?cID=241">S</a><a href="https://web.cemm.media/index.php?cID=242">hopper Marketing</a></span></p> </div> </div> </div> <div class="column col-3"> <div class="gallery-image image2"> <img src="/application/files/6517/4603/6902/ling-ling-AI-character.png" alt=""> </div> </div> <div class="column col-5"> <div class="gallery-image image3"> <img src="/application/files/4717/4549/7684/food.jpg" alt=""> <div class="gallery-copy"><p><span class="heading">Analyzing to Optimize</span></p> <p>Ensuring results is in our DNA as a company. Comprehensive analysis and optimization comes with every program we manage.</p> </div> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Handle smooth movement for all layout-1 instances document.querySelectorAll('.layout-1').forEach(layout1 => { const image1 = layout1.querySelector('.image1'); const image2 = layout1.querySelector('.image2'); const image3 = layout1.querySelector('.image3'); if (image1 && image2 && image3) { // Define movement ranges for each image const image1Range = { start: -10, // Changed from -40 to -20 to start lower end: 10, // Keep end position property: 'top' }; const image2Range = { start: 30, // Keep the same end: -2, // Keep the same property: 'top' }; const image3Range = { start: -5, end: 10, property: 'top' }; // Set initial positions for this instance image1.style.position = 'relative'; image2.style.position = 'relative'; image3.style.position = 'relative'; image1.style.top = `${image1Range.start}vh`; image2.style.top = `${image2Range.start}vh`; image3.style.top = `${image3Range.start}vh`; // Add will-change to optimize performance image1.style.willChange = 'top'; image2.style.willChange = 'top'; image3.style.willChange = 'top'; // Create instance-specific scroll handler const handleScroll = () => { const rect = layout1.getBoundingClientRect(); const viewportHeight = window.innerHeight; // Calculate how far through the viewport the element is (0 to 1) const elementProgress = Math.min(Math.max( ((viewportHeight * 0.7) - rect.top) / (viewportHeight * 0.7), 0 ), 1); // Apply smooth transitions to each image in this instance [ { el: image1, range: image1Range }, { el: image2, range: image2Range }, { el: image3, range: image3Range } ].forEach(({ el, range }) => { const movement = range.start + (elementProgress * (range.end - range.start)); el.style.transition = `${range.property} 0.1s linear`; el.style[range.property] = `${movement}vh`; }); }; // Create instance-specific observer const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { window.addEventListener('scroll', handleScroll); handleScroll(); // Initial position } else { window.removeEventListener('scroll', handleScroll); } }); }, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }); // Start observing this specific layout instance observer.observe(layout1); } }); // Create an Intersection Observer to detect when elements come into view const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('animate'); // For layout sections, animate child images with different delays if (entry.target.classList.contains('layout-section-images')) { const images = entry.target.querySelectorAll('.layout-section-image'); images.forEach((image, index) => { setTimeout(() => { image.classList.add('animate'); }, 100 * index); // Reduced delay between images }); // Animate headline and copy with reduced delays const headline = entry.target.querySelector('.headline'); if (headline) { setTimeout(() => { headline.classList.add('animate'); }, 50); } const copy = entry.target.querySelector('.layout-section-copy'); if (copy) { setTimeout(() => { copy.classList.add('animate'); }, 100); } } } }); }, { threshold: 0.1, // Reduced threshold to trigger earlier rootMargin: '0px 0px -50px 0px' // Adjusted to trigger sooner }); // Observe all layout sections document.querySelectorAll('.layout-section-images').forEach(section => { observer.observe(section); }); // Add pop-in animation for mobile devices function isMobile() { return window.innerWidth <= 768; } // Mobile observer (keep existing code for pop-in animations) const mobileObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting && isMobile()) { entry.target.classList.add('pop-in'); } }); }, { threshold: 0.2, rootMargin: '0px 0px -50px 0px' }); // Observe all gallery images for mobile pop-in animation document.querySelectorAll('.gallery-image').forEach(image => { mobileObserver.observe(image); }); // Handle resize events let resizeTimeout; window.addEventListener('resize', () => { const scrollPosition = window.scrollY; clearTimeout(resizeTimeout); resizeTimeout = setTimeout(() => { if (isMobile()) { // Reset all animations on mobile document.querySelectorAll('.layout-1 .gallery-image').forEach(image => { image.style.position = ''; image.style.top = ''; image.style.willChange = ''; image.style.transition = ''; }); document.querySelectorAll('.gallery-image').forEach(image => { if (isElementInViewport(image)) { image.classList.add('pop-in'); } }); } window.scrollTo(0, scrollPosition); }, 100); }); // Helper function to check if an element is in the viewport function isElementInViewport(el) { const rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth) ); } }); </script> <style> /* Base styles */ .gallery-section { width: 90%; max-width: var(--max-width); margin: 0 auto; padding: 4rem 0; } .gallery-image img { width: 100%; height: auto; border-radius: 20px; display: block; } .gallery-copy { font-family: SaansTRIAL, sans-serif; font-size: 24px; line-height: 34px; margin-top: 10px; padding: 0 10px; } .layout-1 .column.col-3 .gallery-copy { width: 130%; box-sizing: border-box; } /* Layout 1 specific styles */ .layout-1 .columns-container { display: flex; gap: 2rem; align-items: flex-start; } .layout-1 .column { display: flex; flex-direction: column; } .layout-1 .col-4 { width: 33.333%; } .layout-1 .col-3 { width: 25%; } .layout-1 .col-5 { width: 41.667%; } .layout-1 .column.col-4 > * { position: relative; left: 10%; } .layout-1 .col-3 { width: 25%; align-self: flex-end; } .layout-1 .col-4 img { z-index: 3; position: relative; } .layout-1 .col-3 img { width: 130%; z-index: 2; position: relative; } .layout-1 .col-5 { width: 41.667%; position: relative; top: -60px; } .layout-1 .gallery-image.image3 { width: 80%; } .gallery-section.layout-1 { margin: 60px auto 120px; } .layout-1 .image3 .gallery-copy { padding-left: 20%; } /* Mobile styles - disable animations and stack items */ @media (max-width: 768px) { /* Replace the disabled animations with pop-in animation */ .gallery-image img { opacity: 0; transform: scale(0.1); transition: opacity 0.8s ease, transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform-origin: center center; } .gallery-image.pop-in img { opacity: 1; transform: scale(1); } /* Add a slight delay for staggered animations */ .gallery-image:nth-child(1) { transition-delay: 0.1s; } .gallery-image:nth-child(2) { transition-delay: 0.2s; } .gallery-image:nth-child(3) { transition-delay: 0.3s; } .gallery-image:nth-child(4) { transition-delay: 0.4s; } /* Make all items stack at full width */ .layout-1 .columns-container { flex-direction: column; width: 94%; margin: 0 auto; } .layout-1 .column, .layout-1 .col-4, .layout-1 .col-3, .layout-1 .col-5 { width: 100% !important; margin-bottom: 30px; position: relative !important; left: 0 !important; top: 0 !important; align-self: flex-start !important; } .layout-1 .col-3 img { width: 100% !important; } .layout-1 .gallery-image.image3 { width: 100% !important; } /* Reset any absolute positioning */ .layout-1 .column.col-4 > * { position: relative !important; left: 0 !important; } /* Adjust font sizes for mobile */ .gallery-copy { /* font-size: 16px; margin: 20px auto !important; */ } /* Ensure all images are properly sized */ .gallery-image, .gallery-image > img { width: 100% !important; margin: 10px auto !important; } .gallery-section { width: 94%; padding: 2rem 0; } .gallery-section.layout-1 { margin-top: 30px; } } /* Base styles */ .gallery-section { width: 90%; max-width: 1400px; margin: 0 auto; padding: 2rem 0; } .columns-container { display: flex; gap: 24px; } .column { display: flex; flex-direction: column; gap: 24px; } .col-3 { width: 25%; } .col-4 { width: 33.333%; } .col-5 { width: 41.667%; } .gallery-image { width: 100%; position: relative; } .gallery-image img { width: 100%; height: auto; display: block; } /* Specific styles for layout 2 */ .layout-2 .stacked-images { display: flex; flex-direction: column; gap: 24px; } .layout-2 .image4 { margin-top: 0; } .layout-2 .gallery-image.image1 { width: 110%; padding-top: 40%; } .layout-2 .gallery-image.image2 { width: 120%; } .layout-2 .gallery-image.image3 { position: relative; top: -10%; } .layout-2 .gallery-image.image4 { margin-top: 20%; z-index: -1; } .gallery-section.layout-1 .gallery-copy { padding-right: 40px; } @media (max-width: 768px) { .columns-container { flex-direction: column; gap: 16px; } .column { width: 100% !important; gap: 16px; } .layout-2 .stacked-images { gap: 16px; } } /* Add new column widths for layout 3 */ .layout-3 .col-7 { width: 70%; } .gallery-section.layout-3 { margin-top: 14%; } /* Layout 3 specific styles */ .layout-3 .columns-container { display: flex; gap: 2rem; align-items: flex-start; } .layout-3 .gallery-image.image1 { width: 110%; position: relative; z-index: 2; } .layout-3 .gallery-image.image2 { width: 120%; position: relative; left: -20%; top: -160px; z-index: 2; } @media (max-width: 768px) { .layout-3 .columns-container { flex-direction: column; width: 94%; margin: 0 auto; gap: 16px; } .layout-3 .column { width: 100% !important; } .layout-3 .gallery-image.image1, .layout-3 .gallery-image.image2 { width: 100% !important; left: 0 !important; margin-top: 0 !important; } } /* Override animation styles for layout-1 */ .layout-1 .gallery-image { opacity: 1; transform: none; transition: none; } /* Mobile styles */ @media (max-width: 768px) { .layout-1 .gallery-image { position: relative !important; top: 0 !important; transform: none !important; transition: none !important; will-change: auto !important; } /* Replace scroll animations with pop-in on mobile */ .layout-1 .gallery-image img { opacity: 0; transform: scale(0.1); transition: opacity 0.8s ease, transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform-origin: center center; } .layout-1 .gallery-image.pop-in img { opacity: 1; transform: scale(1); } } .gallery-image video { width: 100%; height: 100%; object-fit: cover; border-radius: 20px; display: block; } @media (max-width: 768px) { .gallery-image video { width: 100% !important; margin: 10px auto !important; border-radius: 20px; } /* Inline | https://web.cemm.media/ */ .gallery-section.layout-1 { margin-bottom: 0px !important; } .gallery-section.layout-3 { padding-top: 0; margin-top: 0; } } </style> <div class="gridimage" data-logoColor="rgb(255, 255, 255)"> <img src="/application/files/9017/4648/1894/CE_Website_LogosPage-3.jpg"> <div class="gridimage-copy"> </div> </div> </div> </div> <footer> <div class="footer-content-top"> <div class="footer-content-left"> <div class="cemm-content-block" data-logoColor="#000000"><svg id="Layer_1" style="width:60px;height:60px" version="1.1" viewbox="0 0 145 145" xmlns="http://www.w3.org/2000/svg"><defs> <style type="text/css">.st0 { fill: #ffffff; } </style> </defs> <path class="st0" d="M88,34.2c-17.08-2.97-33.6,4.85-42.12,20.41-1.05,1.92-1.9,3.94-2.52,6.03-5.54,18.57,2.28,37.3,19.45,46.54,1.92,1.03,3.95,1.87,6.04,2.48,14.73,4.34,29.57.48,39.78-9.64,1.24-1.22,2.38-2.52,3.42-3.87l21.97,21.78c-1.13,1.29-2.3,2.55-3.53,3.76-6.44,6.39-13.95,11.4-22.3,14.9-8.66,3.63-17.86,5.47-27.32,5.47s-18.66-1.84-27.32-5.47c-8.36-3.51-15.86-8.52-22.31-14.9-6.44-6.38-11.5-13.82-15.03-22.11-3.66-8.59-5.52-17.7-5.52-27.09s1.86-18.5,5.52-27.09c3.54-8.29,8.59-15.73,15.03-22.11,6.44-6.39,13.95-11.4,22.31-14.91,8.66-3.63,17.86-5.47,27.32-5.47s18.66,1.84,27.32,5.47c8.36,3.51,15.86,8.52,22.3,14.91,1.23,1.22,2.4,2.47,3.53,3.76l-21.97,21.78c-2.66-3.43-5.94-6.49-9.79-9.02-4.31-2.83-9.16-4.74-14.26-5.63M102.79,86.6h-43.95v-28.21h43.95v28.21Z"></path> </svg> <p> </p> <p>118 South Main St<br /> Templeton, CA 93465</p> </div> </div> <div class="footer-content-right"> <div class="footer-content-right-wrapper"> <div class="cemm-content-block" data-logoColor="#000000"><p><a href="https://www.facebook.com/compedgemedia" target="_blank">Facebook</a></p> <p><a href="https://www.linkedin.com/company/competitive-edge-media-management-inc-" target="_blank">LinkedIn</a></p> </div> </div> </div> </div> <div class="footer-content-bottom"> <div>Copyright © 2025 Competitive Edge, Inc. All rights reserved.</div> <div class="footer-content-bottom-links"> <a href="/privacy">Privacy Policy</a> <a href="/terms-use">Terms of Use</a> </div> </div> </footer> <script type="text/javascript" src="/concrete/js/features/navigation/frontend.js?ccm_nocache=c203874f7d5a8cae09b7b1a8553930e592d6a839"></script> <script type="text/javascript" src="/concrete/js/features/imagery/frontend.js?ccm_nocache=c203874f7d5a8cae09b7b1a8553930e592d6a839"></script> </body> </html>