@repobit/dex-system-design 0.24.4 → 0.24.5

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 (63) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +4 -4
  3. package/src/components/accordion/accordion.css.js +40 -0
  4. package/src/components/accordion/accordion.js +31 -0
  5. package/src/components/accordion/accordion.stories.js +147 -4
  6. package/src/components/agent-endpoints/agent-endpoints.css.js +92 -0
  7. package/src/components/agent-endpoints/agent-endpoints.js +86 -0
  8. package/src/components/agent-endpoints/agent-endpoints.stories.js +148 -0
  9. package/src/components/ai-guardian-demo.stories.js +669 -0
  10. package/src/components/awards/awards-flex.css.js +169 -0
  11. package/src/components/awards/awards-flex.js +269 -0
  12. package/src/components/awards/awards-flex.stories.js +657 -0
  13. package/src/components/bento-grid/bento-grid.css.js +57 -0
  14. package/src/components/bento-grid/bento-grid.js +186 -0
  15. package/src/components/bento-grid/bento-grid.stories.js +440 -0
  16. package/src/components/bento-grid/bento-item.css.js +79 -0
  17. package/src/components/bento-grid/bento-item.js +54 -0
  18. package/src/components/button/button.css.js +26 -0
  19. package/src/components/button/button.js +8 -0
  20. package/src/components/button/button.stories.js +12 -0
  21. package/src/components/comparison-panel/comparison-panel.css.js +104 -0
  22. package/src/components/comparison-panel/comparison-panel.js +100 -0
  23. package/src/components/comparison-panel/comparison-panel.stories.js +223 -0
  24. package/src/components/compatibility-table/compatibility-table.css.js +243 -0
  25. package/src/components/compatibility-table/compatibility-table.js +123 -0
  26. package/src/components/compatibility-table/compatibility-table.stories.js +189 -0
  27. package/src/components/cta-banner/cta-banner.css.js +60 -0
  28. package/src/components/cta-banner/cta-banner.js +63 -0
  29. package/src/components/dropdown/dropdown.css.js +1 -1
  30. package/src/components/footer/footer.css.js +0 -1
  31. package/src/components/header/header-code.css.js +125 -0
  32. package/src/components/header/header-code.js +69 -0
  33. package/src/components/header/header-code.stories.js +226 -0
  34. package/src/components/heading/heading.css.js +3 -0
  35. package/src/components/icons/bd-ai-icon.js +27 -0
  36. package/src/components/list/list-item/list-item.css.js +3 -3
  37. package/src/components/list/list-item/list-item.js +10 -4
  38. package/src/components/overview/overview.css.js +121 -0
  39. package/src/components/overview/overview.js +63 -0
  40. package/src/components/overview/overview.stories.js +193 -0
  41. package/src/components/page-switcher/page-switcher.css.js +100 -0
  42. package/src/components/page-switcher/page-switcher.js +42 -0
  43. package/src/components/paragraph/paragraph.js +7 -3
  44. package/src/components/process-steps/process-steps.css.js +95 -0
  45. package/src/components/process-steps/process-steps.js +72 -0
  46. package/src/components/process-steps/process-steps.stories.js +144 -0
  47. package/src/components/quick-answer/quick-answer.css.js +67 -0
  48. package/src/components/quick-answer/quick-answer.js +59 -0
  49. package/src/components/quick-answer/quick-answer.stories.js +160 -0
  50. package/src/components/terminal/terminal-cursor.js +49 -0
  51. package/src/components/terminal/terminal-message.css.js +161 -0
  52. package/src/components/terminal/terminal-message.js +169 -0
  53. package/src/components/terminal/terminal-message.stories.js +321 -0
  54. package/src/components/trust-panel/trust-panel.css.js +167 -0
  55. package/src/components/trust-panel/trust-panel.js +116 -0
  56. package/src/components/trust-panel/trust-panel.stories.js +234 -0
  57. package/src/tokens/tokens.css +1 -1
  58. package/src/components/tabsComponent/tabsComponent.css.js +0 -267
  59. package/src/components/tabsComponent/tabsComponent.js +0 -193
  60. package/src/components/tabsComponent/tabsComponent.stories.js +0 -134
  61. package/src/components/tabsComponentFamily/tabsComponentFamily.css.js +0 -181
  62. package/src/components/tabsComponentFamily/tabsComponentFamily.js +0 -180
  63. package/src/components/tabsComponentFamily/tabsComponentFamily.stories.js +0 -319
@@ -0,0 +1,657 @@
1
+ import { html } from "lit";
2
+ import "../heading/heading.js";
3
+ import "../paragraph/paragraph.js";
4
+ import "./awards-flex.js";
5
+
6
+ export default {
7
+ title : "Components/Awards Flex",
8
+ component : "bd-awards-flex",
9
+ tags : ["autodocs"],
10
+ parameters: {
11
+ layout: "fullscreen",
12
+ docs : {
13
+ description: {
14
+ component: `
15
+ **AwardsFlex** is a configurable awards/trust component that covers multiple visual
16
+ variants through a single set of properties, instead of separate components per case.
17
+
18
+ A laurel icon (\`<bd-laurel-icon>\`) is always centered above the headline. It can be
19
+ overridden via the \`icon\` slot: \`<bd-awards-flex><svg slot="icon">...</svg></bd-awards-flex>\`.
20
+
21
+ Badges render real icon components from \`components/icons\` (e.g. \`<bd-pc-mag-icon>\`,
22
+ \`<bd-av-comparatives-icon>\`) — pass the icon's slug via the \`icon\` field on each badge
23
+ object, and \`AwardsFlex\` maps it to the matching \`<bd-*-icon>\` custom element internally.
24
+
25
+ When \`layout="quotes"\` and \`carousel\` is set, badges are paginated 3 per page. With 6
26
+ badges that's 2 pages, with 9 badges 3 pages, and so on — the carousel slides a full page
27
+ of 3 cards at a time.
28
+
29
+ ### Usage
30
+ \`\`\`html
31
+ <bd-awards-flex
32
+ background="tint"
33
+ layout="quotes"
34
+ carousel
35
+ autoplay
36
+ autoplay-delay="4000"
37
+ headline="Built by the experts who perfected business protection"
38
+ subtext="..."
39
+ .badges=\${sixBadgesWithQuotes}
40
+ ></bd-awards-flex>
41
+ \`\`\`
42
+
43
+ ### Attributes
44
+ | Attribute | Type | Default | Description |
45
+ |-------------------|------------------------------------|-------------|----------------------------------------------------------------------|
46
+ | \`background\` | \`"white" \\| "tint"\` | \`"white"\` | Section background |
47
+ | \`layout\` | \`"compact" \\| "grid" \\| "quotes"\` | \`"compact"\` | Badge size/arrangement, or badges paired with quote cards |
48
+ | \`carousel\` | Boolean | \`false\` | Only for \`layout="quotes"\` — paginate 3 cards at a time |
49
+ | \`autoplay\` | Boolean | \`false\` | Auto-advance carousel pages. Requires \`carousel\` + \`layout="quotes"\` and 2+ pages (7+ badges is unnecessary — 2 pages start at 4 badges) |
50
+ | \`autoplay-delay\` | Number (ms) | \`4000\` | Time between auto-advances. Minimum enforced: 1000ms |
51
+ | \`headline\` | String | \`""\` | Optional heading |
52
+ | \`subtext\` | String | \`""\` | Optional supporting paragraph |
53
+ | \`badges\` | Array | \`[]\` | Badge objects (see below) |
54
+
55
+ Autoplay pauses automatically on mouse hover or keyboard focus within the carousel, and resumes when the pointer/focus leaves.
56
+
57
+ ### Badge object shape
58
+ \`\`\`js
59
+ {
60
+ id: string,
61
+ label: string, // accessible label
62
+ type: "red" | "dark",
63
+ icon: string, // one of: "pc-mag" | "pc-mag-2024" | "pc-mag-business" | "pc-mag-readers" | "av-comparatives" | "best-brands" | "top-product"
64
+ // only used when layout="quotes":
65
+ quote?: string,
66
+ source?: string,
67
+ date?: string
68
+ }
69
+ \`\`\`
70
+ `
71
+ }
72
+ }
73
+ },
74
+ argTypes: {
75
+ background: {
76
+ control : { type: "select" },
77
+ options : ["white", "tint"],
78
+ description: "Section background",
79
+ table : { category: "Appearance" }
80
+ },
81
+ layout: {
82
+ control : { type: "select" },
83
+ options : ["compact", "grid", "quotes"],
84
+ description: "Badge size/arrangement",
85
+ table : { category: "Appearance" }
86
+ },
87
+ carousel: {
88
+ control : "boolean",
89
+ description: "Paginate quote cards 3 at a time (layout=\"quotes\" only)",
90
+ table : { category: "Appearance" }
91
+ },
92
+ autoplay: {
93
+ control : "boolean",
94
+ description: "Auto-advance pages (requires carousel + layout=\"quotes\")",
95
+ table : { category: "Carousel" }
96
+ },
97
+ autoplayDelay: {
98
+ control : { type: "number", min: 1000, step: 500 },
99
+ description: "Milliseconds between auto-advances",
100
+ table : { category: "Carousel" }
101
+ },
102
+ headline: {
103
+ control: "text",
104
+ table : { category: "Content" }
105
+ },
106
+ subtext: {
107
+ control: "text",
108
+ table : { category: "Content" }
109
+ },
110
+ badges: {
111
+ control: "object",
112
+ table : { category: "Content" }
113
+ }
114
+ }
115
+ };
116
+
117
+
118
+ // ─── Shared badge sets (icon keys map to real <bd-*-icon> components) ─────────
119
+
120
+ const smallBadges = [
121
+ { id: "pc-mag", label: "PC MAG Editors' Choice", type: "red", icon: "pc-mag" },
122
+ { id: "best-brands", label: "Best Brands 2024", type: "dark", icon: "best-brands" },
123
+ { id: "av-comparatives", label: "AV-Comparatives", type: "dark", icon: "av-comparatives" },
124
+ { id: "top-product", label: "AV-TEST Top Product", type: "red", icon: "top-product" }
125
+ ];
126
+
127
+ const allBadges = [
128
+ { id: "pc-mag", label: "PC MAG Editors' Choice", type: "red", icon: "pc-mag" },
129
+ { id: "av-comparatives", label: "AV-Comparatives", type: "dark", icon: "av-comparatives" },
130
+ { id: "best-brands", label: "Best Brands 2024", type: "dark", icon: "best-brands" },
131
+ { id: "pc-mag-2024", label: "PC Choice 2024", type: "red", icon: "pc-mag-2024" },
132
+ { id: "pc-mag-readers", label: "PC MAG Readers' Choice", type: "red", icon: "pc-mag-readers" },
133
+ { id: "pc-mag-business", label: "PC Business Choice", type: "red", icon: "pc-mag-business" },
134
+ { id: "top-product", label: "AV-TEST Top Product", type: "red", icon: "top-product" }
135
+ ];
136
+
137
+ const threeBadges = [
138
+ { id: "pc-mag-2024", label: "PC Choice 2024", type: "red", icon: "pc-mag-2024" },
139
+ { id: "top-product", label: "AV-TEST Top Product", type: "red", icon: "top-product" },
140
+ { id: "av-comparatives", label: "AV-Comparatives", type: "dark", icon: "av-comparatives" }
141
+ ];
142
+
143
+ const threeBadgesWithQuotes = [
144
+ {
145
+ id : "pc-mag-2024",
146
+ label : "PC Choice 2024",
147
+ type : "red",
148
+ icon : "pc-mag-2024",
149
+ quote : "Product of the Year",
150
+ source: "PC Comparatives",
151
+ date : "January 2025"
152
+ },
153
+ {
154
+ id : "top-product",
155
+ label : "AV-TEST Top Product",
156
+ type : "red",
157
+ icon : "top-product",
158
+ quote : "Outstanding scores in independent lab tests and our own protection tests",
159
+ source: "PCMag",
160
+ date : "August 2025"
161
+ },
162
+ {
163
+ id : "av-comparatives",
164
+ label : "AV-Comparatives",
165
+ type : "dark",
166
+ icon : "av-comparatives",
167
+ quote : "Bitdefender emerges on top, achieving the highest satisfaction ratings on nearly every metric",
168
+ source: "PitPag",
169
+ date : "January 2023"
170
+ }
171
+ ];
172
+
173
+ // Six badges with quotes — needed so the carousel has 2+ pages (3 cards per page)
174
+ const sixBadgesWithQuotes = [
175
+ ...threeBadgesWithQuotes,
176
+ {
177
+ id : "pc-mag",
178
+ label : "PC MAG Editors' Choice",
179
+ type : "red",
180
+ icon : "pc-mag",
181
+ quote : "Consistently ranked among the best protection suites available today",
182
+ source: "PCMag",
183
+ date : "March 2024"
184
+ },
185
+ {
186
+ id : "pc-mag-readers",
187
+ label : "PC MAG Readers' Choice",
188
+ type : "red",
189
+ icon : "pc-mag-readers",
190
+ quote : "Readers voted Bitdefender their top choice for home security",
191
+ source: "PCMag Readers",
192
+ date : "June 2024"
193
+ },
194
+ {
195
+ id : "best-brands",
196
+ label : "Best Brands 2024",
197
+ type : "dark",
198
+ icon : "best-brands",
199
+ quote : "Named one of the year's most trusted cybersecurity brands",
200
+ source: "Best Brands",
201
+ date : "2024"
202
+ }
203
+ ];
204
+
205
+ const headline = "Built by the experts who perfected business protection";
206
+ const subtext = "Award-winning cybersecurity trusted by millions, recognized by independent testing labs, and created by Bitdefender security researchers.";
207
+ const shortHeadline = "Bitdefender, Award-Winning Leader in Cybersecurity you can trust";
208
+
209
+ const render = (args) => html`
210
+ <bd-awards-flex
211
+ background=${args.background}
212
+ layout=${args.layout}
213
+ ?carousel=${args.carousel}
214
+ ?autoplay=${args.autoplay}
215
+ autoplay-delay=${args.autoplayDelay}
216
+ headline=${args.headline}
217
+ subtext=${args.subtext}
218
+ .badges=${args.badges}
219
+ ></bd-awards-flex>
220
+ `;
221
+
222
+
223
+ // ─── 1. Compact, white, no subtext, small badges ──────────────────────────────
224
+
225
+ export const CompactNoSubtext = {
226
+ name: "1. Compact — No Subtext",
227
+ args: {
228
+ background : "white",
229
+ layout : "compact",
230
+ carousel : false,
231
+ autoplay : false,
232
+ autoplayDelay: 4000,
233
+ headline : shortHeadline,
234
+ subtext : "",
235
+ badges : smallBadges
236
+ },
237
+ render,
238
+ parameters: {
239
+ docs: {
240
+ description: {
241
+ story: "White background, headline only (no subtext), small badge row, laurel centered above the headline."
242
+ }
243
+ }
244
+ }
245
+ };
246
+
247
+
248
+ // ─── 2. Compact, white, larger badges ─────────────────────────────────────────
249
+
250
+ export const CompactLargerBadges = {
251
+ name: "2. Compact — Larger Badges",
252
+ args: {
253
+ background : "white",
254
+ layout : "grid",
255
+ carousel : false,
256
+ autoplay : false,
257
+ autoplayDelay: 4000,
258
+ headline : shortHeadline,
259
+ subtext : "",
260
+ badges : smallBadges
261
+ },
262
+ render,
263
+ parameters: {
264
+ docs: {
265
+ description: {
266
+ story: "Same content as the first variant, but badges rendered at the larger `grid` size (64px icon height)."
267
+ }
268
+ }
269
+ }
270
+ };
271
+
272
+
273
+ // ─── 3. White, subtext, full badge grid ───────────────────────────────────────
274
+
275
+ export const WhiteFullGrid = {
276
+ name: "3. White — Subtext + Full Badge Grid",
277
+ args: {
278
+ background : "white",
279
+ layout : "grid",
280
+ carousel : false,
281
+ autoplay : false,
282
+ autoplayDelay: 4000,
283
+ headline,
284
+ subtext,
285
+ badges : allBadges
286
+ },
287
+ render,
288
+ parameters: {
289
+ docs: {
290
+ description: {
291
+ story: "White background with headline, subtext, and the full badge set."
292
+ }
293
+ }
294
+ }
295
+ };
296
+
297
+
298
+ // ─── 4. Tint background, subtext, 3 badges ────────────────────────────────────
299
+
300
+ export const TintThreeBadges = {
301
+ name: "4. Tint Background — 3 Badges",
302
+ args: {
303
+ background : "tint",
304
+ layout : "grid",
305
+ carousel : false,
306
+ autoplay : false,
307
+ autoplayDelay: 4000,
308
+ headline,
309
+ subtext,
310
+ badges : threeBadges
311
+ },
312
+ render,
313
+ parameters: {
314
+ docs: {
315
+ description: {
316
+ story: "Blue-tinted background, headline + subtext, reduced 3-badge set."
317
+ }
318
+ }
319
+ }
320
+ };
321
+
322
+
323
+ // ─── 5. Tint background, quote cards, static ──────────────────────────────────
324
+
325
+ export const TintQuoteCardsStatic = {
326
+ name: "5. Tint Background — Quote Cards (Static)",
327
+ args: {
328
+ background : "tint",
329
+ layout : "quotes",
330
+ carousel : false,
331
+ autoplay : false,
332
+ autoplayDelay: 4000,
333
+ headline,
334
+ subtext,
335
+ badges : threeBadgesWithQuotes
336
+ },
337
+ render,
338
+ parameters: {
339
+ docs: {
340
+ description: {
341
+ story: "All quote cards rendered side by side, no carousel/pagination, no card background."
342
+ }
343
+ }
344
+ }
345
+ };
346
+
347
+
348
+ // ─── 6. Tint background, quote cards, carousel (manual) ───────────────────────
349
+
350
+ export const TintQuoteCardsCarousel = {
351
+ name: "6. Tint Background — Quote Cards (Carousel, Manual)",
352
+ args: {
353
+ background : "tint",
354
+ layout : "quotes",
355
+ carousel : true,
356
+ autoplay : false,
357
+ autoplayDelay: 4000,
358
+ headline,
359
+ subtext,
360
+ badges : sixBadgesWithQuotes
361
+ },
362
+ render,
363
+ parameters: {
364
+ docs: {
365
+ description: {
366
+ story: "Two pages of 3 quote cards each, advanced by clicking a dot. Uses a sliding track with a CSS transition for smooth movement between pages."
367
+ }
368
+ }
369
+ }
370
+ };
371
+
372
+
373
+ // ─── 7. Tint background, quote cards, carousel + autoplay ─────────────────────
374
+
375
+ export const TintQuoteCardsCarouselAutoplay = {
376
+ name: "7. Tint Background — Quote Cards (Carousel, Autoplay)",
377
+ args: {
378
+ background : "tint",
379
+ layout : "quotes",
380
+ carousel : true,
381
+ autoplay : true,
382
+ autoplayDelay: 4000,
383
+ headline,
384
+ subtext,
385
+ badges : sixBadgesWithQuotes
386
+ },
387
+ render,
388
+ parameters: {
389
+ docs: {
390
+ description: {
391
+ story: "Two pages of 3 quote cards each, auto-advancing every `autoplayDelay` ms. Hover or focus inside the carousel to pause; it resumes when the pointer/focus leaves."
392
+ }
393
+ }
394
+ }
395
+ };
396
+
397
+
398
+ // ─── 8. Autoplay, fast delay ────────────────────────────────────────────────────
399
+
400
+ export const AutoplayFastDelay = {
401
+ name: "8. Autoplay — Fast Delay (1.5s)",
402
+ args: {
403
+ background : "tint",
404
+ layout : "quotes",
405
+ carousel : true,
406
+ autoplay : true,
407
+ autoplayDelay: 1500,
408
+ headline,
409
+ subtext,
410
+ badges : sixBadgesWithQuotes
411
+ },
412
+ render,
413
+ parameters: {
414
+ docs: {
415
+ description: {
416
+ story: "Autoplay at a fast delay across 2 pages, useful for visually confirming the page transition and pause-on-hover behavior quickly."
417
+ }
418
+ }
419
+ }
420
+ };
421
+
422
+
423
+ // ─── Edge cases ────────────────────────────────────────────────────────────────
424
+
425
+ export const SingleBadge = {
426
+ name: "Edge Case — Single Badge",
427
+ args: {
428
+ background : "white",
429
+ layout : "compact",
430
+ carousel : false,
431
+ autoplay : false,
432
+ autoplayDelay: 4000,
433
+ headline : shortHeadline,
434
+ subtext : "",
435
+ badges : [smallBadges[0]]
436
+ },
437
+ render,
438
+ parameters: {
439
+ docs: {
440
+ description: {
441
+ story: "Minimum edge case: a single badge, no crash or layout breakage."
442
+ }
443
+ }
444
+ }
445
+ };
446
+
447
+ export const NoBadges = {
448
+ name: "Edge Case — No Badges",
449
+ args: {
450
+ background : "white",
451
+ layout : "compact",
452
+ carousel : false,
453
+ autoplay : false,
454
+ autoplayDelay: 4000,
455
+ headline : shortHeadline,
456
+ subtext : "",
457
+ badges : []
458
+ },
459
+ render,
460
+ parameters: {
461
+ docs: {
462
+ description: {
463
+ story: "Headline/subtext/laurel render fine with an empty badges array."
464
+ }
465
+ }
466
+ }
467
+ };
468
+
469
+ export const CarouselFourBadges = {
470
+ name: "Edge Case — Carousel With 4 Quote Badges (2 + 2)",
471
+ args: {
472
+ background : "tint",
473
+ layout : "quotes",
474
+ carousel : true,
475
+ autoplay : false,
476
+ autoplayDelay: 4000,
477
+ headline,
478
+ subtext,
479
+ badges : sixBadgesWithQuotes.slice(0, 4)
480
+ },
481
+ render,
482
+ parameters: {
483
+ docs: {
484
+ description: {
485
+ story: "4 badges split into a page of 3 and a page of 2 — verifies the last, incomplete page still lays out correctly."
486
+ }
487
+ }
488
+ }
489
+ };
490
+
491
+ export const CarouselSingleSlideAutoplay = {
492
+ name: "Edge Case — Autoplay With Only 1 Page",
493
+ args: {
494
+ background : "tint",
495
+ layout : "quotes",
496
+ carousel : true,
497
+ autoplay : true,
498
+ autoplayDelay: 2000,
499
+ headline,
500
+ subtext,
501
+ badges : threeBadgesWithQuotes
502
+ },
503
+ render,
504
+ parameters: {
505
+ docs: {
506
+ description: {
507
+ story: "Autoplay is requested but there are only 3 badges (1 page) — the component should not start a timer, and no dots should render since there's nothing to paginate."
508
+ }
509
+ }
510
+ }
511
+ };
512
+
513
+ export const UnknownIconKey = {
514
+ name: "Edge Case — Unknown Icon Key",
515
+ args: {
516
+ background : "white",
517
+ layout : "compact",
518
+ carousel : false,
519
+ autoplay : false,
520
+ autoplayDelay: 4000,
521
+ headline : shortHeadline,
522
+ subtext : "",
523
+ badges : [{ id: "mystery", label: "Mystery Award", type: "dark", icon: "does-not-exist" }]
524
+ },
525
+ render,
526
+ parameters: {
527
+ docs: {
528
+ description: {
529
+ story: "An `icon` key with no matching `<bd-*-icon>` component falls back to a visible \"?\" placeholder instead of rendering nothing."
530
+ }
531
+ }
532
+ }
533
+ };
534
+
535
+ // ─── Badge sets specific to "All Variants — Stacked" ──────────────────────────
536
+
537
+ const fourBadges = [
538
+ { id: "pc-mag-1", label: "PC MAG Editors' Choice", type: "red", icon: "pc-mag" },
539
+ { id: "pc-mag-business-1", label: "PC Business Choice", type: "red", icon: "pc-mag-business" },
540
+ { id: "best-brands-1", label: "Best Brands 2024", type: "dark", icon: "best-brands" },
541
+ { id: "av-comparatives-1", label: "AV-Comparatives", type: "dark", icon: "av-comparatives" }
542
+ ];
543
+
544
+ const sevenBadges = [
545
+ { id: "pc-mag-2", label: "PC MAG Editors' Choice", type: "red", icon: "pc-mag" },
546
+ { id: "av-comparatives-2", label: "AV-Comparatives", type: "dark", icon: "av-comparatives" },
547
+ { id: "pc-mag-business-2", label: "PC Business Choice", type: "red", icon: "pc-mag-business" },
548
+ { id: "pc-mag-readers-2", label: "PC MAG Readers' Choice", type: "red", icon: "pc-mag-readers" },
549
+ { id: "pc-mag-2024-2", label: "PC Choice 2024", type: "red", icon: "pc-mag-2024" },
550
+ { id: "top-product-2", label: "AV-TEST Top Product", type: "red", icon: "top-product" },
551
+ { id: "pc-mag-3", label: "PC MAG Editors' Choice", type: "red", icon: "pc-mag" }
552
+ ];
553
+
554
+ const elevenBadges = [
555
+ { id: "pc-mag-4", label: "PC MAG Editors' Choice", type: "red", icon: "pc-mag" },
556
+ { id: "av-comparatives-3", label: "AV-Comparatives", type: "dark", icon: "av-comparatives" },
557
+ { id: "best-brands-2", label: "Best Brands 2024", type: "dark", icon: "best-brands" },
558
+ { id: "pc-mag-2024-3", label: "PC Choice 2024", type: "red", icon: "pc-mag-2024" },
559
+ { id: "pc-mag-readers-3", label: "PC MAG Readers' Choice", type: "red", icon: "pc-mag-readers" },
560
+ { id: "pc-mag-business-3", label: "PC Business Choice", type: "red", icon: "pc-mag-business" },
561
+ { id: "top-product-3", label: "AV-TEST Top Product", type: "red", icon: "top-product" },
562
+ { id: "pc-mag-5", label: "PC MAG Editors' Choice", type: "red", icon: "pc-mag" },
563
+ { id: "av-comparatives-4", label: "AV-Comparatives", type: "dark", icon: "av-comparatives" },
564
+ { id: "best-brands-3", label: "Best Brands 2024", type: "dark", icon: "best-brands" },
565
+ { id: "pc-mag-2024-4", label: "PC Choice 2024", type: "red", icon: "pc-mag-2024" }
566
+ ];
567
+
568
+
569
+ // ─── All Variants Stacked (matches the reference image) ───────────────────────
570
+
571
+ export const AllVariantsStacked = {
572
+ name : "All Variants — Stacked",
573
+ render: () => html`
574
+ <div
575
+ style="display: flex; flex-direction: column; gap: 24px; padding: 24px;"
576
+ >
577
+ <bd-awards-flex
578
+ background="white"
579
+ layout="compact"
580
+ headline=${shortHeadline}
581
+ .badges=${fourBadges}
582
+ ></bd-awards-flex>
583
+
584
+ <bd-awards-flex
585
+ background="white"
586
+ layout="compact"
587
+ headline=${shortHeadline}
588
+ .badges=${sevenBadges}
589
+ ></bd-awards-flex>
590
+
591
+ <bd-awards-flex
592
+ background="white"
593
+ layout="compact"
594
+ headline=${headline}
595
+ subtext=${subtext}
596
+ .badges=${elevenBadges}
597
+ ></bd-awards-flex>
598
+
599
+ <bd-awards-flex
600
+ background="tint"
601
+ layout="grid"
602
+ headline=${headline}
603
+ subtext=${subtext}
604
+ .badges=${threeBadges}
605
+ ></bd-awards-flex>
606
+
607
+ <bd-awards-flex
608
+ background="tint"
609
+ layout="quotes"
610
+ headline=${headline}
611
+ subtext=${subtext}
612
+ .badges=${threeBadgesWithQuotes}
613
+ ></bd-awards-flex>
614
+
615
+ <bd-awards-flex
616
+ background="tint"
617
+ layout="quotes"
618
+ carousel
619
+ autoplay
620
+ autoplay-delay="4000"
621
+ headline=${headline}
622
+ subtext=${subtext}
623
+ .badges=${sixBadgesWithQuotes}
624
+ ></bd-awards-flex>
625
+ </div>
626
+ `,
627
+ parameters: {
628
+ docs: {
629
+ description: {
630
+ story: "All six variants stacked vertically in one view. The first three (white background) show 4, 7, and 11 badges respectively — the badge row wraps automatically onto a second line once it runs out of horizontal space, no layout changes needed. The last three (tint background) are unchanged: grid badges, static quote cards, and the autoplaying 2-page carousel."
631
+ }
632
+ }
633
+ }
634
+ };
635
+ // ─── Playground ─────────────────────────────────────────────────────────────────
636
+
637
+ export const Playground = {
638
+ name: "Playground",
639
+ args: {
640
+ background : "tint",
641
+ layout : "quotes",
642
+ carousel : true,
643
+ autoplay : true,
644
+ autoplayDelay: 4000,
645
+ headline,
646
+ subtext,
647
+ badges : sixBadgesWithQuotes
648
+ },
649
+ render,
650
+ parameters: {
651
+ docs: {
652
+ description: {
653
+ story: "Fully interactive story. Use the Controls panel to switch `background`, `layout`, `carousel`, `autoplay`, `autoplayDelay`, and edit content/badges live."
654
+ }
655
+ }
656
+ }
657
+ };