.bcs{width:100%;background:#ffffff;overflow:hidden;font-family:'DM Sans',system-ui,sans-serif;color:#1B1B2F;-webkit-font-smoothing:antialiased}
.bcs,.bcs *{box-sizing:border-box}
.bcs a{color:inherit;text-decoration:none}
.bcs ::selection{background:#FFC4DA;color:#1B1B2F}
.bcs [hidden]{display:none!important}
.bcs section h1,.bcs section h2,.bcs section h3{color:inherit}
.bcs button{text-transform:none;letter-spacing:normal}
.bcs .btn{display:inline-flex;align-items:center;gap:10px;min-height:52px;padding:0 28px;border:3px solid #1B1B2F;border-radius:999px;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;font-size:18px;box-shadow:4px 4px 0 #1B1B2F;cursor:pointer;transition:transform .15s ease,box-shadow .15s ease}
.bcs .btn:hover{transform:translate(-2px,-2px);box-shadow:6px 6px 0 #1B1B2F}
.bcs .btn:active{transform:translate(3px,3px);box-shadow:1px 1px 0 #1B1B2F}
.bcs .tile{transition:transform .2s ease}
.bcs .tile:hover{transform:rotate(0deg) translateY(-6px)!important}
.bcs .sticker{position:absolute;border:3px solid #1B1B2F;box-shadow:4px 4px 0 #1B1B2F;font-family:'Bricolage Grotesque',sans-serif;font-weight:800;white-space:nowrap}
.bcs .field{width:100%;min-height:52px;padding:12px 16px;border:3px solid #1B1B2F;border-radius:14px;background:#fff;font:500 17px 'DM Sans',sans-serif;color:#1B1B2F}
.bcs .field:focus{outline:4px solid #B8EBD0;outline-offset:0}
.bcs .chip{min-height:44px;padding:0 18px;border:3px solid #1B1B2F;border-radius:999px;background:#3432c7;color:#ffffff;font:700 16px 'DM Sans',sans-serif;cursor:pointer;transition:transform .15s ease}
.bcs .chip:hover{transform:translateY(-2px)}
.bcs .chip[aria-pressed="true"]{background:#B8EBD0;color:#1B1B2F}
.bcs .marquee{display:flex;width:max-content;animation:bcs-slide 60s linear infinite}
@keyframes bcs-slide{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.bcs .bus{position:absolute;bottom:20px;left:-220px;animation:bcs-drive 16s linear infinite}
@keyframes bcs-drive{from{left:-220px}to{left:100%}}
@media (prefers-reduced-motion:reduce){.bcs .marquee{animation:none}.bcs .bus{animation:none;left:8%}.bcs .tile,.bcs .btn,.bcs .chip{transition:none}}
.bcs .ar-wrap{max-width:1180px;margin:0 auto}
.bcs .ar-hero{background:#B8EBD0;padding:clamp(40px,6vw,88px) clamp(20px,5vw,80px) clamp(56px,7vw,96px);border-bottom:3px solid #1B1B2F}
.bcs .ar-herogrid{display:flex;flex-wrap:wrap;gap:48px;align-items:center}
.bcs .ar-herotext{flex:1 1 460px;min-width:0}
.bcs .ar-pill{display:inline-block;padding:8px 18px;border:3px solid #1B1B2F;border-radius:999px;background:#fff;font-weight:700;font-size:15px;transform:rotate(-2deg)}
.bcs .ar-hero h1{margin:26px 0 0;font:800 clamp(40px,6vw,76px)/1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.035em;color:#1B1B2F}
.bcs .ar-und{background:linear-gradient(transparent 62%,#FF7A3D 62%,#FF7A3D 90%,transparent 90%)}
.bcs .ar-lead{margin:26px 0 0;max-width:560px;font-size:clamp(18px,2vw,21px);line-height:1.5;font-weight:500}
.bcs .ar-bullets{margin:24px 0 0;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:10px}
.bcs .ar-bullets li{padding:7px 14px;border:3px solid #1B1B2F;border-radius:999px;background:#fff;font-weight:700;font-size:15px}
.bcs .ar-card{flex:1 1 400px;min-width:0;max-width:520px;background:#fff;border:3px solid #1B1B2F;border-radius:24px;box-shadow:8px 8px 0 #1B1B2F;padding:clamp(20px,3.5vw,32px);transform:rotate(1deg)}
.bcs .ar-field{margin-bottom:16px}
.bcs .ar-field label{display:block;margin-bottom:7px;font-weight:700;font-size:16px}
.bcs .ar-go{width:100%;justify-content:center;margin-top:4px;background:#FF7A3D;color:#1B1B2F}
.bcs .ar-err{margin:0 0 14px;padding:12px 16px;background:#FFC4DA;border:3px solid #1B1B2F;border-radius:14px;font-weight:600;font-size:15px;line-height:1.45}
.bcs .ar-ph{font-size:18px;margin-bottom:14px}
.bcs .ar-steps{margin:0;padding:0;list-style:none}
.bcs .ar-steps li{display:flex;align-items:center;gap:12px;padding:9px 0;font-weight:500;font-size:17px;color:#7b7b8e;transition:color .2s}
.bcs .ar-steps li i{flex:none;width:28px;height:28px;border:3px solid #1B1B2F;border-radius:50%;background:#fff;display:flex;align-items:center;justify-content:center;font:800 14px 'Bricolage Grotesque',sans-serif;font-style:normal;color:#1B1B2F}
.bcs .ar-steps li.on{color:#1B1B2F;font-weight:700}
.bcs .ar-steps li.on i{border-top-color:#2A3BDB;animation:ar-spin .8s linear infinite}
.bcs .ar-steps li.done{color:#1B1B2F}
.bcs .ar-steps li.done i{background:#B8EBD0}
.bcs .ar-bar{margin-top:14px;height:16px;border:3px solid #1B1B2F;border-radius:999px;background:#fff;overflow:hidden}
.bcs .ar-bar i{display:block;height:100%;width:4%;background:#2A3BDB;transition:width .6s ease}
@keyframes ar-spin{to{transform:rotate(360deg)}}
.bcs .ar-res{background:#fff;padding:clamp(56px,7vw,96px) clamp(20px,5vw,80px);border-bottom:3px solid #1B1B2F}
.bcs .ar-kick{display:inline-block;font:600 40px 'Caveat',cursive;color:#2A3BDB;transform:rotate(-2deg)}
.bcs .ar-kickw{color:#B8EBD0}
.bcs .ar-top{margin-top:8px;display:flex;flex-wrap:wrap;align-items:center;gap:36px}
.bcs .ar-stamp{flex:none;width:170px;height:170px;border:5px solid #1B1B2F;border-radius:50%;box-shadow:8px 8px 0 #1B1B2F;display:flex;align-items:center;justify-content:center;background:#B8EBD0;transform:rotate(-6deg)}
.bcs .ar-stamp span{font:800 110px/1 'Bricolage Grotesque',sans-serif;color:#1B1B2F}
.bcs .ar-stamp.g-c{background:#DDE3FF}.bcs .ar-stamp.g-d{background:#FFA46B}.bcs .ar-stamp.g-f{background:#FFC4DA}
.bcs .ar-topinfo{flex:1 1 320px;min-width:0}
.bcs .ar-topinfo h2{margin:0;font:800 clamp(34px,4.6vw,56px)/1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.03em;color:#1B1B2F}
.bcs .ar-score{margin:12px 0 0;font-size:20px;line-height:1.4;word-break:break-word}
.bcs .ar-score b{font:800 30px 'Bricolage Grotesque',sans-serif}
.bcs .ar-counts{margin:10px 0 0;font-weight:700;font-size:16px}
.bcs .ar-note{margin:14px 0 0;padding:12px 16px;background:#FFC4DA;border:3px solid #1B1B2F;border-radius:14px;font-weight:600;font-size:15px;line-height:1.45}
.bcs .ar-cats{margin-top:40px;display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:22px}
.bcs .ar-cat{border:3px solid #1B1B2F;border-radius:16px;box-shadow:4px 4px 0 #1B1B2F;padding:20px 14px;text-align:center}
.bcs .ar-cat:nth-child(1){background:#fff;transform:rotate(-1.5deg)}.bcs .ar-cat:nth-child(2){background:#DDE3FF;transform:rotate(1.2deg)}.bcs .ar-cat:nth-child(3){background:#FFC4DA;transform:rotate(-1deg)}.bcs .ar-cat:nth-child(4){background:#B8EBD0;transform:rotate(1.4deg)}
.bcs .ar-ring{position:relative;width:96px;height:96px;margin:0 auto 10px}
.bcs .ar-ring svg{width:100%;height:100%;transform:rotate(-90deg)}
.bcs .ar-rbg{fill:none;stroke:rgba(27,27,47,.15);stroke-width:3.5}
.bcs .ar-rfill{fill:none;stroke-width:3.5;stroke-linecap:round;transition:stroke-dasharray 1s cubic-bezier(.4,0,.2,1)}
.bcs .ar-rnum{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font:800 28px 'Bricolage Grotesque',sans-serif}
.bcs .ar-s-g{stroke:#0cce6b}.bcs .ar-s-o{stroke:#ffa400}.bcs .ar-s-r{stroke:#ff4e42}
.bcs .ar-cat h4{margin:0;font:800 19px 'Bricolage Grotesque',sans-serif;color:#1B1B2F}
.bcs .ar-cat p{margin:6px 0 0;font-weight:700;font-size:14px}
.bcs .ar-h3{margin:44px 0 0;font:800 clamp(26px,3vw,34px)/1.1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F}
.bcs .ar-fixes{margin:18px 0 0;padding:0;list-style:none;display:grid;gap:14px}
.bcs .ar-fixes li{display:flex;gap:14px;align-items:center;padding:14px 18px;background:#fff;border:3px solid #1B1B2F;border-radius:16px;box-shadow:4px 4px 0 #1B1B2F;font-weight:700;font-size:18px;line-height:1.3}
.bcs .ar-n{flex:none;width:38px;height:38px;border-radius:50%;background:#1B1B2F;color:#fff;display:flex;align-items:center;justify-content:center;font:800 20px 'Bricolage Grotesque',sans-serif}
.bcs .ar-imp{margin-left:auto;flex:none;padding:3px 12px;border:2px solid #1B1B2F;border-radius:999px;font-size:13px;background:#FFC4DA}
.bcs .ar-imp.High{background:#FF7A3D}.bcs .ar-imp.Low{background:#B8EBD0}
.bcs .ar-gate{margin-top:40px;background:#DDE3FF;border:3px solid #1B1B2F;border-radius:24px;box-shadow:8px 8px 0 #1B1B2F;padding:clamp(22px,4vw,40px);text-align:center}
.bcs .ar-lock{font-size:38px}
.bcs .ar-gate h3{margin:6px 0 0;font:800 clamp(28px,3.4vw,40px)/1.05 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F}
.bcs .ar-gate p{margin:14px auto 0;max-width:640px;font-size:18px;line-height:1.5}
.bcs .ar-leadrow{margin:24px auto 0;max-width:780px;display:flex;flex-wrap:wrap;gap:12px;justify-content:center}
.bcs .ar-leadrow input{flex:1 1 180px;min-width:0}
.bcs .ar-leadrow input[type=email]{flex:2 1 260px}
.bcs .ar-unlock{background:#FF7A3D;color:#1B1B2F;justify-content:center}
.bcs .ar-gate .ar-err{max-width:780px;margin:14px auto 0;text-align:left}
.bcs .ar-gate .ar-fine{margin-top:12px;font-size:14px;font-weight:500}
.bcs .ar-btn:disabled,.bcs .btn:disabled{opacity:.6;cursor:wait}
.bcs .ar-sumbox{margin-top:40px;padding:24px;background:#E6F6EE;border:3px solid #1B1B2F;border-radius:20px;font-size:19px;line-height:1.55}
.bcs .ar-sumbox b{display:block;margin-bottom:6px;font:800 22px 'Bricolage Grotesque',sans-serif}
.bcs .ar-copy{margin-top:18px;display:grid;gap:12px}
.bcs .ar-copyrow{padding:14px 16px;background:#fff;border:3px solid #1B1B2F;border-radius:14px}
.bcs .ar-copyrow small{display:block;font-weight:700;font-size:13px;letter-spacing:.04em;text-transform:uppercase;color:#2A3BDB}
.bcs .ar-copyrow span{display:block;margin-top:4px;font-size:17px;line-height:1.4;word-break:break-word}
.bcs .ar-copyrow button{margin-top:8px;padding:5px 14px;border:2px solid #1B1B2F;border-radius:999px;background:#FFC4DA;font:700 14px 'DM Sans',sans-serif;cursor:pointer;color:#1B1B2F}
.bcs .ar-grp{margin-top:36px}
.bcs .ar-grp>h4{margin:0 0 14px;font:800 26px 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F}
.bcs .ar-chk{margin-bottom:14px;padding:16px 18px;background:#fff;border:3px solid #1B1B2F;border-radius:16px;display:flex;gap:14px}
.bcs .ar-ic{flex:none;width:34px;height:34px;border:3px solid #1B1B2F;border-radius:50%;display:flex;align-items:center;justify-content:center;font:800 17px 'Bricolage Grotesque',sans-serif;color:#1B1B2F}
.bcs .ar-ic.pass{background:#B8EBD0}.bcs .ar-ic.partial{background:#FFC9A3}.bcs .ar-ic.fail{background:#FFC4DA}
.bcs .ar-cb{min-width:0;flex:1}
.bcs .ar-cb h5{margin:0;font:800 18px/1.25 'Bricolage Grotesque',sans-serif;color:#1B1B2F}
.bcs .ar-cb .d{margin:6px 0 0;font-size:16px;line-height:1.45;word-break:break-word}
.bcs .ar-cb .w{margin:8px 0 0;font-size:15px;line-height:1.45;color:#4a4a5e}
.bcs .ar-cb .f{margin:10px 0 0;padding:10px 14px;background:#FFF0E8;border-left:6px solid #FF7A3D;border-radius:6px;font-size:16px;line-height:1.45}
.bcs .ar-cb .f b{font-weight:800}
.bcs .ar-tools{margin-top:30px;display:flex;flex-wrap:wrap;gap:14px}
.bcs .ar-upsell{margin-top:44px;display:flex;flex-wrap:wrap;gap:24px;align-items:center;justify-content:space-between;background:#FFC4DA;border:3px solid #1B1B2F;border-radius:24px;box-shadow:8px 8px 0 #1B1B2F;padding:clamp(22px,4vw,36px)}
.bcs .ar-upl{flex:1 1 380px;min-width:0}
.bcs .ar-kick2{font:600 32px 'Caveat',cursive;color:#2A3BDB}
.bcs .ar-upsell h3{margin:0;font:800 clamp(26px,3vw,36px)/1.05 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F}
.bcs .ar-upsell p{margin:10px 0 0;font-size:18px;line-height:1.5;max-width:560px}
.bcs .ar-upr{display:flex;flex-direction:column;gap:14px}
.bcs .ar-upr .btn{justify-content:center}
.bcs .ar-again{margin-top:36px;display:block;background:none;border:0;padding:0;font:700 17px 'DM Sans',sans-serif;color:#2A3BDB;text-decoration:underline;cursor:pointer}
.bcs .ar-how{background:#2A3BDB;color:#fff;padding:clamp(56px,7vw,96px) clamp(20px,5vw,80px);border-bottom:3px solid #1B1B2F}
.bcs .ar-how h2{margin:6px 0 0;font:800 clamp(34px,4.6vw,56px)/1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.03em;color:#fff}
.bcs .ar-sub{margin:18px 0 0;max-width:680px;font-size:19px;line-height:1.55;color:#fff}
.bcs .ar-how4{margin-top:40px;display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:24px}
.bcs .ar-hc{position:relative;border:3px solid #1B1B2F;border-radius:20px;box-shadow:6px 6px 0 #1B1B2F;padding:28px 22px 24px;color:#1B1B2F}
.bcs .ar-hc h3{margin:12px 0 0;font:800 24px/1.1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.02em;color:#1B1B2F}
.bcs .ar-hc p{margin:10px 0 0;font-size:17px;line-height:1.45;font-weight:500}
.bcs .ar-pts{display:inline-block;padding:3px 12px;border:2px solid #1B1B2F;border-radius:999px;background:#fff;font-weight:700;font-size:14px}
.bcs .ar-h1c{background:#DDE3FF;transform:rotate(-1.2deg)}.bcs .ar-h2c{background:#FFC4DA;transform:rotate(1deg)}.bcs .ar-h3c{background:#B8EBD0;transform:rotate(-0.8deg)}.bcs .ar-h4c{background:#fff;transform:rotate(1.3deg)}
.bcs .ar-cta{background:#FF7A3D;padding:clamp(56px,7vw,96px) clamp(20px,5vw,80px);text-align:center}
.bcs .ar-cta h2{margin:0;font:800 clamp(34px,4.6vw,56px)/1 'Bricolage Grotesque',sans-serif;letter-spacing:-0.03em;color:#1B1B2F}
.bcs .ar-cta p{margin:18px auto 28px;max-width:620px;font-size:20px;line-height:1.5;color:#1B1B2F}
@media (max-width:600px){.bcs .ar-card{transform:none}.bcs .ar-stamp{width:140px;height:140px}.bcs .ar-stamp span{font-size:88px}.bcs .ar-fixes li{flex-wrap:wrap}.bcs .ar-imp{margin-left:52px}.bcs .ar-leadrow .btn{width:100%}}
@media (prefers-reduced-motion:reduce){.bcs .ar-steps li.on i{animation:none}.bcs .ar-rfill,.bcs .ar-bar i{transition:none}}
.bcs .ar-hero ::selection,.bcs .ar-res ::selection,.bcs .ar-how ::selection,.bcs .ar-cta ::selection{background:#FFC4DA;color:#1B1B2F}
.bcs .ar-hero .field:focus,.bcs .ar-gate .field:focus{outline:4px solid #2A3BDB;outline-offset:0}
Free AI Readiness Check
Can AI find and recommend your business?
These days, people ask ChatGPT, Gemini, Claude, and the others who to do business with. Enter your website and see if AI can find and understand you.
Takes about a minute See your grade with no sign-up Plain-English fixes, not jargon
your results
A
AI-ready
0 / 100 for
Your grade is capped at a D because AI crawlers are blocked from reading your site. Fixing that is your first job.
Your top 3 fixes
🔒
Unlock your full report
Get all 20 checks with what we found, why it matters and exactly how to fix it, plus rewritten page copy you can paste in. It is free and I will email you a copy.
Unlock report
No spam. Unsubscribe any time.
want it done for you?
30-Day AI Readiness Roadmap A week-by-week plan built from your scan: the exact fixes in the right order, with copy and schema code ready to paste for your site.
Scan another website
how we grade
20 checks across 4 areas
Every check is pass, partly there or missing. Each carries points that add up to 100. A is 90+, B is 80+, C is 70+, D is 60+.
30 pts Discoverability Page title, meta description, main headline, your city and whether AI crawlers are allowed in.
25 pts Clarity Are your services, promise and service area stated plainly? An AI model reads your page the way a stranger would.
25 pts Machine readability Structured data (schema), sitemap, social tags and clean page foundations.
20 pts Trust Visible name, address and phone, contact options, reviews, credentials and a secure site.
Not sure what your score means?
I help entrepreneurs and local businesses turn a scan like this into a simple marketing plan that people and AI can both act on.
Come say hi
(function () {
/* ====== SETTINGS: edit only this block ====== */
var API_BASE = ''; // Your deployed scanner, no trailing slash. Example: 'https://ai-readiness-api.vercel.app'
var PAYMENT_URL = ''; // Stripe Payment Link for the Roadmap. Leave '' to send people to email instead.
var CONTACT_EMAIL = 'Edgar@conex360.com';
var HOME_CONTACT_URL = '/#hello'; // Where "Come say hi" goes
/* ============================================ */
var $ = function (id) { return document.getElementById(id); };
var root = document.querySelector('.bcs');
if (!$('air-form')) return;
function h(tag, cls, text) { var e = document.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; }
function safeText(v) { return String(v == null ? '' : v); }
var STEPS = ['Reading your homepage', 'Checking if AI crawlers can get in', 'Looking for structured data (schema)', 'Asking AI how clearly you explain yourself', 'Checking trust signals', 'Working out your grade'];
var timer = null, lastScan = null;
function showErr(el, msg) { el.textContent = msg; el.hidden = false; }
$('air-cta').href = HOME_CONTACT_URL;
$('air-call').href = 'mailto:' + CONTACT_EMAIL + '?subject=' + encodeURIComponent('AI Readiness help');
$('air-pay').href = PAYMENT_URL || ('mailto:' + CONTACT_EMAIL + '?subject=' + encodeURIComponent('30-Day AI Readiness Roadmap'));
function startProgress(site) {
$('air-scanning').textContent = site;
var ol = $('air-steps'); ol.textContent = '';
STEPS.forEach(function (s) { var li = h('li'); li.appendChild(h('i', '', '')); li.appendChild(h('span', '', s)); ol.appendChild(li); });
$('air-form').hidden = true; $('air-progress').hidden = false;
var i = 0, items = ol.children;
function tick() {
for (var k = 0; k < items.length; k++) { items[k].className = k < i ? 'done' : k === i ? 'on' : ''; items[k].firstChild.textContent = k < i ? '✓' : ''; }
$('air-barfill').style.width = Math.min(94, 6 + i * 16) + '%';
if (i = 90 ? 'ar-s-g' : s >= 70 ? 'ar-s-o' : s >= 50 ? 'ar-s-o' : 'ar-s-r'; }
function ringEl(score) {
var d = 'M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831', ns = 'http://www.w3.org/2000/svg';
var wrap = h('div', 'ar-ring'), svg = document.createElementNS(ns, 'svg'); svg.setAttribute('viewBox', '0 0 36 36'); svg.setAttribute('aria-hidden', 'true');
var a = document.createElementNS(ns, 'path'); a.setAttribute('class', 'ar-rbg'); a.setAttribute('d', d);
var b = document.createElementNS(ns, 'path'); b.setAttribute('class', 'ar-rfill ' + ringColor(score)); b.setAttribute('d', d); b.setAttribute('stroke-dasharray', '0, 100');
svg.appendChild(a); svg.appendChild(b); wrap.appendChild(svg); wrap.appendChild(h('span', 'ar-rnum', score));
setTimeout(function () { b.setAttribute('stroke-dasharray', score + ', 100'); }, 60);
return wrap;
}
function renderResults(d) {
lastScan = d;
var g = d.overall.grade;
$('air-grade').textContent = g; $('air-stamp').className = 'ar-stamp g-' + g.toLowerCase();
$('air-label').textContent = d.overall.label; $('air-score').textContent = d.overall.score;
$('air-site').textContent = safeText(d.business.name || d.url);
$('air-counts').textContent = d.counts.pass + ' passed, ' + d.counts.partial + ' partly there, ' + d.counts.fail + ' missing';
$('air-capnote').hidden = !d.overall.capped;
var cats = $('air-cats'); cats.textContent = '';
d.categories.forEach(function (c) {
var card = h('div', 'ar-cat tile'); card.appendChild(ringEl(c.score)); card.appendChild(h('h4', '', c.name));
card.appendChild(h('p', '', c.pass + ' of ' + c.total + ' passed')); cats.appendChild(card);
});
var fx = $('air-fixes'); fx.textContent = '';
d.topFixes.forEach(function (f, i) {
var li = h('li'); li.appendChild(h('span', 'ar-n', i + 1)); li.appendChild(h('span', '', f.title)); li.appendChild(h('span', 'ar-imp ' + f.impact, f.impact + ' impact')); fx.appendChild(li);
});
if (!d.topFixes.length) fx.appendChild(h('li', '', 'Nothing urgent. Nice work!'));
$('air-gate').hidden = false; $('air-full').hidden = true; $('air-full').textContent = ''; $('air-upsell').hidden = true;
$('air-results').hidden = false;
$('air-results').scrollIntoView({ behavior: 'smooth', block: 'start' });
}
var ICON = { pass: '✓', partial: '~', fail: '✕' };
function renderFull(full) {
var box = $('air-full'); box.textContent = '';
if (full.summary) { var s = h('div', 'ar-sumbox'); s.appendChild(h('b', '', 'How AI would describe you today')); s.appendChild(h('span', '', full.summary)); box.appendChild(s); }
if (full.suggestedCopy) {
box.appendChild(h('h3', 'ar-h3', 'Copy you can paste in'));
var wrap = h('div', 'ar-copy');
[['Page title', full.suggestedCopy.title], ['Meta description', full.suggestedCopy.metaDescription], ['Main headline (H1)', full.suggestedCopy.h1]].forEach(function (r) {
if (!r[1]) return; var row = h('div', 'ar-copyrow'); row.appendChild(h('small', '', r[0])); row.appendChild(h('span', '', r[1]));
var b = h('button', '', 'Copy'); b.type = 'button';
b.addEventListener('click', function () { try { navigator.clipboard.writeText(r[1]); b.textContent = 'Copied!'; setTimeout(function () { b.textContent = 'Copy'; }, 1500); } catch (e) { b.textContent = 'Select and copy'; } });
row.appendChild(b); wrap.appendChild(row);
});
box.appendChild(wrap);
}
box.appendChild(h('h3', 'ar-h3', 'All 20 checks'));
lastScan.categories.forEach(function (c) {
var grp = h('div', 'ar-grp'); grp.appendChild(h('h4', '', c.name + ' · ' + c.score + '/100'));
full.checks.filter(function (k) { return k.category === c.id; }).forEach(function (k) {
var row = h('div', 'ar-chk'), cb = h('div', 'ar-cb');
row.appendChild(h('span', 'ar-ic ' + k.status, ICON[k.status])); cb.appendChild(h('h5', '', k.label));
cb.appendChild(h('p', 'd', k.detail));
if (k.status !== 'pass') { cb.appendChild(h('p', 'w', 'Why it matters: ' + k.why)); var f = h('p', 'f'); f.appendChild(h('b', '', 'How to fix: ')); f.appendChild(document.createTextNode(k.fix)); cb.appendChild(f); }
row.appendChild(cb); grp.appendChild(row);
});
box.appendChild(grp);
});
var tools = h('div', 'ar-tools'); var pb = h('button', 'btn', 'Download as PDF'); pb.type = 'button'; pb.style.cssText = 'background:#1B1B2F;color:#fff;box-shadow:4px 4px 0 #FF7A3D';
pb.addEventListener('click', function () { printReport(full); }); tools.appendChild(pb); box.appendChild(tools);
box.hidden = false; $('air-upsell').hidden = false;
}
function esc(s) { return safeText(s).replace(/[&"]/g, function (c) { return { '&': '&', '': '>', '"': '"' }[c]; }); }
function printReport(full) {
var d = lastScan, w = window.open('', '_blank'); if (!w) { alert('Please allow pop-ups to download the PDF.'); return; }
var out = '
AI Readiness Report body{font:15px/1.5 system-ui,sans-serif;color:#1B1B2F;max-width:780px;margin:30px auto;padding:0 20px}h1{margin:0;font-size:30px}h2{margin:28px 0 8px;font-size:20px;border-bottom:3px solid #1B1B2F}.g{display:inline-block;width:90px;height:90px;border:4px solid #1B1B2F;border-radius:50%;text-align:center;font:800 60px/84px system-ui;background:#B8EBD0}.c{margin:10px 0;padding:10px 12px;border:2px solid #1B1B2F;border-radius:10px;page-break-inside:avoid}.s{font-weight:800}.pass{color:#067a40}.partial{color:#b36b00}.fail{color:#c0281a}@media print{a{display:none}}';
out += '
AI Readiness Report ' + esc(d.business.name || d.url) + ' · ' + esc(d.url) + ' ' + esc(d.business.category) + ' in ' + esc(d.business.location) + ' · ' + esc(new Date(d.scannedAt).toLocaleDateString()) + '
';
out += '
' + esc(d.overall.grade) + ' ' + d.overall.score + ' / 100 · ' + esc(d.overall.label) + '
';
if (full.summary) out += '
' + esc(full.summary) + '
';
out += '
Category scores ' + d.categories.map(function (c) { return '
' + esc(c.name) + ': ' + c.score + '/100
'; }).join('');
if (full.suggestedCopy) out += '
Suggested copy Title: ' + esc(full.suggestedCopy.title) + '
Meta description: ' + esc(full.suggestedCopy.metaDescription) + '
H1: ' + esc(full.suggestedCopy.h1) + '
';
d.categories.forEach(function (c) {
out += '
' + esc(c.name) + ' ';
full.checks.filter(function (k) { return k.category === c.id; }).forEach(function (k) {
out += '
' + ICON[k.status] + ' ' + esc(k.label) + ' ' + esc(k.detail) + (k.status !== 'pass' ? 'Why: ' + esc(k.why) + 'Fix: ' + esc(k.fix) : '') + '
';
});
});
out += '
Prepared by Biz Coach Studio · ' + esc(CONTACT_EMAIL) + '
Print / Save as PDF setTimeout(function(){print()},400)';
w.document.open(); w.document.write(out); w.document.close();
}
$('air-form').addEventListener('submit', function (e) {
e.preventDefault();
var err = $('air-formerr'); err.hidden = true;
var url = $('air-url').value.trim(), name = $('air-name').value.trim(), cat = $('air-cat').value.trim(), loc = $('air-loc').value.trim();
if (!url) return showErr(err, 'Please enter your website address.');
var rawUrl = url; // sent as typed; the server tries https first, then http
if (!/^https?:\/\//i.test(url)) url = 'https://' + url;
try { var u = new URL(url); if (u.hostname.indexOf('.') < 1) throw 0; } catch (x) { return showErr(err, 'That does not look like a website address. Try something like yourwebsite.com'); }
if (!cat) return showErr(err, 'Tell us what kind of business it is, like "plumber" or "family dentist".');
if (!loc) return showErr(err, 'Enter the city you want to be found in, like "Pasadena, CA".');
if (!API_BASE) return showErr(err, 'The scanner is not connected yet. Please check back soon.');
$('air-results').hidden = true;
startProgress(u.hostname.replace(/^www\./, ''));
var ctl = window.AbortController ? new AbortController() : null, to = setTimeout(function () { if (ctl) ctl.abort(); }, 90000), started = Date.now();
fetch(API_BASE + '/api/scan', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: rawUrl, name: name, category: cat, location: loc }), signal: ctl ? ctl.signal : undefined })
.then(function (r) { return r.json().catch(function () { return {}; }).then(function (j) { if (!r.ok) throw new Error(j.error || 'Something went wrong. Please try again.'); return j; }); })
.then(function (j) {
var wait = Math.max(0, 5000 - (Date.now() - started)); // let the progress animation breathe
setTimeout(function () { $('air-barfill').style.width = '100%'; setTimeout(function () { stopProgress(); renderResults(j); }, 400); }, wait);
})
.catch(function (x) { stopProgress(); showErr(err, x && x.name === 'AbortError' ? 'That took too long. Please try again.' : (x && x.message && x.message !== 'Failed to fetch' ? x.message : 'We could not reach the scanner. Please try again in a moment.')); })
.then(function () { clearTimeout(to); });
});
$('air-lead').addEventListener('submit', function (e) {
e.preventDefault();
var err = $('air-lerr'); err.hidden = true;
var email = $('air-lemail').value.trim();
if (!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(email)) return showErr(err, 'Please enter a valid email address.');
var btn = $('air-lbtn'); btn.disabled = true; btn.textContent = 'Unlocking...';
fetch(API_BASE + '/api/lead', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: email, name: $('air-lname').value.trim(), token: lastScan.unlockToken, url: lastScan.url, grade: lastScan.overall.grade, score: lastScan.overall.score, business: lastScan.business }) })
.then(function (r) { return r.json().catch(function () { return {}; }).then(function (j) { if (!r.ok) throw new Error(j.error || 'Something went wrong.'); return j; }); })
.then(function (full) { $('air-gate').hidden = true; renderFull(full); $('air-full').scrollIntoView({ behavior: 'smooth', block: 'start' }); })
.catch(function (x) { showErr(err, x && x.message && x.message !== 'Failed to fetch' ? x.message : 'We could not unlock the report. Please try again.'); })
.then(function () { btn.disabled = false; btn.textContent = 'Unlock report'; });
});
$('air-again').addEventListener('click', function () { $('air-results').hidden = true; $('air-formcard').scrollIntoView({ behavior: 'smooth', block: 'center' }); $('air-url').focus(); });
})();