@repobit/dex-system-design 0.25.12 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/CHANGELOG.md +187 -0
  2. package/README.md +131 -8
  3. package/package.json +95 -13
  4. package/schemas/component-manifest.json +3294 -405
  5. package/schemas/manifest-omissions.json +173 -0
  6. package/src/blog/src/breakpoints.js +6 -6
  7. package/src/blog/src/content/blog-atoms-showcase.js +1 -1
  8. package/src/blog/src/content/blog-page-layout.js +2 -2
  9. package/src/blog/src/lib/article-toc.js +7 -7
  10. package/src/blog/src/shell/blog-shell.js +1 -1
  11. package/src/blog/src/tokens/blog.js +2 -2
  12. package/src/blog/src/tokens/core.js +34 -35
  13. package/src/blog/src/tokens/legacy.js +0 -9
  14. package/src/blog/tokens/blog.js +2 -2
  15. package/src/blog/tokens/core.js +34 -35
  16. package/src/blog/tokens/legacy.js +0 -9
  17. package/src/blog/tokens.css +36 -46
  18. package/src/components/accordion/accordion-bg.css.js +83 -59
  19. package/src/components/accordion/accordion-bg.js +29 -10
  20. package/src/components/accordion/accordion-bg.stories.js +67 -67
  21. package/src/components/accordion/accordion-keyboard.js +80 -0
  22. package/src/components/accordion/accordion.css.js +142 -80
  23. package/src/components/accordion/accordion.js +37 -10
  24. package/src/components/accordion/accordion.stories.js +7 -7
  25. package/src/components/agent-endpoints/agent-endpoints.css.js +36 -39
  26. package/src/components/agent-endpoints/agent-endpoints.js +30 -20
  27. package/src/components/agent-endpoints/agent-endpoints.stories.js +1 -1
  28. package/src/components/ai-guardian-demo.stories.js +91 -91
  29. package/src/components/alert/alert.css.js +198 -0
  30. package/src/components/alert/alert.js +103 -0
  31. package/src/components/alert/alert.stories.js +206 -0
  32. package/src/components/anchor/anchor-nav.css.js +213 -101
  33. package/src/components/anchor/anchor-nav.js +26 -40
  34. package/src/components/anchor/anchor.stories.js +22 -12
  35. package/src/components/annotation/annotation.css.js +58 -0
  36. package/src/components/annotation/annotation.js +67 -0
  37. package/src/components/annotation/annotation.stories.js +63 -0
  38. package/src/components/architecture.stories.js +285 -0
  39. package/src/components/atoms.stories.js +342 -0
  40. package/src/components/avatar/avatar.css.js +67 -0
  41. package/src/components/avatar/avatar.js +42 -0
  42. package/src/components/avatar/avatar.stories.js +95 -0
  43. package/src/components/awards/awards-flex.css.js +209 -23
  44. package/src/components/awards/awards-flex.js +66 -7
  45. package/src/components/awards/awards-flex.stories.js +1 -1
  46. package/src/components/awards/{awards-light.stories.js → awards-summary.stories.js} +54 -64
  47. package/src/components/awards/awards.css.js +116 -58
  48. package/src/components/awards/awards.js +102 -28
  49. package/src/components/awards/awards.stories.js +1 -1
  50. package/src/components/back/back.css.js +51 -22
  51. package/src/components/back/back.js +28 -7
  52. package/src/components/back/back.stories.js +9 -3
  53. package/src/components/badge/badge.css.js +158 -46
  54. package/src/components/badge/badge.js +62 -74
  55. package/src/components/badge/badge.stories.js +176 -248
  56. package/src/components/bento-grid/bento-grid.css.js +21 -16
  57. package/src/components/bento-grid/bento-grid.js +16 -4
  58. package/src/components/bento-grid/bento-grid.stories.js +19 -18
  59. package/src/components/bento-grid/bento-item.css.js +52 -28
  60. package/src/components/bento-grid/bento-item.js +2 -2
  61. package/src/components/blockquote/blockquote.css.js +47 -0
  62. package/src/components/blockquote/blockquote.js +29 -0
  63. package/src/components/blockquote/blockquote.stories.js +62 -0
  64. package/src/components/breadcrumb/breadcrumb.css.js +92 -22
  65. package/src/components/breadcrumb/breadcrumb.js +56 -11
  66. package/src/components/button/button.css.js +531 -161
  67. package/src/components/button/button.js +206 -214
  68. package/src/components/button/button.stories.js +322 -174
  69. package/src/components/caption/caption.css.js +21 -0
  70. package/src/components/caption/caption.js +31 -0
  71. package/src/components/caption/caption.stories.js +62 -0
  72. package/src/components/card-features/card-features.css.js +14 -22
  73. package/src/components/card-features/card-features.js +68 -9
  74. package/src/components/card-features/card-features.stories.js +11 -11
  75. package/src/components/cards/card.css.js +60 -81
  76. package/src/components/cards/card.js +56 -25
  77. package/src/components/cards/card.stories.js +39 -39
  78. package/src/components/carousel/carousel.css.js +93 -99
  79. package/src/components/carousel/carousel.js +32 -4
  80. package/src/components/checkbox/checkbox.css.js +111 -93
  81. package/src/components/checkbox/checkbox.js +64 -90
  82. package/src/components/checkbox/checkbox.stories.js +96 -29
  83. package/src/components/code/code.css.js +70 -0
  84. package/src/components/code/code.js +40 -0
  85. package/src/components/code/code.stories.js +73 -0
  86. package/src/components/compare/compare.css.js +179 -43
  87. package/src/components/compare/compare.js +52 -25
  88. package/src/components/compare/compare.stories.js +61 -4
  89. package/src/components/comparison-panel/comparison-panel.css.js +38 -51
  90. package/src/components/comparison-panel/comparison-panel.js +5 -4
  91. package/src/components/comparison-panel/comparison-panel.stories.js +1 -1
  92. package/src/components/compatibility-table/compatibility-table.css.js +180 -80
  93. package/src/components/compatibility-table/compatibility-table.js +37 -9
  94. package/src/components/control-alignment.stories.js +393 -0
  95. package/src/components/cta-banner/cta-banner.css.js +41 -13
  96. package/src/components/cta-banner/cta-banner.js +6 -5
  97. package/src/components/cta-banner/cta-banner.stories.js +43 -98
  98. package/src/components/display/display.css.js +25 -1
  99. package/src/components/display/display.js +46 -13
  100. package/src/components/display/display.stories.js +270 -40
  101. package/src/components/divider/divider-horizontal.js +21 -5
  102. package/src/components/divider/divider-vertical.js +15 -7
  103. package/src/components/divider/divider.css.js +2 -2
  104. package/src/components/divider/divider.stories.js +38 -34
  105. package/src/components/dropdown/dropdown.css.js +93 -126
  106. package/src/components/dropdown/dropdown.js +114 -34
  107. package/src/components/dropdown/dropdown.stories.js +56 -24
  108. package/src/components/features/features.css.js +24 -11
  109. package/src/components/features/features.js +7 -3
  110. package/src/components/features/features.stories.js +37 -37
  111. package/src/components/features-tab/features-tab.css.js +19 -8
  112. package/src/components/features-tab/features-tab.js +6 -5
  113. package/src/components/features-tab/features-tab.stories.js +23 -23
  114. package/src/components/fieldset/fieldset.css.js +30 -0
  115. package/src/components/fieldset/fieldset.js +28 -0
  116. package/src/components/fieldset/fieldset.stories.js +84 -0
  117. package/src/components/footer/footer-links-group.css.js +10 -14
  118. package/src/components/footer/footer-links-group.js +4 -3
  119. package/src/components/footer/footer-lp.css.js +59 -30
  120. package/src/components/footer/footer-lp.js +17 -12
  121. package/src/components/footer/footer-lp.stories.js +63 -75
  122. package/src/components/footer/footer-nav-menu.css.js +26 -4
  123. package/src/components/footer/footer-nav-menu.js +3 -2
  124. package/src/components/footer/footer.css.js +146 -264
  125. package/src/components/footer/footer.js +176 -106
  126. package/src/components/footer/footer.stories.js +9 -9
  127. package/src/components/footer/localeMap.js +1 -1
  128. package/src/components/grid/grid.css.js +1 -1
  129. package/src/components/grid/grid.js +49 -7
  130. package/src/components/grid/grid.stories.js +111 -0
  131. package/src/components/header/header-code.css.js +61 -51
  132. package/src/components/header/header-code.js +28 -14
  133. package/src/components/header/header-code.stories.js +5 -5
  134. package/src/components/header/header.css.js +655 -176
  135. package/src/components/header/header.js +269 -36
  136. package/src/components/header/header.stories.js +841 -18
  137. package/src/components/heading/heading.css.js +14 -17
  138. package/src/components/heading/heading.js +48 -33
  139. package/src/components/heading/heading.stories.js +27 -25
  140. package/src/components/help-text/help-text.css.js +21 -0
  141. package/src/components/help-text/help-text.js +25 -0
  142. package/src/components/help-text/help-text.stories.js +66 -0
  143. package/src/components/highlight/highlight.css.js +86 -64
  144. package/src/components/highlight/highlight.js +18 -27
  145. package/src/components/highlight/highlight.stories.js +14 -3
  146. package/src/components/icons/analysis-icon.js +6 -16
  147. package/src/components/icons/arrow-down-icon.js +6 -19
  148. package/src/components/icons/arrow-icon.js +44 -0
  149. package/src/components/icons/arrow-right-icon.js +30 -23
  150. package/src/components/icons/arrow-up-icon.js +19 -18
  151. package/src/components/icons/bd-ai-icon.js +1 -1
  152. package/src/components/icons/brand-marks.stories.js +279 -0
  153. package/src/components/icons/brand-signature-icon.js +42 -0
  154. package/src/components/icons/check-icon.js +27 -0
  155. package/src/components/icons/circle-info-icon.js +33 -0
  156. package/src/components/icons/close-icon.js +6 -18
  157. package/src/components/icons/family-icon.js +8 -20
  158. package/src/components/icons/globe-icon.js +6 -18
  159. package/src/components/icons/guide-icon.js +6 -18
  160. package/src/components/icons/icon-element.js +99 -0
  161. package/src/components/icons/icons.js +36 -0
  162. package/src/components/icons/icons.stories.js +184 -52
  163. package/src/components/icons/individual-icon.js +6 -18
  164. package/src/components/icons/laurel-icon.js +9 -19
  165. package/src/components/icons/machine-learning-icon.js +6 -17
  166. package/src/components/icons/marks.js +41 -0
  167. package/src/components/icons/minus-icon.js +7 -21
  168. package/src/components/icons/missing-icon.js +52 -0
  169. package/src/components/icons/plus-icon.js +7 -21
  170. package/src/components/icons/quote-icon.js +19 -19
  171. package/src/components/image/image.css.js +72 -25
  172. package/src/components/image/image.js +11 -6
  173. package/src/components/image/image.stories.js +2 -2
  174. package/src/components/input/custom-form.stories.js +214 -62
  175. package/src/components/input/input-clipboard.css.js +51 -144
  176. package/src/components/input/input-clipboard.js +31 -15
  177. package/src/components/input/input.css.js +8 -146
  178. package/src/components/input/input.js +93 -38
  179. package/src/components/install-options/install-options.css.js +84 -77
  180. package/src/components/install-options/install-options.js +33 -30
  181. package/src/components/install-options/install-options.stories.js +3 -3
  182. package/src/components/label/label.css.js +35 -0
  183. package/src/components/label/label.js +38 -0
  184. package/src/components/label/label.stories.js +82 -0
  185. package/src/components/light-carousel/light-carousel.css.js +111 -63
  186. package/src/components/light-carousel/light-carousel.js +85 -11
  187. package/src/components/light-carousel/light-carousel.stories.js +126 -82
  188. package/src/components/link/link.css.js +150 -99
  189. package/src/components/link/link.js +86 -11
  190. package/src/components/link/link.stories.js +124 -30
  191. package/src/components/list/list-item/list-item.css.js +74 -22
  192. package/src/components/list/list-item/list-item.js +32 -10
  193. package/src/components/list/list-item/list-item.stories.js +23 -23
  194. package/src/components/list/list.css.js +8 -2
  195. package/src/components/list/list.js +3 -2
  196. package/src/components/list/list.stories.js +222 -0
  197. package/src/components/modal/modal.css.js +114 -24
  198. package/src/components/modal/modal.js +83 -7
  199. package/src/components/modal/modal.stories.js +9 -9
  200. package/src/components/overview/overview.css.js +19 -14
  201. package/src/components/overview/overview.js +6 -5
  202. package/src/components/overview/overview.stories.js +10 -10
  203. package/src/components/page-switcher/page-switcher.css.js +97 -40
  204. package/src/components/page-switcher/page-switcher.js +28 -5
  205. package/src/components/page-switcher/page-switcher.stories.js +95 -0
  206. package/src/components/paragraph/paragraph.css.js +15 -10
  207. package/src/components/paragraph/paragraph.js +41 -44
  208. package/src/components/paragraph/paragraph.stories.js +56 -21
  209. package/src/components/picture/picture.css.js +103 -44
  210. package/src/components/picture/picture.js +100 -30
  211. package/src/components/picture/picture.stories.js +1 -1
  212. package/src/components/pricing-cards/new-pricing-card.js +3 -3
  213. package/src/components/pricing-cards/new-pricing.css.js +24 -15
  214. package/src/components/pricing-cards/pricing-card-actions.css.js +1 -1
  215. package/src/components/pricing-cards/pricing-card-actions.js +3 -4
  216. package/src/components/pricing-cards/pricing-card-container.css.js +3 -3
  217. package/src/components/pricing-cards/pricing-card-container.js +3 -2
  218. package/src/components/pricing-cards/pricing-card-header.css.js +10 -8
  219. package/src/components/pricing-cards/pricing-card-header.js +6 -7
  220. package/src/components/pricing-cards/pricing-card-pricing.css.js +16 -9
  221. package/src/components/pricing-cards/pricing-card-pricing.js +8 -6
  222. package/src/components/pricing-cards/pricing-card-show-more.css.js +11 -3
  223. package/src/components/pricing-cards/pricing-card-show-more.js +8 -3
  224. package/src/components/pricing-cards/pricing-card.css.js +244 -190
  225. package/src/components/pricing-cards/pricing-card.js +54 -70
  226. package/src/components/pricing-cards/pricing-feature-item.css.js +25 -8
  227. package/src/components/pricing-cards/pricing-feature-item.js +8 -3
  228. package/src/components/process-steps/process-steps.css.js +26 -14
  229. package/src/components/process-steps/process-steps.js +23 -6
  230. package/src/components/process-steps/process-steps.stories.js +1 -1
  231. package/src/components/progress/progress.css.js +80 -0
  232. package/src/components/progress/progress.js +42 -0
  233. package/src/components/progress/progress.stories.js +79 -0
  234. package/src/components/quick-answer/quick-answer.css.js +75 -13
  235. package/src/components/quick-answer/quick-answer.js +8 -3
  236. package/src/components/radio/radio.css.js +92 -128
  237. package/src/components/radio/radio.js +106 -127
  238. package/src/components/radio/radio.stories.js +54 -19
  239. package/src/components/review/review-grid.css.js +5 -6
  240. package/src/components/review/review-grid.js +14 -11
  241. package/src/components/review/review.css.js +11 -6
  242. package/src/components/review/review.js +3 -8
  243. package/src/components/shared/ensemble.css.js +93 -0
  244. package/src/components/shared/form-field.css.js +206 -0
  245. package/src/components/shared/prop-vocabulary.js +48 -0
  246. package/src/components/shared/token-scales.js +306 -0
  247. package/src/components/skeleton/skeleton.css.js +34 -0
  248. package/src/components/skeleton/skeleton.js +32 -0
  249. package/src/components/skeleton/skeleton.stories.js +70 -0
  250. package/src/components/spinner/spinner.css.js +62 -0
  251. package/src/components/spinner/spinner.js +38 -0
  252. package/src/components/spinner/spinner.stories.js +92 -0
  253. package/src/components/spotlight-section/spotlight-section.css.js +14 -13
  254. package/src/components/spotlight-section/spotlight-section.js +42 -39
  255. package/src/components/switch/switch.css.js +103 -0
  256. package/src/components/switch/switch.js +44 -0
  257. package/src/components/switch/switch.stories.js +86 -0
  258. package/src/components/tab-list/content-switcher.stories.js +189 -0
  259. package/src/components/tab-list/tab-list.css.js +250 -0
  260. package/src/components/tab-list/tab-list.js +184 -0
  261. package/src/components/tab-list/tab-list.stories.js +221 -0
  262. package/src/components/tabs/tabs.css.js +14 -123
  263. package/src/components/tabs/tabs.js +16 -19
  264. package/src/components/tabs/tabs.stories.js +95 -95
  265. package/src/components/tag/tag.css.js +54 -0
  266. package/src/components/tag/tag.js +32 -0
  267. package/src/components/tag/tag.stories.js +126 -0
  268. package/src/components/terminal/terminal-message.css.js +164 -60
  269. package/src/components/terminal/terminal-message.js +5 -5
  270. package/src/components/terminal/terminal-message.stories.js +70 -1
  271. package/src/components/termsOfUse/terms.css.js +25 -20
  272. package/src/components/termsOfUse/terms.js +13 -9
  273. package/src/components/termsOfUse/terms.stories.js +1 -1
  274. package/src/components/textarea/textarea.css.js +51 -0
  275. package/src/components/textarea/textarea.js +136 -0
  276. package/src/components/textarea/textarea.stories.js +191 -0
  277. package/src/components/tooltip/tooltip.css.js +75 -0
  278. package/src/components/tooltip/tooltip.js +156 -0
  279. package/src/components/tooltip/tooltip.stories.js +161 -0
  280. package/src/components/trust-panel/trust-panel.css.js +85 -33
  281. package/src/components/trust-panel/trust-panel.js +18 -10
  282. package/src/components/trust-panel/trust-panel.stories.js +1 -1
  283. package/src/components/ultimate-security-demo.stories.js +431 -0
  284. package/src/components/video/video.css.js +17 -0
  285. package/src/components/video/video.js +40 -0
  286. package/src/components/video/video.stories.js +106 -0
  287. package/src/components/video-player/video-player.css.js +67 -11
  288. package/src/components/video-player/video-player.js +35 -4
  289. package/src/components/video-player/video-player.stories.js +1 -1
  290. package/src/components/visual-alignment.stories.js +411 -0
  291. package/src/components/visually-hidden/visually-hidden.css.js +24 -0
  292. package/src/components/visually-hidden/visually-hidden.js +16 -0
  293. package/src/components/visually-hidden/visually-hidden.stories.js +56 -0
  294. package/src/stories/Button.stories.js +17 -17
  295. package/src/stories/Header.stories.js +10 -10
  296. package/src/stories/Page.js +1 -1
  297. package/src/stories/Page.stories.js +6 -6
  298. package/src/tokens/borders.stories.js +339 -0
  299. package/src/tokens/color-responsibilities.stories.js +227 -0
  300. package/src/tokens/dark-derivation.js +309 -0
  301. package/src/tokens/dark-findings.js +197 -0
  302. package/src/tokens/dark-mode.stories.js +207 -0
  303. package/src/tokens/dimension.stories.js +251 -0
  304. package/src/tokens/elevation.stories.js +143 -0
  305. package/src/tokens/focus.stories.js +276 -0
  306. package/src/tokens/fonts.css +20 -20
  307. package/src/tokens/fonts.stories.js +354 -374
  308. package/src/tokens/layout.css +25 -11
  309. package/src/tokens/motion.stories.js +231 -0
  310. package/src/tokens/shape.stories.js +272 -0
  311. package/src/tokens/spacing-rhythm.stories.js +359 -0
  312. package/src/tokens/spacing.stories.js +208 -703
  313. package/src/tokens/story-chrome.js +503 -0
  314. package/src/tokens/surfaces.stories.js +224 -0
  315. package/src/tokens/text-on-surface.stories.js +164 -0
  316. package/src/tokens/token-map.js +220 -0
  317. package/src/tokens/token-map.stories.js +257 -0
  318. package/src/tokens/token-purposes.js +266 -0
  319. package/src/tokens/tokens-grid.stories.js +388 -900
  320. package/src/tokens/tokens.css +1633 -1045
  321. package/src/tokens/tokens.js +1130 -492
  322. package/src/tokens/tokens.stories.js +137 -47
  323. package/src/tokens/type-ceiling-words.js +299 -0
  324. package/src/tokens/typography.stories.js +1003 -965
  325. package/src/tokens/vertical-rhythm.stories.js +224 -0
  326. package/src/components/awards/awards-icon.js +0 -56
  327. package/src/components/awards/awards-light.js +0 -240
  328. package/src/components/banner/banner.js +0 -60
  329. package/src/components/banner/banner.stories.js +0 -51
  330. package/src/components/button/icons.js +0 -24
  331. package/src/components/input/index.js +0 -0
  332. package/src/components/light-carousel/light-carousel-simple.css.js +0 -183
  333. package/src/components/light-carousel/light-carousel-simple.js +0 -74
  334. package/src/tokens/colors.js +0 -121
  335. package/src/tokens/typography.css.js +0 -207
  336. package/src/tokens/typography.js +0 -0
@@ -1,4 +1,5 @@
1
- import { css } from "lit";
1
+ import { css, unsafeCSS } from "lit";
2
+ import { below } from "../shared/token-scales.js";
2
3
 
3
4
  export const awardsFlexCSS = css`
4
5
  .bd-awardsflex-root {
@@ -8,22 +9,57 @@ export const awardsFlexCSS = css`
8
9
  gap: var(--spacing-8);
9
10
  width: 100%;
10
11
  box-sizing: border-box;
11
- padding: var(--spacing-32);
12
- border-radius: var(--radius-2xl, 16px);
12
+ padding-block: var(--spacing-32);
13
+ border-radius: var(--radius-2xl);
13
14
  text-align: center;
14
15
  font-family: var(--typography-fontFamily-sans);
15
16
  min-height: var(--bd-awardsflex-min-height, 320px);
16
17
  }
17
18
 
18
19
  .bd-awardsflex-root--white {
19
- background: var(--color-neutral-0, #fff);
20
- border: var(--spacing-2) solid var(--color-blue-50);
21
- border-radius: var(--spacing-20);
22
- padding: var(--spacing-64) var(--spacing-32) var(--spacing-64) var(--spacing-32);
20
+ background: var(--color-surface-default);
21
+ /* --border-width-2, not --spacing-2. Same 2px at a 16px root and not the
22
+ same thing: --spacing-* is rem and --border-width-* is px, so this edge
23
+ measured 3px for a reader at a 24px root while every other border in the
24
+ package held still. A border width is a fixed optical weight, not a
25
+ distance that should grow with the text it surrounds -- the same
26
+ argument CLAUDE.md makes for the carousel arrow, running the other way.
27
+
28
+ --color-border-container for the colour, and --color-blue-50 was the
29
+ second half of the same problem: a primitive doing a border role's job.
30
+ No border role resolves to blue-50 -- the three roles that carry that
31
+ value are all SURFACES, so adopting one would have been the category
32
+ error CLAUDE.md names outright. This is the role five other
33
+ edge-drawing objects in the package already use.
34
+
35
+ Measured against the page ground this section sits on:
36
+
37
+ --color-blue-50 1.080:1 the primitive, today
38
+ --color-border-container 1.287:1 the role, and the smallest change
39
+ --color-border-subtle 1.664:1
40
+ --status-brand-border 1.727:1 a real BRAND border role
41
+ --color-border-brand 4.534:1
42
+
43
+ --status-brand-border was the interesting alternative, because it keeps
44
+ the blue and is a legitimate border role. Rejected on two counts: it
45
+ would make this the only section in the package with a brand-coloured
46
+ frame, a fresh divergence rather than a fix, and at 1.727:1 it is a far
47
+ larger visible change than the defect warrants.
48
+
49
+ The blue was probably meant to echo the tint variant, whose ground is
50
+ this same blue-50 -- but that echo does no perceptual work. Looked at on
51
+ screen, a 1.080:1 edge on white reads as a faint neutral hairline with no
52
+ blue in it, so what is lost is a relationship nobody can see and what is
53
+ gained is a line that means something. Visible: the hairline becomes
54
+ slightly more definite. */
55
+ border: var(--border-width-2) solid var(--color-border-container);
56
+ border-radius: var(--radius-2xl);
57
+ padding-block: var(--spacing-64);
23
58
  }
24
59
 
25
- .bd-awardsflex-root--tint {
26
- background: var(--color-blue-50, #eef4ff);
60
+ /* the tint runs full-bleed on the host; the root inside it is the column */
61
+ :host([background="tint"]) {
62
+ background: var(--status-brand-surface);
27
63
  }
28
64
 
29
65
  /* === LAUREL ICON (always centered, above the headline) === */
@@ -31,6 +67,19 @@ export const awardsFlexCSS = css`
31
67
  display: flex;
32
68
  align-items: center;
33
69
  justify-content: center;
70
+ /* no role: the laurel wreath, same decision as awards.css.js's laurel and
71
+ as highlight.css.js's deco shapes -- ornament, so an ink role is the
72
+ wrong family. This div is a currentColor carrier for bd-laurel-icon or a
73
+ slotted mark.
74
+ .
75
+ --color-blue-500 is the brand blue, and a primitive because no blue-500
76
+ role means ink: they are all surfaces, borders, actions, the indicator
77
+ underline, or status fills.
78
+ .
79
+ This one sits on both grounds the component has. Against the white root,
80
+ 6.18:1 -> 4.53:1; against the tint variant's blue-50 host, 5.72:1 ->
81
+ 4.20:1. Both clear the 3:1 non-text minimum, and a decorative graphic
82
+ has no minimum at all. */
34
83
  color: var(--color-blue-500);
35
84
  margin-bottom: var(--spacing-8);
36
85
  }
@@ -44,12 +93,11 @@ export const awardsFlexCSS = css`
44
93
  }
45
94
 
46
95
  .bd-awardsflex-headline {
47
- color: var(--color-neutral-1000);
48
96
  margin: 0;
49
97
  }
50
98
 
51
99
  .bd-awardsflex-subtext {
52
- color: var(--color-neutral-600);
100
+ color: var(--color-text-muted);
53
101
  max-width: 640px;
54
102
  margin: 0; /* was: margin: 0 0 var(--spacing-8); */
55
103
  }
@@ -114,44 +162,182 @@ export const awardsFlexCSS = css`
114
162
  }
115
163
 
116
164
  .bd-awardsflex-quote-text {
117
- font-size: var(--typography-fontSize-sm);
165
+ /* A pull quote is supporting body copy, and it wraps -- three lines at the
166
+ widths this renders at. It was asking for the 14px primitive and taking
167
+ its leading from whatever it sat inside, which was the browser's own. */
168
+ font-size: var(--typography-body-small-fontSize);
169
+ font-weight: var(--typography-body-small-fontWeight);
170
+ line-height: var(--typography-body-small-lineHeight);
171
+ letter-spacing: var(--typography-body-small-letterSpacing);
172
+ font-family: var(--typography-body-small-fontFamily);
118
173
  font-style: italic;
119
- color: var(--color-neutral-800);
174
+ /* Pull quote: supporting, not primary. */
175
+ color: var(--color-text-secondary);
120
176
  margin: 0;
121
177
  }
122
178
 
123
179
  .bd-awardsflex-quote-source {
180
+ /* no role: 12px text that no role in the vocabulary describes. The checker
181
+ recommends body-xsmall here and that recommendation is wrong, which is
182
+ worth writing down because it has recurred through the NEEDS_ROLE and
183
+ HAS_ROLE batches: body-xsmall declares fontSize and nothing else, so it
184
+ matches ANY one-axis 12px declaration trivially, on size alone. It is not
185
+ an incomplete role waiting to be finished -- tokens.js says it is
186
+ deliberately size-only, and it exists for bd-p variant="xsmall", which
187
+ composes it with body-small's weight, leading and tracking. This element
188
+ is not a bd-p, so borrowing that token would claim a composition it has
189
+ no half of.
190
+ .
191
+ The complete roles at this step do not fit either. label-small,
192
+ caption-default and caption-small all declare fontFamily-sans, and four
193
+ of the five sites this argument covers are IBM Plex Mono -- adopting one
194
+ would change the face. caption-default additionally declares a colour,
195
+ the only role in the vocabulary that does.
196
+ .
197
+ So: the size stays a primitive and says why. The other four sites are
198
+ .bd-headercode-breadcrumb, .bd-headercode-badge,
199
+ .bd-terminalmsg-panel-label and .bd-terminalmsg-hint. */
124
200
  font-size: var(--typography-fontSize-xs);
125
- color: var(--color-neutral-500);
201
+ /* same as the quick-answer labels: subtle reads at 4.33:1 on this tint. */
202
+ color: var(--color-text-muted);
126
203
  margin: 0;
127
204
  }
128
205
 
129
206
  /* === DOTS === */
207
+ /* Dots and the pause control share one row; the dots keep their own spacing
208
+ so the treatment is unchanged when no control is shown. */
209
+ .bd-awardsflex-controls {
210
+ display: flex;
211
+ align-items: center;
212
+ gap: var(--spacing-16);
213
+ }
214
+
130
215
  .bd-awardsflex-dots {
131
216
  display: flex;
132
- gap: var(--spacing-8);
217
+ /* The buttons below carry their own 24px of target, so the space between
218
+ two dots now comes from the boxes rather than from a gap. Adding one on
219
+ top would push them apart without making either easier to hit. */
220
+ gap: 0;
221
+ margin-top: var(--spacing-8);
222
+ }
223
+
224
+ .bd-awardsflex-autoplay-toggle {
133
225
  margin-top: var(--spacing-8);
226
+ padding: var(--spacing-2) var(--spacing-8);
227
+ background: transparent;
228
+ border: var(--border-width-1) solid var(--color-border-default);
229
+ border-radius: var(--radius-full);
230
+ color: var(--color-text-muted);
231
+ font-family: var(--typography-fontFamily-sans);
232
+ /* no role: four roles sit at this size and each fails differently, so the
233
+ size stays a primitive. Note the weight is not declared here at all --
234
+ it inherits 400 -- which is why two of these are about what adopting a
235
+ role would ADD.
236
+ .
237
+ caption-default matches every value exactly, including the colour token:
238
+ xs / 400 / 1.5 / tracking 0 / sans, and its own colour axis is
239
+ --color-text-muted, which is what this rule already declares two lines
240
+ up. It renders as the same pixels. It is declined anyway, because
241
+ vertical-rhythm.stories.js documents it as "text under an image or a
242
+ figure" and this is the visible label of a toggle button. A
243
+ five-axis-plus-colour identity is the most seductive form of choosing a
244
+ role by its value rather than its meaning -- not an exemption from
245
+ CLAUDE.md's rule against that, but the case the rule is for.
246
+ .
247
+ caption-small carries the same wrong meaning and adds
248
+ letterSpacing-wide, which has no job on a five-letter word.
249
+ .
250
+ label-small is the right family -- "a small label: a badge, a tag, a
251
+ field hint" -- but the wrong result: it would declare a weight of 500
252
+ where nothing is declared today, and add wide tracking, making the
253
+ control bolder and 2.2px wider. This control is deliberately recessive:
254
+ muted, 2px of vertical padding, sitting beside the carousel dots as
255
+ chrome whose job is not to compete with the quote cards. Adopting a role
256
+ should not invert that.
257
+ .
258
+ control-label-small is the right meaning -- built for the name of a
259
+ control -- and fails on the leading. See the line below. */
260
+ font-size: var(--typography-fontSize-xs);
261
+ /* no role: and this leading in particular cannot move. The line box is
262
+ 18px, which with 2px of padding and a 1px border makes the button
263
+ exactly 24px -- the same 24px as the .bd-awardsflex-dot buttons it shares
264
+ a row with, which are 24 square deliberately for the WCAG 2.5.8 target
265
+ size the comment further down explains.
266
+ .
267
+ control-label-small would take the line box to 15px and the button to
268
+ 21px, misaligning it from the dots. Its tight leading exists for controls
269
+ whose height is DERIVED from padding + fontSize x lineHeight, the way
270
+ form-field computes one. This button's height is not derived -- it is
271
+ matched to a sibling. So the constraint is a pixel alignment between two
272
+ controls in one row, and nothing else in this file says so: a later pass
273
+ adopting control-label-small on meaning alone would quietly break the
274
+ row. */
275
+ line-height: var(--typography-lineHeight-normal);
276
+ cursor: pointer;
277
+ }
278
+
279
+ .bd-awardsflex-autoplay-toggle:hover {
280
+ color: var(--color-text-primary);
281
+ border-color: var(--color-border-strong);
282
+ }
283
+
284
+ .bd-awardsflex-autoplay-toggle:focus-visible {
285
+ /* the one focus ring — see Foundations/Focus */
286
+ outline: none;
287
+ box-shadow: var(--focus-outline-primary);
288
+ border-radius: var(--focus-outline-radius);
134
289
  }
135
290
 
291
+ /* An 8px dot was an 8px target, which is a third of what WCAG 2.5.8 asks and
292
+ close enough to its neighbour that the 24px circles would have overlapped
293
+ as well. The button is the target and the dot is only what you see, so the
294
+ button is 24 square and the dot is drawn inside it at the size it always
295
+ was. Nothing about the component looks bigger; the part you can hit does. */
136
296
  .bd-awardsflex-dot {
297
+ width: var(--dimension-24);
298
+ height: var(--dimension-24);
299
+ display: grid;
300
+ place-items: center;
301
+ border: none;
302
+ background: transparent;
303
+ padding: 0;
304
+ cursor: pointer;
305
+ }
306
+
307
+ .bd-awardsflex-dot::before {
308
+ content: "";
137
309
  width: var(--spacing-8);
138
310
  height: var(--spacing-8);
139
311
  border-radius: 50%;
140
- border: none;
141
312
  background: var(--color-neutral-300);
142
- padding: 0;
143
- cursor: pointer;
144
- transition: background 0.2s ease, transform 0.2s ease;
313
+ transition: background var(--transition-duration-normal) var(--transition-easing-ease),
314
+ transform var(--transition-duration-normal) var(--transition-easing-ease);
145
315
  }
146
316
 
147
- .bd-awardsflex-dot.active {
148
- background: var(--color-blue-500);
317
+ .bd-awardsflex-dot.active::before {
318
+ /* The current slide's mark, and it takes the indicator role now that the
319
+ role is not named for a shape. --indicator-color IS blue-500, so nothing
320
+ moves; what changes is that this dot and the tab/nav underlines can no
321
+ longer drift apart, which is the reason the role exists.
322
+ .
323
+ The geometry stays local on purpose: an underline slides its width, a dot
324
+ scales, so --indicator-underline-height and its transition are not this
325
+ component's to borrow. */
326
+ background: var(--indicator-color);
149
327
  transform: scale(1.2);
150
328
  }
151
329
 
152
- @media (max-width: 599px) {
330
+ .bd-awardsflex-dot:focus-visible {
331
+ /* the one focus ring — see Foundations/Focus. It follows the target, not
332
+ the dot, so keyboard focus is visible at the size the button really is. */
333
+ outline: none;
334
+ box-shadow: var(--focus-outline-primary);
335
+ border-radius: var(--radius-full);
336
+ }
337
+
338
+ @media ${unsafeCSS(below('sm'))} {
153
339
  .bd-awardsflex-root {
154
- padding: var(--spacing-24);
340
+ padding-block: var(--spacing-24);
155
341
  gap: var(--spacing-8);
156
342
  min-height: var(--bd-awardsflex-min-height-mobile, 280px);
157
343
  }
@@ -8,14 +8,17 @@ import "../icons/pc-mag-business-icon.js";
8
8
  import "../icons/pc-mag-icon.js";
9
9
  import "../icons/pc-mag-readers-icon.js";
10
10
  import "../icons/top-product-icon.js";
11
+ import "../heading/heading.js";
12
+ import "../paragraph/paragraph.js";
11
13
  import { awardsFlexCSS } from "./awards-flex.css.js";
14
+ import { ensembleCSS } from "../shared/ensemble.css.js";
12
15
 
13
16
 
14
17
  const GROUP_SIZE = 3; // how many quote cards are visible per carousel page
15
18
 
16
19
  export class AwardsFlex extends LitElement {
17
20
  static properties = {
18
- background : { type: String },
21
+ background : { type: String, reflect: true },
19
22
  layout : { type: String },
20
23
  carousel : { type: Boolean },
21
24
  autoplay : { type: Boolean },
@@ -24,10 +27,12 @@ export class AwardsFlex extends LitElement {
24
27
  subtext : { type: String },
25
28
  badges : { type: Array },
26
29
  _slide : { state: true },
27
- _paused : { state: true }
30
+ _paused : { state: true },
31
+ _userStopped : { state: true },
32
+ _reduceMotion: { state: true }
28
33
  };
29
34
 
30
- static styles = [tokens, awardsFlexCSS];
35
+ static styles = [tokens, ensembleCSS, awardsFlexCSS];
31
36
 
32
37
  constructor() {
33
38
  super();
@@ -41,16 +46,31 @@ export class AwardsFlex extends LitElement {
41
46
  this.badges = [];
42
47
  this._slide = 0;
43
48
  this._paused = false;
49
+ /* Hover/focus pause is transient. A user who presses Stop means it, and
50
+ must not have it undone by the pointer leaving the carousel — so the two
51
+ are separate pieces of state. */
52
+ this._userStopped = false;
53
+ this._reduceMotion = false;
44
54
  this._timer = null;
45
55
  }
46
56
 
47
57
  connectedCallback() {
48
58
  super.connectedCallback();
59
+ /* WCAG 2.2.2: content that moves on its own must be pausable, and under
60
+ prefers-reduced-motion it should not start at all. Watched rather than
61
+ read once, so a reader who changes the setting is honoured live. */
62
+ if (typeof window !== "undefined" && window.matchMedia) {
63
+ this._motionQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
64
+ this._reduceMotion = this._motionQuery.matches;
65
+ this._onMotionChange = () => { this._reduceMotion = this._motionQuery.matches; };
66
+ this._motionQuery.addEventListener("change", this._onMotionChange);
67
+ }
49
68
  this._maybeStartAutoplay();
50
69
  }
51
70
 
52
71
  disconnectedCallback() {
53
72
  super.disconnectedCallback();
73
+ this._motionQuery?.removeEventListener("change", this._onMotionChange);
54
74
  this._stopAutoplay();
55
75
  }
56
76
 
@@ -60,7 +80,9 @@ export class AwardsFlex extends LitElement {
60
80
  changed.has("carousel") ||
61
81
  changed.has("layout") ||
62
82
  changed.has("badges") ||
63
- changed.has("_paused")
83
+ changed.has("_paused") ||
84
+ changed.has("_userStopped") ||
85
+ changed.has("_reduceMotion")
64
86
  ) {
65
87
  // if the badge set shrank, make sure the current slide index is still valid
66
88
  if (this._slide >= this._slidesCount) {
@@ -90,7 +112,9 @@ export class AwardsFlex extends LitElement {
90
112
  this.carousel &&
91
113
  this.layout === "quotes" &&
92
114
  this._slidesCount > 1 &&
93
- !this._paused;
115
+ !this._paused &&
116
+ !this._userStopped &&
117
+ !this._reduceMotion;
94
118
 
95
119
  if (!canAutoplay) return;
96
120
 
@@ -114,6 +138,15 @@ export class AwardsFlex extends LitElement {
114
138
  if (this.autoplay) this._paused = false;
115
139
  }
116
140
 
141
+ _toggleAutoplay() {
142
+ this._userStopped = !this._userStopped;
143
+ }
144
+
145
+ /** True when the carousel is actually able to move on its own. */
146
+ get _autoplayOffered() {
147
+ return this.autoplay && this.carousel && this.layout === "quotes" && this._slidesCount > 1;
148
+ }
149
+
117
150
  _goTo(i) {
118
151
  this._slide = i;
119
152
  }
@@ -169,9 +202,33 @@ export class AwardsFlex extends LitElement {
169
202
  `;
170
203
  }
171
204
 
205
+ /**
206
+ * The pause/stop control WCAG 2.2.2 requires of anything that starts moving
207
+ * on its own and keeps going. Hovering or focusing the carousel already
208
+ * paused it, but that is not a mechanism a keyboard or touch user can rely
209
+ * on, and it cannot express "leave it stopped".
210
+ *
211
+ * Its name states the action it performs, which is what a screen reader
212
+ * announces on focus. It sits beside the dots rather than inside them: that
213
+ * container is a tablist and a plain button is not a valid child of one.
214
+ */
215
+ _renderAutoplayToggle() {
216
+ if (!this._autoplayOffered) return nothing;
217
+ const stopped = this._userStopped || this._reduceMotion;
218
+ return html`
219
+ <button
220
+ type="button"
221
+ class="bd-awardsflex-autoplay-toggle"
222
+ @click=${this._toggleAutoplay}
223
+ aria-label=${stopped ? "Play slideshow" : "Pause slideshow"}
224
+ >${stopped ? "Play" : "Pause"}</button>
225
+ `;
226
+ }
227
+
172
228
  _renderDots() {
173
229
  if (!this.carousel || this._slidesCount < 2) return nothing;
174
230
  return html`
231
+ <div class="bd-awardsflex-controls">
175
232
  <div class="bd-awardsflex-dots" role="tablist" aria-label="Slide navigation">
176
233
  ${this._groups.map(
177
234
  (_, i) => html`
@@ -185,6 +242,8 @@ export class AwardsFlex extends LitElement {
185
242
  `
186
243
  )}
187
244
  </div>
245
+ ${this._renderAutoplayToggle()}
246
+ </div>
188
247
  `;
189
248
  }
190
249
 
@@ -227,7 +286,7 @@ export class AwardsFlex extends LitElement {
227
286
  }
228
287
 
229
288
  render() {
230
- const rootClasses = `bd-awardsflex-root bd-awardsflex-root--${this.background} bd-awardsflex-root--${this.layout}`;
289
+ const rootClasses = `bd-ensemble bd-awardsflex-root bd-awardsflex-root--${this.background} bd-awardsflex-root--${this.layout}`;
231
290
 
232
291
  return html`
233
292
  <section class="${rootClasses}" aria-label="Awards and recognition">
@@ -239,7 +298,7 @@ export class AwardsFlex extends LitElement {
239
298
  ? html`<bd-h as="h3" class="bd-awardsflex-headline">${this.headline}</bd-h>`
240
299
  : nothing}
241
300
  ${this.subtext
242
- ? html`<bd-p kind="large" class="bd-awardsflex-subtext">${this.subtext}</bd-p>`
301
+ ? html`<bd-p variant="large" class="bd-awardsflex-subtext">${this.subtext}</bd-p>`
243
302
  : nothing}
244
303
  </div>
245
304
  `
@@ -4,7 +4,7 @@ import "../paragraph/paragraph.js";
4
4
  import "./awards-flex.js";
5
5
 
6
6
  export default {
7
- title : "Components/Awards Flex",
7
+ title : "Modules/Awards Flex",
8
8
  component : "bd-awards-flex",
9
9
  tags : ["autodocs"],
10
10
  parameters: {
@@ -3,23 +3,24 @@ import "../heading/heading.js";
3
3
  import "../image/image.js";
4
4
  import "../link/link.js";
5
5
  import "../paragraph/paragraph.js";
6
- import "./awards-light.js";
7
6
  import "./awards.js";
8
7
 
9
8
  export default {
10
- title : "Components/Awards Section Light",
11
- component : "bd-awards-section-light",
9
+ title : "Modules/Awards Section — Summary",
10
+ component : "bd-awards-section",
12
11
  tags : ["autodocs"],
13
12
  parameters: {
14
13
  layout: "fullscreen",
15
14
  docs : {
16
15
  description: {
17
16
  component: `
18
- **AwardsSectionLight** is a lightweight variant of the AwardsSection component that renders only the trust banner and award badges — without the "What's our secret" section or feature cards.
17
+ \`bd-awards-section\` with \`content="summary"\`: the trust banner and award badges only, without the "What's our secret" section or the feature cards.
18
+
19
+ This was a separate element, \`bd-awards-section-light\`, until P6E.1B. It was a fork of the same component with the same responsibility, so the difference is now stated as content scope rather than as a second custom element.
19
20
 
20
21
  ### Usage
21
22
  \`\`\`html
22
- <bd-awards-section-light></bd-awards-section-light>
23
+ <bd-awards-section content="summary"></bd-awards-section>
23
24
  \`\`\`
24
25
 
25
26
  ### Attributes
@@ -32,7 +33,7 @@ export default {
32
33
 
33
34
  ### Badge object shape
34
35
  \`\`\`js
35
- { id: string, label: string, type: "red" | "dark", format: "svg", src: string }
36
+ { tag: string, id: string, label: string, type: "red" | "dark" }
36
37
  \`\`\`
37
38
  `
38
39
  }
@@ -58,7 +59,7 @@ export default {
58
59
  control : "object",
59
60
  description: "Array of award badge objects",
60
61
  table : {
61
- type : { summary: "Array<{ id, label, type, format, src }>" },
62
+ type : { summary: "Array<{ tag, id, label, type }>" },
62
63
  category: "Badges"
63
64
  }
64
65
  }
@@ -74,64 +75,57 @@ const defaultArgs = {
74
75
  subtext : "We've added 25 new accolades in the past two years to the hundreds we have won since we started in 2001 - so you know you are in good hands.",
75
76
  desktopAwards: [
76
77
  {
77
- label : "PC MAG\nEDITORS' CHOICE",
78
- type : "red",
79
- format: "svg",
80
- src : "/assets/pc-mag.svg",
81
- id : "pc-mag"
78
+ label: "PC MAG\nEDITORS' CHOICE",
79
+ type : "red",
80
+ tag : "bd-pc-mag-icon",
81
+ id : "pc-mag"
82
82
  },
83
83
  {
84
- label : "AV\ncomparatives",
85
- type : "dark",
86
- format: "svg",
87
- src : "/assets/av-comparatives.svg",
88
- id : "av-comparatives"
84
+ label: "AV\ncomparatives",
85
+ type : "dark",
86
+ tag : "bd-av-comparatives-icon",
87
+ id : "av-comparatives"
89
88
  },
90
89
  {
91
- label : "Best\nBrands\n2024",
92
- type : "dark",
93
- format: "svg",
94
- src : "/assets/best-brands.svg",
95
- id : "best-brands"
90
+ label: "Best\nBrands\n2024",
91
+ type : "dark",
92
+ tag : "bd-best-brands-icon",
93
+ id : "best-brands"
96
94
  },
97
95
  {
98
- label : "PC\nChoice\n2024",
99
- type : "red",
100
- format: "svg",
101
- src : "/assets/pc-mag-2024.svg",
102
- id : "pc-mag-2024"
96
+ label: "PC\nChoice\n2024",
97
+ type : "red",
98
+ tag : "bd-pc-mag-2024-icon",
99
+ id : "pc-mag-2024"
103
100
  },
104
101
  {
105
- label : "PC MAG\nREADERS'\nCHOICE",
106
- type : "red",
107
- format: "svg",
108
- src : "/assets/pc-mag-readers.svg",
109
- id : "pc-mag-readers"
102
+ label: "PC MAG\nREADERS'\nCHOICE",
103
+ type : "red",
104
+ tag : "bd-pc-mag-readers-icon",
105
+ id : "pc-mag-readers"
110
106
  },
111
107
  {
112
- label : "PC\nBusiness\nChoice",
113
- type : "red",
114
- format: "svg",
115
- src : "/assets/pc-mag-business.svg",
116
- id : "pc-mag-business"
108
+ label: "PC\nBusiness\nChoice",
109
+ type : "red",
110
+ tag : "bd-pc-mag-business-icon",
111
+ id : "pc-mag-business"
117
112
  },
118
113
  {
119
- label : "AV\nTEST\nTOP\nPRODUCT",
120
- type : "red",
121
- format: "svg",
122
- src : "/assets/top-product.svg",
123
- id : "top-product"
114
+ label: "AV\nTEST\nTOP\nPRODUCT",
115
+ type : "red",
116
+ tag : "bd-top-product-icon",
117
+ id : "top-product"
124
118
  }
125
119
  ]
126
120
  };
127
121
 
128
122
  const render = (args) => html`
129
- <bd-awards-section-light
123
+ <bd-awards-section content="summary"
130
124
  .tagline=${args.tagline}
131
125
  .headline=${args.headline}
132
126
  .subtext=${args.subtext}
133
127
  .desktopAwards=${args.desktopAwards}
134
- ></bd-awards-section-light>
128
+ ></bd-awards-section>
135
129
  `;
136
130
 
137
131
 
@@ -215,25 +209,22 @@ export const FewBadges = {
215
209
  ...defaultArgs,
216
210
  desktopAwards: [
217
211
  {
218
- label : "PC MAG\nEDITORS' CHOICE",
219
- type : "red",
220
- format: "svg",
221
- src : "/assets/pc-mag.svg",
222
- id : "pc-mag"
212
+ label: "PC MAG\nEDITORS' CHOICE",
213
+ type : "red",
214
+ tag : "bd-pc-mag-icon",
215
+ id : "pc-mag"
223
216
  },
224
217
  {
225
- label : "AV\ncomparatives",
226
- type : "dark",
227
- format: "svg",
228
- src : "/assets/av-comparatives.svg",
229
- id : "av-comparatives"
218
+ label: "AV\ncomparatives",
219
+ type : "dark",
220
+ tag : "bd-av-comparatives-icon",
221
+ id : "av-comparatives"
230
222
  },
231
223
  {
232
- label : "AV\nTEST\nTOP\nPRODUCT",
233
- type : "red",
234
- format: "svg",
235
- src : "/assets/top-product.svg",
236
- id : "top-product"
224
+ label: "AV\nTEST\nTOP\nPRODUCT",
225
+ type : "red",
226
+ tag : "bd-top-product-icon",
227
+ id : "top-product"
237
228
  }
238
229
  ]
239
230
  },
@@ -256,11 +247,10 @@ export const SingleBadge = {
256
247
  ...defaultArgs,
257
248
  desktopAwards: [
258
249
  {
259
- label : "PC MAG\nEDITORS' CHOICE",
260
- type : "red",
261
- format: "svg",
262
- src : "/assets/pc-mag.svg",
263
- id : "pc-mag"
250
+ label: "PC MAG\nEDITORS' CHOICE",
251
+ type : "red",
252
+ tag : "bd-pc-mag-icon",
253
+ id : "pc-mag"
264
254
  }
265
255
  ]
266
256
  },