Lovable Prompt Generator

Lovable Prompter — Local Service Landing Page

Lovable Prompter — Local Service Landing Page

Dark

Inputs

If left blank, we’ll auto-build it as “SERVICE in LOCATION”.

Digits, spaces, +, (), -, . allowed

Generated Prompt

2) Content Sections - Hero: H1 with [PRIMARY_KEYWORD], subhead with value prop, hero image (local scene), primary [CTA] + click-to-call on mobile. - Services: 3–5 benefit bullets with icons. - About Us: 2–3 sentences highlighting local expertise and trust. - Testimonials: 2–3 quotes + star rating markup. - Contact: form (name, email, phone, message) + phone link + service area map. 3) Technical & Performance - Mobile-first CSS; optimize images (WebP), descriptive alt text including [LOCATION]. - Lazy-load media; target good Core Web Vitals (LCP < 2.5s). - Semantic HTML; anchor-based nav for quick jumps. 4) Accessibility - WCAG AA contrast; ARIA labels for forms and buttons. ## Source Content (optional) ### FAQs ${faqs.length ? faqs.map(s=>'- '+s).join('\\n') : '- (add 2–5 common buyer questions)'} ### Testimonials ${quotes.length ? quotes.map(s=>'- '+s).join('\\n') : '- “Great local service!” — Happy Customer'} ## Constraints - <= 800 words main copy; web-safe fonts; consistent brand colors. - Prefer locally relevant visuals over generic stock. ## Output Produce a complete landing page: semantic HTML + scoped CSS + minimal JS (if needed). Ensure all copy includes [PRIMARY_KEYWORD] early, and LSI terms naturally. ## Metadata to include - : ${primaryKeyword ? primaryKeyword + ' | ' : ''}${v.bizName || 'Your Brand'} - <meta name="description">: ${primaryKeyword ? 'Get fast, reliable ' + (v.service||'service') + ' in ' + (v.location||'your area') + '. ' : ''}Call ${v.phone || 'us today'} for ${v.cta || 'a free estimate'}. ## Notes ${v.notes || '(add any special requirements, integrations, or brand rules)'} `; output.value = prompt; } // VALIDATION function validate(){ status(''); const svc = fields.service.value.trim(); const loc = fields.location.value.trim(); let ok = true, msgs = []; if(!svc){ ok = false; msgs.push('Service is required.'); fields.service.focus(); } if(!loc){ ok = false; msgs.push('Location is required.'); if(svc) fields.location.focus(); } const phone = fields.phone.value.trim(); if (phone && !/^[+()0-9.\\-\\s]{7,}$/.test(phone)) { ok = false; msgs.push('Phone format looks invalid.'); } if(ok) status('Looks good ✔', 'ok'); else status(msgs.join(' '), 'err'); return ok; } // Buttons $('#togglePreview').addEventListener('click', () => { previewCard.classList.toggle('show'); $('#togglePreview').textContent = previewCard.classList.contains('show') ? 'Hide Prompt' : 'Show Prompt'; if (previewCard.classList.contains('show')) buildPrompt(); }); $('#copyBtn').addEventListener('click', async () => { buildPrompt(); try { await navigator.clipboard.writeText(output.value); status('Copied to clipboard', 'ok'); } catch { status('Copy failed — use Download or select all + copy', 'warn'); } }); $('#downloadBtn').addEventListener('click', () => { buildPrompt(); const blob = new Blob([output.value], {type:'text/plain;charset=utf-8'}); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'local-service-landing-prompt.txt'; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url); status('Downloaded .txt', 'ok'); }); $('#validateBtn').addEventListener('click', (e) => { e.preventDefault(); buildPrompt(); validate(); }); $('#resetForm').addEventListener('click', () => { form.reset(); buildPrompt(); status('Form reset', 'warn'); }); $('#loadExample').addEventListener('click', () => { fields.service.value = 'HVAC Repair'; fields.location.value = 'Phoenix, AZ'; fields.primaryKeyword.value = 'HVAC Repair in Phoenix'; fields.brandTone.value = 'Friendly and professional'; fields.cta.value = 'Call Now for a Free Estimate'; fields.lsi.value = 'emergency repair, AC tune-up, furnace replacement, same-day service, maintenance plans'; fields.bizName.value = 'Desert Breeze HVAC'; fields.phone.value = '(602) 555-0130'; fields.address.value = '123 W Monroe St, Phoenix, AZ 85003'; fields.hours.value = 'Mon–Sat 7am–7pm'; fields.faqs.value = 'Q: Do you offer emergency service?\nA: Yes, 24/7 within city limits.\nQ: Do you service both AC and heating?\nA: We repair and install all major brands.'; fields.testimonials.value = '“Fast, honest, and affordable.” — Maria G.\n“Restored our AC in under an hour.” — Devon L.'; fields.notes.value = 'Use warm, neighborly language; emphasize same-day repairs; avoid technical jargon.'; buildPrompt(); status('Example loaded', 'ok'); }); // Live updates Object.values(fields).forEach(el => el.addEventListener('input', buildPrompt)); // Initial render (preview hidden by default) buildPrompt(); </script> </body> </html> <p></p> </div><!-- .entry-content .clear --> </article><!-- #post-## --> </main><!-- #main --> </div><!-- #primary --> </div> <!-- ast-container --> </div><!-- #content --> <footer class="site-footer" id="colophon" itemtype="https://schema.org/WPFooter" itemscope="itemscope" itemid="#colophon"> <div class="site-below-footer-wrap ast-builder-grid-row-container site-footer-focus-item ast-builder-grid-row-full ast-builder-grid-row-tablet-full ast-builder-grid-row-mobile-full ast-footer-row-stack ast-footer-row-tablet-stack ast-footer-row-mobile-stack" data-section="section-below-footer-builder"> <div class="ast-builder-grid-row-container-inner"> <div class="ast-builder-footer-grid-columns site-below-footer-inner-wrap ast-builder-grid-row"> <div class="site-footer-below-section-1 site-footer-section site-footer-section-1"> <div class="ast-builder-layout-element ast-flex site-footer-focus-item ast-footer-copyright" data-section="section-footer-builder"> <div class="ast-footer-copyright"><p>Copyright © 2026 Hayden Koch | Powered by <a href="https://wpastra.com" rel="nofollow noopener" target="_blank">Astra WordPress Theme</a></p> </div> </div> </div> </div> </div> </div> </footer><!-- #colophon --> </div><!-- #page --> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/astra/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script type="text/javascript"> let saswpStarColor = "#000"; if (typeof jQuery !== 'undefined') { jQuery('.saswp_star_color .saswp_star').attr('stop-color', saswpStarColor); } else { const stars = document.querySelectorAll('.saswp_star_color .saswp_star'); stars.forEach(star => star.setAttribute('stop-color', saswpStarColor)); } </script> <div id="ast-scroll-top" tabindex="0" class="ast-scroll-top-icon ast-scroll-to-top-right" data-on-devices="both"> <span class="ast-icon icon-arrow"><svg class="ast-arrow-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" width="26px" height="16.043px" viewBox="57 35.171 26 16.043" enable-background="new 57 35.171 26 16.043" xml:space="preserve"> <path d="M57.5,38.193l12.5,12.5l12.5-12.5l-2.5-2.5l-10,10l-10-10L57.5,38.193z" /> </svg></span> <span class="screen-reader-text">Scroll to Top</span> </div> <script> /(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1); </script> <script id="astra-theme-js-js-extra"> var astra = {"break_point":"921","isRtl":"","is_scroll_to_id":"1","is_scroll_to_top":"1","is_header_footer_builder_active":"1","responsive_cart_click":"flyout","is_dark_palette":""}; //# sourceURL=astra-theme-js-js-extra </script> <script src="https://haydenkoch.sariyait.org/wp-content/themes/astra/assets/js/minified/frontend.min.js?ver=4.11.15" id="astra-theme-js-js"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://haydenkoch.sariyait.org/wp-includes/js/wp-emoji-release.min.js?ver=6.9.4"}} </script> <script type="module"> /*! This file is auto-generated */ const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))}); //# sourceURL=https://haydenkoch.sariyait.org/wp-includes/js/wp-emoji-loader.min.js </script> </body> </html>