@repobit/dex-system-design 0.22.12 → 0.23.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 (39) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/package.json +3 -2
  3. package/src/components/Button/button.stories.js +292 -120
  4. package/src/components/accordion/accordion-bg.css.js +7 -2
  5. package/src/components/accordion/accordion-bg.stories.js +268 -449
  6. package/src/components/accordion/accordion.stories.js +259 -265
  7. package/src/components/anchor/anchor.stories.js +160 -159
  8. package/src/components/awards/awards-icon.js +44 -0
  9. package/src/components/awards/awards.css.js +328 -0
  10. package/src/components/awards/awards.js +224 -0
  11. package/src/components/awards/awards.stories.js +447 -0
  12. package/src/components/back/back.stories.js +100 -375
  13. package/src/components/badge/badge.stories.js +241 -129
  14. package/src/components/breadcrumb/breadcrumb.stories.js +218 -219
  15. package/src/components/cards/card.stories.js +174 -622
  16. package/src/components/carousel/carousel.stories.js +196 -225
  17. package/src/components/checkbox/checkbox.stories.js +136 -51
  18. package/src/components/compare/compare.css.js +237 -0
  19. package/src/components/compare/compare.js +253 -0
  20. package/src/components/compare/compare.stories.js +372 -0
  21. package/src/components/display/display.stories.js +91 -297
  22. package/src/components/divider/divider.stories.js +160 -342
  23. package/src/components/footer/footer.stories.js +177 -402
  24. package/src/components/header/header.stories.js +130 -338
  25. package/src/components/heading/heading.js +8 -5
  26. package/src/components/heading/heading.stories.js +162 -471
  27. package/src/components/highlight/highlight.stories.js +153 -38
  28. package/src/components/image/image.stories.js +135 -563
  29. package/src/components/input/custom-form.stories.js +761 -224
  30. package/src/components/link/link.js +29 -12
  31. package/src/components/link/link.stories.js +130 -468
  32. package/src/components/modal/modal.stories.js +174 -28
  33. package/src/components/paragraph/paragraph.css.js +10 -1
  34. package/src/components/paragraph/paragraph.stories.js +85 -410
  35. package/src/components/picture/picture.stories.js +147 -561
  36. package/src/components/radio/radio.stories.js +230 -81
  37. package/src/components/tabs/tabs.stories.js +126 -10
  38. package/src/components/termsOfUse/terms.stories.js +223 -8
  39. package/src/tokens/tokens.js +1 -0
@@ -1,391 +1,183 @@
1
1
  import { html } from 'lit';
2
- import '../picture/picture.js';
3
2
  import './header.js';
4
3
 
5
4
  export default {
6
- title : 'Sections/Header',
7
- component: 'bd-header',
8
- tags : ['autodocs'],
9
- argTypes : {
5
+ title : 'Components/Header',
6
+ tags : ['autodocs'],
7
+ parameters: {
8
+ docs: {
9
+ description: {
10
+ component: `
11
+ **Header** is a Lit product header component with pricing integration via \`<bd-context>\`, \`<bd-product>\`, and \`<bd-option>\` store components.
12
+
13
+ ### Usage
14
+ \`\`\`html
15
+ <bd-header
16
+ title="Bitdefender Total Security"
17
+ subtitle="Complete protection for all devices"
18
+ description="Award-winning security for Windows, macOS, Android & iOS."
19
+ product-id="ts"
20
+ devices="5"
21
+ subscription="1"
22
+ >
23
+ <img slot="header-picture" src="/assets/product.png" alt="Product" />
24
+ <span slot="disclaimer-top">Protection for 5 devices.</span>
25
+ </bd-header>
26
+ \`\`\`
27
+
28
+ ### Slots
29
+ | Slot | Description |
30
+ |---|---|
31
+ | \`header-picture\` | Product image rendered in the right column |
32
+ | \`disclaimer-top\` | Small text below the Buy/View plans buttons |
33
+ | \`disclaimer-bottom-text-start\` | Start of the bottom disclaimer line |
34
+ | \`disclaimer-bottom-link\` | Link in the bottom disclaimer |
35
+ | \`disclaimer-bottom-text-end\` | End of the bottom disclaimer line |
36
+
37
+ ### Notes
38
+ - Pricing zones use \`data-store-render\` and \`data-store-price\` attributes for store integration
39
+ - \`shadow\` prop reflects as an attribute and defaults to \`true\`
40
+ `
41
+ }
42
+ }
43
+ },
44
+ argTypes: {
10
45
  title: {
11
46
  control : 'text',
12
- description: 'Main product title',
13
- table : {
14
- type : { summary: 'string' },
15
- defaultValue: { summary: '' }
16
- }
47
+ description: 'Product name rendered as `<bd-h as="h2">`',
48
+ table : { type: { summary: 'string' }, defaultValue: { summary: '' }, category: 'Content' }
17
49
  },
18
50
  subtitle: {
19
51
  control : 'text',
20
- description: 'Product subtitle or value proposition',
21
- table : {
22
- type : { summary: 'string' },
23
- defaultValue: { summary: '' }
24
- }
52
+ description: 'Value proposition rendered as `<bd-h as="h4">`',
53
+ table : { type: { summary: 'string' }, defaultValue: { summary: '' }, category: 'Content' }
25
54
  },
26
55
  description: {
27
56
  control : 'text',
28
- description: 'Product description',
29
- table : {
30
- type : { summary: 'string' },
31
- defaultValue: { summary: '' }
32
- }
33
- },
34
- fullPrice: {
35
- control : 'text',
36
- description: 'Original price before discount',
37
- table : {
38
- type : { summary: 'string' },
39
- defaultValue: { summary: '' }
40
- }
41
- },
42
- discount: {
43
- control : 'text',
44
- description: 'Discount text or percentage',
45
- table : {
46
- type : { summary: 'string' },
47
- defaultValue: { summary: '' }
48
- }
49
- },
50
- finalPrice: {
51
- control : 'text',
52
- description: 'Final price after discount',
53
- table : {
54
- type : { summary: 'string' },
55
- defaultValue: { summary: '' }
56
- }
57
+ description: 'Description paragraph rendered as `<bd-p kind="regular">`',
58
+ table : { type: { summary: 'string' }, defaultValue: { summary: '' }, category: 'Content' }
57
59
  },
58
60
  productId: {
59
61
  control : 'text',
60
- description: 'Product ID for bd-product component',
61
- table : {
62
- type : { summary: 'string' },
63
- defaultValue: { summary: 'vsb' }
64
- }
62
+ description: 'Product ID passed to `<bd-product>` for store price lookup',
63
+ table : { type: { summary: 'string' }, defaultValue: { summary: 'vsb' }, category: 'Store' }
65
64
  },
66
65
  devices: {
67
66
  control : 'text',
68
- description: 'Number of devices for bd-option component',
69
- table : {
70
- type : { summary: 'string' },
71
- defaultValue: { summary: '5' }
72
- }
67
+ description: 'Number of devices for `<bd-option>`',
68
+ table : { type: { summary: 'string' }, defaultValue: { summary: '5' }, category: 'Store' }
73
69
  },
74
70
  subscription: {
75
71
  control : 'text',
76
- description: 'Subscription duration for bd-option component',
77
- table : {
78
- type : { summary: 'string' },
79
- defaultValue: { summary: '1' }
80
- }
81
- },
82
- dataLayerEvent: {
83
- control : 'text',
84
- description: 'Data layer event name for analytics',
85
- table : {
86
- type : { summary: 'string' },
87
- defaultValue: { summary: 'info' }
88
- }
89
- },
90
- headerImage: {
91
- control : 'text',
92
- description: 'URL for the header image',
93
- table : {
94
- type : { summary: 'string' },
95
- defaultValue: { summary: '' }
96
- }
72
+ description: 'Subscription duration in years for `<bd-option>`',
73
+ table : { type: { summary: 'string' }, defaultValue: { summary: '1' }, category: 'Store' }
97
74
  },
98
- disclaimerTop: {
99
- control : 'text',
100
- description: 'Top disclaimer text',
101
- table : {
102
- type : { summary: 'string' },
103
- defaultValue: { summary: 'Protection for 1 account & 5 PCs, Macs, tablets, or smartphones. Windows® | macOS® | Android™ | iOS®' }
104
- }
75
+ shadow: {
76
+ control : 'boolean',
77
+ description: 'Reflected attribute for shadow styling',
78
+ table : { type: { summary: 'boolean' }, defaultValue: { summary: 'true' }, category: 'Appearance' }
105
79
  },
106
- disclaimerBottomStart: {
107
- control : 'text',
108
- description: 'Start text for bottom disclaimer',
109
- table : {
110
- type : { summary: 'string' },
111
- defaultValue: { summary: '' }
112
- }
113
- },
114
- disclaimerBottomLink: {
115
- control : 'text',
116
- description: 'Link text for bottom disclaimer',
117
- table : {
118
- type : { summary: 'string' },
119
- defaultValue: { summary: '' }
120
- }
121
- },
122
- disclaimerBottomEnd: {
80
+ dataLayerEvent: {
123
81
  control : 'text',
124
- description: 'End text for bottom disclaimer',
125
- table : {
126
- type : { summary: 'string' },
127
- defaultValue: { summary: '' }
128
- }
129
- }
130
- },
131
- parameters: {
132
- docs: {
133
- description: {
134
- component: 'A comprehensive header section for product pages featuring product information, pricing, call-to-action buttons, and visual elements. Perfect for security product landing pages and e-commerce sections.'
135
- }
82
+ description: 'Data layer event name passed to `<bd-option>`',
83
+ table : { type: { summary: 'string' }, defaultValue: { summary: 'info' }, category: 'Analytics' }
136
84
  }
137
85
  }
138
86
  };
139
87
 
140
- const Template = (args) => html`
88
+ const render = (args) => html`
141
89
  <bd-header
142
90
  title="${args.title}"
143
91
  subtitle="${args.subtitle}"
144
92
  description="${args.description}"
145
- fullPrice="${args.fullPrice}"
146
- discount="${args.discount}"
147
- finalPrice="${args.finalPrice}"
148
- productId="${args.productId}"
93
+ product-id="${args.productId}"
149
94
  devices="${args.devices}"
150
95
  subscription="${args.subscription}"
151
- dataLayerEvent="${args.dataLayerEvent}"
96
+ ?shadow="${args.shadow}"
97
+ data-layer-event="${args.dataLayerEvent}"
152
98
  >
153
- ${args.headerImage
154
- ? html`
155
- <bd-picture
156
- slot="header-picture"
157
- .sources=${[
158
- {
159
- type : 'image/webp',
160
- srcset: args.headerImage,
161
- media : '(min-width: 1200px)'
162
- },
163
- {
164
- type : 'image/webp',
165
- srcset: args.headerImage,
166
- media : '(min-width: 768px)'
167
- },
168
- {
169
- type : 'image/webp',
170
- srcset: args.headerImage
171
- }
172
- ]}
173
- alt="Security illustration"
174
- fallback-src="${args.headerImage}"
175
- loading="eager"
176
- width="750"
177
- height="500"
178
- ></bd-picture>
179
- `
180
- : ''}
181
-
182
- ${args.disclaimerTop
183
- ? html`<span slot="disclaimer-top">${args.disclaimerTop}</span>`
184
- : ''}
185
-
186
- ${args.disclaimerBottomStart || args.disclaimerBottomLink || args.disclaimerBottomEnd
187
- ? html`
188
- <span slot="disclaimer-bottom-text-start">${args.disclaimerBottomStart || ''}</span>
189
- <a slot="disclaimer-bottom-link" href="#">${args.disclaimerBottomLink || ''}</a>
190
- <span slot="disclaimer-bottom-text-end">${args.disclaimerBottomEnd || ''}</span>
191
- `
192
- : ''}
99
+ <img slot="header-picture" src="/assets/product-header.png" alt="Product screenshot" />
100
+ <span slot="disclaimer-top">
101
+ Protection for 1 account & ${args.devices} PCs, Macs, tablets, or smartphones.
102
+ Windows® | macOS® | Android™ | iOS®
103
+ </span>
193
104
  </bd-header>
194
105
  `;
195
106
 
196
- export const Default = Template.bind({});
197
- Default.args = {
198
- title : 'Bitdefender Ultimate Security',
199
- subtitle : 'Complete Security, Advanced Privacy, and Identity Protection',
200
- description : 'All in one plan to incorporate multi-awarded device protection, solid password management, unlimited VPN traffic & personalized protection for your online identity.',
201
- fullPrice : '$139.99',
202
- discount : 'Save 44%',
203
- finalPrice : '$79.99*',
204
- productId : 'vsb',
205
- devices : '5',
206
- subscription : '1',
207
- dataLayerEvent : 'info',
208
- headerImage : 'https://picsum.photos/750/500',
209
- disclaimerTop : 'Protection for 1 account & 5 PCs, Macs, tablets, or smartphones. Windows® | macOS® | Android™ | iOS®',
210
- disclaimerBottomStart: 'Learn more about',
211
- disclaimerBottomLink : 'Terms & Conditions',
212
- disclaimerBottomEnd : 'before purchasing.'
213
- };
214
- Default.parameters = {
215
- docs: {
216
- description: {
217
- story: 'Default header section for security products. Features product information, pricing with discount, call-to-action buttons, and device compatibility disclaimers. Includes bd-product and bd-option components.'
218
- }
219
- }
107
+ const defaultArgs = {
108
+ title : 'Bitdefender Total Security',
109
+ subtitle : 'Complete real-time data protection',
110
+ description : 'Award-winning cybersecurity for all your devices. Protection against viruses, malware, ransomware, and more.',
111
+ productId : 'ts', devices : '5', subscription : '1',
112
+ shadow : true, dataLayerEvent: 'info'
220
113
  };
221
114
 
222
- export const WithCustomImage = Template.bind({});
223
- WithCustomImage.args = {
224
- ...Default.args,
225
- headerImage: 'https://picsum.photos/750/500?random=1'
226
- };
227
- WithCustomImage.parameters = {
228
- docs: {
229
- description: {
230
- story: 'Header with custom product image. Demonstrates how to integrate different visual assets while maintaining the same layout structure and content organization.'
231
- }
232
- }
233
- };
115
+ // ─── Stories ───────────────────────────────────────────────────────────────
234
116
 
235
- export const WithDiscountedPrice = Template.bind({});
236
- WithDiscountedPrice.args = {
237
- title : 'Bitdefender Premium Security',
238
- subtitle : 'Advanced Security, Privacy & Identity Protection',
239
- description : 'Comprehensive security for all your devices with enhanced features and privacy options.',
240
- fullPrice : '$199.99',
241
- discount : 'Save 35%',
242
- finalPrice : '$129.99*',
243
- productId : 'ps_i',
244
- devices : '5',
245
- subscription : '1',
246
- dataLayerEvent : 'info',
247
- headerImage : 'https://picsum.photos/750/500?random=2',
248
- disclaimerTop : 'Protection for 1 account & 5 devices.',
249
- disclaimerBottomStart: 'See',
250
- disclaimerBottomLink : 'Details',
251
- disclaimerBottomEnd : 'for more info.',
252
- shadow : true
253
- };
254
- WithDiscountedPrice.parameters = {
255
- docs: {
256
- description: {
257
- story: 'Header showcasing a different pricing structure with significant discount. Highlights how the component handles various discount scenarios and pricing strategies.'
258
- }
259
- }
117
+ export const Default = {
118
+ name : 'Default',
119
+ args : { ...defaultArgs },
120
+ render,
121
+ parameters: { docs: { description: { story: 'Full header with title, subtitle, description, and a product image slot.' } } }
260
122
  };
261
123
 
262
- export const WithLocalImage = Template.bind({});
263
- WithLocalImage.args = {
264
- ...Default.args,
265
- headerImage: '/assets/bd-header-us.jpg'
266
- };
267
- WithLocalImage.parameters = {
268
- docs: {
269
- description: {
270
- story: 'Header using local image assets. Demonstrates integration with project-specific images and optimized loading with responsive picture element.'
271
- }
272
- }
124
+ export const NoImage = {
125
+ name : 'No Product Image',
126
+ render: () => html`
127
+ <bd-header
128
+ title="Bitdefender Antivirus Plus"
129
+ subtitle="Essential antivirus protection"
130
+ description="Fast, lightweight virus protection for Windows."
131
+ product-id="av" devices="3" subscription="1"
132
+ ></bd-header>
133
+ `,
134
+ parameters: { docs: { description: { story: 'Header without a `header-picture` slot — right column is empty.' } } }
273
135
  };
274
136
 
275
- export const MinimalHeader = Template.bind({});
276
- MinimalHeader.args = {
277
- title : 'Bitdefender Basic Security',
278
- subtitle : 'Essential Protection for Your Devices',
279
- description : 'Core security features to keep your devices safe from threats with minimal system impact.',
280
- finalPrice : '$49.99/year',
281
- productId : 'ts_i',
282
- devices : '5',
283
- subscription : '1',
284
- dataLayerEvent: 'info',
285
- headerImage : 'https://picsum.photos/750/500?random=3'
286
- };
287
- MinimalHeader.parameters = {
288
- docs: {
289
- description: {
290
- story: 'Minimal header variant without discount pricing. Shows a cleaner layout suitable for simpler product offerings or basic security packages.'
291
- }
292
- }
137
+ export const WithDisclaimers = {
138
+ name : 'With All Disclaimer Slots',
139
+ render: () => html`
140
+ <bd-header
141
+ title="Bitdefender Premium Security"
142
+ subtitle="Ultimate protection for all devices"
143
+ description="Unlimited devices, unlimited VPN, identity theft protection."
144
+ product-id="ps" devices="unlimited" subscription="1"
145
+ >
146
+ <img slot="header-picture" src="/assets/premium.png" alt="Premium Security" />
147
+ <span slot="disclaimer-top">Protects unlimited devices.</span>
148
+ <span slot="disclaimer-bottom-text-start">By purchasing you agree to our </span>
149
+ <a slot="disclaimer-bottom-link" href="/terms">Terms of Service</a>
150
+ <span slot="disclaimer-bottom-text-end"> and Privacy Policy.</span>
151
+ </bd-header>
152
+ `,
153
+ parameters: { docs: { description: { story: 'All disclaimer slots filled: top, bottom-text-start, bottom-link, and bottom-text-end.' } } }
293
154
  };
294
155
 
295
- export const NoImageHeader = Template.bind({});
296
- NoImageHeader.args = {
297
- title : 'Bitdefender Mobile Security',
298
- subtitle : 'Protection for Your Smartphone and Tablet',
299
- description : 'Comprehensive mobile security with anti-theft, web protection, and app lock features designed specifically for mobile devices.',
300
- fullPrice : '$29.99',
301
- discount : 'Save 20%',
302
- finalPrice : '$23.99*',
303
- productId : 'mobile',
304
- devices : '1',
305
- subscription : '1',
306
- dataLayerEvent: 'info',
307
- disclaimerTop : 'Protection for 1 Android or iOS device. 30-day money-back guarantee.'
308
- };
309
- NoImageHeader.parameters = {
310
- docs: {
311
- description: {
312
- story: 'Header without product image. Useful for text-focused layouts or when visual assets are not available, while maintaining all other functionality.'
313
- }
314
- }
315
- };
316
-
317
- export const LongContentHeader = Template.bind({});
318
- LongContentHeader.args = {
319
- title : 'Bitdefender Total Security Ultimate Plus Premium Edition',
320
- subtitle : 'Comprehensive Multi-Layer Protection with Advanced AI Threat Detection and Real-Time Behavioral Analysis',
321
- description : 'Our most advanced security solution combines machine learning algorithms with cloud-based threat intelligence to provide unparalleled protection against emerging cyber threats, zero-day attacks, and sophisticated malware while maintaining optimal system performance and user privacy across all your connected devices.',
322
- fullPrice : '$299.99',
323
- discount : 'Limited Time Offer - Save 50%',
324
- finalPrice : '$149.99*',
325
- productId : 'ts_i',
326
- devices : '5',
327
- subscription : '2',
328
- dataLayerEvent : 'info',
329
- headerImage : 'https://picsum.photos/750/500?random=4',
330
- disclaimerTop : 'Comprehensive protection for up to 10 devices including Windows PCs, macOS computers, Android smartphones, iOS devices, and tablets. Includes 24/7 premium support and identity theft protection services.',
331
- disclaimerBottomStart: 'This offer includes our',
332
- disclaimerBottomLink : 'premium features bundle',
333
- disclaimerBottomEnd : 'with additional cloud storage and priority customer support. Subscription automatically renews unless canceled.'
334
- };
335
- LongContentHeader.parameters = {
336
- docs: {
337
- description: {
338
- story: 'Header with extensive content including long titles, detailed descriptions, and comprehensive disclaimers. Demonstrates how the component handles text-heavy scenarios while maintaining readability and visual balance.'
339
- }
340
- }
156
+ export const DifferentProducts = {
157
+ name : 'Different Product IDs',
158
+ render: () => html`
159
+ <div style="display:flex; flex-direction:column; gap:40px;">
160
+ <bd-header title="Antivirus Plus" subtitle="Basic protection" description="Core antivirus for Windows." product-id="av" devices="1" subscription="1"></bd-header>
161
+ <bd-header title="Total Security" subtitle="Complete coverage" description="Full-suite protection for all your devices." product-id="ts" devices="5" subscription="1"></bd-header>
162
+ <bd-header title="Premium Security" subtitle="Ultimate defense" description="Everything you need plus unlimited VPN." product-id="ps" devices="10" subscription="1"></bd-header>
163
+ </div>
164
+ `,
165
+ parameters: { docs: { description: { story: 'Three headers with different `product-id`, `devices`, and content values.' } } }
341
166
  };
342
167
 
343
- export const BusinessProductHeader = Template.bind({});
344
- BusinessProductHeader.args = {
345
- title : 'Bitdefender GravityZone Business Security',
346
- subtitle : 'Enterprise-Grade Protection for Your Organization',
347
- description : 'Centralized security management with advanced threat prevention, endpoint detection and response, and risk analytics for businesses of all sizes.',
348
- finalPrice : 'Contact for Pricing',
349
- productId : 'ts_i',
350
- devices : '5',
351
- subscription : '1',
352
- dataLayerEvent : 'info',
353
- headerImage : 'https://picsum.photos/750/500?random=6',
354
- disclaimerTop : 'Scalable protection from 10 to 10,000+ endpoints. Includes centralized management console and 24/7 business support.',
355
- disclaimerBottomStart: 'Request a',
356
- disclaimerBottomLink : 'free business trial',
357
- disclaimerBottomEnd : 'or schedule a demo with our experts.'
358
- };
359
- BusinessProductHeader.parameters = {
360
- docs: {
361
- description: {
362
- story: 'Business product header with enterprise-focused messaging. Features contact-based pricing instead of direct purchase, tailored for B2B sales cycles and enterprise customers.'
363
- }
168
+ export const MobileView = {
169
+ name : 'Mobile View (375px)',
170
+ args : { ...defaultArgs },
171
+ render,
172
+ parameters: {
173
+ viewport: { defaultViewport: 'mobile1' },
174
+ docs : { description: { story: 'Header at 375px mobile viewport. Tests two-column to single-column layout reflow.' } }
364
175
  }
365
176
  };
366
177
 
367
- export const DifferentProductConfigurations = Template.bind({});
368
- DifferentProductConfigurations.args = {
369
- title : 'Bitdefender Family Pack',
370
- subtitle : 'Complete Protection for Your Entire Household',
371
- description : 'Secure all family devices with comprehensive protection that grows with your needs.',
372
- fullPrice : '$249.99',
373
- discount : 'Save 40%',
374
- finalPrice : '$149.99*',
375
- productId : 'us_i',
376
- devices : '5',
377
- subscription : '1',
378
- dataLayerEvent : 'info',
379
- headerImage : 'https://picsum.photos/750/500?random=7',
380
- disclaimerTop : 'Protection for up to 15 devices across multiple family members. Includes parental controls and family privacy features.',
381
- disclaimerBottomStart: 'Family plans include',
382
- disclaimerBottomLink : 'additional features',
383
- disclaimerBottomEnd : 'for comprehensive household protection.'
384
- };
385
- DifferentProductConfigurations.parameters = {
386
- docs: {
387
- description: {
388
- story: 'Header with different product configuration showcasing family pack options. Demonstrates how the component adapts to various product types and device counts.'
389
- }
390
- }
178
+ export const Playground = {
179
+ name : '🛝 Playground',
180
+ args : { ...defaultArgs },
181
+ render,
182
+ parameters: { docs: { description: { story: 'Interactive playground. Adjust title, subtitle, description, product-id, devices, and subscription via Controls.' } } }
391
183
  };
@@ -4,11 +4,12 @@ import headingCSS from "./heading.css.js";
4
4
 
5
5
  export class BdH extends LitElement {
6
6
  static properties = {
7
- as : { type: String, reflect: true },
8
- ariaLevel : { type: Number, attribute: "aria-level" },
9
- padding : { type: String },
10
- fontWeight: { type: String },
11
- color : { type: String }
7
+ as : { type: String, reflect: true },
8
+ ariaLevel : { type: Number, attribute: "aria-level" },
9
+ padding : { type: String },
10
+ paddingBottom: { type: String },
11
+ fontWeight : { type: String },
12
+ color : { type: String }
12
13
  };
13
14
 
14
15
  constructor() {
@@ -16,6 +17,7 @@ export class BdH extends LitElement {
16
17
  this.as = "h1";
17
18
  this.ariaLevel = null;
18
19
  this.padding = "";
20
+ this.paddingBottom = "";
19
21
  this.fontWeight = "";
20
22
  this.color = "";
21
23
  }
@@ -52,6 +54,7 @@ export class BdH extends LitElement {
52
54
  const validColor = this._getValidColor(this.color);
53
55
 
54
56
  if (this.padding) styles.push(`padding: ${this.padding};`);
57
+ if (this.paddingBottom) styles.push(`padding-bottom: ${this.paddingBottom};`);
55
58
  if (validFontWeight) styles.push(`font-weight: ${validFontWeight};`);
56
59
  if (validColor) styles.push(`color: ${validColor};`);
57
60