@repobit/dex-system-design 0.25.11 → 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 +195 -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,80 +1,66 @@
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
  font-family: var(--typography-fontFamily-sans);
7
- background: var(--color-blue-50);
8
+ background: var(--status-brand-surface);
8
9
  }
9
10
 
10
- /* === DARK VARIANT === */
11
+ /* === DARK VARIANT ===
12
+ The same inverse band bd-process-steps draws, read through the same
13
+ inverse roles, so the two dark sections agree. */
11
14
  :host([variant="dark"]) {
15
+ /* no token: the #0b1626 end stop is bd-process-steps' gradient, shared
16
+ until the inverse band has a role of its own. */
12
17
  background: linear-gradient(160deg, var(--color-neutral-800) 0%, #0b1626 100%);
13
18
  }
14
19
 
15
20
  :host([variant="dark"]) .bd-comparisonpanel-title {
16
- color: var(--color-neutral-0, #fff);
21
+ color: var(--color-text-inverse);
17
22
  }
18
23
 
19
24
  :host([variant="dark"]) .bd-comparisonpanel-description {
20
- color: rgba(255, 255, 255, 0.55);
21
- }
22
-
23
- :host([variant="dark"]) .bd-comparisonpanel-eyebrow {
24
- color: var(--color-blue-400, #60a5fa);
25
+ color: var(--color-text-muted-inverse);
25
26
  }
26
27
 
27
28
  :host([variant="dark"]) .bd-comparisonpanel-column {
28
- background: rgba(255, 255, 255, 0.03);
29
- border-color: rgba(255, 255, 255, 0.1);
29
+ /* no token: a 3% white lift on the inverse band; no surface role is
30
+ translucent. */
31
+ background: color-mix(in srgb, var(--color-neutral-0) 3%, transparent);
32
+ border-color: var(--color-border-container-inverse);
30
33
  }
31
34
 
32
35
  :host([variant="dark"]) .bd-comparisonpanel-column-title {
33
- color: rgba(255, 255, 255, 0.5);
34
- font-family: var(--typography-fontFamily-mono, monospace);
36
+ color: var(--color-text-muted-inverse);
37
+ font-family: var(--typography-fontFamily-mono);
35
38
  text-transform: uppercase;
36
- letter-spacing: 0.08em;
37
- font-weight: var(--typography-fontWeight-bold, 700);
38
- font-size: var(--typography-fontSize-xs, 12px);
39
+ letter-spacing: var(--typography-letterSpacing-widest);
40
+ /* no role: the mono column label, a marker rather than a text type --
41
+ see header-code.css.js's code badge. */
42
+ font-weight: var(--typography-fontWeight-bold);
43
+ /* no role: the size of the same marker. */
44
+ font-size: var(--typography-fontSize-xs);
39
45
  }
40
46
 
41
47
  :host([variant="dark"]) .bd-comparisonpanel-text {
42
- color: rgba(255, 255, 255, 0.85);
43
- }
44
-
45
- :host([variant="dark"]) .bd-comparisonpanel-icon--positive {
46
- background: var(--color-green-600, #16a34a);
47
- }
48
-
49
- :host([variant="dark"]) .bd-comparisonpanel-icon--negative {
50
- background: var(--color-red-500, #ef4444);
48
+ color: var(--color-text-inverse);
51
49
  }
52
50
 
53
51
  .bd-comparisonpanel-wrapper {
54
- max-width: var(--layout-ensemble-max-width, 1200px);
55
- margin: 0 auto;
56
- padding: var(--spacing-48) var(--layout-ensemble-inline-padding, var(--spacing-24));
52
+ padding-block: var(--spacing-48);
57
53
  box-sizing: border-box;
58
54
  }
59
55
 
60
- /* Small eyebrow label above the title, e.g. "Clarity" — optional, only
61
- rendered when the eyebrow prop/slot is used. */
62
- .bd-comparisonpanel-eyebrow {
63
- margin: 0 0 var(--spacing-8);
64
- color: var(--color-blue-500);
65
- font-weight: var(--typography-fontWeight-bold, 700);
66
- }
67
-
68
56
  .bd-comparisonpanel-title {
69
57
  margin: 0 0 var(--spacing-16);
70
- color: var(--color-neutral-900);
71
- line-height: var(--typography-lineHeight-tight, 1.1);
72
58
  }
73
59
 
74
60
  .bd-comparisonpanel-description {
75
61
  margin: 0 0 var(--spacing-48);
76
- color: var(--color-neutral-600);
77
- max-width: 72ch;
62
+ color: var(--color-text-muted);
63
+ max-width: var(--content-width-readable);
78
64
  }
79
65
 
80
66
  /* === COLUMNS === */
@@ -85,16 +71,15 @@ export default css`
85
71
  }
86
72
 
87
73
  .bd-comparisonpanel-column {
88
- background: var(--color-neutral-0, #fff);
89
- border: 1px solid var(--color-neutral-100, #e5e7eb);
90
- border-radius: var(--radius-2xl);
91
- padding: var(--spacing-32);
74
+ background: var(--color-surface-default);
75
+ border: var(--border-width-1) solid var(--color-border-container);
76
+ border-radius: var(--card-radius);
77
+ padding: var(--card-padding);
92
78
  box-sizing: border-box;
93
79
  }
94
80
 
95
81
  .bd-comparisonpanel-column-title {
96
82
  margin: 0 0 var(--spacing-16);
97
- color: var(--color-neutral-900);
98
83
  }
99
84
 
100
85
  /* === LIST === */
@@ -125,21 +110,23 @@ export default css`
125
110
  }
126
111
 
127
112
  .bd-comparisonpanel-icon--positive {
128
- background: var(--color-green-700);
113
+ background: var(--status-success-fill);
129
114
  }
130
115
 
131
116
  .bd-comparisonpanel-icon--negative {
132
- background: var(--color-red-600);
117
+ background: var(--status-error-fill);
133
118
  }
134
119
 
135
120
  .bd-comparisonpanel-text {
136
121
  margin: 0;
137
- color: var(--color-neutral-800);
138
- line-height: var(--typography-lineHeight-normal);
122
+ /* Body copy. It sat on neutral-800, which is not the primitive
123
+ behind any text role -- primary is neutral-900, secondary
124
+ neutral-700 -- so it belonged to no tier. */
125
+ color: var(--color-text-primary);
139
126
  }
140
127
 
141
128
  /* === RESPONSIVE === */
142
- @media (max-width: 767px) {
129
+ @media ${unsafeCSS(below('md'))} {
143
130
  .bd-comparisonpanel-columns {
144
131
  grid-template-columns: 1fr;
145
132
  }
@@ -149,7 +136,7 @@ export default css`
149
136
  }
150
137
 
151
138
  .bd-comparisonpanel-column {
152
- padding: var(--spacing-24);
139
+ padding: var(--card-padding-compact);
153
140
  }
154
141
  }
155
142
  `;
@@ -3,6 +3,7 @@ import { tokens } from "../../tokens/tokens.js";
3
3
  import "../heading/heading.js";
4
4
  import "../paragraph/paragraph.js";
5
5
  import comparisonPanelCSS from "./comparison-panel.css.js";
6
+ import { ensembleCSS } from "../shared/ensemble.css.js";
6
7
 
7
8
  class ComparisonPanel extends LitElement {
8
9
  static properties = {
@@ -18,7 +19,7 @@ class ComparisonPanel extends LitElement {
18
19
  variant : { type: String, reflect: true }
19
20
  };
20
21
 
21
- static styles = [tokens, comparisonPanelCSS];
22
+ static styles = [tokens, ensembleCSS, comparisonPanelCSS];
22
23
 
23
24
  constructor() {
24
25
  super();
@@ -63,7 +64,7 @@ class ComparisonPanel extends LitElement {
63
64
  </svg>
64
65
  `}
65
66
  </span>
66
- <bd-p kind="regular" class="bd-comparisonpanel-text">${item}</bd-p>
67
+ <bd-p variant="regular" class="bd-comparisonpanel-text">${item}</bd-p>
67
68
  </li>
68
69
  `
69
70
  )}
@@ -76,7 +77,7 @@ class ComparisonPanel extends LitElement {
76
77
 
77
78
  render() {
78
79
  return html`
79
- <div class="bd-comparisonpanel-wrapper">
80
+ <div class="bd-ensemble bd-comparisonpanel-wrapper">
80
81
  ${this.title
81
82
  ? html`
82
83
  <bd-h as="h2" class="bd-comparisonpanel-title">
@@ -87,7 +88,7 @@ class ComparisonPanel extends LitElement {
87
88
 
88
89
  ${this.description
89
90
  ? html`
90
- <bd-p kind="large" class="bd-comparisonpanel-description">
91
+ <bd-p variant="large" class="bd-comparisonpanel-description">
91
92
  <slot name="description">${this.description}</slot>
92
93
  </bd-p>
93
94
  `
@@ -2,7 +2,7 @@ import { html } from "lit";
2
2
  import "./comparison-panel.js";
3
3
 
4
4
  export default {
5
- title : "Components/Comparison Panel",
5
+ title : "Modules/Comparison Panel",
6
6
  component : "bd-comparison-panel",
7
7
  tags : ["autodocs"],
8
8
  parameters: {
@@ -1,4 +1,5 @@
1
- import { css } from "lit";
1
+ import { css, unsafeCSS } from "lit";
2
+ import { below } from "../shared/token-scales.js";
2
3
 
3
4
  export default css`
4
5
  :host {
@@ -7,56 +8,62 @@ export default css`
7
8
  }
8
9
 
9
10
  :host([background="blue"]) {
10
- background: var(--color-blue-50);
11
+ background: var(--status-brand-surface);
11
12
  }
12
13
  /* variant="light" + background="bordered": renders its own card border
13
14
  and hover lift, so callers don't need a manual wrapper <div> just to
14
15
  get the bordered-card look (e.g. side-by-side requirement cards). */
15
16
  :host([variant="light"][background="bordered"]) {
16
17
  display: block;
17
- border: 1px solid var(--color-neutral-100, #e5e7eb);
18
- border-radius: var(--radius-xl, 12px);
19
- padding: var(--spacing-24, 24px);
18
+ border: var(--border-width-1) solid var(--color-border-container);
19
+ border-radius: var(--radius-xl);
20
+ padding: var(--spacing-24);
20
21
  box-sizing: border-box;
21
- transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
22
+ transition:
23
+ transform var(--transition-duration-normal) var(--transition-easing-ease),
24
+ box-shadow var(--transition-duration-normal) var(--transition-easing-ease),
25
+ border-color var(--transition-duration-normal) var(--transition-easing-ease);
22
26
  }
23
27
 
24
28
  :host([variant="light"][background="bordered"]:hover) {
25
- transform: translateY(-3px);
26
- box-shadow: 0 14px 40px #00000012;
27
- border-color: var(--color-neutral-200);
29
+ transform: translateY(calc(-1 * var(--spacing-4)));
30
+ box-shadow: var(--shadow-lg);
31
+ border-color: var(--color-border-subtle);
32
+ }
33
+
34
+ @media (prefers-reduced-motion: reduce) {
35
+ :host([variant="light"][background="bordered"]) {
36
+ transition: none;
37
+ }
28
38
  }
29
39
 
30
40
  :host([variant="light"][background="bordered"]) .bd-compattable-wrapper {
31
- padding: 0;
41
+ padding: var(--spacing-0);
32
42
  }
43
+
33
44
  .bd-compattable-wrapper {
34
- max-width: var(--layout-ensemble-max-width, 1200px);
35
- margin: 0 auto;
36
- padding: var(--spacing-48) 0px var(--spacing-0);
45
+ padding-block: var(--spacing-48) var(--spacing-0);
37
46
  box-sizing: border-box;
38
47
  }
39
48
 
40
49
  .bd-compattable-title {
41
50
  display: block;
42
51
  margin: 0 0 var(--spacing-12);
43
- color: var(--color-neutral-1000);
44
- line-height: var(--typography-lineHeight-tight, 1.1);
45
52
  }
46
53
 
47
54
  .bd-compattable-description {
48
55
  display: block;
49
56
  margin: 0 0 var(--spacing-32);
50
- color: var(--color-neutral-600);
51
- max-width: 72ch;
57
+ color: var(--color-text-muted);
58
+ max-width: var(--content-width-readable);
52
59
  }
53
60
 
54
61
  .bd-compattable-table-container {
55
62
  display: table;
56
63
  width: 100%;
57
- background: var(--color-neutral-0, #fff);
58
- border: 1px solid var(--color-neutral-100, #e5e7eb);
59
- border-radius: var(--radius-xl, 12px);
64
+ background: var(--color-surface-default);
65
+ border: var(--border-width-1) solid var(--color-border-container);
66
+ border-radius: var(--radius-xl);
60
67
  overflow: hidden;
61
68
  box-sizing: border-box;
62
69
  }
@@ -64,8 +71,8 @@ export default css`
64
71
  .bd-compattable-header {
65
72
  display: grid;
66
73
  grid-template-columns: 1.4fr 1.2fr 2.4fr;
67
- background: var(--color-neutral-50);
68
- border-bottom: 1px solid var(--color-neutral-200);
74
+ background: var(--color-surface-subtle);
75
+ border-bottom: var(--border-width-1) solid var(--color-border-subtle);
69
76
  }
70
77
 
71
78
  :host([variant="outcome"]) .bd-compattable-header {
@@ -78,18 +85,48 @@ export default css`
78
85
 
79
86
  .bd-compattable-header-cell {
80
87
  padding: var(--spacing-16) var(--spacing-24);
81
- color: var(--color-neutral-700);
82
- font-family: var(--typography-fontFamily-mono, monospace);
88
+ color: var(--color-text-secondary);
89
+ font-family: var(--typography-fontFamily-mono);
90
+ /* no role: the size is part of the same decision as the leading below --
91
+ mono, semibold and tracked at 14px is a table header, and no role in the
92
+ vocabulary carries that combination. */
83
93
  font-size: var(--typography-fontSize-sm);
94
+ /* The leading these five text sites were all missing. Measured before, every
95
+ one of them computed line-height: normal -- the font's own metric rather
96
+ than a decision, which CLAUDE.md rule 2 says is never a typography
97
+ contract. 34 elements across the built stories rendered that way.
98
+
99
+ --typography-lineHeight-tight, because it is what the metric already
100
+ resolved to: the 16px cells measured a 20px line box (1.25 exactly) and
101
+ the 12px header 15px (1.25 exactly). Naming it makes today's appearance a
102
+ choice that survives a font fallback instead of an accident that does
103
+ not. The 14px mono header is the one that moves -- IBM Plex Mono's normal
104
+ is 1.286 there, so its line box goes 18px to 17.5px inside 16px of
105
+ padding.
106
+
107
+ no role: nothing in the role vocabulary matches this table. The headers
108
+ are mono, semibold and tracked, and the cells are semibold at 16px where
109
+ body-regular is 400 -- adopting a role would restyle the table rather
110
+ than give it the leading it was missing. */
111
+ line-height: var(--typography-lineHeight-tight);
84
112
  text-transform: uppercase;
85
113
  letter-spacing: .06em;
86
- font-weight: var(--font-weight-mono-semibold);
114
+ /* no role: the weight completes the combination the leading comment above
115
+ describes. body-regular is 400 and label-default is 500; a header cell at
116
+ 600 belongs to no declared role. */
117
+ font-weight: var(--typography-fontWeight-semibold);
87
118
  }
88
119
 
89
120
  :host([variant="outcome"]) .bd-compattable-header-cell,
90
121
  :host([variant="risk"]) .bd-compattable-header-cell {
122
+ /* no role: same table, same decision as the header cell above. The pair of
123
+ axes this rule sets happens to match control-label-small, but a table cell is
124
+ not a control label -- adopting it would restyle the table rather than
125
+ give it the leading it was missing. */
91
126
  font-size: var(--typography-fontSize-xs);
92
- color: var(--color-neutral-600);
127
+ /* no role: see the header cell above on the missing leading. */
128
+ line-height: var(--typography-lineHeight-tight);
129
+ color: var(--color-text-muted);
93
130
  }
94
131
 
95
132
  .bd-compattable-body {
@@ -100,7 +137,14 @@ export default css`
100
137
  .bd-compattable-row {
101
138
  display: grid;
102
139
  grid-template-columns: 1.4fr 1.2fr 2.4fr;
103
- border-bottom: 1px solid var(--color-neutral-50, #f3f4f6);
140
+ /* no role: a boundary, and no border role sits at neutral-50 -- the family
141
+ starts at container (neutral-100) and gets darker. The decision of
142
+ 2026-09-14 was that a boundary like this is DECORATIVE, so it is exempt
143
+ from the 3:1 non-text bar (it measures 1.12:1 against white) and does not
144
+ need to move up the family to earn one. The lighter row is deliberately
145
+ lighter than .bd-compattable-lightrow below, which takes
146
+ --color-border-container. */
147
+ border-bottom: var(--border-width-1) solid var(--color-neutral-50);
104
148
  }
105
149
 
106
150
  :host([variant="outcome"]) .bd-compattable-row {
@@ -119,17 +163,29 @@ export default css`
119
163
  padding: var(--spacing-20) var(--spacing-24);
120
164
  display: flex;
121
165
  align-items: center;
122
- color: var(--color-neutral-800);
166
+ /* Cell data, one step back from the row label beside it, which
167
+ is text-primary. Secondary keeps that hierarchy; primary
168
+ would have flattened the two together. */
169
+ color: var(--color-text-secondary);
170
+ /* no role: same table, same decision as the header cell above. The pair of
171
+ axes this rule sets happens to match control-label-large, but a table cell is
172
+ not a control label -- adopting it would restyle the table rather than
173
+ give it the leading it was missing. */
123
174
  font-size: var(--typography-fontSize-base);
175
+ /* no role: see the header cell above on the missing leading. */
176
+ line-height: var(--typography-lineHeight-tight);
124
177
  }
125
178
 
126
179
  .bd-compattable-cell--environment {
127
- color: var(--color-neutral-900);
180
+ color: var(--color-text-primary);
181
+ /* no role: the weight axis of the same table, and the same decision --
182
+ see the header cell above. */
128
183
  font-weight: var(--typography-fontWeight-semibold);
129
184
  }
130
185
 
131
186
  .bd-compattable-cell--notes {
132
- color: var(--color-neutral-800);
187
+ /* Supporting notes. */
188
+ color: var(--color-text-secondary);
133
189
  gap: var(--spacing-8);
134
190
  }
135
191
 
@@ -138,62 +194,115 @@ export default css`
138
194
  }
139
195
 
140
196
  .bd-compattable-cell--event {
141
- color: var(--color-neutral-900);
197
+ color: var(--color-text-primary);
198
+ /* no role: the weight axis of the same table, and the same decision --
199
+ see the header cell above. */
142
200
  font-weight: var(--typography-fontWeight-semibold);
143
201
  }
144
202
 
203
+ /* These two cells say whether a product has a feature, which is the success
204
+ and error responsibility rather than "a green" and "a red". The status
205
+ roles were already the right answer and also the legible one: green-600
206
+ measures 3.20:1 on white and --status-success-text 6.77, red-600 5.44 and
207
+ --status-error-text 7.56. The green was a genuine failure; the red was only
208
+ the wrong family. */
145
209
  .bd-compattable-cell--without {
146
- color: var(--color-red-600, #dc2626);
210
+ color: var(--status-error-text);
147
211
  }
148
212
 
149
213
  .bd-compattable-cell--with {
150
- color: var(--color-green-600, #16a34a);
214
+ color: var(--status-success-text);
151
215
  }
152
216
 
153
217
  .bd-compattable-cell--category {
154
- color: var(--color-neutral-900);
218
+ color: var(--color-text-primary);
219
+ /* no role: the weight axis of the same table, and the same decision --
220
+ see the header cell above. */
155
221
  font-weight: var(--typography-fontWeight-semibold);
156
222
  }
157
223
 
158
224
  .bd-compattable-cell--riskcoverage {
159
- color: var(--color-neutral-900);
160
- }
161
- .bd-compattable-lightgrid {
162
- display: grid;
163
- grid-template-columns: repeat(var(--bd-compattable-light-columns, 2), 1fr);
164
- column-gap: var(--spacing-48);
165
- row-gap: 0;
166
- }
167
- .bd-compattable-lightrow:last-of-type {
168
- border-bottom: none;
169
- }
225
+ /* no role: the risk-coverage cell's ink. This is the one genuine non-interactive
226
+ brand-ink site in the package -- everything else at blue-700 is a :hover, an
227
+ active state, a glyph on a tinted disc, or dead. ONE SITE DOES NOT NAME A ROLE:
228
+ phase-1-eyebrow-investigation settled that precedent when "eyebrow" turned out to
229
+ be one question asked four times and took a marker rather than a role, and the
230
+ plan's single-consumer-semantic-token item exists because Phase 3's job is to
231
+ FIND AND DELETE exactly the shape a --color-text-brand-strong invented here would
232
+ create.
233
+ .
234
+ The size-dependent-ink hypothesis was tested package-wide and rejected; see
235
+ plans/reports/phase-2-size-dependent-ink-check.md. Note separately that this cell
236
+ is role="cell" with no href and renders as blue running prose, so it reads as a
237
+ link without being one -- a UX question, not a token one. */
238
+ color: var(--color-blue-700);
239
+ }
240
+
241
+ /* === LIGHT VARIANT === */
242
+ .bd-compattable-lightgrid {
243
+ display: grid;
244
+ grid-template-columns: repeat(var(--bd-compattable-light-columns, 2), 1fr);
245
+ column-gap: var(--spacing-48);
246
+ row-gap: 0;
247
+ }
248
+
249
+ .bd-compattable-lightrow:last-of-type {
250
+ border-bottom: none;
251
+ }
252
+
170
253
  .bd-compattable-lightrow {
171
254
  display: flex;
172
255
  align-items: baseline;
173
256
  justify-content: space-between;
174
257
  gap: var(--spacing-16);
175
258
  padding: var(--spacing-16) 0;
176
- border-bottom: 1px solid var(--color-neutral-100, #e5e7eb);
259
+ /* A boundary, not a divider: the line belongs to the row it closes, so it
260
+ is a border and takes a border role. --color-border-container is
261
+ neutral-100 exactly, so nothing moves. Decided 2026-09-14 -- see
262
+ plans/reports/phase-2-vocab-e-has-role-pass.md question E3. */
263
+ border-bottom: var(--border-width-1) solid var(--color-border-container);
177
264
  }
178
265
 
179
266
  .bd-compattable-lightlabel {
180
- color: var(--color-neutral-500);
267
+ color: var(--color-text-subtle);
268
+ /* no role: same table, same decision as the header cell above. The pair of
269
+ axes this rule sets happens to match control-label-large, but a table cell is
270
+ not a control label -- adopting it would restyle the table rather than
271
+ give it the leading it was missing. */
181
272
  font-size: var(--typography-fontSize-base);
273
+ /* no role: see the header cell above on the missing leading. */
274
+ line-height: var(--typography-lineHeight-tight);
182
275
  flex-shrink: 0;
183
276
  }
184
277
 
278
+ /* On the blue band the label leaves subtle for muted: subtle sits on the
279
+ page or a card, and on --status-brand-surface it measured 4.46:1. Muted
280
+ reads 6.10 there. Dark mode decision 17. */
281
+ :host([background="blue"]) .bd-compattable-lightlabel {
282
+ color: var(--color-text-muted);
283
+ }
284
+
185
285
  .bd-compattable-lightvalue {
186
- color: var(--color-neutral-900);
286
+ color: var(--color-text-primary);
287
+ /* no role: the weight axis of the same table, and the same decision --
288
+ see the header cell above. */
187
289
  font-weight: var(--typography-fontWeight-semibold);
188
290
  text-align: right;
189
291
  }
190
292
 
191
- @media (max-width: 767px) {
293
+ /* === RESPONSIVE === */
294
+ @media ${unsafeCSS(below('md'))} {
192
295
  .bd-compattable-header {
193
296
  display: none;
194
297
  }
195
298
 
196
- .bd-compattable-row {
299
+ /* The two variant rules above are more specific than a bare class, and a
300
+ media query adds no specificity, so naming only .bd-compattable-row here
301
+ left the outcome and risk variants on their desktop column template at
302
+ phone widths. Outcome stayed three columns and ran 113px off the page. */
303
+ .bd-compattable-row,
304
+ :host([variant="outcome"]) .bd-compattable-row,
305
+ :host([variant="risk"]) .bd-compattable-row {
197
306
  grid-template-columns: 1fr;
198
307
  padding: var(--spacing-16) var(--spacing-20);
199
308
  gap: var(--spacing-4);
@@ -203,38 +312,29 @@ export default css`
203
312
  padding: var(--spacing-4) 0;
204
313
  }
205
314
 
206
- .bd-compattable-cell--coverage::before {
207
- content: "Coverage: ";
208
- color: var(--color-neutral-500);
209
- font-size: var(--typography-fontSize-xs);
210
- text-transform: uppercase;
211
- }
212
-
213
- .bd-compattable-cell--notes::before {
214
- content: "Notes: ";
215
- color: var(--color-neutral-500);
216
- font-size: var(--typography-fontSize-xs);
217
- text-transform: uppercase;
218
- }
219
-
220
- .bd-compattable-cell--without::before {
221
- content: "Without AI Guardian: ";
222
- color: var(--color-neutral-500);
223
- font-size: var(--typography-fontSize-xs);
224
- text-transform: uppercase;
225
- }
226
-
227
- .bd-compattable-cell--with::before {
228
- content: "With AI Guardian: ";
229
- color: var(--color-neutral-500);
230
- font-size: var(--typography-fontSize-xs);
231
- text-transform: uppercase;
232
- }
233
-
315
+ /* One rule, and the name comes from --bd-cell-label, which
316
+ compatibility-table.js sets per cell out of the columns prop. Five rules
317
+ stood here with the column names written into content as English
318
+ strings -- "Without AI Guardian: " and the rest -- so below md, where
319
+ the header is display: none, the only column labelling on screen was
320
+ text the consumer could neither change nor translate. Measured at 375
321
+ with Romanian columns: header "Fara AI Guardian", cell label
322
+ "Without AI Guardian". The empty fallback means a cell with no column
323
+ name shows nothing rather than the literal text of a broken var(). */
324
+ .bd-compattable-cell--coverage::before,
325
+ .bd-compattable-cell--notes::before,
326
+ .bd-compattable-cell--without::before,
327
+ .bd-compattable-cell--with::before,
234
328
  .bd-compattable-cell--riskcoverage::before {
235
- content: "AI Guardian coverage: ";
236
- color: var(--color-neutral-500);
329
+ content: var(--bd-cell-label, "");
330
+ color: var(--color-text-subtle);
331
+ /* no role: same table, same decision as the header cell above. The pair of
332
+ axes this rule sets happens to match control-label-small, but a table cell is
333
+ not a control label -- adopting it would restyle the table rather than
334
+ give it the leading it was missing. */
237
335
  font-size: var(--typography-fontSize-xs);
336
+ /* no role: see the header cell above on the missing leading. */
337
+ line-height: var(--typography-lineHeight-tight);
238
338
  text-transform: uppercase;
239
339
  }
240
340