@meetelise/chat 1.30.5 → 1.31.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.
Files changed (37) hide show
  1. package/dist/src/WebComponent/FeeCalculator/components/fee-calculator-layout/fee-calculator-layout.d.ts +1 -1
  2. package/dist/src/WebComponent/FeeCalculator/components/floor-plan-selector/floor-plan-selector.d.ts +1 -1
  3. package/dist/src/WebComponent/FeeCalculator/components/incentive-banner/incentive-banner-styles.d.ts +1 -0
  4. package/dist/src/WebComponent/FeeCalculator/components/incentive-banner/incentive-banner.d.ts +8 -0
  5. package/dist/src/WebComponent/FeeCalculator/components/incentive-banner/index.d.ts +1 -0
  6. package/dist/src/WebComponent/FeeCalculator/fee-calculator.d.ts +2 -3
  7. package/dist/src/WebComponent/FeeCalculator/model/building-fee.d.ts +2 -0
  8. package/dist/src/WebComponent/icons/DollarOutlineIcon.d.ts +5 -1
  9. package/dist/src/WebComponent/loaders/index.d.ts +4 -0
  10. package/dist/src/WebComponent/loaders/skeleton-card.d.ts +12 -0
  11. package/dist/src/WebComponent/loaders/skeleton-loader-styles.d.ts +3 -0
  12. package/dist/src/WebComponent/loaders/skeleton-loader.d.ts +13 -0
  13. package/dist/src/services/fees/fetchBuildingFees.d.ts +2 -0
  14. package/dist/src/types/incentive-v2.d.ts +23 -0
  15. package/package.json +1 -1
  16. package/public/dist/index.js +406 -252
  17. package/src/WebComponent/FeeCalculator/components/addon-item/addon-item.ts +2 -2
  18. package/src/WebComponent/FeeCalculator/components/fee-calculator-layout/fee-calculator-layout-styles.ts +19 -12
  19. package/src/WebComponent/FeeCalculator/components/fee-calculator-layout/fee-calculator-layout.ts +5 -2
  20. package/src/WebComponent/FeeCalculator/components/floor-plan-selector/floor-plan-selector-styles.ts +11 -9
  21. package/src/WebComponent/FeeCalculator/components/floor-plan-selector/floor-plan-selector.ts +1 -1
  22. package/src/WebComponent/FeeCalculator/components/floorplan-image-card/floorplan-image-card-styles.ts +9 -1
  23. package/src/WebComponent/FeeCalculator/components/incentive-banner/incentive-banner-styles.ts +40 -0
  24. package/src/WebComponent/FeeCalculator/components/incentive-banner/incentive-banner.ts +43 -0
  25. package/src/WebComponent/FeeCalculator/components/incentive-banner/index.ts +1 -0
  26. package/src/WebComponent/FeeCalculator/fee-calculator-styles.ts +50 -74
  27. package/src/WebComponent/FeeCalculator/fee-calculator.ts +22 -49
  28. package/src/WebComponent/FeeCalculator/model/building-fee.ts +2 -0
  29. package/src/WebComponent/icons/DollarOutlineIcon.ts +11 -3
  30. package/src/WebComponent/loaders/index.ts +7 -0
  31. package/src/WebComponent/loaders/skeleton-card.ts +31 -0
  32. package/src/WebComponent/loaders/skeleton-loader-styles.ts +112 -0
  33. package/src/WebComponent/loaders/skeleton-loader.ts +34 -0
  34. package/src/services/fees/fetchBuildingFees.ts +4 -0
  35. package/src/types/incentive-v2.ts +24 -0
  36. /package/dist/src/WebComponent/{mega-loader.d.ts → loaders/mega-loader.d.ts} +0 -0
  37. /package/src/WebComponent/{mega-loader.ts → loaders/mega-loader.ts} +0 -0
@@ -30,12 +30,12 @@ export class AddonItem extends LitElement {
30
30
 
31
31
  get atMaxUnits(): boolean {
32
32
  const maxUnits =
33
- this.feeItem?.blueprint.addOnInfo?.maxUnitsCharged ?? Infinity;
33
+ this.feeItem?.blueprint.addOnInfo?.maxUnitsAllowed ?? Infinity;
34
34
  return this.quantity >= maxUnits;
35
35
  }
36
36
 
37
37
  get atMinUnits(): boolean {
38
- const minUnits = this.feeItem?.blueprint.addOnInfo?.minUnitsCharged ?? 0;
38
+ const minUnits = this.feeItem?.blueprint.addOnInfo?.minUnitsAllowed ?? 0;
39
39
  return this.quantity <= minUnits;
40
40
  }
41
41
 
@@ -61,12 +61,13 @@ export default css`
61
61
 
62
62
  .loading-container {
63
63
  display: flex;
64
- justify-content: center;
65
- align-items: center;
64
+ justify-content: flex-start;
65
+ align-items: flex-start;
66
66
  width: 100%;
67
67
  height: 100%;
68
68
  min-height: 300px;
69
69
  flex: 1;
70
+ padding-top: 16px;
70
71
  }
71
72
 
72
73
  .empty-state {
@@ -79,36 +80,38 @@ export default css`
79
80
  }
80
81
 
81
82
  @media (max-width: 768px) {
82
- .fee-calculator-layout,
83
- .sidepanel,
84
- .fees-container,
85
- .sidepanel-section {
83
+ .fee-calculator-layout {
84
+ flex-direction: column;
85
+ gap: 10px;
86
86
  width: 100%;
87
87
  margin: 0;
88
88
  padding: 0;
89
89
  box-sizing: border-box;
90
90
  }
91
91
 
92
- .fee-calculator-layout {
93
- flex-direction: column;
94
- gap: 10px;
95
- height: 100%;
96
- }
97
-
98
92
  .sidepanel {
99
93
  max-width: 100%;
100
94
  order: 1;
101
95
  flex: none;
96
+ width: 100%;
97
+ margin: 0;
98
+ box-sizing: border-box;
102
99
  }
103
100
 
104
101
  .fees-container {
105
102
  order: 2;
106
103
  min-height: auto;
104
+ width: 100%;
105
+ margin: 0;
106
+ box-sizing: border-box;
107
107
  }
108
108
 
109
109
  .sidepanel-section {
110
110
  border-radius: 0;
111
111
  margin: 0 0 8px 0;
112
+ padding: 16px;
113
+ width: 100%;
114
+ box-sizing: border-box;
112
115
  }
113
116
 
114
117
  .loading-container {
@@ -116,11 +119,15 @@ export default css`
116
119
  min-height: 100px;
117
120
  padding-top: 20px;
118
121
  align-items: flex-start;
122
+ width: 100%;
123
+ box-sizing: border-box;
119
124
  }
120
125
 
121
126
  .empty-state {
122
127
  height: auto;
123
128
  min-height: 100px;
129
+ width: 100%;
130
+ box-sizing: border-box;
124
131
  }
125
132
  }
126
133
  `;
@@ -13,7 +13,7 @@ import {
13
13
  import "../floor-plan-selector/floor-plan-selector";
14
14
  import "../fee-card/fee-card";
15
15
  import "../addon-item/addon-item";
16
- import "../../../mega-loader";
16
+ import "../../../loaders/skeleton-loader";
17
17
 
18
18
  @customElement("fee-calculator-layout")
19
19
  export class FeeCalculatorLayout extends LitElement {
@@ -149,7 +149,10 @@ export class FeeCalculatorLayout extends LitElement {
149
149
  ${this.isLoading
150
150
  ? html`
151
151
  <div class="loading-container">
152
- <mega-loader></mega-loader>
152
+ <skeleton-loader
153
+ .cards=${3}
154
+ .rowsPerCard=${[3, 2, 1]}
155
+ ></skeleton-loader>
153
156
  </div>
154
157
  `
155
158
  : this.renderFeeSections()}
@@ -19,19 +19,21 @@ const floorPlanSelectorStyles = css`
19
19
 
20
20
  .floor-plan-selector-badges {
21
21
  display: flex;
22
- flex-wrap: wrap;
22
+ overflow-x: scroll;
23
23
  gap: 8px;
24
24
  margin-bottom: 12px;
25
+ scrollbar-width: thin;
25
26
  }
26
27
 
27
28
  .floor-plan-badge {
28
29
  padding: 6px 12px;
29
30
  border-radius: 16px;
31
+ min-width: 2rem;
32
+ text-align: center;
30
33
  font-size: 0.9rem;
31
34
  cursor: pointer;
32
35
  background-color: #f0f0f0;
33
36
  border: 1px solid #ddd;
34
- transition: all 0.15s ease;
35
37
  }
36
38
 
37
39
  .floor-plan-badge:hover {
@@ -47,12 +49,10 @@ const floorPlanSelectorStyles = css`
47
49
  .advanced-section {
48
50
  max-height: 0;
49
51
  overflow: hidden;
50
- transition: max-height 0.15s ease-out;
51
52
  }
52
53
 
53
54
  .advanced-section.open {
54
55
  max-height: 800px;
55
- transition: max-height 0.2s ease-in;
56
56
  }
57
57
 
58
58
  .date-fields {
@@ -60,7 +60,6 @@ const floorPlanSelectorStyles = css`
60
60
  flex-direction: row;
61
61
  gap: 16px;
62
62
  margin-bottom: 16px;
63
- transition: gap 0.15s ease;
64
63
  }
65
64
 
66
65
  .date-field {
@@ -91,16 +90,12 @@ const floorPlanSelectorStyles = css`
91
90
  gap: 16px;
92
91
  padding: 12px 0;
93
92
  scroll-behavior: smooth;
94
- transition: flex-direction 0.15s ease, max-height 0.15s ease,
95
- width 0.15s ease, overflow-x 0.15s ease;
96
93
  }
97
94
 
98
95
  .unit-selection {
99
96
  margin-top: 16px;
100
97
  max-height: 16rem;
101
98
  overflow-y: auto;
102
- transition: max-height 0.15s ease, overflow-y 0.15s ease,
103
- overflow-x 0.15s ease;
104
99
  }
105
100
 
106
101
  .unit-label {
@@ -114,6 +109,13 @@ const floorPlanSelectorStyles = css`
114
109
  align-items: center;
115
110
  }
116
111
 
112
+ @media (max-width: 840px) {
113
+ .date-fields {
114
+ flex-direction: column;
115
+ gap: 12px;
116
+ }
117
+ }
118
+
117
119
  @media (max-width: 768px) {
118
120
  .date-fields {
119
121
  gap: 10px;
@@ -11,7 +11,7 @@ import floorPlanSelectorStyles from "./floor-plan-selector-styles";
11
11
  import { addMonths, startOfMonth } from "date-fns";
12
12
 
13
13
  import "../floorplan-image-card/floorplan-image-card";
14
- import "../../../mega-loader";
14
+ import "../../../loaders/mega-loader";
15
15
 
16
16
  const FIRST_OF_NEXT_MONTH = startOfMonth(addMonths(new Date(), 1));
17
17
 
@@ -13,7 +13,8 @@ const floorplanImageCardStyles = css`
13
13
  display: flex;
14
14
  flex-direction: row;
15
15
  background-color: #f8f9fa;
16
- width: 18rem;
16
+ min-width: 18rem;
17
+ width: 100%;
17
18
  padding: 12px;
18
19
  gap: 8px;
19
20
  border-radius: 4px;
@@ -23,6 +24,7 @@ const floorplanImageCardStyles = css`
23
24
 
24
25
  .section-left {
25
26
  flex: 0 0 auto;
27
+ position: relative;
26
28
  }
27
29
 
28
30
  .floorplan-image-card.selected {
@@ -59,6 +61,12 @@ const floorplanImageCardStyles = css`
59
61
  object-fit: cover;
60
62
  border: 1px solid #ddd;
61
63
  cursor: pointer;
64
+ position: relative;
65
+ }
66
+
67
+ img:hover {
68
+ border-color: var(--primary-color, #646987);
69
+ box-shadow: 0 0 10px 3px rgba(100, 105, 135, 0.4);
62
70
  }
63
71
 
64
72
  @media (max-width: 768px) {
@@ -0,0 +1,40 @@
1
+ import { css } from "lit";
2
+
3
+ export const incentiveBannerStyles = css`
4
+ :host {
5
+ display: block;
6
+ }
7
+
8
+ .incentive-banner {
9
+ width: 100%;
10
+ background-color: #e8f2ff;
11
+ padding: 8px 12px;
12
+ display: flex;
13
+ align-items: center;
14
+ gap: 8px;
15
+ }
16
+
17
+ .incentive-icon {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ width: 3rem;
22
+ height: 3rem;
23
+ }
24
+
25
+ .incentive-content {
26
+ flex: 1;
27
+ }
28
+
29
+ .incentive-title {
30
+ margin: 0;
31
+ font-size: 1.1rem;
32
+ }
33
+
34
+ .incentive-subtitle {
35
+ margin: 4px 0 0 0;
36
+ color: #868e96;
37
+ font-size: 0.9rem;
38
+ opacity: 0.9;
39
+ }
40
+ `;
@@ -0,0 +1,43 @@
1
+ import { LitElement, html, TemplateResult } from "lit";
2
+ import { customElement, property } from "lit/decorators.js";
3
+ import { IncentiveV2 } from "../../../../types/incentive-v2";
4
+ import { incentiveBannerStyles } from "./incentive-banner-styles";
5
+ import DollarOutlineIcon from "../../../icons/DollarOutlineIcon";
6
+
7
+ @customElement("incentive-banner")
8
+ export class IncentiveBanner extends LitElement {
9
+ static styles = incentiveBannerStyles;
10
+
11
+ @property({ type: Object })
12
+ incentive!: IncentiveV2;
13
+
14
+ getFormattedEndDate(incentive: IncentiveV2): string {
15
+ const endDate = new Date(incentive.endDate);
16
+ return endDate.toLocaleDateString("en-US", {
17
+ month: "long",
18
+ day: "numeric",
19
+ year: "numeric",
20
+ });
21
+ }
22
+
23
+ render(): TemplateResult {
24
+ if (!this.incentive) {
25
+ return html``;
26
+ }
27
+
28
+ return html`
29
+ <div class="incentive-banner">
30
+ <div class="incentive-icon">${DollarOutlineIcon({ size: 32 })}</div>
31
+ <div class="incentive-content">
32
+ <h2 class="incentive-title">
33
+ ${this.incentive.originalIncentiveString}
34
+ </h2>
35
+ <p class="incentive-subtitle">
36
+ Valid through ${this.getFormattedEndDate(this.incentive)} for
37
+ ${this.incentive.qualifier}
38
+ </p>
39
+ </div>
40
+ </div>
41
+ `;
42
+ }
43
+ }
@@ -0,0 +1 @@
1
+ export * from "./incentive-banner";
@@ -7,19 +7,22 @@ export const feeCalculatorStyles = css`
7
7
  }
8
8
 
9
9
  .fee-calculator-container {
10
- background-color: #ffffff;
10
+ background-color: white;
11
11
  border-radius: 8px;
12
12
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
13
13
  padding: 20px;
14
+ height: 80vh;
14
15
  width: 80vw;
15
- max-width: 1200px;
16
- margin: 0 auto;
17
16
  display: flex;
18
17
  flex-direction: column;
19
- height: 70vh;
20
18
  overflow: hidden;
21
19
  transition: width 0.15s ease, height 0.15s ease, padding 0.15s ease,
22
20
  margin 0.15s ease;
21
+ position: fixed;
22
+ top: 50%;
23
+ left: 50%;
24
+ transform: translate(-50%, -50%);
25
+ z-index: 1000;
23
26
  }
24
27
 
25
28
  .fee-calculator-container.compact {
@@ -37,7 +40,6 @@ export const feeCalculatorStyles = css`
37
40
 
38
41
  .calculator-header h1 {
39
42
  font-size: 1.2rem;
40
- font-weight: normal;
41
43
  color: #333;
42
44
  transition: font-size 0.15s ease;
43
45
  }
@@ -45,6 +47,7 @@ export const feeCalculatorStyles = css`
45
47
  .calculator-header-right {
46
48
  display: flex;
47
49
  gap: 10px;
50
+ align-items: center;
48
51
  }
49
52
 
50
53
  .calculator-header-divider {
@@ -61,10 +64,50 @@ export const feeCalculatorStyles = css`
61
64
  transition: padding-top 0.15s ease, width 0.15s ease;
62
65
  }
63
66
 
67
+ .incentives-container {
68
+ width: 100%;
69
+ display: flex;
70
+ flex-direction: column;
71
+ gap: 1px;
72
+ margin-bottom: 12px;
73
+ }
74
+
75
+ .incentive-banner {
76
+ width: 100%;
77
+ background-color: #e8f2ff;
78
+ padding: 12px 16px;
79
+ display: flex;
80
+ align-items: center;
81
+ gap: 12px;
82
+ }
83
+
84
+ .incentive-icon {
85
+ display: flex;
86
+ align-items: center;
87
+ justify-content: center;
88
+ height: 3rem;
89
+ width: 3rem;
90
+ }
91
+
92
+ .incentive-content {
93
+ flex: 1;
94
+ }
95
+
96
+ .incentive-title {
97
+ margin: 0;
98
+ font-size: 1.1rem;
99
+ }
100
+
101
+ .incentive-subtitle {
102
+ margin: 4px 0 0 0;
103
+ color: #868e96;
104
+ font-size: 0.9rem;
105
+ opacity: 0.9;
106
+ }
107
+
64
108
  .close-button {
65
109
  background: none;
66
110
  border: none;
67
- color: #6c757d;
68
111
  font-size: 24px;
69
112
  cursor: pointer;
70
113
  padding: 0;
@@ -141,15 +184,6 @@ export const feeCalculatorStyles = css`
141
184
  cursor: not-allowed;
142
185
  }
143
186
 
144
- .reset-button {
145
- background-color: #6c757d;
146
- margin-top: 16px;
147
- }
148
-
149
- .reset-button:hover {
150
- background-color: #5a6268;
151
- }
152
-
153
187
  .calculation-results {
154
188
  margin-top: 24px;
155
189
  padding-top: 16px;
@@ -199,50 +233,6 @@ export const feeCalculatorStyles = css`
199
233
  border-top: 1px solid #e0e0e0;
200
234
  }
201
235
 
202
- .close-circle-button {
203
- position: absolute;
204
- bottom: -50px;
205
- right: 20px;
206
- width: 50px;
207
- height: 50px;
208
- border-radius: 50%;
209
- background-color: #007bff;
210
- color: white;
211
- display: flex;
212
- align-items: center;
213
- justify-content: center;
214
- cursor: pointer;
215
- box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
216
- border: none;
217
- font-size: 24px;
218
- z-index: 10;
219
- }
220
-
221
- .close-circle-button:hover {
222
- background-color: #0069d9;
223
- }
224
-
225
- #calculator-additional-actions {
226
- position: fixed;
227
- box-sizing: border-box;
228
- z-index: 1000000;
229
- margin-left: -1rem;
230
- }
231
-
232
- .hideActions {
233
- display: none;
234
- }
235
-
236
- .showActions {
237
- display: block;
238
- }
239
-
240
- .additional-actions-container {
241
- display: flex;
242
- justify-content: space-around;
243
- gap: 10px;
244
- }
245
-
246
236
  .action-button {
247
237
  flex: 1;
248
238
  background-color: #f8f9fa;
@@ -278,15 +268,6 @@ export const feeCalculatorStyles = css`
278
268
  background-color: var(--primary-color, #ffffff);
279
269
  }
280
270
 
281
- .mobile-close-button {
282
- display: none;
283
- background: none;
284
- border: none;
285
- padding: 8px;
286
- cursor: pointer;
287
- color: #6c757d;
288
- }
289
-
290
271
  @media (max-width: 768px) {
291
272
  .fee-calculator-container {
292
273
  width: 100vw;
@@ -303,6 +284,7 @@ export const feeCalculatorStyles = css`
303
284
  left: 0;
304
285
  right: 0;
305
286
  bottom: 0;
287
+ transform: none;
306
288
  z-index: 9999;
307
289
  }
308
290
 
@@ -324,11 +306,5 @@ export const feeCalculatorStyles = css`
324
306
  .calculator-header-divider {
325
307
  margin: 2px 0;
326
308
  }
327
-
328
- .mobile-close-button {
329
- display: flex;
330
- align-items: center;
331
- justify-content: center;
332
- }
333
309
  }
334
310
  `;
@@ -18,10 +18,12 @@ import {
18
18
  import { defaultBackgroundColor, defaultPrimaryColor } from "../../themes";
19
19
  import debounce from "lodash/debounce";
20
20
  import { XOutlineIcon } from "../icons/XOutlineIcon";
21
+ import { IncentiveV2 } from "../../types/incentive-v2";
21
22
 
22
23
  import "./components";
23
24
  import "./components/fee-calculator-layout/fee-calculator-layout";
24
25
  import "../chat-additional-actions";
26
+ import "./components/incentive-banner";
25
27
 
26
28
  @customElement("fee-calculator")
27
29
  export class FeeCalculator extends LitElement {
@@ -81,6 +83,9 @@ export class FeeCalculator extends LitElement {
81
83
  @state()
82
84
  private buildingWebchatView: BuildingWebchatView | null = null;
83
85
 
86
+ @state()
87
+ private incentives: IncentiveV2[] = [];
88
+
84
89
  @state()
85
90
  enabledChatWidgets: {
86
91
  callDesktop: boolean;
@@ -131,16 +136,6 @@ export class FeeCalculator extends LitElement {
131
136
  return this.buildingWebchatView?.layoutOptions ?? [];
132
137
  }
133
138
 
134
- connectedCallback(): void {
135
- super.connectedCallback();
136
- window.addEventListener("resize", this.adjustPositionAdditionalActions);
137
- }
138
-
139
- disconnectedCallback(): void {
140
- window.removeEventListener("resize", this.adjustPositionAdditionalActions);
141
- super.disconnectedCallback();
142
- }
143
-
144
139
  firstUpdated = async (): Promise<void> => {
145
140
  this.style.setProperty("--primary-color", this.primaryColor);
146
141
  this.style.setProperty("--background-color", this.backgroundColor);
@@ -151,7 +146,6 @@ export class FeeCalculator extends LitElement {
151
146
  setupCalculator = async (): Promise<void> => {
152
147
  if (!this.buildingSlug || !this.orgSlug) return;
153
148
 
154
- // TODO(Leo): Faster async loading
155
149
  const [buildingWebchatView, buildingFeeResponse] = await Promise.all([
156
150
  fetchBuildingWebchatView(this.orgSlug, this.buildingSlug),
157
151
  fetchBuildingFees(this.buildingSlug),
@@ -161,6 +155,7 @@ export class FeeCalculator extends LitElement {
161
155
 
162
156
  this.buildingWebchatView = buildingWebchatView;
163
157
  this.groupedFees = this.groupFees(buildingFeeResponse.fees);
158
+ this.incentives = buildingFeeResponse.buildingIncentives;
164
159
 
165
160
  this.enabledChatWidgets = {
166
161
  callDesktop: this.buildingWebchatView?.shouldShowPhoneDesktop ?? false,
@@ -179,7 +174,6 @@ export class FeeCalculator extends LitElement {
179
174
  this.style.setProperty("--primary-color", this.primaryColor);
180
175
  this.style.setProperty("--background-color", this.backgroundColor);
181
176
  }
182
- this.adjustPositionAdditionalActions();
183
177
  }
184
178
 
185
179
  calculateQuote = async (): Promise<void> => {
@@ -278,33 +272,12 @@ export class FeeCalculator extends LitElement {
278
272
  this.selectedLayoutIds = layoutIds;
279
273
  };
280
274
 
281
- adjustPositionAdditionalActions = (): void => {
282
- const additionalActionsElement = this.shadowRoot?.getElementById(
283
- "calculator-additional-actions"
284
- );
285
- if (!additionalActionsElement) return;
286
-
287
- const calculatorContainer = this.shadowRoot?.querySelector(
288
- ".fee-calculator-container"
289
- );
290
-
291
- const containerCoords = calculatorContainer?.getBoundingClientRect();
292
- if (!containerCoords) return;
293
-
294
- additionalActionsElement.style.left = `${containerCoords.left}px`;
295
- additionalActionsElement.style.top = `${containerCoords.bottom + 10}px`;
296
- additionalActionsElement.style.width = `${containerCoords.width}px`;
297
- };
298
-
299
275
  render(): TemplateResult {
300
276
  const containerClasses = {
301
277
  "fee-calculator-container": true,
302
278
  compact: this.compactDesign,
303
279
  };
304
280
 
305
- const primaryColorWithFallback = this.primaryColor || "#007bff";
306
- const backgroundColorWithFallback = this.backgroundColor || "#ffffff";
307
-
308
281
  return html`
309
282
  <div
310
283
  class=${classMap(containerClasses)}
@@ -319,10 +292,10 @@ export class FeeCalculator extends LitElement {
319
292
  <button class="apply-button">Apply</button>
320
293
  <button
321
294
  aria-label="Close fee calculator"
322
- class="mobile-close-button"
295
+ class="close-button"
323
296
  @click=${this.handleClose}
324
297
  >
325
- ${XOutlineIcon("black")}
298
+ ${XOutlineIcon("gray")}
326
299
  </button>
327
300
  </div>
328
301
  </div>
@@ -330,6 +303,20 @@ export class FeeCalculator extends LitElement {
330
303
  <div class="calculator-header-divider"></div>
331
304
 
332
305
  <div class="calculator-content">
306
+ ${this.incentives.length
307
+ ? html`
308
+ <div class="incentives-container">
309
+ ${this.incentives.map(
310
+ (incentive) => html`
311
+ <incentive-banner
312
+ .incentive=${incentive}
313
+ ></incentive-banner>
314
+ `
315
+ )}
316
+ </div>
317
+ `
318
+ : ""}
319
+
333
320
  <fee-calculator-layout
334
321
  .buildingSlug=${this.buildingSlug}
335
322
  .isLoading=${this.isLoading}
@@ -350,20 +337,6 @@ export class FeeCalculator extends LitElement {
350
337
  <p>Prices subject to change. Additional fees may apply.</p>
351
338
  </div>
352
339
  </div>
353
-
354
- <chat-additional-actions
355
- id="calculator-additional-actions"
356
- .showChatAdditionalActions=${true}
357
- .buildingWebchatView=${this.buildingWebchatView}
358
- .primaryColor=${primaryColorWithFallback}
359
- .backgroundColor=${backgroundColorWithFallback}
360
- .enabledChatWidgets=${this.enabledChatWidgets}
361
- .onClose=${() => this.handleClose()}
362
- .onClickEmailOption=${this.handleClickEmailOption}
363
- .onClickPhoneOption=${this.handleClickPhoneOption}
364
- .onClickSSTOption=${this.handleClickSSTOption}
365
- .onClickTextUsOption=${this.handleClickTextUsOption}
366
- ></chat-additional-actions>
367
340
  `;
368
341
  }
369
342
  }
@@ -109,6 +109,8 @@ export interface AddOnInfo {
109
109
  addOnType: string;
110
110
  maxUnitsCharged: number | null;
111
111
  minUnitsCharged: number | null;
112
+ maxUnitsAllowed: number | null;
113
+ minUnitsAllowed: number | null;
112
114
  addOnTypeEmbedding: number[] | null;
113
115
  }
114
116