.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/spider-control/", "telephone": "+18163072712", "priceRange": "$$", "image": "https://bugbros.com/wp-content/uploads/2026/07/BB-white-large.webp", "serviceType": "Spider Control and Brown Recluse Removal", "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 spiders and common household pests like ants, beetles, crickets, wasps, and more. No contract, cancel anytime."}} {"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "Are brown recluse spiders really that common in Kansas City?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Kansas City is within the native range of the brown recluse, and local conditions, older homes, basements, undisturbed storage. Support high populations. Johnson County research has documented individual homes with populations exceeding 2,000 individuals. Most KC residents have brown recluse in their homes at some level; significant infestations are what require professional attention."}}, {"@type": "Question", "name": "How do I identify a brown recluse spider?", "acceptedAnswer": {"@type": "Answer", "text": "Brown recluse are medium-sized, tan to brown, with a violin-shaped marking on the front section of their body. Crucially, they have six eyes arranged in three pairs. Most spiders have eight eyes. If you find a spider you can't identify, don't handle it. Take a photo if possible and call us."}}, {"@type": "Question", "name": "What should I do if I think I was bitten by a brown recluse?", "acceptedAnswer": {"@type": "Answer", "text": "Seek medical attention promptly. Most brown recluse bites are minor, but some cause necrotic tissue damage that requires treatment. A doctor can assess the bite and advise appropriate care. Then call us, if there's a spider in your home that got close enough to bite someone, there's a population worth treating."}}, {"@type": "Question", "name": "Can I treat brown recluse spiders myself?", "acceptedAnswer": {"@type": "Answer", "text": "DIY sprays kill spiders on contact but don't reach established harborage zones or address populations hiding in walls, insulation, and storage areas. Effective treatment requires residual products and follow-up monitoring. Attempting to treat a significant infestation with consumer products typically moves the spiders without eliminating them."}}, {"@type": "Question", "name": "Are black widows common in Kansas City?", "acceptedAnswer": {"@type": "Answer", "text": "Less common indoors than brown recluse, but present throughout the area. Black widows prefer garages, sheds, wood piles, and outdoor structures. Regular perimeter treatment significantly reduces the likelihood of them entering living areas."}}, {"@type": "Question", "name": "How do I reduce spiders on my own between treatments?", "acceptedAnswer": {"@type": "Answer", "text": "Replace cardboard storage boxes with sealed plastic containers (brown recluse love cardboard). Reduce clutter in basements and closets. Seal gaps around utility penetrations and foundation cracks. Eliminating other insects reduces the food supply and limits spider populations over time."}}]}
5.0 Google Rating BBB A+ Rated 10+ Years In Business 100% CRAZY HAPPY Guarantee Designed for Homes With Kids & Pets

Spider Control in Kansas City, MO

Call (816) 307-2712

HomeWhere We Kill BugsKansas City, MO Pest ControlSpider Control

Finding a spider in your home doesn’t always mean you have a serious problem, but brown recluse are different. Kansas City sits squarely in brown recluse country, and BugBros runs spider control Kansas City trusts, built to identify the species, find the harborage, and treat the infestation at the source. Every spider program is backed by the CRAZY HAPPY Club guarantee.

Spider Pressure · Kansas City

Kansas City sits near the northern edge of the brown recluse’s native range, in one of the most consistently active zones in Missouri and Kansas. The conditions here, older homes, finished basements, and undisturbed storage areas, are exactly what brown recluse populations need to establish themselves. Johnson County extension research has documented individual homes with populations exceeding 2,000 brown recluse. These aren’t occasional visitors.

Spider Treatment in Kansas City, MO

Most of the spiders that wander in from outside are looking for warmth and insects to eat, and they’ll stay put in a corner and stay out of your way. Brown recluse are the exception. In the right environment, they build populations that number in the hundreds, they don’t announce themselves, and their bites, though uncommon, are medically significant.

BugBros treats spiders as an identification problem first. Brown recluse, black widow, and nuisance species all call for different responses and different levels of urgency, so we confirm what you’re dealing with before any product goes down. Here are the spiders we see most in Kansas City homes and the signs that a population is established.

Brown Recluse
Black Widow
Yellow Sac
Wolf Spiders
Egg Sacs
The Signs

How BugBros Handles Spider Infestations in Kansas City

Same playbook on every Kansas City spider job. We identify before we treat, because a misidentified spider means the wrong response. Here’s exactly what happens, start to finish.

  1. Inspect and identify the species

    We start by identifying what you have, since brown recluse, black widow, and nuisance species all call for different responses. We inspect harborage areas, the storage spaces, closets, crawl spaces, basements, and garage walls, and give you an honest read on the scope of the problem.

  2. Targeted perimeter and interior treatment

    We apply a professional-grade perimeter treatment around the exterior to create a barrier and reduce the entry of both spiders and the insects that sustain them. Interior treatment targets confirmed harborage zones with residual products that work over time, not just day-of.

  3. Place sticky monitors

    Glue traps in key interior zones tell us exactly where activity is concentrated and how quickly population pressure is responding to treatment. We review these on the follow-up visit.

  4. Follow-up treatment

    Spider control almost always requires a follow-up. Egg sacs can hatch after the initial treatment and new spiders can enter from adjacent areas, so we return, typically 30 days out, to confirm the treatment is working and address any residual activity.

  5. De-web and exclusion guidance

    We clear webs and egg sacs from treated areas and walk you through practical exclusion steps: sealing entry points, reducing harborage like cardboard storage boxes, and addressing the moisture or clutter conditions that support high spider populations.

Not sure what you found? An inspection tells you for sure.

Get A Quote

The CRAZY HAPPY Club

Treatment ends the infestation you’ve got. The CRAZY HAPPY Club is how you keep it from coming back. It’s a contract-free membership with no lock-in, and it keeps a year-round exterior barrier on your home that reduces the entry of both spiders and the insects that feed them.

Contract-Free Membership

What the CRAZY HAPPY Club covers

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

  • A year-round exterior barrier that reduces spider entry and cuts off the insect food supply that sustains them
  • Recurring quarterly treatment on a set schedule, with free re-service between visits if pests come back
  • Coverage for spiders plus common household pests like ants, beetles, crickets, wasps, and more
  • No contract. Cancel anytime.

Kansas City Is Brown Recluse Territory

This isn’t a generic warning that applies everywhere. Brown recluse spiders are native to a specific range across the central and south-central United States, and Kansas City sits near the northern edge of that range, in one of the most consistently active zones in Missouri and Kansas. The brown recluse thrives in undisturbed spaces inside homes, the cardboard boxes, stored clothing, seldom-moved furniture, wood piles, and attic insulation that KC’s older housing stock and unfinished basements provide in abundance. Kansas State Extension’s brown recluse guide has the identification details if you want to confirm what you’re looking at.

They emerge in April, peak in summer, and increase indoor movement in fall as they seek overwintering locations, which is often when homeowners first notice them, because the spiders move toward living areas. Johnson County extension research has documented individual homes with populations exceeding 2,000 brown recluse. That’s not a scare tactic. That’s the reality of what a well-established infestation looks like when left untreated for multiple seasons.

When Spiders Are More Than a Nuisance

A single spider is a single spider. It becomes a real problem when you’re finding three or more per week in similar locations, when you spot visible egg sacs that each hold dozens to hundreds of offspring, when there’s a consistent presence every time you open a storage closet or access the crawl space, when spiders show up near beds or clothing, or when the home has a prior infestation history, since brown recluse populations persist in structures for years if not treated. A high spider population also tells you something about your home’s overall pest situation, because spiders follow their food source, and lots of spiders often means a significant insect population supporting them. For the other Kansas City pests we handle, 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.

Are brown recluse spiders really that common in Kansas City?

Yes. Kansas City is within the native range of the brown recluse, and local conditions, older homes, basements, undisturbed storage. Support high populations. Johnson County research has documented individual homes with populations exceeding 2,000 individuals. Most KC residents have brown recluse in their homes at some level; significant infestations are what require professional attention.

How do I identify a brown recluse spider?

Brown recluse are medium-sized, tan to brown, with a violin-shaped marking on the front section of their body. Crucially, they have six eyes arranged in three pairs. Most spiders have eight eyes. If you find a spider you can't identify, don't handle it. Take a photo if possible and call us.

What should I do if I think I was bitten by a brown recluse?

Seek medical attention promptly. Most brown recluse bites are minor, but some cause necrotic tissue damage that requires treatment. A doctor can assess the bite and advise appropriate care. Then call us, if there's a spider in your home that got close enough to bite someone, there's a population worth treating.

Can I treat brown recluse spiders myself?

DIY sprays kill spiders on contact but don't reach established harborage zones or address populations hiding in walls, insulation, and storage areas. Effective treatment requires residual products and follow-up monitoring. Attempting to treat a significant infestation with consumer products typically moves the spiders without eliminating them.

Are black widows common in Kansas City?

Less common indoors than brown recluse, but present throughout the area. Black widows prefer garages, sheds, wood piles, and outdoor structures. Regular perimeter treatment significantly reduces the likelihood of them entering living areas.

How do I reduce spiders on my own between treatments?

Replace cardboard storage boxes with sealed plastic containers (brown recluse love cardboard). Reduce clutter in basements and closets. Seal gaps around utility penetrations and foundation cracks. Eliminating other insects reduces the food supply and limits spider populations over time.

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 spiders across Kansas City

From the older housing stock with unfinished basements where brown recluse harbor to the garages and wood piles that draw black widows, if it’s in the Kansas City metro, we treat it. We cover the urban core ZIPs where spider calls cluster, 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.
★★★★★

“Found a brown recluse in the basement and freaked out. BugBros identified it, set glue traps, and treated the harborage. The follow-up visit caught the ones that hatched later. CRAZY HAPPY.”

Lauren · Waldo, Kansas City
★★★★★

“Spiders every time I opened the storage closet. The tech walked me through swapping cardboard for plastic bins and treated the whole perimeter. Way fewer since. CRAZY HAPPY here.”

Tyler · Brookside, Kansas City
★★★★★

“On the quarterly plan now and the spiders haven’t come back. No contract, honest read on what I actually had, always on time. CRAZY HAPPY customer for life.”

Renee · Hyde Park, Kansas City

No More Spiders. 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 spiders, that means identifying the species, treating the harborage at the source, and the CRAZY HAPPY Club barrier to keep them from coming back. If they 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(); } })();