mod-build 4.0.21 → 4.0.22-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/package.json +1 -1
  3. package/public/resources/scripts/abandonment/abandonment-1df90ee155f6c0893d90.min.js +2 -0
  4. package/public/resources/scripts/abandonment/abandonment.min.js +2 -0
  5. package/public/resources/scripts/callrail/callrail-5c7c537f04af468600cf.min.js +2 -0
  6. package/public/resources/scripts/callrail/callrail.min.js +2 -0
  7. package/public/resources/scripts/footer/footer-component-7b5e263f64568573ecc0.min.js +2 -0
  8. package/public/resources/scripts/footer/footer-component.min.js +2 -0
  9. package/public/resources/scripts/helpers/initNumericOnlyFields.min.js +2 -0
  10. package/public/resources/scripts/helpers/initNumericOnlyFields.min.js.map +1 -0
  11. package/public/resources/scripts/helpers/isZipCodeValid.min.js +2 -0
  12. package/public/resources/scripts/helpers/isZipCodeValid.min.js.map +1 -0
  13. package/public/resources/scripts/jornaya.hbs +35 -0
  14. package/public/resources/scripts/jornaya.html +35 -0
  15. package/public/resources/scripts/mod-alytics/modalytics-0ac7d7a5a72ea67a0f47.min.js +2 -0
  16. package/public/resources/scripts/mod-alytics/modalytics.min.js +2 -0
  17. package/public/resources/scripts/mod-form/form/homeowner-62292fdc874b2d2f5c82.min.js +2 -0
  18. package/public/resources/scripts/mod-form/form/homeowner.min.js +2 -0
  19. package/public/resources/scripts/mod-utils/modutils-15069d7b728a555fb3f7.min.js +2 -0
  20. package/public/resources/scripts/mod-utils/modutils.min.js +2 -0
  21. package/public/resources/scripts/trusted-form.hbs +38 -0
  22. package/public/resources/scripts/trusted-form.html +38 -0
  23. package/public/resources/styles/components/abandonment/abandonment-a8571a9e32ed6ef9acb4.min.css +1 -0
  24. package/public/resources/styles/components/abandonment/abandonment.min.css +1 -0
  25. package/public/resources/styles/components/footer/mod-footer-1fb2cec3278f29df57d0.min.css +1 -0
  26. package/public/resources/styles/components/footer/mod-footer.min.css +1 -0
  27. package/public/resources/styles/components/footer/qs-footer-9a3b0ab00428b03e6e9e.min.css +1 -0
  28. package/public/resources/styles/components/footer/qs-footer.min.css +1 -0
  29. package/src/accessible-components/button/_button.scss +319 -0
  30. package/src/accessible-components/button/back-button.html +8 -0
  31. package/src/accessible-components/button/button.html +17 -0
  32. package/src/accessible-components/carousel/_carousel.scss +112 -0
  33. package/src/accessible-components/carousel/carousel.html +25 -0
  34. package/src/accessible-components/carousel/carousel.js +3426 -0
  35. package/src/accessible-components/carousel/carousel.js.map +1 -0
  36. package/src/accessible-components/carousel/carousel.min.js +6 -0
  37. package/src/accessible-components/carousel/carousel.min.js.map +1 -0
  38. package/src/accessible-components/checkbox/_checkbox.scss +153 -0
  39. package/src/accessible-components/checkbox/checkbox-group.html +18 -0
  40. package/src/accessible-components/checkbox/checkbox.html +8 -0
  41. package/src/accessible-components/expand-collapse/_expand-collapse.scss +129 -0
  42. package/src/accessible-components/expand-collapse/expand-collapse.html +14 -0
  43. package/src/accessible-components/expand-collapse/expand-collapse.js +52 -0
  44. package/src/accessible-components/expand-collapse/expand-collapse.min.js +2 -0
  45. package/src/accessible-components/expand-collapse/expand-collapse.min.js.map +1 -0
  46. package/src/accessible-components/featured-block/_featured-block.scss +221 -0
  47. package/src/accessible-components/featured-block/featured-block.html +54 -0
  48. package/src/accessible-components/foot-assets/foot-assets.html +112 -0
  49. package/src/accessible-components/footer/footer.html +2 -0
  50. package/src/accessible-components/gtm-body/gtm-body.html +4 -0
  51. package/src/accessible-components/head/head.html +187 -0
  52. package/src/accessible-components/header/_header.scss +289 -0
  53. package/src/accessible-components/header/header.html +66 -0
  54. package/src/accessible-components/hero/_hero.scss +405 -0
  55. package/src/accessible-components/hero/hero.html +53 -0
  56. package/src/accessible-components/how-it-works/_how-it-works.scss +217 -0
  57. package/src/accessible-components/how-it-works/how-it-works-carousel.html +12 -0
  58. package/src/accessible-components/how-it-works/how-it-works-static.html +12 -0
  59. package/src/accessible-components/how-it-works/how-it-works.html +14 -0
  60. package/src/accessible-components/information/_information.scss +96 -0
  61. package/src/accessible-components/information/information.html +32 -0
  62. package/src/accessible-components/input/_input.scss +204 -0
  63. package/src/accessible-components/input/input.html +22 -0
  64. package/src/accessible-components/input/textarea.html +9 -0
  65. package/src/accessible-components/partners/_partners.scss +234 -0
  66. package/src/accessible-components/partners/partners.html +56 -0
  67. package/src/accessible-components/picture/picture.html +19 -0
  68. package/src/accessible-components/preloader/_preloader.scss +61 -0
  69. package/src/accessible-components/preloader/preloader.html +23 -0
  70. package/src/accessible-components/progress-bar/_progress-bar.scss +140 -0
  71. package/src/accessible-components/progress-bar/progress-bar.html +21 -0
  72. package/src/accessible-components/progress-bar/progress-bar.js +37 -0
  73. package/src/accessible-components/progress-bar/progress-bar.min.js +2 -0
  74. package/src/accessible-components/progress-bar/progress-bar.min.js.map +1 -0
  75. package/src/accessible-components/radio-button/_radio-button.scss +586 -0
  76. package/src/accessible-components/radio-button/radio-button.html +33 -0
  77. package/src/accessible-components/reviews/_reviews.scss +180 -0
  78. package/src/accessible-components/reviews/reviews-carousel.html +12 -0
  79. package/src/accessible-components/reviews/reviews-static.html +12 -0
  80. package/src/accessible-components/reviews/reviews.html +37 -0
  81. package/src/accessible-components/select/_select.scss +87 -0
  82. package/src/accessible-components/select/select.html +10 -0
  83. package/src/accessible-components/steps/_steps.scss +640 -0
  84. package/src/accessible-components/steps/defaultFormFieldConfig.json +109 -0
  85. package/src/accessible-components/steps/step-fields.html +38 -0
  86. package/src/accessible-components/steps/steps.html +168 -0
  87. package/src/accessible-components/tcpa/_tcpa.scss +49 -0
  88. package/src/accessible-components/tcpa/tcpa.html +9 -0
  89. package/src/accessible-components/tile/_tile.scss +117 -0
  90. package/src/accessible-components/tile/tile.html +14 -0
  91. package/src/accessible-components/value-props/_value-props.scss +102 -0
  92. package/src/accessible-components/value-props/value-props.html +17 -0
  93. package/src/accessible-components/zip-control/_zip-control.scss +79 -0
  94. package/src/accessible-components/zip-control/zip-control.html +10 -0
  95. package/src/resources/data/tcpa.json +4 -0
  96. package/src/resources/templates/modals/about/index.hbs +9 -0
  97. package/src/resources/templates/modals/about/index.html +9 -0
  98. package/src/resources/templates/modals/contact-us/index.hbs +348 -0
  99. package/src/resources/templates/modals/contact-us/index.html +348 -0
  100. package/src/resources/templates/modals/faq/index.hbs +9 -0
  101. package/src/resources/templates/modals/faq/index.html +9 -0
  102. package/src/resources/templates/modals/privacy/index.hbs +236 -0
  103. package/src/resources/templates/modals/privacy/index.html +236 -0
  104. package/src/resources/templates/modals/terms/index.hbs +166 -0
  105. package/src/resources/templates/modals/terms/index.html +166 -0
  106. package/src/shared-components/card-button/_card-button.scss +49 -0
  107. package/src/shared-components/card-button/card-button.html +9 -0
  108. package/src/shared-components/carousel/_carousel.scss +106 -0
  109. package/src/shared-components/carousel/carousel.html +22 -0
  110. package/src/shared-components/carousel/carousel.js +3574 -0
  111. package/src/shared-components/carousel/carousel.js.map +1 -0
  112. package/src/shared-components/carousel/carousel.min.js +6 -0
  113. package/src/shared-components/carousel/carousel.min.js.map +1 -0
  114. package/src/shared-components/carousel/carousel.min.min.js +6 -0
  115. package/src/shared-components/carousel/carousel.min.min.js.map +1 -0
  116. package/src/shared-components/checkbox/_checkbox.scss +125 -0
  117. package/src/shared-components/checkbox/checkbox.html +10 -0
  118. package/src/shared-components/expand-collapse/_expand-collapse.scss +93 -0
  119. package/src/shared-components/expand-collapse/expand-collapse.html +8 -0
  120. package/src/shared-components/expand-collapse/expand-collapse.js +40 -0
  121. package/src/shared-components/expand-collapse/expand-collapse.min.js +2 -0
  122. package/src/shared-components/expand-collapse/expand-collapse.min.js.map +1 -0
  123. package/src/shared-components/featured-block/_featured-block.scss +191 -0
  124. package/src/shared-components/featured-block/featured-block.html +80 -0
  125. package/src/shared-components/foot-assets/foot-assets.html +107 -0
  126. package/src/shared-components/form-tcpa/form-tcpa.html +12 -0
  127. package/src/shared-components/gtm-body/gtm-body.html +4 -0
  128. package/src/shared-components/head/head.html +192 -0
  129. package/src/shared-components/header/_header.scss +200 -0
  130. package/src/shared-components/header/header.html +73 -0
  131. package/src/shared-components/hero/_hero.scss +253 -0
  132. package/src/shared-components/hero/hero.html +126 -0
  133. package/src/shared-components/how-it-works/_how-it-works.scss +138 -0
  134. package/src/shared-components/how-it-works/how-it-works.html +19 -0
  135. package/src/shared-components/input/_input.scss +242 -0
  136. package/src/shared-components/input/input.html +30 -0
  137. package/src/shared-components/preloader/_preloader.scss +61 -0
  138. package/src/shared-components/preloader/preloader.html +49 -0
  139. package/src/shared-components/progress-bar/_progress-bar.scss +142 -0
  140. package/src/shared-components/progress-bar/progress-bar.html +20 -0
  141. package/src/shared-components/progress-bar/progress-bar.js +25 -0
  142. package/src/shared-components/progress-bar/progress-bar.min.js +2 -0
  143. package/src/shared-components/progress-bar/progress-bar.min.js.map +1 -0
  144. package/src/shared-components/radio-button/_radio-button.scss +554 -0
  145. package/src/shared-components/radio-button/radio-button.html +25 -0
  146. package/src/shared-components/reviews/_reviews.scss +79 -0
  147. package/src/shared-components/reviews/reviews.html +27 -0
  148. package/src/shared-components/select/_select.scss +61 -0
  149. package/src/shared-components/select/select.html +8 -0
  150. package/src/shared-components/steps/_steps.scss +414 -0
  151. package/src/shared-components/steps/defaultFormFieldConfig.json +64 -0
  152. package/src/shared-components/steps/step-fields.html +36 -0
  153. package/src/shared-components/steps/steps.html +131 -0
  154. package/src/shared-components/textarea/_textarea.scss +96 -0
  155. package/src/shared-components/textarea/textarea.html +13 -0
  156. package/src/shared-components/theme-toggle/_theme-toggle.scss +68 -0
  157. package/src/shared-components/theme-toggle/theme-toggle.html +34 -0
  158. package/src/shared-components/tile/_tile.scss +117 -0
  159. package/src/shared-components/tile/tile.html +27 -0
  160. package/src/shared-components/value-props/_value-props.scss +98 -0
  161. package/src/shared-components/value-props/value-props.html +17 -0
  162. package/src/shared-components/zip-control/_zip-control.scss +42 -0
  163. package/src/shared-components/zip-control/zip-control.html +21 -0
  164. package/tasks/grab-shared-scripts.js +11 -1
@@ -0,0 +1,348 @@
1
+ <div class="contact-us">
2
+ <div class="contact-us__container">
3
+ <form class="contact-us__form">
4
+ <div class="step step--active" aria-hidden="false" tabindex="-1" aria-labelledby="contact-step-one-header">
5
+ <span id="contact-step-one-header" class="visually-hidden">Step 1: Select the radio button option that suits your inquiry.</span>
6
+ <div class="step__header">
7
+ <p class="step__header-number">
8
+ Step 1
9
+ </p>
10
+ <p class="step__header-text">
11
+ Select an option that suits your inquiry
12
+ </p>
13
+ </div>
14
+ <div class="step__content">
15
+ <div class="step__content-item">
16
+ <picture>
17
+ <source srcset="https://modernize.com/quote/resources/assets/images/illustrations/misc/handshake.webp" type="image/webp">
18
+ <img class="step__image" src="https://modernize.com/quote/resources/assets/images/illustrations/misc/handshake.jpg" alt="">
19
+ </picture>
20
+ <div class="step__fieldset">
21
+ <fieldset>
22
+ <legend>Partnerships</legend>
23
+ <div class="field">
24
+ <input type="radio" name="topic" value="SF_partnerships" id="SF_partnerships">
25
+ <label for="SF_partnerships">Publisher/Media Partnership</label>
26
+ </div>
27
+ <div class="field">
28
+ <input type="radio" name="topic" value="SF_advertisers" id="SF_advertisers">
29
+ <label for="SF_advertisers">Advertisers</label>
30
+ </div>
31
+ </fieldset>
32
+ </div>
33
+ </div>
34
+ <div class="step__content-item">
35
+ <picture>
36
+ <source srcset="https://modernize.com/quote/resources/assets/images/illustrations/misc/presentation.webp" type="image/webp">
37
+ <img class="step__image" src="https://modernize.com/quote/resources/assets/images/illustrations/misc/presentation.jpg" alt="">
38
+ </picture>
39
+ <div class="step__fieldset">
40
+ <fieldset>
41
+ <legend>Website Content, Data, Technical Issues</legend>
42
+ <div class="field">
43
+ <input type="radio" name="topic" value="reprint-permissions" id="reprint-permissions">
44
+ <label for="reprint-permissions">Reprint Permissions</label>
45
+ </div>
46
+ <div class="field">
47
+ <input type="radio" name="topic" value="technical-site-issue" id="technical-site-issue">
48
+ <label for="technical-site-issue">Technical Issues with Website</label>
49
+ </div>
50
+ </fieldset>
51
+ </div>
52
+ </div>
53
+ <div class="step__content-item">
54
+ <picture>
55
+ <source srcset="https://modernize.com/quote/resources/assets/images/illustrations/misc/man-on-couch.webp" type="image/webp">
56
+ <img class="step__image" src="https://modernize.com/quote/resources/assets/images/illustrations/misc/man-on-couch.jpg" alt="">
57
+ </picture>
58
+ <div class="step__fieldset">
59
+ <fieldset>
60
+ <legend>Unsubscribe Requests</legend>
61
+ <div class="field">
62
+ <input type="radio" name="topic" value="email-opt-out" id="email-opt-out">
63
+ <label for="email-opt-out">Consumer Email Unsubscribe</label>
64
+ </div>
65
+ <div class="field">
66
+ <input type="radio" name="topic" value="phone-opt-out" id="phone-opt-out">
67
+ <label for="phone-opt-out">Consumer Phone Calls/Text Message Unsubscribe</label>
68
+ </div>
69
+ <div class="field">
70
+ <input type="radio" name="topic" value="general-inquiry" id="general-inquiry">
71
+ <label for="general-inquiry">Other Consumer Issues</label>
72
+ </div>
73
+ </fieldset>
74
+ </div>
75
+ <ul class="step__list">
76
+ <li>
77
+ <a href="https://privacy-central.securiti.ai/#/dsr/edc7a01c-b34c-43d4-8da8-127895e8bd71" target="_parent">California - Request to Know</a>
78
+ <a href="tel:8448727854">(844) 872-7854</a>
79
+ </li>
80
+ <li>
81
+ <a href="https://privacy-central.securiti.ai/#/dsr/edc7a01c-b34c-43d4-8da8-127895e8bd71" target="_parent">California - Request to Delete</a>
82
+ </li>
83
+ </ul>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ <div class="step" aria-hidden="true" tabindex="-1" aria-labelledby="contact-step-two-header">
88
+ <span id="contact-step-two-header" class="visually-hidden">Step 2: Submit your contact info and we'll address your request ASAP. Press tab to begin entering your information.</span>
89
+ <div class="step__header">
90
+ <p class="step__header-number">
91
+ Step 2
92
+ </p>
93
+ <p class="step__header-text">
94
+ Submit your contact info and we'll address your request ASAP
95
+ </p>
96
+ </div>
97
+ <div class="step__content">
98
+ <div class="step__error"></div>
99
+ <div class="form-group parent-error">
100
+ <label for="contact-name">Name</label>
101
+ <input class="form-control" type="text" name="name" id="contact-name">
102
+ <span class="step__error-message" id="error-contact-name">Please enter your name.</span>
103
+ </div>
104
+ <div class="form-group parent-error">
105
+ <label for="contact-phone">Phone</label>
106
+ <input class="form-control" type="tel" name="phone" id="contact-phone">
107
+ <span class="step__error-message" id="error-contact-phone">Please enter a valid phone number.</span>
108
+ </div>
109
+ <div class="form-group parent-error">
110
+ <label for="contact-email">Email</label>
111
+ <input class="form-control" type="email" name="email" id="contact-email">
112
+ <span class="step__error-message" id="error-contact-email">Please enter a valid email address.</span>
113
+ </div>
114
+ <div class="form-group parent-error">
115
+ <label for="contact-message">Message</label>
116
+ <textarea class="form-control" name="message" id="contact-message"></textarea>
117
+ <span class="step__error-message" id="error-contact-message">Please enter your message.</span>
118
+ </div>
119
+ <div>
120
+ <input type="hidden" name="domain" value="{{domain}}">
121
+ <input type="hidden" name="date">
122
+ <input type="hidden" name="time">
123
+ <input type="hidden" name="vertical" value="HomeServices">
124
+ <input type="hidden" name="g-recaptcha-response" value="">
125
+ </div>
126
+ </div>
127
+ <div class="captcha-container captcha-body">
128
+ <div class="g-recaptcha" data-callback="captcha_submit" data-sitekey="6LcsGEkUAAAAAHekw-AS_6Vcu_WeYk7LiPJB1mrR"></div>
129
+ </div>
130
+ <div class="form-controls">
131
+ <button class="btn btn-secondary btn-back" type="button" aria-label="Back"></button>
132
+ <button class="btn btn-submit" type="submit">
133
+ <span class="btn__text">Submit</span>
134
+ <span class="btn__spinner"></span>
135
+ </button>
136
+ </div>
137
+ </div>
138
+ </form>
139
+ <div class="contact-us__thankyou" aria-hidden="true" tabindex="-1" aria-labelledby="contact-success-header">
140
+ <span id="contact-success-header" class="visually-hidden"> Thank you. We'll address your request as soon as possible.</span>
141
+ <picture>
142
+ <source srcset="https://modernize.com/quote/resources/assets/images/illustrations/misc/laptop.webp" type="image/webp">
143
+ <img class="contact-us__thankyou-img" src="https://modernize.com/quote/resources/assets/images/illustrations/misc/laptop.jpg" alt="">
144
+ </picture>
145
+ <p class="contact-us__thankyou-title">Thank You!</p>
146
+ <p class="contact-us__thankyou-subtitle">We'll address your request as soon as possible.</p>
147
+ </div>
148
+ </div>
149
+ </div>
150
+ <script src="https://www.google.com/recaptcha/api.js"></script>
151
+ <script>
152
+ window.captcha_submit = function(response) {
153
+ document.querySelector('input[name="g-recaptcha-response"]').value = response;
154
+ }
155
+ </script>
156
+
157
+ <script>
158
+ var contactUs = {
159
+ $modal: document.getElementById('info-modal'),
160
+ $form: document.querySelector('.contact-us__form'),
161
+ $thankyou: document.querySelector('.contact-us__thankyou'),
162
+ url: 'https://contact.formfetch.com/v2_submit',
163
+ getFormData: function() {
164
+ const date = new Date();
165
+ const data = {};
166
+ const inputs = this.$form.elements;
167
+ if (inputs) {
168
+ for (let i = 0; i < inputs.length; i++) {
169
+ const input = inputs[i];
170
+ if (input.name) {
171
+ data[input.name] = input.value;
172
+ }
173
+ }
174
+ }
175
+
176
+ data.time = date.toLocaleTimeString();
177
+ data.date = date.toLocaleDateString();
178
+ return data;
179
+ },
180
+ validateData: function(data) {
181
+ const _this = this;
182
+ var isFormValid = true;
183
+ const emailPattern = /^([\w\+-]+(?:\.[\w\+-]+)*)(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)/i;
184
+
185
+ Object.keys(data).forEach(function(key) {
186
+ var isValid = true;
187
+ const value = data[key];
188
+ switch (key) {
189
+ case 'email':
190
+ isValid = emailPattern.test(value);
191
+ break;
192
+ default:
193
+ isValid = value !== '';
194
+ break;
195
+ }
196
+
197
+ if (!isValid) {
198
+ _this.markFieldAsInvalid(key);
199
+ _this.focusOnFirstError();
200
+ isFormValid = false;
201
+ }
202
+ });
203
+
204
+ return isFormValid;
205
+ },
206
+ focusOnFirstError: function() {
207
+ const $error = this.$form.querySelectorAll('.has-error');
208
+
209
+ if ($error.length > 0) {
210
+ const firstError = $error[0];
211
+ const $field = firstError.querySelector('input[type="text"], input[type="tel"], input[type="email"], textarea');
212
+ if ($field) {
213
+ $field.focus();
214
+ }
215
+ }
216
+ },
217
+ markFieldAsInvalid: function(fieldName) {
218
+ const $invalidField = this.$form.querySelector('#contact-' + fieldName);
219
+ if ($invalidField) {
220
+ $invalidField.parentElement.classList.add('has-error');
221
+ }
222
+
223
+ const $field = this.$form.querySelector('input[name="' + fieldName + '"]');
224
+ if ($field) {
225
+ $field.setAttribute('aria-invalid', 'true');
226
+ $field.setAttribute('aria-describedby', 'error-contact' + fieldName);
227
+ }
228
+ },
229
+ submit: function() {
230
+ this.$form.classList.add('form--loading');
231
+
232
+ const _this = this;
233
+ const data = this.getFormData();
234
+ const isFormValid = this.validateData(data);
235
+ const formData = Object.keys(data).map(function(key) {
236
+ return encodeURIComponent(key) + '=' + encodeURIComponent(data[key]).replace(/%20/g, '+');
237
+ }).join('&');
238
+
239
+ if (isFormValid) {
240
+ // Submit Form
241
+ var request = new XMLHttpRequest();
242
+ request.onreadystatechange = function() {
243
+ if (request.readyState === 4) {
244
+ if (request.status === 200) {
245
+ var response = JSON.parse(request.responseText);
246
+ if (response.success) {
247
+ _this.$form.style.display = 'none';
248
+ _this.$thankyou.style.display = 'block';
249
+ } else {
250
+ _this.$form.classList.remove('form--loading');
251
+ document.querySelector('.step__error').innerHTML = response.message;
252
+ }
253
+ } else {
254
+ console.error('Request failed with status:', request.status);
255
+ }
256
+ }
257
+ };
258
+
259
+ request.open('POST', _this.url, true);
260
+ request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
261
+ request.send(formData);
262
+ } else {
263
+ _this.$form.classList.remove('form--loading');
264
+ }
265
+ },
266
+ changeStep: function(direction) {
267
+ const $activeStep = this.$form.querySelector('.step--active');
268
+ const $nextStep = $activeStep.nextElementSibling;
269
+ const $prevStep = $activeStep.previousElementSibling;
270
+
271
+ $activeStep.classList.remove('step--active');
272
+ $activeStep.setAttribute('aria-hidden', 'true');
273
+ if (direction === 'next') {
274
+ $nextStep.classList.add('step--active');
275
+ $nextStep.setAttribute('aria-hidden', 'false');
276
+ $nextStep.focus();
277
+ } else {
278
+ $prevStep.classList.add('step--active');
279
+ $prevStep.setAttribute('aria-hidden', 'false');
280
+ $prevStep.focus();
281
+ }
282
+ },
283
+ watch: function() {
284
+ const _this = this;
285
+ var radioChangedWithMouse = false;
286
+
287
+ // Watch form submission
288
+ _this.$form.addEventListener('submit', function(e) {
289
+ e.preventDefault();
290
+ if (!_this.$form.classList.contains('form--loading')) {
291
+ _this.submit();
292
+ }
293
+ });
294
+
295
+ // Watch radio click with mouse only
296
+ const $radioLabelsAndInputs = _this.$form.querySelectorAll('fieldset label, input[type="radio"]');
297
+ $radioLabelsAndInputs.forEach(function(input) {
298
+ input.addEventListener('mouseup', function() {
299
+ radioChangedWithMouse = true;
300
+ });
301
+ })
302
+
303
+ const $radioInputs = _this.$form.querySelectorAll('input[type="radio"]');
304
+ $radioInputs.forEach(function(input) {
305
+ input.addEventListener('click', function(e) {
306
+ if (radioChangedWithMouse) {
307
+ _this.changeStep('next');
308
+ radioChangedWithMouse = false;
309
+ }
310
+ });
311
+ input.addEventListener('keypress', function(e) {
312
+ if(e.which == 13){
313
+ e.preventDefault();
314
+ _this.changeStep('next');
315
+
316
+ // Making sure radio button is actually selected on Enter
317
+ var focused = e.target;
318
+ if (!focused.checked) {
319
+ focused.checked = true;
320
+ }
321
+ }
322
+ })
323
+ });
324
+
325
+ // Watch back button
326
+ const $backBtn = _this.$form.querySelector('.btn-back');
327
+ if ($backBtn) {
328
+ $backBtn.addEventListener('click', function() {
329
+ _this.changeStep('prev');
330
+ });
331
+ }
332
+
333
+ // Remove error state when input/textarea changes
334
+ const $formInputs = _this.$form.querySelectorAll('input, textarea');
335
+ $formInputs.forEach(function(input) {
336
+ input.addEventListener('change', function() {
337
+ input.parentElement.classList.remove('has-error');
338
+ input.setAttribute('aria-invalid', 'false');
339
+ input.removeAttribute('aria-describedby');
340
+ });
341
+ });
342
+ },
343
+ init: function() {
344
+ this.watch();
345
+ }
346
+ };
347
+ contactUs.init();
348
+ </script>
@@ -0,0 +1,9 @@
1
+ <p>Below are answers to some of the more frequently asked questions we receive. If you do not see your question listed, please send us an email.</p>
2
+ <h2>How does this service work?</h2>
3
+ <p>We maintain a large network of home improvement professionals across the US. Once you have submitted your information to our system, we will instantly match you with local contractors in your area. Those contractors will provide free price quotes via the information you have provided. This process will save you time and money because you can compare rates from multiple companies without having to contact numerous contractors and provide your information several times.</p>
4
+ <h2>Do you perform the contracting work?</h2>
5
+ <p>No, we are not a general contractor. We are a free referral service for consumers needing home improvement services. We do not actually perform the work, but instead provide a free referral service.</p>
6
+ <h2>I have already submitted my information, when will I get my quote?</h2>
7
+ <p>The contractors who receive your request will usually begin building your quotes immediately and will often provide detailed pricing information within minutes. However, some quotes are more complicated and may require a little more time to process. Regardless, you should always receive your free quotes within 48 hours at the latest.</p>
8
+ <h2>How do I get a quote?</h2>
9
+ <p>To get a free, no-obligation quote, just go to our homepage, enter your zip code and submit the form.</p>
@@ -0,0 +1,9 @@
1
+ <p>Below are answers to some of the more frequently asked questions we receive. If you do not see your question listed, please send us an email.</p>
2
+ <h2>How does this service work?</h2>
3
+ <p>We maintain a large network of home improvement professionals across the US. Once you have submitted your information to our system, we will instantly match you with local contractors in your area. Those contractors will provide free price quotes via the information you have provided. This process will save you time and money because you can compare rates from multiple companies without having to contact numerous contractors and provide your information several times.</p>
4
+ <h2>Do you perform the contracting work?</h2>
5
+ <p>No, we are not a general contractor. We are a free referral service for consumers needing home improvement services. We do not actually perform the work, but instead provide a free referral service.</p>
6
+ <h2>I have already submitted my information, when will I get my quote?</h2>
7
+ <p>The contractors who receive your request will usually begin building your quotes immediately and will often provide detailed pricing information within minutes. However, some quotes are more complicated and may require a little more time to process. Regardless, you should always receive your free quotes within 48 hours at the latest.</p>
8
+ <h2>How do I get a quote?</h2>
9
+ <p>To get a free, no-obligation quote, just go to our homepage, enter your zip code and submit the form.</p>