@repobit/dex-system-design 0.21.2 → 0.22.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/CHANGELOG.md +11 -0
- package/package.json +4 -2
- package/src/components/Button/Button.js +7 -2
- package/src/components/Button/button.css.js +30 -0
- package/src/components/accordion/accordion-bg.stories.js +341 -171
- package/src/components/accordion/accordion.stories.js +345 -0
- package/src/components/anchor/anchor.stories.js +134 -76
- package/src/components/back/back.css.js +1 -1
- package/src/components/back/back.stories.js +301 -63
- package/src/components/badge/badge.js +4 -7
- package/src/components/badge/badge.stories.js +89 -96
- package/src/components/breadcrumb/breadcrumb.stories.js +167 -3
- package/src/components/cards/card.stories.js +153 -3
- package/src/components/display/display.css.js +7 -10
- package/src/components/display/display.js +14 -2
- package/src/components/display/display.stories.js +213 -219
- package/src/components/divider/divider.stories.js +337 -30
- package/src/components/footer/footer-lp.stories.js +346 -3
- package/src/components/footer/footer.js +0 -3
- package/src/components/footer/footer.stories.js +267 -4
- package/src/components/header/header.css.js +1 -1
- package/src/components/header/header.js +77 -56
- package/src/components/header/header.stories.js +298 -22
- package/src/components/heading/heading.css.js +1 -1
- package/src/components/heading/heading.stories.js +355 -113
- package/src/components/image/image.css.js +146 -98
- package/src/components/image/image.js +13 -2
- package/src/components/image/image.stories.js +546 -160
- package/src/components/input/custom-form.stories.js +209 -12
- package/src/components/link/link.css.js +2 -2
- package/src/components/link/link.stories.js +383 -53
- package/src/components/paragraph/paragraph.css.js +1 -1
- package/src/components/paragraph/paragraph.stories.js +365 -157
- package/src/components/picture/picture.css.js +209 -0
- package/src/components/picture/picture.js +16 -2
- package/src/components/picture/picture.stories.js +525 -180
- package/src/components/pricing-cards/new-pricing-card.js +19 -4
- package/src/components/pricing-cards/new-pricing-card.stories.js +422 -0
- package/src/components/pricing-cards/new-pricing.css.js +8 -0
- package/src/components/pricing-cards/pricing-card-actions.js +49 -9
- package/src/components/pricing-cards/pricing-card-container.css.js +1 -1
- package/src/components/pricing-cards/pricing-card-header.css.js +73 -63
- package/src/components/pricing-cards/pricing-card-header.js +44 -10
- package/src/components/pricing-cards/pricing-card-pricing.js +63 -64
- package/src/components/pricing-cards/pricing-card.css.js +7 -15
- package/src/components/pricing-cards/pricing-card.js +353 -270
- package/src/components/pricing-cards/pricing-card.stories.js +3 -3
- package/src/tokens/fonts.stories.js +335 -8
- package/src/tokens/spacing.stories.js +701 -34
- package/src/tokens/tokens-grid.stories.js +897 -48
- package/src/tokens/typography.stories.js +980 -38
- package/src/components/accordion/accordion-light.stories.js +0 -241
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { LitElement, html } from "lit";
|
|
2
2
|
import { tokens } from "../../tokens/tokens.js";
|
|
3
|
+
import "../badge/badge.js";
|
|
3
4
|
import "../Button/Button.js";
|
|
4
5
|
import "../heading/heading.js";
|
|
5
6
|
import "../paragraph/paragraph.js";
|
|
@@ -9,7 +10,8 @@ class PricingContainer extends LitElement {
|
|
|
9
10
|
static properties = {
|
|
10
11
|
planType: { type: String },
|
|
11
12
|
locale : { type: String },
|
|
12
|
-
currency: { type: String }
|
|
13
|
+
currency: { type: String },
|
|
14
|
+
shadow : { type: Boolean, reflect: true }
|
|
13
15
|
};
|
|
14
16
|
|
|
15
17
|
constructor() {
|
|
@@ -17,6 +19,7 @@ class PricingContainer extends LitElement {
|
|
|
17
19
|
this.planType = "individual";
|
|
18
20
|
this.locale = "en-US";
|
|
19
21
|
this.currency = "EUR";
|
|
22
|
+
this.shadow = true;
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
handleSwitch(event) {
|
|
@@ -24,26 +27,13 @@ class PricingContainer extends LitElement {
|
|
|
24
27
|
this.planType = event.detail.planType;
|
|
25
28
|
}
|
|
26
29
|
|
|
27
|
-
formatCurrency(value) {
|
|
28
|
-
const numericValue =
|
|
29
|
-
typeof value === "number"
|
|
30
|
-
? value
|
|
31
|
-
: parseFloat(value.replace(/[^\d.-]/g, ""));
|
|
32
|
-
|
|
33
|
-
if (isNaN(numericValue)) return "";
|
|
34
|
-
|
|
35
|
-
const formattedValue = new Intl.NumberFormat(this.locale, {
|
|
36
|
-
style : "currency",
|
|
37
|
-
currency : this.currency,
|
|
38
|
-
minimumFractionDigits: 2,
|
|
39
|
-
maximumFractionDigits: 2
|
|
40
|
-
}).format(numericValue);
|
|
41
|
-
|
|
42
|
-
return formattedValue;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
30
|
render() {
|
|
46
31
|
return html`
|
|
32
|
+
<style>
|
|
33
|
+
${tokens}
|
|
34
|
+
${pricingCardsCSS}
|
|
35
|
+
</style>
|
|
36
|
+
|
|
47
37
|
<div class="pricing-container">
|
|
48
38
|
<pricing-switch
|
|
49
39
|
.planType=${this.planType}
|
|
@@ -53,57 +43,105 @@ class PricingContainer extends LitElement {
|
|
|
53
43
|
<div class="pricing-cards">
|
|
54
44
|
${this.planType === "individual"
|
|
55
45
|
? html`
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
46
|
+
<!-- Card 1: VSB - Ultimate Security -->
|
|
47
|
+
<bd-context ignore-events-parent>
|
|
48
|
+
<bd-product product-id="vsb">
|
|
49
|
+
<bd-option devices="5" subscription="1" data-layer-event="info">
|
|
50
|
+
<pricing-card
|
|
51
|
+
title="Bitdefender Ultimate Security"
|
|
52
|
+
planType="individual"
|
|
53
|
+
productId="vsb"
|
|
54
|
+
.shadow=${this.shadow}
|
|
55
|
+
></pricing-card>
|
|
56
|
+
</bd-option>
|
|
57
|
+
</bd-product>
|
|
58
|
+
</bd-context>
|
|
59
|
+
|
|
60
|
+
<!-- Card 2: TSI - Premium Security (highlighted) -->
|
|
61
|
+
<bd-context ignore-events-parent>
|
|
62
|
+
<bd-product product-id="ts_i">
|
|
63
|
+
<bd-option devices="5" subscription="1" data-layer-event="info">
|
|
64
|
+
<pricing-card
|
|
65
|
+
highlight
|
|
66
|
+
features
|
|
67
|
+
identity
|
|
68
|
+
planType="individual"
|
|
69
|
+
productId="ts_i"
|
|
70
|
+
.shadow=${this.shadow}
|
|
71
|
+
></pricing-card>
|
|
72
|
+
</bd-option>
|
|
73
|
+
</bd-product>
|
|
74
|
+
</bd-context>
|
|
75
|
+
|
|
76
|
+
<!-- Card 3: PSI - Total Security -->
|
|
77
|
+
<bd-context ignore-events-parent>
|
|
78
|
+
<bd-product product-id="ps_i">
|
|
79
|
+
<bd-option devices="5" subscription="1" data-layer-event="info">
|
|
80
|
+
<pricing-card
|
|
81
|
+
title="Bitdefender Total Security"
|
|
82
|
+
features
|
|
83
|
+
privacy
|
|
84
|
+
identity
|
|
85
|
+
planType="individual"
|
|
86
|
+
productId="ps_i"
|
|
87
|
+
.shadow=${this.shadow}
|
|
88
|
+
></pricing-card>
|
|
89
|
+
</bd-option>
|
|
90
|
+
</bd-product>
|
|
91
|
+
</bd-context>
|
|
82
92
|
`
|
|
83
|
-
: html
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
93
|
+
: html`
|
|
94
|
+
<!-- Family Card 1: VSB -->
|
|
95
|
+
<bd-context ignore-events-parent>
|
|
96
|
+
<bd-product product-id="vsb">
|
|
97
|
+
<bd-option devices="5" subscription="1" data-layer-event="info">
|
|
98
|
+
<pricing-card-family
|
|
99
|
+
title="Bitdefender Ultimate Security"
|
|
100
|
+
features
|
|
101
|
+
privacy
|
|
102
|
+
identityExtended
|
|
103
|
+
parentalControl
|
|
104
|
+
planType="family"
|
|
105
|
+
productId="vsb"
|
|
106
|
+
.shadow=${this.shadow}
|
|
107
|
+
></pricing-card-family>
|
|
108
|
+
</bd-option>
|
|
109
|
+
</bd-product>
|
|
110
|
+
</bd-context>
|
|
111
|
+
|
|
112
|
+
<!-- Family Card 2: TSI (highlighted) -->
|
|
113
|
+
<bd-context ignore-events-parent>
|
|
114
|
+
<bd-product product-id="ts_i">
|
|
115
|
+
<bd-option devices="5" subscription="1" data-layer-event="info">
|
|
116
|
+
<pricing-card-family
|
|
117
|
+
highlight
|
|
118
|
+
features
|
|
119
|
+
identity
|
|
120
|
+
planType="family"
|
|
121
|
+
productId="ts_i"
|
|
122
|
+
.shadow=${this.shadow}
|
|
123
|
+
></pricing-card-family>
|
|
124
|
+
</bd-option>
|
|
125
|
+
</bd-product>
|
|
126
|
+
</bd-context>
|
|
127
|
+
|
|
128
|
+
<!-- Family Card 3: PSI -->
|
|
129
|
+
<bd-context ignore-events-parent>
|
|
130
|
+
<bd-product product-id="ps_i">
|
|
131
|
+
<bd-option devices="5" subscription="1" data-layer-event="info">
|
|
132
|
+
<pricing-card-family
|
|
133
|
+
title="Bitdefender Total Security"
|
|
134
|
+
features
|
|
135
|
+
privacy
|
|
136
|
+
identity
|
|
137
|
+
planType="family"
|
|
138
|
+
productId="ps_i"
|
|
139
|
+
.shadow=${this.shadow}
|
|
140
|
+
></pricing-card-family>
|
|
141
|
+
</bd-option>
|
|
142
|
+
</bd-product>
|
|
143
|
+
</bd-context>
|
|
144
|
+
`}
|
|
107
145
|
</div>
|
|
108
146
|
</div>
|
|
109
147
|
`;
|
|
@@ -113,9 +151,6 @@ class PricingContainer extends LitElement {
|
|
|
113
151
|
class PricingCard extends LitElement {
|
|
114
152
|
static properties = {
|
|
115
153
|
title : { type: String },
|
|
116
|
-
price : { type: String },
|
|
117
|
-
discount : { type: String },
|
|
118
|
-
originalPrice : { type: String },
|
|
119
154
|
features : { type: Boolean },
|
|
120
155
|
privacy : { type: Boolean },
|
|
121
156
|
highlight : { type: Boolean },
|
|
@@ -123,16 +158,15 @@ class PricingCard extends LitElement {
|
|
|
123
158
|
identityExtended: { type: Boolean },
|
|
124
159
|
parentalControl : { type: Boolean },
|
|
125
160
|
planType : { type: String },
|
|
161
|
+
productId : { type: String, attribute: "product-id" },
|
|
126
162
|
locale : { type: String },
|
|
127
|
-
currency : { type: String }
|
|
163
|
+
currency : { type: String },
|
|
164
|
+
shadow : { type: Boolean, reflect: true }
|
|
128
165
|
};
|
|
129
166
|
|
|
130
167
|
constructor() {
|
|
131
168
|
super();
|
|
132
169
|
this.title = "Bitdefender Premium Security";
|
|
133
|
-
this.price = "69.99";
|
|
134
|
-
this.discount = "Save 46%";
|
|
135
|
-
this.originalPrice = "$129.99";
|
|
136
170
|
this.features = false;
|
|
137
171
|
this.privacy = false;
|
|
138
172
|
this.highlight = false;
|
|
@@ -140,78 +174,98 @@ class PricingCard extends LitElement {
|
|
|
140
174
|
this.identityExtended = false;
|
|
141
175
|
this.parentalControl = false;
|
|
142
176
|
this.planType = "individual";
|
|
177
|
+
this.productId = "vsb";
|
|
143
178
|
this.locale = "en-US";
|
|
144
179
|
this.currency = "EUR";
|
|
180
|
+
this.shadow = true;
|
|
145
181
|
}
|
|
146
182
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
if (isNaN(numberValue)) return value;
|
|
151
|
-
|
|
152
|
-
return new Intl.NumberFormat(this.locale, {
|
|
153
|
-
style : "currency",
|
|
154
|
-
currency: this.currency
|
|
155
|
-
}).format(numberValue);
|
|
183
|
+
createRenderRoot() {
|
|
184
|
+
return this; // Light DOM pentru BrightData
|
|
156
185
|
}
|
|
186
|
+
|
|
157
187
|
render() {
|
|
158
188
|
return html`
|
|
189
|
+
<style>
|
|
190
|
+
${tokens}
|
|
191
|
+
${pricingCardsCSS}
|
|
192
|
+
</style>
|
|
193
|
+
|
|
159
194
|
<div class="card ${this.highlight ? "highlight" : ""}">
|
|
160
195
|
${this.highlight
|
|
161
196
|
? html`<div class="highlight-banner">Best value</div>`
|
|
162
197
|
: ""}
|
|
163
198
|
<div class="card-header">
|
|
164
199
|
<bd-h as="h4" class="card-title">${this.title}</bd-h>
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
src="/assets/badge-icon-individual.png"
|
|
168
|
-
alt="icon"
|
|
169
|
-
class="badge-icon"
|
|
170
|
-
/>
|
|
200
|
+
|
|
201
|
+
<bd-badge>
|
|
171
202
|
Individual
|
|
172
|
-
</
|
|
203
|
+
</bd-badge>
|
|
204
|
+
|
|
173
205
|
<bd-p kind="small" class="badge-subtitle">1 account & 5 devices</bd-p>
|
|
174
206
|
<hr class="hr-line" />
|
|
175
207
|
</div>
|
|
208
|
+
|
|
209
|
+
<!-- Pricing section with store integration -->
|
|
176
210
|
<div class="pricing">
|
|
177
|
-
<div class="pricing-info">
|
|
211
|
+
<div class="pricing-info" data-store-hide="!it.option.price.discounted">
|
|
178
212
|
<bd-p kind="small" class="original-price">
|
|
179
|
-
|
|
213
|
+
<s data-store-render data-store-price="full"></s>
|
|
180
214
|
</bd-p>
|
|
181
|
-
<bd-p kind="small" class="discount"
|
|
215
|
+
<bd-p kind="small" class="discount">
|
|
216
|
+
<bd-badge variant="bd-light-green">
|
|
217
|
+
Save <span data-store-render data-store-discount="percentage"></span>
|
|
218
|
+
</bd-badge> </bd-p>
|
|
182
219
|
</div>
|
|
183
|
-
<bd-h as="h3" class="price"
|
|
220
|
+
<bd-h as="h3" class="price">
|
|
221
|
+
<span data-store-render data-store-price="discounted||full"></span>/year
|
|
222
|
+
</bd-h>
|
|
184
223
|
<bd-p kind="small" class="terms">
|
|
185
224
|
First year price. Plus applicable sales tax. See
|
|
186
225
|
<a href="#">terms of use</a> below.
|
|
187
226
|
</bd-p>
|
|
188
227
|
</div>
|
|
228
|
+
|
|
229
|
+
<!-- Actions with store integration -->
|
|
189
230
|
<div class="actions">
|
|
190
|
-
<bd-button
|
|
231
|
+
<bd-button-link
|
|
232
|
+
label="Buy Now"
|
|
233
|
+
kind="danger"
|
|
234
|
+
size="md"
|
|
235
|
+
fullWidth
|
|
236
|
+
strong
|
|
237
|
+
buyLink
|
|
238
|
+
>
|
|
191
239
|
Buy Now
|
|
192
|
-
</bd-button>
|
|
193
|
-
|
|
194
|
-
<bd-button
|
|
240
|
+
</bd-button-link>
|
|
241
|
+
|
|
242
|
+
<bd-button
|
|
243
|
+
label="Learn More"
|
|
244
|
+
kind="outline"
|
|
245
|
+
size="md"
|
|
246
|
+
fullWidth
|
|
247
|
+
strong
|
|
248
|
+
>
|
|
195
249
|
Learn More
|
|
196
250
|
</bd-button>
|
|
197
251
|
</div>
|
|
252
|
+
|
|
198
253
|
<hr class="hr-line" />
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
${this.
|
|
202
|
-
${this.
|
|
203
|
-
${this.
|
|
254
|
+
|
|
255
|
+
<!-- Features sections -->
|
|
256
|
+
${this.features ? html`<pricing-card-features .shadow=${this.shadow}></pricing-card-features>` : ""}
|
|
257
|
+
${this.privacy ? html`<pricing-card-privacy .shadow=${this.shadow}></pricing-card-privacy>` : ""}
|
|
258
|
+
${this.identity ? html`<pricing-card-identity .shadow=${this.shadow}></pricing-card-identity>` : ""}
|
|
259
|
+
${this.identityExtended ? html`<pricing-card-identity-extended .shadow=${this.shadow}></pricing-card-identity-extended>` : ""}
|
|
260
|
+
${this.parentalControl ? html`<pricing-card-parental-control .shadow=${this.shadow}></pricing-card-parental-control>` : ""}
|
|
204
261
|
</div>
|
|
205
262
|
`;
|
|
206
263
|
}
|
|
207
|
-
|
|
208
264
|
}
|
|
265
|
+
|
|
209
266
|
class PricingCardFamily extends LitElement {
|
|
210
267
|
static properties = {
|
|
211
268
|
title : { type: String },
|
|
212
|
-
price : { type: String },
|
|
213
|
-
discount : { type: String },
|
|
214
|
-
originalPrice : { type: String },
|
|
215
269
|
features : { type: Boolean },
|
|
216
270
|
privacy : { type: Boolean },
|
|
217
271
|
highlight : { type: Boolean },
|
|
@@ -219,16 +273,15 @@ class PricingCardFamily extends LitElement {
|
|
|
219
273
|
identityExtended: { type: Boolean },
|
|
220
274
|
parentalControl : { type: Boolean },
|
|
221
275
|
planType : { type: String },
|
|
276
|
+
productId : { type: String, attribute: "product-id" },
|
|
222
277
|
locale : { type: String },
|
|
223
|
-
currency : { type: String }
|
|
278
|
+
currency : { type: String },
|
|
279
|
+
shadow : { type: Boolean, reflect: true }
|
|
224
280
|
};
|
|
225
281
|
|
|
226
282
|
constructor() {
|
|
227
283
|
super();
|
|
228
284
|
this.title = "Bitdefender Premium Security";
|
|
229
|
-
this.price = "$99.99";
|
|
230
|
-
this.discount = "Save 41%";
|
|
231
|
-
this.originalPrice = "$169.99";
|
|
232
285
|
this.features = false;
|
|
233
286
|
this.privacy = false;
|
|
234
287
|
this.highlight = false;
|
|
@@ -236,102 +289,115 @@ class PricingCardFamily extends LitElement {
|
|
|
236
289
|
this.identityExtended = false;
|
|
237
290
|
this.parentalControl = false;
|
|
238
291
|
this.planType = "family";
|
|
292
|
+
this.productId = "vsb";
|
|
239
293
|
this.locale = "en-US";
|
|
240
294
|
this.currency = "EUR";
|
|
295
|
+
this.shadow = true;
|
|
241
296
|
}
|
|
242
297
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if (isNaN(numberValue)) return value;
|
|
247
|
-
|
|
248
|
-
return new Intl.NumberFormat(this.locale, {
|
|
249
|
-
style : "currency",
|
|
250
|
-
currency: this.currency
|
|
251
|
-
}).format(numberValue);
|
|
298
|
+
createRenderRoot() {
|
|
299
|
+
return this; // Light DOM pentru BrightData
|
|
252
300
|
}
|
|
301
|
+
|
|
253
302
|
render() {
|
|
254
303
|
return html`
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
304
|
+
<style>
|
|
305
|
+
${tokens}
|
|
306
|
+
${pricingCardsCSS}
|
|
307
|
+
</style>
|
|
308
|
+
|
|
309
|
+
<div class="card ${this.highlight ? "highlight" : ""}">
|
|
310
|
+
${this.highlight
|
|
311
|
+
? html`<div class="highlight-banner">Best value</div>`
|
|
312
|
+
: ""}
|
|
313
|
+
<div class="card-header">
|
|
314
|
+
<bd-h as="h4" class="card-title">${this.title}</bd-h>
|
|
315
|
+
|
|
316
|
+
<bd-badge>
|
|
317
|
+
Family
|
|
318
|
+
</bd-badge>
|
|
319
|
+
|
|
320
|
+
<bd-p kind="small" class="badge-subtitle">5 accounts & 25 devices</bd-p>
|
|
321
|
+
<hr class="hr-line" />
|
|
322
|
+
</div>
|
|
323
|
+
|
|
324
|
+
<!-- Pricing section with store integration -->
|
|
325
|
+
<div class="pricing">
|
|
326
|
+
<div class="pricing-info" data-store-hide="!it.option.price.discounted">
|
|
327
|
+
<bd-p kind="small" class="original-price">
|
|
328
|
+
<s data-store-render data-store-price="full"></s>
|
|
329
|
+
</bd-p>
|
|
330
|
+
<bd-p kind="small" class="discount">
|
|
331
|
+
<bd-badge variant="bd-light-green">
|
|
332
|
+
Save <span data-store-render data-store-discount="percentage"></span>
|
|
333
|
+
</bd-badge> </bd-p>
|
|
334
|
+
</div>
|
|
335
|
+
<bd-h as="h3" class="price">
|
|
336
|
+
<span data-store-render data-store-price="discounted||full"></span>/year
|
|
337
|
+
</bd-h>
|
|
338
|
+
<bd-p kind="small" class="terms">
|
|
339
|
+
First year price. Plus applicable sales tax. See
|
|
340
|
+
<a href="#">terms of use</a> below.
|
|
341
|
+
</bd-p>
|
|
342
|
+
</div>
|
|
343
|
+
|
|
344
|
+
<!-- Actions with store integration -->
|
|
345
|
+
<div class="actions">
|
|
346
|
+
<bd-button-link
|
|
347
|
+
label="Buy Now"
|
|
348
|
+
kind="danger"
|
|
349
|
+
size="md"
|
|
350
|
+
fullWidth
|
|
351
|
+
strong
|
|
352
|
+
buyLink
|
|
353
|
+
>
|
|
354
|
+
Buy Now
|
|
355
|
+
</bd-button-link>
|
|
356
|
+
|
|
357
|
+
<bd-button
|
|
358
|
+
label="Learn More"
|
|
359
|
+
kind="outline"
|
|
360
|
+
size="md"
|
|
361
|
+
fullWidth
|
|
362
|
+
strong
|
|
363
|
+
>
|
|
364
|
+
Learn More
|
|
365
|
+
</bd-button>
|
|
366
|
+
</div>
|
|
367
|
+
|
|
368
|
+
<hr class="hr-line" />
|
|
369
|
+
|
|
370
|
+
<!-- Features sections -->
|
|
371
|
+
${this.features
|
|
372
|
+
? html`<pricing-card-features .shadow=${this.shadow}></pricing-card-features>`
|
|
373
|
+
: ""}
|
|
374
|
+
${this.privacy
|
|
375
|
+
? html`<pricing-card-privacy .shadow=${this.shadow}></pricing-card-privacy>`
|
|
376
|
+
: ""}
|
|
377
|
+
${this.identity
|
|
378
|
+
? html`<pricing-card-identity .shadow=${this.shadow}></pricing-card-identity>`
|
|
379
|
+
: ""}
|
|
380
|
+
${this.identityExtended
|
|
381
|
+
? html`<pricing-card-identity-extended .shadow=${this.shadow}></pricing-card-identity-extended>`
|
|
382
|
+
: ""}
|
|
383
|
+
${this.parentalControl
|
|
384
|
+
? html`<pricing-card-parental-control .shadow=${this.shadow}></pricing-card-parental-control>`
|
|
385
|
+
: ""}
|
|
386
|
+
</div>
|
|
323
387
|
`;
|
|
324
388
|
}
|
|
325
389
|
}
|
|
326
390
|
|
|
327
391
|
class PricingSwitch extends LitElement {
|
|
328
392
|
static properties = {
|
|
329
|
-
planType: { type: String }
|
|
393
|
+
planType: { type: String },
|
|
394
|
+
shadow : { type: Boolean, reflect: true }
|
|
330
395
|
};
|
|
331
396
|
|
|
332
397
|
constructor() {
|
|
333
398
|
super();
|
|
334
399
|
this.planType = "individual";
|
|
400
|
+
this.shadow = true;
|
|
335
401
|
}
|
|
336
402
|
|
|
337
403
|
handleSwitch(event) {
|
|
@@ -350,6 +416,11 @@ class PricingSwitch extends LitElement {
|
|
|
350
416
|
|
|
351
417
|
render() {
|
|
352
418
|
return html`
|
|
419
|
+
<style>
|
|
420
|
+
${tokens}
|
|
421
|
+
${pricingCardsCSS}
|
|
422
|
+
</style>
|
|
423
|
+
|
|
353
424
|
<div class="switchBox">
|
|
354
425
|
<label class="switch">
|
|
355
426
|
<input
|
|
@@ -360,14 +431,11 @@ class PricingSwitch extends LitElement {
|
|
|
360
431
|
/>
|
|
361
432
|
<span class="slider round"></span>
|
|
362
433
|
<span class="label right">
|
|
363
|
-
<span class="icon icon-user-sharp-regular">
|
|
364
|
-
</span>
|
|
434
|
+
<span class="icon icon-user-sharp-regular"></span>
|
|
365
435
|
Individual
|
|
366
436
|
</span>
|
|
367
437
|
<span class="label left">
|
|
368
|
-
<span class="icon icon-family-pants-sharp-regular">
|
|
369
|
-
|
|
370
|
-
</span>
|
|
438
|
+
<span class="icon icon-family-pants-sharp-regular"></span>
|
|
371
439
|
Family
|
|
372
440
|
</span>
|
|
373
441
|
</label>
|
|
@@ -378,7 +446,8 @@ class PricingSwitch extends LitElement {
|
|
|
378
446
|
|
|
379
447
|
class PricingCardFeatures extends LitElement {
|
|
380
448
|
static properties = {
|
|
381
|
-
features: { type: Array }
|
|
449
|
+
features: { type: Array },
|
|
450
|
+
shadow : { type: Boolean, reflect: true }
|
|
382
451
|
};
|
|
383
452
|
|
|
384
453
|
constructor() {
|
|
@@ -412,21 +481,27 @@ class PricingCardFeatures extends LitElement {
|
|
|
412
481
|
"Scam Copilot: Get protection against online scams with AI-powered anti-scam features."
|
|
413
482
|
}
|
|
414
483
|
];
|
|
484
|
+
this.shadow = true;
|
|
415
485
|
}
|
|
416
486
|
|
|
417
487
|
render() {
|
|
418
488
|
const features = this.features || [];
|
|
419
489
|
return html`
|
|
490
|
+
<style>
|
|
491
|
+
${tokens}
|
|
492
|
+
${pricingCardsCSS}
|
|
493
|
+
</style>
|
|
494
|
+
|
|
420
495
|
<div class="features">
|
|
421
|
-
<bd-h as="h4">Device Security</bd-h>
|
|
496
|
+
<bd-h as="h4" class="text-left">Device Security</bd-h>
|
|
422
497
|
<ul class="additional-info">
|
|
423
498
|
${features.map(
|
|
424
499
|
(feature) => html` <li class="feature-item">
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
500
|
+
<img
|
|
501
|
+
src="/assets/verified_arrow.png"
|
|
502
|
+
alt="icon"
|
|
503
|
+
class="badge-icon"
|
|
504
|
+
/>
|
|
430
505
|
<bd-p kind="regular">${feature.name}</bd-p>
|
|
431
506
|
${feature.description
|
|
432
507
|
? html`<div class="tooltip"><bd-p kind="small">${feature.description}</bd-p></div>`
|
|
@@ -441,7 +516,8 @@ class PricingCardFeatures extends LitElement {
|
|
|
441
516
|
|
|
442
517
|
class PricingCardPrivacy extends LitElement {
|
|
443
518
|
static properties = {
|
|
444
|
-
privacy: { type: Array }
|
|
519
|
+
privacy: { type: Array },
|
|
520
|
+
shadow : { type: Boolean, reflect: true }
|
|
445
521
|
};
|
|
446
522
|
|
|
447
523
|
constructor() {
|
|
@@ -470,30 +546,33 @@ class PricingCardPrivacy extends LitElement {
|
|
|
470
546
|
"Blocks ads, hinders ad targeting, and prevents online behavior profiling."
|
|
471
547
|
}
|
|
472
548
|
];
|
|
549
|
+
this.shadow = true;
|
|
473
550
|
}
|
|
474
551
|
|
|
475
552
|
render() {
|
|
476
553
|
const privacy = this.privacy || [];
|
|
477
554
|
return html`
|
|
555
|
+
<style>
|
|
556
|
+
${tokens}
|
|
557
|
+
${pricingCardsCSS}
|
|
558
|
+
</style>
|
|
559
|
+
|
|
478
560
|
<div class="features">
|
|
479
561
|
<bd-h as="h4">Privacy</bd-h>
|
|
480
562
|
<ul class="additional-info">
|
|
481
563
|
${privacy.map(
|
|
482
564
|
(priv) => html` <li class="feature-item">
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
565
|
+
<img
|
|
566
|
+
src="/assets/verified_arrow.png"
|
|
567
|
+
alt="icon"
|
|
568
|
+
class="badge-icon"
|
|
569
|
+
/>
|
|
488
570
|
<bd-p kind="regular">${priv.name.replace(" 1x", "")}</bd-p>
|
|
489
571
|
${priv.badge
|
|
490
|
-
? html
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
alt="icon"
|
|
495
|
-
class="badge-feature-icon"
|
|
496
|
-
/></span>`
|
|
572
|
+
? html`
|
|
573
|
+
<bd-badge>
|
|
574
|
+
${priv.badge}
|
|
575
|
+
`
|
|
497
576
|
: ""}
|
|
498
577
|
${priv.description
|
|
499
578
|
? html`<div class="tooltip"><bd-p kind="small">${priv.description}</bd-p></div>`
|
|
@@ -508,7 +587,8 @@ class PricingCardPrivacy extends LitElement {
|
|
|
508
587
|
|
|
509
588
|
class PricingCardIdentify extends LitElement {
|
|
510
589
|
static properties = {
|
|
511
|
-
identity: { type: Array }
|
|
590
|
+
identity: { type: Array },
|
|
591
|
+
shadow : { type: Boolean, reflect: true }
|
|
512
592
|
};
|
|
513
593
|
|
|
514
594
|
constructor() {
|
|
@@ -521,30 +601,34 @@ class PricingCardIdentify extends LitElement {
|
|
|
521
601
|
badge: "1x"
|
|
522
602
|
}
|
|
523
603
|
];
|
|
604
|
+
this.shadow = true;
|
|
524
605
|
}
|
|
525
606
|
|
|
526
607
|
render() {
|
|
527
608
|
const identity = this.identity || [];
|
|
528
609
|
return html`
|
|
610
|
+
<style>
|
|
611
|
+
${tokens}
|
|
612
|
+
${pricingCardsCSS}
|
|
613
|
+
</style>
|
|
614
|
+
|
|
529
615
|
<div class="features">
|
|
530
|
-
<bd-h as="h4">Identity Protection</bd-h>
|
|
616
|
+
<bd-h as="h4" class="text-left">Identity Protection</bd-h>
|
|
531
617
|
<ul class="additional-info">
|
|
532
618
|
${identity.map(
|
|
533
619
|
(ident) => html` <li class="feature-item">
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
620
|
+
<img
|
|
621
|
+
src="/assets/verified_arrow.png"
|
|
622
|
+
alt="icon"
|
|
623
|
+
class="badge-icon"
|
|
624
|
+
/>
|
|
539
625
|
<bd-p kind="regular">${ident.name}</bd-p>
|
|
540
626
|
${ident.badge
|
|
541
|
-
? html
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
class="badge-feature-icon"
|
|
547
|
-
/></span>`
|
|
627
|
+
? html`
|
|
628
|
+
<bd-badge>
|
|
629
|
+
${ident.badge}
|
|
630
|
+
</bd-badge>
|
|
631
|
+
`
|
|
548
632
|
: ""}
|
|
549
633
|
${ident.description
|
|
550
634
|
? html`<div class="tooltip"><bd-p kind="small">${ident.description}</bd-p></div>`
|
|
@@ -559,7 +643,8 @@ class PricingCardIdentify extends LitElement {
|
|
|
559
643
|
|
|
560
644
|
class PricingCardIdentityExtend extends LitElement {
|
|
561
645
|
static properties = {
|
|
562
|
-
identity: { type: Array }
|
|
646
|
+
identity: { type: Array },
|
|
647
|
+
shadow : { type: Boolean, reflect: true }
|
|
563
648
|
};
|
|
564
649
|
|
|
565
650
|
constructor() {
|
|
@@ -592,30 +677,34 @@ class PricingCardIdentityExtend extends LitElement {
|
|
|
592
677
|
"Stay one step ahead with our real-time breach notification feature. Instant alerts empower you to take immediate action, protecting your sensitive information and maintaining peace of mind effortlessly."
|
|
593
678
|
}
|
|
594
679
|
];
|
|
680
|
+
this.shadow = true;
|
|
595
681
|
}
|
|
596
682
|
|
|
597
683
|
render() {
|
|
598
684
|
const identity = this.identity || [];
|
|
599
685
|
return html`
|
|
686
|
+
<style>
|
|
687
|
+
${tokens}
|
|
688
|
+
${pricingCardsCSS}
|
|
689
|
+
</style>
|
|
690
|
+
|
|
600
691
|
<div class="features">
|
|
601
|
-
<bd-h as="h4">Identity Protection</bd-h>
|
|
692
|
+
<bd-h as="h4" class="text-left">Identity Protection</bd-h>
|
|
602
693
|
<ul class="additional-info">
|
|
603
694
|
${identity.map(
|
|
604
695
|
(ident) => html` <li class="feature-item">
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
696
|
+
<img
|
|
697
|
+
src="/assets/verified_arrow.png"
|
|
698
|
+
alt="icon"
|
|
699
|
+
class="badge-icon"
|
|
700
|
+
/>
|
|
610
701
|
<bd-p kind="regular">${ident.name}</bd-p>
|
|
611
702
|
${ident.badge
|
|
612
|
-
? html
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
class="badge-feature-icon"
|
|
618
|
-
/></span>`
|
|
703
|
+
? html`
|
|
704
|
+
<bd-badge>
|
|
705
|
+
${ident.badge}
|
|
706
|
+
</bd-badge>
|
|
707
|
+
`
|
|
619
708
|
: ""}
|
|
620
709
|
${ident.description
|
|
621
710
|
? html`<div class="tooltip"><bd-p kind="small">${ident.description}</bd-p></div>`
|
|
@@ -630,7 +719,8 @@ class PricingCardIdentityExtend extends LitElement {
|
|
|
630
719
|
|
|
631
720
|
class PricingCardParentalControl extends LitElement {
|
|
632
721
|
static properties = {
|
|
633
|
-
parentalControl: { type: Array }
|
|
722
|
+
parentalControl: { type: Array },
|
|
723
|
+
shadow : { type: Boolean, reflect: true }
|
|
634
724
|
};
|
|
635
725
|
|
|
636
726
|
constructor() {
|
|
@@ -666,30 +756,34 @@ class PricingCardParentalControl extends LitElement {
|
|
|
666
756
|
"Unified reporting and easier management across all devices, providing you with a better overview of your child's online activities."
|
|
667
757
|
}
|
|
668
758
|
];
|
|
759
|
+
this.shadow = true;
|
|
669
760
|
}
|
|
670
761
|
|
|
671
762
|
render() {
|
|
672
763
|
const parentalControl = this.parentalControl || [];
|
|
673
764
|
return html`
|
|
765
|
+
<style>
|
|
766
|
+
${tokens}
|
|
767
|
+
${pricingCardsCSS}
|
|
768
|
+
</style>
|
|
769
|
+
|
|
674
770
|
<div class="features">
|
|
675
|
-
<bd-h as="h4">Parental Control</bd-h>
|
|
771
|
+
<bd-h as="h4" class="text-left">Parental Control</bd-h>
|
|
676
772
|
<ul class="additional-info">
|
|
677
773
|
${parentalControl.map(
|
|
678
774
|
(parental) => html` <li class="feature-item">
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
775
|
+
<img
|
|
776
|
+
src="/assets/verified_arrow.png"
|
|
777
|
+
alt="icon"
|
|
778
|
+
class="badge-icon"
|
|
779
|
+
/>
|
|
684
780
|
<bd-p kind="regular">${parental.name}</bd-p>
|
|
685
781
|
${parental.badge
|
|
686
|
-
? html
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
class="badge-feature-icon"
|
|
692
|
-
/></span>`
|
|
782
|
+
? html`
|
|
783
|
+
<bd-badge>
|
|
784
|
+
${parental.badge}
|
|
785
|
+
</bd-badge>
|
|
786
|
+
`
|
|
693
787
|
: ""}
|
|
694
788
|
${parental.description
|
|
695
789
|
? html`<div class="tooltip"><bd-p kind="small">${parental.description}</bd-p></div>`
|
|
@@ -702,17 +796,7 @@ class PricingCardParentalControl extends LitElement {
|
|
|
702
796
|
}
|
|
703
797
|
}
|
|
704
798
|
|
|
705
|
-
|
|
706
|
-
PricingCardIdentityExtend.styles = [tokens, pricingCardsCSS];
|
|
707
|
-
PricingCardParentalControl.styles = [tokens, pricingCardsCSS];
|
|
708
|
-
|
|
709
|
-
PricingCardPrivacy.styles = [tokens, pricingCardsCSS];
|
|
710
|
-
PricingCardFeatures.styles = [tokens, pricingCardsCSS];
|
|
711
|
-
PricingCard.styles = [tokens, pricingCardsCSS];
|
|
712
|
-
PricingCardFamily.styles = [tokens, pricingCardsCSS];
|
|
713
|
-
PricingContainer.styles = [tokens, pricingCardsCSS];
|
|
714
|
-
PricingSwitch.styles = [tokens, pricingCardsCSS];
|
|
715
|
-
|
|
799
|
+
// Define custom elements
|
|
716
800
|
customElements.define("pricing-card-identity", PricingCardIdentify);
|
|
717
801
|
customElements.define(
|
|
718
802
|
"pricing-card-identity-extended",
|
|
@@ -722,7 +806,6 @@ customElements.define(
|
|
|
722
806
|
"pricing-card-parental-control",
|
|
723
807
|
PricingCardParentalControl
|
|
724
808
|
);
|
|
725
|
-
|
|
726
809
|
customElements.define("pricing-card-privacy", PricingCardPrivacy);
|
|
727
810
|
customElements.define("pricing-card-features", PricingCardFeatures);
|
|
728
811
|
customElements.define("pricing-card", PricingCard);
|