@repobit/dex-system-design 0.22.12 → 0.23.2
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 +40 -0
- package/package.json +4 -3
- package/src/components/Button/button.stories.js +292 -120
- package/src/components/accordion/accordion-bg.css.js +7 -2
- package/src/components/accordion/accordion-bg.stories.js +268 -449
- package/src/components/accordion/accordion.stories.js +259 -265
- package/src/components/anchor/anchor.stories.js +160 -159
- package/src/components/awards/awards-icon.js +44 -0
- package/src/components/awards/awards.css.js +328 -0
- package/src/components/awards/awards.js +224 -0
- package/src/components/awards/awards.stories.js +447 -0
- package/src/components/back/back.stories.js +100 -375
- package/src/components/badge/badge.stories.js +241 -129
- package/src/components/breadcrumb/breadcrumb.stories.js +218 -219
- package/src/components/cards/card.stories.js +174 -622
- package/src/components/carousel/carousel.stories.js +196 -225
- package/src/components/checkbox/checkbox.stories.js +136 -51
- package/src/components/compare/compare.css.js +237 -0
- package/src/components/compare/compare.js +253 -0
- package/src/components/compare/compare.stories.js +372 -0
- package/src/components/display/display.stories.js +91 -297
- package/src/components/divider/divider.stories.js +160 -342
- package/src/components/footer/footer.stories.js +177 -402
- package/src/components/header/header.stories.js +130 -338
- package/src/components/heading/heading.js +8 -5
- package/src/components/heading/heading.stories.js +162 -471
- package/src/components/highlight/highlight.stories.js +153 -38
- package/src/components/image/image.stories.js +135 -563
- package/src/components/input/custom-form.stories.js +761 -224
- package/src/components/link/link.js +29 -12
- package/src/components/link/link.stories.js +130 -468
- package/src/components/modal/modal.stories.js +174 -28
- package/src/components/paragraph/paragraph.css.js +10 -1
- package/src/components/paragraph/paragraph.stories.js +85 -410
- package/src/components/picture/picture.stories.js +147 -561
- package/src/components/radio/radio.stories.js +230 -81
- package/src/components/tabs/tabs.stories.js +126 -10
- package/src/components/termsOfUse/terms.stories.js +223 -8
- 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
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
99
|
-
control : '
|
|
100
|
-
description: '
|
|
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
|
-
|
|
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: '
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
96
|
+
?shadow="${args.shadow}"
|
|
97
|
+
data-layer-event="${args.dataLayerEvent}"
|
|
152
98
|
>
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
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
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
description
|
|
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
|
|
8
|
-
ariaLevel
|
|
9
|
-
padding
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|