@repobit/dex-system-design 0.21.2 → 0.22.1

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 (52) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/package.json +4 -2
  3. package/src/components/Button/Button.js +7 -2
  4. package/src/components/Button/button.css.js +30 -0
  5. package/src/components/accordion/accordion-bg.stories.js +341 -171
  6. package/src/components/accordion/accordion.stories.js +345 -0
  7. package/src/components/anchor/anchor.stories.js +134 -76
  8. package/src/components/back/back.css.js +1 -1
  9. package/src/components/back/back.stories.js +301 -63
  10. package/src/components/badge/badge.js +4 -7
  11. package/src/components/badge/badge.stories.js +89 -96
  12. package/src/components/breadcrumb/breadcrumb.stories.js +167 -3
  13. package/src/components/cards/card.stories.js +153 -3
  14. package/src/components/display/display.css.js +7 -10
  15. package/src/components/display/display.js +14 -2
  16. package/src/components/display/display.stories.js +213 -219
  17. package/src/components/divider/divider.stories.js +337 -30
  18. package/src/components/footer/footer-lp.stories.js +346 -3
  19. package/src/components/footer/footer.js +0 -3
  20. package/src/components/footer/footer.stories.js +267 -4
  21. package/src/components/header/header.css.js +1 -1
  22. package/src/components/header/header.js +77 -56
  23. package/src/components/header/header.stories.js +298 -22
  24. package/src/components/heading/heading.css.js +1 -1
  25. package/src/components/heading/heading.stories.js +355 -113
  26. package/src/components/image/image.css.js +146 -98
  27. package/src/components/image/image.js +13 -2
  28. package/src/components/image/image.stories.js +546 -160
  29. package/src/components/input/custom-form.stories.js +209 -12
  30. package/src/components/link/link.css.js +2 -2
  31. package/src/components/link/link.stories.js +383 -53
  32. package/src/components/paragraph/paragraph.css.js +1 -1
  33. package/src/components/paragraph/paragraph.stories.js +365 -157
  34. package/src/components/picture/picture.css.js +209 -0
  35. package/src/components/picture/picture.js +16 -2
  36. package/src/components/picture/picture.stories.js +525 -180
  37. package/src/components/pricing-cards/new-pricing-card.js +19 -4
  38. package/src/components/pricing-cards/new-pricing-card.stories.js +422 -0
  39. package/src/components/pricing-cards/new-pricing.css.js +8 -0
  40. package/src/components/pricing-cards/pricing-card-actions.js +49 -9
  41. package/src/components/pricing-cards/pricing-card-container.css.js +1 -1
  42. package/src/components/pricing-cards/pricing-card-header.css.js +73 -63
  43. package/src/components/pricing-cards/pricing-card-header.js +44 -10
  44. package/src/components/pricing-cards/pricing-card-pricing.js +63 -64
  45. package/src/components/pricing-cards/pricing-card.css.js +7 -15
  46. package/src/components/pricing-cards/pricing-card.js +353 -270
  47. package/src/components/pricing-cards/pricing-card.stories.js +3 -3
  48. package/src/tokens/fonts.stories.js +335 -8
  49. package/src/tokens/spacing.stories.js +701 -34
  50. package/src/tokens/tokens-grid.stories.js +897 -48
  51. package/src/tokens/typography.stories.js +980 -38
  52. 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
- <pricing-card
57
- title="Bitdefender Ultimate Security"
58
- price=${this.formatCurrency(79.99)}
59
- discount="Save 50%"
60
- originalPrice=${this.formatCurrency(159.99)}
61
- features
62
- .planType=${this.planType}
63
- ></pricing-card>
64
-
65
- <pricing-card
66
- highlight
67
- features
68
- identity
69
- .planType=${this.planType}
70
- ></pricing-card>
71
-
72
- <pricing-card
73
- title="Bitdefender Total Security"
74
- price=${this.formatCurrency(49.99)}
75
- discount="Save 55%"
76
- originalPrice=${this.formatCurrency(159.99)}
77
- features
78
- privacy
79
- identity
80
- .planType=${this.planType}
81
- ></pricing-card>
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`<pricing-card-family
84
- title="Bitdefender Ultimate Security"
85
- price=${this.formatCurrency(119.99)}
86
- discount="Save 40%"
87
- originalPrice=${this.formatCurrency(199.99)}
88
- features
89
- privacy
90
- identityExtended
91
- parentalControl
92
- ></pricing-card-family>
93
- <pricing-card-family
94
- highlight
95
- features
96
- identity
97
- ></pricing-card-family>
98
- <pricing-card-family
99
- title="Bitdefender Total Security"
100
- price=${this.formatCurrency(79.99)}
101
- discount="Save 43%"
102
- originalPrice=${this.formatCurrency(139.99)}
103
- features
104
- privacy
105
- identity
106
- ></pricing-card-family>`}
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
- formatCurrency(value) {
148
- const numberValue = parseFloat(value.replace(/[^\d.-]/g, ""));
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
- <span class="badge">
166
- <img
167
- src="/assets/badge-icon-individual.png"
168
- alt="icon"
169
- class="badge-icon"
170
- />
200
+
201
+ <bd-badge>
171
202
  Individual
172
- </span>
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
- ${this.formatCurrency(this.originalPrice)}
213
+ <s data-store-render data-store-price="full"></s>
180
214
  </bd-p>
181
- <bd-p kind="small" class="discount">${this.discount}</bd-p>
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">${this.formatCurrency(this.price)}</bd-h>
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 label="Buy Now" kind="danger" size="md" fullWidth strong>
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 label="Learn More" kind="outline" size="md" fullWidth strong>
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
- ${this.features ? html`<pricing-card-features></pricing-card-features>` : ""}
200
- ${this.privacy ? html`<pricing-card-privacy></pricing-card-privacy>` : ""}
201
- ${this.identity ? html`<pricing-card-identity></pricing-card-identity>` : ""}
202
- ${this.identityExtended ? html`<pricing-card-identity-extended></pricing-card-identity-extended>` : ""}
203
- ${this.parentalControl ? html`<pricing-card-parental-control></pricing-card-parental-control>` : ""}
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
- formatCurrency(value) {
244
- const numberValue = parseFloat(value.replace(/[^\d.-]/g, ""));
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
- ${this.planType === "family"
256
- ? html`
257
- <div class="card ${this.highlight ? "highlight" : ""}">
258
- ${this.highlight
259
- ? html`<div class="highlight-banner">Best value</div>`
260
- : ""}
261
- <div class="card-header">
262
- <bd-h as="h4" class="card-title">${this.title}</bd-h>
263
- <span class="badge">
264
- <img
265
- src="/assets/bd-icon-family-white.png"
266
- alt="icon"
267
- class="badge-icon-family-subtitle"
268
- />
269
- <span class="family-text"> Family</span></span
270
- >
271
- <bd-p kind="small" class="badge-subtitle">5 accounts & 25 devices</bd-p>
272
- <hr class="hr-line" />
273
- </div>
274
- <div class="pricing">
275
- <div class="pricing-info">
276
- <bd-p kind="small" class="original-price">
277
- ${this.formatCurrency(this.originalPrice)}
278
- </bd-p>
279
- <bd-p kind="small" class="discount">${this.discount}</bd-p>
280
- </div>
281
- <bd-h as="h3" class="price">${this.formatCurrency(this.price)}</bd-h>
282
- <bd-p kind="small" class="terms">
283
- First year price. Plus applicable sales tax. See
284
- <a href="#">terms of use</a> below.
285
- </bd-p>
286
- </div>
287
- <div class="actions">
288
- <bd-button
289
- label="Buy Now"
290
- kind="danger"
291
- size="md"
292
- fullWidth
293
- strong
294
- >Buy Now</bd-button>
295
-
296
- <bd-button
297
- label="Learn More"
298
- kind="outline"
299
- size="md"
300
- fullWidth
301
- strong
302
- >Learn More</bd-button>
303
- </div>
304
- <hr class="hr-line" />
305
- ${this.features
306
- ? html`<pricing-card-features></pricing-card-features>`
307
- : ""}
308
- ${this.privacy
309
- ? html`<pricing-card-privacy></pricing-card-privacy>`
310
- : ""}
311
- ${this.identity
312
- ? html`<pricing-card-identity></pricing-card-identity>`
313
- : ""}
314
- ${this.identityExtended
315
- ? html`<pricing-card-identity-extended></pricing-card-identity-extended>`
316
- : ""}
317
- ${this.parentalControl
318
- ? html`<pricing-card-parental-control></pricing-card-parental-control>`
319
- : ""}
320
- </div>
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
- <img
426
- src="/assets/verified_arrow.png"
427
- alt="icon"
428
- class="badge-icon"
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
- <img
484
- src="/assets/verified_arrow.png"
485
- alt="icon"
486
- class="badge-icon"
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`<span class="badge-feature"
491
- >${priv.badge}
492
- <img
493
- src="/assets/badge-icon-individual.png"
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
- <img
535
- src="/assets/verified_arrow.png"
536
- alt="icon"
537
- class="badge-icon"
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`<span class="badge-feature"
542
- >${ident.badge}
543
- <img
544
- src="/assets/badge-icon-individual.png"
545
- alt="icon"
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
- <img
606
- src="/assets/verified_arrow.png"
607
- alt="icon"
608
- class="badge-icon"
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`<span class="badge-feature"
613
- >${ident.badge}
614
- <img
615
- src="/assets/badge-icon-individual.png"
616
- alt="icon"
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
- <img
680
- src="/assets/verified_arrow.png"
681
- alt="icon"
682
- class="badge-icon"
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`<span class="badge-feature"
687
- >${parental.badge}
688
- <img
689
- src="/assets/badge-icon-individual.png"
690
- alt="icon"
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
- PricingCardIdentify.styles = [tokens, pricingCardsCSS];
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);