@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.
- package/CHANGELOG.md +204 -0
- package/README.md +131 -8
- package/package.json +96 -13
- package/schemas/component-manifest.json +3294 -405
- package/schemas/manifest-omissions.json +173 -0
- package/src/blog/src/breakpoints.js +6 -6
- package/src/blog/src/content/blog-atoms-showcase.js +1 -1
- package/src/blog/src/content/blog-page-layout.js +2 -2
- package/src/blog/src/lib/article-toc.js +7 -7
- package/src/blog/src/shell/blog-shell.js +1 -1
- package/src/blog/src/tokens/blog.js +2 -2
- package/src/blog/src/tokens/core.js +34 -35
- package/src/blog/src/tokens/legacy.js +0 -9
- package/src/blog/tokens/blog.js +2 -2
- package/src/blog/tokens/core.js +34 -35
- package/src/blog/tokens/legacy.js +0 -9
- package/src/blog/tokens.css +36 -46
- package/src/components/accordion/accordion-bg.css.js +83 -59
- package/src/components/accordion/accordion-bg.js +29 -10
- package/src/components/accordion/accordion-bg.stories.js +67 -67
- package/src/components/accordion/accordion-keyboard.js +80 -0
- package/src/components/accordion/accordion.css.js +142 -80
- package/src/components/accordion/accordion.js +37 -10
- package/src/components/accordion/accordion.stories.js +7 -7
- package/src/components/agent-endpoints/agent-endpoints.css.js +36 -39
- package/src/components/agent-endpoints/agent-endpoints.js +30 -20
- package/src/components/agent-endpoints/agent-endpoints.stories.js +1 -1
- package/src/components/ai-guardian-demo.stories.js +91 -91
- package/src/components/alert/alert.css.js +198 -0
- package/src/components/alert/alert.js +103 -0
- package/src/components/alert/alert.stories.js +206 -0
- package/src/components/anchor/anchor-nav.css.js +213 -101
- package/src/components/anchor/anchor-nav.js +26 -40
- package/src/components/anchor/anchor.stories.js +22 -12
- package/src/components/annotation/annotation.css.js +58 -0
- package/src/components/annotation/annotation.js +67 -0
- package/src/components/annotation/annotation.stories.js +63 -0
- package/src/components/architecture.stories.js +285 -0
- package/src/components/atoms.stories.js +342 -0
- package/src/components/avatar/avatar.css.js +67 -0
- package/src/components/avatar/avatar.js +42 -0
- package/src/components/avatar/avatar.stories.js +95 -0
- package/src/components/awards/awards-flex.css.js +209 -23
- package/src/components/awards/awards-flex.js +66 -7
- package/src/components/awards/awards-flex.stories.js +1 -1
- package/src/components/awards/{awards-light.stories.js → awards-summary.stories.js} +54 -64
- package/src/components/awards/awards.css.js +116 -58
- package/src/components/awards/awards.js +102 -28
- package/src/components/awards/awards.stories.js +1 -1
- package/src/components/back/back.css.js +51 -22
- package/src/components/back/back.js +28 -7
- package/src/components/back/back.stories.js +9 -3
- package/src/components/badge/badge.css.js +158 -46
- package/src/components/badge/badge.js +62 -74
- package/src/components/badge/badge.stories.js +176 -248
- package/src/components/bento-grid/bento-grid.css.js +21 -16
- package/src/components/bento-grid/bento-grid.js +16 -4
- package/src/components/bento-grid/bento-grid.stories.js +19 -18
- package/src/components/bento-grid/bento-item.css.js +52 -28
- package/src/components/bento-grid/bento-item.js +2 -2
- package/src/components/blockquote/blockquote.css.js +47 -0
- package/src/components/blockquote/blockquote.js +29 -0
- package/src/components/blockquote/blockquote.stories.js +62 -0
- package/src/components/breadcrumb/breadcrumb.css.js +92 -22
- package/src/components/breadcrumb/breadcrumb.js +56 -11
- package/src/components/button/button.css.js +531 -161
- package/src/components/button/button.js +206 -214
- package/src/components/button/button.stories.js +322 -174
- package/src/components/caption/caption.css.js +21 -0
- package/src/components/caption/caption.js +31 -0
- package/src/components/caption/caption.stories.js +62 -0
- package/src/components/card-features/card-features.css.js +14 -22
- package/src/components/card-features/card-features.js +68 -9
- package/src/components/card-features/card-features.stories.js +11 -11
- package/src/components/cards/card.css.js +60 -81
- package/src/components/cards/card.js +56 -25
- package/src/components/cards/card.stories.js +39 -39
- package/src/components/carousel/carousel.css.js +93 -99
- package/src/components/carousel/carousel.js +32 -4
- package/src/components/checkbox/checkbox.css.js +111 -93
- package/src/components/checkbox/checkbox.js +64 -90
- package/src/components/checkbox/checkbox.stories.js +96 -29
- package/src/components/code/code.css.js +70 -0
- package/src/components/code/code.js +40 -0
- package/src/components/code/code.stories.js +73 -0
- package/src/components/compare/compare.css.js +179 -43
- package/src/components/compare/compare.js +52 -25
- package/src/components/compare/compare.stories.js +61 -4
- package/src/components/comparison-panel/comparison-panel.css.js +38 -51
- package/src/components/comparison-panel/comparison-panel.js +5 -4
- package/src/components/comparison-panel/comparison-panel.stories.js +1 -1
- package/src/components/compatibility-table/compatibility-table.css.js +180 -80
- package/src/components/compatibility-table/compatibility-table.js +37 -9
- package/src/components/control-alignment.stories.js +393 -0
- package/src/components/cta-banner/cta-banner.css.js +41 -13
- package/src/components/cta-banner/cta-banner.js +6 -5
- package/src/components/cta-banner/cta-banner.stories.js +43 -98
- package/src/components/display/display.css.js +25 -1
- package/src/components/display/display.js +46 -13
- package/src/components/display/display.stories.js +270 -40
- package/src/components/divider/divider-horizontal.js +21 -5
- package/src/components/divider/divider-vertical.js +15 -7
- package/src/components/divider/divider.css.js +2 -2
- package/src/components/divider/divider.stories.js +38 -34
- package/src/components/dropdown/dropdown.css.js +93 -126
- package/src/components/dropdown/dropdown.js +114 -34
- package/src/components/dropdown/dropdown.stories.js +56 -24
- package/src/components/features/features.css.js +24 -11
- package/src/components/features/features.js +7 -3
- package/src/components/features/features.stories.js +37 -37
- package/src/components/features-tab/features-tab.css.js +19 -8
- package/src/components/features-tab/features-tab.js +6 -5
- package/src/components/features-tab/features-tab.stories.js +23 -23
- package/src/components/fieldset/fieldset.css.js +30 -0
- package/src/components/fieldset/fieldset.js +28 -0
- package/src/components/fieldset/fieldset.stories.js +84 -0
- package/src/components/footer/footer-links-group.css.js +10 -14
- package/src/components/footer/footer-links-group.js +4 -3
- package/src/components/footer/footer-lp.css.js +59 -30
- package/src/components/footer/footer-lp.js +17 -12
- package/src/components/footer/footer-lp.stories.js +63 -75
- package/src/components/footer/footer-nav-menu.css.js +26 -4
- package/src/components/footer/footer-nav-menu.js +3 -2
- package/src/components/footer/footer.css.js +146 -264
- package/src/components/footer/footer.js +176 -106
- package/src/components/footer/footer.stories.js +9 -9
- package/src/components/footer/localeMap.js +1 -1
- package/src/components/grid/grid.css.js +1 -1
- package/src/components/grid/grid.js +49 -7
- package/src/components/grid/grid.stories.js +111 -0
- package/src/components/header/header-code.css.js +61 -51
- package/src/components/header/header-code.js +28 -14
- package/src/components/header/header-code.stories.js +5 -5
- package/src/components/header/header.css.js +655 -176
- package/src/components/header/header.js +269 -36
- package/src/components/header/header.stories.js +841 -18
- package/src/components/heading/heading.css.js +14 -17
- package/src/components/heading/heading.js +48 -33
- package/src/components/heading/heading.stories.js +27 -25
- package/src/components/help-text/help-text.css.js +21 -0
- package/src/components/help-text/help-text.js +25 -0
- package/src/components/help-text/help-text.stories.js +66 -0
- package/src/components/highlight/highlight.css.js +86 -64
- package/src/components/highlight/highlight.js +18 -27
- package/src/components/highlight/highlight.stories.js +14 -3
- package/src/components/icons/analysis-icon.js +6 -16
- package/src/components/icons/arrow-down-icon.js +6 -19
- package/src/components/icons/arrow-icon.js +44 -0
- package/src/components/icons/arrow-right-icon.js +30 -23
- package/src/components/icons/arrow-up-icon.js +19 -18
- package/src/components/icons/bd-ai-icon.js +1 -1
- package/src/components/icons/brand-marks.stories.js +279 -0
- package/src/components/icons/brand-signature-icon.js +42 -0
- package/src/components/icons/check-icon.js +27 -0
- package/src/components/icons/circle-info-icon.js +33 -0
- package/src/components/icons/close-icon.js +6 -18
- package/src/components/icons/family-icon.js +8 -20
- package/src/components/icons/globe-icon.js +6 -18
- package/src/components/icons/guide-icon.js +6 -18
- package/src/components/icons/icon-element.js +99 -0
- package/src/components/icons/icons.js +36 -0
- package/src/components/icons/icons.stories.js +184 -52
- package/src/components/icons/individual-icon.js +6 -18
- package/src/components/icons/laurel-icon.js +9 -19
- package/src/components/icons/machine-learning-icon.js +6 -17
- package/src/components/icons/marks.js +41 -0
- package/src/components/icons/minus-icon.js +7 -21
- package/src/components/icons/missing-icon.js +52 -0
- package/src/components/icons/plus-icon.js +7 -21
- package/src/components/icons/quote-icon.js +19 -19
- package/src/components/image/image.css.js +72 -25
- package/src/components/image/image.js +11 -6
- package/src/components/image/image.stories.js +2 -2
- package/src/components/input/custom-form.stories.js +214 -62
- package/src/components/input/input-clipboard.css.js +51 -144
- package/src/components/input/input-clipboard.js +31 -15
- package/src/components/input/input.css.js +8 -146
- package/src/components/input/input.js +93 -38
- package/src/components/install-options/install-options.css.js +84 -77
- package/src/components/install-options/install-options.js +33 -30
- package/src/components/install-options/install-options.stories.js +3 -3
- package/src/components/label/label.css.js +35 -0
- package/src/components/label/label.js +38 -0
- package/src/components/label/label.stories.js +82 -0
- package/src/components/light-carousel/light-carousel.css.js +111 -63
- package/src/components/light-carousel/light-carousel.js +85 -11
- package/src/components/light-carousel/light-carousel.stories.js +126 -82
- package/src/components/link/link.css.js +150 -99
- package/src/components/link/link.js +86 -11
- package/src/components/link/link.stories.js +124 -30
- package/src/components/list/list-item/list-item.css.js +74 -22
- package/src/components/list/list-item/list-item.js +32 -10
- package/src/components/list/list-item/list-item.stories.js +23 -23
- package/src/components/list/list.css.js +8 -2
- package/src/components/list/list.js +3 -2
- package/src/components/list/list.stories.js +222 -0
- package/src/components/modal/modal.css.js +114 -24
- package/src/components/modal/modal.js +83 -7
- package/src/components/modal/modal.stories.js +9 -9
- package/src/components/overview/overview.css.js +19 -14
- package/src/components/overview/overview.js +6 -5
- package/src/components/overview/overview.stories.js +10 -10
- package/src/components/page-switcher/page-switcher.css.js +97 -40
- package/src/components/page-switcher/page-switcher.js +28 -5
- package/src/components/page-switcher/page-switcher.stories.js +95 -0
- package/src/components/paragraph/paragraph.css.js +15 -10
- package/src/components/paragraph/paragraph.js +41 -44
- package/src/components/paragraph/paragraph.stories.js +56 -21
- package/src/components/picture/picture.css.js +103 -44
- package/src/components/picture/picture.js +100 -30
- package/src/components/picture/picture.stories.js +1 -1
- package/src/components/pricing-cards/new-pricing-card.js +3 -3
- package/src/components/pricing-cards/new-pricing.css.js +24 -15
- package/src/components/pricing-cards/pricing-card-actions.css.js +1 -1
- package/src/components/pricing-cards/pricing-card-actions.js +3 -4
- package/src/components/pricing-cards/pricing-card-container.css.js +3 -3
- package/src/components/pricing-cards/pricing-card-container.js +3 -2
- package/src/components/pricing-cards/pricing-card-header.css.js +10 -8
- package/src/components/pricing-cards/pricing-card-header.js +6 -7
- package/src/components/pricing-cards/pricing-card-pricing.css.js +16 -9
- package/src/components/pricing-cards/pricing-card-pricing.js +8 -6
- package/src/components/pricing-cards/pricing-card-show-more.css.js +11 -3
- package/src/components/pricing-cards/pricing-card-show-more.js +8 -3
- package/src/components/pricing-cards/pricing-card.css.js +244 -190
- package/src/components/pricing-cards/pricing-card.js +54 -70
- package/src/components/pricing-cards/pricing-feature-item.css.js +25 -8
- package/src/components/pricing-cards/pricing-feature-item.js +8 -3
- package/src/components/process-steps/process-steps.css.js +26 -14
- package/src/components/process-steps/process-steps.js +23 -6
- package/src/components/process-steps/process-steps.stories.js +1 -1
- package/src/components/progress/progress.css.js +80 -0
- package/src/components/progress/progress.js +42 -0
- package/src/components/progress/progress.stories.js +79 -0
- package/src/components/quick-answer/quick-answer.css.js +75 -13
- package/src/components/quick-answer/quick-answer.js +8 -3
- package/src/components/radio/radio.css.js +92 -128
- package/src/components/radio/radio.js +106 -127
- package/src/components/radio/radio.stories.js +54 -19
- package/src/components/review/review-grid.css.js +5 -6
- package/src/components/review/review-grid.js +14 -11
- package/src/components/review/review.css.js +11 -6
- package/src/components/review/review.js +3 -8
- package/src/components/shared/ensemble.css.js +93 -0
- package/src/components/shared/form-field.css.js +206 -0
- package/src/components/shared/prop-vocabulary.js +48 -0
- package/src/components/shared/token-scales.js +306 -0
- package/src/components/skeleton/skeleton.css.js +34 -0
- package/src/components/skeleton/skeleton.js +32 -0
- package/src/components/skeleton/skeleton.stories.js +70 -0
- package/src/components/spinner/spinner.css.js +62 -0
- package/src/components/spinner/spinner.js +38 -0
- package/src/components/spinner/spinner.stories.js +92 -0
- package/src/components/spotlight-section/spotlight-section.css.js +14 -13
- package/src/components/spotlight-section/spotlight-section.js +42 -39
- package/src/components/switch/switch.css.js +103 -0
- package/src/components/switch/switch.js +44 -0
- package/src/components/switch/switch.stories.js +86 -0
- package/src/components/tab-list/content-switcher.stories.js +189 -0
- package/src/components/tab-list/tab-list.css.js +250 -0
- package/src/components/tab-list/tab-list.js +184 -0
- package/src/components/tab-list/tab-list.stories.js +221 -0
- package/src/components/tabs/tabs.css.js +14 -123
- package/src/components/tabs/tabs.js +16 -19
- package/src/components/tabs/tabs.stories.js +95 -95
- package/src/components/tag/tag.css.js +54 -0
- package/src/components/tag/tag.js +32 -0
- package/src/components/tag/tag.stories.js +126 -0
- package/src/components/terminal/terminal-message.css.js +164 -60
- package/src/components/terminal/terminal-message.js +5 -5
- package/src/components/terminal/terminal-message.stories.js +70 -1
- package/src/components/termsOfUse/terms.css.js +25 -20
- package/src/components/termsOfUse/terms.js +13 -9
- package/src/components/termsOfUse/terms.stories.js +1 -1
- package/src/components/textarea/textarea.css.js +51 -0
- package/src/components/textarea/textarea.js +136 -0
- package/src/components/textarea/textarea.stories.js +191 -0
- package/src/components/tooltip/tooltip.css.js +75 -0
- package/src/components/tooltip/tooltip.js +156 -0
- package/src/components/tooltip/tooltip.stories.js +161 -0
- package/src/components/trust-panel/trust-panel.css.js +85 -33
- package/src/components/trust-panel/trust-panel.js +18 -10
- package/src/components/trust-panel/trust-panel.stories.js +1 -1
- package/src/components/ultimate-security-demo.stories.js +431 -0
- package/src/components/video/video.css.js +17 -0
- package/src/components/video/video.js +40 -0
- package/src/components/video/video.stories.js +106 -0
- package/src/components/video-player/video-player.css.js +67 -11
- package/src/components/video-player/video-player.js +35 -4
- package/src/components/video-player/video-player.stories.js +1 -1
- package/src/components/visual-alignment.stories.js +411 -0
- package/src/components/visually-hidden/visually-hidden.css.js +24 -0
- package/src/components/visually-hidden/visually-hidden.js +16 -0
- package/src/components/visually-hidden/visually-hidden.stories.js +56 -0
- package/src/stories/Button.stories.js +17 -17
- package/src/stories/Header.stories.js +10 -10
- package/src/stories/Page.js +1 -1
- package/src/stories/Page.stories.js +6 -6
- package/src/tokens/borders.stories.js +339 -0
- package/src/tokens/color-responsibilities.stories.js +227 -0
- package/src/tokens/dark-derivation.js +309 -0
- package/src/tokens/dark-findings.js +197 -0
- package/src/tokens/dark-mode.stories.js +207 -0
- package/src/tokens/dimension.stories.js +251 -0
- package/src/tokens/elevation.stories.js +143 -0
- package/src/tokens/focus.stories.js +276 -0
- package/src/tokens/fonts.css +20 -20
- package/src/tokens/fonts.stories.js +354 -374
- package/src/tokens/layout.css +25 -11
- package/src/tokens/motion.stories.js +231 -0
- package/src/tokens/shape.stories.js +272 -0
- package/src/tokens/spacing-rhythm.stories.js +359 -0
- package/src/tokens/spacing.stories.js +208 -703
- package/src/tokens/story-chrome.js +503 -0
- package/src/tokens/surfaces.stories.js +224 -0
- package/src/tokens/text-on-surface.stories.js +164 -0
- package/src/tokens/token-map.js +220 -0
- package/src/tokens/token-map.stories.js +257 -0
- package/src/tokens/token-purposes.js +266 -0
- package/src/tokens/tokens-grid.stories.js +388 -900
- package/src/tokens/tokens.css +1633 -1045
- package/src/tokens/tokens.js +1130 -492
- package/src/tokens/tokens.stories.js +137 -47
- package/src/tokens/type-ceiling-words.js +299 -0
- package/src/tokens/typography.stories.js +1003 -965
- package/src/tokens/vertical-rhythm.stories.js +224 -0
- package/src/components/awards/awards-icon.js +0 -56
- package/src/components/awards/awards-light.js +0 -240
- package/src/components/banner/banner.js +0 -60
- package/src/components/banner/banner.stories.js +0 -51
- package/src/components/button/icons.js +0 -24
- package/src/components/input/index.js +0 -0
- package/src/components/light-carousel/light-carousel-simple.css.js +0 -183
- package/src/components/light-carousel/light-carousel-simple.js +0 -74
- package/src/tokens/colors.js +0 -121
- package/src/tokens/typography.css.js +0 -207
- 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 = {};
|
package/src/stories/Page.js
CHANGED
|
@@ -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
|
+
});
|