@repobit/dex-system-design 0.25.12 → 1.0.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 +204 -0
  2. package/README.md +131 -8
  3. package/package.json +96 -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
@@ -2,7 +2,7 @@ import { html } from 'lit';
2
2
  import './dropdown.js';
3
3
 
4
4
  export default {
5
- title : 'Components/Dropdown',
5
+ title : 'Atoms/Dropdown',
6
6
  tags : ['autodocs'],
7
7
  parameters: {
8
8
  docs: {
@@ -15,7 +15,7 @@ export default {
15
15
  <bd-custom-dropdown
16
16
  label="Select country"
17
17
  .options="${['Romania', 'Germany', 'France']}"
18
- kind="md"
18
+ size="md"
19
19
  required
20
20
  ></bd-custom-dropdown>
21
21
  \`\`\`
@@ -29,16 +29,48 @@ export default {
29
29
  | Disabled | \`disabled\` | \`form-input--disabled\` |
30
30
 
31
31
  ### Size Variants
32
- | Kind | Input Class | Label Class |
33
- |---|---|---|
34
- | \`sm\` | \`input-sm\` | \`label-sm\` |
35
- | \`md\` | \`input-md\` | \`label-md\` |
36
- | \`lg\` | \`input-lg\` | \`label-lg\` |
32
+ | Kind | Height | Input Class | Label Class |
33
+ |---|---|---|---|
34
+ | \`sm\` | 33.5px | \`input-sm\` | \`label-sm\` |
35
+ | \`md\` | 44px | \`input-md\` | \`label-md\` |
36
+ | \`lg\` | 54.5px | \`input-lg\` | \`label-lg\` |
37
+
38
+ **A select, a \`bd-custom-input\`, a \`bd-custom-input-clipboard\` and a
39
+ \`bd-button\` of the same size are exactly the same height.** All four derive it
40
+ from the same three tokens — the vertical \`--spacing-*\`, the
41
+ \`--typography-fontSize-*\` step and \`--typography-lineHeight-tight\` — rather
42
+ than from four numbers kept in step by hand, because these controls almost
43
+ always share a row.
44
+
45
+ That derivation is also what stopped the select clipping its own option text.
46
+ It previously set \`lineHeight-normal\` (1.5) against a fixed height, which left
47
+ the line box 3 to 6px taller than the content box and cut the bottom off any
48
+ descender.
37
49
 
38
50
  ### Notes
39
51
  - Options can be passed as an Array or a JSON string
40
52
  - First option is auto-selected by default
41
53
  - Tooltip/help text is only rendered when \`tooltip\` prop is non-empty
54
+ - This component is documented in **two** places: here, and as the Dropdown
55
+ stories under **Atoms/Input**. They are one component; the Atoms/Input page
56
+ carries the fuller write-up.
57
+
58
+ ### Known gaps
59
+ Three things the sibling \`bd-custom-input\` has and this does not. They are
60
+ listed here because the states above imply a parity that is not there yet:
61
+
62
+ - **No \`value\` and no event.** Nothing is emitted when a selection changes, so
63
+ the chosen option cannot be read without reaching into the shadow root. The
64
+ input's \`value\` property plus \`bd-input\` / \`bd-change\` is the pattern to
65
+ copy.
66
+ - **\`invalid\` is colour only.** It sets a red border but no
67
+ \`aria-invalid="true"\`, so a screen reader is told nothing. The input sets it.
68
+ - **\`tooltip\` is not announced.** It renders as help text but the select does
69
+ not point at it with \`aria-describedby\`, so when it carries the reason a
70
+ field is invalid, that reason is visual only.
71
+
72
+ Being in a shadow root, the select also does not participate in an enclosing
73
+ \`<form>\` — a \`<form>\` containing it yields no \`FormData\` entry.
42
74
  `
43
75
  }
44
76
  }
@@ -54,7 +86,7 @@ export default {
54
86
  description: 'Array of option strings. Can also be passed as a JSON string.',
55
87
  table : { type: { summary: 'string[]' }, defaultValue: { summary: '[]' }, category: 'Content' }
56
88
  },
57
- kind: {
89
+ size: {
58
90
  control : { type: 'select' },
59
91
  options : ['sm', 'md', 'lg'],
60
92
  description: 'Size variant controlling input and label CSS classes',
@@ -94,7 +126,7 @@ const render = (args) => html`
94
126
  <bd-custom-dropdown
95
127
  label="${args.label}"
96
128
  .options="${args.options}"
97
- kind="${args.kind}"
129
+ size="${args.kind}"
98
130
  tooltip="${args.tooltip}"
99
131
  ?required="${args.required}"
100
132
  ?invalid="${args.invalid}"
@@ -105,7 +137,7 @@ const render = (args) => html`
105
137
 
106
138
  const defaultArgs = {
107
139
  label : 'Select a plan', options : defaultOptions,
108
- kind : 'md', tooltip : '', required : false,
140
+ size : 'md', tooltip : '', required : false,
109
141
  invalid : false, validated: false, disabled : false
110
142
  };
111
143
 
@@ -114,7 +146,7 @@ const defaultArgs = {
114
146
  export const Default = {
115
147
  name : 'Default',
116
148
  render: () => html`
117
- <bd-custom-dropdown label="Select a plan" .options="${defaultOptions}" kind="md"></bd-custom-dropdown>
149
+ <bd-custom-dropdown label="Select a plan" .options="${defaultOptions}" size="md"></bd-custom-dropdown>
118
150
  `,
119
151
  parameters: { docs: { description: { story: 'Default dropdown with no validation state and no tooltip.' } } }
120
152
  };
@@ -123,9 +155,9 @@ export const AllSizes = {
123
155
  name : 'All Sizes',
124
156
  render: () => html`
125
157
  <div style="display:flex; flex-direction:column; gap:20px; max-width:400px;">
126
- <bd-custom-dropdown label="Small" .options="${defaultOptions}" kind="sm"></bd-custom-dropdown>
127
- <bd-custom-dropdown label="Medium" .options="${defaultOptions}" kind="md"></bd-custom-dropdown>
128
- <bd-custom-dropdown label="Large" .options="${defaultOptions}" kind="lg"></bd-custom-dropdown>
158
+ <bd-custom-dropdown label="Small" .options="${defaultOptions}" size="sm"></bd-custom-dropdown>
159
+ <bd-custom-dropdown label="Medium" .options="${defaultOptions}" size="md"></bd-custom-dropdown>
160
+ <bd-custom-dropdown label="Large" .options="${defaultOptions}" size="lg"></bd-custom-dropdown>
129
161
  </div>
130
162
  `,
131
163
  parameters: { docs: { description: { story: 'All three size variants stacked for comparison.' } } }
@@ -134,7 +166,7 @@ export const AllSizes = {
134
166
  export const Required = {
135
167
  name : 'Required',
136
168
  render: () => html`
137
- <bd-custom-dropdown label="Select a plan" .options="${defaultOptions}" kind="md" required></bd-custom-dropdown>
169
+ <bd-custom-dropdown label="Select a plan" .options="${defaultOptions}" size="md" required></bd-custom-dropdown>
138
170
  `,
139
171
  parameters: { docs: { description: { story: 'Required field — shows a `*` after the label.' } } }
140
172
  };
@@ -145,7 +177,7 @@ export const WithTooltip = {
145
177
  <bd-custom-dropdown
146
178
  label="Select a plan"
147
179
  .options="${defaultOptions}"
148
- kind="md"
180
+ size="md"
149
181
  tooltip="Choose the plan that best fits your needs."
150
182
  ></bd-custom-dropdown>
151
183
  `,
@@ -158,7 +190,7 @@ export const Invalid = {
158
190
  <bd-custom-dropdown
159
191
  label="Select a plan"
160
192
  .options="${defaultOptions}"
161
- kind="md"
193
+ size="md"
162
194
  invalid
163
195
  tooltip="Please select a valid option."
164
196
  ></bd-custom-dropdown>
@@ -172,7 +204,7 @@ export const Validated = {
172
204
  <bd-custom-dropdown
173
205
  label="Select a plan"
174
206
  .options="${defaultOptions}"
175
- kind="md"
207
+ size="md"
176
208
  validated
177
209
  tooltip="Great choice!"
178
210
  ></bd-custom-dropdown>
@@ -183,7 +215,7 @@ export const Validated = {
183
215
  export const Disabled = {
184
216
  name : 'Disabled',
185
217
  render: () => html`
186
- <bd-custom-dropdown label="Select a plan" .options="${defaultOptions}" kind="md" disabled></bd-custom-dropdown>
218
+ <bd-custom-dropdown label="Select a plan" .options="${defaultOptions}" size="md" disabled></bd-custom-dropdown>
187
219
  `,
188
220
  parameters: { docs: { description: { story: 'Disabled select — applies `form-input--disabled` class.' } } }
189
221
  };
@@ -192,10 +224,10 @@ export const AllStates = {
192
224
  name : 'All Validation States',
193
225
  render: () => html`
194
226
  <div style="display:flex; flex-direction:column; gap:20px; max-width:400px;">
195
- <bd-custom-dropdown label="Default" .options="${defaultOptions}" kind="md" tooltip="Default help text."></bd-custom-dropdown>
196
- <bd-custom-dropdown label="Invalid" .options="${defaultOptions}" kind="md" invalid tooltip="This field has an error."></bd-custom-dropdown>
197
- <bd-custom-dropdown label="Validated" .options="${defaultOptions}" kind="md" validated tooltip="Looks good!"></bd-custom-dropdown>
198
- <bd-custom-dropdown label="Disabled" .options="${defaultOptions}" kind="md" disabled></bd-custom-dropdown>
227
+ <bd-custom-dropdown label="Default" .options="${defaultOptions}" size="md" tooltip="Default help text."></bd-custom-dropdown>
228
+ <bd-custom-dropdown label="Invalid" .options="${defaultOptions}" size="md" invalid tooltip="This field has an error."></bd-custom-dropdown>
229
+ <bd-custom-dropdown label="Validated" .options="${defaultOptions}" size="md" validated tooltip="Looks good!"></bd-custom-dropdown>
230
+ <bd-custom-dropdown label="Disabled" .options="${defaultOptions}" size="md" disabled></bd-custom-dropdown>
199
231
  </div>
200
232
  `,
201
233
  parameters: { docs: { description: { story: 'All four states stacked: default, invalid, validated, disabled.' } } }
@@ -207,7 +239,7 @@ export const ManyOptions = {
207
239
  <bd-custom-dropdown
208
240
  label="Select your country"
209
241
  .options="${['Select country', 'Romania', 'Germany', 'France', 'Spain', 'Italy', 'Netherlands', 'Belgium', 'Poland', 'Sweden']}"
210
- kind="md"
242
+ size="md"
211
243
  ></bd-custom-dropdown>
212
244
  `,
213
245
  parameters: { docs: { description: { story: 'Dropdown with 10 options. Tests scroll behavior of the native select.' } } }
@@ -1,19 +1,30 @@
1
- import { css } from "lit";
1
+ import { css, unsafeCSS } from "lit";
2
+ import { below } from "../shared/token-scales.js";
2
3
 
3
4
  export default css`
5
+ /* padding-block, not padding-top alone. This section opened with 64px above
6
+ it and closed with nothing, so whatever followed it sat flush against the
7
+ last feature column -- measured 64px/0px while every other module in the
8
+ family pads both ends (48/48 for five of them, 64/64 for three). The
9
+ bottom now matches the top, which is what the module was already doing at
10
+ one end.
11
+
12
+ The duplicate display went with it: block was declared and then
13
+ immediately overridden by flex on the next line but one, so it had never
14
+ applied. */
4
15
  :host {
5
- padding-top: var(--spacing-64);
6
- padding-bottom: var(--bd-features-padding-bottom, 0);
7
16
  --bd-acc-header-margin-bottom: var(--spacing-8);
8
17
  display: flex;
9
18
  justify-content: center;
10
- max-width: 1290px;
11
- margin-inline: auto;
12
- padding-inline: var(--layout-ensemble-inline-padding, var(--spacing-24));
19
+ padding-top: var(--spacing-64);
20
+ /* A host that nests the section (bd-tabs) can shorten the closing pad. */
21
+ padding-bottom: var(--bd-features-padding-bottom, var(--spacing-64));
22
+ padding-inline: var(--layout-ensemble-inline-padding);
13
23
  }
14
24
 
15
- /* Columns grid */
25
+ /* Columns grid: its own measure -- N columns of 400 -- centred inside the column */
16
26
  .bd-features-container {
27
+ margin-inline: auto;
17
28
  display: grid;
18
29
  gap: var(--spacing-32);
19
30
  width: 100%;
@@ -47,14 +58,16 @@ export default css`
47
58
  .col-description {
48
59
  margin-bottom: var(--spacing-24);
49
60
  font-family: var(--typography-fontFamily-sans);
50
- font-size: var(--typography-fontSize-md);
51
- color: var(--color-neutral-700);
52
- line-height: var(--typography-lineHeight-normal);
61
+ /* body-regular: base / normal / 1.5, which is what this already rendered.
62
+ Size and leading only -- the role's family and tracking are not adopted. */
63
+ font-size: var(--typography-body-regular-fontSize);
64
+ color: var(--color-text-secondary);
65
+ line-height: var(--typography-body-regular-lineHeight);
53
66
  overflow: hidden;
54
67
  }
55
68
 
56
69
  /* Responsive */
57
- @media (max-width: 992px) {
70
+ @media ${unsafeCSS(below('lg'))} {
58
71
  .bd-col {
59
72
  max-width: 100%;
60
73
  }
@@ -1,10 +1,12 @@
1
1
  import { LitElement, html } from "lit";
2
- import { tokens } from "../../tokens/tokens.js";
2
+ // Installs the design tokens into document scope; see src/tokens/tokens.js
3
+ import "../../tokens/tokens.js";
3
4
  import "../accordion/accordion.js";
4
5
  import "../heading/heading.js";
5
6
  import "../image/image.js";
6
7
  import "../paragraph/paragraph.js";
7
8
  import featuresCSS from "./features.css.js";
9
+ import { ensembleCSS } from "../shared/ensemble.css.js";
8
10
 
9
11
  class BdFeatureCol extends HTMLElement {}
10
12
  customElements.define("bd-feature-col", BdFeatureCol);
@@ -14,7 +16,7 @@ class BdFeatures extends LitElement {
14
16
  _minHeight: { state: true }
15
17
  };
16
18
 
17
- static styles = [tokens, featuresCSS];
19
+ static styles = [ensembleCSS, featuresCSS];
18
20
 
19
21
  constructor() {
20
22
  super();
@@ -152,7 +154,7 @@ class BdFeatures extends LitElement {
152
154
  <bd-h as="h4">${title}</bd-h>
153
155
  </div>
154
156
  ${descEl
155
- ? html`<div class="col-description"><bd-p kind="regular">${descEl.textContent}</bd-p></div>`
157
+ ? html`<div class="col-description"><bd-p variant="regular">${descEl.textContent}</bd-p></div>`
156
158
  : ""}
157
159
  ${accordionEl
158
160
  ? (() => {
@@ -175,12 +177,14 @@ class BdFeatures extends LitElement {
175
177
  const maxWidth = colCount * colWidth + (colCount - 1) * gap;
176
178
 
177
179
  return html`
180
+ <div class="bd-ensemble">
178
181
  <div
179
182
  class="bd-features-container"
180
183
  style="grid-template-columns: repeat(${colCount}, 1fr); max-width: ${maxWidth}px; ${this._minHeight ? `min-height: ${this._minHeight}px;` : ""}"
181
184
  >
182
185
  ${cols.map(col => this._renderCol(col))}
183
186
  </div>
187
+ </div>
184
188
  `;
185
189
  }
186
190
  }
@@ -5,7 +5,7 @@ import "../paragraph/paragraph.js";
5
5
  import "./features.js";
6
6
 
7
7
  export default {
8
- title : "Components/Features",
8
+ title : "Modules/Features",
9
9
  tags : ["autodocs"],
10
10
  parameters: {
11
11
  layout: "padded",
@@ -21,10 +21,10 @@ Componentă Lit pentru afișarea de feature-uri în coloane cu icon, titlu, desc
21
21
  icon-src="/assets/pic1.png"
22
22
  icon-alt="Protection icon"
23
23
  >
24
- <bd-p slot="description" kind="small">Descriere coloana</bd-p>
24
+ <bd-p slot="description" variant="small">Descriere coloana</bd-p>
25
25
  <bd-accordion-section no-container>
26
26
  <bd-accordion-item title="Feature 1" open>
27
- <bd-p kind="small">Detalii</bd-p>
27
+ <bd-p variant="small">Detalii</bd-p>
28
28
  </bd-accordion-item>
29
29
  </bd-accordion-section>
30
30
  </bd-feature-col>
@@ -61,22 +61,22 @@ export const ThreeColumns = {
61
61
  icon-src="/assets/pic1.png"
62
62
  icon-alt="Protection icon"
63
63
  >
64
- <bd-p slot="description" kind="small">Bitdefender's unbeatable multi-layered protection keeps your devices safe from all new and existing cyber threats.</bd-p>
64
+ <bd-p slot="description" variant="small">Bitdefender's unbeatable multi-layered protection keeps your devices safe from all new and existing cyber threats.</bd-p>
65
65
  <bd-accordion-section no-container>
66
66
  <bd-accordion-item title="Complete Real-Time Data Protection" open>
67
- <bd-p kind="small">Absolute power in the most efficient security bundle available today.</bd-p>
67
+ <bd-p variant="small">Absolute power in the most efficient security bundle available today.</bd-p>
68
68
  </bd-accordion-item>
69
69
  <bd-accordion-item title="Network Threat Prevention">
70
- <bd-p kind="small">Proactive network monitoring and threat detection.</bd-p>
70
+ <bd-p variant="small">Proactive network monitoring and threat detection.</bd-p>
71
71
  </bd-accordion-item>
72
72
  <bd-accordion-item title="Advanced Threat Defense">
73
- <bd-p kind="small">Behavioral detection stops unknown threats before they execute.</bd-p>
73
+ <bd-p variant="small">Behavioral detection stops unknown threats before they execute.</bd-p>
74
74
  </bd-accordion-item>
75
75
  <bd-accordion-item title="Scam Copilot">
76
- <bd-p kind="small">AI-powered scam detection and prevention.</bd-p>
76
+ <bd-p variant="small">AI-powered scam detection and prevention.</bd-p>
77
77
  </bd-accordion-item>
78
78
  <bd-accordion-item title="Multi-Layer Ransomware Protection">
79
- <bd-p kind="small">Protects your files from unauthorized encryption.</bd-p>
79
+ <bd-p variant="small">Protects your files from unauthorized encryption.</bd-p>
80
80
  </bd-accordion-item>
81
81
  </bd-accordion-section>
82
82
  </bd-feature-col>
@@ -86,22 +86,22 @@ export const ThreeColumns = {
86
86
  icon-src="/assets/pic2.png"
87
87
  icon-alt="Privacy icon"
88
88
  >
89
- <bd-p slot="description" kind="small">Bitdefender Ultimate Security takes care of your online privacy and personal information.</bd-p>
89
+ <bd-p slot="description" variant="small">Bitdefender Ultimate Security takes care of your online privacy and personal information.</bd-p>
90
90
  <bd-accordion-section no-container>
91
91
  <bd-accordion-item title="Unlimited VPN Traffic" open>
92
- <bd-p kind="small">Encrypt your connection and stay private online.</bd-p>
92
+ <bd-p variant="small">Encrypt your connection and stay private online.</bd-p>
93
93
  </bd-accordion-item>
94
94
  <bd-accordion-item title="Password Manager">
95
- <bd-p kind="small">Store and autofill passwords securely.</bd-p>
95
+ <bd-p variant="small">Store and autofill passwords securely.</bd-p>
96
96
  </bd-accordion-item>
97
97
  <bd-accordion-item title="Anti-tracker">
98
- <bd-p kind="small">Block trackers and keep your browsing private.</bd-p>
98
+ <bd-p variant="small">Block trackers and keep your browsing private.</bd-p>
99
99
  </bd-accordion-item>
100
100
  <bd-accordion-item title="Webcam Protection">
101
- <bd-p kind="small">Prevent unauthorized webcam access.</bd-p>
101
+ <bd-p variant="small">Prevent unauthorized webcam access.</bd-p>
102
102
  </bd-accordion-item>
103
103
  <bd-accordion-item title="Privacy Firewall">
104
- <bd-p kind="small">Advanced firewall protection for your network.</bd-p>
104
+ <bd-p variant="small">Advanced firewall protection for your network.</bd-p>
105
105
  </bd-accordion-item>
106
106
  </bd-accordion-section>
107
107
  </bd-feature-col>
@@ -111,22 +111,22 @@ export const ThreeColumns = {
111
111
  icon-src="/assets/pic3.png"
112
112
  icon-alt="Identity Protection icon"
113
113
  >
114
- <bd-p slot="description" kind="small">Goes beyond credit monitoring to protect you against identity theft attacks you might not always recognize.</bd-p>
114
+ <bd-p slot="description" variant="small">Goes beyond credit monitoring to protect you against identity theft attacks you might not always recognize.</bd-p>
115
115
  <bd-accordion-section no-container>
116
116
  <bd-accordion-item title="Continuous Dark Web Monitoring" open>
117
- <bd-p kind="small">Get instant alerts if your data appears on the dark web.</bd-p>
117
+ <bd-p variant="small">Get instant alerts if your data appears on the dark web.</bd-p>
118
118
  </bd-accordion-item>
119
119
  <bd-accordion-item title="Digital Footprint Visualization">
120
- <bd-p kind="small">See and reduce your digital exposure online.</bd-p>
120
+ <bd-p variant="small">See and reduce your digital exposure online.</bd-p>
121
121
  </bd-accordion-item>
122
122
  <bd-accordion-item title="Identity Protection Score">
123
- <bd-p kind="small">Understand your identity risk at a glance.</bd-p>
123
+ <bd-p variant="small">Understand your identity risk at a glance.</bd-p>
124
124
  </bd-accordion-item>
125
125
  <bd-accordion-item title="Real Time Breach Notifications">
126
- <bd-p kind="small">Be first to know when your accounts are compromised.</bd-p>
126
+ <bd-p variant="small">Be first to know when your accounts are compromised.</bd-p>
127
127
  </bd-accordion-item>
128
128
  <bd-accordion-item title="Credit Report Monitoring">
129
- <bd-p kind="small">Track changes to your credit report in real time.</bd-p>
129
+ <bd-p variant="small">Track changes to your credit report in real time.</bd-p>
130
130
  </bd-accordion-item>
131
131
  </bd-accordion-section>
132
132
  </bd-feature-col>
@@ -144,13 +144,13 @@ export const TwoColumns = {
144
144
  icon-src="/assets/pic1.png"
145
145
  icon-alt="Protection icon"
146
146
  >
147
- <bd-p slot="description" kind="small">Protection description.</bd-p>
147
+ <bd-p slot="description" variant="small">Protection description.</bd-p>
148
148
  <bd-accordion-section no-container>
149
149
  <bd-accordion-item title="Real-Time Protection" open>
150
- <bd-p kind="small">Content here</bd-p>
150
+ <bd-p variant="small">Content here</bd-p>
151
151
  </bd-accordion-item>
152
152
  <bd-accordion-item title="Network Threat Prevention">
153
- <bd-p kind="small">Content here</bd-p>
153
+ <bd-p variant="small">Content here</bd-p>
154
154
  </bd-accordion-item>
155
155
  </bd-accordion-section>
156
156
  </bd-feature-col>
@@ -160,13 +160,13 @@ export const TwoColumns = {
160
160
  icon-src="/assets/pic2.png"
161
161
  icon-alt="Privacy icon"
162
162
  >
163
- <bd-p slot="description" kind="small">Privacy description.</bd-p>
163
+ <bd-p slot="description" variant="small">Privacy description.</bd-p>
164
164
  <bd-accordion-section no-container>
165
165
  <bd-accordion-item title="VPN Traffic" open>
166
- <bd-p kind="small">Content here</bd-p>
166
+ <bd-p variant="small">Content here</bd-p>
167
167
  </bd-accordion-item>
168
168
  <bd-accordion-item title="Password Manager">
169
- <bd-p kind="small">Content here</bd-p>
169
+ <bd-p variant="small">Content here</bd-p>
170
170
  </bd-accordion-item>
171
171
  </bd-accordion-section>
172
172
  </bd-feature-col>
@@ -184,16 +184,16 @@ export const OneColumn = {
184
184
  icon-src="/assets/pic1.png"
185
185
  icon-alt="Protection icon"
186
186
  >
187
- <bd-p slot="description" kind="small">Single column protection description.</bd-p>
187
+ <bd-p slot="description" variant="small">Single column protection description.</bd-p>
188
188
  <bd-accordion-section no-container>
189
189
  <bd-accordion-item title="Real-Time Protection" open>
190
- <bd-p kind="small">Content here</bd-p>
190
+ <bd-p variant="small">Content here</bd-p>
191
191
  </bd-accordion-item>
192
192
  <bd-accordion-item title="Network Threat Prevention">
193
- <bd-p kind="small">Content here</bd-p>
193
+ <bd-p variant="small">Content here</bd-p>
194
194
  </bd-accordion-item>
195
195
  <bd-accordion-item title="Advanced Threat Defense">
196
- <bd-p kind="small">Content here</bd-p>
196
+ <bd-p variant="small">Content here</bd-p>
197
197
  </bd-accordion-item>
198
198
  </bd-accordion-section>
199
199
  </bd-feature-col>
@@ -214,10 +214,10 @@ export const MobileView = {
214
214
  icon-src="/assets/pic1.png"
215
215
  icon-alt="Protection icon"
216
216
  >
217
- <bd-p slot="description" kind="small">Protection description.</bd-p>
217
+ <bd-p slot="description" variant="small">Protection description.</bd-p>
218
218
  <bd-accordion-section no-container>
219
219
  <bd-accordion-item title="Real-Time Protection" open>
220
- <bd-p kind="small">Content here</bd-p>
220
+ <bd-p variant="small">Content here</bd-p>
221
221
  </bd-accordion-item>
222
222
  </bd-accordion-section>
223
223
  </bd-feature-col>
@@ -227,10 +227,10 @@ export const MobileView = {
227
227
  icon-src="/assets/pic2.png"
228
228
  icon-alt="Privacy icon"
229
229
  >
230
- <bd-p slot="description" kind="small">Privacy description.</bd-p>
230
+ <bd-p slot="description" variant="small">Privacy description.</bd-p>
231
231
  <bd-accordion-section no-container>
232
232
  <bd-accordion-item title="VPN Traffic" open>
233
- <bd-p kind="small">Content here</bd-p>
233
+ <bd-p variant="small">Content here</bd-p>
234
234
  </bd-accordion-item>
235
235
  </bd-accordion-section>
236
236
  </bd-feature-col>
@@ -240,10 +240,10 @@ export const MobileView = {
240
240
  icon-src="/assets/pic3.png"
241
241
  icon-alt="Identity Protection icon"
242
242
  >
243
- <bd-p slot="description" kind="small">Identity description.</bd-p>
243
+ <bd-p slot="description" variant="small">Identity description.</bd-p>
244
244
  <bd-accordion-section no-container>
245
245
  <bd-accordion-item title="Dark Web Monitoring" open>
246
- <bd-p kind="small">Content here</bd-p>
246
+ <bd-p variant="small">Content here</bd-p>
247
247
  </bd-accordion-item>
248
248
  </bd-accordion-section>
249
249
  </bd-feature-col>
@@ -1,12 +1,10 @@
1
- import { css } from "lit";
1
+ import { css, unsafeCSS } from "lit";
2
+ import { below } from "../shared/token-scales.js";
2
3
 
3
4
  export default css`
4
5
  :host {
5
6
  display: block;
6
7
  width: 100%;
7
- max-width: 1290px;
8
- margin: 0 auto;
9
- padding-inline: var(--layout-ensemble-inline-padding, var(--spacing-24));
10
8
  box-sizing: border-box;
11
9
  }
12
10
 
@@ -15,7 +13,9 @@ export default css`
15
13
  align-items: center;
16
14
  gap: var(--spacing-64);
17
15
  width: 100%;
18
- animation: bd-fade-slide-right 350ms ease forwards;
16
+ /* slow, not 350ms: a 50ms difference nobody chose, on a one-shot
17
+ entrance that is not repeated. */
18
+ animation: bd-fade-slide-right var(--transition-duration-slow) var(--transition-easing-ease) forwards;
19
19
  }
20
20
 
21
21
  .bd-features-tab-left {
@@ -47,10 +47,21 @@ export default css`
47
47
  width: 100%;
48
48
  max-width: 520px;
49
49
  height: auto;
50
- border-radius: var(--radius-lg, 16px);
50
+ border-radius: var(--radius-lg);
51
51
  display: block;
52
52
  }
53
53
 
54
+ /* The entrance is skipped rather than shortened. Its first frame is
55
+ opacity 0 and a 24px offset, so under reduced motion the container simply
56
+ renders where it belongs, fully opaque: it declares no opacity of its own,
57
+ and none is what the keyframes stop supplying. Content is present
58
+ immediately rather than waiting to be revealed. */
59
+ @media (prefers-reduced-motion: reduce) {
60
+ .bd-features-tab-container {
61
+ animation: none;
62
+ }
63
+ }
64
+
54
65
  @keyframes bd-fade-slide-right {
55
66
  from {
56
67
  opacity: 0;
@@ -62,7 +73,7 @@ export default css`
62
73
  }
63
74
  }
64
75
 
65
- @media (max-width: 992px) {
76
+ @media ${unsafeCSS(below('lg'))} {
66
77
  .bd-features-tab-container {
67
78
  flex-direction: column-reverse;
68
79
  gap: var(--spacing-32);
@@ -82,7 +93,7 @@ export default css`
82
93
  }
83
94
  }
84
95
 
85
- @media (max-width: 600px) {
96
+ @media ${unsafeCSS(below('sm'))} {
86
97
  .bd-features-tab-container {
87
98
  gap: var(--spacing-24);
88
99
  }
@@ -1,10 +1,12 @@
1
1
  import { LitElement, html } from "lit";
2
- import { tokens } from "../../tokens/tokens.js";
2
+ // Installs the design tokens into document scope; see src/tokens/tokens.js
3
+ import "../../tokens/tokens.js";
3
4
  import "../button/button.js";
4
5
  import "../heading/heading.js";
5
6
  import "../paragraph/paragraph.js";
6
7
  import "../video-player/video-player.js";
7
8
  import featuresTabCSS from "./features-tab.css.js";
9
+ import { ensembleCSS } from "../shared/ensemble.css.js";
8
10
 
9
11
  class BdFeaturesTab extends LitElement {
10
12
  static properties = {
@@ -15,7 +17,7 @@ class BdFeaturesTab extends LitElement {
15
17
  reverse : { type: Boolean, reflect: true }
16
18
  };
17
19
 
18
- static styles = [tokens, featuresTabCSS];
20
+ static styles = [ensembleCSS, featuresTabCSS];
19
21
 
20
22
  constructor() {
21
23
  super();
@@ -42,10 +44,9 @@ class BdFeaturesTab extends LitElement {
42
44
  ? html`
43
45
  <bd-button-link
44
46
  href="${this.ctaHref}"
45
- kind="${this.ctaKind}"
47
+ variant="${this.ctaKind}"
46
48
  size="${this.ctaSize}"
47
49
  label="${this.ctaLabel}"
48
- strong="true"
49
50
  >
50
51
  ${this.ctaLabel}
51
52
  </bd-button-link>`
@@ -62,7 +63,7 @@ class BdFeaturesTab extends LitElement {
62
63
  `;
63
64
 
64
65
  return html`
65
- <div class="bd-features-tab-container ${this.reverse ? "bd-features-tab-reverse" : ""}">
66
+ <div class="bd-ensemble bd-features-tab-container ${this.reverse ? "bd-features-tab-reverse" : ""}">
66
67
  ${this.reverse
67
68
  ? html`${rightContent}${leftContent}`
68
69
  : html`${leftContent}${rightContent}`}