'; } /* ============================================================ HERO SUCCESS HTML ============================================================ */ function getHeroSuccessHTML() { return '
' + '
Request received \u2014 you\'re in the queue
' + '

You\'re on your way to
winning more bids

' + '

WHAT HAPPENS NEXT

' + '
1

Check your inbox

A Joist AI specialist will be in touch shortly to confirm your request and next steps.

' + '
2

Discovery call to learn about you

We\'ll dig into your team\'s pursuit process, pain points, and goals before anything else.

' + '
3

Live demo tailored to your team

We\'ll show you exactly how Joist AI fits your firm \u2014 no generic walkthroughs, just what matters to you.

' + '
' + '' + '
'; } /* ============================================================ MODAL SUCCESS CLOSE BUTTON ============================================================ */ function bindSuccessCloseBtn() { setTimeout(function () { var btn = document.getElementById('joist-modal-success-close'); var overlay = document.querySelector('.overlay_wrap_2'); if (btn && overlay) { btn.addEventListener('click', function () { overlay.style.display = 'none'; }); } }, 50); } /* ============================================================ HERO SUCCESS HANDLER Hero submit → show page success + show modal success ============================================================ */ function handleHeroSuccess() { console.log('[JOIST COMMON] handleHeroSuccess called'); // 1. Show hero success on page var heroSection = document.querySelector('.hero-section'); console.log('[JOIST COMMON] .hero-section found:', !!heroSection); if (heroSection) { var splitLayout = heroSection.querySelector('.hero_split-layout'); if (splitLayout) splitLayout.style.display = 'none'; var heroCard = heroSection.querySelector('.hero_form-card'); if (heroCard) heroCard.style.display = 'none'; var heroFormDiv = document.getElementById('hubspot-demo-form'); if (heroFormDiv) heroFormDiv.style.display = 'none'; heroSection.insertAdjacentHTML('beforeend', getHeroSuccessHTML()); console.log('[JOIST COMMON] Hero success HTML injected into page'); window.scrollTo({ top: 0, behavior: 'smooth' }); } // 2. Also show modal success inside the modal handleModalSuccess(); } /* ============================================================ MODAL SUCCESS HANDLER Modal submit → show modal success only, page untouched ============================================================ */ function handleModalSuccess() { console.log('[JOIST COMMON] handleModalSuccess called'); var formDiv = document.getElementById('hubspot-modal-form'); console.log('[JOIST COMMON] #hubspot-modal-form found:', !!formDiv); if (!formDiv) return; var modalBody = formDiv.closest('.modal_form-body'); console.log('[JOIST COMMON] .modal_form-body found:', !!modalBody); if (!modalBody) return; var innerModalCard = modalBody.closest('.modal_form-card'); console.log('[JOIST COMMON] .modal_form-card found:', !!innerModalCard); if (!innerModalCard) return; // Guard: don't inject twice if (innerModalCard.querySelector('.modal-success-wrap')) { console.log('[JOIST COMMON] success already shown, skipping'); return; } var header = innerModalCard.querySelector('.modal_form-header'); var body = innerModalCard.querySelector('.modal_form-body'); if (header) header.style.display = 'none'; if (body) body.style.display = 'none'; innerModalCard.insertAdjacentHTML('beforeend', getModalSuccessHTML()); console.log('[JOIST COMMON] Modal success HTML injected'); bindSuccessCloseBtn(); requestAnimationFrame(function () { requestAnimationFrame(function () { var tick = innerModalCard.querySelector('.modal-success-tick-path'); if (tick) tick.style.strokeDashoffset = '0'; }); }); } /* ============================================================ SHARED ROUTER — called from BOTH form instances Since HubSpot fires onFormSubmitted unpredictably, ALL routing lives here in the common script. ============================================================ */ function onAnyFormSubmitted() { var which = window._joistActiveForm; console.log('[JOIST COMMON] onAnyFormSubmitted — _joistActiveForm:', which); window._joistActiveForm = null; if (which === 'hero') handleHeroSuccess(); else if (which === 'modal') handleModalSuccess(); else console.warn('[JOIST COMMON] onAnyFormSubmitted — unknown form, nothing to do'); } /* ============================================================ MODAL FORM INIT ============================================================ */ function initModalForm() { if (typeof hbspt === 'undefined') { setTimeout(initModalForm, 100); return; } if (!document.getElementById('hubspot-modal-form')) return; console.log('[JOIST COMMON] Creating modal HubSpot form'); hbspt.forms.create({ region: "na1", portalId: "8057448", formId: "a34c8ec9-1a72-41de-b9c0-6f36228b0ac2", target: "#hubspot-modal-form", css: "", onFormReady: function ($form) { console.log('[JOIST COMMON] modal onFormReady'); }, onFormSubmit: function ($form) { console.log('[JOIST COMMON] modal onFormSubmit — setting _joistActiveForm = modal'); window._joistActiveForm = 'modal'; var btn = $form.find('input[type="submit"]'); btn.val("Sending...").css({ opacity: "0.7", "pointer-events": "none", cursor: "not-allowed" }); }, onFormSubmitted: function () { console.log('[JOIST COMMON] modal onFormSubmitted fired'); onAnyFormSubmitted(); } }); } window.initJoistModalForm = initModalForm; initModalForm(); })();

FAQs

What is Joist AI and who is it for?

Joist AI is a content enablement platform for AEC (Architecture, Engineering and Construction) marketing and business development teams who have historically saved boilerplate content for proposals and other project collateral in folders, on local servers, in various spreadsheets and documents, or using other outdated methods. The knowledge management tools of the past have resulted in content silos, burdensome processes for keeping content up-to-date, and inevitably, duplicated or multiple versions of the same content that can create confusion even within the most organized systems and teams.

Some firms may not have any system for storing boilerplate content and will often “hunt-and-peck” and manually parse content from past proposals each time they start a new proposal. Regardless of the firm’s current approach to knowledge management, the typical systems used significantly slow down the proposal and marketing-related content creation process. Joist was designed to streamline the proposal creation process and increase the efficiency of business development and marketing teams.

How does Joist AI work?

Joist AI solves the long-dreaded problem of having to “hunt-and-peck” through past proposals by automating content search and organization using artificial intelligence (AI); Joist provides a rich user experience to find, organize, curate and customize new, original, and proprietary content based on already owned historic content. Ultimately, Joist allows customers to win more work with less effort.

Is Joist worth the cost?

Yes, because managing content and creating proposals is necessary to run your business. Whether you manage only a few proposals a year to thousands of proposals that span multiple markets, Joist AI was created to alleviate the manual time and energy spent on producing proposals that could be supported by AI. This includes searching past projects and proposals, generating drafts, catching errors, making recommendations and sharing drafts and proposed content with your teams.

Because the average marketing team spends about 70% of their time during the first phase of proposal production searching for content, Joist AI estimates that your investment will pay for itself within the first few months of use.

I heard AI is replacing jobs. Will Joist replace me?

Of course not. Joist AI is YOUR assistant and has been built to support you through the nuances of your job as an AEC marketer, making you and your daily tasks more efficient. As the need for additional marketing has grown over the years, we’re guessing so has your list of day-to-day responsibilities. Joist AI can help free-up some of your proposal search and curation time to help you focus on the business development and marketing efforts that cannot be automated… and probably the stuff you have more fun doing too!

My content is confidential. What are the security risks?

We understand how important your data is to you, and we have taken measures to protect it at the utmost level. Our platform analyzes your data transiently, which means that any edits or generated content is not collected or used by our system. Rest assured that your data is secure no matter which Joist AI plan you sign up for.

Can Joist AI be customized for my company?

Yes. Each Joist AI implementation can be customized to suit your specific business, target market sectors and project types, and proposal needs. Your customer success team will be dedicated to making sure you get the most value out of your investment and that your team members are incredibly happy with their new proposal assistant friend.

Where do I get a Joist AI Enterprise Quote?

Contact Joist AI today and a customer care expert will reach out to you to learn more about your organization’s needs and how Joist AI can help your team win more business.