@salesforcedevs/dw-components 1.3.147 → 1.3.148-canary.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.
package/lwc.config.json CHANGED
@@ -14,6 +14,8 @@
14
14
  "dw/docsGrid",
15
15
  "dw/eventsList",
16
16
  "dw/instrumentation",
17
+ "dw/j2sCardSequence",
18
+ "dw/j2sForm",
17
19
  "dw/newsletterForm",
18
20
  "dw/podcastSubscription",
19
21
  "dw/podcastsGrid",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforcedevs/dw-components",
3
- "version": "1.3.147",
3
+ "version": "1.3.148-canary.0",
4
4
  "description": "Lightning web components for https://developer.salesforce.com",
5
5
  "license": "MIT",
6
6
  "engines": {
@@ -23,6 +23,5 @@
23
23
  "@types/lodash.uniqby": "^4.7.7",
24
24
  "@types/setimmediate": "^1.0.2",
25
25
  "setimmediate": "^1.0.5"
26
- },
27
- "gitHead": "c046874452685c28208a52392b494ad791c3f305"
26
+ }
28
27
  }
@@ -0,0 +1,53 @@
1
+ @import "dxHelpers/reset";
2
+ @import "dxHelpers/text";
3
+ @import "dxHelpers/card";
4
+
5
+ :host {
6
+ --dx-c-button-custom-color: var(--dx-g-blue-vibrant-50);
7
+ --dx-c-button-custom-background: white;
8
+ --dx-c-button-custom-border: var(--dx-g-blue-vibrant-50);
9
+ --dx-c-button-custom-color-hover: var(--dx-g-blue-vibrant-50);
10
+ --dx-c-button-custom-background-hover: var(--dx-g-cloud-blue-vibrant-90);
11
+ --dx-c-button-custom-border-hover: var(--dx-g-cloud-blue-vibrant-50);
12
+ }
13
+
14
+ dx-step-sequence {
15
+ scroll-margin-top: var(--dx-g-global-header-height);
16
+ }
17
+
18
+ dx-step-sequence-step:last-child dx-card-step::part(footer-container) {
19
+ background-color: var(--dx-g-indigo-vibrant-95);
20
+ border-radius: 8px;
21
+ margin: 0 30px 30px 30px;
22
+ }
23
+
24
+ [slot="secondary-action-section"] {
25
+ color: var(--dx-g-red-vibrant-50);
26
+ position: relative;
27
+ font-size: var(--dx-g-text-xs, 12px);
28
+ font-family: var(--dx-g-font-sans);
29
+ line-height: 18px;
30
+ text-align: left;
31
+ }
32
+
33
+ .body-container li {
34
+ line-height: var(--dx-g-text-2xl);
35
+ }
36
+
37
+ .body-container p:not(:last-child) {
38
+ padding-bottom: 20px;
39
+ }
40
+
41
+ .body-markup {
42
+ display: block;
43
+ padding-bottom: var(--dx-g-spacing-md);
44
+ }
45
+
46
+ .referral-email-field {
47
+ --dx-c-input-width: 100%;
48
+ }
49
+
50
+ .spinner-container {
51
+ min-height: 200px;
52
+ position: relative;
53
+ }
@@ -0,0 +1,69 @@
1
+ <template>
2
+ <dx-step-sequence
3
+ animate-transitions={animateTransitions}
4
+ communicate-step-changes="true"
5
+ initial-step-index={initialStepIndex}
6
+ onstepsequencechange={handleStepSequenceChange}
7
+ session-storage-id={sessionStorageId}
8
+ use-history={useHistory}
9
+ >
10
+ <template for:each={stepsData} for:item="stepDatum" for:index="index">
11
+ <dx-step-sequence-step key={stepDatum.id}>
12
+ <dx-card-step
13
+ header-icon-symbol={stepDatum.headerData.iconSymbol}
14
+ header-icon-sprite={stepDatum.headerData.iconSprite}
15
+ header-icon-color={stepDatum.headerData.iconColor}
16
+ header-background-color={stepDatum.headerData.backgroundColor}
17
+ header-text-color={stepDatum.headerData.textColor}
18
+ show-step-number={stepDatum.showStepNumber}
19
+ step-count={stepsData.length}
20
+ step-index={index}
21
+ step-title={stepDatum.stepTitle}
22
+ >
23
+ <div slot="card-body" class="body-container">
24
+ <template if:true={isLoading}>
25
+ <div class="spinner-container">
26
+ <dx-spinner
27
+ size="large"
28
+ variant="brand"
29
+ ></dx-spinner>
30
+ </div>
31
+ </template>
32
+ <template if:false={isLoading}>
33
+ <span lwc:dom="manual" class="body-markup"></span>
34
+ <template if:true={stepDatum.formData}>
35
+ <dw-j2s-form
36
+ id={stepDatum.formData.formId}
37
+ countries={countries}
38
+ form-metadata={stepDatum.formMetadata}
39
+ incoming-user-info={formIncomingUserInfo}
40
+ onformvaliditychange={handleFormValidityChange}
41
+ ></dw-j2s-form>
42
+ </template>
43
+ </template>
44
+ </div>
45
+ <div slot="secondary-action-section">
46
+ <span
47
+ lwc:dom="manual"
48
+ class="secondary-action-markup"
49
+ ></span>
50
+ </div>
51
+ <div slot="primary-action-section">
52
+ <dx-button
53
+ class="primary-action"
54
+ disabled={isJ2sFormInvalid}
55
+ icon-sprite={stepDatum.primaryAction.iconSprite}
56
+ icon-symbol={stepDatum.primaryAction.iconSymbol}
57
+ loading={isLoading}
58
+ onclick={primaryActionHandler}
59
+ size="large"
60
+ variant={primaryActionVariant}
61
+ >
62
+ {stepDatum.primaryAction.text}
63
+ </dx-button>
64
+ </div>
65
+ </dx-card-step>
66
+ </dx-step-sequence-step>
67
+ </template>
68
+ </dx-step-sequence>
69
+ </template>
@@ -0,0 +1,285 @@
1
+ import { api, LightningElement } from "lwc";
2
+ import StepSequence from "dx/stepSequence";
3
+ import { getListWithUuids } from "dxUtils/list";
4
+ import { toJson } from "dxUtils/normalizers";
5
+ import Button from "dx/button";
6
+
7
+ export type StepDatum = {
8
+ bodyHtml?: string;
9
+ formData?: {
10
+ countriesWithReferralInput?: string[];
11
+ countriesWithRequiredJobRole?: string[];
12
+ formId?: string;
13
+ j2sTerms?: string;
14
+ notAvailableAlertInfo?: {
15
+ title: string;
16
+ body: string;
17
+ };
18
+ participatingCountryCodes?: string[];
19
+ };
20
+ headerData?: {
21
+ backgroundColor?: string;
22
+ iconColor?: string;
23
+ iconSprite?: string;
24
+ iconSymbol?: string;
25
+ textColor?: string;
26
+ };
27
+ primaryAction: {
28
+ text: string;
29
+ variant?: string;
30
+ iconSprite?: string;
31
+ iconSymbol?: string;
32
+ };
33
+ secondaryActionHtml?: string;
34
+ showStepNumber?: boolean;
35
+ stepTitle: string;
36
+ };
37
+
38
+ export default class J2sCardSequence extends LightningElement {
39
+ _isDrmLoading = false;
40
+ _isJ2sFormInvalid = false;
41
+ _isTbidLoading = false;
42
+ _stepsData: StepDatum[] = [];
43
+ @api animateTransitions = false;
44
+ @api drmDomain: string = "https://drm.my.salesforce-sites.com";
45
+ @api tbidApiBaseUrl: string | undefined;
46
+ @api useHistory: boolean = false;
47
+
48
+ @api
49
+ get stepsData() {
50
+ return this._stepsData;
51
+ }
52
+ set stepsData(value) {
53
+ this._stepsData = getListWithUuids<StepDatum>(toJson(value)).map(
54
+ (stepDatum) => {
55
+ // small bit of normalization for cleaner HTML templates with non-required props, etc.
56
+ const normalizedStepDatum = {
57
+ ...stepDatum,
58
+ headerData: stepDatum.headerData || {},
59
+ primaryAction: {
60
+ ...stepDatum.primaryAction,
61
+ variant: stepDatum.primaryAction.variant || "primary",
62
+ iconSprite:
63
+ stepDatum.primaryAction.iconSprite || "general",
64
+ iconSymbol:
65
+ stepDatum.primaryAction.iconSymbol || "arrow-right"
66
+ }
67
+ };
68
+
69
+ if (normalizedStepDatum.formData) {
70
+ (normalizedStepDatum as any).formMetadata = JSON.stringify(
71
+ normalizedStepDatum.formData
72
+ );
73
+ }
74
+
75
+ return normalizedStepDatum;
76
+ }
77
+ );
78
+ }
79
+
80
+ private countries = "[]";
81
+ private currentSequenceStep = 0;
82
+ private sessionStorageId = "j2s-card-sequence";
83
+ private tbidUserInfo: any; // TODO typings?
84
+
85
+ private get isLoading() {
86
+ return this._isDrmLoading || this._isTbidLoading;
87
+ }
88
+
89
+ private get isLoggedIn() {
90
+ return Boolean(this.tbidUserInfo);
91
+ }
92
+
93
+ private get isJ2sFormInvalid() {
94
+ return this.currentSequenceStep === 1 ? this._isJ2sFormInvalid : false;
95
+ }
96
+ private set isJ2sFormInvalid(isFormInvalid: boolean) {
97
+ this._isJ2sFormInvalid = isFormInvalid;
98
+ }
99
+
100
+ private get primaryActionVariant() {
101
+ if (this.currentSequenceStep === 1 && this.isJ2sFormInvalid) {
102
+ return "custom"; // override for disabled button styling
103
+ }
104
+ return this.stepsData[this.currentSequenceStep || 0].primaryAction
105
+ .variant;
106
+ }
107
+
108
+ private get formIncomingUserInfo() {
109
+ if (!this.tbidUserInfo) {
110
+ return "{}";
111
+ }
112
+
113
+ return JSON.stringify({
114
+ firstName: this.tbidUserInfo.given_name,
115
+ lastName: this.tbidUserInfo.family_name,
116
+ email: this.tbidUserInfo.email,
117
+ jobRole: this.tbidUserInfo.custom_attributes?.Role,
118
+ companyName: this.tbidUserInfo.custom_attributes?.CompanyName,
119
+ country: this.tbidUserInfo.custom_attributes?.Country
120
+ });
121
+ }
122
+
123
+ private get initialStepIndex() {
124
+ let initialStepIndex = 0;
125
+
126
+ const storedSessionData = sessionStorage.getItem(this.sessionStorageId);
127
+ if (storedSessionData) {
128
+ try {
129
+ const { currentStepIndex } = JSON.parse(storedSessionData);
130
+ initialStepIndex = currentStepIndex;
131
+ } catch (ex) {
132
+ // noop
133
+ }
134
+ }
135
+
136
+ return initialStepIndex;
137
+ }
138
+ private set initialStepIndex(value: number) {
139
+ sessionStorage.setItem(
140
+ this.sessionStorageId,
141
+ JSON.stringify({
142
+ currentStepIndex: value
143
+ })
144
+ );
145
+ }
146
+
147
+ connectedCallback() {
148
+ this.getCountryList();
149
+ this.getTbidUserInfo();
150
+ // This has to be defined here since it depends on a variable that depends on sessionStorage.
151
+ this.currentSequenceStep = this.initialStepIndex;
152
+ this.resetCustomButtonColors();
153
+ }
154
+
155
+ renderedCallback() {
156
+ if (this.isLoading) {
157
+ return;
158
+ }
159
+
160
+ const { bodyHtml, secondaryActionHtml } =
161
+ this.stepsData[this.currentSequenceStep];
162
+ const bodyMarkupContainer =
163
+ this.template.querySelectorAll("span.body-markup")[
164
+ this.currentSequenceStep
165
+ ];
166
+ const secondaryActionMarkupContainer = this.template.querySelectorAll(
167
+ "span.secondary-action-markup"
168
+ )[this.currentSequenceStep];
169
+ if (bodyMarkupContainer) {
170
+ bodyMarkupContainer.innerHTML = bodyHtml || "";
171
+ }
172
+ if (secondaryActionMarkupContainer) {
173
+ secondaryActionMarkupContainer.innerHTML =
174
+ secondaryActionHtml || "";
175
+ }
176
+ }
177
+
178
+ handleGetStarted(evt: Event) {
179
+ // If the user is not yet logged in, we need to prevent moving immediately to the next
180
+ // step, but set storage up so that they are on the second step when they return to the
181
+ // site in a logged-in state; then, we need to get them to log in.
182
+ if (!this.isLoggedIn) {
183
+ evt.preventDefault();
184
+ this.initialStepIndex = 1;
185
+ // @ts-ignore: call out to the tbid-controller on DSC
186
+ window.__startTbidLogin();
187
+ }
188
+ }
189
+
190
+ handleFormValidityChange({ detail }: CustomEvent) {
191
+ this.isJ2sFormInvalid = !detail.isValid;
192
+ }
193
+
194
+ handleStepSequenceChange({ detail }: CustomEvent) {
195
+ this.currentSequenceStep = detail.stepIndex;
196
+ this.resetCustomButtonColors();
197
+ }
198
+
199
+ primaryActionHandler(evt: Event) {
200
+ if ((evt.target as Button)?.disabled) {
201
+ evt.preventDefault();
202
+ return;
203
+ }
204
+
205
+ if (!this.currentSequenceStep) {
206
+ this.handleGetStarted(evt);
207
+ } else if (this.currentSequenceStep === 2) {
208
+ // TODO: send data to DRM
209
+ } else if (this.currentSequenceStep === 3) {
210
+ // TODO: Join Slack
211
+ }
212
+ }
213
+
214
+ private resetCustomButtonColors() {
215
+ let bgColor;
216
+ let textColor;
217
+
218
+ if (this.currentSequenceStep === 1) {
219
+ bgColor = "var(--dx-g-gray-80)";
220
+ textColor = "white";
221
+ } else {
222
+ bgColor = "white";
223
+ textColor = "var(--dx-g-blue-vibrant-50)";
224
+ }
225
+
226
+ this.template.host.style.setProperty(
227
+ "--dx-c-button-custom-color",
228
+ textColor
229
+ );
230
+ this.template.host.style.setProperty(
231
+ "--dx-c-button-custom-background",
232
+ bgColor
233
+ );
234
+ this.template.host.style.setProperty(
235
+ "--dx-c-button-custom-border",
236
+ bgColor
237
+ );
238
+ }
239
+
240
+ private async getCountryList() {
241
+ this._isDrmLoading = true;
242
+
243
+ const errorMsg = "Error while getting county list";
244
+ try {
245
+ const res = await fetch(
246
+ `${this.drmDomain}/utilities/services/apexrest/countries`
247
+ );
248
+ if (!res.ok) {
249
+ throw new Error(errorMsg);
250
+ }
251
+ const data = await res.json();
252
+ this.countries = JSON.stringify(data);
253
+ } catch (error) {
254
+ console.error(error);
255
+ }
256
+
257
+ this._isDrmLoading = false;
258
+ }
259
+
260
+ private async getTbidUserInfo() {
261
+ this._isTbidLoading = true;
262
+
263
+ try {
264
+ const res = await fetch(`${this.tbidApiBaseUrl}/userinfo`);
265
+ if (res.ok) {
266
+ this.tbidUserInfo = await res.json();
267
+ }
268
+ } catch (ex) {
269
+ // noop; nothing to do here
270
+ }
271
+
272
+ if (!this.tbidUserInfo && this.initialStepIndex > 0) {
273
+ // login failed and the user was previously beyond the start step; need to send them
274
+ // back to the start:
275
+ this.initialStepIndex = 0;
276
+ (
277
+ this.template.querySelector(
278
+ "dx-step-sequence"
279
+ ) as unknown as StepSequence
280
+ )?.jumpToStep(0);
281
+ }
282
+
283
+ this._isTbidLoading = false;
284
+ }
285
+ }
@@ -0,0 +1,46 @@
1
+ export const stepsData = [
2
+ {
3
+ showStepNumber: "true",
4
+ stepTitle: "Get started now.",
5
+ bodyHtml:
6
+ '<p class="dx-text-display-7">Register for Journey to Salesforce and you\'ll be on your way to becoming a Salesforce Developer.</p><ul class="dx-text-display-8"><li>Step 1: Log in or sign up for a free Trailblazer.me account</li><li>Step 2: Confirm your program registration</li><li>Step 3: Begin your journey!</li></ul>',
7
+ primaryActionText: "Get Started"
8
+ },
9
+ {
10
+ showStepNumber: "true",
11
+ stepTitle: "Complete your registration.",
12
+ formData: {
13
+ countriesWithReferralInput: ["IN"],
14
+ countriewWithRequiredJobRole: ["CA"],
15
+ notAvailableAlertInfo: {
16
+ title: "Not Available",
17
+ body: 'The Journey to Salesforce program is not currently available in your country. See the <a href="https://www.google.com/">program FAQs</a> for a list of participating countries.'
18
+ },
19
+ participatingCountryCodes: ["US", "CA", "IN"]
20
+ },
21
+ bodyHtml:
22
+ '<p class="dx-text-display-7">You\'re almost done! Please review your information and agree to the Journey to Salesforce program terms and conditions.</p>',
23
+ secondaryActionHtml:
24
+ '<span class="required-notice">* Required to participate in Journey to Salesforce</span>',
25
+ primaryActionText: "Complete Registration"
26
+ },
27
+ {
28
+ showStepNumber: "true",
29
+ stepTitle: "Your Registration is Confirmed",
30
+ headerData: {
31
+ iconSymbol: "check-circle",
32
+ iconSprite: "general",
33
+ iconColor: "green-vibrant-65",
34
+ backgroundColor: "green-vibrant-95",
35
+ textColor: "indigo-vibrant-20"
36
+ },
37
+ bodyHtml:
38
+ '<div class="dx-text-display-8"><p>Welcome to Journey to Salesforce! Congratulations on taking this step in your journey towards becoming a Salesforce Developer. Through this program you\'ll gain the knowledge, experience, and skills to help you excel in the Salesforce ecosystem.</p><p>To get started, click the button below to join the Journey to Salesforce community, and make sure to check your email for links to bookmark!</p>',
39
+ secondaryActionHtml:
40
+ '<span class="dx-text-display-7">Ready to jump in?</span>',
41
+ primaryActionText: "Join Slack",
42
+ primaryActionVariant: "custom",
43
+ primaryActionIconSprite: "utility",
44
+ primaryActionIconSymbol: "new_window"
45
+ }
46
+ ];
@@ -0,0 +1,46 @@
1
+ .hidden {
2
+ display: none;
3
+ }
4
+
5
+ .form-row {
6
+ display: flex;
7
+ justify-content: space-between;
8
+ padding-bottom: var(--dx-g-spacing-md);
9
+ }
10
+
11
+ .form-row > * {
12
+ --dx-c-input-width: 100%;
13
+
14
+ font-family: var(--dx-g-font-sans);
15
+ width: calc(50% - 20px);
16
+ }
17
+
18
+ .form-row > :only-child {
19
+ max-width: 100%;
20
+ width: 100%;
21
+ }
22
+
23
+ .form-row .terms {
24
+ --dx-c-checkbox-text-line-height: 20px;
25
+ --dx-c-checkbox-font-size: 14px;
26
+
27
+ font-family: var(--dx-g-font-sans);
28
+ font-size: var(--dx-c-checkbox-font-size);
29
+ font-weight: var(--dx-g-font-normal);
30
+ }
31
+
32
+ .form-row .legal-terms-learn-more:not(.hidden) {
33
+ display: block;
34
+ padding-top: var(--dx-g-spacing-md);
35
+ }
36
+
37
+ .form-row .legal-terms.no-checkbox {
38
+ font-family: var(--dx-g-font-sans);
39
+ font-size: var(--dx-g-text-xs);
40
+ font-weight: var(--dx-g-font-normal);
41
+ margin-left: 28px;
42
+ }
43
+
44
+ .form-terms-container {
45
+ padding-top: var(--dx-g-spacing-sm);
46
+ }
@@ -0,0 +1,158 @@
1
+ <template>
2
+ <form class="j2s-form">
3
+ <div class="form-row">
4
+ <dx-input
5
+ class="first-name-field"
6
+ label="First Name"
7
+ missing-error-message="Enter your first name"
8
+ name="first_name"
9
+ placeholder="Your first name"
10
+ required
11
+ validity-on-blur
12
+ onblur={handleRequiredFieldUpdate}
13
+ value={state.firstName}
14
+ ></dx-input>
15
+ <dx-input
16
+ class="last-name-field"
17
+ label="Last Name"
18
+ missing-error-message="Enter your last name"
19
+ name="last_name"
20
+ placeholder="Your last name"
21
+ required
22
+ validity-on-blur
23
+ onblur={handleRequiredFieldUpdate}
24
+ value={state.lastName}
25
+ ></dx-input>
26
+ </div>
27
+ <div class="form-row">
28
+ <dx-input
29
+ class="company-name-field"
30
+ label="Company Name"
31
+ missing-error-message="Enter your company name"
32
+ name="company_name"
33
+ placeholder="Your company name"
34
+ required
35
+ validity-on-blur
36
+ onblur={handleRequiredFieldUpdate}
37
+ value={state.companyName}
38
+ ></dx-input>
39
+ <dx-select
40
+ if:false={isJobRoleRequired}
41
+ class="job-role-field"
42
+ label="Job Role"
43
+ message-when-value-missing="Select your job role"
44
+ name="job_role"
45
+ options={jobRoles}
46
+ placeholder="Select Job Role"
47
+ value={state.jobRole}
48
+ ></dx-select>
49
+ <dx-select
50
+ if:true={isJobRoleRequired}
51
+ class="job-role-field"
52
+ label="Job Role"
53
+ message-when-value-missing="Select your job role"
54
+ name="job_role"
55
+ options={jobRoles}
56
+ placeholder="Select Job Role"
57
+ required
58
+ value={state.jobRole}
59
+ onchange={handleRequiredFieldUpdate}
60
+ ></dx-select>
61
+ </div>
62
+ <div class="form-row">
63
+ <dx-input
64
+ name="email"
65
+ type="email"
66
+ placeholder="Your email address"
67
+ label="Email"
68
+ missing-error-message="Enter your email address"
69
+ validity-on-blur="true"
70
+ required
71
+ onblur={handleRequiredFieldUpdate}
72
+ value={state.email}
73
+ ></dx-input>
74
+ <dx-select
75
+ label="Country/Region"
76
+ message-when-value-missing="Select your country/region"
77
+ name="country"
78
+ options={countries}
79
+ placeholder="Select Country/Region"
80
+ required
81
+ value={state.country}
82
+ onchange={handleCountryChange}
83
+ ></dx-select>
84
+ </div>
85
+ <div class="form-row" if:true={isCountryWithReferralInput}>
86
+ <dx-input
87
+ name="referral_email"
88
+ class="referral-email-field full-width"
89
+ label="If anyone has referred you, please share their Email ID below, with their consent."
90
+ type="email"
91
+ ></dx-input>
92
+ </div>
93
+ <div class="form-row" if:true={isNotParticipatingCountry}>
94
+ <dx-alert
95
+ alert-info={notAvailableAlertInfo}
96
+ class="full-width"
97
+ type="danger"
98
+ variant="accented"
99
+ ></dx-alert>
100
+ </div>
101
+ <div class="form-terms-container">
102
+ <div class="form-row" if:true={state.showMarketingText}>
103
+ <dx-checkbox
104
+ value="marketing-terms"
105
+ name="marketing_terms"
106
+ required
107
+ class="terms"
108
+ onchange={handleRequiredFieldUpdate}
109
+ disabled={isNotParticipatingCountry}
110
+ >
111
+ <span lwc:dom="manual" class="marketing-terms"></span>
112
+ </dx-checkbox>
113
+ </div>
114
+ <div class="form-row">
115
+ <dx-checkbox
116
+ value="j2s-terms"
117
+ name="j2s_terms"
118
+ required
119
+ class="terms"
120
+ onchange={handleRequiredFieldUpdate}
121
+ disabled={isNotParticipatingCountry}
122
+ >
123
+ <span lwc:dom="manual" class="j2s-terms"></span>
124
+ </dx-checkbox>
125
+ </div>
126
+ <div class="form-row">
127
+ <dx-checkbox
128
+ if:true={state.showLegalCheckbox}
129
+ value="legal-terms"
130
+ name="legal_terms"
131
+ required
132
+ class="terms"
133
+ onchange={handleRequiredFieldUpdate}
134
+ disabled={isNotParticipatingCountry}
135
+ >
136
+ <span lwc:dom="manual" class="legal-terms"></span>
137
+ <template if:true={state.learnMore}>
138
+ <dx-button
139
+ variant="inline-inherit"
140
+ onclick={handleLearnMore}
141
+ >
142
+ Learn More
143
+ </dx-button>
144
+ <span
145
+ lwc:dom="manual"
146
+ class="legal-terms-learn-more hidden"
147
+ ></span>
148
+ </template>
149
+ </dx-checkbox>
150
+ <span
151
+ if:false={state.showLegalCheckbox}
152
+ lwc:dom="manual"
153
+ class="legal-terms no-checkbox"
154
+ ></span>
155
+ </div>
156
+ </div>
157
+ </form>
158
+ </template>