@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
@@ -12,9 +12,7 @@ export default css`
12
12
  grid-template-rows: auto auto;
13
13
  column-gap: var(--spacing-48);
14
14
  row-gap: 0;
15
- max-width: var(--layout-ensemble-max-width, 1200px);
16
- margin: 0 auto;
17
- padding: var(--spacing-48) var(--layout-ensemble-inline-padding, var(--spacing-24));
15
+ padding-block: var(--spacing-48);
18
16
  box-sizing: border-box;
19
17
  }
20
18
 
@@ -23,8 +21,6 @@ export default css`
23
21
  grid-column: 1 / -1;
24
22
  grid-row: 1;
25
23
  margin: 0;
26
- color: var(--color-neutral-1000);
27
- line-height: var(--typography-lineHeight-tight, 1.1);
28
24
  margin-bottom: var(--spacing-48);
29
25
  }
30
26
 
@@ -39,9 +35,11 @@ export default css`
39
35
 
40
36
  .bd-infopanel-description {
41
37
  margin: 0;
42
- color: var(--color-neutral-900);
38
+ color: var(--color-text-primary);
43
39
  max-width: 46ch;
44
- line-height: 1.5;
40
+ /* Keep: the max-width above is in ch, and ch resolves against THIS
41
+ element's font. Stating the family here is what pins the measure;
42
+ removing it would leave 46ch depending on whatever is inherited. */
45
43
  font-family: var(--typography-fontFamily-sans);
46
44
  }
47
45
 
@@ -69,24 +67,31 @@ export default css`
69
67
  padding-bottom: 0;
70
68
  }
71
69
 
70
+ /* --border-width-2, not a 2px literal. The 2px rule itself is deliberate --
71
+ it is the blue brand rule that separates each label/value pair, and
72
+ bd-trust-panel uses the same visual language for its statistics -- so this
73
+ is a token-category fix, not a design change. --border-width-2 is 2px, so
74
+ nothing moves. Removes the one baselined finding recorded against this
75
+ file, border-width-literal|overview.css.js|border-top: 2px. */
72
76
  .bd-infopanel-divider {
73
- border-top: 2px solid var(--color-blue-500);
77
+ border-top: var(--border-width-2) solid var(--color-border-brand);
74
78
  margin-bottom: var(--spacing-16);
75
79
  }
76
80
 
77
81
  .bd-infopanel-label {
78
82
  margin: 0;
79
- color: var(--color-neutral-600);
83
+ color: var(--color-text-muted);
84
+ /* Load-bearing, despite sitting on a bd-p host where the type axes are
85
+ inert. Those axes are dead because bd-p sets them on its own inner p;
86
+ text-transform it never sets, so this value inherits down to the
87
+ rendered text like any inherited property would. Deleting it
88
+ un-uppercases the label. See scripts/atom-inert-properties.json. */
80
89
  text-transform: uppercase;
81
- letter-spacing: .1em;
82
- font-family: var(--typography-fontFamily-mono, monospace);
83
- font-size: var(--typography-fontSize-xxs);
84
90
  }
85
91
 
86
92
  .bd-infopanel-value {
87
93
  margin: 0;
88
- color: var(--color-neutral-1000);
89
- font-weight: var(--typography-fontWeight-bold, 700);
94
+ color: var(--color-text-primary);
90
95
  }
91
96
 
92
97
  /* === RESPONSIVE === */
@@ -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 infoPanelCSS from "./overview.css.js";
6
+ import { ensembleCSS } from "../shared/ensemble.css.js";
6
7
 
7
8
  class Overview extends LitElement {
8
9
  static properties = {
@@ -11,7 +12,7 @@ class Overview extends LitElement {
11
12
  facts : { type: Array } // [{ label: String, value: String }]
12
13
  };
13
14
 
14
- static styles = [tokens, infoPanelCSS];
15
+ static styles = [tokens, ensembleCSS, infoPanelCSS];
15
16
 
16
17
  constructor() {
17
18
  super();
@@ -22,7 +23,7 @@ class Overview extends LitElement {
22
23
 
23
24
  render() {
24
25
  return html`
25
- <div class="bd-infopanel-container">
26
+ <div class="bd-ensemble bd-infopanel-container">
26
27
  ${this.title
27
28
  ? html`
28
29
  <bd-h as="h2" class="bd-infopanel-title">
@@ -34,7 +35,7 @@ class Overview extends LitElement {
34
35
  <div class="bd-infopanel-left">
35
36
  ${this.description
36
37
  ? html`
37
- <bd-p kind="large" class="bd-infopanel-description">
38
+ <bd-p variant="large" class="bd-infopanel-description">
38
39
  <slot name="description">${this.description}</slot>
39
40
  </bd-p>
40
41
  `
@@ -48,8 +49,8 @@ class Overview extends LitElement {
48
49
  (fact) => html`
49
50
  <div class="bd-infopanel-row">
50
51
  <div class="bd-infopanel-divider"></div>
51
- <bd-p kind="xsmall" class="bd-infopanel-label">${fact.label}</bd-p>
52
- <bd-p kind="normal" class="bd-infopanel-value">${fact.value}</bd-p>
52
+ <bd-p variant="xsmall" class="bd-infopanel-label">${fact.label}</bd-p>
53
+ <bd-p variant="regular" class="bd-infopanel-value">${fact.value}</bd-p>
53
54
  </div>
54
55
  `
55
56
  )}
@@ -2,8 +2,8 @@ import { html } from "lit";
2
2
  import "./overview.js";
3
3
 
4
4
  export default {
5
- title : "Components/Overview",
6
- component : "bd-info-panel",
5
+ title : "Modules/Overview",
6
+ component : "bd-overview",
7
7
  tags : ["autodocs"],
8
8
  parameters: {
9
9
  layout: "fullscreen",
@@ -16,7 +16,7 @@ labeled facts on the right, each row separated by a thin top border line — a
16
16
 
17
17
  ### Usage
18
18
  \`\`\`html
19
- <bd-info-panel
19
+ <bd-overview
20
20
  title="What is AI Guardian?"
21
21
  description="AI Guardian is a Bitdefender security product that helps protect people and organisations from the risks of autonomous AI agents — prompt injection, unsafe tool use, data leakage, and unauthorised actions. It adds a baseline security model of policies, permissions, and auditing, guardrails for tool execution, and monitoring and response workflows."
22
22
  .facts=\${[
@@ -25,7 +25,7 @@ labeled facts on the right, each row separated by a thin top border line — a
25
25
  { label: "RUNS AS", value: "Background service" },
26
26
  { label: "VERDICTS", value: "Allowed / Flagged / Blocked" }
27
27
  ]}
28
- ></bd-info-panel>
28
+ ></bd-overview>
29
29
  \`\`\`
30
30
 
31
31
  ### Attributes
@@ -54,11 +54,11 @@ labeled facts on the right, each row separated by a thin top border line — a
54
54
  };
55
55
 
56
56
  const render = (args) => html`
57
- <bd-info-panel
57
+ <bd-overview
58
58
  title=${args.title}
59
59
  description=${args.description}
60
60
  .facts=${args.facts}
61
- ></bd-info-panel>
61
+ ></bd-overview>
62
62
  `;
63
63
 
64
64
  export const Default = {
@@ -150,16 +150,16 @@ export const NoDescription = {
150
150
  export const SlottedContent = {
151
151
  name : "Slotted Title, Description, and Extra Facts",
152
152
  render: () => html`
153
- <bd-info-panel>
153
+ <bd-overview>
154
154
  <span slot="title">Custom <em>slotted</em> title</span>
155
155
  <span slot="description">Custom slotted description with <strong>inline markup</strong>.</span>
156
156
 
157
157
  <div slot="facts" class="bd-infopanel-row" style="display:flex; flex-direction:column; gap:4px; padding-top:16px;">
158
- <div style="border-top: 1px solid #3b82f6; margin-bottom:16px;"></div>
159
- <span style="text-transform:uppercase; letter-spacing:0.06em; font-size:12px; color:#60a5fa;">EXTRA</span>
158
+ <div style="border-top: 1px solid var(--color-border-brand); margin-bottom:16px;"></div>
159
+ <span style="text-transform:uppercase; letter-spacing:0.06em; font-size:12px; color:var(--color-text-brand);">EXTRA</span>
160
160
  <strong>A manually slotted fact row</strong>
161
161
  </div>
162
- </bd-info-panel>
162
+ </bd-overview>
163
163
  `,
164
164
  parameters: {
165
165
  docs: {
@@ -5,92 +5,149 @@ export const pageSwitcherStyles = css`
5
5
  display: block;
6
6
  position: sticky;
7
7
  top: 0;
8
- z-index: 200;
9
- background: var(--color-neutral-0);
10
- border-bottom: var(--border-width-1) solid var(--color-neutral-100);
11
- --bd-accesibility-focus: var(--color-blue-500);
8
+ z-index: var(--z-sticky);
9
+ /* --color-surface-default, the role, not --color-neutral-0, the primitive
10
+ it resolves to. Same value; the category is the point, and CLAUDE.md's
11
+ "same primitive value is not same semantic meaning" section exists for
12
+ exactly this. Found by check:color-coverage once the background shorthand came into
13
+ its scope -- it had been invisible because the check counted
14
+ background-color: and this package almost never writes that. */
15
+ background: var(--color-surface-default);
16
+ border-bottom: var(--border-width-1) solid var(--color-border-container);
12
17
  }
13
18
 
14
19
  .inner {
15
- max-width: 1200px;
16
- margin-inline: auto;
17
20
  padding-block: var(--spacing-16);
18
- padding-inline: var(--spacing-24);
19
21
  box-sizing: border-box;
20
22
  display: flex;
21
23
  align-items: center;
22
24
  justify-content: space-between;
23
- gap: var(--spacing-32);
25
+ /* The logo is a fixed 126px and the row could not give way, so on a 320px
26
+ screen the nav simply carried on past the edge. Letting the row wrap puts
27
+ the navigation under the brand when there is no room for both, and does
28
+ nothing at any width where they fit -- which is why there is no media
29
+ query here: the layout can tell when it has run out of room. */
30
+ flex-wrap: wrap;
31
+ gap: var(--spacing-16) var(--spacing-32);
24
32
  }
25
33
 
26
34
  .logo {
35
+ /* no role: a wordmark, not running text. Picking a text role for it would
36
+ assert a relationship to the type scale that a brand mark does not
37
+ have. The nearest role by value is heading-h6, which is a heading. */
27
38
  font-size: var(--typography-fontSize-lg);
39
+ /* no role: a wordmark, not running text. Picking a text role for it would
40
+ assert a relationship to the type scale that a brand mark does not
41
+ have. The nearest role by value is heading-h6, which is a heading. */
28
42
  font-weight: var(--typography-fontWeight-semibold);
29
- color: var(--color-neutral-900);
43
+ color: var(--color-text-primary);
30
44
  }
31
45
 
32
- .logo span {
33
- color: var(--color-blue-500);
34
- }
46
+ /* No ".logo span" rule. .logo is the class this component puts on a
47
+ bd-ai-icon, and that element renders a single svg in its own shadow root --
48
+ there is no span for a descendant selector to reach, and it never matched
49
+ in 4 shadow roots across 556 stories. The mark colours itself from the
50
+ token in its own path fill. */
35
51
 
36
52
  nav {
37
53
  display: flex;
38
54
  align-items: center;
55
+ /* This row gap was already declared for two lines of links and could never
56
+ apply, because nothing was allowed to wrap. Now it can. */
57
+ flex-wrap: wrap;
39
58
  gap: var(--spacing-16) var(--spacing-32);
40
59
  }
41
60
 
61
+ /* .page-link is the class this component puts on a bd-link HOST, so it can
62
+ style the host's box and nothing inside it. The ink is bd-link's, and the
63
+ six colour declarations that used to stand here were all overridden by the
64
+ atom's own variant rules on the anchor one level down. Measured at 1440,
65
+ rest and hover, current and not, after the family review moved every item
66
+ to variant="primary":
67
+
68
+ not current, rest --color-text-brand rgb(0, 89, 214)
69
+ not current, hover --color-action-primary-active rgb(0, 69, 173)
70
+ current, rest --color-text-primary rgb(21, 23, 25), weight 700
71
+ current, hover --color-text-primary rgb(21, 23, 25), weight 700
72
+
73
+ The last row is the one that changed behaviour rather than value: the
74
+ current item used to turn blue under the pointer, because
75
+ .bd-link--primary:hover outweighed .bd-link--active. bd-link now declares
76
+ .bd-link--active:hover and it holds.
77
+
78
+ None of those was what this sheet declared: the host went to
79
+ --color-action-primary-hover on hover and no text ever read it, and the
80
+ semibold on .page-link.active lost to the atom's .bd-link--active bold.
81
+ What is left here is the box -- position, padding, the indicator -- and the
82
+ ink is asked for through the atom's API, which is where it renders. */
42
83
  .page-link {
43
84
  position: relative;
44
85
  text-decoration: none !important;
45
- color: var(--color-neutral-900);
46
- font-weight: var(--typography-fontWeight-normal);
47
- padding: var(--spacing-10) var(--spacing-0);
48
86
  display: inline-block;
49
87
  font-size: var(--typography-body-regular-fontSize);
50
88
  font-family: var(--typography-body-regular-fontFamily);
51
- transition: color var(--transition-duration-fast) var(--transition-easing-smooth);
52
89
  }
53
90
 
54
- .page-link.active {
55
- font-weight: var(--typography-fontWeight-semibold);
56
- color: var(--color-neutral-900);
57
- }
91
+ /* The padding belongs to the PART, not to the host.
58
92
 
59
- .page-link:hover,
60
- .page-link.bd-link--primary:hover {
61
- color: var(--color-blue-500) !important;
62
- text-decoration: none !important;
63
- }
93
+ A host's padding does not extend the anchor inside it, so this rule used
94
+ to build a 44px-tall row around a 24px-tall target: measured 93x44 on the
95
+ host with a 93x24 <a> inside it, and elementsFromPoint 4px below the top
96
+ edge came back bd-page-switcher > bd-root > div with no <a> in the stack at
97
+ all. The top and bottom 10px of every item were dead, 45% of the height a
98
+ reader aims at.
64
99
 
65
- .page-link.bd-link--secondary:hover {
66
- color: var(--color-neutral-900) !important;
67
- text-decoration: none !important;
68
- }
100
+ It is also why the focus ring wrapped the glyphs rather than the item: the
101
+ ring is drawn on whatever element is focusable, and that was the 24px
102
+ anchor. One boundary, two symptoms.
69
103
 
70
- .page-link.active:hover {
71
- color: var(--color-neutral-900) !important;
104
+ bd-breadcrumb already fixed exactly this by moving its padding onto
105
+ ::part(link) -- its comment records a 343x40 row whose focusable anchor
106
+ was 43x24 -- and this is the same move. Layout is unchanged: the host has
107
+ no padding now but wraps an anchor that does, so it still measures 44px
108
+ and the indicator's offset still lands on the bar's bottom edge. */
109
+ .page-link::part(link) {
110
+ padding: var(--spacing-10) var(--spacing-0);
72
111
  }
73
112
 
113
+ /* The selected-item underline, through the role that names it. This was the
114
+ third spelling of the same line -- Components/Tab List and the anchor nav are
115
+ the two the --indicator-* comment already names -- and it is the one the
116
+ token comment says the role exists to end. Height, colour and duration
117
+ resolve to the same values it declared by hand; the easing does not, and
118
+ that drift is the reason the role was named.
119
+
120
+ The offset is the inner's padding-bottom, so the indicator lands on the
121
+ bar's bottom edge. This inner pads 16, and the 14 that stood here was
122
+ close enough to look right -- the indicator sat 2px shy of the edge --
123
+ which is how the number survived being copied into bd-anchor-nav, which
124
+ pads 10, and put the indicator outside that bar entirely.
125
+
126
+ Measured: link box bottom at 60, indicator was 71-74 against an inner
127
+ bottom edge of 76; now 73-76. */
74
128
  .page-link::after {
75
129
  content: "";
76
130
  position: absolute;
77
131
  left: var(--spacing-0);
78
- bottom: calc(-1 * var(--spacing-14));
132
+ bottom: calc(-1 * var(--spacing-16));
79
133
  width: 0%;
80
- height: var(--border-width-3);
81
- background-color: var(--color-blue-500);
82
- transition: width var(--transition-duration-slow) var(--transition-easing-ease-out);
134
+ height: var(--indicator-underline-height);
135
+ background-color: var(--indicator-color);
136
+ transition: width var(--indicator-underline-duration) var(--indicator-underline-easing);
83
137
  }
84
138
 
85
139
  .page-link.active::after {
86
140
  width: 100%;
87
141
  }
88
142
 
89
- .page-link:focus-visible {
90
- outline: var(--spacing-2) solid var(--bd-accesibility-focus);
91
- outline-offset: var(--spacing-2);
92
- border-radius: var(--space-2xs);
93
- }
143
+ /* No .page-link:focus-visible rule. .page-link is the class this component
144
+ puts on a bd-link HOST, and the focusable anchor lives inside bd-link's own
145
+ shadow root -- measured: 2 .page-link elements, both bd-link, neither
146
+ focusable, each with its own shadow root. The rule that stood here could
147
+ never match, so the outline it declared, the misspelled
148
+ --bd-accesibility-focus alias behind it and the two spacing steps it used
149
+ as an outline width and offset never rendered at all. bd-link already
150
+ carries the one focus ring, verified here by keyboard. */
94
151
 
95
152
  @media (prefers-reduced-motion: reduce) {
96
153
  .page-link::after {
@@ -3,13 +3,37 @@ import { tokens } from "../../tokens/tokens.js";
3
3
  import "../icons/bd-ai-icon.js";
4
4
  import "../link/link.js";
5
5
  import { pageSwitcherStyles } from "./page-switcher.css.js";
6
+ import { ensembleCSS } from "../shared/ensemble.css.js";
6
7
 
8
+ /**
9
+ * The product-level page navigation: a brand mark and one link per page, with
10
+ * the page you are on marked.
11
+ *
12
+ * Two notes on the markup below, both measured rather than assumed.
13
+ *
14
+ * The ink is Position 2 of the wayfinding family review: colour means
15
+ * AVAILABLE and neutral means current. Every item is variant="primary", so a
16
+ * resting item is --color-text-brand and hovers to --color-action-primary-active;
17
+ * the current one carries `active`, which drops it to --color-text-primary at
18
+ * weight 700 and takes the 3px indicator. bd-link's new .bd-link--active:hover
19
+ * keeps it there under the pointer.
20
+ *
21
+ * The variant is no longer switched per item. It used to be primary for the
22
+ * current one and secondary for the rest, which made the current item the only
23
+ * blue one -- the inverse of what the indicator says -- and left the resting
24
+ * items on the muted ramp. One variant plus `active` is the same information
25
+ * with one fewer thing to keep in step.
26
+ *
27
+ * `aria-current` is `page`, not the generic `true`. These items are pages; the
28
+ * anchor nav's items are positions inside one page and say `location`. Both are
29
+ * current-location markers and they are not the same claim.
30
+ */
7
31
  class BdPageSwitcher extends LitElement {
8
32
  static properties = {
9
33
  items: { type: Array } // [{ title, href, active }]
10
34
  };
11
35
 
12
- static styles = [tokens, pageSwitcherStyles];
36
+ static styles = [tokens, ensembleCSS, pageSwitcherStyles];
13
37
 
14
38
  constructor() {
15
39
  super();
@@ -18,18 +42,17 @@ class BdPageSwitcher extends LitElement {
18
42
 
19
43
  render() {
20
44
  return html`
21
- <div class="inner">
45
+ <div class="bd-ensemble inner">
22
46
  <bd-ai-icon class="logo" width="200" height="24"></bd-ai-icon>
23
47
 
24
48
  <nav aria-label="Product navigation">
25
49
  ${this.items.map(({ title, href, active }) => html`
26
50
  <bd-link
27
51
  href=${href}
28
- kind=${active ? "primary" : "secondary"}
52
+ variant="primary"
29
53
  no-underline
30
- color="var(--color-neutral-900)"
31
54
  ?active=${active}
32
- aria-current=${active ? "true" : nothing}
55
+ aria-current=${active ? "page" : nothing}
33
56
  class="page-link ${active ? "active" : ""}"
34
57
  >${title || nothing}</bd-link>
35
58
  `)}
@@ -0,0 +1,95 @@
1
+ import { html } from 'lit';
2
+ import './page-switcher.js';
3
+
4
+ export default {
5
+ title : 'Components/Page Switcher',
6
+ tags : ['autodocs'],
7
+ parameters: {
8
+ docs: {
9
+ description: {
10
+ component: `
11
+ **Page Switcher** is the sticky product bar that carries the brand mark and a
12
+ short set of sibling pages. One of them is current.
13
+
14
+ \`\`\`html
15
+ <bd-page-switcher
16
+ .items=\${[
17
+ { title: 'AI Guardian', href: '/ai-guardian', active: true },
18
+ { title: 'Skill Scanner', href: '/skill-scanner' }
19
+ ]}
20
+ ></bd-page-switcher>
21
+ \`\`\`
22
+
23
+ ### Layout
24
+
25
+ The brand mark is a fixed width and the row wraps when the two cannot sit side
26
+ by side, which puts the navigation under the brand rather than off the side of
27
+ the screen. There is no breakpoint involved: the row wraps when it runs out of
28
+ room, so the same rule holds for a long label on a wide screen as for a short
29
+ one on a narrow screen.
30
+
31
+ Until P5D.1 the row could not wrap, and the component ran 22px off a 320px
32
+ viewport. It had no story of its own, so the only place that was visible was
33
+ inside a demo — which is why these stories exist.
34
+ `
35
+ }
36
+ }
37
+ }
38
+ };
39
+
40
+ const ITEMS = [
41
+ { title: 'AI Guardian', href: '#ai-guardian', active: true },
42
+ { title: 'Skill Scanner', href: '#skill-scanner' }
43
+ ];
44
+
45
+ const render = items => html`<bd-page-switcher .items=${items}></bd-page-switcher>`;
46
+
47
+ export const Default = {
48
+ name : 'Default',
49
+ render : () => render(ITEMS),
50
+ parameters: {
51
+ docs: { description: { story: 'Brand and navigation on one row, which is what fits at any usual width.' } }
52
+ }
53
+ };
54
+
55
+ export const Narrow = {
56
+ name : 'Narrow (320px)',
57
+ render : () => render(ITEMS),
58
+ parameters: {
59
+ viewport: { defaultViewport: 'mobile1' },
60
+ docs : {
61
+ description: {
62
+ story: 'The width the component used to overflow at. The row wraps instead, and nothing leaves the viewport.'
63
+ }
64
+ }
65
+ }
66
+ };
67
+
68
+ export const ThreePages = {
69
+ name : 'Three pages',
70
+ render: () => render([
71
+ { title: 'AI Guardian', href: '#ai-guardian', active: true },
72
+ { title: 'Skill Scanner', href: '#skill-scanner' },
73
+ { title: 'Threat Map', href: '#threat-map' }
74
+ ]),
75
+ parameters: {
76
+ docs: { description: { story: 'More siblings than the demo carries, so the wrap is exercised earlier.' } }
77
+ }
78
+ };
79
+
80
+ export const LongLabels = {
81
+ name : 'Long labels',
82
+ render: () => render([
83
+ { title: 'Bitdefender AI Guardian for Home', href: '#one', active: true },
84
+ { title: 'Agentic Skill Scanner and Report', href: '#two' }
85
+ ]),
86
+ parameters: {
87
+ docs: {
88
+ description: {
89
+ story: `Labels long enough to overflow a wide screen if the row could not give
90
+ way. This is the case a breakpoint would have missed, because the width
91
+ that matters is the content's, not the window's.`
92
+ }
93
+ }
94
+ }
95
+ };
@@ -1,47 +1,52 @@
1
1
  import { css } from "lit";
2
2
 
3
3
  export default css`
4
+ /* --color-text-primary, not --color-neutral-1000. Body copy was set in pure
5
+ black while bd-display used neutral-900 and bd-li neutral-700, so a
6
+ heading, its paragraph and its list rendered in three different inks. The
7
+ line below the font-family used to carry the intended value as
8
+ a // prefix, which CSS does not treat as a comment — the parser dropped
9
+ it, and the pure black above won by default. */
4
10
  :host {
5
11
  display: block;
6
- color: var(--bd-paragraph-color, var(--color-neutral-1000));
12
+ color: var(--bd-paragraph-color, var(--color-text-primary));
7
13
  }
8
14
 
9
15
  p {
10
16
  all: unset;
11
17
  display: block;
12
- font-family: var(--typography-body-regular-fontFamily, var(--typography-fontFamily-sans));
13
- // color: var(--color-neutral-900);
14
- margin-bottom: var(--spacing-md);
18
+ font-family: var(--typography-body-regular-fontFamily);
19
+ margin-bottom: var(--spacing-16);
15
20
  }
16
21
 
17
22
  /* === Font Size Variants === */
18
- :host([kind="large"]) p {
23
+ :host([variant="large"]) p {
19
24
  font-size: var(--typography-body-large-fontSize);
20
25
  font-weight: var(--typography-body-large-fontWeight);
21
26
  line-height: var(--typography-body-large-lineHeight);
22
27
  letter-spacing: var(--typography-body-large-letterSpacing);
23
28
  }
24
29
 
25
- :host([kind="regular"]) p {
30
+ :host([variant="regular"]) p {
26
31
  font-size: var(--typography-body-regular-fontSize);
27
32
  font-weight: var(--typography-body-regular-fontWeight);
28
33
  line-height: var(--typography-body-regular-lineHeight);
29
34
  letter-spacing: var(--typography-body-regular-letterSpacing);
30
35
  }
31
36
 
32
- :host([kind="small"]) p {
37
+ :host([variant="small"]) p {
33
38
  font-size: var(--typography-body-small-fontSize);
34
39
  font-weight: var(--typography-body-small-fontWeight);
35
40
  line-height: var(--typography-body-small-lineHeight);
36
41
  letter-spacing: var(--typography-body-small-letterSpacing);
37
42
  }
38
- :host([kind="xsmall"]) p {
39
- font-size: var(--typography-label-xsmall-fontSize);
43
+ :host([variant="xsmall"]) p {
44
+ font-size: var(--typography-body-xsmall-fontSize);
40
45
  font-weight: var(--typography-body-small-fontWeight);
41
46
  line-height: var(--typography-body-small-lineHeight);
42
47
  letter-spacing: var(--typography-body-small-letterSpacing);
43
48
  }
44
- :host([kind="lead"]) p {
49
+ :host([variant="lead"]) p {
45
50
  font-size: var(--typography-body-lead-fontSize);
46
51
  font-weight: var(--typography-body-lead-fontWeight);
47
52
  line-height: var(--typography-body-lead-lineHeight);