@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,5 +1,6 @@
1
1
  import { LitElement, html } from "lit";
2
- import { tokens } from "../../tokens/tokens.js";
2
+ // Installs the design tokens into document scope; see src/tokens/tokens.js
3
+ import "../../tokens/tokens.js";
3
4
  import "../heading/heading.js";
4
5
  import "../paragraph/paragraph.js";
5
6
  import highlightCSS from "./highlight.css.js";
@@ -11,7 +12,7 @@ class BdHighlightSection extends LitElement {
11
12
  as : { type: String }
12
13
  };
13
14
 
14
- static styles = [tokens, highlightCSS];
15
+ static styles = [highlightCSS];
15
16
 
16
17
  constructor() {
17
18
  super();
@@ -25,7 +26,7 @@ class BdHighlightSection extends LitElement {
25
26
  const highlightText = this.highlightText || "";
26
27
 
27
28
  const subtitleTemplate = this.subTitle
28
- ? html`<bd-p kind="small" class="sub-title">${this.subTitle}</bd-p>`
29
+ ? html`<bd-p variant="small" class="sub-title">${this.subTitle}</bd-p>`
29
30
  : null;
30
31
 
31
32
  if (!highlightText || !fullText.includes(highlightText)) {
@@ -43,39 +44,29 @@ class BdHighlightSection extends LitElement {
43
44
  ${subtitleTemplate}
44
45
  <bd-h as="${this.as}" class="headline">
45
46
  ${before}
46
- <span class="highlight">
47
- <span class="highlight-text">${highlightText}</span>
48
- <span class="highlight-right-anchor"></span>
49
- <span class="highlight-deco left">
50
- <svg class="highlight-svg-ellipse-top" viewBox="0 0 8 8">
47
+ <span class="highlight"><span class="highlight-anchor"
48
+ ><span class="highlight-deco left"
49
+ ><svg class="highlight-svg-ellipse-top" viewBox="0 0 8 8">
51
50
  <ellipse cx="4" cy="4" rx="4" ry="4" />
52
51
  </svg>
53
- <svg class="highlight-svg-rect" viewBox="0 0 2 42">
52
+ <svg class="highlight-svg-rect" viewBox="0 0 2 42" preserveAspectRatio="none">
53
+ <rect x="0" y="0" width="2" height="42" />
54
+ </svg></span
55
+ ></span
56
+ ><span class="highlight-text">${highlightText}</span><span class="highlight-anchor"
57
+ ><span class="highlight-deco right"
58
+ ><svg class="highlight-svg-rect" viewBox="0 0 2 42" preserveAspectRatio="none">
54
59
  <rect x="0" y="0" width="2" height="42" />
55
60
  </svg>
56
- </span>
57
- </span>
61
+ <svg class="highlight-svg-ellipse-bottom" viewBox="0 0 8 8">
62
+ <ellipse cx="4" cy="4" rx="4" ry="4" />
63
+ </svg></span
64
+ ></span></span>
58
65
  ${after}
59
66
  </bd-h>
60
67
  `;
61
68
  }
62
69
 
63
- updated() {
64
- const anchor = this.renderRoot.querySelector(".highlight-right-anchor");
65
- if (!anchor) return;
66
-
67
- const deco = document.createElement("span");
68
- deco.classList.add("highlight-deco", "right");
69
- deco.innerHTML = `
70
- <svg class="highlight-svg-rect" viewBox="0 0 2 42">
71
- <rect x="0" y="0" width="2" height="42" />
72
- </svg>
73
- <svg class="highlight-svg-ellipse-bottom" viewBox="0 0 8 8">
74
- <ellipse cx="4" cy="4" rx="4" ry="4" />
75
- </svg>
76
- `;
77
- anchor.appendChild(deco);
78
- }
79
70
  }
80
71
 
81
72
  customElements.define("bd-highlight", BdHighlightSection);
@@ -2,7 +2,7 @@ import { html } from 'lit';
2
2
  import './highlight.js';
3
3
 
4
4
  export default {
5
- title : 'Components/Highlight',
5
+ title : 'Atoms/Highlight',
6
6
  tags : ['autodocs'],
7
7
  parameters: {
8
8
  docs: {
@@ -28,7 +28,12 @@ export default {
28
28
  - The right-side decoration is injected via \`updated()\` using direct DOM manipulation
29
29
 
30
30
  ### Notes
31
- - \`sub-title\` renders an \`<h6>\` above the headline
31
+ - \`sub-title\` renders a \`bd-p kind="small"\` above the headline, **not** a heading
32
+ - \`as\` sets the heading level of the headline, defaulting to \`h3\`. Choose it so
33
+ the page's heading order stays correct — it is not a size control
34
+ - the component reads \`this.textContent\` during render, so the highlight is
35
+ resolved from the light DOM at first paint and does not follow later edits to
36
+ the slotted text
32
37
  - SVG decorations are injected via \`anchor.appendChild()\` in \`updated()\` — not re-injected on re-render if already present
33
38
  `
34
39
  }
@@ -42,8 +47,14 @@ export default {
42
47
  },
43
48
  subTitle: {
44
49
  control : 'text',
45
- description: 'Optional subtitle rendered as `<h6>` above the headline',
50
+ description: 'Optional line above the headline, rendered as a `bd-p kind="small"` — not a heading.',
46
51
  table : { type: { summary: 'string' }, defaultValue: { summary: '' }, category: 'Content' }
52
+ },
53
+ as: {
54
+ control : { type: 'select' },
55
+ options : ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
56
+ description: 'Heading level of the headline, passed to the inner `bd-h`. Choose it for document structure, not for size.',
57
+ table : { type: { summary: 'string' }, defaultValue: { summary: 'h3' }, category: 'Semantic' }
47
58
  }
48
59
  }
49
60
  };
@@ -1,23 +1,13 @@
1
1
  // icons/analysis-icon.js
2
- import { LitElement, css, html } from "lit";
3
- class AnalysisIcon extends LitElement {
2
+ import { html } from "lit";
3
+ import { BdIconElement } from "./icon-element.js";
4
+ class AnalysisIcon extends BdIconElement {
5
+ static defaultSize = "2xl";
4
6
 
5
- static properties = { size : { type: Number },
6
- color : { type: String },
7
- width : { type: Number },
8
- height: { type: Number } };
9
-
10
- constructor() {
11
- super();
12
- this.width = 48;
13
- this.height = 49;
14
- this.color = "#006DFF"; }
15
-
16
- static styles = css`:host { display: inline-flex; }`;
17
7
  render() {
18
8
  return html`
19
- <svg width="${this.width}" height="${this.height}" viewBox="0 0 48 49" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
20
- <path d="M19.5 3C13.5938 3 8.15625 6.1875 5.15625 11.25C2.25 16.4062 2.25 22.6875 5.15625 27.75C8.15625 32.9062 13.5938 36 19.5 36C25.3125 36 30.75 32.9062 33.75 27.75C36.6562 22.6875 36.6562 16.4062 33.75 11.25C30.75 6.1875 25.3125 3 19.5 3ZM19.5 39C8.71875 39 0 30.2812 0 19.5C0 8.8125 8.71875 0 19.5 0C30.1875 0 39 8.8125 39 19.5C39 24.375 37.2188 28.7812 34.3125 32.25L47.5312 45.4688C48.0938 46.0312 48.0938 47.0625 47.5312 47.625C46.9688 48.1875 45.9375 48.1875 45.375 47.625L32.1562 34.3125C28.7812 37.3125 24.2812 39 19.5 39ZM12 21C12 20.25 12.6562 19.5 13.5 19.5C14.25 19.5 15 20.25 15 21V27C15 27.8438 14.25 28.5 13.5 28.5C12.6562 28.5 12 27.8438 12 27V21ZM18 12C18 11.25 18.6562 10.5 19.5 10.5C20.25 10.5 21 11.25 21 12V27C21 27.8438 20.25 28.5 19.5 28.5C18.6562 28.5 18 27.8438 18 27V12ZM24 18C24 17.25 24.6562 16.5 25.5 16.5C26.25 16.5 27 17.25 27 18V27C27 27.8438 26.25 28.5 25.5 28.5C24.6562 28.5 24 27.8438 24 27V18Z" fill="${this.color}"/>
9
+ <svg viewBox="0 0 48 49" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
10
+ <path d="M19.5 3C13.5938 3 8.15625 6.1875 5.15625 11.25C2.25 16.4062 2.25 22.6875 5.15625 27.75C8.15625 32.9062 13.5938 36 19.5 36C25.3125 36 30.75 32.9062 33.75 27.75C36.6562 22.6875 36.6562 16.4062 33.75 11.25C30.75 6.1875 25.3125 3 19.5 3ZM19.5 39C8.71875 39 0 30.2812 0 19.5C0 8.8125 8.71875 0 19.5 0C30.1875 0 39 8.8125 39 19.5C39 24.375 37.2188 28.7812 34.3125 32.25L47.5312 45.4688C48.0938 46.0312 48.0938 47.0625 47.5312 47.625C46.9688 48.1875 45.9375 48.1875 45.375 47.625L32.1562 34.3125C28.7812 37.3125 24.2812 39 19.5 39ZM12 21C12 20.25 12.6562 19.5 13.5 19.5C14.25 19.5 15 20.25 15 21V27C15 27.8438 14.25 28.5 13.5 28.5C12.6562 28.5 12 27.8438 12 27V21ZM18 12C18 11.25 18.6562 10.5 19.5 10.5C20.25 10.5 21 11.25 21 12V27C21 27.8438 20.25 28.5 19.5 28.5C18.6562 28.5 18 27.8438 18 27V12ZM24 18C24 17.25 24.6562 16.5 25.5 16.5C26.25 16.5 27 17.25 27 18V27C27 27.8438 26.25 28.5 25.5 28.5C24.6562 28.5 24 27.8438 24 27V18Z" fill="currentColor"/>
21
11
  </svg>
22
12
  `;
23
13
  }
@@ -1,26 +1,13 @@
1
1
  // icons/arrow-down-icon.js
2
- import { LitElement, css, html } from "lit";
3
- class ArrowDownIcon extends LitElement {
2
+ import { html } from "lit";
3
+ import { BdIconElement } from "./icon-element.js";
4
+ class ArrowDownIcon extends BdIconElement {
5
+ static defaultSize = "md";
4
6
 
5
-
6
- static properties = {
7
- width : { type: Number },
8
- height: { type: Number },
9
- color : { type: String }
10
- };
11
-
12
- constructor() {
13
- super();
14
- this.width = 20;
15
- this.height = 20;
16
- this.color = "white"; }
17
-
18
-
19
- static styles = css`:host { display: inline-flex; }`;
20
7
  render() {
21
8
  return html`
22
- <svg xmlns="http://www.w3.org/2000/svg" width="${this.width}" height="${this.height}" viewBox="0 0 20 20" aria-hidden="true">
23
- <path fill-rule="evenodd" clip-rule="evenodd" d="M9.99956 12.8662L3.5665 6.43311L2.68262 7.31699L9.55762 14.192C9.80169 14.4361 10.1974 14.4361 10.4415 14.192L17.3165 7.31699L16.4326 6.43311L9.99956 12.8662Z" fill="${this.color}"/>
9
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none" aria-hidden="true">
10
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M9.99999 11.9823L3.56693 5.54919L1.79916 7.31696L9.11611 14.6339C9.60426 15.1221 10.3957 15.1221 10.8839 14.6339L18.2008 7.31696L16.433 5.54919L9.99999 11.9823Z" fill="currentColor"/>
24
11
  </svg>
25
12
  `;
26
13
  }
@@ -0,0 +1,44 @@
1
+ // icons/arrow-icon.js
2
+ import { html } from "lit";
3
+ import { BdIconElement } from "./icon-element.js";
4
+
5
+ /**
6
+ * The trailing arrow on bd-contact-button.
7
+ *
8
+ * Moved here from src/components/button/icons.js, which was the only place in
9
+ * the package registering an icon element outside this directory, and the only
10
+ * icon not extending BdIconElement. It carried its own :host and .arrow-icon
11
+ * rules -- inline-flex, height from --icon-sm-size, fill: currentColor -- which
12
+ * are exactly what the base class does, so the move deletes them rather than
13
+ * moving them. It now takes `size` from the icon scale like every sibling,
14
+ * where before it was fixed at sm whatever a consumer asked for.
15
+ *
16
+ * ARTWORK. Eclipse `arrow right fill`, exported from the Icon inventory table in the
17
+ * foundation Figma file. It replaces a 512x404.39 drawing of our own, and that
18
+ * changed the aspect ratio: the old box was 1.266 wide per unit of height, the
19
+ * new one is square. icon-element.js sizes by height with width auto, so at sm
20
+ * this arrow went from 20.26x16 to 16x16 -- narrower beside the same label.
21
+ *
22
+ * NAMING, WHICH IS THE CONFUSING PART. This is the only TRUE arrow in the set:
23
+ * a shaft with a head. bd-arrow-up-icon,
24
+ * bd-arrow-down-icon and bd-arrow-right-icon are CHEVRONS despite the name --
25
+ * carets with no shaft, on a 20x20 box. So "arrow" means two different drawings
26
+ * here, and a caller reaching for bd-arrow-right-icon expecting this one gets a
27
+ * chevron. Renaming is a public-API change and is not done here; it is recorded
28
+ * so the next person meets it in the file rather than in a review.
29
+ */
30
+ class BdArrowIcon extends BdIconElement {
31
+ static defaultSize = "sm";
32
+
33
+ render() {
34
+ return html`
35
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none" aria-hidden="true">
36
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M14.482 11.2501L10.9327 14.7993L12.7005 16.5671L19.2675 10L12.7005 3.43298L10.9327 5.20075L14.482 8.75006L1.875 8.75006V11.2501L14.482 11.2501Z" fill="currentColor"/>
37
+ </svg>
38
+ `;
39
+ }
40
+ }
41
+
42
+ customElements.define("bd-arrow-icon", BdArrowIcon);
43
+
44
+ export { BdArrowIcon };
@@ -1,31 +1,38 @@
1
- import { LitElement, css, html } from "lit";
1
+ // icons/arrow-right-icon.js
2
+ import { html } from "lit";
3
+ import { BdIconElement } from "./icon-element.js";
2
4
 
3
- class ArrowRightIcon extends LitElement {
4
- static properties = {
5
- width : { type: String },
6
- height: { type: String },
7
- color : { type: String }
8
- };
9
-
10
- constructor() {
11
- super();
12
- this.width = "20";
13
- this.height = "20";
14
- this.color = "currentColor";
15
- }
16
-
17
- static styles = css`
18
- :host { display: inline-flex; }
19
- svg { display: block; }
20
- `;
5
+ /**
6
+ * The third direction of the arrow family, and it is the same drawing as the
7
+ * other two rather than a new one.
8
+ *
9
+ * Note what this family actually is: bd-arrow-up-icon and bd-arrow-down-icon
10
+ * are CHEVRONS, not shafted arrows. This one keeps that, so "Learn more" gets a
11
+ * chevron affordance rather than the "→" character it replaces. That is a
12
+ * visible change and a deliberate one -- a shafted arrow would have been a new
13
+ * shape sitting beside two carets already called "arrow".
14
+ *
15
+ * ARTWORK. Eclipse `chevron right fill`. This used to be arrow-up's path under
16
+ * a rotate(90) transform, which guaranteed the two were the same drawing;
17
+ * Eclipse ships a chevron-right of its own, so the transform is gone and the
18
+ * three directions are now three separate paths that the library keeps in step.
19
+ *
20
+ * WEIGHT. Fill, which is what the other two chevrons are. It was briefly the
21
+ * light weight while arrow-up and arrow-down were on fill -- measured, the
22
+ * light edge offset is 1.250 against fill's 2.500 on a 20x20 box, so it read
23
+ * visibly thinner than its own family. Unlike the up/down pair it is not the
24
+ * other state of one control, so it never flickered; it was simply a family
25
+ * that did not agree. All three move together or not at all.
26
+ */
27
+ class ArrowRightIcon extends BdIconElement {
28
+ static defaultSize = "md";
21
29
 
22
30
  render() {
23
31
  return html`
24
- <svg xmlns="http://www.w3.org/2000/svg" width="${this.width}" height="${this.height}" viewBox="0 0 16 16" fill="none" aria-hidden="true">
25
- <path d="M2.5 8h11M9 3.5 13.5 8 9 12.5" stroke="${this.color}" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
32
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none" aria-hidden="true">
33
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M14.6339 9.11614L7.31692 1.79919L5.54915 3.56696L11.9822 10L5.54915 16.4331L7.31691 18.2008L14.6339 10.8839C15.122 10.3958 15.122 9.60429 14.6339 9.11614Z" fill="currentColor"/>
26
34
  </svg>
27
35
  `;
28
36
  }
29
37
  }
30
-
31
- customElements.define("bd-arrow-right-icon", ArrowRightIcon);
38
+ customElements.define("bd-arrow-right-icon", ArrowRightIcon);
@@ -1,26 +1,27 @@
1
1
  // icons/arrow-up-icon.js
2
- import { LitElement, css, html } from "lit";
2
+ import { html } from "lit";
3
+ import { BdIconElement } from "./icon-element.js";
3
4
 
4
- class ArrowUpIcon extends LitElement {
5
+ /**
6
+ * ARTWORK. Eclipse `chevron up fill`, and the weight is the point.
7
+ *
8
+ * This briefly shipped as Eclipse `chevron up` -- the LIGHT weight -- while
9
+ * bd-arrow-down-icon was on fill. The two are the two states of one control:
10
+ * accordion.js renders up when open and down when closed, and bd-footer's
11
+ * country toggle does the same. Measured off the paths, fill is exactly 2.00x
12
+ * the light edge offset (2.500 against 1.250 on a 20x20 box), so the chevron
13
+ * visibly doubled in weight every time someone collapsed an accordion. Two
14
+ * legitimate library weights, wrong together.
15
+ *
16
+ * If this is ever moved back to light, bd-arrow-down-icon has to move with it.
17
+ */
18
+ class ArrowUpIcon extends BdIconElement {
19
+ static defaultSize = "md";
5
20
 
6
- static properties = {
7
- width : { type: Number },
8
- height: { type: Number },
9
- color : { type: String }
10
- };
11
-
12
- constructor() {
13
- super();
14
- this.width = 20;
15
- this.height = 20;
16
- this.color = "white";
17
- }
18
-
19
- static styles = css`:host { display: inline-flex; }`;
20
21
  render() {
21
22
  return html`
22
- <svg xmlns="http://www.w3.org/2000/svg" width="${this.width}" height="${this.height}" viewBox="0 0 20 20" aria-hidden="true">
23
- <path fill-rule="evenodd" clip-rule="evenodd" d="M9.55762 5.80806C9.80169 5.56398 10.1974 5.56398 10.4415 5.80806L17.3165 12.6831L16.4326 13.5669L9.99956 7.13388L3.5665 13.5669L2.68262 12.6831L9.55762 5.80806Z" fill="${this.color}"/>
23
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="none" aria-hidden="true">
24
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M9.99999 8.01777L16.433 14.4508L18.2008 12.6831L10.8839 5.36612C10.3957 4.87796 9.60426 4.87796 9.1161 5.36612L1.79916 12.6831L3.56693 14.4508L9.99999 8.01777Z" fill="currentColor"/>
24
25
  </svg>
25
26
  `;
26
27
  }
@@ -18,7 +18,7 @@ class BdAiIcon extends LitElement {
18
18
  render() {
19
19
  return html`
20
20
  <svg width="${this.width}" height="${this.height}" viewBox="0 0 524.8 62.6" xmlns="http://www.w3.org/2000/svg">
21
- <path fill="#006dff" d="M89.8,48.5v-17.8h10.5v-8.3h-10.5v-11.4h-6.2l-3.6,11.4h-9.5v.5l3.6,3.1c5.5,4.5,5.9,4.4,5.9,6.9v-2.2s0,18,0,18c0,12.8,9,15.1,17,13l4.9-7.8-.3-.2c-6.8,2-11.7,1.8-11.7-5.2ZM62.8,3.2c-3.6,0-6.2,2.8-6.2,5.9s2.6,5.9,6.2,5.9,6.4-2.5,6.4-5.9-2.8-5.9-6.4-5.9ZM37.2,31.2v-.2c6-1.8,10-6.1,10-12.7,0-10.5-9-14.5-17.7-14.5H8.4s-8.4,0-8.4,0v.9l3,2.5c3.6,2.9,4,3.5,4,6.1v48.4h20.8c10.9,0,21.9-3.9,21.9-16.5s-5.2-13.2-12.5-14ZM17.3,12.6h8.5c5.7,0,7.5.8,9.3,2.5,1.3,1.2,1.9,3,1.9,5s-.6,3.5-2,4.8c-1.7,1.6-4,2.4-8.3,2.4h-9.4v-14.7ZM26.8,52.8h-9.5v-16.7h9.9c8.3,0,12.2,2.1,12.2,8.2s-7.3,8.5-12.7,8.5ZM130.8,2.1l3.1,2c2.8,1.8,3.2,2.6,3.2,5.1v18.2h-.2c-2-2.5-6-6-13.3-6-11.2,0-19,9-19,20.6s7.3,20.6,19.4,20.6,10.6-2.1,13.5-6.9h.2l1,5.9h8.3V1.4h-16.1v.7ZM125.9,53.8c-7.2,0-11.5-5.6-11.5-11.8s4.3-11.8,11.5-11.8,11.5,5.6,11.5,11.8-4.3,11.8-11.5,11.8ZM52.7,23.1l1.6,1.3c3.5,2.7,3.7,3.2,3.7,6.5h0v30.8h9.8V22.4h-15.1v.6ZM376.8,21.4c-11.8,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.7-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9c1.3-15.4-7-24-19.2-24ZM366.1,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM412.3,28.6h-.2v-6.2h-16.5v.4s2.5,1.6,2.5,1.6c4,2.5,4.2,3.3,4.2,8.2v29h9.8v-21c0-2.1,1.3-9.9,10.5-9.9s3.1.3,4.7.7v-9.5c-1.1-.3-2.3-.6-3.5-.6-5.2,0-9.5,2.7-11.6,7.2ZM334.1,2.1l1.4.9c4.7,3,5.3,3.9,5.3,9v15.4h-.3c-2-2.5-6-6-13.3-6-11.2,0-19,9-19,20.6s7.3,20.6,19.4,20.6,10.6-2.1,13.5-6.9h.2l1,5.9h8.3V1.4h-16.5v.7ZM329.6,53.8c-7.2,0-11.5-5.6-11.5-11.8s4.3-11.8,11.5-11.8,11.5,5.6,11.5,11.8-4.3,11.8-11.5,11.8ZM288.1,21.4c-4.4,0-9.3,2.2-12.5,7h-.2v-6h-8.4s-7.7,0-7.7,0v.4l2.4,1.6c4,2.5,4.3,3.3,4.3,8.2v29h9.8v-21.4c0-5.2,2.5-10,9-10s8,5.2,8,9.6v21.8h9.8v-24.8c0-9.1-5.3-15.4-14.6-15.4ZM239.8,21.4c-11.9,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.8-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9c1.3-15.4-7-24-19.2-24ZM229.1,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM173.1,21.4c-11.9,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.7-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9v-2.7c0-13.6-8.3-21.3-19.2-21.3ZM162.4,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM209.8,15.1c0-6.9,6.1-8.8,13.9-5.7l.5-.4-2.3-8.3c-15-3-22,3.7-22,14.4v7.2h-9.6v.6l5,4.1c3.9,3.1,4.6,3.8,4.6,7.1v27.6h9.8v-31h9.1v-8.4h-9.1v-7.1ZM524.8,9.6V3.9h-23.2v5.8h8.1v46.2h-8.1v5.8h23.2v-5.8h-8.1V9.6h8.1ZM467.4,3.9l-20.2,57.7h7l5.8-17h23.3l5.8,17h7.3l-20.2-57.7h-8.9ZM461.7,38.4l9.8-28.1h.4l9.8,28.1h-19.9Z"/>
21
+ <path fill="var(--color-blue-500)" d="M89.8,48.5v-17.8h10.5v-8.3h-10.5v-11.4h-6.2l-3.6,11.4h-9.5v.5l3.6,3.1c5.5,4.5,5.9,4.4,5.9,6.9v-2.2s0,18,0,18c0,12.8,9,15.1,17,13l4.9-7.8-.3-.2c-6.8,2-11.7,1.8-11.7-5.2ZM62.8,3.2c-3.6,0-6.2,2.8-6.2,5.9s2.6,5.9,6.2,5.9,6.4-2.5,6.4-5.9-2.8-5.9-6.4-5.9ZM37.2,31.2v-.2c6-1.8,10-6.1,10-12.7,0-10.5-9-14.5-17.7-14.5H8.4s-8.4,0-8.4,0v.9l3,2.5c3.6,2.9,4,3.5,4,6.1v48.4h20.8c10.9,0,21.9-3.9,21.9-16.5s-5.2-13.2-12.5-14ZM17.3,12.6h8.5c5.7,0,7.5.8,9.3,2.5,1.3,1.2,1.9,3,1.9,5s-.6,3.5-2,4.8c-1.7,1.6-4,2.4-8.3,2.4h-9.4v-14.7ZM26.8,52.8h-9.5v-16.7h9.9c8.3,0,12.2,2.1,12.2,8.2s-7.3,8.5-12.7,8.5ZM130.8,2.1l3.1,2c2.8,1.8,3.2,2.6,3.2,5.1v18.2h-.2c-2-2.5-6-6-13.3-6-11.2,0-19,9-19,20.6s7.3,20.6,19.4,20.6,10.6-2.1,13.5-6.9h.2l1,5.9h8.3V1.4h-16.1v.7ZM125.9,53.8c-7.2,0-11.5-5.6-11.5-11.8s4.3-11.8,11.5-11.8,11.5,5.6,11.5,11.8-4.3,11.8-11.5,11.8ZM52.7,23.1l1.6,1.3c3.5,2.7,3.7,3.2,3.7,6.5h0v30.8h9.8V22.4h-15.1v.6ZM376.8,21.4c-11.8,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.7-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9c1.3-15.4-7-24-19.2-24ZM366.1,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM412.3,28.6h-.2v-6.2h-16.5v.4s2.5,1.6,2.5,1.6c4,2.5,4.2,3.3,4.2,8.2v29h9.8v-21c0-2.1,1.3-9.9,10.5-9.9s3.1.3,4.7.7v-9.5c-1.1-.3-2.3-.6-3.5-.6-5.2,0-9.5,2.7-11.6,7.2ZM334.1,2.1l1.4.9c4.7,3,5.3,3.9,5.3,9v15.4h-.3c-2-2.5-6-6-13.3-6-11.2,0-19,9-19,20.6s7.3,20.6,19.4,20.6,10.6-2.1,13.5-6.9h.2l1,5.9h8.3V1.4h-16.5v.7ZM329.6,53.8c-7.2,0-11.5-5.6-11.5-11.8s4.3-11.8,11.5-11.8,11.5,5.6,11.5,11.8-4.3,11.8-11.5,11.8ZM288.1,21.4c-4.4,0-9.3,2.2-12.5,7h-.2v-6h-8.4s-7.7,0-7.7,0v.4l2.4,1.6c4,2.5,4.3,3.3,4.3,8.2v29h9.8v-21.4c0-5.2,2.5-10,9-10s8,5.2,8,9.6v21.8h9.8v-24.8c0-9.1-5.3-15.4-14.6-15.4ZM239.8,21.4c-11.9,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.8-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9c1.3-15.4-7-24-19.2-24ZM229.1,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM173.1,21.4c-11.9,0-20.5,8.3-20.5,20.6s9.1,20.6,22.2,20.6,7.4-.7,10.5-1.9l5.6-9.3-.7-.4c-4.8,2.5-9.9,3.8-14.4,3.8-6.8,0-12.6-3.4-13.3-9.3h29.9v-2.7c0-13.6-8.3-21.3-19.2-21.3ZM162.4,38.1c.7-5.6,4.3-9.3,10.1-9.3s9.9,3.6,10,9.3h-20.1ZM209.8,15.1c0-6.9,6.1-8.8,13.9-5.7l.5-.4-2.3-8.3c-15-3-22,3.7-22,14.4v7.2h-9.6v.6l5,4.1c3.9,3.1,4.6,3.8,4.6,7.1v27.6h9.8v-31h9.1v-8.4h-9.1v-7.1ZM524.8,9.6V3.9h-23.2v5.8h8.1v46.2h-8.1v5.8h23.2v-5.8h-8.1V9.6h8.1ZM467.4,3.9l-20.2,57.7h7l5.8-17h23.3l5.8,17h7.3l-20.2-57.7h-8.9ZM461.7,38.4l9.8-28.1h.4l9.8,28.1h-19.9Z"/>
22
22
  </svg>
23
23
  `;
24
24
  }
@@ -0,0 +1,279 @@
1
+ // icons/brand-marks.stories.js
2
+ import { html } from "lit";
3
+ import "./av-comparatives-icon.js";
4
+ import "./bd-ai-icon.js";
5
+ import "./best-brands-icon.js";
6
+ import "./brand-signature-icon.js";
7
+ import "./pc-mag-2024-icon.js";
8
+ import "./pc-mag-business-icon.js";
9
+ import "./pc-mag-icon.js";
10
+ import "./pc-mag-readers-icon.js";
11
+ import "./top-product-icon.js";
12
+
13
+ export default {
14
+ title : 'Atoms/Brand mark',
15
+ tags : ['autodocs'],
16
+ parameters: {
17
+ docs: {
18
+ description: {
19
+ component: `
20
+ Nine wordmarks and award badges. They sat under **Atoms/Icon** and are not
21
+ icons, which is why that section read as eight exceptions to its own rules.
22
+
23
+ ### Why they are separate
24
+ An interface icon is a shape on a square grid: it takes a \`size\` step from
25
+ \`--icon-*-size\`, it is drawn in \`currentColor\`, and it follows the text beside
26
+ it. None of that is true here, and none of it should be.
27
+
28
+ | | Interface icon | Brand mark |
29
+ |---|---|---|
30
+ | Size | \`size\` step on the icon scale | \`width\` / \`height\`, own aspect ratio |
31
+ | Colour | \`currentColor\` | fixed — the mark's own |
32
+ | Grid | square, 12–64px | 52×48, 68×37, 126×15 — whatever it was drawn at |
33
+ | Renders into | shadow DOM | light DOM |
34
+
35
+ A PC Mag badge is not a 24px glyph and must not be recoloured — retinting a
36
+ third party's award mark misrepresents it. Forcing these onto the icon scale
37
+ would make the system tidier and the marks wrong.
38
+
39
+ ### The two of ours behave differently from the other seven
40
+
41
+ \`bd-ai-icon\` is the Bitdefender wordmark, and it is the first exception to
42
+ "fixed colour": it is our own mark, so its fill is \`var(--color-blue-500)\` —
43
+ the brand blue as a token, not a hex value baked into the artwork.
44
+
45
+ \`bd-brand-signature-icon\` is the ninth and it is the *whole* right-hand column
46
+ of that table, not just the colour cell. It is a \`BdIconElement\` like any
47
+ interface icon: \`size\` from \`--icon-*-size\`, artwork in \`currentColor\`, both
48
+ deprecated \`width\`/\`height\` props still honoured. Nothing about it needed an
49
+ exception, because neither reason for the rules above applies to it — choosing
50
+ the ink is not misrepresentation when the mark is your own, and a single path
51
+ has no PNG to stop it scaling. It is filed here because it is a brand mark;
52
+ it is used like an icon.
53
+
54
+ So the table above describes the seven. Read it as "what a third party's raster
55
+ badge needs", not as what this section is.
56
+
57
+ ### Usage
58
+ \`\`\`html
59
+ <bd-pc-mag-icon width="189" height="64"></bd-pc-mag-icon>
60
+ <bd-top-product-icon width="48" height="52"></bd-top-product-icon>
61
+ <bd-ai-icon width="126" height="15"></bd-ai-icon>
62
+ \`\`\`
63
+
64
+ Always set \`width\` and \`height\`: the defaults differ per mark, because each
65
+ one is a different shape.
66
+
67
+ ### Accessibility
68
+ These render \`aria-hidden="true"\` like the icons do, so they are decorative by
69
+ default. An award badge usually *is* meaningful — it is a claim about the
70
+ product — so when one carries information rather than decoration, put the text
71
+ next to it or in a \`<bd-visually-hidden>\`, e.g. "PC Mag Editors' Choice 2024".
72
+ `
73
+ }
74
+ }
75
+ },
76
+ argTypes: {
77
+ width: {
78
+ control : { type: 'number', min: 8, max: 400, step: 1 },
79
+ description: 'Rendered width in pixels. Defaults differ per mark, so set it explicitly.',
80
+ table : { type: { summary: 'number' }, defaultValue: { summary: 'varies' }, category: 'Size' }
81
+ },
82
+ height: {
83
+ control : { type: 'number', min: 8, max: 400, step: 1 },
84
+ description: 'Rendered height in pixels. Defaults differ per mark, so set it explicitly.',
85
+ table : { type: { summary: 'number' }, defaultValue: { summary: 'varies' }, category: 'Size' }
86
+ }
87
+ }
88
+ };
89
+
90
+ export const AllMarks = {
91
+ name : 'All marks',
92
+ parameters: {
93
+ controls: { disable: true },
94
+ docs : {
95
+ description: {
96
+ story: `Each mark at its intrinsic size. The sizes have nothing in common
97
+ because the artwork has nothing in common — that is the point of keeping them
98
+ off the icon scale. The signature is the one that sets no size here, because
99
+ it is the one that has a scale to take one from.`
100
+ }
101
+ }
102
+ },
103
+ render: () => html`
104
+ <style>
105
+ .marks-grid {
106
+ display: grid;
107
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
108
+ gap: var(--spacing-24);
109
+ }
110
+ .mark-item {
111
+ display: flex;
112
+ flex-direction: column;
113
+ align-items: center;
114
+ justify-content: space-between;
115
+ gap: var(--spacing-8);
116
+ padding: var(--spacing-16);
117
+ min-height: var(--spacing-128);
118
+ border: var(--border-width-1) solid var(--color-border-subtle);
119
+ border-radius: var(--radius-md);
120
+ }
121
+ .mark-item span {
122
+ font-family: var(--typography-fontFamily-mono);
123
+ font-size: var(--typography-fontSize-xxs);
124
+ color: var(--color-text-muted);
125
+ text-align: center;
126
+ }
127
+ </style>
128
+ <div class="marks-grid">
129
+ <div class="mark-item">
130
+ <bd-ai-icon width="126" height="15"></bd-ai-icon>
131
+ <span>bd-ai-icon · 126×15</span>
132
+ </div>
133
+ <div class="mark-item">
134
+ <bd-brand-signature-icon></bd-brand-signature-icon>
135
+ <span>bd-brand-signature-icon · 182×24 (size="lg")</span>
136
+ </div>
137
+ <div class="mark-item">
138
+ <bd-av-comparatives-icon width="126" height="64"></bd-av-comparatives-icon>
139
+ <span>bd-av-comparatives-icon · 126×64</span>
140
+ </div>
141
+ <div class="mark-item">
142
+ <bd-best-brands-icon width="48" height="52"></bd-best-brands-icon>
143
+ <span>bd-best-brands-icon · 48×52</span>
144
+ </div>
145
+ <div class="mark-item">
146
+ <bd-pc-mag-icon width="189" height="64"></bd-pc-mag-icon>
147
+ <span>bd-pc-mag-icon · 189×64</span>
148
+ </div>
149
+ <div class="mark-item">
150
+ <bd-pc-mag-2024-icon width="48" height="52"></bd-pc-mag-2024-icon>
151
+ <span>bd-pc-mag-2024-icon · 48×52</span>
152
+ </div>
153
+ <div class="mark-item">
154
+ <bd-pc-mag-business-icon width="48" height="52"></bd-pc-mag-business-icon>
155
+ <span>bd-pc-mag-business-icon · 48×52</span>
156
+ </div>
157
+ <div class="mark-item">
158
+ <bd-pc-mag-readers-icon width="37" height="68"></bd-pc-mag-readers-icon>
159
+ <span>bd-pc-mag-readers-icon · 37×68</span>
160
+ </div>
161
+ <div class="mark-item">
162
+ <bd-top-product-icon width="48" height="52"></bd-top-product-icon>
163
+ <span>bd-top-product-icon · 48×52</span>
164
+ </div>
165
+ </div>
166
+ `
167
+ };
168
+
169
+ export const Wordmark = {
170
+ name : 'Bitdefender wordmark',
171
+ args : { width: 252, height: 30 },
172
+ render: ({ width, height }) => html`
173
+ <bd-ai-icon width="${width}" height="${height}"></bd-ai-icon>
174
+ `,
175
+ parameters: {
176
+ docs: {
177
+ description: {
178
+ story: `Our own mark, so it is the one here drawn from a token —
179
+ \`var(--color-blue-500)\`. The third-party marks keep their own colours.`
180
+ }
181
+ }
182
+ }
183
+ };
184
+
185
+ export const AwardRow = {
186
+ name : 'Awards in a row',
187
+ parameters: {
188
+ controls: { disable: true },
189
+ docs : {
190
+ description: {
191
+ story: `How they actually appear on a page. They do not line up on a common
192
+ grid and should be baseline- or bottom-aligned rather than centred on a shared
193
+ box height.`
194
+ }
195
+ }
196
+ },
197
+ render: () => html`
198
+ <div style="display: flex; align-items: flex-end; gap: var(--spacing-24); flex-wrap: wrap">
199
+ <bd-av-comparatives-icon width="126" height="64"></bd-av-comparatives-icon>
200
+ <bd-best-brands-icon width="48" height="52"></bd-best-brands-icon>
201
+ <bd-pc-mag-2024-icon width="48" height="52"></bd-pc-mag-2024-icon>
202
+ <bd-top-product-icon width="48" height="52"></bd-top-product-icon>
203
+ </div>
204
+ `
205
+ };
206
+
207
+ export const BrandSignature = {
208
+ name : 'Brand signature',
209
+ parameters: {
210
+ controls: { disable: true },
211
+ docs : {
212
+ description: {
213
+ story: `The signature the hero lays over its image — Figma
214
+ \`Mark/brand-signature\`, node 357:62.
215
+
216
+ It takes its ink from whatever it sits in, which is the whole reason it is not
217
+ drawn white: a baked white mark is invisible the moment somebody puts it on a
218
+ light ground, which is exactly how \`bd-close-icon\` came to be invisible on a
219
+ white page before the icon base class existed. The three rows below are the
220
+ same element three times with no \`color\` prop set.
221
+
222
+ Over an image it is white, and the contrast is the **scrim's** job rather than
223
+ the mark's — \`bd-header\` paints a \`--color-blue-950\` band from 0% to 60%
224
+ behind it. Without one, measured against a real product photo, the worst
225
+ neighbourhood under the mark was **1.00:1** with a third of its area under the
226
+ 3:1 that WCAG 1.4.11 asks of a non-text graphic. With it: worst **8.64:1**. The
227
+ band, its stops and why blue-950 rather than the brand blue are all written up
228
+ in \`header.css.js\`.`
229
+ }
230
+ }
231
+ },
232
+ render: () => html`
233
+ <style>
234
+ .sig-row {
235
+ display: flex;
236
+ align-items: center;
237
+ gap: var(--spacing-16);
238
+ padding: var(--spacing-24);
239
+ border-radius: var(--radius-lg);
240
+ font-family: var(--typography-fontFamily-mono);
241
+ font-size: var(--typography-fontSize-xxs);
242
+ }
243
+ .sig-rows { display: grid; gap: var(--spacing-16); }
244
+ .sig-on-page {
245
+ background: var(--color-surface-default);
246
+ color: var(--color-text-primary);
247
+ border: var(--border-width-1) solid var(--color-border-subtle);
248
+ }
249
+ .sig-on-brand {
250
+ background: var(--color-action-primary);
251
+ color: var(--color-text-inverse);
252
+ }
253
+ .sig-on-scrim {
254
+ color: var(--color-text-inverse);
255
+ background:
256
+ linear-gradient(
257
+ to right,
258
+ color-mix(in srgb, var(--color-blue-950) 60%, transparent),
259
+ color-mix(in srgb, var(--color-blue-950) 60%, transparent)
260
+ ),
261
+ linear-gradient(120deg, var(--color-neutral-0), var(--color-blue-200));
262
+ }
263
+ </style>
264
+ <div class="sig-rows">
265
+ <div class="sig-row sig-on-page">
266
+ <bd-brand-signature-icon></bd-brand-signature-icon>
267
+ <span>on the page ground — text/primary</span>
268
+ </div>
269
+ <div class="sig-row sig-on-brand">
270
+ <bd-brand-signature-icon></bd-brand-signature-icon>
271
+ <span>on action/primary — text/inverse</span>
272
+ </div>
273
+ <div class="sig-row sig-on-scrim">
274
+ <bd-brand-signature-icon></bd-brand-signature-icon>
275
+ <span>white over the hero scrim — blue-950 at 60% on a pale image</span>
276
+ </div>
277
+ </div>
278
+ `
279
+ };