@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
@@ -0,0 +1,56 @@
1
+ import { html } from 'lit';
2
+ import './visually-hidden.js';
3
+
4
+ export default {
5
+ title : 'Atoms/Visually Hidden',
6
+ tags : ['autodocs'],
7
+ parameters: {
8
+ docs: {
9
+ description: {
10
+ component: `
11
+ **BdVisuallyHidden** hides content from sight while keeping it available to
12
+ screen readers.
13
+
14
+ ### Usage
15
+ \`\`\`html
16
+ <button>
17
+ <bd-close-icon></bd-close-icon>
18
+ <bd-visually-hidden>Close dialog</bd-visually-hidden>
19
+ </button>
20
+
21
+ <h2><bd-visually-hidden>Section: </bd-visually-hidden>Pricing</h2>
22
+ \`\`\`
23
+
24
+ ### Props
25
+ None. The content is slotted.
26
+
27
+ ### When to use it
28
+ For text that a sighted user does not need because the visual design already
29
+ says it, but that a screen reader user does — the name of an icon-only button,
30
+ a table caption, or context a heading implies visually.
31
+
32
+ ### Not the same as hiding
33
+ \`display: none\`, \`hidden\` and \`visibility: hidden\` remove content from
34
+ everyone, assistive tech included. This clips it to a single pixel and keeps it
35
+ in the accessibility tree, which is the opposite intent.
36
+
37
+ It also stays focusable, so a skip link inside it can still be reached by Tab
38
+ and revealed on focus.
39
+
40
+ ### Prefer a real label where one exists
41
+ An icon-only button is usually better served by \`aria-label\` on the button
42
+ itself than by hidden text inside it. Reach for this when the text must be part
43
+ of the content — for instance when it needs to be translated with the page, or
44
+ when it belongs to a heading or table rather than a control.
45
+ `
46
+ }
47
+ }
48
+ }
49
+ };
50
+
51
+ export const Default = () => html`
52
+ <p style="font-family: var(--typography-fontFamily-sans)">
53
+ Rating: 4.8
54
+ <bd-visually-hidden>out of 5 stars</bd-visually-hidden>
55
+ </p>
56
+ `;
@@ -4,43 +4,43 @@ import { Button } from './Button';
4
4
 
5
5
  // More on how to set up stories at: https://storybook.js.org/docs/writing-stories
6
6
  export default {
7
- title: 'Example/Button',
8
- tags: ['autodocs'],
9
- render: (args) => Button(args),
7
+ title : 'Example/Button',
8
+ tags : ['autodocs'],
9
+ render : (args) => Button(args),
10
10
  argTypes: {
11
11
  backgroundColor: { control: 'color' },
12
- size: {
12
+ size : {
13
13
  control: { type: 'select' },
14
- options: ['small', 'medium', 'large'],
15
- },
14
+ options: ['small', 'medium', 'large']
15
+ }
16
16
  },
17
- args: { onClick: fn() },
17
+ args: { onClick: fn() }
18
18
  };
19
19
 
20
20
  // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args
21
21
  export const Primary = {
22
22
  args: {
23
23
  primary: true,
24
- label: 'Button',
25
- },
24
+ label : 'Button'
25
+ }
26
26
  };
27
27
 
28
28
  export const Secondary = {
29
29
  args: {
30
- label: 'Button',
31
- },
30
+ label: 'Button'
31
+ }
32
32
  };
33
33
 
34
34
  export const Large = {
35
35
  args: {
36
- size: 'large',
37
- label: 'Button',
38
- },
36
+ size : 'large',
37
+ label: 'Button'
38
+ }
39
39
  };
40
40
 
41
41
  export const Small = {
42
42
  args: {
43
- size: 'small',
44
- label: 'Button',
45
- },
43
+ size : 'small',
44
+ label: 'Button'
45
+ }
46
46
  };
@@ -3,22 +3,22 @@ import { fn } from '@storybook/test';
3
3
  import { Header } from './Header';
4
4
 
5
5
  export default {
6
- title: 'Example/Header',
6
+ title : 'Example/Header',
7
7
  // This component will have an automatically generated Autodocs entry: https://storybook.js.org/web-components/vue/writing-docs/autodocs
8
- tags: ['autodocs'],
8
+ tags : ['autodocs'],
9
9
  render: (args) => Header(args),
10
- args: {
11
- onLogin: fn(),
12
- onLogout: fn(),
13
- onCreateAccount: fn(),
14
- },
10
+ args : {
11
+ onLogin : fn(),
12
+ onLogout : fn(),
13
+ onCreateAccount: fn()
14
+ }
15
15
  };
16
16
  export const LoggedIn = {
17
17
  args: {
18
18
  user: {
19
- name: 'Jane Doe',
20
- },
21
- },
19
+ name: 'Jane Doe'
20
+ }
21
+ }
22
22
  };
23
23
 
24
24
  export const LoggedOut = {};
@@ -9,7 +9,7 @@ export const Page = ({ user, onLogin, onLogout, onCreateAccount }) => html`
9
9
  user,
10
10
  onLogin,
11
11
  onLogout,
12
- onCreateAccount,
12
+ onCreateAccount
13
13
  })}
14
14
 
15
15
  <section class="storybook-page">
@@ -2,19 +2,19 @@ import * as HeaderStories from './Header.stories';
2
2
  import { Page } from './Page';
3
3
 
4
4
  export default {
5
- title: 'Example/Page',
6
- render: (args) => Page(args),
5
+ title : 'Example/Page',
6
+ render: (args) => Page(args)
7
7
  };
8
8
 
9
9
  export const LoggedIn = {
10
10
  args: {
11
11
  // More on composing args: https://storybook.js.org/docs/writing-stories/args#args-composition
12
- ...HeaderStories.LoggedIn.args,
13
- },
12
+ ...HeaderStories.LoggedIn.args
13
+ }
14
14
  };
15
15
 
16
16
  export const LoggedOut = {
17
17
  args: {
18
- ...HeaderStories.LoggedOut.args,
19
- },
18
+ ...HeaderStories.LoggedOut.args
19
+ }
20
20
  };
@@ -0,0 +1,339 @@
1
+ import { html } from 'lit';
2
+ import { contrast, docsPage, refSection, resolve } from './story-chrome.js';
3
+
4
+ import '../components/cards/card.js';
5
+ import '../components/divider/divider-horizontal.js';
6
+ import '../components/paragraph/paragraph.js';
7
+ import '../components/tag/tag.js';
8
+
9
+ export default {
10
+ title: 'Foundations/Shape/Borders',
11
+ tags : ['autodocs']
12
+ };
13
+
14
+ /* Measured, not transcribed: the ratios below are computed from the tokens as
15
+ the page renders, so a palette change moves them. */
16
+ const ratio = (token, surface) => {
17
+ const a = resolve(token);
18
+ const b = resolve(surface);
19
+ if (!a || !b) return null;
20
+ try {
21
+ return Math.round(contrast(a, b) * 100) / 100; // contrast() resolves colours itself
22
+ } catch {
23
+ return null;
24
+ }
25
+ };
26
+
27
+ const swatch = (token, surface, height = 'var(--spacing-40)') => html`
28
+ <div style="background:var(${surface});padding:var(--spacing-12);border-radius:var(--radius-lg)">
29
+ <div style="height:${height};border:var(--border-width-1) solid var(${token});border-radius:var(--radius-lg)"></div>
30
+ </div>`;
31
+
32
+ const RESPONSIBILITIES = [
33
+ {
34
+ name : 'Content boundary',
35
+ token: '--color-border-container',
36
+ what : `The edge of a self-contained object — a card, a panel, a navigation band — drawn
37
+ only so the object is perceptible.`,
38
+ use: html`When a component has decided it wants an edge and that edge is describing an
39
+ <i>object</i>, not something you can operate.`,
40
+ avoid: html`On anything actionable. It is deliberately far below the 3:1 WCAG 1.4.11 asks
41
+ of a UI component, so a control outlined with it does not read as a control.`,
42
+ live: 'ComparisonPanel column, TrustPanel card, Bento tile, CompatibilityTable container, PageSwitcher band, AnchorNav band, TabList rail, Carousel item',
43
+ demo: html`
44
+ <bd-card-item title="Machine Learning">
45
+ <bd-p variant="small">A card that has chosen to carry an edge.</bd-p>
46
+ </bd-card-item>`
47
+ },
48
+ {
49
+ name : 'Control edge',
50
+ token: '--color-border-default / --color-action-primary',
51
+ what : 'The boundary of something the user operates.',
52
+ use : html`On inputs, checkboxes, radios, and outlined buttons — anywhere the edge is part
53
+ of the affordance. These are the two roles that clear 3:1, and that is why.`,
54
+ avoid: html`As a decorative line. A control edge on something inert tells the reader they
55
+ can operate it.`,
56
+ live: 'bd-input, bd-checkbox, bd-radio, bd-switch, bd-button (outline variants, drawn as an inset shadow so the box never shifts)',
57
+ demo: html`
58
+ <input aria-label="Sample control" placeholder="A control edge"
59
+ style="padding:var(--spacing-12);border:var(--border-width-1) solid var(--color-border-default);border-radius:var(--radius-md);font:inherit;width:100%;max-width:280px;box-sizing:border-box" />`
60
+ },
61
+ {
62
+ name : 'Divider',
63
+ token: 'bd-divider-horizontal / --color-border-default',
64
+ what : 'A line separating adjacent regions of content. It bounds nothing.',
65
+ use : html`Between sections, rows or list items. Reach for
66
+ <code>bd-divider-horizontal</code> when the line is a separator in its own right.`,
67
+ avoid: html`To outline an object. A border that goes all the way round is a boundary, not a
68
+ divider — see <i>Dividers are not borders</i> in the package README.`,
69
+ live: 'bd-divider-horizontal, CompatibilityTable row rules, Footer section rules, ProcessSteps step rules',
70
+ note: html`A divider names its line with a <b>border role</b>, not a text or surface role:
71
+ <code>borderColor()</code> in <code>shared/token-scales.js</code> maps the seven
72
+ names in <code>BORDER_ROLES</code> — default, subtle, strong, container, brand,
73
+ disabled and brand-subtle — and falls through to the colour scale for anything
74
+ else. <code>inverse</code> is deliberately not among them: the inverse border is
75
+ white at 12%, and a divider multiplies that by its own opacity prop, so the role
76
+ would arrive already halved.`,
77
+ demo: html`
78
+ <div>
79
+ <bd-p variant="small">One region.</bd-p>
80
+ <bd-divider-horizontal></bd-divider-horizontal>
81
+ <bd-p variant="small">The next region.</bd-p>
82
+ </div>`
83
+ },
84
+ {
85
+ name : 'Focus',
86
+ token: '--focus-outline-primary',
87
+ what : 'Keyboard focus indication. Never a border role.',
88
+ use : html`Always through the focus system. The ring is a <code>box-shadow</code>, so it
89
+ follows the element's own corner and changes no layout; its radius comes from
90
+ <code>--focus-outline-radius</code>.`,
91
+ avoid: html`Never express focus by swapping a border colour. A colour change alone is not a
92
+ focus indicator, and a border-width change moves the layout.`,
93
+ live: '33 declarations across the package, all one token',
94
+ demo: html`
95
+ <button style="padding:var(--spacing-12) var(--spacing-16);border:var(--border-width-1) solid var(--color-border-default);border-radius:var(--radius-md);background:var(--color-neutral-0);font:inherit;box-shadow:var(--focus-outline-primary)">
96
+ The ring, shown at rest
97
+ </button>`
98
+ },
99
+ {
100
+ name : 'Status',
101
+ token: '--status-*-border / --status-*-accent',
102
+ what : 'An edge carrying validation, state or tone.',
103
+ use : html`<code>-border</code> for a full hairline around a tinted chip;
104
+ <code>-accent</code> for the heavier rule that marks a message. Two roles, because
105
+ they are two jobs.`,
106
+ avoid: html`For decoration in a status colour. If the edge is not saying something about
107
+ state, it is one of the four responsibilities above.`,
108
+ live: 'bd-tag (all six tones, -border), bd-alert (four tones, -accent as a 4px rule), bd-input error and success states',
109
+ demo: html`
110
+ <div style="display:flex;gap:var(--spacing-8);flex-wrap:wrap">
111
+ <bd-tag tone="success">Success</bd-tag>
112
+ <bd-tag tone="warning">Warning</bd-tag>
113
+ <bd-tag tone="error">Error</bd-tag>
114
+ <bd-tag tone="info">Info</bd-tag>
115
+ </div>`
116
+ }
117
+ ];
118
+
119
+ const block = r => html`
120
+ <div style="padding:var(--spacing-24) 0;border-top:var(--border-width-1) solid var(--color-border-container)">
121
+ <p style="margin:0 0 var(--spacing-8);font-family:var(--typography-fontFamily-mono);font-size:var(--typography-fontSize-xs);color:var(--color-text-muted)">
122
+ <b style="color:var(--color-text-primary)">${r.name}</b> · <code>${r.token}</code>
123
+ </p>
124
+ <p style="margin:0 0 var(--spacing-16);color:var(--color-text-secondary);max-width:70ch">${r.what}</p>
125
+ <div style="background:var(--color-surface-muted);padding:var(--spacing-24);border-radius:var(--radius-lg);margin-bottom:var(--spacing-16)">
126
+ ${r.demo}
127
+ </div>
128
+ <p style="margin:0 0 var(--spacing-4);font-size:var(--typography-fontSize-sm);max-width:70ch"><b>Use it</b> ${r.use}</p>
129
+ <p style="margin:0 0 var(--spacing-4);font-size:var(--typography-fontSize-sm);max-width:70ch"><b>Do not</b> ${r.avoid}</p>
130
+ <p style="margin:0;font-size:var(--typography-fontSize-sm);color:var(--color-text-muted);max-width:70ch"><b>Today:</b> ${r.live}</p>
131
+ ${r.note
132
+ ? html`<p style="margin:var(--spacing-8) 0 0;font-size:var(--typography-fontSize-sm);color:var(--color-text-secondary);max-width:70ch"><b>Note</b> ${r.note}</p>`
133
+ : ''}
134
+ </div>`;
135
+
136
+ export const Borders = () =>
137
+ docsPage({
138
+ title: 'Borders',
139
+ lede : `Five things a line around something can mean. Foundations/Shape covers how wide a
140
+ border is and how round its corners are; this page is about which of the five it is,
141
+ because that is the question the token name answers and the colour value does not.`,
142
+ note: html`<b>Do not choose a border token because its numeric colour is closest to what
143
+ you see.</b> Choose the token whose responsibility matches the edge. Two declarations
144
+ that resolve to the same neutral are not the same role, and a role's value is what it
145
+ happens to be today — not what it means. This is the same rule the surface roles
146
+ carry, and it is here for the same reason: eight components chose
147
+ <code>--color-neutral-100</code> by eye because no role named what they were drawing.`,
148
+ children: html`
149
+ ${refSection({
150
+ name : 'The five responsibilities',
151
+ meta : `${RESPONSIBILITIES.length} roles`,
152
+ children: html`
153
+ <p style="max-width:70ch">
154
+ Ask what the line is doing before asking what it looks like. If you cannot tell
155
+ whether it is a boundary or a divider, ask whether deleting it would leave the thing
156
+ it touches still looking like one object: a boundary holds an object together, a
157
+ divider keeps two apart.
158
+ </p>
159
+ ${RESPONSIBILITIES.map(block)}`
160
+ })}
161
+
162
+ ${refSection({
163
+ name : 'The hairline says how, not whether',
164
+ meta : 'a distinction worth keeping',
165
+ children: html`
166
+ <p style="border-left:var(--border-width-4) solid var(--color-border-brand);padding-left:var(--spacing-16);max-width:70ch">
167
+ <b><code>--color-border-container</code> defines how a low-emphasis content boundary
168
+ is rendered. It does not decide whether a component should have a border.</b>
169
+ </p>
170
+ <p style="max-width:70ch">
171
+ That stays a component-level design decision, and the measurements say the components
172
+ genuinely disagree rather than drift. Six cards on
173
+ <code>--color-surface-container</code> carry no border; Bento carries 1px and the
174
+ Carousel item 2px on the same surface. The obvious explanation does not survive
175
+ contact with the numbers: the unbordered cards sit at <b>1.044:1</b> against their
176
+ backdrop and the bordered ones at <b>1.080:1</b>, so the bordered cards are the
177
+ <i>higher</i>-contrast group. Border presence does not track backdrop contrast, and it
178
+ does not track interactivity either — the Carousel item is draggable and opens a
179
+ modal, and Bento is inert.
180
+ </p>
181
+ <p style="max-width:70ch">
182
+ So there is no card-border token and no rule that cards must or must not have one.
183
+ When a component decides it wants a low-emphasis boundary, this is the role for it.
184
+ </p>`
185
+ })}
186
+
187
+ ${refSection({
188
+ name : 'Measured, on light and on dark',
189
+ meta : 'computed from the tokens as this page renders',
190
+ children: html`
191
+ <div class="table-scroll">
192
+ <table>
193
+ <caption>
194
+ Border roles against the surfaces they are used on. Only the two that bound a live
195
+ control clear the 3:1 WCAG 1.4.11 asks of a UI component, and the rest sit below
196
+ it deliberately.
197
+ </caption>
198
+ <thead>
199
+ <tr>
200
+ <th scope="col">Role</th>
201
+ <th scope="col">Responsibility</th>
202
+ <th scope="col">On surface-default</th>
203
+ <th scope="col">On surface-container</th>
204
+ </tr>
205
+ </thead>
206
+ <tbody>
207
+ ${[
208
+ ['--color-border-container', 'content boundary'],
209
+ ['--color-border-subtle', 'hairline between things that belong together'],
210
+ ['--color-border-disabled', 'exempt under WCAG 1.4.3'],
211
+ ['--color-border-default', 'control edge'],
212
+ ['--color-border-brand', 'control edge, brand'],
213
+ ['--color-border-strong', 'the heaviest neutral edge']
214
+ ].map(([t, why]) => html`
215
+ <tr>
216
+ <td><code>${t.replace('--color-border-', '')}</code></td>
217
+ <td>${why}</td>
218
+ <td class="num">${ratio(t, '--color-surface-default') ?? '—'}</td>
219
+ <td class="num">${ratio(t, '--color-surface-container') ?? '—'}</td>
220
+ </tr>`)}
221
+ </tbody>
222
+ </table>
223
+ </div>
224
+ <h3 style="font-size:var(--typography-fontSize-base);margin:var(--spacing-32) 0 var(--spacing-8)">
225
+ The same responsibility, on an inverse surface
226
+ </h3>
227
+ <p style="max-width:70ch">
228
+ <code>--color-border-container-inverse</code> is not a second role. It is the same
229
+ boundary on <code>--color-surface-inverse</code>, the way
230
+ <code>--color-text-inverse</code> is the same ink — and it exists because no neutral
231
+ border role can be quiet on a dark ground:
232
+ <code>--color-border-subtle</code> renders at <b>10.8:1</b> there, where the boundary
233
+ wants <b>1.42:1</b>. It is written as a proportion of
234
+ <code>--color-neutral-0</code> rather than a raw rgba, so the value stays traceable to
235
+ a token.
236
+ </p>
237
+ <div style="display:grid;gap:var(--spacing-16);grid-template-columns:repeat(auto-fit,minmax(220px,1fr));max-width:60ch">
238
+ <div>
239
+ <p style="margin:0 0 var(--spacing-8);font-family:var(--typography-fontFamily-mono);font-size:var(--typography-fontSize-xs);color:var(--color-text-muted)">
240
+ on --color-surface-default
241
+ </p>
242
+ ${swatch('--color-border-container', '--color-surface-default')}
243
+ </div>
244
+ <div>
245
+ <p style="margin:0 0 var(--spacing-8);font-family:var(--typography-fontFamily-mono);font-size:var(--typography-fontSize-xs);color:var(--color-text-muted)">
246
+ on --color-surface-inverse
247
+ </p>
248
+ ${swatch('--color-border-container-inverse', '--color-surface-inverse')}
249
+ </div>
250
+ </div>`
251
+ })}
252
+
253
+ ${refSection({
254
+ name : 'Three comparisons that decide the token',
255
+ meta : 'boundary vs edge, border vs divider, focus vs border',
256
+ children: html`
257
+ <h3 style="font-size:var(--typography-fontSize-base);margin:0 0 var(--spacing-8)">
258
+ Content boundary vs control edge
259
+ </h3>
260
+ <p style="max-width:70ch">
261
+ The same 1px line, twice. The left one describes an object; the right one describes
262
+ something you can operate, and clears 3:1 so that claim is legible. Choosing the
263
+ quieter one for a control is the error the token comment warns about.
264
+ </p>
265
+ <div style="display:grid;gap:var(--spacing-16);grid-template-columns:repeat(auto-fit,minmax(200px,1fr));max-width:60ch;margin-bottom:var(--spacing-32)">
266
+ <div style="padding:var(--spacing-16);border:var(--border-width-1) solid var(--color-border-container);border-radius:var(--radius-2xl)">
267
+ <bd-p variant="small">Content boundary — an object.</bd-p>
268
+ </div>
269
+ <div style="padding:var(--spacing-16);border:var(--border-width-1) solid var(--color-border-default);border-radius:var(--radius-md)">
270
+ <bd-p variant="small">Control edge — operable.</bd-p>
271
+ </div>
272
+ </div>
273
+
274
+ <h3 style="font-size:var(--typography-fontSize-base);margin:0 0 var(--spacing-8)">
275
+ Border vs divider
276
+ </h3>
277
+ <p style="max-width:70ch">
278
+ A border goes round and holds one thing together. A divider goes across and keeps two
279
+ things apart. A <code>border-top</code> that participates in a grid row is a boundary;
280
+ a line between two regions is <code>bd-divider-horizontal</code>. Do not convert one
281
+ into the other for the sake of reuse.
282
+ </p>
283
+ <div style="max-width:44ch;margin-bottom:var(--spacing-32)">
284
+ <div style="padding:var(--spacing-16);border:var(--border-width-1) solid var(--color-border-container);border-radius:var(--radius-2xl)">
285
+ <bd-p variant="small">Bounded object.</bd-p>
286
+ <bd-divider-horizontal></bd-divider-horizontal>
287
+ <bd-p variant="small">Two regions inside it, divided.</bd-p>
288
+ </div>
289
+ </div>
290
+
291
+ <h3 style="font-size:var(--typography-fontSize-base);margin:0 0 var(--spacing-8)">
292
+ Focus vs border
293
+ </h3>
294
+ <p style="max-width:70ch">
295
+ Focus is never a border role. The ring is a <code>box-shadow</code> drawn outside the
296
+ box, so it adds no width and moves no layout — measured across the package, no state
297
+ in any component changes a border width. A focus treatment that recoloured a border
298
+ would be invisible to anyone who cannot see the difference, and would fight whatever
299
+ the border was already saying.
300
+ </p>`
301
+ })}
302
+
303
+ ${refSection({
304
+ name : 'Legitimate exceptions',
305
+ meta : 'recorded, not tolerated',
306
+ children: html`
307
+ <ul style="max-width:70ch">
308
+ <li>
309
+ <b>Pricing Cards</b> used to keep a private <code>--border-card-grey</code> alias
310
+ at <code>--color-neutral-50</code>, and no longer do. The cards now sit on
311
+ <code>--color-surface-default</code> over a brand-tinted band and draw
312
+ <code>--border-width-1 solid --color-border-container</code>, which is the
313
+ tinted-section half of the ground-and-edge rule rather than an exception to it.
314
+ The private alias measured 1.07:1 against the card it bounded. The component's
315
+ architecture is still frozen by product decision; the edge was a colour, not
316
+ architecture.
317
+ </li>
318
+ <li>
319
+ <b>bd-button's outlined variants</b> draw their edge with an inset
320
+ <code>box-shadow</code> rather than a border, so the box does not change size
321
+ between states. That is the reason nothing in the package shifts on hover or focus.
322
+ </li>
323
+ <li>
324
+ <b>The AwardsFlex dot</b> keeps <code>--radius-full</code> on its focus ring: a
325
+ circular control needs a circular ring.
326
+ </li>
327
+ <li>
328
+ <b>Two on-dark dividers</b> — Terminal's separator line and ProcessSteps' step rule
329
+ — still carry a raw white alpha. They are the divider responsibility rather than the
330
+ boundary one, and DIVIDER has no inverse role yet.
331
+ </li>
332
+ <li>
333
+ <b><code>border: 0</code> in screen-reader-only helpers</b> is a clipping technique,
334
+ not a radius or a boundary decision, and is left alone by every rule here.
335
+ </li>
336
+ </ul>`
337
+ })}
338
+ `
339
+ });