{"id":10,"date":"2026-04-17T19:09:45","date_gmt":"2026-04-17T19:09:45","guid":{"rendered":"https:\/\/restorationsiteaudit.com\/?page_id=10"},"modified":"2026-04-21T21:08:46","modified_gmt":"2026-04-21T21:08:46","slug":"home","status":"publish","type":"page","link":"https:\/\/restorationsiteaudit.com\/","title":{"rendered":"Home"},"content":{"rendered":"\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\" \/>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin \/>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600;9..144,700;9..144,800&#038;family=Inter:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\" \/>\n<style>\n  :root {\n    --bg: #0d1b2e;\n    --bg-deep: #0a1525;\n    --bg-card: #132338;\n    --bg-input: #1a2c44;\n    --border: rgba(255, 255, 255, 0.08);\n    --border-strong: rgba(255, 255, 255, 0.14);\n    --text: #ffffff;\n    --text-muted: #a6b5c8;\n    --text-soft: #7e8fa3;\n    --mint: #8fe3c8;\n    --peach: #f4a47c;\n    --peach-2: #e88b6a;\n    --peach-gradient: linear-gradient(135deg, #f4b896 0%, #e88b6a 100%);\n  }\n\n  * { box-sizing: border-box; margin: 0; padding: 0; }\n\n  html { scroll-behavior: smooth; }\n\n  body {\n    font-family: 'Inter', sans-serif;\n    background: var(--bg);\n    color: var(--text);\n    line-height: 1.6;\n    overflow-x: hidden;\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n\n  \/* Background atmosphere - starfield + gradient *\/\n  body::before {\n    content: '';\n    position: fixed;\n    inset: 0;\n    background:\n      radial-gradient(circle at 20% 10%, rgba(143, 227, 200, 0.08) 0%, transparent 40%),\n      radial-gradient(circle at 85% 90%, rgba(244, 164, 124, 0.06) 0%, transparent 45%);\n    pointer-events: none;\n    z-index: 0;\n  }\n\n  .stars {\n    position: fixed;\n    inset: 0;\n    pointer-events: none;\n    z-index: 0;\n    opacity: 0.5;\n  }\n\n  .stars::before,\n  .stars::after {\n    content: '';\n    position: absolute;\n    inset: 0;\n    background-image:\n      radial-gradient(1px 1px at 15% 20%, white, transparent),\n      radial-gradient(1px 1px at 75% 40%, white, transparent),\n      radial-gradient(1px 1px at 30% 70%, white, transparent),\n      radial-gradient(1px 1px at 90% 15%, white, transparent),\n      radial-gradient(1px 1px at 50% 85%, white, transparent),\n      radial-gradient(1px 1px at 10% 55%, white, transparent),\n      radial-gradient(1px 1px at 65% 25%, white, transparent),\n      radial-gradient(1px 1px at 40% 95%, white, transparent);\n    background-size: 100% 100%;\n    opacity: 0.4;\n  }\n\n  .container {\n    max-width: 1200px;\n    margin: 0 auto;\n    padding: 0 24px;\n    position: relative;\n    z-index: 1;\n  }\n\n  \/* Nav *\/\n  nav {\n    padding: 24px 0;\n    position: relative;\n    z-index: 10;\n  }\n\n  .nav-inner {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n  }\n\n  .logo {\n    font-family: 'Fraunces', serif;\n    font-weight: 600;\n    font-size: 20px;\n    letter-spacing: -0.02em;\n    color: var(--text);\n    display: flex;\n    align-items: center;\n    gap: 10px;\n  }\n\n  .logo-star {\n    width: 22px;\n    height: 22px;\n    color: var(--mint);\n  }\n\n  .nav-tag {\n    font-size: 12px;\n    color: var(--text-muted);\n    font-style: italic;\n  }\n\n  \/* Hero *\/\n  .hero {\n    padding: 60px 0 40px;\n    position: relative;\n  }\n\n  .nova-badge {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    padding: 8px 14px;\n    background: rgba(143, 227, 200, 0.08);\n    border: 1px solid rgba(143, 227, 200, 0.25);\n    border-radius: 100px;\n    font-size: 12px;\n    color: var(--mint);\n    letter-spacing: 0.05em;\n    text-transform: uppercase;\n    font-weight: 500;\n    margin-bottom: 24px;\n  }\n\n  .nova-badge-dot {\n    width: 6px;\n    height: 6px;\n    background: var(--mint);\n    border-radius: 50%;\n    box-shadow: 0 0 8px var(--mint);\n    animation: pulse 2s ease-in-out infinite;\n  }\n\n  @keyframes pulse {\n    0%, 100% { opacity: 1; transform: scale(1); }\n    50% { opacity: 0.6; transform: scale(1.2); }\n  }\n\n  h1 {\n    font-family: 'Fraunces', serif;\n    font-size: clamp(36px, 6vw, 64px);\n    font-weight: 700;\n    line-height: 1.05;\n    letter-spacing: -0.03em;\n    margin-bottom: 18px;\n    max-width: 760px;\n  }\n\n  .hero-subhead {\n    font-family: 'Fraunces', serif;\n    font-style: italic;\n    font-weight: 500;\n    font-size: clamp(20px, 2.5vw, 26px);\n    color: var(--mint);\n    margin-bottom: 28px;\n    letter-spacing: -0.01em;\n  }\n\n  .hero-lead {\n    font-size: 17px;\n    color: var(--text-muted);\n    max-width: 620px;\n    margin-bottom: 32px;\n    line-height: 1.65;\n  }\n\n  .hero-lead strong {\n    color: var(--text);\n    font-weight: 600;\n  }\n\n  \/* Trust badges *\/\n  .trust-row {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 10px;\n    margin-bottom: 16px;\n  }\n\n  .trust-pill {\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    padding: 10px 18px;\n    background: rgba(255, 255, 255, 0.03);\n    border: 1px solid var(--border);\n    border-radius: 100px;\n    font-size: 13px;\n    font-weight: 500;\n    color: var(--text);\n    backdrop-filter: blur(10px);\n  }\n\n  .trust-pill svg {\n    width: 14px;\n    height: 14px;\n  }\n\n  .trust-pill.mint svg { color: var(--mint); }\n  .trust-pill.peach svg { color: var(--peach); }\n\n  \/* Main grid *\/\n  .main-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 60px;\n    padding: 40px 0 80px;\n    align-items: start;\n  }\n\n  @media (max-width: 900px) {\n    .main-grid {\n      grid-template-columns: 1fr;\n      gap: 40px;\n    }\n  }\n\n  \/* What Nova analyzes *\/\n  .analyze-section h2 {\n    font-family: 'Fraunces', serif;\n    font-size: 32px;\n    font-weight: 600;\n    letter-spacing: -0.02em;\n    margin-bottom: 12px;\n    line-height: 1.15;\n  }\n\n  .analyze-section .section-lead {\n    color: var(--text-muted);\n    font-size: 15px;\n    margin-bottom: 28px;\n    line-height: 1.6;\n  }\n\n  .analyze-grid {\n    display: grid;\n    gap: 14px;\n  }\n\n  .analyze-card {\n    padding: 20px 22px;\n    background: var(--bg-card);\n    border: 1px solid var(--border);\n    border-radius: 14px;\n    transition: border-color 0.2s, transform 0.2s;\n  }\n\n  .analyze-card:hover {\n    border-color: rgba(143, 227, 200, 0.3);\n    transform: translateY(-2px);\n  }\n\n  .analyze-header {\n    display: flex;\n    align-items: center;\n    gap: 12px;\n    margin-bottom: 8px;\n  }\n\n  .analyze-icon {\n    width: 36px;\n    height: 36px;\n    border-radius: 10px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    background: rgba(143, 227, 200, 0.1);\n    color: var(--mint);\n    flex-shrink: 0;\n  }\n\n  .analyze-icon svg { width: 18px; height: 18px; }\n\n  .analyze-title {\n    font-weight: 600;\n    font-size: 15px;\n    color: var(--text);\n  }\n\n  .analyze-tag {\n    margin-left: auto;\n    font-size: 11px;\n    padding: 3px 10px;\n    background: rgba(143, 227, 200, 0.12);\n    color: var(--mint);\n    border-radius: 100px;\n    letter-spacing: 0.04em;\n    text-transform: uppercase;\n    font-weight: 500;\n  }\n\n  .analyze-desc {\n    font-size: 13.5px;\n    color: var(--text-muted);\n    margin-left: 48px;\n    line-height: 1.55;\n  }\n\n  \/* Form Card *\/\n  .form-card {\n    background: var(--bg-card);\n    border: 1px solid var(--border);\n    border-radius: 20px;\n    padding: 32px 28px;\n    position: sticky;\n    top: 24px;\n  }\n\n  .form-title {\n    font-family: 'Fraunces', serif;\n    font-size: 28px;\n    font-weight: 600;\n    letter-spacing: -0.02em;\n    margin-bottom: 8px;\n  }\n\n  .form-sub {\n    font-size: 14px;\n    color: var(--text-muted);\n    margin-bottom: 24px;\n  }\n\n  .form-group {\n    margin-bottom: 16px;\n  }\n\n  .form-label {\n    display: block;\n    font-size: 12.5px;\n    color: var(--text);\n    margin-bottom: 6px;\n    font-weight: 500;\n    letter-spacing: 0.01em;\n  }\n\n  .form-input {\n    width: 100%;\n    padding: 12px 14px;\n    background: var(--bg-input);\n    border: 1px solid var(--border);\n    border-radius: 10px;\n    color: var(--text);\n    font-size: 14px;\n    font-family: inherit;\n    transition: border-color 0.2s, background 0.2s;\n  }\n\n  .form-input::placeholder {\n    color: var(--text-soft);\n  }\n\n  .form-input:focus {\n    outline: none;\n    border-color: var(--mint);\n    background: #1f3352;\n  }\n\n  .form-helper {\n    font-size: 11.5px;\n    color: var(--text-soft);\n    margin-top: 4px;\n    font-style: italic;\n  }\n\n  .cities-grid {\n    display: grid;\n    gap: 8px;\n  }\n\n  .submit-btn {\n    width: 100%;\n    padding: 16px;\n    background: var(--peach-gradient);\n    color: #2a1410;\n    border: none;\n    border-radius: 12px;\n    font-size: 15px;\n    font-weight: 700;\n    cursor: pointer;\n    font-family: inherit;\n    margin-top: 8px;\n    letter-spacing: 0.01em;\n    transition: transform 0.2s, box-shadow 0.2s;\n    box-shadow: 0 8px 24px rgba(232, 139, 106, 0.25);\n  }\n\n  .submit-btn:hover {\n    transform: translateY(-2px);\n    box-shadow: 0 12px 32px rgba(232, 139, 106, 0.35);\n  }\n\n  .form-disclaimer {\n    text-align: center;\n    font-size: 11.5px;\n    color: var(--text-soft);\n    margin-top: 14px;\n  }\n\n  \/* How It Works *\/\n  .section {\n    padding: 80px 0;\n    border-top: 1px solid var(--border);\n  }\n\n  .section-header {\n    text-align: center;\n    margin-bottom: 56px;\n  }\n\n  .section h2 {\n    font-family: 'Fraunces', serif;\n    font-size: clamp(30px, 4vw, 42px);\n    font-weight: 600;\n    letter-spacing: -0.02em;\n    line-height: 1.15;\n    margin-bottom: 12px;\n  }\n\n  .section .section-lead {\n    color: var(--text-muted);\n    font-size: 16px;\n    max-width: 560px;\n    margin: 0 auto;\n  }\n\n  .steps-grid {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 20px;\n  }\n\n  @media (max-width: 800px) {\n    .steps-grid { grid-template-columns: 1fr; }\n  }\n\n  .step-card {\n    background: var(--bg-card);\n    border: 1px solid var(--border);\n    border-radius: 16px;\n    padding: 28px 26px;\n    position: relative;\n  }\n\n  .step-num {\n    font-family: 'Fraunces', serif;\n    font-size: 48px;\n    font-weight: 700;\n    color: var(--mint);\n    line-height: 1;\n    margin-bottom: 16px;\n    opacity: 0.85;\n  }\n\n  .step-card h3 {\n    font-family: 'Fraunces', serif;\n    font-size: 20px;\n    font-weight: 600;\n    margin-bottom: 10px;\n    letter-spacing: -0.01em;\n  }\n\n  .step-card p {\n    color: var(--text-muted);\n    font-size: 14px;\n    line-height: 1.6;\n  }\n\n  \/* Nova Origin section *\/\n  .nova-origin {\n    background: linear-gradient(135deg, rgba(143, 227, 200, 0.04) 0%, rgba(244, 164, 124, 0.04) 100%);\n    border: 1px solid var(--border);\n    border-radius: 24px;\n    padding: 48px 40px;\n    margin: 40px 0;\n    position: relative;\n    overflow: hidden;\n  }\n\n  .nova-origin::before {\n    content: '';\n    position: absolute;\n    top: -50%;\n    right: -20%;\n    width: 500px;\n    height: 500px;\n    background: radial-gradient(circle, rgba(143, 227, 200, 0.08) 0%, transparent 60%);\n    pointer-events: none;\n  }\n\n  .nova-origin-inner {\n    position: relative;\n    max-width: 780px;\n  }\n\n  .nova-origin h3 {\n    font-family: 'Fraunces', serif;\n    font-size: clamp(24px, 3vw, 30px);\n    font-weight: 600;\n    margin-bottom: 16px;\n    letter-spacing: -0.02em;\n  }\n\n  .nova-origin p {\n    color: var(--text-muted);\n    font-size: 15.5px;\n    line-height: 1.7;\n  }\n\n  .nova-origin p strong {\n    color: var(--text);\n    font-weight: 600;\n  }\n\n  \/* Stats *\/\n  .stats-grid {\n    display: grid;\n    grid-template-columns: repeat(4, 1fr);\n    gap: 20px;\n    margin-top: 40px;\n  }\n\n  @media (max-width: 700px) {\n    .stats-grid { grid-template-columns: repeat(2, 1fr); }\n  }\n\n  .stat {\n    text-align: center;\n    padding: 28px 16px;\n    background: var(--bg-card);\n    border: 1px solid var(--border);\n    border-radius: 14px;\n  }\n\n  .stat-num {\n    font-family: 'Fraunces', serif;\n    font-size: 38px;\n    font-weight: 700;\n    color: var(--peach);\n    line-height: 1;\n    margin-bottom: 6px;\n    letter-spacing: -0.02em;\n  }\n\n  .stat-label {\n    font-size: 12.5px;\n    color: var(--text-muted);\n    font-weight: 500;\n    letter-spacing: 0.02em;\n  }\n\n  \/* Footer *\/\n  footer {\n    padding: 48px 0 32px;\n    border-top: 1px solid var(--border);\n    text-align: center;\n  }\n\n  .footer-logo {\n    font-family: 'Fraunces', serif;\n    font-weight: 600;\n    font-size: 18px;\n    margin-bottom: 8px;\n  }\n\n  .footer-tag {\n    font-size: 13px;\n    color: var(--mint);\n    font-style: italic;\n    margin-bottom: 20px;\n  }\n\n  .footer-copy {\n    font-size: 12.5px;\n    color: var(--text-soft);\n    margin-bottom: 12px;\n  }\n\n  .footer-links {\n    display: flex;\n    gap: 24px;\n    justify-content: center;\n    flex-wrap: wrap;\n  }\n\n  .footer-links a {\n    color: var(--text-muted);\n    text-decoration: none;\n    font-size: 12.5px;\n    transition: color 0.2s;\n  }\n\n  .footer-links a:hover { color: var(--mint); }\n\n  \/* Mobile tweaks *\/\n  @media (max-width: 600px) {\n    .hero { padding: 40px 0 20px; }\n    .form-card { padding: 26px 22px; }\n    .nova-origin { padding: 32px 24px; }\n    .section { padding: 56px 0; }\n  }\n<\/style>\n<style>\n  .spinner{display:inline-block;width:20px;height:20px;border:2.5px solid rgba(42,20,16,0.3);border-top-color:#2a1410;border-radius:50%;animation:spin .7s linear infinite}\n  @keyframes spin{to{transform:rotate(360deg)}}\n<\/style>\n\n\n<div class=\"stars\"><\/div>\n\n<section class=\"hero\" style=\"padding-top: 60px;\">\n  <div class=\"container\">\n    <div class=\"nova-badge\">\n      <span class=\"nova-badge-dot\"><\/span>\n      Nova AI \u00b7 Audit Specialist\n    <\/div>\n\n    <h1>Stop Being Invisible Online.<\/h1>\n    <p class=\"hero-subhead\">(and discover what&#8217;s costing you calls)<\/p>\n\n    <p class=\"hero-lead\">\n      Meet Nova, our AI audit specialist built for the restoration industry. Nova connects directly to <strong>live APIs that currently track hundreds of restoration websites and local maps listings<\/strong> to pull real ranking data, backlink profiles, and local search visibility for your business. No guesswork. No fluff. <strong>Just real data.<\/strong>\n    <\/p>\n\n    <div class=\"trust-row\">\n      <div class=\"trust-pill mint\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"M12 1l3 6 6 .75-4.5 4.25L18 18l-6-3-6 3 1.5-6L3 7.75 9 7z\"\/><\/svg>\n        Nova AI Analysis\n      <\/div>\n      <div class=\"trust-pill\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\"\/><path d=\"M7 11V7a5 5 0 0110 0v4\"\/><\/svg>\n        256-Bit Encrypted\n      <\/div>\n      <div class=\"trust-pill peach\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 6v6l4 2\"\/><\/svg>\n        Report in 24hrs\n      <\/div>\n      <div class=\"trust-pill\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 2v4M12 18v4M4.93 4.93l2.83 2.83M16.24 16.24l2.83 2.83M2 12h4M18 12h4M4.93 19.07l2.83-2.83M16.24 7.76l2.83-2.83\"\/><\/svg>\n        100% Free\n      <\/div>\n      <div class=\"trust-pill\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 3v18h18\"\/><path d=\"M7 14l4-4 4 4 5-5\"\/><\/svg>\n        Real Live Data\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section class=\"container\">\n  <div class=\"main-grid\">\n    <div class=\"analyze-section\">\n      <h2>What Nova Analyzes<\/h2>\n      <p class=\"section-lead\">Nova connects directly to live APIs that currently track existing restoration websites and maps listings, then extracts actionable insights specific to your market.<\/p>\n\n      <div class=\"analyze-grid\">\n        <div class=\"analyze-card\">\n          <div class=\"analyze-header\">\n            <div class=\"analyze-icon\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z\"\/><circle cx=\"12\" cy=\"10\" r=\"3\"\/><\/svg>\n            <\/div>\n            <div class=\"analyze-title\">Local Map Pack Visibility<\/div>\n            <div class=\"analyze-tag\">Live Data<\/div>\n          <\/div>\n          <div class=\"analyze-desc\">Nova uses Local Falcon&#8217;s geographic grid scanning technology to scan your Google Business Profile across a real map grid around each target city. See exactly where you rank in the map pack, block by block.<\/div>\n        <\/div>\n\n        <div class=\"analyze-card\">\n          <div class=\"analyze-header\">\n            <div class=\"analyze-icon\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71\"\/><path d=\"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71\"\/><\/svg>\n            <\/div>\n            <div class=\"analyze-title\">Backlink &amp; Domain Authority<\/div>\n            <div class=\"analyze-tag\">AI Scored<\/div>\n          <\/div>\n          <div class=\"analyze-desc\">Full crawl of your backlink profile. Nova measures domain trust, referring domains, toxic links, and benchmarks against local competitors in your market.<\/div>\n        <\/div>\n\n        <div class=\"analyze-card\">\n          <div class=\"analyze-header\">\n            <div class=\"analyze-icon\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"\/><path d=\"M21 21l-4.35-4.35\"\/><\/svg>\n            <\/div>\n            <div class=\"analyze-title\">Organic Keyword Rankings<\/div>\n            <div class=\"analyze-tag\">Industry Specific<\/div>\n          <\/div>\n          <div class=\"analyze-desc\">Nova tracks 44+ restoration-specific keywords across your target cities: water damage, mold removal, fire restoration, and more. Because we pull real ranking data from live tracking systems, your positions are verified and accurate.<\/div>\n        <\/div>\n\n        <div class=\"analyze-card\">\n          <div class=\"analyze-header\">\n            <div class=\"analyze-icon\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 3v18h18\"\/><rect x=\"7\" y=\"12\" width=\"3\" height=\"6\"\/><rect x=\"12\" y=\"8\" width=\"3\" height=\"10\"\/><rect x=\"17\" y=\"5\" width=\"3\" height=\"13\"\/><\/svg>\n            <\/div>\n            <div class=\"analyze-title\">Competitive Gap Analysis<\/div>\n            <div class=\"analyze-tag\">Live Data<\/div>\n          <\/div>\n          <div class=\"analyze-desc\">See where you stand against the top-ranking restoration companies in your area. Nova identifies exactly which keywords and positions your competitors own that you are missing.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"form-card\">\n      <div class=\"form-title\">Start Your Free Audit<\/div>\n      <div class=\"form-sub\">Enter your details below. Nova gets to work immediately. Report delivered within 24 hours.<\/div>\n\n      <div id=\"formFields\">\n        <div class=\"form-group\">\n          <label class=\"form-label\">Your Name<\/label>\n          <input class=\"form-input\" id=\"name\" type=\"text\" placeholder=\"John Doe\" \/>\n        <\/div>\n\n        <div class=\"form-group\">\n          <label class=\"form-label\">Email Address<\/label>\n          <input class=\"form-input\" id=\"email\" type=\"email\" placeholder=\"john@company.com\" \/>\n          <div class=\"form-helper\">Your report will be delivered here<\/div>\n        <\/div>\n\n        <div class=\"form-group\">\n          <label class=\"form-label\">Business Name<\/label>\n          <input class=\"form-input\" id=\"businessName\" type=\"text\" placeholder=\"Acme Restoration\" \/>\n        <\/div>\n\n        <div class=\"form-group\">\n          <label class=\"form-label\">Website URL<\/label>\n          <input class=\"form-input\" id=\"websiteUrl\" type=\"url\" placeholder=\"https:\/\/acmerestoration.com\" \/>\n        <\/div>\n\n        <div class=\"form-group\">\n          <label class=\"form-label\">Google Business Profile <span style=\"color:var(--text-soft);font-weight:400;\">(optional)<\/span><\/label>\n          <input class=\"form-input\" id=\"gbpName\" type=\"text\" placeholder=\"Listing name or Google Maps link\" \/>\n          <div class=\"form-helper\">Enter your GBP listing name or paste your Google Maps link. If you&#8217;re not sure, leave blank and we&#8217;ll find it.<\/div>\n        <\/div>\n\n        <div class=\"form-group\">\n          <label class=\"form-label\">Target Cities (up to 3)<\/label>\n          <div class=\"cities-grid\">\n            <input class=\"form-input\" id=\"city1\" type=\"text\" placeholder=\"City 1\" \/>\n            <input class=\"form-input\" id=\"city2\" type=\"text\" placeholder=\"City 2\" \/>\n            <input class=\"form-input\" id=\"city3\" type=\"text\" placeholder=\"City 3\" \/>\n          <\/div>\n        <\/div>\n\n        <button class=\"submit-btn\" id=\"submitBtn\" onclick=\"submitForm()\">Discover What&#8217;s Costing You Calls \u2192<\/button>\n        <div class=\"form-disclaimer\">No credit card required. No spam. Just your report.<\/div>\n      <\/div>\n\n      <div id=\"formSuccess\" style=\"display:none; text-align:center; padding:40px 20px;\">\n        <div style=\"width:64px;height:64px;background:rgba(143,227,200,0.15);border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto 20px;font-size:28px;color:var(--mint);\">\u2713<\/div>\n        <h3 style=\"font-family:'Fraunces',serif;font-size:1.25rem;font-weight:600;margin-bottom:8px;\">Audit Request Received<\/h3>\n        <p style=\"font-size:0.92rem;color:var(--text-muted);line-height:1.6;\">Nova is already pulling your data. You&#8217;ll receive your full visibility report via email within 24 hours.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section class=\"section\">\n  <div class=\"container\">\n    <div class=\"section-header\">\n      <h2>How Nova Works<\/h2>\n      <p class=\"section-lead\">From submission to actionable insights in three simple steps.<\/p>\n    <\/div>\n\n    <div class=\"steps-grid\">\n      <div class=\"step-card\">\n        <div class=\"step-num\">01<\/div>\n        <h3>Submit Your Details<\/h3>\n        <p>Enter your business info and target markets. Takes less than 60 seconds.<\/p>\n      <\/div>\n      <div class=\"step-card\">\n        <div class=\"step-num\">02<\/div>\n        <h3>Nova Scans &amp; Analyzes<\/h3>\n        <p>Nova pulls real-time data from multiple industry tracking platforms, cross-references against restoration-specific benchmarks, and compiles your results.<\/p>\n      <\/div>\n      <div class=\"step-card\">\n        <div class=\"step-num\">03<\/div>\n        <h3>Get Your Visibility Report<\/h3>\n        <p>Within 24 hours, receive a detailed PDF report in your inbox with rankings, scores, competitor comparisons, and specific action items.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"nova-origin\">\n      <div class=\"nova-origin-inner\">\n        <h3>Nova is Built on the Proven RDM SEO Blueprint<\/h3>\n        <p>This is not a generic website grader. Nova is built on <strong>Restoration Digital Marketing&#8217;s proprietary SEO Blueprint<\/strong>, developed from years of ranking restoration companies to the top of Google. She evaluates your site against the exact strategies, URL structures, and content frameworks that are <strong>proven to generate leads<\/strong> in the restoration industry. Every recommendation is specific to your market and backed by real performance data.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"stats-grid\">\n      <div class=\"stat\">\n        <div class=\"stat-num\">44+<\/div>\n        <div class=\"stat-label\">Keywords Tracked<\/div>\n      <\/div>\n      <div class=\"stat\">\n        <div class=\"stat-num\">25pt<\/div>\n        <div class=\"stat-label\">Map Grid per City<\/div>\n      <\/div>\n      <div class=\"stat\">\n        <div class=\"stat-num\">100%<\/div>\n        <div class=\"stat-label\">Real Live Data<\/div>\n      <\/div>\n      <div class=\"stat\">\n        <div class=\"stat-num\">24hr<\/div>\n        <div class=\"stat-label\">Report Delivery<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<footer>\n  <div class=\"container\">\n    <div class=\"footer-logo\">Restoration Site Audit<\/div>\n    <div class=\"footer-tag\">Helping restoration companies go from invisible to unmissable.<\/div>\n    <div class=\"footer-copy\">Powered by Nova AI, an RDM product \u00b7 \u00a9 2026 Restoration Digital Marketing<\/div>\n  <\/div>\n<\/footer>\n\n<style>\n  .spinner{display:inline-block;width:20px;height:20px;border:2.5px solid rgba(42,20,16,0.3);border-top-color:#2a1410;border-radius:50%;animation:spin .7s linear infinite}\n  @keyframes spin{to{transform:rotate(360deg)}}\n<\/style>\n<script>\n  const API='https:\/\/descriptive-rhinoceros-316.convex.site\/api\/submit';\n  async function submitForm(){\n    const contactName=document.getElementById('name').value.trim();\n    const email=document.getElementById('email').value.trim();\n    const businessName=document.getElementById('businessName').value.trim();\n    const websiteUrl=document.getElementById('websiteUrl').value.trim();\n    const gbpLink=document.getElementById('gbpName').value.trim();\n    const targetCities=[\n      document.getElementById('city1').value.trim(),\n      document.getElementById('city2').value.trim(),\n      document.getElementById('city3').value.trim()\n    ].filter(Boolean);\n    if(!contactName||!email||!businessName||!websiteUrl||targetCities.length===0){\n      alert('Please fill in all required fields (name, email, business, website URL, and at least one city).');\n      return;\n    }\n    const btn=document.getElementById('submitBtn');\n    btn.disabled=true;\n    btn.innerHTML='<span class=\"spinner\"><\/span> Submitting...';\n    try{\n      const payload={contactName,email,businessName,websiteUrl,targetCities};\n      if(gbpLink)payload.gbpLink=gbpLink;\n      const resp=await fetch(API,{\n        method:'POST',\n        headers:{'Content-Type':'application\/json'},\n        body:JSON.stringify(payload)\n      });\n      if(!resp.ok)throw new Error('Submit failed');\n      document.getElementById('formFields').style.display='none';\n      document.getElementById('formSuccess').style.display='block';\n    }catch(e){\n      alert('Something went wrong. Please try again.');\n      btn.disabled=false;\n      btn.innerHTML='Discover What\\'s Costing You Calls \\u2192';\n    }\n  }\n  \/\/ Inject favicon into head\n  (function(){\n    var f=document.createElement('link');f.rel='icon';f.type='image\/png';f.sizes='32x32';\n    f.href='https:\/\/restorationsiteaudit.com\/wp-content\/uploads\/2026\/04\/nova-favicon-32.png';\n    document.head.appendChild(f);\n    var a=document.createElement('link');a.rel='apple-touch-icon';a.sizes='180x180';\n    a.href='https:\/\/restorationsiteaudit.com\/wp-content\/uploads\/2026\/04\/nova-apple-touch-icon.png';\n    document.head.appendChild(a);\n  })();\n<\/script>\n\n<script>\n  const API='https:\/\/descriptive-rhinoceros-316.convex.site\/api\/submit';\n  async function submitForm(){\n    const contactName=document.getElementById('name').value.trim();\n    const email=document.getElementById('email').value.trim();\n    const businessName=document.getElementById('businessName').value.trim();\n    const websiteUrl=document.getElementById('websiteUrl').value.trim();\n    const gbpLink=document.getElementById('gbpName').value.trim();\n    const targetCities=[\n      document.getElementById('city1').value.trim(),\n      document.getElementById('city2').value.trim(),\n      document.getElementById('city3').value.trim()\n    ].filter(Boolean);\n    if(!contactName||!email||!businessName||!websiteUrl||targetCities.length===0){\n      alert('Please fill in all required fields (name, email, business, website URL, and at least one city).');\n      return;\n    }\n    const btn=document.getElementById('submitBtn');\n    btn.disabled=true;\n    btn.innerHTML='<span class=\"spinner\"><\/span> Submitting...';\n    try{\n      const payload={contactName,email,businessName,websiteUrl,targetCities};\n      if(gbpLink)payload.gbpLink=gbpLink;\n      const resp=await fetch(API,{\n        method:'POST',\n        headers:{'Content-Type':'application\/json'},\n        body:JSON.stringify(payload)\n      });\n      if(!resp.ok)throw new Error('Submit failed');\n      document.getElementById('formFields').style.display='none';\n      document.getElementById('formSuccess').style.display='block';\n    }catch(e){\n      alert('Something went wrong. Please try again.');\n      btn.disabled=false;\n      btn.innerHTML='Discover What\\'s Costing You Calls \\u2192';\n    }\n  }\n  \/\/ Inject favicon into head\n  (function(){\n    var f=document.createElement('link');f.rel='icon';f.type='image\/png';f.sizes='32x32';\n    f.href='https:\/\/restorationsiteaudit.com\/wp-content\/uploads\/2026\/04\/nova-favicon-32.png';\n    document.head.appendChild(f);\n    var a=document.createElement('link');a.rel='apple-touch-icon';a.sizes='180x180';\n    a.href='https:\/\/restorationsiteaudit.com\/wp-content\/uploads\/2026\/04\/nova-apple-touch-icon.png';\n    document.head.appendChild(a);\n  })();\n<\/script>\n<!-- Nova AI Chat Widget -->\n<script>\n(function() {\n  'use strict';\n\n  \/\/ \u2500\u2500 Config \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const CONVEX_SITE = 'https:\/\/descriptive-rhinoceros-316.convex.site';\n  const SUBMIT_URL = CONVEX_SITE + '\/api\/submit';\n  const CHAT_SUBMIT_URL = CONVEX_SITE + '\/api\/chat-submit';\n\n  \/\/ \u2500\u2500 Brand colors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const C = {\n    bg:       '#0d1b2e',\n    bgDeep:   '#0a1525',\n    bgCard:   '#132338',\n    bgInput:  '#1a2c44',\n    border:   'rgba(255,255,255,0.08)',\n    borderS:  'rgba(255,255,255,0.14)',\n    text:     '#ffffff',\n    muted:    '#a6b5c8',\n    soft:     '#7e8fa3',\n    mint:     '#8fe3c8',\n    peach:    '#f4a47c',\n    peach2:   '#e88b6a',\n  };\n\n  \/\/ \u2500\u2500 Conversation Flow \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \/\/ Each step: { id, nova: string|fn, options?: [], input?: {}, next: string|fn }\n  const FLOW = {\n    greeting: {\n      nova: \"Hi, I'm Nova, RDM's AI audit specialist. I help restoration companies see exactly where they stand online. \u2728\\n\\nWant me to run a free audit of your digital presence? Or do you have questions about how it works?\",\n      options: [\n        { label: \"Run my free audit\", next: \"intake_name\" },\n        { label: \"How does this work?\", next: \"faq_how\" },\n        { label: \"What do you analyze?\", next: \"faq_what\" },\n        { label: \"How long does it take?\", next: \"faq_time\" },\n\n      ]\n    },\n\n    \/\/ \u2500\u2500 FAQ Responses \u2500\u2500\n    faq_how: {\n      nova: \"Great question. We connect directly to live APIs that currently track hundreds of restoration websites and local map listings.\\n\\nOnce you share your business info, we set up dedicated tracking accounts for your website. We pull in real keyword rankings, map visibility data, backlink profiles, and on-page SEO metrics.\\n\\nNo estimates. No guesswork. Just verified data from tools like SE Ranking and Local Falcon.\",\n      options: [\n        { label: \"Sounds good, let's go\", next: \"intake_name\" },\n        { label: \"What exactly do you analyze?\", next: \"faq_what\" },\n        { label: \"How long does it take?\", next: \"faq_time\" },\n      ]\n    },\n\n    faq_what: {\n      nova: \"Here's what your Visibility Report covers:\\n\\n\ud83d\udd0d *Organic Keyword Rankings* \u2014 44+ restoration-specific keywords tracked across your target cities\\n\\n\ud83d\udccd *Map Pack Visibility* \u2014 Geographic grid scan showing exactly where you appear (and don't) in Google Maps\\n\\n\ud83d\udd17 *Backlink & Domain Authority* \u2014 Your link profile strength and how it compares to the competition\\n\\n\ud83c\udfd7\ufe0f *Website Structure* \u2014 URL architecture, page titles, H1 tags, missing service pages, and on-page issues\\n\\nAll pulled from live tracking data, not third-party estimators.\",\n      options: [\n        { label: \"I'm in, let's start\", next: \"intake_name\" },\n        { label: \"How long does it take?\", next: \"faq_time\" },\n        { label: \"How does the tracking work?\", next: \"faq_how\" },\n      ]\n    },\n\n    faq_time: {\n      nova: \"Because we pull real ranking data from live tracking systems (not cached estimates), your report is typically delivered within 24 hours.\\n\\nWe need that time to set up your dedicated tracking accounts, let the data populate, and put together a thorough analysis.\\n\\nYou'll receive it via email with a full breakdown and actionable findings.\",\n      options: [\n        { label: \"Let's do it\", next: \"intake_name\" },\n        { label: \"What do you analyze?\", next: \"faq_what\" },\n        { label: \"How does it work?\", next: \"faq_how\" },\n      ]\n    },\n\n    \/\/ \u2500\u2500 Other Question Flow \u2500\u2500\n    other_question: {\n      nova: \"Of course! Go ahead and type your question below. I want to make sure I give you a thorough answer, so I'll follow up via email shortly.\",\n      input: { key: \"otherQuestion\", placeholder: \"Type your question here...\", type: \"textarea\" },\n      next: \"other_get_name\"\n    },\n\n    other_get_name: {\n      nova: \"Thanks for that. What's your name?\",\n      input: { key: \"contactName\", placeholder: \"Your name\", type: \"text\" },\n      next: \"other_get_email\"\n    },\n\n    other_get_email: {\n      nova: function(data) {\n        return \"And what's the best email to reach you at, \" + data.contactName + \"?\";\n      },\n      input: { key: \"email\", placeholder: \"you@yourcompany.com\", type: \"email\" },\n      next: \"other_confirm\"\n    },\n\n    other_confirm: {\n      nova: function(data) {\n        return \"Got it, \" + data.contactName + \". I'll put together a detailed answer and send it to *\" + data.email + \"* shortly.\\n\\nIn the meantime, would you also like me to run a free audit of your website? It only takes a minute to set up.\";\n      },\n      action: \"submitOtherQuestion\",\n      options: [\n        { label: \"Yes, run my audit too\", next: \"intake_business\" },\n        { label: \"No thanks, just the question\", next: \"other_farewell\" },\n      ]\n    },\n\n    other_farewell: {\n      nova: \"No problem! Keep an eye on your inbox. Talk soon. \u2728\",\n    },\n\n    \/\/ \u2500\u2500 Intake Flow \u2500\u2500\n    intake_name: {\n      nova: \"Let's get started. First, what's your name?\",\n      input: { key: \"contactName\", placeholder: \"Your name\", type: \"text\" },\n      next: \"intake_business\"\n    },\n\n    intake_business: {\n      nova: function(data) {\n        return \"Nice to meet you, \" + data.contactName + \". What's the name of your restoration company?\";\n      },\n      input: { key: \"businessName\", placeholder: \"Company name\", type: \"text\" },\n      next: \"intake_website\"\n    },\n\n    intake_website: {\n      nova: \"And your website URL? This is the main site we'll be auditing.\",\n      input: { key: \"websiteUrl\", placeholder: \"https:\/\/yourcompany.com\", type: \"url\" },\n      next: \"intake_gbp\"\n    },\n\n    intake_gbp: {\n      nova: \"Do you have a Google Business Profile? If so, share the listing name or a Google Maps link. If you're not sure, no worries, we can find it.\",\n      input: { key: \"gbpLink\", placeholder: \"Google Maps link or listing name (optional)\", type: \"text\", optional: true },\n      skipLabel: \"Skip, I'm not sure\",\n      next: \"intake_cities\"\n    },\n\n    intake_cities: {\n      nova: \"What are the top cities you want to rank in? These are the areas where you want to show up when someone searches for restoration services. You can list up to 3.\",\n      input: { key: \"targetCities\", placeholder: \"e.g. Austin, Round Rock, Georgetown\", type: \"text\" },\n      next: \"intake_email\"\n    },\n\n    intake_email: {\n      nova: function(data) {\n        return \"Almost done, \" + data.contactName + \". What's the best email to send your Visibility Report to?\";\n      },\n      input: { key: \"email\", placeholder: \"you@yourcompany.com\", type: \"email\" },\n      next: \"intake_context\"\n    },\n\n    intake_context: {\n      nova: \"One last thing. Is there anything specific you'd like us to look at? Competitors you're watching, services you want to push, areas you're struggling with? This helps us tailor the analysis.\",\n      input: { key: \"additionalContext\", placeholder: \"Any additional context (optional)\", type: \"textarea\", optional: true },\n      skipLabel: \"No, that's everything\",\n      next: \"submit\"\n    },\n\n    submit: {\n      nova: function(data) {\n        return \"Got it. Here's what I have:\\n\\n\u2022 *\" + data.businessName + \"*\\n\u2022 \" + data.websiteUrl + \"\\n\u2022 Cities: \" + data.targetCities + (data.gbpLink ? \"\\n\u2022 GBP: \" + data.gbpLink : \"\") + (data.additionalContext ? \"\\n\u2022 Notes: \" + data.additionalContext : \"\") + \"\\n\\nI'm setting up your dedicated tracking accounts now and connecting to our live data feeds. I'll send your full Visibility Report to *\" + data.email + \"* within 24 hours.\\n\\nIf you have questions in the meantime, just reply to that email. \u2b50\";\n      },\n      action: \"submit\",\n      options: [\n        { label: \"Thanks, Nova!\", next: \"farewell\" },\n      ]\n    },\n\n    farewell: {\n      nova: \"You're welcome! Keep an eye on your inbox. And remember, going from invisible to unmissable starts with knowing where you stand. Talk soon. \u2728\",\n    }\n  };\n\n  \/\/ \u2500\u2500 Styles \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const WIDGET_CSS = `\n    @import url('https:\/\/fonts.googleapis.com\/css2?family=Fraunces:opsz,wght@9..144,600;9..144,700&family=Inter:wght@400;500;600&display=swap');\n\n    \/* \u2500\u2500 Reset: prevent host site CSS bleed (targeted, not destructive) \u2500\u2500 *\/\n    #nova-chat-widget,\n    #nova-chat-widget *,\n    #nova-chat-widget *::before,\n    #nova-chat-widget *::after {\n      box-sizing: border-box !important;\n      font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif !important;\n      font-size: 14px !important;\n      line-height: 1.5 !important;\n      text-transform: none !important;\n      letter-spacing: normal !important;\n      text-decoration: none !important;\n      float: none !important;\n      text-indent: 0 !important;\n      text-align: left !important;\n      vertical-align: baseline !important;\n      -webkit-text-size-adjust: 100% !important;\n    }\n    #nova-chat-widget a { color: inherit !important; }\n\n    #nova-chat-overlay {\n      position: fixed !important; inset: 0 !important; background: rgba(0,0,0,0.4) !important;\n      z-index: 99998 !important; opacity: 0 !important; transition: opacity 0.3s !important; isolation: isolate !important;\n      pointer-events: none !important;\n    }\n    #nova-chat-overlay.open { opacity: 1 !important; pointer-events: auto !important; }\n\n    #nova-chat-widget {\n      position: fixed !important; bottom: 24px !important; right: 24px !important;\n      z-index: 99999 !important; font-family: 'Inter', -apple-system, sans-serif !important;\n    }\n\n    \/* \u2500\u2500 Bubble \u2500\u2500 *\/\n    #nova-chat-bubble {\n      position: fixed !important; bottom: 24px !important; right: 24px !important;\n      z-index: 99999 !important;\n      width: 60px !important; height: 60px !important; border-radius: 50% !important;\n      background: linear-gradient(135deg, ${C.mint} 0%, ${C.peach} 100%) !important;\n      border: none !important; cursor: pointer !important;\n      display: flex !important; align-items: center !important; justify-content: center !important;\n      box-shadow: 0 4px 20px rgba(143,227,200,0.3), 0 2px 8px rgba(0,0,0,0.3) !important;\n      transition: transform 0.3s, box-shadow 0.3s !important;\n      padding: 0 !important; margin: 0 !important;\n      appearance: none !important; -webkit-appearance: none !important;\n    }\n    #nova-chat-bubble:hover {\n      transform: scale(1.08) !important;\n      box-shadow: 0 6px 28px rgba(143,227,200,0.4), 0 4px 12px rgba(0,0,0,0.3) !important;\n    }\n    #nova-chat-bubble.open { transform: scale(0) !important; pointer-events: none !important; }\n\n    #nova-chat-bubble svg { width: 28px !important; height: 28px !important; display: block !important; }\n\n    \/* Pulse ring *\/\n    #nova-chat-bubble::before {\n      content: '' !important; position: absolute !important; inset: -4px !important;\n      border-radius: 50% !important;\n      border: 2px solid ${ C.mint};\n      opacity: 0 !important;\n      animation: nova-pulse 3s ease-in-out infinite !important;\n    }\n    @keyframes nova-pulse {\n      0%, 100% { opacity: 0; transform: scale(1); }\n      50% { opacity: 0.4; transform: scale(1.15); }\n    }\n\n    \/* Notification dot *\/\n    .nova-notif {\n      position: absolute !important; top: -2px !important; right: -2px !important;\n      width: 16px !important; height: 16px !important; border-radius: 50% !important;\n      background: ${ C.peach}; border: 2px solid ${ C.bg};\n      font-size: 9px !important; color: ${ C.bg}; font-weight: 700 !important;\n      display: flex !important; align-items: center !important; justify-content: center !important;\n    }\n\n    \/* \u2500\u2500 Chat Window \u2500\u2500 *\/\n    #nova-chat-window {\n      position: fixed !important;\n      bottom: 24px !important; right: 24px !important;\n      z-index: 100000 !important;\n      width: 400px !important; max-width: calc(100vw - 32px) !important;\n      height: 600px !important; max-height: calc(100vh - 48px) !important;\n      background: ${ C.bg};\n      border: 1px solid ${ C.borderS};\n      border-radius: 20px !important;\n      display: flex !important; flex-direction: column !important;\n      box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 40px rgba(143,227,200,0.08) !important;\n      transform: scale(0.9) translateY(20px) !important;\n      opacity: 0 !important; pointer-events: none !important;\n      transition: transform 0.3s cubic-bezier(0.4,0,0.2,1), opacity 0.3s !important;\n      overflow: hidden !important;\n    }\n    #nova-chat-window.open {\n      transform: scale(1) translateY(0) !important;\n      opacity: 1 !important; pointer-events: auto !important;\n    }\n\n    \/* Header *\/\n    #nova-chat-widget .nova-chat-header {\n      padding: 16px 20px !important;\n      background: ${C.bgDeep} !important;\n      border-bottom: 1px solid ${C.border} !important;\n      display: flex !important; align-items: center !important; gap: 12px !important;\n      flex-shrink: 0 !important;\n      position: relative !important;\n    }\n    #nova-chat-widget .nova-chat-avatar {\n      width: 40px !important; height: 40px !important; border-radius: 50% !important;\n      background: linear-gradient(135deg, ${ C.mint} 0%, ${C.peach} 100%);\n      display: flex !important; align-items: center !important; justify-content: center !important;\n      font-family: 'Fraunces', serif !important; font-weight: 700 !important; font-size: 18px !important;\n      color: ${ C.bg};\n      flex-shrink: 0 !important;\n    }\n    #nova-chat-widget .nova-chat-header-text { flex: 1 !important; }\n    #nova-chat-widget .nova-chat-header-name {\n      font-family: 'Fraunces', serif !important; font-weight: 700 !important; font-size: 16px !important;\n      color: ${ C.text};\n    }\n    #nova-chat-widget .nova-chat-header-status {\n      font-size: 12px !important; color: ${ C.mint};\n      display: flex !important; align-items: center !important; gap: 6px !important;\n    }\n    #nova-chat-widget .nova-chat-header-status::before {\n      content: '' !important; width: 6px !important; height: 6px !important; border-radius: 50% !important;\n      background: ${ C.mint}; display: inline-block !important;\n    }\n    #nova-chat-widget .nova-close-btn {\n      background: transparent !important; border: none !important; cursor: pointer !important;\n      color: ${C.soft} !important; padding: 4px !important;\n      transition: color 0.2s !important;\n      width: 28px !important; height: 28px !important;\n      display: flex !important; align-items: center !important; justify-content: center !important;\n      border-radius: 4px !important;\n      flex-shrink: 0 !important;\n    }\n    #nova-chat-widget .nova-close-btn:hover { color: ${C.text} !important; background: rgba(255,255,255,0.08) !important; }\n    #nova-chat-widget .nova-close-btn svg { width: 20px !important; height: 20px !important; display: block !important; }\n\n    \/* Messages area *\/\n    #nova-chat-widget .nova-chat-messages {\n      flex: 1 !important; overflow-y: auto !important; padding: 16px 16px 8px !important;\n      display: flex !important; flex-direction: column !important; gap: 12px !important;\n      scroll-behavior: smooth !important;\n    }\n    #nova-chat-widget .nova-chat-messages::-webkit-scrollbar { width: 4px !important; }\n    #nova-chat-widget .nova-chat-messages::-webkit-scrollbar-track { background: transparent !important; }\n    #nova-chat-widget .nova-chat-messages::-webkit-scrollbar-thumb {\n      background: ${ C.borderS}; border-radius: 2px !important;\n    }\n\n    \/* Message bubbles *\/\n    #nova-chat-widget .nova-msg {\n      max-width: 85% !important; padding: 12px 16px !important;\n      border-radius: 16px !important; font-size: 14px !important;\n      line-height: 1.55 !important; word-wrap: break-word !important;\n      animation: nova-msg-in 0.3s cubic-bezier(0.4,0,0.2,1) !important;\n    }\n    @keyframes nova-msg-in {\n      from { opacity: 0; transform: translateY(8px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n    #nova-chat-widget .nova-msg.nova {\n      align-self: flex-start !important;\n      background: ${ C.bgCard};\n      border: 1px solid ${ C.border};\n      color: ${ C.text};\n      border-bottom-left-radius: 4px !important;\n    }\n    #nova-chat-widget .nova-msg.user {\n      align-self: flex-end !important;\n      background: linear-gradient(135deg, ${ C.mint}, #6ecfaf);\n      color: ${ C.bg};\n      border-bottom-right-radius: 4px !important;\n      font-weight: 500 !important;\n    }\n    #nova-chat-widget .nova-msg .nova-label {\n      font-size: 11px !important; font-weight: 600 !important;\n      color: ${ C.mint}; margin-bottom: 4px !important;\n      font-family: 'Fraunces', serif !important;\n    }\n    #nova-chat-widget .nova-msg.user .nova-label {\n      color: rgba(13,27,46,0.5) !important; text-align: right !important;\n    }\n    #nova-chat-widget .nova-msg b, #nova-chat-widget .nova-msg strong { color: ${C.mint} !important; font-weight: 600 !important; }\n    #nova-chat-widget .nova-msg.user b, #nova-chat-widget .nova-msg.user strong { color: ${C.bgDeep} !important; }\n\n    \/* Typing indicator *\/\n    #nova-chat-widget .nova-typing {\n      display: flex !important; gap: 4px !important; padding: 12px 16px !important;\n      align-self: flex-start !important;\n      background: ${ C.bgCard};\n      border: 1px solid ${ C.border};\n      border-radius: 16px !important; border-bottom-left-radius: 4px !important;\n    }\n    #nova-chat-widget .nova-typing span {\n      width: 6px !important; height: 6px !important; border-radius: 50% !important;\n      background: ${ C.mint}; opacity: 0.4 !important;\n      animation: nova-typing-dot 1.4s infinite !important;\n    }\n    #nova-chat-widget .nova-typing span:nth-child(2) { animation-delay: 0.2s !important; }\n    #nova-chat-widget .nova-typing span:nth-child(3) { animation-delay: 0.4s !important; }\n    @keyframes nova-typing-dot {\n      0%, 80%, 100% { opacity: 0.4; transform: scale(1); }\n      40% { opacity: 1; transform: scale(1.2); }\n    }\n\n    \/* Options *\/\n    #nova-chat-widget .nova-options {\n      display: flex !important; flex-direction: column !important; gap: 8px !important;\n      padding: 8px 16px 12px !important;\n      animation: nova-msg-in 0.4s cubic-bezier(0.4,0,0.2,1) !important;\n    }\n    #nova-chat-widget .nova-opt-btn {\n      padding: 10px 16px !important; border-radius: 12px !important;\n      background: ${C.bgInput} !important;\n      border: 1px solid ${C.borderS} !important;\n      color: ${C.text} !important; font-size: 14px !important;\n      cursor: pointer !important; text-align: left !important;\n      transition: all 0.2s !important;\n      font-family: 'Inter', sans-serif !important;\n      width: 100% !important; display: block !important;\n    }\n    #nova-chat-widget .nova-opt-btn:hover {\n      background: ${C.bgCard} !important;\n      border-color: ${C.mint} !important;\n      color: ${C.mint} !important;\n      transform: translateX(4px) !important;\n    }\n    #nova-chat-widget .nova-skip-btn {\n      background: transparent !important; border: none !important;\n      color: ${C.soft} !important; font-size: 13px !important;\n      cursor: pointer !important; padding: 6px 16px !important;\n      text-align: left !important;\n      transition: color 0.2s !important;\n      font-family: 'Inter', sans-serif !important;\n    }\n    #nova-chat-widget .nova-skip-btn:hover { color: ${C.muted} !important; }\n\n    \/* Input area *\/\n    #nova-chat-widget .nova-chat-input {\n      padding: 12px 16px !important;\n      border-top: 1px solid ${C.border} !important;\n      display: flex !important; gap: 8px !important; align-items: flex-end !important;\n      background: ${C.bgDeep} !important;\n      flex-shrink: 0 !important;\n    }\n    #nova-chat-widget .nova-chat-input input,\n    #nova-chat-widget .nova-chat-input textarea {\n      flex: 1 !important; padding: 10px 14px !important;\n      border-radius: 12px !important; border: 1px solid ${C.borderS} !important;\n      background: ${C.bgInput} !important; color: ${C.text} !important;\n      font-size: 14px !important; font-family: 'Inter', sans-serif !important;\n      outline: none !important; resize: none !important;\n      transition: border-color 0.2s !important;\n      height: auto !important; min-height: 40px !important;\n      width: auto !important; margin: 0 !important;\n      -webkit-appearance: none !important; appearance: none !important;\n      box-shadow: none !important;\n    }\n    #nova-chat-widget .nova-chat-input textarea { min-height: 40px !important; max-height: 80px !important; }\n    #nova-chat-widget .nova-chat-input input:focus,\n    #nova-chat-widget .nova-chat-input textarea:focus {\n      border-color: ${C.mint} !important;\n      box-shadow: none !important;\n    }\n    #nova-chat-widget .nova-chat-input input::placeholder,\n    #nova-chat-widget .nova-chat-input textarea::placeholder {\n      color: ${C.soft} !important;\n    }\n    #nova-chat-widget .nova-send-btn {\n      width: 40px !important; height: 40px !important; border-radius: 50% !important;\n      background: linear-gradient(135deg, ${C.mint}, ${C.peach}) !important;\n      border: none !important; cursor: pointer !important;\n      display: flex !important; align-items: center !important; justify-content: center !important;\n      transition: transform 0.2s, opacity 0.2s !important;\n      flex-shrink: 0 !important;\n      padding: 0 !important;\n    }\n    #nova-chat-widget .nova-send-btn:hover { transform: scale(1.05) !important; }\n    #nova-chat-widget .nova-send-btn:disabled { opacity: 0.4 !important; cursor: not-allowed !important; transform: none !important; }\n    #nova-chat-widget .nova-send-btn svg { width: 18px !important; height: 18px !important; display: block !important; }\n\n    \/* Powered by footer *\/\n    #nova-chat-widget .nova-powered {\n      padding: 8px 16px !important;\n      text-align: center !important;\n      font-size: 11px !important; line-height: 1.4 !important;\n      color: ${C.soft} !important;\n      font-family: 'Inter', -apple-system, sans-serif !important;\n      font-weight: 400 !important; letter-spacing: 0 !important;\n      border-top: 1px solid ${C.border} !important;\n      background: ${C.bgDeep} !important;\n      flex-shrink: 0 !important;\n      margin: 0 !important;\n    }\n    #nova-chat-widget .nova-powered a {\n      color: ${C.muted} !important; text-decoration: none !important;\n      font-size: 11px !important; font-weight: 400 !important;\n      font-family: 'Inter', -apple-system, sans-serif !important;\n    }\n    #nova-chat-widget .nova-powered a:hover { color: ${C.mint} !important; }\n\n    \/* \u2500\u2500 Mobile (applied via .nova-mobile class set by JS) \u2500\u2500 *\/\n    #nova-chat-widget.nova-mobile #nova-chat-window,\n    #nova-chat-widget.nova-mobile #nova-chat-window.open {\n      position: fixed !important;\n      top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important;\n      width: 100vw !important; max-width: 100vw !important;\n      height: 100vh !important; max-height: 100vh !important;\n      border-radius: 0 !important; transform: none !important; margin: 0 !important;\n    }\n    #nova-chat-widget.nova-mobile #nova-chat-window {\n      opacity: 0 !important; pointer-events: none !important;\n    }\n    #nova-chat-widget.nova-mobile #nova-chat-window.open {\n      opacity: 1 !important; pointer-events: auto !important;\n    }\n    #nova-chat-widget.nova-mobile #nova-chat-bubble {\n      bottom: 16px !important; right: 16px !important;\n    }\n    .nova-mobile .nova-chat-header {\n      padding: 10px 14px !important; gap: 10px !important;\n    }\n    .nova-mobile .nova-chat-avatar {\n      width: 32px !important; height: 32px !important; font-size: 14px !important;\n    }\n    .nova-mobile .nova-chat-header-name { font-size: 15px !important; }\n    .nova-mobile .nova-chat-header-status { font-size: 11px !important; }\n    .nova-mobile .nova-chat-messages {\n      padding: 8px 10px 4px !important; gap: 4px !important;\n    }\n    .nova-mobile .nova-msg {\n      padding: 6px 10px !important; border-radius: 12px !important;\n      font-size: 13px !important; line-height: 1.4 !important; max-width: 85% !important;\n    }\n    .nova-mobile .nova-msg .nova-label {\n      font-size: 9px !important; margin-bottom: 1px !important;\n    }\n    .nova-mobile .nova-msg.user .nova-label { font-size: 9px !important; }\n    .nova-mobile .nova-msg.nova { border-bottom-left-radius: 3px !important; }\n    .nova-mobile .nova-msg.user { border-bottom-right-radius: 3px !important; }\n    .nova-mobile .nova-options {\n      padding: 3px 10px 6px !important; gap: 4px !important;\n    }\n    .nova-mobile .nova-opt-btn {\n      padding: 7px 10px !important; font-size: 13px !important; border-radius: 8px !important;\n    }\n    .nova-mobile .nova-skip-btn {\n      padding: 3px 10px !important; font-size: 12px !important;\n    }\n    .nova-mobile .nova-chat-input {\n      padding: 6px 8px !important; gap: 6px !important;\n    }\n    .nova-mobile .nova-chat-input input,\n    .nova-mobile .nova-chat-input textarea {\n      padding: 8px 12px !important; font-size: 14px !important;\n      border-radius: 10px !important; min-height: 38px !important;\n    }\n    .nova-mobile .nova-send-btn {\n      width: 38px !important; height: 38px !important;\n    }\n    .nova-mobile .nova-powered {\n      padding: 4px 10px !important; font-size: 10px !important;\n    }\n    .nova-mobile .nova-powered a { font-size: 10px !important; }\n    .nova-mobile .nova-typing {\n      padding: 6px 10px !important; border-radius: 12px !important;\n    }\n  `;\n\n  \/\/ \u2500\u2500 Build DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function init() {\n    \/\/ Inject styles\n    var style = document.createElement('style');\n    style.textContent = WIDGET_CSS;\n    document.head.appendChild(style);\n\n    \/\/ Overlay\n    var overlay = document.createElement('div');\n    overlay.id = 'nova-chat-overlay';\n    document.body.appendChild(overlay);\n    overlay.addEventListener('click', toggleChat);\n\n    \/\/ Widget container\n    var widget = document.createElement('div');\n    widget.id = 'nova-chat-widget';\n    widget.innerHTML = `\n      <button id=\"nova-chat-bubble\" aria-label=\"Chat with Nova AI\">\n        <span style=\"font-family:'Fraunces',Georgia,serif!important;font-size:26px!important;font-weight:600!important;color:#0d1b2e!important;line-height:1!important;display:block!important;letter-spacing:-0.5px!important;\">N<\/span>\n        <span class=\"nova-notif\">1<\/span>\n      <\/button>\n\n      <div id=\"nova-chat-window\">\n        <div class=\"nova-chat-header\">\n          <div class=\"nova-chat-avatar\">N<\/div>\n          <div class=\"nova-chat-header-text\">\n            <div class=\"nova-chat-header-name\">Nova AI<\/div>\n            <div class=\"nova-chat-header-status\">Online<\/div>\n          <\/div>\n          <button class=\"nova-close-btn\" aria-label=\"Close chat\" style=\"background:transparent!important;border:none!important;cursor:pointer!important;padding:4px!important;width:32px!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;border-radius:6px!important;flex-shrink:0!important;position:absolute!important;top:12px!important;right:12px!important;z-index:10!important;\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"rgba(255,255,255,0.6)\" stroke-width=\"2.5\" stroke-linecap=\"round\" style=\"width:20px!important;height:20px!important;display:block!important;\">\n              <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"><\/line>\n              <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"><\/line>\n            <\/svg>\n          <\/button>\n        <\/div>\n        <div class=\"nova-chat-messages\" id=\"nova-messages\"><\/div>\n        <div class=\"nova-chat-input\" id=\"nova-input-area\" style=\"display:none;\"><\/div>\n        <div class=\"nova-powered\" style=\"padding:8px 16px!important;text-align:center!important;font-size:11px!important;line-height:1.4!important;font-family:Inter,-apple-system,sans-serif!important;font-weight:400!important;letter-spacing:0!important;margin:0!important;color:rgba(255,255,255,0.35)!important;border-top:1px solid rgba(143,227,200,0.08)!important;background:#0a1628!important;flex-shrink:0!important;\">Powered by <a href=\"https:\/\/restorationdigitalmarketing.com\" target=\"_blank\" rel=\"noopener\" style=\"color:rgba(255,255,255,0.5)!important;text-decoration:none!important;font-size:11px!important;font-weight:400!important;font-family:Inter,-apple-system,sans-serif!important;\">Nova AI, an RDM product<\/a><\/div>\n      <\/div>\n    `;\n    document.body.appendChild(widget);\n\n    \/\/ Detect mobile and add class\n    function checkMobile() {\n      if (window.innerWidth <= 480) {\n        widget.classList.add('nova-mobile');\n      } else {\n        widget.classList.remove('nova-mobile');\n      }\n    }\n    checkMobile();\n    window.addEventListener('resize', checkMobile);\n\n    \/\/ Event listeners\n    document.getElementById('nova-chat-bubble').addEventListener('click', toggleChat);\n    widget.querySelector('.nova-close-btn').addEventListener('click', toggleChat);\n\n    \/\/ Mobile keyboard handler \u2014 adjust chat height when iOS keyboard appears\n    function updateVh() {\n      var vh = (window.visualViewport ? window.visualViewport.height : window.innerHeight) * 0.01;\n      document.documentElement.style.setProperty('--nova-vh', vh + 'px');\n      \/\/ Also scroll messages to bottom when keyboard changes\n      var msgs = document.getElementById('nova-messages');\n      if (msgs) msgs.scrollTop = msgs.scrollHeight;\n    }\n    updateVh();\n    if (window.visualViewport) {\n      window.visualViewport.addEventListener('resize', updateVh);\n      window.visualViewport.addEventListener('scroll', updateVh);\n    }\n    window.addEventListener('resize', updateVh);\n\n    \/\/ Start conversation after short delay\n    state.started = false;\n  }\n\n  \/\/ \u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  var state = {\n    open: false,\n    started: false,\n    currentStep: 'greeting',\n    data: {},\n    submitted: false,\n  };\n\n  \/\/ \u2500\u2500 Toggle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function toggleChat() {\n    state.open = !state.open;\n    var win = document.getElementById('nova-chat-window');\n    var bubble = document.getElementById('nova-chat-bubble');\n    var overlay = document.getElementById('nova-chat-overlay');\n\n    if (state.open) {\n      win.classList.add('open');\n      bubble.classList.add('open');\n      overlay.classList.add('open');\n      \/\/ Hide notification dot\n      var notif = bubble.querySelector('.nova-notif');\n      if (notif) notif.style.display = 'none';\n      \/\/ Start conversation\n      if (!state.started) {\n        state.started = true;\n        showStep('greeting');\n      }\n    } else {\n      win.classList.remove('open');\n      bubble.classList.remove('open');\n      overlay.classList.remove('open');\n    }\n  }\n\n  \/\/ \u2500\u2500 Render Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function getMessages() {\n    return document.getElementById('nova-messages');\n  }\n\n  function scrollDown() {\n    var m = getMessages();\n    setTimeout(function() { m.scrollTop = m.scrollHeight; }, 50);\n  }\n\n  function formatText(text) {\n    \/\/ Simple markdown: *text* \u2192 <strong>, newlines \u2192 <br>\n    return text\n      .replace(\/\\*([^*]+)\\*\/g, '<strong>$1<\/strong>')\n      .replace(\/\\n\/g, '<br>');\n  }\n\n  function addNovaBubble(text) {\n    var m = getMessages();\n    var div = document.createElement('div');\n    div.className = 'nova-msg nova';\n    div.innerHTML = '<div class=\"nova-label\">Nova<\/div>' + formatText(text);\n    m.appendChild(div);\n    scrollDown();\n  }\n\n  function addUserBubble(text) {\n    var m = getMessages();\n    var div = document.createElement('div');\n    div.className = 'nova-msg user';\n    div.innerHTML = '<div class=\"nova-label\">You<\/div>' + formatText(text);\n    m.appendChild(div);\n    scrollDown();\n  }\n\n  function showTyping() {\n    var m = getMessages();\n    var div = document.createElement('div');\n    div.className = 'nova-typing';\n    div.id = 'nova-typing-indicator';\n    div.innerHTML = '<span><\/span><span><\/span><span><\/span>';\n    m.appendChild(div);\n    scrollDown();\n  }\n\n  function hideTyping() {\n    var el = document.getElementById('nova-typing-indicator');\n    if (el) el.remove();\n  }\n\n  function showOptions(options, step) {\n    var m = getMessages();\n    var wrapper = document.createElement('div');\n    wrapper.className = 'nova-options';\n    wrapper.id = 'nova-current-options';\n\n    options.forEach(function(opt) {\n      var btn = document.createElement('button');\n      btn.className = 'nova-opt-btn';\n      btn.textContent = opt.label;\n      btn.addEventListener('click', function() {\n        \/\/ Remove options\n        wrapper.remove();\n        hideInputArea();\n        \/\/ Show user choice\n        addUserBubble(opt.label);\n        \/\/ Go to next step\n        setTimeout(function() { showStep(opt.next); }, 400);\n      });\n      wrapper.appendChild(btn);\n    });\n\n    \/\/ Add skip button if applicable\n    var flowStep = FLOW[step];\n    if (flowStep && flowStep.input && flowStep.input.optional && flowStep.skipLabel) {\n      var skip = document.createElement('button');\n      skip.className = 'nova-skip-btn';\n      skip.textContent = flowStep.skipLabel;\n      skip.addEventListener('click', function() {\n        wrapper.remove();\n        hideInputArea();\n        addUserBubble(flowStep.skipLabel);\n        var nextStep = typeof flowStep.next === 'function' ? flowStep.next(state.data) : flowStep.next;\n        setTimeout(function() { showStep(nextStep); }, 400);\n      });\n      wrapper.appendChild(skip);\n    }\n\n    m.appendChild(wrapper);\n    scrollDown();\n  }\n\n  function showInputField(inputConfig, step) {\n    var area = document.getElementById('nova-input-area');\n    area.style.display = 'flex';\n    area.innerHTML = '';\n\n    var isTextarea = inputConfig.type === 'textarea';\n    var field;\n    if (isTextarea) {\n      field = document.createElement('textarea');\n      field.rows = 2;\n    } else {\n      field = document.createElement('input');\n      field.type = inputConfig.type || 'text';\n    }\n    field.placeholder = inputConfig.placeholder || '';\n    field.id = 'nova-field-input';\n\n    var sendBtn = document.createElement('button');\n    sendBtn.className = 'nova-send-btn';\n    sendBtn.innerHTML = '<svg viewBox=\"0 0 24 24\" style=\"width:18px!important;height:18px!important;display:block!important;fill:none!important;\" stroke=\"' + C.bg + '\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"><\/line><polygon points=\"22 2 15 22 11 13 2 9 22 2\" fill=\"' + C.bg + '\"><\/polygon><\/svg>';\n\n    function doSubmit() {\n      var val = field.value.trim();\n      if (!val && !inputConfig.optional) return;\n\n      \/\/ Validate email\n      if (inputConfig.type === 'email' && val) {\n        var emailRe = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\n        if (!emailRe.test(val)) {\n          field.style.borderColor = C.peach;\n          field.setAttribute('placeholder', 'Please enter a valid email');\n          return;\n        }\n      }\n\n      \/\/ Validate URL\n      if (inputConfig.type === 'url' && val) {\n        if (!val.match(\/^https?:\\\/\\\/\/)) val = 'https:\/\/' + val;\n      }\n\n      \/\/ Store data\n      state.data[inputConfig.key] = val || '';\n      hideInputArea();\n\n      \/\/ Show user message\n      addUserBubble(val || '(skipped)');\n\n      \/\/ Next step\n      var flowStep = FLOW[step];\n      var nextStep = typeof flowStep.next === 'function' ? flowStep.next(state.data) : flowStep.next;\n      setTimeout(function() { showStep(nextStep); }, 400);\n    }\n\n    sendBtn.addEventListener('click', doSubmit);\n    field.addEventListener('keydown', function(e) {\n      if (e.key === 'Enter' && !e.shiftKey) {\n        e.preventDefault();\n        doSubmit();\n      }\n    });\n\n    area.appendChild(field);\n    area.appendChild(sendBtn);\n\n    \/\/ Add skip button for optional fields\n    if (inputConfig.optional) {\n      var flowStep = FLOW[step];\n      if (flowStep && flowStep.skipLabel) {\n        var skip = document.createElement('button');\n        skip.className = 'nova-skip-btn';\n        skip.textContent = flowStep.skipLabel;\n        skip.style.position = 'absolute';\n        skip.style.bottom = '52px';\n        skip.style.right = '16px';\n        \/\/ Instead, add skip as an option\n      }\n    }\n\n    \/\/ Focus input and scroll\n    setTimeout(function() {\n      field.focus();\n      scrollDown();\n      \/\/ Extra scroll for mobile keyboards\n      setTimeout(scrollDown, 300);\n    }, 100);\n  }\n\n  function hideInputArea() {\n    var area = document.getElementById('nova-input-area');\n    if (area) {\n      area.style.display = 'none';\n      area.innerHTML = '';\n    }\n  }\n\n  \/\/ \u2500\u2500 Show Step \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function showStep(stepId) {\n    state.currentStep = stepId;\n    var step = FLOW[stepId];\n    if (!step) return;\n\n    \/\/ Show typing first\n    showTyping();\n\n    \/\/ Calculate typing delay based on message length\n    var novaText = typeof step.nova === 'function' ? step.nova(state.data) : step.nova;\n    var delay = Math.min(800 + novaText.length * 8, 2500);\n\n    setTimeout(function() {\n      hideTyping();\n\n      \/\/ Add nova message\n      addNovaBubble(novaText);\n\n      \/\/ If this step triggers submission\n      if (step.action === 'submit' && !state.submitted) {\n        state.submitted = true;\n        submitData();\n      }\n      if (step.action === 'submitOtherQuestion') {\n        submitOtherQuestion();\n      }\n\n      \/\/ Show options or input\n      setTimeout(function() {\n        if (step.options) {\n          showOptions(step.options, stepId);\n        }\n        if (step.input) {\n          showInputField(step.input, stepId);\n          \/\/ Also show skip as an option if optional\n          if (step.input.optional && step.skipLabel) {\n            var m = getMessages();\n            var wrapper = document.createElement('div');\n            wrapper.className = 'nova-options';\n            var skip = document.createElement('button');\n            skip.className = 'nova-skip-btn';\n            skip.textContent = step.skipLabel;\n            skip.addEventListener('click', function() {\n              wrapper.remove();\n              hideInputArea();\n              state.data[step.input.key] = '';\n              addUserBubble(step.skipLabel);\n              var nextStep = typeof step.next === 'function' ? step.next(state.data) : step.next;\n              setTimeout(function() { showStep(nextStep); }, 400);\n            });\n            wrapper.appendChild(skip);\n            m.appendChild(wrapper);\n            scrollDown();\n          }\n        }\n      }, 200);\n    }, delay);\n  }\n\n  \/\/ \u2500\u2500 Submit Other Question \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function submitOtherQuestion() {\n    var d = state.data;\n    fetch(CHAT_SUBMIT_URL, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application\/json' },\n      body: JSON.stringify({\n        email: d.email || '',\n        businessName: d.businessName || '',\n        additionalContext: 'Question from chat: ' + (d.otherQuestion || ''),\n        source: 'chat_widget_question',\n        contactName: d.contactName || '',\n      }),\n    })\n    .then(function(r) { return r.json(); })\n    .then(function(result) {\n      console.log('[Nova Chat] Other question submitted:', result);\n    })\n    .catch(function(err) {\n      console.error('[Nova Chat] Other question error:', err);\n    });\n  }\n\n  \/\/ \u2500\u2500 Submit to Convex \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function submitData() {\n    var d = state.data;\n\n    \/\/ Parse cities\n    var cities = (d.targetCities || '').split(',').map(function(c) { return c.trim(); }).filter(Boolean);\n    if (cities.length === 0) cities = ['Not specified'];\n\n    var payload = {\n      contactName: d.contactName || 'Chat Visitor',\n      email: d.email || '',\n      businessName: d.businessName || '',\n      websiteUrl: d.websiteUrl || '',\n      targetCities: cities.slice(0, 3),\n    };\n    if (d.gbpLink) payload.gbpLink = d.gbpLink;\n\n    \/\/ Submit to the same endpoint as the form\n    fetch(SUBMIT_URL, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application\/json' },\n      body: JSON.stringify(payload),\n    })\n    .then(function(r) { return r.json(); })\n    .then(function(result) {\n      console.log('[Nova Chat] Submission success:', result);\n      \/\/ Also submit additional context separately if provided\n      if (d.additionalContext) {\n        fetch(CHAT_SUBMIT_URL, {\n          method: 'POST',\n          headers: { 'Content-Type': 'application\/json' },\n          body: JSON.stringify({\n            email: d.email,\n            businessName: d.businessName,\n            additionalContext: d.additionalContext,\n            source: 'chat_widget'\n          }),\n        }).catch(function() { \/* non-critical *\/ });\n      }\n    })\n    .catch(function(err) {\n      console.error('[Nova Chat] Submission error:', err);\n    });\n  }\n\n  \/\/ \u2500\u2500 Initialize \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Nova AI \u00b7 Audit Specialist Stop Being Invisible Online. (and discover what&#8217;s costing you calls) Meet Nova, our AI audit specialist built for the restoration industry. Nova connects directly to live APIs that currently track hundreds of restoration websites and local maps listings to pull real ranking data, backlink profiles, and local search visibility for [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-blank","meta":{"footnotes":""},"class_list":["post-10","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/restorationsiteaudit.com\/index.php?rest_route=\/wp\/v2\/pages\/10","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/restorationsiteaudit.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/restorationsiteaudit.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/restorationsiteaudit.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/restorationsiteaudit.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10"}],"version-history":[{"count":20,"href":"https:\/\/restorationsiteaudit.com\/index.php?rest_route=\/wp\/v2\/pages\/10\/revisions"}],"predecessor-version":[{"id":33,"href":"https:\/\/restorationsiteaudit.com\/index.php?rest_route=\/wp\/v2\/pages\/10\/revisions\/33"}],"wp:attachment":[{"href":"https:\/\/restorationsiteaudit.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}