import { init } from '..'; import { WidgetOptions } from '../context/widgetOptions'; import { WidgetState } from '../context/widgetState'; export const createModal = () => { const modalContainerOld = document.getElementById( 'gravite_widget_modal_container' ) as HTMLElement; if (modalContainerOld) { modalContainerOld.remove(); } const modalContainer = document.createElement('div'); modalContainer.id = 'gravite_widget_modal_container'; const modal = document.createElement('div'); modal.id = 'gravite_widget_modal'; modal.addEventListener('click', e => { e.stopPropagation(); e.preventDefault(); }); const modalContent = document.createElement('div'); modalContent.id = 'gravite_widget_modal_content'; const closeButton = document.createElement('button'); closeButton.id = 'gravite_widget_modal_close_button'; closeButton.classList.add('close-button'); closeButton.classList.add('gravite_widget_close_button'); closeButton.innerHTML = ` `; closeButton.addEventListener('click', e => { e.stopPropagation(); e.preventDefault(); closeModal(); }); const poweredByContainer = document.createElement('div'); poweredByContainer.classList.add('powered-by-container'); poweredByContainer.style.cursor = 'pointer'; poweredByContainer.addEventListener('click', e => { e.stopPropagation(); e.preventDefault(); window.open('https://gravite.io/real-time-feedback-tool', '_blank'); }); const graviteLogo = document.createElement('div'); graviteLogo.classList.add('gravite-logo'); graviteLogo.innerHTML = ` `; const smallPoweredBy = document.createElement('small'); smallPoweredBy.classList.add('powered-by'); smallPoweredBy.innerText = 'Powered by '; const poweredBy = document.createElement('a'); poweredBy.href = 'https://gravite.io/real-time-feedback-tool'; poweredBy.target = '_blank'; poweredBy.innerText = 'Gravite'; smallPoweredBy.appendChild(poweredBy); poweredByContainer.appendChild(graviteLogo); poweredByContainer.appendChild(smallPoweredBy); // from index.css const style = document.createElement('style'); style.setAttribute('rel', 'stylesheet'); style.setAttribute('type', 'text/css'); style.innerHTML = ` :host * { box-sizing: border-box; font-family: 'Inter', sans-serif; } :host .close-button { position: absolute; right: 16px; top: -10px; background-color: #fff; border: 1px solid #d0d5dd; border-radius: 8px; display: flex; justify-content: center; align-items: center; height: 27px; width: 27px; } :host .powered-by-container { position: absolute; bottom: 3px; left: 16px; display: flex; flex-direction: row; align-items: center; } :host .powered-by-container .gravite-logo { height: 15px; } :host .powered-by-container .gravite-logo svg { vertical-align: baseline; } :host .powered-by { font-size: 10px; line-height: 17px; color: #a0aec0; } :host .powered-by a { font-size: 10px; line-height: 17px; color: #a0aec0; text-decoration: underline; } #gravite_widget_modal_content { width: 100%; height: 100%; padding: 12px 16px; overflow: hidden; transition: transform 3s ease-in-out; } /* SATISFACTION STEP */ #gravite_widget_modal_content .title { font-weight: 400; font-size: 14px; line-height: 20px; width: 100%; overflow: hidden; opacity: 1; transition: all 0.3s ease-in-out; } #gravite_widget_modal_content .satisfaction-select { width: 100%; transition: all 0.3s ease-in-out; transform: translateY(70%); } #gravite_widget_modal_content .satisfaction-select .flex-container { display: flex; flex-direction: row; align-items: center; width: 100%; gap: 12px; } #gravite_widget_modal_content .satisfaction-select .flex-container .flex-item { display: flex; flex-direction: column; align-items: center; cursor: pointer; width: 45px; opacity: 1; transition: all 0.3s ease-in-out; } #gravite_widget_modal_content .satisfaction-select .flex-container .flex-item > div:first-child { font-size: 30px; line-height: 38px; font-weight: 400; } #gravite_widget_modal_content .satisfaction-select .flex-container .flex-item:hover > div:last-child { visibility: visible; } #gravite_widget_modal_content .satisfaction-select .flex-container .flex-item > div:last-child { visibility: hidden; font-size: 12px; color: #a0aec0; } /* FEEDBACK STEP */ #gravite_widget_modal_content .feedback-step { display: flex; flex-direction: column; align-items: center; width: 100%; height: 75%; position: relative; } #gravite_widget_modal_content .feedback-step .feedback-textarea { width: 281px; height: 98px; resize: none; padding: 10px 14px; font-weight: 400; font-size: 12px; line-height: 18px; border: 1px solid #d0d5dd; box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05); border-radius: 8px; margin-top: 5px; } #gravite_widget_modal_content .feedback-step .submit-button { color: #ffffff; border: none; cursor: pointer; position: absolute; bottom: 20px; right: 5px; padding: 5px 14px; border-radius: 8px; opacity: 1; box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05); } #gravite_widget_modal_content .feedback-step .submit-button:disabled { opacity: 0.5; cursor: not-allowed; } /* CONTACT STEP */ #gravite_widget_modal_content .contact-step { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100%; height: 75%; position: relative; } #gravite_widget_modal_content .contact-step .input-field { width: 281px; height: 40px; padding: 0 3px; text-align: center; font-weight: 400; font-size: 12px; line-height: 18px; border: 1px solid #d0d5dd; box-shadow: 0px 1px 2px rgba(16, 24, 40, 0.05); border-radius: 8px; margin-top: 5px; position: relative; display: flex; flex-direction: row; align-items: center; justify-content: space-between; } #gravite_widget_modal_content .contact-step .input-field input { width: 100%; height: 100%; border: none; background-color: transparent; outline: none; border: none; } #gravite_widget_modal_content .contact-step .input-field input::placeholder { font-size: 12px; font-weight: 400; } #gravite_widget_modal_content .contact-step .button-group { display: flex; flex-direction: row; align-items: center; justify-content: space-between; } #gravite_widget_modal_content .contact-step .skip-button, #gravite_widget_modal_content .contact-step .send-button { background-color: transparent; border: none; cursor: pointer; padding: 5px 14px; border-radius: 8px; } #gravite_widget_modal_content .contact-step .skip-button { color: #98a2b3; text-decoration: underline; font-size: 12px; font-weight: 400; line-height: 20px; } #gravite_widget_modal_content .contact-step .skip-button:active { box-shadow: none; } #gravite_widget_modal_content .contact-step .send-button { color: #ffffff; background-color: #5555d8; } #gravite_widget_modal_content .contact-step .send-button:disabled { opacity: 0.5; cursor: not-allowed; } /* THANK STEP */ #gravite_widget_modal_content #thanks-step { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px; width: 100%; height: 100%; } #gravite_widget_modal_content #thanks-step .thanks-text { font-weight: 500; font-size: 18px; line-height: 28px; text-align: center; } `; const shadowRoot = modal.attachShadow({ mode: 'open' }); shadowRoot.appendChild(style); shadowRoot.appendChild(closeButton); shadowRoot.appendChild(modalContent); shadowRoot.appendChild(poweredByContainer); modalContainer.appendChild(modal); document.body.appendChild(modalContainer); }; export const openModal = () => { const modalContainer = document.getElementById( 'gravite_widget_modal_container' ) as HTMLElement; const modal = document.getElementById('gravite_widget_modal') as HTMLElement; const buttonContainer = document.getElementById( 'gravite_widget_button_container' ) as HTMLElement; if (modal && modalContainer && buttonContainer) { modalContainer.style.display = 'flex'; modalContainer.addEventListener('click', e => { e.stopPropagation(); e.preventDefault(); closeModal(); }); setTimeout(() => { buttonContainer.classList.add('translate'); modal.classList.add('translate'); }, 10); } }; export const closeModal = () => { const modalContainer = document.getElementById( 'gravite_widget_modal_container' ) as HTMLElement; const modal = document.getElementById('gravite_widget_modal') as HTMLElement; const buttonContainer = document.getElementById( 'gravite_widget_button_container' ) as HTMLElement; WidgetState.step = 1; WidgetState.satisfaction = 0; WidgetState.feedback = ''; WidgetState.email = ''; if (modal && modalContainer && buttonContainer) { modalContainer.onclick = null; buttonContainer.classList.remove('translate'); modal.classList.remove('translate'); setTimeout(() => { modalContainer.style.display = 'none'; init(WidgetOptions.customizationOptions); }, 300); } }; export const shadowRoot = (): ShadowRoot => { const modal = document.getElementById('gravite_widget_modal') as HTMLElement; return modal.shadowRoot as ShadowRoot; };