pr360-questionnaire 2.2.11 → 2.3.0

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.
@@ -17355,6 +17355,7 @@ meter::-webkit-meter-optimum-value {
17355
17355
  this.accountActive = true;
17356
17356
  this.visitedNodes = [];
17357
17357
  this.verificationError = null;
17358
+ this.canSelfBook = false;
17358
17359
  this.hubspotId = "40834387";
17359
17360
  }
17360
17361
  get topic() {
@@ -17450,8 +17451,14 @@ meter::-webkit-meter-optimum-value {
17450
17451
  <div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
17451
17452
  <div class="questionnaire--question"><h2 class="u-padding--bt">${this.currentStep.text}</h2></div>
17452
17453
  <vimeo-video controls src=${this.currentStep.url} class="questionnaire--video"></vimeo-video>
17453
- <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. We'll be calling you within 24 hours with more information.</h4></div>
17454
- <div data-test-id="site-phone-number"><h4>If you'd like to speak with us sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call Us</h1></a></div>
17454
+ ${this.canSelfBook ? x`
17455
+ <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. Based on your results ${this.siteSource || "we"} would like to help you set up an initial call with a professional.</h4></div>
17456
+ <button class="button--link" type="button" href=${this.bookingUrl} target="_blank">Book Appointment</button>
17457
+ <div data-test-id="site-phone-number"><h4>Or if you'd like to speak with ${this.siteSource || "us"}, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || "Us"}</h1></a></div>
17458
+ ` : x`
17459
+ <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. ${this.siteSource || "We"} will be calling you within 24 hours with more information.</h4></div>
17460
+ <div data-test-id="site-phone-number"><h4>If you'd like to speak with ${this.siteSource || "us"} sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || "Us"}</h1></a></div>
17461
+ `}
17455
17462
  </div>
17456
17463
  </div>
17457
17464
  </div>
@@ -17463,7 +17470,7 @@ meter::-webkit-meter-optimum-value {
17463
17470
  <div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
17464
17471
  <div class="form__container">
17465
17472
  <div class="header">
17466
- <h1>We think we can help.</h1>
17473
+ <h1>${this.siteSource ? `${this.siteSource} can help.` : "We think we can help."}</h1>
17467
17474
  <h2>${this.currentStep.text}</h2>
17468
17475
  </div>
17469
17476
  <form @submit=${this.submitContactInfo}>
@@ -17503,7 +17510,7 @@ meter::-webkit-meter-optimum-value {
17503
17510
  </div>
17504
17511
  <div class="footer u-text-center">
17505
17512
  <button class="button button--primary u-push-top" type="submit">Get Assessment</button>
17506
- <p>By clicking Submit, you acknowledge that you have read and agree to the <a href=${this.links["terms_conditions"]} target="_blank">Terms of Use</a>
17513
+ <p>By clicking Get Assessment, you consent to receive text messages (SMS) and phone calls, and you acknowledge that you have read and agree to the <a href=${this.links["terms_conditions"]} target="_blank">Terms of Use</a>
17507
17514
  and the <a href=${this.links["privacy_policy"]} target="_blank">Privacy Policy</a></p>
17508
17515
  </div>
17509
17516
  </div>
@@ -17681,6 +17688,15 @@ meter::-webkit-meter-optimum-value {
17681
17688
  __decorateClass([
17682
17689
  t3()
17683
17690
  ], QuestionnaireElement.prototype, "verificationError", 2);
17691
+ __decorateClass([
17692
+ t3()
17693
+ ], QuestionnaireElement.prototype, "canSelfBook", 2);
17694
+ __decorateClass([
17695
+ t3()
17696
+ ], QuestionnaireElement.prototype, "bookingUrl", 2);
17697
+ __decorateClass([
17698
+ t3()
17699
+ ], QuestionnaireElement.prototype, "siteSource", 2);
17684
17700
  __decorateClass([
17685
17701
  n5(),
17686
17702
  liveStateConfig("url")
@@ -17730,7 +17746,7 @@ meter::-webkit-meter-optimum-value {
17730
17746
  QuestionnaireElement = __decorateClass([
17731
17747
  e4("pr360-questionnaire"),
17732
17748
  liveStateDecorator_default({
17733
- properties: ["currentStep", "visitedNodes", "phoneNumber", "links", "accountActive", "questionnaireDepth", "providers", "outcome", "verificationError"],
17749
+ properties: ["currentStep", "visitedNodes", "phoneNumber", "links", "accountActive", "questionnaireDepth", "providers", "outcome", "verificationError", "canSelfBook", "bookingUrl", "siteSource"],
17734
17750
  events: {
17735
17751
  send: ["answerQuestion", "submitContactInfo", "goBack", "setUtmParams", "submitVerification", "resendCode"]
17736
17752
  },
package/css/app.scss CHANGED
@@ -20,6 +20,8 @@
20
20
  @import './components/questionnaire';
21
21
  @import './components/site-rules';
22
22
  @import './components/network-live';
23
+ @import './components/dropdown';
24
+ @import './components/booking';
23
25
 
24
26
  // Imported last to take precedence in the cascade
25
27
  @import './base/utilities';
@@ -9,30 +9,84 @@ body {
9
9
  header,
10
10
  .header {
11
11
  display: grid;
12
- gap: $space-sm;
13
- align-items: end;
14
- grid-template-columns: 1fr auto auto auto auto auto;
12
+ gap: $space-xs;
13
+ grid-template-columns: auto 1fr;
14
+ grid-template-areas: "logo nav";
15
15
  font-size: $small-font-size;
16
16
  padding: $space-sm $space-md;
17
17
  margin-bottom: $space-md;
18
18
  background-color: $white;
19
19
  box-shadow: 5px 5px 20px 3px rgba(131, 131, 131, 0.198);
20
20
 
21
+ .logo {
22
+ grid-area: logo;
23
+ font-weight: bold;
24
+ align-self: center;
25
+ margin: 0;
26
+ }
27
+
28
+ .main-nav {
29
+ grid-area: nav;
30
+ display: flex;
31
+ gap: $space-lg;
32
+ align-items: center;
33
+ justify-content: flex-end;
34
+
35
+ a {
36
+ white-space: nowrap;
37
+ }
38
+ }
39
+
40
+ // User menu dropdown styling in nav bar
41
+ .user-menu-dropdown {
42
+ .dropdown__toggle {
43
+ background-color: transparent;
44
+ border: 1px solid $gray-lighter;
45
+ font-size: 0.8125rem;
46
+ font-weight: 600;
47
+ color: $gray-dark;
48
+ padding: $space-xs $space-sm;
49
+
50
+ &:hover {
51
+ background-color: $gray-lightest;
52
+ border-color: $gray-light;
53
+ }
54
+ }
55
+
56
+ .dropdown__menu {
57
+ min-width: 200px;
58
+ }
59
+ }
60
+
21
61
  @media screen and (max-width: $screen-tablet) {
22
- grid-template-columns: auto auto auto auto 1fr;
62
+ grid-template-columns: 1fr;
23
63
  grid-template-rows: auto auto;
24
- grid-template-areas: "logo settings"
25
- "nav nav";
64
+ grid-template-areas:
65
+ "logo"
66
+ "nav";
26
67
 
27
- nav {
28
- grid-area: nav;
68
+ .logo {
69
+ text-align: center;
29
70
  margin-bottom: $space-xs;
30
71
  }
31
72
 
32
- .logo {grid-area: logo;}
73
+ .main-nav {
74
+ justify-content: center;
75
+ flex-wrap: wrap;
76
+ }
77
+ }
33
78
 
34
- .user-links {grid-area: settings;}
79
+ // Public header variant (no navigation)
80
+ &--public {
81
+ display: flex;
82
+ justify-content: center;
83
+ padding: $space-md;
35
84
 
85
+ .logo {
86
+ text-align: center;
87
+ font-size: 1.25rem;
88
+ color: $color-primary;
89
+ }
36
90
  }
37
91
  }
38
92
 
@@ -0,0 +1,449 @@
1
+ // Booking Page - matches questionnaire styling
2
+ // Colors from questionnaire.lit.scss
3
+ $booking-primary: #3B6A8B;
4
+ $booking-bg: #F0F5F7;
5
+ $booking-white: #FFFFFF;
6
+ $booking-gray: rgb(132, 132, 132);
7
+ $booking-border: #8c8c8c;
8
+ $booking-hover: #D6E2E5;
9
+ $booking-light: #EDF3F4;
10
+
11
+ .booking-page {
12
+ background-color: $booking-bg;
13
+ min-height: 100vh;
14
+ display: flex;
15
+ justify-content: center;
16
+ align-items: flex-start;
17
+ padding: 55px 20px;
18
+ font-family: 'Lato', Helvetica, sans-serif;
19
+ }
20
+
21
+ .booking-card {
22
+ width: 45vw;
23
+ min-height: 55vh;
24
+ background-color: $booking-white;
25
+ padding: 50px;
26
+ border-radius: 45px;
27
+ box-shadow: 7px 7px 5px 0px rgba(0, 0, 0, 0.1);
28
+ position: relative;
29
+
30
+ @media screen and (max-width: 1210px) {
31
+ width: 55vw;
32
+ }
33
+
34
+ @media screen and (max-width: 900px) {
35
+ width: 75vw;
36
+ padding: 30px;
37
+ }
38
+
39
+ @media screen and (max-width: 600px) {
40
+ width: 90vw;
41
+ padding: 25px 20px;
42
+ border-radius: 25px;
43
+ }
44
+
45
+ h1 {
46
+ font-size: 1.5rem;
47
+ font-weight: 700;
48
+ color: rgba(24, 24, 24, 0.88);
49
+ text-align: center;
50
+ margin: 0 0 5px;
51
+ }
52
+
53
+ h2 {
54
+ font-weight: 400;
55
+ margin: 0;
56
+ font-size: 1rem;
57
+ line-height: 1.2rem;
58
+ color: $booking-primary;
59
+ text-align: center;
60
+ }
61
+
62
+ h3 {
63
+ font-weight: 600;
64
+ font-size: 1rem;
65
+ color: rgba(24, 24, 24, 0.88);
66
+ margin: 0 0 10px;
67
+ }
68
+ }
69
+
70
+ .booking-subtitle {
71
+ font-size: 0.9rem;
72
+ color: $booking-gray;
73
+ text-align: center;
74
+ margin: 8px 0 25px;
75
+ }
76
+
77
+ // Navigation buttons
78
+ .booking-nav {
79
+ display: flex;
80
+ justify-content: space-between;
81
+ margin-bottom: 20px;
82
+ }
83
+
84
+ .booking-nav-btn {
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 6px;
88
+ background: transparent;
89
+ border: none;
90
+ color: $booking-primary;
91
+ font-family: 'Lato', Helvetica, sans-serif;
92
+ font-size: 0.875rem;
93
+ font-weight: 400;
94
+ cursor: pointer;
95
+ padding: 8px 12px;
96
+ border-radius: 5px;
97
+ transition: background-color 0.2s ease;
98
+
99
+ &:hover {
100
+ background-color: $booking-light;
101
+ }
102
+
103
+ svg {
104
+ width: 16px;
105
+ height: 16px;
106
+ }
107
+ }
108
+
109
+ .booking-nav-spacer {
110
+ width: 80px;
111
+ }
112
+
113
+ // Days list
114
+ .booking-days {
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: 12px;
118
+ }
119
+
120
+ .booking-day {
121
+ border: 1px solid $booking-border;
122
+ border-radius: 5px;
123
+ overflow: hidden;
124
+ transition: border-color 0.2s ease;
125
+
126
+ &.expanded {
127
+ border-color: $booking-primary;
128
+ }
129
+ }
130
+
131
+ .booking-day-header {
132
+ display: flex;
133
+ justify-content: space-between;
134
+ align-items: center;
135
+ width: 100%;
136
+ padding: 15px 20px;
137
+ background: $booking-white;
138
+ border: none;
139
+ cursor: pointer;
140
+ font-family: 'Lato', Helvetica, sans-serif;
141
+ transition: background-color 0.2s ease;
142
+
143
+ &:hover {
144
+ background-color: $booking-light;
145
+ }
146
+
147
+ .expanded & {
148
+ background-color: $booking-light;
149
+ border-bottom: 1px solid $booking-border;
150
+ }
151
+ }
152
+
153
+ .booking-day-info {
154
+ display: flex;
155
+ flex-direction: column;
156
+ align-items: flex-start;
157
+ gap: 2px;
158
+ }
159
+
160
+ .booking-day-name {
161
+ font-size: 1rem;
162
+ font-weight: 600;
163
+ color: rgba(24, 24, 24, 0.88);
164
+ }
165
+
166
+ .booking-day-date {
167
+ font-size: 0.875rem;
168
+ color: $booking-gray;
169
+ }
170
+
171
+ .booking-day-count {
172
+ font-size: 0.875rem;
173
+ color: $booking-primary;
174
+ font-weight: 400;
175
+ }
176
+
177
+ // Slots container
178
+ .booking-day-slots {
179
+ display: none;
180
+ padding: 15px 20px;
181
+ background: $booking-light;
182
+ flex-wrap: wrap;
183
+ gap: 10px;
184
+
185
+ .expanded & {
186
+ display: flex;
187
+ }
188
+ }
189
+
190
+ .booking-slot {
191
+ font-family: 'Lato', Helvetica, sans-serif;
192
+ font-size: 0.9rem;
193
+ font-weight: 400;
194
+ padding: 10px 18px;
195
+ background: $booking-white;
196
+ border: 1px solid $booking-border;
197
+ border-radius: 5px;
198
+ cursor: pointer;
199
+ transition: all 0.2s ease;
200
+ color: rgba(24, 24, 24, 0.88);
201
+
202
+ &:hover {
203
+ border-color: $booking-primary;
204
+ background-color: $booking-white;
205
+ }
206
+
207
+ &.selected {
208
+ background-color: $booking-primary;
209
+ border-color: $booking-primary;
210
+ color: $booking-white;
211
+ }
212
+ }
213
+
214
+ .booking-slot-duration {
215
+ color: $booking-gray;
216
+ font-size: 0.8rem;
217
+
218
+ .selected & {
219
+ color: rgba(255, 255, 255, 0.8);
220
+ }
221
+ }
222
+
223
+ // Empty state
224
+ .booking-empty {
225
+ text-align: center;
226
+ padding: 40px 20px;
227
+
228
+ p {
229
+ font-size: 1rem;
230
+ color: $booking-gray;
231
+ margin-bottom: 20px;
232
+ }
233
+ }
234
+
235
+ // Actions
236
+ .booking-actions {
237
+ margin-top: 30px;
238
+ display: flex;
239
+ flex-direction: column;
240
+ align-items: center;
241
+ }
242
+
243
+ .booking-selection-summary {
244
+ font-size: 0.875rem;
245
+ color: $booking-primary;
246
+ margin-top: 10px;
247
+ text-align: center;
248
+ }
249
+
250
+ // Buttons matching questionnaire style
251
+ .booking-page .button {
252
+ font-family: sofia-pro, SofiaProWeb, Helvetica, Arial, sans-serif;
253
+ background-color: $booking-light;
254
+ border-radius: 0.5rem;
255
+ color: $booking-primary;
256
+ font-size: 1rem;
257
+ font-weight: 300;
258
+ transition: transform 150ms, background-color 150ms;
259
+ padding: 10px 35px;
260
+ min-width: 150px;
261
+ width: 25vw;
262
+ min-height: 55px;
263
+ border: unset;
264
+ cursor: pointer;
265
+
266
+ @media screen and (max-width: 1210px) {
267
+ width: 35vw;
268
+ }
269
+
270
+ @media screen and (max-width: 700px) {
271
+ width: 60vw;
272
+ }
273
+
274
+ &:hover:not(:disabled) {
275
+ background-color: $booking-hover;
276
+ }
277
+
278
+ &--primary {
279
+ background-color: $booking-primary;
280
+ color: $booking-white;
281
+
282
+ &:hover:not(:disabled) {
283
+ background-color: darken($booking-primary, 8%);
284
+ }
285
+ }
286
+
287
+ &--disabled {
288
+ opacity: 0.5;
289
+ cursor: not-allowed;
290
+ }
291
+ }
292
+
293
+ // Modal styling
294
+ .booking-confirm-modal {
295
+ text-align: center;
296
+ padding: 20px 0;
297
+
298
+ h1 {
299
+ font-size: 1.5rem;
300
+ font-weight: 700;
301
+ color: rgba(24, 24, 24, 0.88);
302
+ margin: 0 0 5px;
303
+ }
304
+
305
+ h2 {
306
+ font-weight: 400;
307
+ margin: 0 0 25px;
308
+ font-size: 1rem;
309
+ color: $booking-primary;
310
+ }
311
+ }
312
+
313
+ .booking-confirm-details {
314
+ background: $booking-light;
315
+ border-radius: 10px;
316
+ padding: 20px 25px;
317
+ margin-bottom: 25px;
318
+ }
319
+
320
+ .booking-confirm-row {
321
+ display: flex;
322
+ justify-content: space-between;
323
+ padding: 10px 0;
324
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
325
+
326
+ &:last-child {
327
+ border-bottom: none;
328
+ }
329
+ }
330
+
331
+ .booking-confirm-label {
332
+ font-size: 0.875rem;
333
+ color: $booking-gray;
334
+ }
335
+
336
+ .booking-confirm-value {
337
+ font-size: 0.875rem;
338
+ font-weight: 600;
339
+ color: rgba(24, 24, 24, 0.88);
340
+ }
341
+
342
+ .booking-confirm-actions {
343
+ display: flex;
344
+ justify-content: center;
345
+ gap: 15px;
346
+
347
+ .button {
348
+ width: auto;
349
+ min-width: 120px;
350
+ }
351
+ }
352
+
353
+ // Confirmation page (show)
354
+ .booking-card--confirmed {
355
+ text-align: center;
356
+
357
+ .booking-confirm-details {
358
+ text-align: left;
359
+ margin: 25px 0;
360
+ }
361
+ }
362
+
363
+ .booking-success-icon {
364
+ width: 80px;
365
+ height: 80px;
366
+ margin: 0 auto 20px;
367
+ color: #22c55e;
368
+
369
+ svg {
370
+ width: 100%;
371
+ height: 100%;
372
+ }
373
+ }
374
+
375
+ .booking-next-steps {
376
+ background: $booking-light;
377
+ border-radius: 10px;
378
+ padding: 25px;
379
+ margin-top: 25px;
380
+ text-align: left;
381
+
382
+ h3 {
383
+ margin-bottom: 15px;
384
+ }
385
+
386
+ p {
387
+ font-size: 0.9rem;
388
+ line-height: 1.6;
389
+ color: $booking-gray;
390
+ margin: 0 0 12px;
391
+
392
+ &:last-child {
393
+ margin-bottom: 0;
394
+ }
395
+ }
396
+ }
397
+
398
+ // Info icon for existing appointments
399
+ .booking-info-icon {
400
+ width: 80px;
401
+ height: 80px;
402
+ margin: 0 auto 20px;
403
+ color: $booking-primary;
404
+
405
+ svg {
406
+ width: 100%;
407
+ height: 100%;
408
+ }
409
+ }
410
+
411
+ // Contact information section
412
+ .booking-contact-info {
413
+ background: $booking-white;
414
+ border: 1px solid $booking-border;
415
+ border-radius: 8px;
416
+ padding: 15px 20px;
417
+ margin: 15px 0;
418
+ }
419
+
420
+ .booking-contact-row {
421
+ display: flex;
422
+ align-items: center;
423
+ gap: 12px;
424
+ padding: 8px 0;
425
+ font-size: 0.9rem;
426
+ color: rgba(24, 24, 24, 0.88);
427
+
428
+ &:not(:last-child) {
429
+ border-bottom: 1px solid rgba(0, 0, 0, 0.08);
430
+ }
431
+
432
+ .contact-icon {
433
+ width: 20px;
434
+ height: 20px;
435
+ color: $booking-primary;
436
+ flex-shrink: 0;
437
+ }
438
+
439
+ span {
440
+ font-weight: 500;
441
+ }
442
+ }
443
+
444
+ .booking-contact-note {
445
+ font-size: 0.8rem !important;
446
+ font-style: italic;
447
+ color: $booking-gray;
448
+ margin-top: 15px !important;
449
+ }
@@ -28,5 +28,87 @@ button, .button {
28
28
  background-color: transparent;
29
29
 
30
30
  }
31
+
32
+ &--compact {
33
+ padding: 8px 12px;
34
+ font-size: 14px;
35
+ }
31
36
 
32
- }
37
+ }
38
+
39
+ .toggle-filter {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ gap: 12px;
43
+ padding: 8px 12px;
44
+ border: 1px solid #e5e7eb;
45
+ border-radius: 6px;
46
+ background-color: #f9fafb;
47
+ cursor: pointer;
48
+ transition: background-color 0.15s ease;
49
+
50
+ &:hover {
51
+ background-color: #f3f4f6;
52
+ }
53
+
54
+ &__label {
55
+ font-size: 13px;
56
+ font-weight: 500;
57
+ color: #374151;
58
+ user-select: none;
59
+ }
60
+ }
61
+
62
+ .toggle-switch {
63
+ position: relative;
64
+ width: 44px;
65
+ height: 24px;
66
+ cursor: pointer;
67
+
68
+ input[type="checkbox"] {
69
+ opacity: 0;
70
+ width: 0;
71
+ height: 0;
72
+ position: absolute;
73
+
74
+ &:checked + .toggle-switch__slider {
75
+ background-color: $color-primary;
76
+
77
+ &:before {
78
+ transform: translateX(20px);
79
+ }
80
+ }
81
+ }
82
+
83
+ &__slider {
84
+ position: absolute;
85
+ top: 0;
86
+ left: 0;
87
+ right: 0;
88
+ bottom: 0;
89
+ background-color: #cbd5e1;
90
+ border-radius: 24px;
91
+ transition: all 0.3s ease;
92
+
93
+ &:before {
94
+ content: "";
95
+ position: absolute;
96
+ height: 18px;
97
+ width: 18px;
98
+ left: 3px;
99
+ bottom: 3px;
100
+ background-color: white;
101
+ border-radius: 50%;
102
+ transition: transform 0.3s ease;
103
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
104
+ }
105
+ }
106
+
107
+ &:hover .toggle-switch__slider {
108
+ background-color: #94a3b8;
109
+ }
110
+
111
+ input[type="checkbox"]:checked + .toggle-switch__slider:hover {
112
+ background-color: darken($color-primary, 10%);
113
+ }
114
+ }
@@ -0,0 +1,103 @@
1
+ // Dropdown menu component
2
+ .dropdown {
3
+ position: relative;
4
+ display: inline-block;
5
+
6
+ &__toggle {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ padding: $space-xs $space-sm;
11
+ background-color: $white;
12
+ border: 1px solid $gray-lighter;
13
+ border-radius: $border-radius;
14
+ color: $gray-dark;
15
+ cursor: pointer;
16
+ transition: $transition;
17
+ min-width: 80px;
18
+ font-size: 14px;
19
+ gap: $space-xs;
20
+
21
+ &:hover {
22
+ background-color: $gray-lightest;
23
+ border-color: $gray-light;
24
+ color: $color-primary;
25
+ }
26
+
27
+ .icon-text {
28
+ font-size: 12px;
29
+ line-height: 1;
30
+ }
31
+ }
32
+
33
+ &__menu {
34
+ display: none;
35
+ position: absolute;
36
+ right: 0;
37
+ top: 100%;
38
+ margin-top: $space-xs;
39
+ background-color: $white;
40
+ border: 1px solid $gray-lighter;
41
+ border-radius: $border-radius;
42
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
43
+ min-width: 180px;
44
+ z-index: 1000;
45
+ padding: $space-xs 0;
46
+
47
+ &--show {
48
+ display: block;
49
+ }
50
+ }
51
+
52
+ &__item {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: $space-sm;
56
+ padding: $space-sm $space-md;
57
+ color: $gray-dark;
58
+ text-decoration: none;
59
+ cursor: pointer;
60
+ transition: $transition;
61
+ border: none;
62
+ background: none;
63
+ width: 100%;
64
+ text-align: left;
65
+ font-size: 14px;
66
+
67
+ .icon-text {
68
+ font-size: 16px;
69
+ line-height: 1;
70
+ width: 20px;
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ }
75
+
76
+ &:hover:not(&--danger) {
77
+ background-color: $gray-lightest;
78
+ color: $color-primary;
79
+ }
80
+
81
+ &--danger {
82
+ color: $gray-dark;
83
+
84
+ &:hover {
85
+ background-color: lighten($danger, 45%) !important;
86
+ color: $danger !important;
87
+ }
88
+ }
89
+
90
+ &--disabled {
91
+ opacity: 0.5;
92
+ cursor: not-allowed;
93
+ pointer-events: none;
94
+ }
95
+ }
96
+
97
+ &__divider {
98
+ height: 1px;
99
+ background-color: $gray-lighter;
100
+ margin: $space-xs 0;
101
+ }
102
+ }
103
+
@@ -47,4 +47,9 @@ input {
47
47
  input {
48
48
  height: 15px;
49
49
  }
50
+
51
+ &--inline {
52
+ display: flex;
53
+ gap: 2rem;
54
+ }
50
55
  }
@@ -7,6 +7,7 @@
7
7
  background-color: rgba(0, 0, 0, .2);
8
8
  backdrop-filter: blur(4px);
9
9
  -webkit-backdrop-filter: blur(4px);
10
+ z-index: 9998;
10
11
  }
11
12
 
12
13
  .modal--container{
@@ -26,6 +27,13 @@
26
27
  }
27
28
  }
28
29
 
30
+ // Ensure FullCalendar sticky headers stay below modals
31
+ .fc-col-header-cell,
32
+ .fc-col-header,
33
+ .fc-scrollgrid-sync-table {
34
+ z-index: 1 !important;
35
+ }
36
+
29
37
  // Style the onboarding email textarea to match other form fields but with better formatting
30
38
  textarea[name="network_form[onboarding_email]"] {
31
39
  font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace !important;
@@ -44,20 +44,7 @@ table {
44
44
  overflow: visible;
45
45
 
46
46
  &_links {
47
- display: flex;
48
- justify-content: space-between;
49
- align-items: baseline;
50
-
51
- & span {
52
- display: flex;
53
- gap: 25px;
54
- }
55
-
56
- & div {
57
- display: flex;
58
- align-items: baseline;
59
- gap: 10px;
60
- }
47
+ margin-bottom: $space-md;
61
48
  }
62
49
 
63
50
  h4 {
@@ -77,6 +64,42 @@ table {
77
64
  }
78
65
  }
79
66
 
67
+ // Prospects toolbar layout
68
+ .prospects-toolbar {
69
+ display: flex;
70
+ justify-content: space-between;
71
+ align-items: center;
72
+ gap: 20px;
73
+ flex-wrap: wrap;
74
+
75
+ &__left {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 15px;
79
+ flex: 1;
80
+ min-width: 0;
81
+ }
82
+
83
+ &__right {
84
+ display: flex;
85
+ align-items: center;
86
+ gap: 12px;
87
+ flex-shrink: 0;
88
+ }
89
+ }
90
+
91
+ // Toolbar links
92
+ .toolbar-link {
93
+ font-size: 14px;
94
+ color: $color-primary;
95
+ text-decoration: none;
96
+ white-space: nowrap;
97
+
98
+ &:hover {
99
+ text-decoration: underline;
100
+ }
101
+ }
102
+
80
103
  table.org-users {
81
104
  margin-bottom: 10vh;
82
105
  }
@@ -90,7 +113,7 @@ table {
90
113
  border-bottom: 1px solid $gray-lighter;
91
114
 
92
115
  td {
93
- padding: $space-sm 0;
116
+ padding: $space-sm $space-md $space-sm 0;
94
117
  }
95
118
  }
96
119
  }
@@ -98,6 +121,7 @@ table {
98
121
  thead {
99
122
  tr {
100
123
  th {
124
+ padding-right: $space-md;
101
125
  text-align: left;
102
126
  color: $gray;
103
127
  font-weight: 400;
@@ -223,6 +247,15 @@ table {
223
247
  cursor: default !important;
224
248
  }
225
249
 
250
+ // Highlight prospects with nil status in red
251
+ .prospects-table tbody tr.prospect-nil-status {
252
+ background-color: #ffe6e6 !important;
253
+ }
254
+
255
+ .prospects-table--main tbody tr.prospect-nil-status:hover {
256
+ background-color: #ffd1d1 !important;
257
+ }
258
+
226
259
  .prospects-table tr,
227
260
  .prospects-table td {
228
261
  overflow: visible !important;
@@ -406,4 +439,79 @@ table {
406
439
  pointer-events: none !important;
407
440
  filter: blur(1px) !important;
408
441
  transition: opacity 0.2s, filter 0.2s;
442
+ }
443
+
444
+ // User table styles
445
+ .user-table {
446
+ tbody {
447
+ tr {
448
+ td:first-child {
449
+ padding-left: 0;
450
+ min-width: 150px;
451
+ }
452
+
453
+ td:nth-child(2) {
454
+ min-width: 200px;
455
+ }
456
+
457
+ td:nth-child(3) {
458
+ min-width: 150px;
459
+ }
460
+ }
461
+ }
462
+ }
463
+
464
+ // Icon buttons for table actions
465
+ .icon-button {
466
+ display: inline-flex;
467
+ align-items: center;
468
+ justify-content: center;
469
+ padding: $space-xs;
470
+ background-color: transparent;
471
+ border: 1px solid $gray-lighter;
472
+ border-radius: $border-radius;
473
+ color: $gray-dark;
474
+ cursor: pointer;
475
+ transition: $transition;
476
+ min-width: 36px;
477
+ min-height: 36px;
478
+ text-decoration: none;
479
+
480
+ .icon-text {
481
+ font-size: 16px;
482
+ line-height: 1;
483
+ display: flex;
484
+ align-items: center;
485
+ justify-content: center;
486
+ width: 20px;
487
+ height: 20px;
488
+ }
489
+
490
+ &:hover {
491
+ background-color: $gray-lightest;
492
+ border-color: $gray-light;
493
+ color: $color-primary;
494
+ transform: translateY(-1px);
495
+ }
496
+
497
+ &:active {
498
+ transform: scale(0.95);
499
+ }
500
+
501
+ &--danger {
502
+ &:hover {
503
+ background-color: lighten($danger, 45%);
504
+ border-color: $danger;
505
+ color: $danger;
506
+ }
507
+ }
508
+ }
509
+
510
+ // Table actions container
511
+ .table-actions {
512
+ display: flex;
513
+ gap: $space-sm;
514
+ align-items: center;
515
+ justify-content: flex-end;
516
+ flex-wrap: nowrap;
409
517
  }
package/dist/index.js CHANGED
@@ -7544,6 +7544,7 @@ meter::-webkit-meter-optimum-value {
7544
7544
  this.accountActive = true;
7545
7545
  this.visitedNodes = [];
7546
7546
  this.verificationError = null;
7547
+ this.canSelfBook = false;
7547
7548
  this.hubspotId = "40834387";
7548
7549
  }
7549
7550
  get topic() {
@@ -7639,8 +7640,14 @@ meter::-webkit-meter-optimum-value {
7639
7640
  <div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
7640
7641
  <div class="questionnaire--question"><h2 class="u-padding--bt">${this.currentStep.text}</h2></div>
7641
7642
  <vimeo-video controls src=${this.currentStep.url} class="questionnaire--video"></vimeo-video>
7642
- <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. We'll be calling you within 24 hours with more information.</h4></div>
7643
- <div data-test-id="site-phone-number"><h4>If you'd like to speak with us sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call Us</h1></a></div>
7643
+ ${this.canSelfBook ? x`
7644
+ <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. Based on your results ${this.siteSource || "we"} would like to help you set up an initial call with a professional.</h4></div>
7645
+ <button class="button--link" type="button" href=${this.bookingUrl} target="_blank">Book Appointment</button>
7646
+ <div data-test-id="site-phone-number"><h4>Or if you'd like to speak with ${this.siteSource || "us"}, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || "Us"}</h1></a></div>
7647
+ ` : x`
7648
+ <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. ${this.siteSource || "We"} will be calling you within 24 hours with more information.</h4></div>
7649
+ <div data-test-id="site-phone-number"><h4>If you'd like to speak with ${this.siteSource || "us"} sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || "Us"}</h1></a></div>
7650
+ `}
7644
7651
  </div>
7645
7652
  </div>
7646
7653
  </div>
@@ -7652,7 +7659,7 @@ meter::-webkit-meter-optimum-value {
7652
7659
  <div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
7653
7660
  <div class="form__container">
7654
7661
  <div class="header">
7655
- <h1>We think we can help.</h1>
7662
+ <h1>${this.siteSource ? `${this.siteSource} can help.` : "We think we can help."}</h1>
7656
7663
  <h2>${this.currentStep.text}</h2>
7657
7664
  </div>
7658
7665
  <form @submit=${this.submitContactInfo}>
@@ -7692,7 +7699,7 @@ meter::-webkit-meter-optimum-value {
7692
7699
  </div>
7693
7700
  <div class="footer u-text-center">
7694
7701
  <button class="button button--primary u-push-top" type="submit">Get Assessment</button>
7695
- <p>By clicking Submit, you acknowledge that you have read and agree to the <a href=${this.links["terms_conditions"]} target="_blank">Terms of Use</a>
7702
+ <p>By clicking Get Assessment, you consent to receive text messages (SMS) and phone calls, and you acknowledge that you have read and agree to the <a href=${this.links["terms_conditions"]} target="_blank">Terms of Use</a>
7696
7703
  and the <a href=${this.links["privacy_policy"]} target="_blank">Privacy Policy</a></p>
7697
7704
  </div>
7698
7705
  </div>
@@ -7870,6 +7877,15 @@ meter::-webkit-meter-optimum-value {
7870
7877
  __decorateClass([
7871
7878
  t3()
7872
7879
  ], QuestionnaireElement.prototype, "verificationError", 2);
7880
+ __decorateClass([
7881
+ t3()
7882
+ ], QuestionnaireElement.prototype, "canSelfBook", 2);
7883
+ __decorateClass([
7884
+ t3()
7885
+ ], QuestionnaireElement.prototype, "bookingUrl", 2);
7886
+ __decorateClass([
7887
+ t3()
7888
+ ], QuestionnaireElement.prototype, "siteSource", 2);
7873
7889
  __decorateClass([
7874
7890
  n5(),
7875
7891
  liveStateConfig("url")
@@ -7919,7 +7935,7 @@ meter::-webkit-meter-optimum-value {
7919
7935
  QuestionnaireElement = __decorateClass([
7920
7936
  e4("pr360-questionnaire"),
7921
7937
  liveStateDecorator_default({
7922
- properties: ["currentStep", "visitedNodes", "phoneNumber", "links", "accountActive", "questionnaireDepth", "providers", "outcome", "verificationError"],
7938
+ properties: ["currentStep", "visitedNodes", "phoneNumber", "links", "accountActive", "questionnaireDepth", "providers", "outcome", "verificationError", "canSelfBook", "bookingUrl", "siteSource"],
7923
7939
  events: {
7924
7940
  send: ["answerQuestion", "submitContactInfo", "goBack", "setUtmParams", "submitVerification", "resendCode"]
7925
7941
  },
package/js/calendar.ts CHANGED
@@ -2,6 +2,7 @@ import { html, LitElement } from "lit";
2
2
  import { property } from 'lit/decorators.js'
3
3
  import { Calendar } from "@fullcalendar/core";
4
4
  import dayGridPlugin from "@fullcalendar/daygrid";
5
+ import timeGridPlugin from "@fullcalendar/timegrid";
5
6
  import resourceTimelinePlugin from "@fullcalendar/resource-timeline";
6
7
  import momentPlugin from "@fullcalendar/moment";
7
8
 
@@ -41,16 +42,16 @@ export class CalendarElement extends LitElement {
41
42
  let calendarEl: HTMLElement = document.getElementById('full-calendar')!;
42
43
  this.calendar = new Calendar(calendarEl, {
43
44
  schedulerLicenseKey: "CC-Attribution-NonCommercial-NoDerivatives",
44
- plugins: [resourceTimelinePlugin, momentPlugin, dayGridPlugin],
45
+ plugins: [resourceTimelinePlugin, momentPlugin, dayGridPlugin, timeGridPlugin],
45
46
  slotMinWidth: 70,
46
47
  slotMinTime: "08:00",
47
48
  slotMaxTime: "20:00",
48
49
  stickyHeaderDates: true,
49
- initialView: 'dayGridWeek',
50
+ initialView: 'timeGridWeek',
50
51
  headerToolbar: {
51
52
  left: 'prev,next today',
52
53
  center: "title",
53
- right: 'dayGridMonth, dayGridWeek, dayGridDay'
54
+ right: 'dayGridMonth, timeGridWeek, timeGridDay'
54
55
  },
55
56
  titleFormat: "dddd, MMM D, YYYY",
56
57
  events: JSON.parse(this.events),
@@ -43,7 +43,7 @@ export type Answer = {
43
43
 
44
44
  @customElement('pr360-questionnaire')
45
45
  @liveState({
46
- properties: ['currentStep', 'visitedNodes', 'phoneNumber', 'links', 'accountActive', 'questionnaireDepth', 'providers', 'outcome', 'verificationError'],
46
+ properties: ['currentStep', 'visitedNodes', 'phoneNumber', 'links', 'accountActive', 'questionnaireDepth', 'providers', 'outcome', 'verificationError', 'canSelfBook', 'bookingUrl', 'siteSource'],
47
47
  events: {
48
48
  send: ['answerQuestion', 'submitContactInfo', 'goBack', 'setUtmParams', 'submitVerification', 'resendCode']
49
49
  },
@@ -80,6 +80,15 @@ export class QuestionnaireElement extends LitElement {
80
80
  @state()
81
81
  verificationError: string | null = null;
82
82
 
83
+ @state()
84
+ canSelfBook: boolean = false;
85
+
86
+ @state()
87
+ bookingUrl: string;
88
+
89
+ @state()
90
+ siteSource: string;
91
+
83
92
  @property()
84
93
  @liveStateConfig('url')
85
94
  url: string | undefined;
@@ -231,8 +240,16 @@ export class QuestionnaireElement extends LitElement {
231
240
  <div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
232
241
  <div class="questionnaire--question"><h2 class="u-padding--bt">${(this.currentStep as Video).text}</h2></div>
233
242
  <vimeo-video controls src=${(this.currentStep as Video).url} class="questionnaire--video"></vimeo-video>
234
- <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. We'll be calling you within 24 hours with more information.</h4></div>
235
- <div data-test-id="site-phone-number"><h4>If you'd like to speak with us sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call Us</h1></a></div>
243
+ ${this.canSelfBook ?
244
+ html`
245
+ <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. Based on your results ${this.siteSource || 'we'} would like to help you set up an initial call with a professional.</h4></div>
246
+ <button class="button--link" type="button" href=${this.bookingUrl} target="_blank">Book Appointment</button>
247
+ <div data-test-id="site-phone-number"><h4>Or if you'd like to speak with ${this.siteSource || 'us'}, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || 'Us'}</h1></a></div>
248
+ ` :
249
+ html`
250
+ <div data-test-id="questionnaire-info"><h4>Thank you for completing the assessment. ${this.siteSource || 'We'} will be calling you within 24 hours with more information.</h4></div>
251
+ <div data-test-id="site-phone-number"><h4>If you'd like to speak with ${this.siteSource || 'us'} sooner, </br> please feel free to</h4><a href="tel:${this.phoneNumber}"><h1>Call ${this.siteSource || 'Us'}</h1></a></div>
252
+ `}
236
253
  </div>
237
254
  </div>
238
255
  </div>
@@ -245,7 +262,7 @@ export class QuestionnaireElement extends LitElement {
245
262
  <div class="questionnaire-illustration"><img src=${this.contactInfoImageUrl()}> </div>
246
263
  <div class="form__container">
247
264
  <div class="header">
248
- <h1>We think we can help.</h1>
265
+ <h1>${this.siteSource ? `${this.siteSource} can help.` : 'We think we can help.'}</h1>
249
266
  <h2>${(this.currentStep as ContactInfo).text}</h2>
250
267
  </div>
251
268
  <form @submit=${this.submitContactInfo}>
@@ -285,7 +302,7 @@ export class QuestionnaireElement extends LitElement {
285
302
  </div>
286
303
  <div class="footer u-text-center">
287
304
  <button class="button button--primary u-push-top" type="submit">Get Assessment</button>
288
- <p>By clicking Submit, you acknowledge that you have read and agree to the <a href=${this.links['terms_conditions']} target="_blank">Terms of Use</a>
305
+ <p>By clicking Get Assessment, you consent to receive text messages (SMS) and phone calls, and you acknowledge that you have read and agree to the <a href=${this.links['terms_conditions']} target="_blank">Terms of Use</a>
289
306
  and the <a href=${this.links['privacy_policy']} target="_blank">Privacy Policy</a></p>
290
307
  </div>
291
308
  </div>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pr360-questionnaire",
3
3
  "description": "An element to render a questionnaire for PatientReach 360.",
4
- "version": "2.2.11",
4
+ "version": "2.3.0",
5
5
  "main": "dist/index.js",
6
6
  "author": {
7
7
  "email": "chris@launchscout.com",
@@ -32,6 +32,7 @@
32
32
  "mermaid-chart": "launchscout/mermaid-chart",
33
33
  "@fullcalendar/core": "^6.1.8",
34
34
  "@fullcalendar/daygrid": "^6.1.8",
35
+ "@fullcalendar/timegrid": "^6.1.8",
35
36
  "@fullcalendar/moment": "^6.1.11",
36
37
  "@fullcalendar/resource": "^6.1.8",
37
38
  "@fullcalendar/resource-timeline": "^6.1.8"