@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,31 +1,34 @@
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 carouselCSS from "./card.css.js";
7
+ import { ensembleCSS } from "../shared/ensemble.css.js";
8
+ import { matchesBelow } from "../shared/token-scales.js";
6
9
 
7
10
  class Card extends LitElement {
8
11
  static properties = {
9
- title : { type: String },
10
- subtitle : { type: String },
11
- bgBlue : { type: Boolean, reflect: true, attribute: "bg-blue" },
12
+ title : { type: String },
13
+ headingLevel: { type: Number, attribute: "heading-level" },
14
+ subtitle : { type: String },
15
+ bgBlue : { type: Boolean, reflect: true, attribute: "bg-blue" },
12
16
  // "" (default — existing grey-box carousel look) | "outline" — bordered,
13
- // centered cards with a light-blue tint, blue title and centered icon,
14
- // matching the reference design. Propagated automatically to every
15
- // slotted bd-card-item (see _onSlotChange) so callers only set it once,
16
- // on the section, unless a specific item needs to opt out by setting
17
- // its own variant attribute explicitly.
18
- variant : { type: String, reflect: true },
17
+ // centered cards with a light-blue tint, blue title and centered icon.
18
+ // Propagated to every slotted bd-card-item (see _onSlotChange) unless an
19
+ // item sets its own variant attribute.
20
+ variant : { type: String, reflect: true },
19
21
  // Opt-in: lays the cards out on a CSS grid and makes every card a subgrid,
20
22
  // so icon, title, each content row and CTA line up across cards (desktop
21
23
  // only). Replaces the JS height equalization for this section.
22
- alignRows : { type: Boolean, reflect: true, attribute: "align-rows" },
23
- _itemCount: { state: true }
24
+ alignRows : { type: Boolean, reflect: true, attribute: "align-rows" },
25
+ _itemCount : { state: true }
24
26
  };
25
27
 
26
28
  constructor() {
27
29
  super();
28
30
  this.title = "";
31
+ this.headingLevel = 2;
29
32
  this.subtitle = "";
30
33
  this.bgBlue = false;
31
34
  this.variant = "";
@@ -128,7 +131,10 @@ class Card extends LitElement {
128
131
  if (!items.length) return;
129
132
 
130
133
 
131
- if (window.innerWidth <= 768) {
134
+ /* matchesBelow, not innerWidth <= 768: at exactly 768 the old test was
135
+ true while this component's own CSS, which uses below('md'), had
136
+ already switched to the wide layout. The two disagreed on one pixel. */
137
+ if (matchesBelow('md')) {
132
138
  items.forEach(item => {
133
139
  const box = item.renderRoot?.querySelector(".bd-light-box-s");
134
140
  const iconW = item.renderRoot?.querySelector(".bd-light-box-header-s");
@@ -253,13 +259,25 @@ class Card extends LitElement {
253
259
  this._mutationObserver?.disconnect();
254
260
  }
255
261
 
262
+
263
+ /**
264
+ * Level is the document-outline question and belongs to page composition;
265
+ * the type scale is this component's and stays where it was. visual-level
266
+ * pins the look at h1 so only the semantics move. Defaults to h2, because a
267
+ * reusable section cannot know it is the page's only heading.
268
+ */
269
+ get _headingTag() {
270
+ const n = Number(this.headingLevel);
271
+ return Number.isInteger(n) && n >= 1 && n <= 6 ? `h${n}` : "h2";
272
+ }
273
+
256
274
  render() {
257
275
  return html`
258
- <section class="bd-light-carousel-s">
276
+ <section class="bd-ensemble bd-light-carousel-s">
259
277
  ${this.title
260
278
  ? html`
261
279
  <div class="bd-header-light-carousel-s">
262
- <bd-h as="h1" class="bd-section-title-s">${this.title}</bd-h>
280
+ <bd-h as="${this._headingTag}" visual-level="h1" class="bd-section-title-s">${this.title}</bd-h>
263
281
  ${this.subtitle
264
282
  ? html`<p class="bd-section-subtitle-s">${this.subtitle}</p>`
265
283
  : ""}
@@ -278,15 +296,16 @@ class Card extends LitElement {
278
296
 
279
297
  class CardItem extends LitElement {
280
298
  static properties = {
281
- title : { type: String },
282
- subtitle: { type: String },
283
- icon : { type: String },
284
- align : { type: String },
285
- bgBlue : { type: Boolean, reflect: true, attribute: "bg-blue" },
286
- ctaAlign: { type: String, attribute: "cta-align" },
299
+ title : { type: String },
300
+ subtitle : { type: String },
301
+ icon : { type: String },
302
+ align : { type: String },
303
+ bgBlue : { type: Boolean, reflect: true, attribute: "bg-blue" },
304
+ ctaAlign : { type: String, attribute: "cta-align" },
305
+ headingLevel: { type: Number, attribute: "heading-level" },
287
306
  // "" (default) | "outline" — see Card.variant above. Reflected so
288
307
  // card.css.js can target it with :host([variant="outline"]).
289
- variant : { type: String, reflect: true }
308
+ variant : { type: String, reflect: true }
290
309
  };
291
310
 
292
311
  constructor() {
@@ -299,6 +318,7 @@ class CardItem extends LitElement {
299
318
  this._authorSetVariant = this.hasAttribute("variant");
300
319
 
301
320
  this.title = "";
321
+ this.headingLevel = 3;
302
322
  this.subtitle = "";
303
323
  this.icon = "";
304
324
  this.align = "start";
@@ -373,6 +393,17 @@ class CardItem extends LitElement {
373
393
  return this._contentNodes().length > 0;
374
394
  }
375
395
 
396
+
397
+ /**
398
+ * One level below the section default. The h5 it used to carry was a type
399
+ * choice, not an outline one, so the size stays on visual-level while the
400
+ * level itself stops skipping three steps below its own section.
401
+ */
402
+ get _headingTag() {
403
+ const n = Number(this.headingLevel);
404
+ return Number.isInteger(n) && n >= 1 && n <= 6 ? `h${n}` : "h3";
405
+ }
406
+
376
407
  render() {
377
408
  const isOutline = this.variant === "outline";
378
409
  const isCentered = this.align === "center" || isOutline;
@@ -400,7 +431,7 @@ class CardItem extends LitElement {
400
431
  ? html`
401
432
  <div class="bd-light-title-badge-wrapper-s ${!hasContent ? "bd-light-title-no-content" : ""}">
402
433
  <div class="bd-card-title-group">
403
- <bd-h as="h5" fontWeight="700">${this.title}</bd-h>
434
+ <bd-h as="${this._headingTag}" visual-level="h5" fontWeight="bold">${this.title}</bd-h>
404
435
  ${this.subtitle
405
436
  ? html`<p class="bd-card-item-subtitle">${this.subtitle}</p>`
406
437
  : ""}
@@ -430,8 +461,8 @@ class CardItem extends LitElement {
430
461
  }
431
462
  }
432
463
 
433
- Card.styles = [tokens, carouselCSS];
434
- CardItem.styles = [tokens, carouselCSS];
464
+ Card.styles = [ensembleCSS, carouselCSS];
465
+ CardItem.styles = [carouselCSS];
435
466
 
436
467
  customElements.define("bd-card-item", CardItem);
437
468
  customElements.define("bd-card-section", Card);
@@ -50,16 +50,16 @@ left-aligned instead of centered.
50
50
  // ─── Shared data ──────────────────────────────────────────────────────────────
51
51
 
52
52
  const icons = [
53
- html`<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>`,
54
- html`<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>`,
55
- html`<bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>`,
56
- html`<bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>`,
57
- html`<bd-family-icon slot="icon" width="32" height="32" color="#006DFF"></bd-family-icon>`,
58
- html`<bd-arrow-up-icon slot="icon" width="32" height="32" color="#006DFF"></bd-arrow-up-icon>`,
59
- html`<bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>`,
60
- html`<bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>`,
61
- html`<bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>`,
62
- html`<bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>`
53
+ html`<bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>`,
54
+ html`<bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>`,
55
+ html`<bd-machine-learning-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-machine-learning-icon>`,
56
+ html`<bd-analysis-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-analysis-icon>`,
57
+ html`<bd-family-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-family-icon>`,
58
+ html`<bd-arrow-up-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-arrow-up-icon>`,
59
+ html`<bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>`,
60
+ html`<bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>`,
61
+ html`<bd-machine-learning-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-machine-learning-icon>`,
62
+ html`<bd-analysis-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-analysis-icon>`
63
63
  ];
64
64
 
65
65
  const titles = [
@@ -179,19 +179,19 @@ export const WithBlueBg = {
179
179
  render: () => html`
180
180
  <bd-card-section title="Why Bitdefender">
181
181
  <bd-card-item title="AI Protection" bg-blue>
182
- <bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
182
+ <bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>
183
183
  <bd-p>Powered by machine learning and behavioral analysis.</bd-p>
184
184
  </bd-card-item>
185
185
  <bd-card-item title="Multi-layer Security" bg-blue>
186
- <bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
186
+ <bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>
187
187
  <bd-p>Multiple independent protection layers stop any attack.</bd-p>
188
188
  </bd-card-item>
189
189
  <bd-card-item title="VPN Included" bg-blue>
190
- <bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
190
+ <bd-machine-learning-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-machine-learning-icon>
191
191
  <bd-p>Unlimited encrypted VPN traffic for all your devices.</bd-p>
192
192
  </bd-card-item>
193
193
  <bd-card-item title="Parental Controls" bg-blue>
194
- <bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>
194
+ <bd-analysis-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-analysis-icon>
195
195
  <bd-p>Advanced controls to protect your children online.</bd-p>
196
196
  </bd-card-item>
197
197
  </bd-card-section>
@@ -206,19 +206,19 @@ export const MixedBlueBg = {
206
206
  render: () => html`
207
207
  <bd-card-section title="Features">
208
208
  <bd-card-item title="AI Protection" bg-blue>
209
- <bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
209
+ <bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>
210
210
  <bd-p>Powered by machine learning and behavioral analysis.</bd-p>
211
211
  </bd-card-item>
212
212
  <bd-card-item title="Multi-layer Security">
213
- <bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
213
+ <bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>
214
214
  <bd-p>Multiple independent protection layers stop any attack.</bd-p>
215
215
  </bd-card-item>
216
216
  <bd-card-item title="VPN Included" bg-blue>
217
- <bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
217
+ <bd-machine-learning-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-machine-learning-icon>
218
218
  <bd-p>Unlimited encrypted VPN traffic for all your devices.</bd-p>
219
219
  </bd-card-item>
220
220
  <bd-card-item title="Parental Controls">
221
- <bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>
221
+ <bd-analysis-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-analysis-icon>
222
222
  <bd-p>Advanced controls to protect your children online.</bd-p>
223
223
  </bd-card-item>
224
224
  </bd-card-section>
@@ -233,24 +233,24 @@ export const WithCTA = {
233
233
  render: () => html`
234
234
  <bd-card-section title="Why Bitdefender">
235
235
  <bd-card-item title="AI Protection">
236
- <bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
236
+ <bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>
237
237
  <bd-p>Powered by machine learning and behavioral analysis.</bd-p>
238
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
238
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
239
239
  </bd-card-item>
240
240
  <bd-card-item title="Multi-layer Security">
241
- <bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
241
+ <bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>
242
242
  <bd-p>Multiple independent protection layers stop any attack.</bd-p>
243
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
243
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
244
244
  </bd-card-item>
245
245
  <bd-card-item title="VPN Included">
246
- <bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
246
+ <bd-machine-learning-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-machine-learning-icon>
247
247
  <bd-p>Unlimited encrypted VPN traffic for all your devices.</bd-p>
248
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
248
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
249
249
  </bd-card-item>
250
250
  <bd-card-item title="Parental Controls">
251
- <bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>
251
+ <bd-analysis-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-analysis-icon>
252
252
  <bd-p>Advanced controls to protect your children online.</bd-p>
253
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
253
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
254
254
  </bd-card-item>
255
255
  </bd-card-section>
256
256
  `,
@@ -339,16 +339,16 @@ export const NoSlottedContent = {
339
339
  render: () => html`
340
340
  <bd-card-section title="Features">
341
341
  <bd-card-item align="center" title="AI Protection">
342
- <bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
342
+ <bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>
343
343
  </bd-card-item>
344
344
  <bd-card-item title="Multi-layer Security">
345
- <bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
345
+ <bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>
346
346
  </bd-card-item>
347
347
  <bd-card-item title="VPN Included">
348
- <bd-machine-learning-icon slot="icon" width="32" height="32" color="#006DFF"></bd-machine-learning-icon>
348
+ <bd-machine-learning-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-machine-learning-icon>
349
349
  </bd-card-item>
350
350
  <bd-card-item title="Parental Controls">
351
- <bd-analysis-icon slot="icon" width="32" height="32" color="#006DFF"></bd-analysis-icon>
351
+ <bd-analysis-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-analysis-icon>
352
352
  </bd-card-item>
353
353
  </bd-card-section>
354
354
  `,
@@ -361,17 +361,17 @@ export const WithImages = {
361
361
  <bd-card-item title="Total Security">
362
362
  <img slot="icon" src="/assets/tabs-img1.png" alt="Total Security" />
363
363
  <bd-p>Complete protection for all your devices with advanced threat detection.</bd-p>
364
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
364
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
365
365
  </bd-card-item>
366
366
  <bd-card-item title="Internet Security">
367
367
  <img slot="icon" src="/assets/tabs-img2.png" alt="Internet Security" />
368
368
  <bd-p>Stay safe online.</bd-p>
369
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
369
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
370
370
  </bd-card-item>
371
371
  <bd-card-item title="Antivirus Plus">
372
372
  <img slot="icon" src="/assets/tabs-img3.png" alt="Antivirus Plus" />
373
373
  <bd-p>Essential protection for your Windows PC with real-time antivirus and anti-phishing.</bd-p>
374
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
374
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
375
375
  </bd-card-item>
376
376
  </bd-card-section>
377
377
  `,
@@ -383,7 +383,7 @@ export const MixedIconsAndImages = {
383
383
  render: () => html`
384
384
  <bd-card-section title="Mixed Media">
385
385
  <bd-card-item title="AI Protection">
386
- <bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
386
+ <bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>
387
387
  <bd-p>Powered by machine learning and behavioral analysis.</bd-p>
388
388
  </bd-card-item>
389
389
  <bd-card-item title="Total Security">
@@ -391,7 +391,7 @@ export const MixedIconsAndImages = {
391
391
  <bd-p>Complete protection for all your devices.</bd-p>
392
392
  </bd-card-item>
393
393
  <bd-card-item title="VPN Included">
394
- <bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
394
+ <bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>
395
395
  <bd-p>Unlimited encrypted VPN traffic for all your devices, anywhere.</bd-p>
396
396
  </bd-card-item>
397
397
  <bd-card-item title="Internet Security">
@@ -494,9 +494,9 @@ export const Playground = {
494
494
  ?bg-blue=${args.bgBlue}
495
495
  cta-align="${args.ctaAlign}"
496
496
  >
497
- <bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
497
+ <bd-individual-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-individual-icon>
498
498
  <bd-p>Powered by machine learning and behavioral analysis.</bd-p>
499
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
499
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
500
500
  </bd-card-item>
501
501
  <bd-card-item
502
502
  title="VPN Included"
@@ -504,9 +504,9 @@ export const Playground = {
504
504
  ?bg-blue=${args.bgBlue}
505
505
  cta-align="${args.ctaAlign}"
506
506
  >
507
- <bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
507
+ <bd-globe-icon slot="icon" width="32" height="32" color="var(--color-blue-500)"></bd-globe-icon>
508
508
  <bd-p>Unlimited encrypted VPN traffic.</bd-p>
509
- <bd-button-link slot="cta" href="#" kind="primary" size="sm">Learn more</bd-button-link>
509
+ <bd-button-link slot="cta" href="#" variant="primary" size="sm">Learn more</bd-button-link>
510
510
  </bd-card-item>
511
511
  </bd-card-section>
512
512
  `,
@@ -1,12 +1,9 @@
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
- --background-card-grey: var(--color-neutral-25);
7
- --border-card-grey: var(--color-neutral-50);
8
- --bd-blue-color: var(--color-blue-500);
9
- --bd-accesibility-focus: var(--color-blue-800);
10
7
  }
11
8
 
12
9
 
@@ -24,11 +21,12 @@ export default css`
24
21
  user-select: none;
25
22
  }
26
23
 
27
- .bd-section-title {
28
- font-family: var(--typography-fontFamily-sans);
29
- font-weight: var(--typography-fontWeight-semibold);
30
- font-size: 2em;
31
- }
24
+ /* No .bd-section-title rule. The title is a bd-h at visual-level="h3", so
25
+ the heading-h3 role carries the whole of its type -- the three
26
+ declarations that stood here spelled out that role's size and weight by
27
+ hand while leaving its line-height unset, which is how the title came to
28
+ render at the browser's default leading and with the browser's default h2
29
+ margins. LightCarousel and CardFeatures declare no such rule either. */
32
30
  div.bd-arrow {
33
31
  padding: var(--spacing-2);
34
32
  visibility: visible;
@@ -38,8 +36,9 @@ export default css`
38
36
  .bd-arrow:focus-visible,
39
37
  .bd-plus-button:focus-visible,
40
38
  .bd-modal-content button:focus-visible {
41
- outline: var(--spacing-2) solid var(--bd-accesibility-focus);
42
- outline-offset: var(--spacing-2);
39
+ /* the one focus ring — see Foundations/Focus */
40
+ outline: none;
41
+ box-shadow: var(--focus-outline-primary);
43
42
  }
44
43
 
45
44
  .bd-header-carousel {
@@ -50,8 +49,10 @@ export default css`
50
49
  margin-top: 50px;
51
50
  }
52
51
 
53
- .bd-heading{
54
- padding: 20px}
52
+ /* A ".bd-heading{padding: 20px}" rule stood here. .bd-heading is the class
53
+ bd-h puts on the element inside its own shadow root, so this stylesheet
54
+ never reached it: measured 0 matches across 27 carousel sections and 102
55
+ carousel items. */
55
56
  .bd-carousel-container {
56
57
  display: flex;
57
58
  flex-direction: column;
@@ -69,10 +70,18 @@ export default css`
69
70
  box-shadow: var(--spacing-0) var(--spacing-2) var(--spacing-4) rgba(0, 0, 0, 0.1);
70
71
  position: absolute;
71
72
  bottom: -65px;
72
- background: var(--bd-blue-color);
73
- color: white;
74
- font-size: var(--spacing-20);
75
- line-height: 1;
73
+ background: var(--color-surface-brand);
74
+ color: var(--color-text-inverse);
75
+ /* no role: .bd-arrow is an <img> -- left-arrow.svg / right-arrow.svg in
76
+ carousel.js. It renders no text, so this styles nothing but the alt
77
+ text a browser shows when the SVG fails to load. Fallback typography
78
+ is not a role decision. */
79
+ font-size: var(--typography-fontSize-xl);
80
+ /* no role: .bd-arrow is an <img> -- left-arrow.svg / right-arrow.svg in
81
+ carousel.js. It renders no text, so this styles nothing but the alt
82
+ text a browser shows when the SVG fails to load. Fallback typography
83
+ is not a role decision. */
84
+ line-height: var(--typography-lineHeight-none);
76
85
  text-align: center;
77
86
  }
78
87
 
@@ -123,8 +132,8 @@ export default css`
123
132
  }
124
133
 
125
134
  .bd-disabled {
126
- background: #f1f2f3;
127
- color: #a6adb4;
135
+ background: var(--color-neutral-50);
136
+ color: var(--color-text-muted-inverse);
128
137
  cursor: not-allowed;
129
138
  }
130
139
 
@@ -144,7 +153,7 @@ export default css`
144
153
  position: relative;
145
154
  overflow-x: hidden;
146
155
  overflow-y: hidden;
147
- z-index: 1;
156
+ z-index: var(--z-base);
148
157
  scroll-snap-type: x mandatory;
149
158
  -webkit-overflow-scrolling: touch;
150
159
  transition: scroll-snap-align 0.6s cubic-bezier(0.23, 1, 0.32, 1);
@@ -168,109 +177,83 @@ export default css`
168
177
  min-height: 217px;
169
178
  min-width: unset;
170
179
  width: 350px;
171
- background: var(--background-card-grey);
172
- border-radius: 28px;
173
- border: var(--spacing-2) solid var(--border-card-grey);
174
- padding: 2em;
180
+ background: var(--color-surface-container);
181
+ /* --radius-2xl, the step the other ten cards take.
182
+ bd-light-carousel made this exact move and wrote the argument for it:
183
+ "nothing about a carousel item asks for a softer corner than the same
184
+ card sitting in a grid". Same family, same reasoning, this file was
185
+ behind. Visible: the corner tightens 24px to 16px. */
186
+ border-radius: var(--card-radius);
187
+ /* No edge, for the reason bd-bentoitem's rule states: this card sits on
188
+ surface/container over the page ground, and that role is documented as
189
+ reading like its own object without a border or a shadow to say so.
190
+
191
+ What stood here was a --border-width-2 edge, and the comment it carried
192
+ was about the UNIT rather than the edge: --spacing-2 and --border-width-2
193
+ are both 2px at a 16px root and diverge above it, so at a 24px root this
194
+ edge went to 3px while bd-bentoitem's held at 1px. That argument is spent
195
+ -- neither card draws an edge now -- but it is worth keeping the
196
+ conclusion: a border is a hairline against a shape, not a distance
197
+ between things, so it never belongs on the spacing scale. */
198
+ /* --spacing-32, the step, not 2em. Both are 32px at a 16px root and the
199
+ em was never a decision -- ten other cards spell the same inset with the
200
+ scale, and an em here would also drift with any font-size this box ever
201
+ inherits. */
202
+ padding: var(--card-padding);
175
203
  display: flex;
176
204
  flex-direction: column;
177
205
  align-items: start;
178
206
  justify-content: center;
179
207
  text-align: start;
180
208
  cursor: pointer;
181
- transition: transform 0.2s ease-in-out;
209
+ transition: transform var(--transition-duration-normal) var(--transition-easing-smooth);
182
210
  font-family: var(--typography-fontFamily-sans);
183
211
  position: relative;
184
- z-index: 2;
185
- }
186
-
187
- .bd-box bd-h {
188
- font-size: var(--spacing-18);
189
- margin: var(--spacing-0) var(--spacing-0) 0.5em var(--spacing-0);
190
- font-weight: 600;
191
- font-family: var(--typography-fontFamily-sans);
192
- padding: 10px 0; /* Adaugă aici */
193
-
194
- }
195
-
196
- .bd-box p {
197
- font-size: var(--spacing-16);
198
- margin: var(--spacing-0) var(--spacing-0) 1em var(--spacing-0);
199
- font-family: var(--typography-fontFamily-sans);
200
- }
201
-
202
- .bd-modal {
203
- position: fixed;
204
- top: var(--spacing-0);
205
- left: var(--spacing-0);
206
- width: 100%;
207
- height: 100%;
208
- background: rgba(0, 0, 0, 0.5);
209
- display: flex;
210
- justify-content: center;
211
- align-items: center;
212
- z-index: 9999;
213
- backdrop-filter: blur(var(--spacing-12));
214
- opacity: 0;
215
- transform: scale(0.9);
216
- transition: opacity 0.3s ease, transform 0.3s ease;
217
- }
218
-
219
- .bd-modal[open] {
220
- opacity: 1;
221
- transform: scale(1);
212
+ z-index: var(--z-raised);
222
213
  }
223
214
 
224
- .bd-modal-content {
225
- background: #fff;
226
- padding: 2em;
227
- border-radius: var(--spacing-12);
228
- max-width: 500px;
229
- text-align: start;
230
- box-shadow: var(--spacing-0) var(--spacing-2) var(--spacing-8) rgba(0, 0, 0, 0.2);
231
- font-family: var(--typography-fontFamily-sans);
232
- }
233
-
234
- .bd-modal-content h2 {
235
- margin: var(--spacing-0) var(--spacing-0) 1em var(--spacing-0);
236
- font-family: var(--typography-fontFamily-sans);
237
- }
238
215
 
239
- .bd-modal-content button {
240
- margin-top: 1em;
241
- padding: 0.5em 1em;
242
- background: var(--bd-blue-color);
243
- color: #fff;
244
- border: none;
245
- border-radius: var(--spacing-8);
246
- cursor: pointer;
247
- font-family: var(--typography-fontFamily-sans);
248
- }
216
+ /* A verbatim copy of modal.css.js stood here. The carousel renders
217
+ <bd-modal>, which styles its own shadow root, so none of it could ever
218
+ match: measured zero .bd-modal / .bd-modal-content elements in every
219
+ carousel story, including "Modal — Click + to Open". */
249
220
 
250
221
  .bd-plus-button {
251
222
  content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" fill="none"><circle cx="20" cy="20" r="19" stroke="%23006DFF" stroke-width="2"/><path d="M19 11H21V29H19V11Z" fill="%23006DFF"/><path d="M29 19V21L11 21L11 19L29 19Z" fill="%23006DFF"/></svg>');
252
223
  position: absolute;
253
224
  bottom: var(--spacing-10);
254
225
  right: var(--spacing-10);
255
- color: var(--bd-blue-color);
256
226
  width: var(--spacing-44);
257
227
  height: var(--spacing-44);
258
228
  display: flex;
259
229
  align-items: center;
260
230
  justify-content: center;
261
231
  border-radius: 50%;
262
- font-size: 30px;
263
- font-weight: bold;
264
232
  cursor: pointer;
233
+ /* color, font-size: 30px and font-weight: bold stood here, styling the "+"
234
+ this div contains (carousel.js:49). They painted nothing. The content:
235
+ url() above REPLACES the element, so the text node is never laid out --
236
+ measured in components-carousel--modal-trigger, the "+" range reports 0
237
+ client rects while the box is 44x44 and computed color is still
238
+ rgb(0, 109, 255).
239
+ .
240
+ Removing the color also retired --bd-blue-color, the last private alias
241
+ plans/foundation-plan.md claimed had already been removed. What actually
242
+ paints the mark is %23006DFF, baked into the data URI twice -- reachable
243
+ by no token rule. plans/LATER.md entry 3. */
265
244
  }
266
245
  .bd-plus-button:hover {
267
246
  content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" fill="none"><circle cx="20" cy="20" r="19" fill="%23F0F7FF" stroke="%23006DFF" stroke-width="2"/><path d="M19 11H21V29H19V11Z" fill="%23006DFF"/><path d="M29 19V21L11 21L11 19L29 19Z" fill="%23006DFF"/></svg>');
268
247
  }
269
248
 
270
249
 
271
- bd-carousel-item::part(content) {
272
- font-family: var(--typography-fontFamily-sans);
273
- }
250
+ /* A "bd-carousel-item::part(content)" rule stood here and was dead three
251
+ times over. The items are light-DOM children of bd-carousel-section -- its
252
+ shadow root holds a slot -- so a selector in this stylesheet cannot reach
253
+ them in either host that adopts it; bd-carousel-item exposes no part named
254
+ "content" at all; and .bd-box above already sets this same font-family,
255
+ which everything inside it inherits. Measured: the item's box computes the
256
+ IBM Plex Sans stack with this rule gone. */
274
257
 
275
258
  .bd-plus-button:active {
276
259
  content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" fill="none"><circle cx="20" cy="20" r="19" fill="%23006DFF" stroke="%23006DFF" stroke-width="2"/><path d="M19 11H21V29H19V11Z" fill="white"/><path d="M29 19V21L11 21L11 19L29 19Z" fill="white"/></svg>');
@@ -284,7 +267,7 @@ export default css`
284
267
  margin-left: var(--spacing-6);
285
268
  }
286
269
 
287
- @media (max-width: 768px) {
270
+ @media ${unsafeCSS(below('md'))} {
288
271
  .bd-carousel-track {
289
272
  flex-wrap: nowrap;
290
273
  overflow-x: hidden;
@@ -304,7 +287,11 @@ export default css`
304
287
 
305
288
  .bd-arrow {
306
289
  bottom: -75px;
307
- font-size: var(--spacing-16);
290
+ /* no role: .bd-arrow is an <img> -- left-arrow.svg / right-arrow.svg in
291
+ carousel.js. It renders no text, so this styles nothing but the alt
292
+ text a browser shows when the SVG fails to load. Fallback typography
293
+ is not a role decision. */
294
+ font-size: var(--typography-fontSize-base);
308
295
  }
309
296
 
310
297
  .bd-arrow:first-of-type {
@@ -326,11 +313,18 @@ export default css`
326
313
  padding: 2em;
327
314
  }
328
315
 
329
- .bd-plus-icon {
330
- font-size: var(--spacing-24);
331
- }
332
316
  .bd-carousel-icon {
333
317
  bottom: var(--spacing-10);
334
318
  }
335
319
  }
320
+
321
+ /* A reader who asked for less motion was still getting the track snap and the item lift. Twenty-three
322
+ of the thirty animated directories in this package honour the query; this
323
+ one did not. */
324
+ @media (prefers-reduced-motion: reduce) {
325
+ .bd-carousel-track,
326
+ .bd-box {
327
+ transition: none;
328
+ }
329
+ }
336
330
  `;