@repobit/dex-system-design 0.25.12 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. package/CHANGELOG.md +204 -0
  2. package/README.md +131 -8
  3. package/package.json +96 -13
  4. package/schemas/component-manifest.json +3294 -405
  5. package/schemas/manifest-omissions.json +173 -0
  6. package/src/blog/src/breakpoints.js +6 -6
  7. package/src/blog/src/content/blog-atoms-showcase.js +1 -1
  8. package/src/blog/src/content/blog-page-layout.js +2 -2
  9. package/src/blog/src/lib/article-toc.js +7 -7
  10. package/src/blog/src/shell/blog-shell.js +1 -1
  11. package/src/blog/src/tokens/blog.js +2 -2
  12. package/src/blog/src/tokens/core.js +34 -35
  13. package/src/blog/src/tokens/legacy.js +0 -9
  14. package/src/blog/tokens/blog.js +2 -2
  15. package/src/blog/tokens/core.js +34 -35
  16. package/src/blog/tokens/legacy.js +0 -9
  17. package/src/blog/tokens.css +36 -46
  18. package/src/components/accordion/accordion-bg.css.js +83 -59
  19. package/src/components/accordion/accordion-bg.js +29 -10
  20. package/src/components/accordion/accordion-bg.stories.js +67 -67
  21. package/src/components/accordion/accordion-keyboard.js +80 -0
  22. package/src/components/accordion/accordion.css.js +142 -80
  23. package/src/components/accordion/accordion.js +37 -10
  24. package/src/components/accordion/accordion.stories.js +7 -7
  25. package/src/components/agent-endpoints/agent-endpoints.css.js +36 -39
  26. package/src/components/agent-endpoints/agent-endpoints.js +30 -20
  27. package/src/components/agent-endpoints/agent-endpoints.stories.js +1 -1
  28. package/src/components/ai-guardian-demo.stories.js +91 -91
  29. package/src/components/alert/alert.css.js +198 -0
  30. package/src/components/alert/alert.js +103 -0
  31. package/src/components/alert/alert.stories.js +206 -0
  32. package/src/components/anchor/anchor-nav.css.js +213 -101
  33. package/src/components/anchor/anchor-nav.js +26 -40
  34. package/src/components/anchor/anchor.stories.js +22 -12
  35. package/src/components/annotation/annotation.css.js +58 -0
  36. package/src/components/annotation/annotation.js +67 -0
  37. package/src/components/annotation/annotation.stories.js +63 -0
  38. package/src/components/architecture.stories.js +285 -0
  39. package/src/components/atoms.stories.js +342 -0
  40. package/src/components/avatar/avatar.css.js +67 -0
  41. package/src/components/avatar/avatar.js +42 -0
  42. package/src/components/avatar/avatar.stories.js +95 -0
  43. package/src/components/awards/awards-flex.css.js +209 -23
  44. package/src/components/awards/awards-flex.js +66 -7
  45. package/src/components/awards/awards-flex.stories.js +1 -1
  46. package/src/components/awards/{awards-light.stories.js → awards-summary.stories.js} +54 -64
  47. package/src/components/awards/awards.css.js +116 -58
  48. package/src/components/awards/awards.js +102 -28
  49. package/src/components/awards/awards.stories.js +1 -1
  50. package/src/components/back/back.css.js +51 -22
  51. package/src/components/back/back.js +28 -7
  52. package/src/components/back/back.stories.js +9 -3
  53. package/src/components/badge/badge.css.js +158 -46
  54. package/src/components/badge/badge.js +62 -74
  55. package/src/components/badge/badge.stories.js +176 -248
  56. package/src/components/bento-grid/bento-grid.css.js +21 -16
  57. package/src/components/bento-grid/bento-grid.js +16 -4
  58. package/src/components/bento-grid/bento-grid.stories.js +19 -18
  59. package/src/components/bento-grid/bento-item.css.js +52 -28
  60. package/src/components/bento-grid/bento-item.js +2 -2
  61. package/src/components/blockquote/blockquote.css.js +47 -0
  62. package/src/components/blockquote/blockquote.js +29 -0
  63. package/src/components/blockquote/blockquote.stories.js +62 -0
  64. package/src/components/breadcrumb/breadcrumb.css.js +92 -22
  65. package/src/components/breadcrumb/breadcrumb.js +56 -11
  66. package/src/components/button/button.css.js +531 -161
  67. package/src/components/button/button.js +206 -214
  68. package/src/components/button/button.stories.js +322 -174
  69. package/src/components/caption/caption.css.js +21 -0
  70. package/src/components/caption/caption.js +31 -0
  71. package/src/components/caption/caption.stories.js +62 -0
  72. package/src/components/card-features/card-features.css.js +14 -22
  73. package/src/components/card-features/card-features.js +68 -9
  74. package/src/components/card-features/card-features.stories.js +11 -11
  75. package/src/components/cards/card.css.js +60 -81
  76. package/src/components/cards/card.js +56 -25
  77. package/src/components/cards/card.stories.js +39 -39
  78. package/src/components/carousel/carousel.css.js +93 -99
  79. package/src/components/carousel/carousel.js +32 -4
  80. package/src/components/checkbox/checkbox.css.js +111 -93
  81. package/src/components/checkbox/checkbox.js +64 -90
  82. package/src/components/checkbox/checkbox.stories.js +96 -29
  83. package/src/components/code/code.css.js +70 -0
  84. package/src/components/code/code.js +40 -0
  85. package/src/components/code/code.stories.js +73 -0
  86. package/src/components/compare/compare.css.js +179 -43
  87. package/src/components/compare/compare.js +52 -25
  88. package/src/components/compare/compare.stories.js +61 -4
  89. package/src/components/comparison-panel/comparison-panel.css.js +38 -51
  90. package/src/components/comparison-panel/comparison-panel.js +5 -4
  91. package/src/components/comparison-panel/comparison-panel.stories.js +1 -1
  92. package/src/components/compatibility-table/compatibility-table.css.js +180 -80
  93. package/src/components/compatibility-table/compatibility-table.js +37 -9
  94. package/src/components/control-alignment.stories.js +393 -0
  95. package/src/components/cta-banner/cta-banner.css.js +41 -13
  96. package/src/components/cta-banner/cta-banner.js +6 -5
  97. package/src/components/cta-banner/cta-banner.stories.js +43 -98
  98. package/src/components/display/display.css.js +25 -1
  99. package/src/components/display/display.js +46 -13
  100. package/src/components/display/display.stories.js +270 -40
  101. package/src/components/divider/divider-horizontal.js +21 -5
  102. package/src/components/divider/divider-vertical.js +15 -7
  103. package/src/components/divider/divider.css.js +2 -2
  104. package/src/components/divider/divider.stories.js +38 -34
  105. package/src/components/dropdown/dropdown.css.js +93 -126
  106. package/src/components/dropdown/dropdown.js +114 -34
  107. package/src/components/dropdown/dropdown.stories.js +56 -24
  108. package/src/components/features/features.css.js +24 -11
  109. package/src/components/features/features.js +7 -3
  110. package/src/components/features/features.stories.js +37 -37
  111. package/src/components/features-tab/features-tab.css.js +19 -8
  112. package/src/components/features-tab/features-tab.js +6 -5
  113. package/src/components/features-tab/features-tab.stories.js +23 -23
  114. package/src/components/fieldset/fieldset.css.js +30 -0
  115. package/src/components/fieldset/fieldset.js +28 -0
  116. package/src/components/fieldset/fieldset.stories.js +84 -0
  117. package/src/components/footer/footer-links-group.css.js +10 -14
  118. package/src/components/footer/footer-links-group.js +4 -3
  119. package/src/components/footer/footer-lp.css.js +59 -30
  120. package/src/components/footer/footer-lp.js +17 -12
  121. package/src/components/footer/footer-lp.stories.js +63 -75
  122. package/src/components/footer/footer-nav-menu.css.js +26 -4
  123. package/src/components/footer/footer-nav-menu.js +3 -2
  124. package/src/components/footer/footer.css.js +146 -264
  125. package/src/components/footer/footer.js +176 -106
  126. package/src/components/footer/footer.stories.js +9 -9
  127. package/src/components/footer/localeMap.js +1 -1
  128. package/src/components/grid/grid.css.js +1 -1
  129. package/src/components/grid/grid.js +49 -7
  130. package/src/components/grid/grid.stories.js +111 -0
  131. package/src/components/header/header-code.css.js +61 -51
  132. package/src/components/header/header-code.js +28 -14
  133. package/src/components/header/header-code.stories.js +5 -5
  134. package/src/components/header/header.css.js +655 -176
  135. package/src/components/header/header.js +269 -36
  136. package/src/components/header/header.stories.js +841 -18
  137. package/src/components/heading/heading.css.js +14 -17
  138. package/src/components/heading/heading.js +48 -33
  139. package/src/components/heading/heading.stories.js +27 -25
  140. package/src/components/help-text/help-text.css.js +21 -0
  141. package/src/components/help-text/help-text.js +25 -0
  142. package/src/components/help-text/help-text.stories.js +66 -0
  143. package/src/components/highlight/highlight.css.js +86 -64
  144. package/src/components/highlight/highlight.js +18 -27
  145. package/src/components/highlight/highlight.stories.js +14 -3
  146. package/src/components/icons/analysis-icon.js +6 -16
  147. package/src/components/icons/arrow-down-icon.js +6 -19
  148. package/src/components/icons/arrow-icon.js +44 -0
  149. package/src/components/icons/arrow-right-icon.js +30 -23
  150. package/src/components/icons/arrow-up-icon.js +19 -18
  151. package/src/components/icons/bd-ai-icon.js +1 -1
  152. package/src/components/icons/brand-marks.stories.js +279 -0
  153. package/src/components/icons/brand-signature-icon.js +42 -0
  154. package/src/components/icons/check-icon.js +27 -0
  155. package/src/components/icons/circle-info-icon.js +33 -0
  156. package/src/components/icons/close-icon.js +6 -18
  157. package/src/components/icons/family-icon.js +8 -20
  158. package/src/components/icons/globe-icon.js +6 -18
  159. package/src/components/icons/guide-icon.js +6 -18
  160. package/src/components/icons/icon-element.js +99 -0
  161. package/src/components/icons/icons.js +36 -0
  162. package/src/components/icons/icons.stories.js +184 -52
  163. package/src/components/icons/individual-icon.js +6 -18
  164. package/src/components/icons/laurel-icon.js +9 -19
  165. package/src/components/icons/machine-learning-icon.js +6 -17
  166. package/src/components/icons/marks.js +41 -0
  167. package/src/components/icons/minus-icon.js +7 -21
  168. package/src/components/icons/missing-icon.js +52 -0
  169. package/src/components/icons/plus-icon.js +7 -21
  170. package/src/components/icons/quote-icon.js +19 -19
  171. package/src/components/image/image.css.js +72 -25
  172. package/src/components/image/image.js +11 -6
  173. package/src/components/image/image.stories.js +2 -2
  174. package/src/components/input/custom-form.stories.js +214 -62
  175. package/src/components/input/input-clipboard.css.js +51 -144
  176. package/src/components/input/input-clipboard.js +31 -15
  177. package/src/components/input/input.css.js +8 -146
  178. package/src/components/input/input.js +93 -38
  179. package/src/components/install-options/install-options.css.js +84 -77
  180. package/src/components/install-options/install-options.js +33 -30
  181. package/src/components/install-options/install-options.stories.js +3 -3
  182. package/src/components/label/label.css.js +35 -0
  183. package/src/components/label/label.js +38 -0
  184. package/src/components/label/label.stories.js +82 -0
  185. package/src/components/light-carousel/light-carousel.css.js +111 -63
  186. package/src/components/light-carousel/light-carousel.js +85 -11
  187. package/src/components/light-carousel/light-carousel.stories.js +126 -82
  188. package/src/components/link/link.css.js +150 -99
  189. package/src/components/link/link.js +86 -11
  190. package/src/components/link/link.stories.js +124 -30
  191. package/src/components/list/list-item/list-item.css.js +74 -22
  192. package/src/components/list/list-item/list-item.js +32 -10
  193. package/src/components/list/list-item/list-item.stories.js +23 -23
  194. package/src/components/list/list.css.js +8 -2
  195. package/src/components/list/list.js +3 -2
  196. package/src/components/list/list.stories.js +222 -0
  197. package/src/components/modal/modal.css.js +114 -24
  198. package/src/components/modal/modal.js +83 -7
  199. package/src/components/modal/modal.stories.js +9 -9
  200. package/src/components/overview/overview.css.js +19 -14
  201. package/src/components/overview/overview.js +6 -5
  202. package/src/components/overview/overview.stories.js +10 -10
  203. package/src/components/page-switcher/page-switcher.css.js +97 -40
  204. package/src/components/page-switcher/page-switcher.js +28 -5
  205. package/src/components/page-switcher/page-switcher.stories.js +95 -0
  206. package/src/components/paragraph/paragraph.css.js +15 -10
  207. package/src/components/paragraph/paragraph.js +41 -44
  208. package/src/components/paragraph/paragraph.stories.js +56 -21
  209. package/src/components/picture/picture.css.js +103 -44
  210. package/src/components/picture/picture.js +100 -30
  211. package/src/components/picture/picture.stories.js +1 -1
  212. package/src/components/pricing-cards/new-pricing-card.js +3 -3
  213. package/src/components/pricing-cards/new-pricing.css.js +24 -15
  214. package/src/components/pricing-cards/pricing-card-actions.css.js +1 -1
  215. package/src/components/pricing-cards/pricing-card-actions.js +3 -4
  216. package/src/components/pricing-cards/pricing-card-container.css.js +3 -3
  217. package/src/components/pricing-cards/pricing-card-container.js +3 -2
  218. package/src/components/pricing-cards/pricing-card-header.css.js +10 -8
  219. package/src/components/pricing-cards/pricing-card-header.js +6 -7
  220. package/src/components/pricing-cards/pricing-card-pricing.css.js +16 -9
  221. package/src/components/pricing-cards/pricing-card-pricing.js +8 -6
  222. package/src/components/pricing-cards/pricing-card-show-more.css.js +11 -3
  223. package/src/components/pricing-cards/pricing-card-show-more.js +8 -3
  224. package/src/components/pricing-cards/pricing-card.css.js +244 -190
  225. package/src/components/pricing-cards/pricing-card.js +54 -70
  226. package/src/components/pricing-cards/pricing-feature-item.css.js +25 -8
  227. package/src/components/pricing-cards/pricing-feature-item.js +8 -3
  228. package/src/components/process-steps/process-steps.css.js +26 -14
  229. package/src/components/process-steps/process-steps.js +23 -6
  230. package/src/components/process-steps/process-steps.stories.js +1 -1
  231. package/src/components/progress/progress.css.js +80 -0
  232. package/src/components/progress/progress.js +42 -0
  233. package/src/components/progress/progress.stories.js +79 -0
  234. package/src/components/quick-answer/quick-answer.css.js +75 -13
  235. package/src/components/quick-answer/quick-answer.js +8 -3
  236. package/src/components/radio/radio.css.js +92 -128
  237. package/src/components/radio/radio.js +106 -127
  238. package/src/components/radio/radio.stories.js +54 -19
  239. package/src/components/review/review-grid.css.js +5 -6
  240. package/src/components/review/review-grid.js +14 -11
  241. package/src/components/review/review.css.js +11 -6
  242. package/src/components/review/review.js +3 -8
  243. package/src/components/shared/ensemble.css.js +93 -0
  244. package/src/components/shared/form-field.css.js +206 -0
  245. package/src/components/shared/prop-vocabulary.js +48 -0
  246. package/src/components/shared/token-scales.js +306 -0
  247. package/src/components/skeleton/skeleton.css.js +34 -0
  248. package/src/components/skeleton/skeleton.js +32 -0
  249. package/src/components/skeleton/skeleton.stories.js +70 -0
  250. package/src/components/spinner/spinner.css.js +62 -0
  251. package/src/components/spinner/spinner.js +38 -0
  252. package/src/components/spinner/spinner.stories.js +92 -0
  253. package/src/components/spotlight-section/spotlight-section.css.js +14 -13
  254. package/src/components/spotlight-section/spotlight-section.js +42 -39
  255. package/src/components/switch/switch.css.js +103 -0
  256. package/src/components/switch/switch.js +44 -0
  257. package/src/components/switch/switch.stories.js +86 -0
  258. package/src/components/tab-list/content-switcher.stories.js +189 -0
  259. package/src/components/tab-list/tab-list.css.js +250 -0
  260. package/src/components/tab-list/tab-list.js +184 -0
  261. package/src/components/tab-list/tab-list.stories.js +221 -0
  262. package/src/components/tabs/tabs.css.js +14 -123
  263. package/src/components/tabs/tabs.js +16 -19
  264. package/src/components/tabs/tabs.stories.js +95 -95
  265. package/src/components/tag/tag.css.js +54 -0
  266. package/src/components/tag/tag.js +32 -0
  267. package/src/components/tag/tag.stories.js +126 -0
  268. package/src/components/terminal/terminal-message.css.js +164 -60
  269. package/src/components/terminal/terminal-message.js +5 -5
  270. package/src/components/terminal/terminal-message.stories.js +70 -1
  271. package/src/components/termsOfUse/terms.css.js +25 -20
  272. package/src/components/termsOfUse/terms.js +13 -9
  273. package/src/components/termsOfUse/terms.stories.js +1 -1
  274. package/src/components/textarea/textarea.css.js +51 -0
  275. package/src/components/textarea/textarea.js +136 -0
  276. package/src/components/textarea/textarea.stories.js +191 -0
  277. package/src/components/tooltip/tooltip.css.js +75 -0
  278. package/src/components/tooltip/tooltip.js +156 -0
  279. package/src/components/tooltip/tooltip.stories.js +161 -0
  280. package/src/components/trust-panel/trust-panel.css.js +85 -33
  281. package/src/components/trust-panel/trust-panel.js +18 -10
  282. package/src/components/trust-panel/trust-panel.stories.js +1 -1
  283. package/src/components/ultimate-security-demo.stories.js +431 -0
  284. package/src/components/video/video.css.js +17 -0
  285. package/src/components/video/video.js +40 -0
  286. package/src/components/video/video.stories.js +106 -0
  287. package/src/components/video-player/video-player.css.js +67 -11
  288. package/src/components/video-player/video-player.js +35 -4
  289. package/src/components/video-player/video-player.stories.js +1 -1
  290. package/src/components/visual-alignment.stories.js +411 -0
  291. package/src/components/visually-hidden/visually-hidden.css.js +24 -0
  292. package/src/components/visually-hidden/visually-hidden.js +16 -0
  293. package/src/components/visually-hidden/visually-hidden.stories.js +56 -0
  294. package/src/stories/Button.stories.js +17 -17
  295. package/src/stories/Header.stories.js +10 -10
  296. package/src/stories/Page.js +1 -1
  297. package/src/stories/Page.stories.js +6 -6
  298. package/src/tokens/borders.stories.js +339 -0
  299. package/src/tokens/color-responsibilities.stories.js +227 -0
  300. package/src/tokens/dark-derivation.js +309 -0
  301. package/src/tokens/dark-findings.js +197 -0
  302. package/src/tokens/dark-mode.stories.js +207 -0
  303. package/src/tokens/dimension.stories.js +251 -0
  304. package/src/tokens/elevation.stories.js +143 -0
  305. package/src/tokens/focus.stories.js +276 -0
  306. package/src/tokens/fonts.css +20 -20
  307. package/src/tokens/fonts.stories.js +354 -374
  308. package/src/tokens/layout.css +25 -11
  309. package/src/tokens/motion.stories.js +231 -0
  310. package/src/tokens/shape.stories.js +272 -0
  311. package/src/tokens/spacing-rhythm.stories.js +359 -0
  312. package/src/tokens/spacing.stories.js +208 -703
  313. package/src/tokens/story-chrome.js +503 -0
  314. package/src/tokens/surfaces.stories.js +224 -0
  315. package/src/tokens/text-on-surface.stories.js +164 -0
  316. package/src/tokens/token-map.js +220 -0
  317. package/src/tokens/token-map.stories.js +257 -0
  318. package/src/tokens/token-purposes.js +266 -0
  319. package/src/tokens/tokens-grid.stories.js +388 -900
  320. package/src/tokens/tokens.css +1633 -1045
  321. package/src/tokens/tokens.js +1130 -492
  322. package/src/tokens/tokens.stories.js +137 -47
  323. package/src/tokens/type-ceiling-words.js +299 -0
  324. package/src/tokens/typography.stories.js +1003 -965
  325. package/src/tokens/vertical-rhythm.stories.js +224 -0
  326. package/src/components/awards/awards-icon.js +0 -56
  327. package/src/components/awards/awards-light.js +0 -240
  328. package/src/components/banner/banner.js +0 -60
  329. package/src/components/banner/banner.stories.js +0 -51
  330. package/src/components/button/icons.js +0 -24
  331. package/src/components/input/index.js +0 -0
  332. package/src/components/light-carousel/light-carousel-simple.css.js +0 -183
  333. package/src/components/light-carousel/light-carousel-simple.js +0 -74
  334. package/src/tokens/colors.js +0 -121
  335. package/src/tokens/typography.css.js +0 -207
  336. package/src/tokens/typography.js +0 -0
@@ -1,4 +1,5 @@
1
1
  import { html } from "lit";
2
+ import "../button/button.js";
2
3
  import "../icons/analysis-icon.js";
3
4
  import "../icons/arrow-up-icon.js";
4
5
  import "../icons/family-icon.js";
@@ -8,7 +9,7 @@ import "../icons/machine-learning-icon.js";
8
9
  import "./bento-grid.js";
9
10
  import "./bento-item.js";
10
11
  export default {
11
- title : "Components/Bento Grid",
12
+ title : "Modules/Bento Grid",
12
13
  component : "bd-bento-grid",
13
14
  tags : ["autodocs"],
14
15
  parameters: {
@@ -280,12 +281,12 @@ export const WithCTA = {
280
281
  <bd-bento-item title="AI Protection">
281
282
  <bd-individual-icon slot="icon" width="32" height="32" color="#006DFF"></bd-individual-icon>
282
283
  <bd-p>Powered by machine learning and behavioral analysis.</bd-p>
283
- <bd-button-link href="#" kind="primary" size="sm">Learn more</bd-button-link>
284
+ <bd-button-link href="#" variant="primary" size="sm">Learn more</bd-button-link>
284
285
  </bd-bento-item>
285
286
  <bd-bento-item title="Multi-layer Security">
286
287
  <bd-globe-icon slot="icon" width="32" height="32" color="#006DFF"></bd-globe-icon>
287
288
  <bd-p>Multiple independent protection layers stop any attack.</bd-p>
288
- <bd-button-link href="#" kind="primary" size="sm">Learn more</bd-button-link>
289
+ <bd-button-link href="#" variant="primary" size="sm">Learn more</bd-button-link>
289
290
  </bd-bento-item>
290
291
  </bd-bento-grid>
291
292
  `,
@@ -449,29 +450,29 @@ export const EqualColumns = {
449
450
  description="Each protection is structural: every request the agent routes through Bitdefender's MCP tools gets it automatically, with no setting to remember."
450
451
  >
451
452
  <bd-bento-item>
452
- <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">01</span>
453
- <bd-h as="h5" font-weight="700" style="margin: 0 0 8px;">IP masking</bd-h>
454
- <bd-p color="var(--color-neutral-600)">When your agent reaches a site, it sees the VPN server's exit IP. Not your home address or IP-based location.</bd-p>
453
+ <span slot="icon" style="color: var(--color-blue-500); font-weight: 700; font-family: var(--typography-fontFamily-mono); font-size: 14px; letter-spacing: 0.05em;">01</span>
454
+ <bd-h as="h5" fontWeight="bold" style="margin: 0 0 8px;">IP masking</bd-h>
455
+ <bd-p color="muted">When your agent reaches a site, it sees the VPN server's exit IP. Not your home address or IP-based location.</bd-p>
455
456
  </bd-bento-item>
456
457
  <bd-bento-item>
457
- <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">02</span>
458
- <bd-h as="h5" font-weight="700" style="margin: 0 0 8px;">Per-prompt encryption</bd-h>
459
- <bd-p color="var(--color-neutral-600)">Every request opens its own encrypted tunnel from your device to Bitdefender, so whoever runs the Wi-Fi you're on can't read what the agent sends.</bd-p>
458
+ <span slot="icon" style="color: var(--color-blue-500); font-weight: 700; font-family: var(--typography-fontFamily-mono); font-size: 14px; letter-spacing: 0.05em;">02</span>
459
+ <bd-h as="h5" fontWeight="bold" style="margin: 0 0 8px;">Per-prompt encryption</bd-h>
460
+ <bd-p color="muted">Every request opens its own encrypted tunnel from your device to Bitdefender, so whoever runs the Wi-Fi you're on can't read what the agent sends.</bd-p>
460
461
  </bd-bento-item>
461
462
  <bd-bento-item>
462
- <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">03</span>
463
- <bd-h as="h5" font-weight="700" style="margin: 0 0 8px;">Session isolation</bd-h>
464
- <bd-p color="var(--color-neutral-600)">Each tunnel closes the moment the prompt ends. If a site sees two of your agent's requests, it has no network-level way to tell they came from the same prompt.</bd-p>
463
+ <span slot="icon" style="color: var(--color-blue-500); font-weight: 700; font-family: var(--typography-fontFamily-mono); font-size: 14px; letter-spacing: 0.05em;">03</span>
464
+ <bd-h as="h5" fontWeight="bold" style="margin: 0 0 8px;">Session isolation</bd-h>
465
+ <bd-p color="muted">Each tunnel closes the moment the prompt ends. If a site sees two of your agent's requests, it has no network-level way to tell they came from the same prompt.</bd-p>
465
466
  </bd-bento-item>
466
467
  <bd-bento-item>
467
- <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">04</span>
468
- <bd-h as="h5" font-weight="700" style="margin: 0 0 8px;">Clean-IP browsing</bd-h>
469
- <bd-p color="var(--color-neutral-600)">Every request exits on the VPN server's IP rather than the same home address every time, useful for QA and monitoring work that needs a neutral, non-residential vantage point.</bd-p>
468
+ <span slot="icon" style="color: var(--color-blue-500); font-weight: 700; font-family: var(--typography-fontFamily-mono); font-size: 14px; letter-spacing: 0.05em;">04</span>
469
+ <bd-h as="h5" fontWeight="bold" style="margin: 0 0 8px;">Clean-IP browsing</bd-h>
470
+ <bd-p color="muted">Every request exits on the VPN server's IP rather than the same home address every time, useful for QA and monitoring work that needs a neutral, non-residential vantage point.</bd-p>
470
471
  </bd-bento-item>
471
472
  <bd-bento-item>
472
- <span slot="icon" style="color: var(--color-blue-500, #006DFF); font-weight: 700; font-family: var(--typography-fontFamily-mono, monospace); font-size: 14px; letter-spacing: 0.05em;">05</span>
473
- <bd-h as="h5" font-weight="700" style="margin: 0 0 8px;">Regional routing</bd-h>
474
- <bd-p color="var(--color-neutral-600)">Need to see a page the way a visitor from a specific country would? Route that one request through a Bitdefender server there, just for that prompt.</bd-p>
473
+ <span slot="icon" style="color: var(--color-blue-500); font-weight: 700; font-family: var(--typography-fontFamily-mono); font-size: 14px; letter-spacing: 0.05em;">05</span>
474
+ <bd-h as="h5" fontWeight="bold" style="margin: 0 0 8px;">Regional routing</bd-h>
475
+ <bd-p color="muted">Need to see a page the way a visitor from a specific country would? Route that one request through a Bitdefender server there, just for that prompt.</bd-p>
475
476
  </bd-bento-item>
476
477
  </bd-bento-grid>
477
478
  `,
@@ -1,17 +1,17 @@
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
  height: 100%;
7
- --background-card-grey: var(--color-neutral-25);
8
8
  box-sizing: border-box;
9
9
  }
10
10
 
11
11
  .bd-bentoitem-box {
12
- background: var(--background-card-grey);
13
- border-radius: var(--spacing-20);
14
- padding: var(--spacing-32);
12
+ background: var(--color-surface-container);
13
+ border-radius: var(--card-radius);
14
+ padding: var(--card-padding);
15
15
  display: flex;
16
16
  flex-direction: column;
17
17
  align-items: stretch;
@@ -21,8 +21,21 @@ export default css`
21
21
  box-sizing: border-box;
22
22
  font-family: var(--typography-fontFamily-sans);
23
23
  min-width: 0;
24
- transition: transform 0.25s ease, box-shadow 0.25s ease;
25
- border: 1px solid var(--color-neutral-100);
24
+ /* The same hover lift as trust-panel, now at the same scale step. */
25
+ transition: transform var(--transition-duration-normal) var(--transition-easing-ease),
26
+ box-shadow var(--transition-duration-normal) var(--transition-easing-ease);
27
+ /* No edge. --color-surface-container is documented as "the ground of a
28
+ self-contained object -- a card, a tile, a panel -- one step off the page
29
+ so it reads as its own object WITHOUT needing a border or a shadow to say
30
+ so", and this card sits on the page ground, so the tonal step is the
31
+ separation and an edge is redundant with the role's own purpose.
32
+
33
+ The rule, from the cards-and-surfaces review: a card on the page ground
34
+ takes surface/container and no edge; a card on a tinted section takes
35
+ surface/default plus a 1px border/container, because there is no tonal
36
+ step available there and the edge earns its keep. Six components on the
37
+ page ground drew no edge; this one drew one, and five identical siblings
38
+ did not. See CLAUDE.md, "A card's ground and its edge". */
26
39
  }
27
40
 
28
41
 
@@ -31,6 +44,18 @@ transform: translateY(-3px);
31
44
  box-shadow: 0px 14px 40px #00000012;
32
45
  }
33
46
 
47
+ /* Same reasoning as trust-panel, checked separately: the shadow is the part
48
+ that communicates hover, the 3px is the part that moves. */
49
+ @media (prefers-reduced-motion: reduce) {
50
+ .bd-bentoitem-box {
51
+ transition: none;
52
+ }
53
+
54
+ .bd-bentoitem-box:hover {
55
+ transform: none;
56
+ }
57
+ }
58
+
34
59
  .bd-bentoitem-icon-wrap {
35
60
  display: flex;
36
61
  flex-direction: column;
@@ -54,16 +79,15 @@ box-shadow: 0px 14px 40px #00000012;
54
79
  .bd-bentoitem-title-wrap {
55
80
  display: flex;
56
81
  align-items: flex-start;
57
- gap: var(--spacing-4, 4px);
82
+ gap: var(--spacing-4);
58
83
  overflow: hidden;
59
84
  margin-bottom: var(--spacing-8);
60
85
  width: 100%;
61
86
  }
62
87
 
63
88
  .bd-bentoitem-body {
64
- font-size: var(--spacing-16);
65
89
  margin: 0 0 1em 0;
66
- color: var(--color-neutral-700, inherit);
90
+ color: var(--color-text-secondary);
67
91
  width: 100%;
68
92
  }
69
93
 
@@ -71,37 +95,37 @@ box-shadow: 0px 14px 40px #00000012;
71
95
  width: 100%;
72
96
  }
73
97
 
74
- /* === TONE VARIANTS === */
75
-
76
- :host([tone="tint"]) {
77
- --background-card-grey: var(--color-blue-50);
78
- }
79
-
98
+ /* === TONE VARIANTS ===
99
+ The card has no edge (see .bd-bentoitem-box), so a tone is the fill
100
+ alone. */
80
101
  :host([tone="tint"]) .bd-bentoitem-box {
81
- border-color: var(--color-blue-50);
82
- }
83
-
84
- :host([tone="dark"]) {
85
- --background-card-grey: linear-gradient(160deg, var(--color-neutral-800) 0%, var(--color-blue-950) 130%);
86
- ;
102
+ background: var(--status-brand-surface);
87
103
  }
88
104
 
89
105
  :host([tone="dark"]) .bd-bentoitem-box {
90
- border-color: linear-gradient(160deg, var(--color-neutral-800) 0%, var(--color-blue-950) 130%);
91
- ;
106
+ /* The inverse ground the card's inverse ink is written for, running into
107
+ the brand's darkest blue.
108
+ no role: blue-950 is a gradient's far stop, decoration rather than a
109
+ ground any text is measured against -- the same stop bd-cta-banner ends on. */
110
+ background: linear-gradient(160deg, var(--color-surface-inverse) 0%, var(--color-blue-950) 130%);
92
111
  }
93
112
 
94
113
  :host([tone="dark"]) .bd-bentoitem-title-wrap bd-h {
95
- color: var(--color-neutral-0);
114
+ color: var(--color-text-inverse);
96
115
  }
97
116
 
98
117
  :host([tone="dark"]) .bd-bentoitem-body {
99
- --bd-paragraph-color: var(--color-neutral-0);
118
+ color: var(--color-text-inverse);
100
119
  }
101
120
 
102
- @media (max-width: 599px) {
121
+ /* below('md'), not below('sm'). The Comparison Panel and the Trust Panel both
122
+ take the compact inset at md and this took it at sm, so the same card was
123
+ affording 32px at 600px wide in one component and not in another. Two of
124
+ the three picked md; this one moved. Visible: the inset steps down 192px
125
+ of viewport earlier than it used to. */
126
+ @media ${unsafeCSS(below('md'))} {
103
127
  .bd-bentoitem-box {
104
- padding: var(--spacing-24);
128
+ padding: var(--card-padding-compact);
105
129
  }
106
130
  }
107
131
  `;
@@ -39,13 +39,13 @@ class BentoItem extends LitElement {
39
39
  ${this.title
40
40
  ? html`
41
41
  <div class="bd-bentoitem-title-wrap">
42
- <bd-h as="h5" fontWeight="700">${this.title}</bd-h>
42
+ <bd-h as="h5" fontWeight="bold">${this.title}</bd-h>
43
43
  </div>
44
44
  `
45
45
  : ""}
46
46
 
47
47
  ${this.body
48
- ? html`<bd-p kind="regular" class="bd-bentoitem-body">${this.body}</bd-p>`
48
+ ? html`<bd-p variant="regular" class="bd-bentoitem-body">${this.body}</bd-p>`
49
49
  : ""}
50
50
 
51
51
  <slot></slot>
@@ -0,0 +1,47 @@
1
+ import { css } from 'lit';
2
+
3
+ /** Styled entirely from design tokens — see npm run lint:tokens. */
4
+ export const blockquoteCSS = css`
5
+ :host { display: block; }
6
+
7
+ blockquote {
8
+ margin: 0;
9
+ padding-left: var(--spacing-16);
10
+ border-left: var(--border-width-4) solid var(--color-border-brand);
11
+ font-family: var(--typography-body-large-fontFamily);
12
+ font-size: var(--typography-body-large-fontSize);
13
+ font-weight: var(--typography-body-large-fontWeight);
14
+ line-height: var(--typography-body-large-lineHeight);
15
+ color: var(--color-text-primary);
16
+ }
17
+
18
+ footer {
19
+ margin-top: var(--spacing-8);
20
+ font-size: var(--typography-caption-default-fontSize);
21
+ /* no role: two roles are each a near-miss, from opposite directions, and
22
+ no declared role sits at the intersection of this size, this weight,
23
+ this leading and this colour.
24
+ .
25
+ label-small matches this text's size and weight exactly -- but adopting
26
+ it would add letterSpacing-wide, which has no job on mixed-case sentence
27
+ text because nothing here crowds, and would replace the 1.625 leading
28
+ this inherits from the quote it attributes with 1.5. That inherited
29
+ rhythm is the one thing in this rule that means something: the credit
30
+ line sits on the same measure as the quotation it belongs to, where 1.5
31
+ merely comes attached to the role.
32
+ .
33
+ caption-default matches this text's size and colour exactly -- the same
34
+ --color-text-muted token, not just the same value, so this rule already
35
+ half-resolves through it. But its weight is normal, and normal is what
36
+ the quote itself renders. Adopting it would remove the attribution's
37
+ only distinguishing signal and demote a credit line to what reads as a
38
+ continuation of the quotation rather than a citation of it.
39
+ .
40
+ Neither disagreement is drift; both are the reason this rule exists as
41
+ written. So the weight stays a primitive and says why. */
42
+ font-weight: var(--typography-fontWeight-medium);
43
+ color: var(--color-text-muted);
44
+ }
45
+ `;
46
+
47
+ export default blockquoteCSS;
@@ -0,0 +1,29 @@
1
+ import { LitElement, html, nothing } from 'lit';
2
+ // Installs the design tokens into document scope; see src/tokens/tokens.js
3
+ import '../../tokens/tokens.js';
4
+ import { blockquoteCSS } from './blockquote.css.js';
5
+
6
+ export class BdBlockquote extends LitElement {
7
+ static styles = [blockquoteCSS];
8
+
9
+ static properties = {
10
+ cite : { type: String },
11
+ attribution: { type: String }
12
+ };
13
+
14
+ constructor() {
15
+ super();
16
+ this.cite = '';
17
+ this.attribution = '';
18
+ }
19
+
20
+ render() {
21
+ return html`
22
+ <blockquote cite=${this.cite || nothing}>
23
+ <slot></slot>${this.attribution ? html`<footer>\u2014 ${this.attribution}</footer>` : nothing}
24
+ </blockquote>
25
+ `;
26
+ }
27
+ }
28
+
29
+ customElements.define('bd-blockquote', BdBlockquote);
@@ -0,0 +1,62 @@
1
+ import { html } from 'lit';
2
+ import './blockquote.js';
3
+
4
+ export default {
5
+ title : 'Atoms/Blockquote',
6
+ tags : ['autodocs'],
7
+ parameters: {
8
+ docs: {
9
+ description: {
10
+ component: `
11
+ **BdBlockquote** is a quotation set apart from the surrounding prose, with an
12
+ optional attribution.
13
+
14
+ ### Usage
15
+ \`\`\`html
16
+ <bd-blockquote>The best way to predict the future is to invent it.</bd-blockquote>
17
+
18
+ <bd-blockquote
19
+ attribution="Alan Kay"
20
+ cite="https://example.com/source"
21
+ >The best way to predict the future is to invent it.</bd-blockquote>
22
+ \`\`\`
23
+
24
+ ### Props
25
+ | Prop | Values | Default |
26
+ |---|---|---|
27
+ | \`attribution\` | who said it — omit for an unattributed quote | \`''\` |
28
+ | \`cite\` | URL of the source | \`''\` |
29
+
30
+ ### Notes
31
+ \`attribution\` renders as a \`<footer>\` inside the \`<blockquote>\`, prefixed with
32
+ an em dash. That is the pairing the HTML spec recommends for a credit that
33
+ belongs to the quote itself.
34
+
35
+ \`cite\` maps to the native \`cite\` attribute. It is **metadata only** — browsers
36
+ do not render it and it is not a link, so if the source should be visible or
37
+ clickable, put it in \`attribution\` or in the slotted content.
38
+ `
39
+ }
40
+ }
41
+ },
42
+ argTypes: {
43
+ attribution: {
44
+ control : 'text',
45
+ description: 'Who said it. Renders as a footer inside the blockquote, prefixed with an em dash.',
46
+ table : { type: { summary: 'string' }, defaultValue: { summary: "" }, category: 'Content' }
47
+ },
48
+ cite: {
49
+ control : 'text',
50
+ description: 'Source URL for the native cite attribute. Metadata only — not rendered, not a link.',
51
+ table : { type: { summary: 'string' }, defaultValue: { summary: "" }, category: 'Content' }
52
+ }
53
+ }
54
+ };
55
+
56
+ export const Default = () => html`
57
+ <bd-blockquote>Protection has to keep pace, quietly.</bd-blockquote>
58
+ `;
59
+
60
+ export const Withattribution = () => html`
61
+ <bd-blockquote attribution="Bitdefender Labs">Threats move faster than annual reviews.</bd-blockquote>
62
+ `;
@@ -26,7 +26,12 @@ export default css`
26
26
  flex-direction: row;
27
27
  }
28
28
 
29
- .bd-breadcrumb--horizontal .bd-breadcrumb-item:not(:last-child) {
29
+ /* Parent-owned layout, so it is spelled against the slotted hosts. The
30
+ rule this replaces targeted .bd-breadcrumb-item, which lives inside the
31
+ item's own shadow root: the descendant combinator could not reach it,
32
+ and :not(:last-child) could not have helped anyway, since that div is
33
+ the only child of its root and so is always the last one. */
34
+ .bd-breadcrumb--horizontal ::slotted(bd-breadcrumb-item:not(:last-child)) {
30
35
  margin-right: var(--spacing-8);
31
36
  }
32
37
 
@@ -34,11 +39,26 @@ export default css`
34
39
  .bd-breadcrumb__divider {
35
40
  margin-left: var(--spacing-8);
36
41
  margin-right: var(--spacing-8);
37
- color: var(--color-neutral-400);
42
+ /* the "/" is rendered text and is not aria-hidden, so it needs 4.5:1;
43
+ neutral-400 gave 3.23 */
44
+ color: var(--color-text-subtle);
45
+ /* no role: the "/" is real rendered text -- see the contrast note above on
46
+ why it is not aria-hidden -- but it is a single glyph in a fixed-height
47
+ divider, the same category as the icon-only line box rule 7 already
48
+ covers for its leading. Sizing a separator is not a text role. */
38
49
  font-size: var(--typography-fontSize-sm);
39
- line-height: 1;
50
+ line-height: var(--typography-lineHeight-none);
40
51
  }
41
52
 
53
+ /* Vertical layout.
54
+
55
+ The four rules below are spelled :host([orientation]) rather than as
56
+ descendants of .bd-breadcrumb--vertical. That class sits on the nav in
57
+ bd-breadcrumb's shadow root, while every element they style lives in
58
+ bd-breadcrumb-item's, so as descendant selectors they matched nothing:
59
+ measured at 375px, dividers stayed display block and items had no
60
+ padding and no background. bd-breadcrumb now reflects its orientation
61
+ onto each item, which is what these selectors read. */
42
62
  /* Vertical layout */
43
63
  .bd-breadcrumb--vertical .bd-breadcrumb__items {
44
64
  flex-direction: column;
@@ -46,7 +66,7 @@ export default css`
46
66
  gap: var(--spacing-4);
47
67
  }
48
68
 
49
- .bd-breadcrumb--vertical .bd-breadcrumb__divider {
69
+ :host([orientation="vertical"]) .bd-breadcrumb__divider {
50
70
  display: none;
51
71
  }
52
72
 
@@ -58,41 +78,91 @@ export default css`
58
78
  color: inherit;
59
79
  }
60
80
 
61
- /* Link styles */
81
+ /* Link styles.
82
+
83
+ The ink is bd-link's, and the two colours declared here were not the ones
84
+ that rendered. Measured at 1440: resting text rgb(0, 89, 214) and hovered
85
+ text rgb(0, 69, 173), both from the atom's own .bd-link--primary rules --
86
+ --color-text-brand and --color-action-primary-hover's next step,
87
+ --color-action-primary-active. The --color-blue-400 that stood here never
88
+ reached any text, which is the only reason it never showed as a failure:
89
+ it is 3.02:1 on white. The --color-blue-700 hover was the same value the
90
+ role already resolves to, spelled a second time by hand.
91
+
92
+ That answers the question P5H.1 left open about this hover. It is neither
93
+ a navigation-specific state nor a responsibility the token system is
94
+ missing: the action ramp already renders it, and 8.56:1 is what
95
+ --color-action-primary-active measures, not what a local choice bought.
96
+
97
+ The underline is the state cue that was missing. It was declared on the
98
+ host, and a host's text-decoration does not propagate into an
99
+ inline-flex anchor, so hover was colour alone -- 7.0:1 to 8.6:1, a change
100
+ a reader is not required to be able to see. It is now on the part that
101
+ holds the text. */
62
102
  bd-link.bd-breadcrumb__item {
63
- color: var(--color-blue-400);
64
103
  text-decoration: none;
65
- transition: all 0.15s ease-in-out;
104
+ transition: all var(--transition-duration-fast) var(--transition-easing-smooth);
66
105
  }
67
106
 
68
- bd-link.bd-breadcrumb__item:hover {
69
- color: var(--color-blue-700);
107
+ bd-link.bd-breadcrumb__item:hover::part(link) {
70
108
  text-decoration: underline;
71
- text-underline-offset: 2px;
72
109
  }
73
110
 
74
- /* Vertical item styles */
75
- .bd-breadcrumb--vertical .bd-breadcrumb__item {
111
+ /* Vertical item styles.
112
+
113
+ The pill is the target here, so the padding goes on the part rather than
114
+ on the host. Measured before: a 343x40 row whose focusable anchor was
115
+ 43x24, because the padding was on the bd-link host and the anchor inside
116
+ stayed the width of its own text -- 7.5% of the area a finger aims at,
117
+ and a focus ring that hugged the text inside a large grey box. The
118
+ background and the corner stay on the host, which is the box that draws
119
+ them; only the padding moves to where the target is. */
120
+ :host([orientation="vertical"]) .bd-breadcrumb__item {
121
+ background: var(--color-surface-subtle);
122
+ border-radius: var(--radius-sm);
123
+ width: 100%;
124
+ }
125
+
126
+ :host([orientation="vertical"]) span.bd-breadcrumb__item {
127
+ padding: var(--spacing-8) var(--spacing-12);
128
+ }
129
+
130
+ :host([orientation="vertical"]) bd-link.bd-breadcrumb__item::part(link) {
76
131
  padding: var(--spacing-8) var(--spacing-12);
77
- background: var(--color-neutral-50);
78
- border-radius: var(--spacing-4);
79
132
  width: 100%;
133
+ box-sizing: border-box;
80
134
  }
81
135
 
82
- .bd-breadcrumb--vertical bd-link.bd-breadcrumb__item:hover {
83
- background: var(--color-neutral-100);
136
+ :host([orientation="vertical"]) bd-link.bd-breadcrumb__item:hover {
137
+ background: var(--color-surface-muted);
138
+ }
139
+
140
+ :host([orientation="vertical"]) bd-link.bd-breadcrumb__item:hover::part(link) {
84
141
  text-decoration: none;
85
142
  }
86
143
 
87
- /* Current item styles */
144
+ /* Current item styles.
145
+
146
+ No colour and no weight here. Both were declared on this span and both
147
+ lost to bd-p's own paragraph rule one level down -- the colour by
148
+ coincidence, since --color-text-primary is what bd-p sets anyway, and the
149
+ weight not at all. The weight is asked for through bd-p's font-weight
150
+ prop in breadcrumb.js, which is the only place it renders. */
88
151
  .bd-breadcrumb__item--current {
89
- color: var(--color-neutral-900);
90
- font-weight: var(--typography-fontWeight-medium);
91
152
  cursor: default;
92
153
  }
93
154
 
94
- .bd-breadcrumb--vertical .bd-breadcrumb__item--current {
95
- background: var(--color-neutral-100);
155
+ :host([orientation="vertical"]) .bd-breadcrumb__item--current {
156
+ background: var(--color-surface-muted);
157
+ }
158
+ }
159
+
160
+ /* A reader who asked for less motion was still getting the item hover. Twenty-three
161
+ of the thirty animated directories in this package honour the query; this
162
+ one did not. */
163
+ @media (prefers-reduced-motion: reduce) {
164
+ bd-link.bd-breadcrumb__item {
165
+ transition: none;
96
166
  }
97
167
  }
98
- `;
168
+ `;