.fusion-page-title-bar,.fusion-page-title-row,.avada-page-titlebar-wrapper{display:none!important}.fbody .gform_wrapper{margin:0!important} .fbody .gform_wrapper .gfield_label,.fbody .gform_wrapper .gchoice label,.fbody .gform_wrapper legend,.fbody .gform_wrapper label,.fbody .gform_wrapper .gform-field-label{color:#0c0c0c!important;font-weight:600!important;opacity:1!important} .fbody .gform_wrapper input[type="text"],.fbody .gform_wrapper input[type="email"],.fbody .gform_wrapper input[type="tel"],.fbody .gform_wrapper input[type="number"],.fbody .gform_wrapper textarea,.fbody .gform_wrapper select{width:100%!important;background:#fff!important;border:1px solid #e2e2e2!important;border-radius:10px!important;padding:13px 14px!important;font-size:16px!important;color:#0c0c0c!important;box-shadow:none!important} .fbody .gform_wrapper textarea{min-height:96px!important} .fbody .gform_wrapper .gfield_checkbox{display:flex!important;flex-wrap:wrap!important;gap:9px 16px!important} .fbody .gform_wrapper .gfield_checkbox .gchoice{display:flex!important;align-items:center!important;gap:7px!important;margin:0!important} .fbody .gform_wrapper .gfield_checkbox input[type="checkbox"]{width:18px!important;height:18px!important;accent-color:var(--orange,#ff6700)!important;margin:0!important} .fbody .gform_wrapper .gform_footer{padding:14px 0 0!important;margin:0!important} .fbody .gform_wrapper .gform_button,.fbody .gform_wrapper .gform_next_button,.fbody .gform_wrapper .gform_previous_button{background:var(--orange,#ff6700)!important;color:#fff!important;border:none!important;border-radius:999px!important;padding:15px 28px!important;font-weight:700!important;font-size:16px!important;width:100%!important;cursor:pointer!important;text-transform:none!important} .fbody .gform_wrapper .gform_button:hover,.fbody .gform_wrapper .gform_next_button:hover,.fbody .gform_wrapper .gform_previous_button:hover{background:var(--orange-dk,#e55a00)!important}.fbody .gform_wrapper .gform_previous_button{background:transparent!important;color:var(--orange,#ff6700)!important;border:2px solid var(--orange,#ff6700)!important}.fbody .gform_wrapper .gform_previous_button:hover{background:#fff3e8!important}.fbody .gform_wrapper .gform_page_footer{display:flex!important;gap:12px!important;align-items:center!important}.fbody .gform_wrapper .gform_page_footer .gform_button,.fbody .gform_wrapper .gform_page_footer .gform_next_button,.fbody .gform_wrapper .gform_page_footer .gform_previous_button{min-height:48px!important} .fbody .gform_wrapper .gfield{margin-bottom:14px!important} .fbody .gform_wrapper .gform_required_legend{display:none!important} *,*::before,*::after{box-sizing:border-box;margin:0;padding:0} :root{ --orange:#ff6700; --orange-dk:#e55a00; --ink:#211f1c; --body:#3a3a38; --muted:#6b6b68; --offwhite:#f6f3ef; --line:#e4e1db; --white:#fff; --max:1200px; --fHead:'Montserrat',Arial,sans-serif; --fBody:'Roboto',Arial,sans-serif; } body{background:var(--white);color:var(--body);font-family:var(--fBody);font-size:18px;line-height:1.6;-webkit-font-smoothing:antialiased} a{color:var(--orange);text-decoration:none} a:hover{text-decoration:underline} .wrap{max-width:var(--max);margin:0 auto;padding:0 40px} .o{color:var(--orange)} /* orange keyword highlight */ @media(max-width:820px){.wrap{padding:0 22px}} /* ---------- Top trust bar ---------- */ .trustbar{background:var(--ink);color:#fff;font-size:13.5px} .trustbar .wrap{display:flex;gap:26px;align-items:center;justify-content:center;flex-wrap:wrap;padding:9px 40px} .trustbar span{display:inline-flex;align-items:center;gap:7px;white-space:nowrap} .trustbar .ic{color:var(--orange);font-size:14px} @media(max-width:820px){.trustbar{display:none}} /* ---------- Header ---------- */ .head{background:var(--ink);border-bottom:1px solid rgba(255,255,255,.08);position:sticky;top:0;z-index:50} .head .wrap{display:flex;align-items:center;justify-content:space-between;padding:14px 40px} .head .logo{height:54px;display:block} .nav{display:flex;align-items:center;gap:30px} .nav a.link{color:#fff;font-family:var(--fHead);font-weight:600;font-size:15px;text-transform:capitalize} .nav a.link:hover{color:var(--orange);text-decoration:none} .btn{display:inline-flex;align-items:center;gap:8px;font-family:var(--fHead);font-weight:700;font-size:15px;border-radius:999px;padding:11px 22px;cursor:pointer;transition:.18s;white-space:nowrap} .btn-o{background:var(--orange);color:#fff;border:2px solid var(--orange)} .btn-o:hover{background:var(--orange-dk);border-color:var(--orange-dk);text-decoration:none} .btn-ghost{background:transparent;color:#fff;border:2px solid rgba(255,255,255,.5)} .btn-ghost:hover{background:#fff;color:var(--ink);text-decoration:none} .btn-dk{background:var(--ink);color:#fff;border:2px solid var(--ink)} .btn-dk:hover{background:#000;text-decoration:none} @media(max-width:980px){.nav .link{display:none}} /* ---------- Title bar hero ---------- */ .titlebar{position:relative;background:#141210} .titlebar .wrap{padding:54px 40px 46px}/* KC titlebar v3 2026-08-04: clean, Wichita-structured, one CTA */.titlebar .wrap{max-width:1180px;margin:0 auto;padding:72px 24px 56px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:24px}.titlebar h1{max-width:900px;margin:0}.titlebar .tb-cta{min-height:52px;padding:14px 30px;font-size:17px;box-shadow:0 6px 20px rgba(255,103,0,.28)}.titlebar .tb-cta:hover{background:var(--orange-dk,#e55a00);border-color:var(--orange-dk,#e55a00);transform:translateY(-1px)}.titlebar .crumb{margin:0;color:rgba(255,255,255,.82);font-size:14px}.titlebar .crumb a{color:#fff;text-decoration:none;display:inline-block;padding:7px 2px}.titlebar .crumb a:hover{color:var(--orange,#ff6700)}.titlebar .crumb .sep{margin:0 8px;opacity:.6}@media(max-width:768px){.titlebar .wrap{padding:48px 20px 40px;gap:18px}}@media(max-width:480px){.titlebar .wrap{padding:40px 16px 32px}.titlebar .tb-cta{width:100%;justify-content:center}.titlebar .crumb{font-size:13px}} .titlebar .badge{display:inline-flex;align-items:center;gap:7px;background:var(--orange);color:#fff;font-family:var(--fHead);font-weight:700;font-size:13px;letter-spacing:.3px;padding:6px 14px;border-radius:999px;margin-bottom:16px} .titlebar h1{font-family:var(--fHead);font-weight:800;color:#fff;font-size:clamp(30px,4.4vw,52px);line-height:1.1;max-width:880px;letter-spacing:-.5px} .crumb{margin-top:16px;font-size:14.5px;color:rgba(255,255,255,.75)} .crumb a{color:var(--orange)} .crumb .sep{margin:0 9px;color:rgba(255,255,255,.4)} /* ---------- Body two-column ---------- */ .main{padding:56px 0 10px} .grid{display:grid;grid-template-columns:1fr 400px;gap:56px;align-items:start} @media(max-width:980px){.grid{grid-template-columns:1fr;gap:40px}} .article h2{font-family:var(--fHead);font-weight:700;color:var(--ink);font-size:clamp(23px,2.6vw,31px);line-height:1.18;margin:42px 0 8px;letter-spacing:-.3px} .article h2:first-of-type{margin-top:0} .article h2::after{content:"";display:block;width:54px;height:4px;background:var(--orange);border-radius:3px;margin-top:14px;margin-bottom:20px} .article h3{font-family:var(--fHead);font-weight:700;color:var(--ink);font-size:19px;margin:26px 0 9px} .article p{margin-bottom:17px;color:var(--body)} .article ul{list-style:none;margin:6px 0 22px} .article ul li{position:relative;padding-left:30px;margin-bottom:11px;color:var(--body)} .article ul li::before{content:"\2713";position:absolute;left:0;top:1px;color:var(--orange);font-weight:800} .lead{font-size:20px;color:var(--ink);font-weight:500;line-height:1.55} /* local pressure callout */ .pressure{background:var(--offwhite);border-left:5px solid var(--orange);border-radius:0 8px 8px 0;padding:22px 26px;margin:26px 0 30px} .pressure .k{font-family:var(--fHead);font-weight:700;color:var(--ink);font-size:14px;letter-spacing:.4px;text-transform:uppercase;margin-bottom:8px} .pressure p{margin:0;font-size:17.5px;color:var(--body)} /* signs grid — interactive hover cards (reuses the .pest hover system) */ .scan{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:8px 0 30px} @media(max-width:520px){.scan{grid-template-columns:1fr 1fr}} .pest{position:relative;outline:none} .pest-chip{ background:#fff;border:1px solid var(--line);border-radius:10px;padding:14px 16px; font-family:var(--fHead);font-weight:600;color:var(--ink);font-size:15px; display:flex;align-items:center;gap:9px;cursor:pointer; transition:border-color .18s,box-shadow .18s,transform .18s; } .pest-chip .d{width:9px;height:9px;border-radius:50%;background:var(--orange);flex-shrink:0;transition:transform .18s;margin-top:3px;align-self:flex-start} .pest:hover .pest-chip,.pest:focus-within .pest-chip{ border-color:var(--orange);box-shadow:0 6px 18px rgba(255,103,0,.18);transform:translateY(-2px); } .pest:hover .pest-chip .d,.pest:focus-within .pest-chip .d{transform:scale(1.6)} .pest-card{ position:absolute;bottom:calc(100% + 14px);left:50%; transform:translateX(-50%) translateY(8px) scale(.97); width:300px;max-width:84vw;background:var(--ink);color:#fff;border-radius:14px; border:1px solid rgba(255,255,255,.08);box-shadow:0 18px 50px rgba(20,18,16,.45); padding:18px;z-index:30; opacity:0;visibility:hidden;pointer-events:none; transition:opacity .2s ease .14s,transform .2s ease .14s,visibility .2s .14s; } .pest-card::before{content:"";position:absolute;top:100%;left:0;right:0;height:24px} .pest:hover .pest-card,.pest:focus-within .pest-card{ opacity:1;visibility:visible;pointer-events:auto;transition-delay:0s; transform:translateX(-50%) translateY(0) scale(1); } .pest-card::after{ content:"";position:absolute;top:100%;left:50%;transform:translateX(-50%); border:9px solid transparent;border-top-color:var(--ink); } .pc-name{font-family:var(--fHead);font-weight:700;font-size:17px;color:#fff;margin-bottom:6px} .pest-card p{font-size:13.5px;line-height:1.5;color:#d9d6d2;margin:0} .pest:nth-child(3n+1) .pest-card{left:0;transform:translateX(0) translateY(8px) scale(.97)} .pest:nth-child(3n+1):hover .pest-card,.pest:nth-child(3n+1):focus-within .pest-card{transform:translateX(0) translateY(0) scale(1)} .pest:nth-child(3n+1) .pest-card::after{left:38px} .pest:nth-child(3n) .pest-card{left:auto;right:0;transform:translateX(0) translateY(8px) scale(.97)} .pest:nth-child(3n):hover .pest-card,.pest:nth-child(3n):focus-within .pest-card{transform:translateX(0) translateY(0) scale(1)} .pest:nth-child(3n) .pest-card::after{left:auto;right:38px;transform:none} @media(max-width:640px){ .pest-card, .pest:nth-child(3n+1) .pest-card, .pest:nth-child(3n) .pest-card{ position:fixed;left:14px;right:14px;bottom:90px;top:auto; width:auto;max-width:none;z-index:250; transform:translateY(16px) scale(.99); } .pest:focus-within .pest-card, .pest:nth-child(3n+1):focus-within .pest-card, .pest:nth-child(3n):focus-within .pest-card{transform:translateY(0) scale(1)} .pest-card::after,.pest-card::before{display:none} } /* numbered process steps */ .steps{list-style:none;counter-reset:step;margin:8px 0 30px;padding:0} .steps li{position:relative;padding:0 0 22px 64px;margin:0} .steps li::before{ counter-increment:step;content:counter(step); position:absolute;left:0;top:0;width:44px;height:44px;border-radius:50%; background:var(--orange);color:#fff;font-family:var(--fHead);font-weight:800;font-size:19px; display:flex;align-items:center;justify-content:center; } .steps li::after{content:"";position:absolute;left:21px;top:44px;bottom:-4px;width:2px;background:var(--line)} .steps li:last-child::after{display:none} .steps .st{font-family:var(--fHead);font-weight:700;color:var(--ink);font-size:18px;margin-bottom:4px;display:block;padding-top:9px} .steps p{margin:0;color:var(--body);font-size:16.5px} /* inline CTA */ .cta-card{background:var(--ink);border-radius:12px;padding:28px 30px;margin:34px 0;display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap} .cta-card p{margin:0;color:#fff;font-family:var(--fHead);font-weight:600;font-size:20px} .cta-card p .o{color:var(--orange)} /* membership card */ .club{background:var(--offwhite);border:1px solid var(--line);border-radius:14px;padding:28px 30px;margin:30px 0} .club .ce{font-family:var(--fHead);font-weight:700;color:var(--orange);font-size:12px;letter-spacing:1.2px;text-transform:uppercase;margin-bottom:8px} .club h3{font-family:var(--fHead);font-weight:800;color:var(--ink);font-size:23px;margin:0 0 12px} .club p{margin:0 0 14px;color:var(--body)} .club ul{margin:0} /* FAQ */ .faq-shell{position:relative;margin:34px 0 40px;padding:10px;background:#f6f3ef;border:1px solid #d5cec6;border-top:3px solid #ff6700;border-radius:0 0 2px 2px;box-shadow:0 22px 55px -18px rgba(0,0,0,.5);overflow:hidden} .faq-shell::before{content:"";position:absolute;top:8px;right:8px;bottom:8px;left:8px;border:1px solid rgba(33,31,28,.10);pointer-events:none;z-index:1} .faq-head{position:relative;z-index:2;padding:20px 20px 0} .faq-kicker{font-family:var(--fHead);font-weight:800;color:#b34700;font-size:11px;letter-spacing:1.4px;text-transform:uppercase;margin-bottom:10px} .faq-shell h2{margin:0 0 8px;font-family:var(--fHead);font-weight:800;color:#211f1c;font-size:clamp(24px,3vw,34px);line-height:1.12;letter-spacing:-.02em} .faq-intro{margin:0 0 30px;color:#5f5d59;font-size:16px;line-height:1.55;max-width:52ch} .faq-shell .faq{position:relative;z-index:2;margin:0;background:#fff;border:0;border-radius:0;overflow:hidden} .faq-shell .faq details{border-top:1px solid rgba(255,103,0,.55);transition:background-color .18s ease} .faq-shell .faq details:last-child{border-bottom:1px solid rgba(255,103,0,.55)} .faq-shell .faq details:hover{background:#fbf8f4} .faq-shell .faq summary{list-style:none;cursor:pointer;position:relative;min-height:48px;padding:20px 62px 20px 20px;font-family:var(--fHead);font-weight:700;color:#211f1c;font-size:18px;line-height:1.35;display:block} .faq-shell .faq summary::-webkit-details-marker{display:none} .faq-shell .faq summary::after{content:"";position:absolute;top:50%;right:20px;width:26px;height:26px;transform:translateY(-50%);border:1px solid rgba(33,31,28,.22);border-radius:2px;background-image:linear-gradient(#d95700,#d95700),linear-gradient(#d95700,#d95700);background-repeat:no-repeat;background-position:center center,center center;background-size:11px 2px,2px 11px;transition:border-color .18s ease,background-size .18s ease} .faq-shell .faq details[open] summary::after{background-size:11px 2px,2px 0;border-color:rgba(255,103,0,.75)} .faq-shell .faq details:hover summary::after{border-color:rgba(255,103,0,.6)} .faq-shell .faq summary:focus-visible{outline:3px solid #d95700;outline-offset:-3px} .faq-shell .faq details p{padding:0 20px 26px;margin:0;color:#3a3a38;font-size:16px;line-height:1.6;max-width:68ch} @media(max-width:640px){.faq-shell{margin:28px 0 34px;border-radius:0 0 2px 2px}.faq-shell::before{top:6px;right:6px;bottom:6px;left:6px}.faq-head{padding:16px 14px 0}.faq-intro{margin-bottom:24px}.faq-shell .faq summary{padding:18px 48px 18px 14px;font-size:16px}.faq-shell .faq summary::after{right:14px;width:22px;height:22px;background-size:9px 2px,2px 9px}.faq-shell .faq details[open] summary::after{background-size:9px 2px,2px 0}.faq-shell .faq details p{padding:0 14px 22px;font-size:15.5px}} @media(prefers-reduced-motion:reduce){.faq-shell .faq details,.faq-shell .faq summary::after{transition:none}} body .main .article .wrap ul li a{color:#b34700;text-decoration:underline;text-underline-offset:2px} body .main .article p a{color:#b34700;text-decoration:underline;text-underline-offset:2px} body .main .article .nap a{color:#b34700;text-decoration:underline;text-underline-offset:2px} body .main .article div.sa-kick{color:#b34700} body .main .article div.ce{color:#b34700} .faq-shell .faq details p a{color:#b34700;text-decoration:underline;text-underline-offset:2px} .faq-shell .faq details p a:hover{color:#a83f00} /* NAP */ .nap{background:var(--offwhite);border-radius:10px;padding:22px 26px;margin:34px 0;font-size:16px;line-height:1.8} .nap strong{display:block;font-family:var(--fHead);font-size:17px;color:var(--ink);margin-bottom:4px} .compliance{font-size:12.5px;color:var(--muted);line-height:1.5;margin:22px 0 0;padding-top:16px;border-top:1px solid var(--line)} /* ---------- Sidebar form ---------- */ .formcard{background:#fff;border:1px solid var(--line);border-radius:14px;box-shadow:0 8px 30px rgba(33,31,28,.07);position:sticky;top:96px;overflow:hidden} .formcard .ftop{background:var(--ink);padding:22px 24px 20px;position:relative} .formcard .ftop::before{content:"";position:absolute;top:0;left:0;right:0;height:4px;background:var(--orange)} .formcard .ftop .eyebrow{font-family:var(--fHead);font-weight:700;color:var(--orange);font-size:11.5px;letter-spacing:1.2px;text-transform:uppercase;margin-bottom:8px} .formcard .ftop h2{font-family:var(--fHead);font-weight:800;color:#fff;font-size:23px;margin:0;line-height:1.1} .formcard .ftop p{margin:6px 0 0;color:rgba(255,255,255,.72);font-size:14px} .formcard .ftop p .o{color:var(--orange);font-weight:700} .formcard .ftop .trust{display:flex;align-items:center;gap:8px;margin-top:13px;padding-top:13px;border-top:1px solid rgba(255,255,255,.1);font-size:12.5px;color:rgba(255,255,255,.85)} .formcard .ftop .trust .stars{color:#FBBC05;letter-spacing:1px} .formcard .fbody{padding:22px 24px 26px} .flabel{display:block;font-size:13.5px;font-weight:600;color:var(--ink);margin:0 0 6px;font-family:var(--fHead)} .chk{display:grid;grid-template-columns:1fr 1fr;gap:7px 14px;margin:6px 0 18px} .chk label{display:flex;align-items:center;gap:7px;font-size:14px;color:var(--body);cursor:pointer} .chk input{accent-color:var(--orange);width:15px;height:15px} .fi{width:100%;background:#f4f2ee;border:1px solid var(--line);border-radius:7px;padding:11px 13px;color:var(--ink);font-size:15px;font-family:var(--fBody);margin-bottom:13px;outline:none} .fi:focus{border-color:var(--orange);background:#fff} textarea.fi{min-height:84px;resize:vertical} .two{display:grid;grid-template-columns:1fr 1fr;gap:11px} .fsub{width:100%;background:var(--orange);color:#fff;font-family:var(--fHead);font-weight:700;font-size:17px;border:none;border-radius:999px;padding:14px;cursor:pointer;transition:.18s} .fsub:hover{background:var(--orange-dk)} .fnote{font-size:11.5px;color:var(--muted);margin-top:10px;line-height:1.4} .consent{display:flex;align-items:flex-start;gap:8px;font-size:11.5px;color:var(--muted);line-height:1.4;margin:2px 0 14px;cursor:pointer} .consent input{accent-color:var(--orange);width:14px;height:14px;margin-top:2px;flex-shrink:0} .area{margin-top:22px} .area .ttl{font-family:var(--fHead);font-weight:700;color:var(--ink);font-size:15px;margin-bottom:10px} .area ul{list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:6px 14px} .area li{font-size:13.5px;color:var(--body);display:flex;align-items:center;gap:7px} .area li::before{content:"\2713";color:var(--orange);font-weight:800} /* ---------- Phone CTA band ---------- */ .phoneband{background:var(--ink);text-align:center;padding:30px 40px;margin-top:46px} .phoneband .l{color:#fff;font-family:var(--fHead);font-weight:600;font-size:21px} .phoneband .n{color:var(--orange);font-family:var(--fHead);font-weight:800;font-size:34px;letter-spacing:-.5px;display:block;margin-top:4px} .phoneband .n a{color:var(--orange)} /* ---------- Service area module ---------- */ .servicearea{background:var(--offwhite);padding:52px 0} .servicearea .wrap{max-width:var(--max);margin:0 auto;padding:0 40px} .sa-kick{font-family:var(--fHead);font-weight:700;color:var(--orange);font-size:13px;letter-spacing:1.4px;text-transform:uppercase;margin-bottom:10px} .sa-h{font-family:var(--fHead);font-weight:800;color:var(--ink);font-size:clamp(22px,2.6vw,30px);line-height:1.18;margin-bottom:12px;letter-spacing:-.3px} .sa-lead{font-size:17px;color:var(--body);line-height:1.6;margin-bottom:22px;max-width:600px} .sa-lead strong{color:var(--ink);font-weight:600} .sa-chips{display:flex;flex-wrap:wrap;gap:10px} .sa-chip{display:inline-flex;align-items:center;gap:8px;background:#fff;border:1px solid var(--line);border-radius:999px;padding:10px 16px;font-family:var(--fHead);font-weight:600;font-size:14.5px;color:var(--ink);text-decoration:none;transition:border-color .15s,color .15s,transform .15s,box-shadow .15s} .sa-chip:hover{border-color:var(--orange);color:var(--orange);transform:translateY(-2px);box-shadow:0 6px 16px rgba(255,103,0,.14);text-decoration:none} .sa-chip .pin{width:8px;height:8px;border-radius:50%;background:var(--orange);flex-shrink:0} .sa-chip.current{background:var(--ink);color:#fff;border-color:var(--ink);cursor:default} .sa-chip.current:hover{transform:none;box-shadow:none;color:#fff} .sa-chip.current .pin{background:#fff} .sa-chip.more{background:transparent;border-style:dashed;color:var(--muted)} .sa-chip.more:hover{color:var(--orange);border-color:var(--orange)} /* ---------- KC Google reviews band ---------- */ .reviews{background:var(--offwhite);padding:52px 0} .reviews .wrap{max-width:var(--max);margin:0 auto;padding:0 40px} .reviews-kicker{font-family:var(--fHead);font-weight:700;color:var(--ink);font-size:13px;letter-spacing:1.4px;text-transform:uppercase;margin-bottom:14px} .reviews-head{display:flex;align-items:center;justify-content:space-between;gap:28px;flex-wrap:wrap;margin-bottom:28px;padding-bottom:24px;border-bottom:1px solid var(--line)} .rating-lead{display:flex;align-items:center;gap:18px} .rating-num{font-family:var(--fHead);font-weight:800;font-size:58px;color:var(--ink);line-height:.85} .rating-stars{color:#FBBC05;font-size:21px;letter-spacing:2px} .rating-sub{font-size:14px;color:var(--body);margin-top:5px} .gword{font-weight:700;letter-spacing:-.2px} .rating-scale{text-align:right} .rating-scale .big{font-family:var(--fHead);font-weight:800;font-size:21px;color:var(--ink);line-height:1.2} .rating-scale .big .o{color:var(--orange)} .rating-scale .sm{font-size:13.5px;color:var(--muted);margin-top:5px} .reviews-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px} .rv{background:#fff;border-radius:16px;padding:20px 22px;position:relative;box-shadow:0 1px 2px rgba(20,18,16,.04),0 12px 30px rgba(20,18,16,.07);transition:transform .18s,box-shadow .18s} .rv:hover{transform:translateY(-3px);box-shadow:0 2px 5px rgba(20,18,16,.05),0 18px 42px rgba(20,18,16,.12)} .rv .gmk{position:absolute;top:18px;right:20px;width:20px;height:20px;background:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0OCA0OCc+PHBhdGggZmlsbD0nI0VBNDMzNScgZD0nTTI0IDkuNWMzLjU0IDAgNi43MSAxLjIyIDkuMjEgMy42bDYuODUtNi44NUMzNS45IDIuMzggMzAuNDcgMCAyNCAwIDE0LjYyIDAgNi41MSA1LjM4IDIuNTYgMTMuMjJsNy45OCA2LjE5QzEyLjQzIDEzLjcyIDE3Ljc0IDkuNSAyNCA5LjV6Jy8+PHBhdGggZmlsbD0nIzQyODVGNCcgZD0nTTQ2Ljk4IDI0LjU1YzAtMS41Ny0uMTUtMy4wOS0uMzgtNC41NUgyNHY5LjAyaDEyLjk0Yy0uNTggMi45Ni0yLjI2IDUuNDgtNC43OCA3LjE4bDcuNzMgNmM0LjUxLTQuMTggNy4wOS0xMC4zNiA3LjA5LTE3LjY1eicvPjxwYXRoIGZpbGw9JyNGQkJDMDUnIGQ9J00xMC41MyAyOC41OWMtLjQ4LTEuNDUtLjc2LTIuOTktLjc2LTQuNTlzLjI3LTMuMTQuNzYtNC41OWwtNy45OC02LjE5Qy45MiAxNi40NiAwIDIwLjEyIDAgMjRjMCAzLjg4LjkyIDcuNTQgMi41NiAxMC43OGw3Ljk3LTYuMTl6Jy8+PHBhdGggZmlsbD0nIzM0QTg1MycgZD0nTTI0IDQ4YzYuNDggMCAxMS45My0yLjEzIDE1Ljg5LTUuODFsLTcuNzMtNmMtMi4xNSAxLjQ1LTQuOTIgMi4zLTguMTYgMi4zLTYuMjYgMC0xMS41Ny00LjIyLTEzLjQ3LTkuOTFsLTcuOTggNi4xOUM2LjUxIDQyLjYyIDE0LjYyIDQ4IDI0IDQ4eicvPjwvc3ZnPg==') no-repeat center/contain} .rv .rate{display:flex;align-items:center;gap:8px;margin-bottom:11px;padding-right:26px} .rv .rate .s{color:#FBBC05;font-size:16px;letter-spacing:1px} .rv .rate .when{font-size:12px;color:var(--muted)} .rv .q{font-size:14.5px;color:var(--ink);line-height:1.6;margin:0 0 14px;font-weight:500} .rv .rv-id{font-size:13px} .rv .rv-id .nm{font-family:var(--fHead);font-weight:700;color:var(--ink)} .rv .rv-id .loc{color:var(--muted)} .reviews-cta{text-align:center;margin-top:26px} @media(max-width:760px){.reviews-grid{grid-template-columns:1fr}.reviews-head{justify-content:center;text-align:center}.rating-scale{text-align:center}} /* ---------- Guarantee band ---------- */ .guarantee{background:var(--offwhite);position:relative;overflow:hidden} .guarantee .wrap{display:grid;grid-template-columns:200px 1fr;gap:44px;align-items:center;padding:56px 40px} .crest{width:200px;height:auto;flex-shrink:0} .guarantee h2{font-family:var(--fHead);font-weight:800;color:var(--ink);font-size:clamp(24px,3vw,34px);line-height:1.15;margin-bottom:14px} .guarantee p{color:var(--body);margin-bottom:14px;max-width:640px} @media(max-width:760px){.guarantee .wrap{grid-template-columns:1fr;text-align:center;justify-items:center}} /* ---------- Dark CTA band ---------- */ .ctaband{background:linear-gradient(rgba(20,18,16,.78),rgba(20,18,16,.86)),url('https://bugbros.com/wp-content/uploads/2026/07/title-pest-control-truck-desktop-1920w.webp') center/cover;text-align:center;padding:60px 40px} .ctaband h2{font-family:var(--fHead);font-weight:800;color:#fff;font-size:clamp(24px,3vw,36px);margin-bottom:22px;line-height:1.15} .ctaband .row{display:flex;gap:14px;justify-content:center;flex-wrap:wrap} /* ---------- Footer ---------- */ .foot{background:#000;color:#cfcdca;font-size:14.5px} .foot a{color:#cfcdca} .foot a:hover{color:var(--orange);text-decoration:none} .foot .foot-main{display:grid;grid-template-columns:1.6fr 1fr 1fr 1fr;gap:40px;padding:54px 40px 30px;align-items:start} .foot-brand img{display:block;margin-bottom:18px} .foot-quote{font-style:italic;color:#b9b6b2;font-size:14px;line-height:1.6;margin:0 0 8px;max-width:340px} .foot-cite{font-family:var(--fHead);font-weight:600;color:#fff;font-size:13px;font-style:normal} .foot-h{font-family:var(--fHead);font-weight:700;color:#fff;font-size:16px;margin-bottom:14px} .foot-col ul{list-style:none} .foot-col li{margin-bottom:9px;font-size:14px} .foot .nap3{display:grid;grid-template-columns:repeat(3,1fr);gap:30px;padding:26px 40px;border-top:1px solid #1c1c1c;line-height:1.7} .foot .nap3 .city{font-family:var(--fHead);font-weight:700;color:var(--orange);font-size:16px;margin-bottom:6px} .foot .nap3 a{color:#cfcdca} .foot .bottom{border-top:1px solid #2a2a2a;padding:18px 40px;text-align:center;font-size:13px;color:#8a8a87} .foot .bottom a{color:#8a8a87} @media(max-width:980px){.foot .foot-main{grid-template-columns:1fr 1fr;gap:30px}} @media(max-width:760px){.foot .foot-main{grid-template-columns:1fr}.foot .nap3{grid-template-columns:1fr;gap:20px}} /* ---------- Badge ticker (global footer) ---------- */ .ticker{background:var(--ink);overflow:hidden;border-top:1px solid rgba(255,255,255,.06);border-bottom:1px solid rgba(255,255,255,.06)} .ticker-track{display:flex;align-items:center;gap:46px;width:max-content;padding:14px 0;animation:ticker 26s linear infinite} .ticker .bb-item{font-family:var(--fHead);font-weight:600;color:#fff;font-size:14px;letter-spacing:.3px;white-space:nowrap;display:inline-flex;align-items:center;gap:8px} .ticker .bb-item::before{content:"\2713";color:var(--orange);font-weight:800} .ticker .bb-item b{color:var(--orange);font-weight:700} .ticker .bb-item a{color:#fff} @keyframes ticker{from{transform:translateX(0)}to{transform:translateX(-50%)}} @media(prefers-reduced-motion:reduce){.ticker-track{animation:none;justify-content:center;flex-wrap:wrap;gap:18px 32px;width:auto}} /* ---------- Closing band (global footer) ---------- */ .closeband{background:var(--ink);text-align:center;padding:54px 40px} .closeband h2{font-family:var(--fHead);font-weight:800;color:#fff;font-size:clamp(24px,3vw,34px);margin-bottom:22px;line-height:1.15} .closeband .row{display:flex;gap:14px;justify-content:center;flex-wrap:wrap} /* ---------- Mobile sticky CTA ---------- */ .m-cta{display:none} @media(max-width:980px){ .m-cta{display:flex;position:fixed;bottom:0;left:0;right:0;z-index:200;background:var(--ink);padding:12px 16px;gap:10px;border-top:2px solid var(--orange);box-shadow:0 -4px 20px rgba(0,0,0,.3)} .m-cta .btn{flex:1;justify-content:center;font-size:14px;padding:11px 10px} body{padding-bottom:74px} } @media(max-width:768px){.titlebar{background-image:linear-gradient(rgba(20,18,16,.72),rgba(20,18,16,.82)),url('https://bugbros.com/wp-content/uploads/2026/07/title-pest-control-truck-mobile-900w.webp')}.ctaband{background-image:linear-gradient(rgba(20,18,16,.78),rgba(20,18,16,.86)),url('https://bugbros.com/wp-content/uploads/2026/07/title-pest-control-truck-mobile-900w.webp')}} body .main .article>p .o,body .main .article>p .bb-ch,body .main .article>h2 .o,body .main .article>h2 .bb-ch,body .main .article ol.steps p .o,body .main .article ol.steps p .bb-ch,body .main .article .faq-shell details p .o,body .main .article .faq-shell details p .bb-ch{color:#b34700} /* WCAG AA: light-surface orange text */ body .club .o,body .club .bb-ch,body .servicearea .sa-lead .o,body .servicearea .sa-lead .bb-ch,body .reviews-kicker .o,body .reviews-kicker .bb-ch,body .rating-scale .big .o,body .rating-scale .big .bb-ch,body .guarantee .o,body .guarantee .bb-ch,body .faq-shell .faq details p .o,body .faq-shell .faq details p .bb-ch{color:#b34700} body .cta-card a.btn-o[href="#quote"],body .ctaband a.btn-o[href="#quote"]{color:#211f1c}{"@context": "https://schema.org", "@type": "PestControlService", "name": "BugBros Pest Control", "url": "https://bugbros.com/where-we-kill-bugs/kansas-city-mo-pest-control/termite-exterminator/", "telephone": "+18163072712", "priceRange": "$$", "image": "https://bugbros.com/wp-content/uploads/2026/07/BB-white-large.webp", "serviceType": "Termite Inspection and Treatment", "address": {"@type": "PostalAddress", "streetAddress": "9680 Marion Ridge", "addressLocality": "Kansas City", "addressRegion": "MO", "postalCode": "64137", "addressCountry": "US"}, "areaServed": ["Kansas City", "Independence", "Lee's Summit", "64108", "64109", "64110", "64111", "64112", "64113", "64127", "64131"], "makesOffer": {"@type": "Offer", "name": "CRAZY HAPPY Club", "description": "Contract-free pest control membership in Kansas City. Includes recurring quarterly treatment with a year-round exterior barrier, free re-service between visits, and coverage for common household pests like ants, spiders, beetles, crickets, wasps, and more. No contract, cancel anytime."}} {"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "How much does termite treatment cost in Kansas City?", "acceptedAnswer": {"@type": "Answer", "text": "Termite treatment pricing in Kansas City depends on the treatment method and structure size. Soil-applied liquid termiticide barrier treatment typically runs more than bait station installation, with ongoing monitoring included. BugBros provides a quote after inspection. Call (816) 307-2712. Don’t skip the inspection: knowing what you’re dealing with changes the treatment recommendation."}}, {"@type": "Question", "name": "What are signs of termites in my Kansas City home?", "acceptedAnswer": {"@type": "Answer", "text": "The clearest signs: mud tubes (pencil-width mud channels on foundation surfaces or in crawl spaces, termites use these to travel above ground without exposure), hollow-sounding wood when knocked, blistering or bubbling paint on wood surfaces (subterranean termite feeding from inside creates moisture pressure on paint), and spring swarmers (winged termites found indoors in March through May, often near windows). Finding any of these warrants an inspection."}}, {"@type": "Question", "name": "What is the best termite treatment in Kansas City?", "acceptedAnswer": {"@type": "Answer", "text": "The right treatment depends on the infestation type, structure, and soil conditions. Liquid termiticide barrier (applied to the soil around and under the structure) is the most common approach and creates a continuous protective zone. Baiting systems place monitoring and bait stations around the perimeter that worker termites feed from and distribute back to the colony. We recommend based on what the inspection finds, not a default script."}}, {"@type": "Question", "name": "How long does termite treatment take?", "acceptedAnswer": {"@type": "Answer", "text": "A liquid barrier treatment typically takes 4 to 6 hours for an average Kansas City home. Baiting station installation is faster, a few hours for station placement around the perimeter. The treatment then works over weeks to months as the colony contacts the product. Annual inspection confirms the treatment zone is intact and the bait stations are active."}}, {"@type": "Question", "name": "Do termites come back after treatment?", "acceptedAnswer": {"@type": "Answer", "text": "Properly applied termiticide barrier treatment provides multi-year protection. The soil barrier degrades over time (typically 5 to 10 years for professional products), which is why annual inspection is recommended. Baiting systems require ongoing monitoring and bait replenishment. Both approaches are significantly more durable than any consumer product available at a hardware store."}}]}
5.0 Google Rating BBB A+ Rated 10+ Years In Business 100% CRAZY HAPPY Guarantee Designed for Homes With Kids & Pets

Termite Exterminator in Kansas City, MO

Call (816) 307-2712

HomeWhere We Kill BugsKansas City, MO Pest ControlTermite Exterminator

Termites do their damage silently, over months and years, often in places you don’t look. BugBros is the termite exterminator Kansas City calls to inspect first, confirm active termite activity, and treat with the right method for the structure. Every termite job is backed by the CRAZY HAPPY Club guarantee.

Termite Pressure · Kansas City

Kansas City’s geography works in termites’ favor. The Missouri River basin clay and loam soil that makes up much of the metro holds moisture well after rain, creating near-ideal conditions for eastern subterranean termites, the most damaging termite species in the United States. Swarm season kicks off in March after the first warm rain, peaks April through May, and there’s a secondary fall swarm in September and October. Winged insects near your windows in spring are your signal to find out what you’re dealing with.

Professional Termite Treatment in Kansas City, MO

By the time you notice something is wrong, blistering paint, a soft spot in the floor, a door that suddenly won’t close right, a colony has usually been working for a while. Eastern subterranean termites live in the soil and access your home’s structural wood through mud tubes. These are not drywood termites, which are rare in Missouri.

BugBros inspects first. We confirm active termite activity, identify the extent of the situation, and recommend the right treatment based on what’s actually there, not a one-size-fits-all sales script. Here’s what a termite problem looks like and what to watch for.

Eastern Subterranean
Mud Tubes
Swarmers
Hollow Wood
Blistering Paint
The Signs

How BugBros Treats Termites in Kansas City

Same playbook on every Kansas City termite job. We inspect and confirm active termite activity before we recommend anything, then match the treatment to the structure. Here’s exactly what happens, start to finish.

  1. Inspect before anything else

    We cover the full picture: mud tubes on the foundation and crawl space walls, probing structural wood for hollow spots, checking basement rim joists and moisture-damaged areas, and looking at where the structure meets the soil.

  2. Confirm active activity

    Not every swarm means your home is infested. Sometimes a swarm comes from a colony in a nearby tree or neighbor’s yard and no structural treatment is warranted. We tell you which situation you’re in before recommending anything.

  3. Match the treatment to the structure

    When treatment is needed, we use two approaches depending on the structure and situation. We don’t push one method on every job. We recommend based on what the inspection actually finds.

  4. Liquid barrier or baiting system

    A liquid termiticide barrier applies professional-grade product to the soil around and under the structure, creating a continuous treatment zone. A baiting system places monitoring and bait stations around the perimeter that worker termites feed from and share through the colony, eventually reaching the queen.

  5. Annual inspection to confirm the zone

    The soil barrier degrades over time, typically 5 to 10 years for professional products, which is why annual inspection is recommended. It confirms the treatment zone is intact and the bait stations are active.

Found a swarm or a mud tube? An inspection tells you for sure.

Get A Quote

The CRAZY HAPPY Club

Termite treatment ends the infestation you’ve got. The CRAZY HAPPY Club is how you keep the rest of the house protected year-round. It’s a contract-free membership with no lock-in, and it keeps a year-round exterior barrier on your home so the common household pests can’t rebuild each spring the way KC’s climate pushes them to.

Contract-Free Membership

What the CRAZY HAPPY Club covers

One membership that keeps the common household pests out of your home year-round.

  • A year-round exterior barrier that stops pest populations from rebuilding each spring
  • Recurring quarterly treatment on a set schedule, with free re-service between visits if pests come back
  • Coverage for common household pests like ants, spiders, beetles, crickets, wasps, and more
  • No contract. Cancel anytime.

Why a Termite Inspection Comes First in Kansas City

The inspection is the whole job on the front end. We confirm active termite activity before recommending treatment, because not every swarm means your home is infested. Sometimes a swarm is from a colony in a nearby tree or a neighbor’s yard, and no structural treatment is warranted. But you should know which situation you’re in. We tell you what we found, what it means, and what makes sense to do about it. If you want the entomology behind what we’re looking for, MU Extension’s termite guide breaks down the species active in Missouri.

Older Kansas City neighborhoods with full basements, stone foundations, and wood framing built decades ago give termites exactly what they look for. Lee’s Summit and similar inner suburbs with established tree canopy and older housing stock carry elevated termite risk. Consumer products don’t create the continuous treatment zone that professional soil application does, which is why DIY termite treatment consistently underperforms.

Termites vs. Carpenter Ants

Both damage wood, but the mechanism is different and so is the treatment. Termites create mud tubes along foundation surfaces and hollow out wood from the interior, and they’re the ones that leave winged swarmers near windows in spring. Carpenter ants are large, black or red-black ants that excavate wood for nesting and leave coarse frass that looks like sawdust mixed with insect parts, and they don’t create mud tubes. If you’re finding either of those signs, the fastest answer is an inspection. We identify both and treat accordingly. For the difference in detail, see our ant control in Kansas City page, or start from the Kansas City pest control hub.

KANSAS CITY PEST CONTROL FAQ

Bugged With A Question?

No runaround. Just straight answers from the Bug Assassins who know Kansas City homes.

How much does termite treatment cost in Kansas City?

Termite treatment pricing in Kansas City depends on the treatment method and structure size. Soil-applied liquid termiticide barrier treatment typically runs more than bait station installation, with ongoing monitoring included. BugBros provides a quote after inspection. Call (816) 307-2712. Don’t skip the inspection: knowing what you’re dealing with changes the treatment recommendation.

What are signs of termites in my Kansas City home?

The clearest signs: mud tubes (pencil-width mud channels on foundation surfaces or in crawl spaces, termites use these to travel above ground without exposure), hollow-sounding wood when knocked, blistering or bubbling paint on wood surfaces (subterranean termite feeding from inside creates moisture pressure on paint), and spring swarmers (winged termites found indoors in March through May, often near windows). Finding any of these warrants an inspection.

What is the best termite treatment in Kansas City?

The right treatment depends on the infestation type, structure, and soil conditions. Liquid termiticide barrier (applied to the soil around and under the structure) is the most common approach and creates a continuous protective zone. Baiting systems place monitoring and bait stations around the perimeter that worker termites feed from and distribute back to the colony. We recommend based on what the inspection finds, not a default script.

How long does termite treatment take?

A liquid barrier treatment typically takes 4 to 6 hours for an average Kansas City home. Baiting station installation is faster, a few hours for station placement around the perimeter. The treatment then works over weeks to months as the colony contacts the product. Annual inspection confirms the treatment zone is intact and the bait stations are active.

Do termites come back after treatment?

Properly applied termiticide barrier treatment provides multi-year protection. The soil barrier degrades over time (typically 5 to 10 years for professional products), which is why annual inspection is recommended. Baiting systems require ongoing monitoring and bait replenishment. Both approaches are significantly more durable than any consumer product available at a hardware store.

BugBros Pest Control, Kansas City 9680 Marion Ridge, Kansas City, MO 64137
(816) 307-2712

Treatments are EPA registered and applied by trained Bug Assassins using professional grade methods. Application is designed for homes with kids and pets when the protocol is followed. Reentry times and usage instructions are reviewed at every appointment.

Call For Immediate Assistance:
(816) 307-2712
Where We Kill Bugs

We treat termites across Kansas City

From the older housing stock with full basements and stone foundations to the inner suburbs out toward Lee’s Summit with established tree canopy, if it’s in the Kansas City metro, we inspect it. We cover the urban core ZIPs where older wood framing carries elevated termite risk, 64108, 64109, 64110, 64111, 64112, and 64113, with the same CRAZY HAPPY Club guarantee across every nearby town.

CRAZY HAPPY Customers
5.0
★★★★★
Verified Google reviews · Kansas City
Part of BugBros · 2,800+ Google reviews
New to Kansas City. Already a 5-star name.
★★★★★

“I found the mud tubes in my crawl space myself but didn’t know what I was looking at. BugBros came out the next day, confirmed it was termites, and had treatment started by that weekend. CRAZY HAPPY.”

Linda · Kansas City
★★★★★

“Saw winged bugs by the windows one spring morning and panicked. The tech inspected, explained they were swarmers, and set up the barrier treatment. No pressure, just answers. CRAZY HAPPY here.”

Marcus · Kansas City
★★★★★

“They came out, did the inspection, and told me the swarm was from a tree, not my house. Didn’t sell me a treatment I didn’t need. That’s why I’ll call them for everything. CRAZY HAPPY customer for life.”

Denise · Kansas City

No Termites. No Contracts. Just CRAZY HAPPY Customers.

CRAZY HAPPY Guarantee Badge

100% Backed by Our CRAZY HAPPY Guarantee

BugBros has earned 2,800+ Google reviews because we stand behind our work completely. With termites, that means inspecting first, confirming active activity, matching the treatment to the structure, and the CRAZY HAPPY Club barrier to keep the rest of the house protected. If pests return while you’re a member, so do we.

Every treatment uses EPA registered products applied by trained Bug Assassins, designed for homes with kids and pets when the protocol is followed. We treat your home the way we’d treat our own.

100% CRAZY HAPPY Guarantee Kid & Pet Households 5 Star Google Rating BBB A+ Rated 10+ Years In Business

Pest Control From People Who Care.

(function(){ var BB_FALLBACK = 2800; var BB_FEED = "https://bugbros.com/wp-content/uploads/2026/07/bugbros_reviews-2026-07-29.json"; var REVIEW_CITY = "Kansas City"; function floorHundred(n){ return Math.floor(n/100)*100; } function setTotal(total){ var v = floorHundred(total).toLocaleString(); document.querySelectorAll(".bb-review-total").forEach(function(el){ el.textContent = v; }); } function trim(s,n){ s=String(s||""); return s.length>n ? s.slice(0,n).replace(/\s+\S*$/,"")+"…" : s; } function el(tag,cls,text){ var e=document.createElement(tag); if(cls)e.className=cls; if(text!=null)e.textContent=text; return e; } function cardEl(r){ var card=el("div","rv"); var g=el("span","gmk"); g.setAttribute("role","img"); g.setAttribute("aria-label","Google review"); card.appendChild(g); var rate=el("div","rate"); rate.appendChild(el("span","s","★★★★★")); if(r.when) rate.appendChild(el("span","when",r.when)); card.appendChild(rate); card.appendChild(el("p","q","“"+trim(r.text,170)+"”")); var id=el("div","rv-id"); id.appendChild(el("span","nm",r.name||"Verified Google review")); id.appendChild(el("span","loc"," · "+REVIEW_CITY)); card.appendChild(id); return card; } function renderReviews(list){ if(!list||!list.length) return; var grid=document.querySelector(".reviews-grid"); if(!grid) return; grid.textContent=""; list.slice(0,3).forEach(function(r){ if(r&&r.text) grid.appendChild(cardEl(r)); }); } setTotal(BB_FALLBACK); if(BB_FEED){ fetch(BB_FEED).then(function(r){ return r.json(); }).then(function(d){ if(d && typeof d.company_total === "number" && d.company_total > 0) setTotal(d.company_total); renderReviews(d && d.kc_featured); }).catch(function(){}); } })();

/* BugBros Review Block V2, shared stylesheet. * Single source file. WP's REST media endpoint rejects .js/.css uploads, so * this file is inlined verbatim into a tag on every page by * bugbros_phase9_reviews_v2.py rather than hosted at one URL. Editing this * file and re-running `bugbros_phase9_reviews_v2.py --execute` (or waiting * for the Sunday cron) changes every page at once, that single-point control * is the point of the architecture. * Palette matches the existing card grid (bugbros_reviews_sync.py CARD_CSS) * and the aggregate band (bugbros_phase7_reviews.py): orange #ff6700, ink * #211f1c, offwhite #f6f3ef, hairline #e4e1db. */ .bbrv2-block{max-width:1200px;margin:0 auto;padding:40px 20px;font-family:inherit} .bbrv2-block+.bbrv2-block{border-top:1px solid #ece8e1;padding-top:56px} /* ---- static (pre-JS / crawler) fallback ---- */ .bbrv2-static-head{color:#211f1c;font-size:15px;font-weight:700;margin-bottom:16px} .bbrv2-static-head .bbrv2-count-num,.bbrv2-static-head .bbrv2-rating-num{color:#ff6700} /* ---- JS-rendered header / stat pill ---- */ .bbrv2-head{display:flex;align-items:center;gap:16px;flex-wrap:wrap; background:#211f1c;border-radius:10px;padding:16px 20px;margin-bottom:18px} .bbrv2-stars{color:#ff6700;font-size:15px;letter-spacing:2px;white-space:nowrap} .bbrv2-headtext{color:#f6f3ef;line-height:1.35} .bbrv2-headtext strong{font-size:16px} .bbrv2-headsub{font-size:12.5px;opacity:.75;margin-top:2px} /* ---- filter bar ---- */ .bbrv2-filters{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:16px} .bbrv2-chip{appearance:none;border:1px solid #d8d4cc;background:#fff;color:#3a3a38; font-size:13px;font-weight:600;padding:7px 14px;border-radius:999px;cursor:pointer; transition:background .12s ease,border-color .12s ease,color .12s ease} .bbrv2-chip:hover{border-color:#ff6700} .bbrv2-chip[aria-pressed="true"]{background:#ff6700;border-color:#ff6700;color:#fff} .bbrv2-count{margin-left:auto;color:#6b6b68;font-size:13px;white-space:nowrap} /* ---- grid + cards (visually consistent with the existing .bbrv-card design) ---- */ .bbrv2-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px} @media(max-width:1000px){.bbrv2-grid{grid-template-columns:repeat(2,1fr)}} @media(max-width:600px){.bbrv2-grid{grid-template-columns:1fr}} .bbrv2-card{background:#fff;border:1px solid #e4e1db;border-radius:14px;padding:18px; box-shadow:0 1px 3px rgba(0,0,0,.05)} .bbrv2-top{display:flex;align-items:center;gap:10px;margin-bottom:8px} .bbrv2-av{position:relative;width:40px;height:40px;border-radius:50%;flex:0 0 40px; background:#ff6700;color:#fff;font-weight:700;font-size:15px;display:flex; align-items:center;justify-content:center;overflow:hidden; box-shadow:0 0 0 3px #fff,0 0 0 4px rgba(255,103,0,.22)} .bbrv2-av img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover} .bbrv2-who{min-width:0} .bbrv2-nm{display:block;font-weight:700;color:#211f1c;font-size:15px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .bbrv2-when{display:block;color:#6b6b68;font-size:12.5px} .bbrv2-stars-sm{color:#fbbc05;font-size:15px;letter-spacing:2px;margin-bottom:6px} .bbrv2-txt{color:#3a3a38;font-size:14.5px;line-height:1.55;margin:0} /* ---- show more / empty state ---- */ .bbrv2-more{display:block;margin:18px auto 0;background:#fff;border:1px solid #d8d4cc; color:#211f1c;font-weight:700;font-size:14px;padding:10px 22px;border-radius:999px; cursor:pointer} .bbrv2-more:hover{border-color:#ff6700;color:#ff6700} .bbrv2-empty{color:#6b6b68;font-size:14.5px;padding:30px 0;text-align:center} .bbrv2-badges{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0 2px} .bbrv2-badge{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:700; letter-spacing:.2px;padding:5px 11px;border-radius:999px;background:rgba(255,103,0,.10); color:#ff6700;border:1px solid rgba(255,103,0,.30);white-space:nowrap} .bbrv2-badge b{font-weight:800} .bbrv2-block{min-height:320px} @media (min-width:1024px){.bbrv2-block{min-height:360px}} .bbrv2-block.bbrv2-failed{min-height:0;padding:0;border:0} .bbrv2-block.bbrv2-failed .bbrv2-fallback{display:block} .bbrv2-fallback{display:block} .bbrv2-block .bbrv2-head~.bbrv2-fallback{display:none} .bbrv2-market{font-size:19px;font-weight:800;line-height:1.15;letter-spacing:.02em; color:#ff6700;margin:6px 0 2px;text-wrap:balance} .bbrv2-market-all{font-size:13px;font-weight:600;letter-spacing:.06em; text-transform:uppercase;color:rgba(255,255,255,.55)} .bbrv2-count-num,.bbrv2-rating-num{font-variant-numeric:tabular-nums} @media (min-width:1024px){.bbrv2-market{font-size:23px}} .bbrv2-head{display:block} .bbrv2-headtext{width:100%;flex:1 1 100%;font-size:17px;letter-spacing:-.01em;text-wrap:balance} @media (min-width:1024px){.bbrv2-headtext{font-size:19px}}
5.0 stars · 2,800+ Google reviews across every BugBros location
/* BugBros review block. Renders from the live feed. Resolves the newest feed attachment itself, so publishing a feed never requires editing this global. One fetch of the media index per page load, shared across every block on the page. */ (function () { 'use strict'; var FEED_INDEX = '/wp-json/wp/v2/media?search=bugbros_reviews&per_page=5' + '&orderby=date&order=desc&_fields=source_url'; /* Anchored to the exact dated shape the publisher emits. An unanchored pattern would also match an uploaded 'pwn-bugbros_reviews.json'. */ var FEED_NAME = /\/bugbros_reviews-\d{4}-\d{2}-\d{2}(?:-\d+)?\.json$/; var STALE_DAYS = 10; var MAX_CARDS = 9; /* One global serves every page. When data-market is "auto" the market is resolved from the URL, so the same shortcode can be dropped anywhere and still show locally relevant numbers. Ambiguous or unmatched paths fall back to the company roll-up, which is the primary number regardless. */ var CITIES = { 'Tulsa': ['tulsa', 'broken-arrow', 'owasso', 'bixby', 'jenks', 'sand-springs', 'sapulpa', 'claremore', 'collinsville', 'oakhurst', 'catoosa', 'glenpool'], 'Wichita': ['wichita', 'andover', 'derby', 'haysville', 'goddard', 'maize', 'valley-center', 'park-city', 'augusta', 'el-dorado', 'newton', 'mulvane', 'hutchinson'], 'Kansas City': ['kansas-city', 'overland-park', 'olathe', 'lenexa', 'shawnee', 'leawood', 'independence', 'liberty', 'blue-springs', 'lees-summit', 'belton', 'fairway', 'gladstone', 'grain-valley', 'grandview', 'merriam', 'mission', 'mission-hills', 'prairie-village', 'raymore', 'raytown'] }; function resolveMarket(path) { var p = '-' + String(path || '').toLowerCase().replace(/[^a-z0-9]+/g, '-') + '-'; /* The /reviews/ hub is the one page that shows every market stacked. */ if (/^\/reviews\/?$/.test(String(path || ''))) return 'all'; var found = Object.keys(CITIES).filter(function (m) { return CITIES[m].some(function (c) { return p.indexOf('-' + c + '-') > -1; }); }); return found.length === 1 ? found[0] : 'company'; } function num(n) { return Number(n).toLocaleString('en-US'); } /* A feed that says 9,000,000 reviews or 4.2 stars is a broken or hostile feed, not news. Reject rather than publish nonsense. */ function sane(data) { if (!data || !data.company || !data.markets) return false; var c = data.company; if (!(c.count >= 0 && c.count = 0 && c.rating = 0 && m.count = 0 && m.rating <= 5; }); } /* Avada's [fusion_code] pipeline HTML-entity-decodes the payload before it reaches the page, so an ampersand-entity literal written here arrives decoded and breaks the source. Escape via textContent (no entity literals at all) and build the two quote entities from pieces that are never contiguous. */ var AMP = String.fromCharCode(38); function esc(s) { var d = document.createElement('div'); d.textContent = String(s == null ? '' : s); return d.innerHTML .split('"').join(AMP + 'quot;') .split("'").join(AMP + '#39;'); } function feed() { if (window.__bbFeed) return window.__bbFeed; window.__bbFeed = fetch(FEED_INDEX, { credentials: 'omit' }) .then(function (r) { return r.json(); }) .then(function (list) { var hit = (list || []).map(function (m) { return m.source_url; }) .filter(function (u) { return u && FEED_NAME.test(u); })[0]; if (!hit) throw new Error('no feed attachment found'); return fetch(hit, { credentials: 'omit' }).then(function (r) { return r.json(); }) .then(function (d) { if (!sane(d)) throw new Error('feed out of bounds'); return d; }); }); return window.__bbFeed; } /* avatarUrl originates from Google's CDN via the scraper. Constrain the scheme anyway so a poisoned feed value cannot introduce a non-https or javascript: src. Anything that is not plain https is dropped to initials. */ function safeAvatar(u) { return /^https:\/\/lh\d+\.googleusercontent\.com\//.test(String(u || '')) ? String(u) : ''; } function initials(name) { return String(name || '').trim().split(/\s+/).slice(0, 2) .map(function (w) { return w.charAt(0).toUpperCase(); }).join(''); } function monthYear(iso) { var d = new Date(iso + 'T00:00:00'); if (isNaN(d)) return ''; return d.toLocaleDateString('en-US', { month: 'long', year: 'numeric' }); } function card(r) { /* Initials are ALWAYS the span's text. The avatar layers over them via CSS, so an expired Google avatar (they 404 routinely) reveals initials instead of an empty circle. */ var url = r.hasPhoto ? safeAvatar(r.avatarUrl) : ''; var av = esc(initials(r.name)) + (url ? '' : ''); return '
' + '
' + '' + av + '' + '
' + '' + esc(r.name) + '' + '' + esc(monthYear(r.date)) + '' + '
' + '
' + '' + '
' + esc(r.text) + '
' + '
'; } /* Company-wide is the primary number on every page. A market line appends only where the feed says that market's number wins locally. */ /* On a market page the market's OWN count is the proof, so it leads and the market name sits under it as its own emphasized line. The old "2,800+ ... including 63 in Kansas City" buried the local number mid sentence behind a bigger one and wrapped badly at 375px. Company pages, which have no single market, keep the roll-up. */ function headline(data, key) { var m = key === 'company' ? null : data.markets[key]; var local = m && m.showLocalLine; var rating = (local ? m.rating : data.company.rating).toFixed(1); var count = local ? num(m.count) : num(data.company.floored) + '+'; return '' + rating + ' stars ' + '· ' + count + ' Google reviews'; } function marketLine(data, key) { var m = key === 'company' ? null : data.markets[key]; return (m && m.showLocalLine) ? '
' + esc(key) + '
' : '
Across every BugBros location
'; } function fresh(updated) { var d = new Date(updated + 'T00:00:00'); if (isNaN(d)) return false; return (Date.now() - d.getTime()) / 86400000 <= STALE_DAYS; } /* "all" renders one section per market, stacked, the way the /reviews/ hub has always presented them. Each section is an independent block element so its chips filter only its own market. */ function renderAll(el, data) { var frag = document.createDocumentFragment(); /* Company roll-up leads, then each market, matching how the hub has always been ordered. */ ['company'].concat(Object.keys(data.markets)).forEach(function (k) { var sec = document.createElement('div'); sec.className = 'bbrv2-block bb-reviews-v2'; sec.setAttribute('data-market', k); frag.appendChild(sec); render(sec, data); }); el.innerHTML = ''; // only after every child rendered cleanly el.appendChild(frag); } function render(el, data) { var key = el.getAttribute('data-market') || 'company'; if (key === 'auto') key = resolveMarket(location.pathname); if (key === 'all') { renderAll(el, data); return; } var m = key === 'company' ? null : data.markets[key]; if (key !== 'company' && !m) key = 'company'; var pool = m ? (m.reviews || []) : Object.keys(data.markets) .reduce(function (a, k) { return a.concat(data.markets[k].reviews || []); }, []) .sort(function (a, b) { return a.days_old - b.days_old; }); var recent = el.getAttribute('data-recent') !== 'off'; var photos = el.getAttribute('data-photos') !== 'off'; var view = pool.filter(function (r) { return recent ? r.days_old <= 180 : true; }); if (!view.length && pool.length) { recent = false; view = pool.slice(); } view.sort(function (a, b) { if (photos && a.hasPhoto !== b.hasPhoto) return a.hasPhoto ? -1 : 1; return a.days_old - b.days_old; }); /* If a market's local number is suppressed, do not label the block with that market either. Saying "Kansas City" above a company-wide number reads as a mismatch. */ /* The market now has its own emphasized line, so the subtitle stops repeating it and carries only the provenance. */ var sub = 'Verified Google reviews'; if (fresh(data.updated)) sub += ' · updated weekly'; el.innerHTML = '
' + '' + '
' + headline(data, key) + '
' + marketLine(data, key) + '
' + sub + '
' + '
' + '
' + 'All 5-star' + 'All with written comments' + '
' + '
' + '' + '' + '
' + (view.length ? '
' + view.slice(0, MAX_CARDS).map(card).join('') + '
' : '
No reviews match that filter yet.
'); el.querySelectorAll('.bbrv2-chip').forEach(function (btn) { btn.addEventListener('click', function () { var f = btn.getAttribute('data-f'); var attr = f === 'recent' ? 'data-recent' : 'data-photos'; el.setAttribute(attr, el.getAttribute(attr) === 'off' ? 'on' : 'off'); render(el, data); }); }); } function boot() { var blocks = document.querySelectorAll('.bbrv2-block[data-market]'); if (!blocks.length) return; feed().then(function (data) { blocks.forEach(function (el) { try { render(el, data); } catch (e) { el.className += ' bbrv2-failed'; } }); }).catch(function () { blocks.forEach(function (el) { el.className += ' bbrv2-failed'; }); }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', boot); } else { boot(); } })();