.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)} /* guarantee 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-control/", "telephone": "+18163072712", "priceRange": "$$", "image": "https://bugbros.com/wp-content/uploads/2026/07/BB-white-large.webp", "serviceType": "Termite Control", "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"]} {"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "How do I know if I have termites or carpenter ants?", "acceptedAnswer": {"@type": "Answer", "text": "Both can cause structural damage, but they work differently. Termites eat wood from the inside and leave smooth, hollowed-out galleries. Carpenter ants excavate tunnels but don’t eat wood. They push out coarse, sawdust-like frass. Termites also leave mud tubes; carpenter ants don’t. If you’re not sure, that’s exactly what our inspection answers. Learn more about carpenter ant control."}}, {"@type": "Question", "name": "Are termites active in winter in Kansas City?", "acceptedAnswer": {"@type": "Answer", "text": "Subterranean termites slow their surface activity in cold weather, but colonies inside heated structures remain active year-round. If your home is infested, they’re working whether it’s January or July. Treatment can be performed any time of year."}}, {"@type": "Question", "name": "Do I need a termite inspection to sell my home?", "acceptedAnswer": {"@type": "Answer", "text": "Mortgage lenders in Missouri commonly require a Wood Destroying Insect Report (WDIR) before closing. Even in cases where it’s not technically required, buyers or their agents often request one. BugBros performs inspection services that satisfy this requirement."}}, {"@type": "Question", "name": "How long does termite treatment take?", "acceptedAnswer": {"@type": "Answer", "text": "The initial inspection and treatment typically takes 1 to 3 hours depending on property size. The Termidor transfer effect takes 60 to 90 days to fully eliminate the colony. We explain this timeline clearly before we start so you know exactly what to expect."}}, {"@type": "Question", "name": "What happens if termites come back after treatment?", "acceptedAnswer": {"@type": "Answer", "text": "It doesn’t cost you anything. We return, we re-treat, and we keep monitoring until the issue is resolved. Every termite treatment is backed by our 100% CRAZY HAPPY Guarantee."}}, {"@type": "Question", "name": "Is the treatment process disruptive to my home or family?", "acceptedAnswer": {"@type": "Answer", "text": "Minimal disruption. Most of our perimeter treatment is exterior. Interior drilling is targeted to specific areas and cleaned up before we leave. We’ll walk you through any preparation needed before we arrive. It’s straightforward."}}]}
5.0 Google Rating BBB A+ Rated 10+ Years In Business 100% CRAZY HAPPY Guarantee Designed for Homes With Kids & Pets

Termite Control in Kansas City, MO

Call (816) 307-2712

HomeWhere We Kill BugsKansas City, MO Pest ControlTermite Control

Most homeowners don’t find out they have termites until the damage is already done. BugBros runs termite control Kansas City trusts, built to inspect the structure, treat the soil, and monitor so the colony is eliminated instead of just knocked back. Every termite program is backed by our 100% CRAZY HAPPY Guarantee.

Termite Pressure · Kansas City

Kansas City ranks among the more active termite regions in the country, and the local conditions explain why. The clay-heavy soils common throughout Johnson County hold moisture for days after rain, and that sustained ground moisture is exactly what subterranean termite colonies depend on. Older neighborhoods carry elevated risk, since pre-1970s construction often includes structural wood that has cycled through decades of moisture and sits close to the soil line.

Termite Treatment in Kansas City, MO

That’s how termites work. They don’t make noise. They don’t leave obvious trails. They move through wood slowly, quietly, and efficiently, eating from the inside out. By the time you see a swarm of flying insects near your foundation or notice a soft spot in your floor, the colony has likely been active for a year or more.

BugBros treats termites as a process, not a one-time spray. We inspect the full structure, treat the soil around the foundation with a product termites carry back through the colony, and set monitors so future activity gets caught early. The homeowners who act early spend a fraction of what those who wait end up dealing with. Here’s what termites do and what to watch for.

Subterranean Termites
Mud Tubes
Swarmers
Damaged Wood
Frass
Sticking Doors

How BugBros Treats Termites in Kansas City

No two properties are identical, but our treatment process follows a clear sequence that we explain in full before we start. Here’s exactly what happens, start to finish.

  1. Thorough inspection

    Our technician walks the full perimeter of the structure, examines the foundation, checks crawl spaces, and inspects accessible structural wood. We identify active mud tubes, damage areas, and moisture issues, then give you a clear picture of what we found and where.

  2. Perimeter soil treatment

    We apply Termidor as a liquid treatment in the soil around your foundation, creating a treated zone termites move through without detecting. Because termites groom each other and share food, the product spreads through the colony over time. That transfer effect is why it outperforms older termiticides termites simply avoid.

  3. Interior and structural treatment

    Where needed, we drill and treat interior areas, apply foam into wall voids, and address any harborage areas found during inspection. We also install monitoring stations at key locations where future activity would be detected early.

  4. Follow-up and annual monitoring

    We follow up at 60 to 90 days to confirm treatment efficacy and check monitor stations. Ongoing monitoring keeps watch after that, with free re-service backed by our 100% CRAZY HAPPY Guarantee if termite activity ever returns.

  5. Let the transfer effect finish

    Termites spread Termidor through social contact before they die, so we ask you not to disturb treated soil zones for several weeks. Patience during this window is what makes the treatment work completely, not just partially.

Signs aren’t always obvious. Our inspectors know where to look.

Get A Quote

Backed by Our 100% CRAZY HAPPY Guarantee

The treatment ends the infestation you’ve got, and the work doesn’t stop there. Every termite service is backed by our 100% CRAZY HAPPY Guarantee, with monitor stations checked on follow-up visits so activity gets caught before it turns into damage again.

Our Guarantee

What Every Termite Service Includes

Termite control that holds is treatment plus follow-through, and both come standard.

  • Termidor soil treatment that eliminates the colony, not just the termites you can see
  • Monitor stations checked at follow-up visits to confirm treatment efficacy
  • Free re-treatment if termite activity returns after service
  • Straight answers on moisture and wood-contact repairs worth making
  • No contracts. Ever.

What Termites Are Actually Doing Inside Your Walls

Subterranean termites, the species you’re most likely dealing with in Kansas City, build their colony underground and forage upward through the soil into wood. They travel through mud tubes, pencil-wide tunnels they construct along foundation walls and structural elements, which protect them from exposure while they move. MU Extension’s subterranean termite guide covers exactly how that soil-to-wood pathway works.

Inside the wood, workers hollow out galleries along the grain. They eat the soft interior while leaving a thin outer shell intact, which is why infested wood often looks fine on the surface but collapses when probed. Structural beams, floor joists, door frames, and window casings are all vulnerable. A mature colony causes damage steadily, and the longer it goes untreated, the more significant and costly the repair.

Termites vs. Carpenter Ants

Both can cause structural damage, but they work differently and so does the treatment. Termites eat wood from the inside and leave smooth, hollowed-out galleries, and they build mud tubes along foundation surfaces. Carpenter ants excavate tunnels to nest but don’t eat wood, pushing out coarse, sawdust-like frass, and they don’t create mud tubes. If you’re not sure which one you’re dealing with, that’s exactly what an inspection answers. 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 do I know if I have termites or carpenter ants?

Both can cause structural damage, but they work differently. Termites eat wood from the inside and leave smooth, hollowed-out galleries. Carpenter ants excavate tunnels but don’t eat wood. They push out coarse, sawdust-like frass. Termites also leave mud tubes; carpenter ants don’t. If you’re not sure, that’s exactly what our inspection answers. Learn more about carpenter ant control.

Are termites active in winter in Kansas City?

Subterranean termites slow their surface activity in cold weather, but colonies inside heated structures remain active year-round. If your home is infested, they’re working whether it’s January or July. Treatment can be performed any time of year.

Do I need a termite inspection to sell my home?

Mortgage lenders in Missouri commonly require a Wood Destroying Insect Report (WDIR) before closing. Even in cases where it’s not technically required, buyers or their agents often request one. BugBros performs inspection services that satisfy this requirement.

How long does termite treatment take?

The initial inspection and treatment typically takes 1 to 3 hours depending on property size. The Termidor transfer effect takes 60 to 90 days to fully eliminate the colony. We explain this timeline clearly before we start so you know exactly what to expect.

What happens if termites come back after treatment?

It doesn’t cost you anything. We return, we re-treat, and we keep monitoring until the issue is resolved. Every termite treatment is backed by our 100% CRAZY HAPPY Guarantee.

Is the treatment process disruptive to my home or family?

Minimal disruption. Most of our perimeter treatment is exterior. Interior drilling is targeted to specific areas and cleaned up before we leave. We’ll walk you through any preparation needed before we arrive. It’s straightforward.

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 in Midtown and Brookside to the newer builds out toward Lee’s Summit, if it’s in the Kansas City metro, we treat it. We cover the urban core ZIPs where termite calls cluster, 64108, 64109, 64110, 64111, 64112, and 64113, with the same 100% CRAZY HAPPY 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.
★★★★★

“Found mud tubes on the foundation and panicked. BugBros inspected the whole house, treated the soil with Termidor, and walked us through the timeline. Monitors are in and we finally feel ahead of it. CRAZY HAPPY.”

Ryan · Waldo, Kansas City
★★★★★

“Saw swarmers by the windows in April and called right away. The inspector knew exactly where to look and found an active colony we’d have missed for years. Treatment was way less disruptive than I expected. CRAZY HAPPY here.”

Sandra · Brookside, Kansas City
★★★★★

“Needed a termite inspection to close on our house and BugBros handled it fast and clean. Now on the quarterly plan with the monitoring included. No contract, no hassle. CRAZY HAPPY customer for life.”

Marcus · Midtown, 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 a thorough inspection, a Termidor soil treatment that eliminates the colony, and ongoing monitoring to keep them from coming back. If they return after treatment, 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(); } })();