baseline-foundry 0.1.3 → 0.1.4

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 (43) hide show
  1. package/README.md +568 -552
  2. package/config/experiments/ibm-plex-engine-smoke.json +115 -115
  3. package/config/experiments/ubuntu-engine-smoke.json +115 -115
  4. package/config/foundation-theme.json +110 -110
  5. package/config/tiers/app.json +116 -116
  6. package/config/tiers/documentation.json +116 -116
  7. package/config/tiers/editorial.json +116 -116
  8. package/config/tiers/os.json +116 -116
  9. package/dist/baseline-grid-overlay.js +43 -43
  10. package/dist/css-app-tier.js +73 -73
  11. package/dist/css-components/article-pagination.js +140 -140
  12. package/dist/css-components/button-actions.js +161 -161
  13. package/dist/css-components/cards-options.js +176 -176
  14. package/dist/css-components/chip-badge-status.js +158 -158
  15. package/dist/css-components/content-card.js +490 -490
  16. package/dist/css-components/control-row.js +14 -14
  17. package/dist/css-components/cta-figure-aspect.js +120 -120
  18. package/dist/css-components/document-navigation.js +390 -390
  19. package/dist/css-components/editorial-content.js +42 -42
  20. package/dist/css-components/icon.js +72 -72
  21. package/dist/css-components/interactive-feedback.js +217 -217
  22. package/dist/css-components/interactive-tables.js +155 -155
  23. package/dist/css-components/legacy-navigation.d.ts +9 -0
  24. package/dist/css-components/legacy-navigation.js +763 -0
  25. package/dist/css-components/linked-logo-site-layout.js +177 -177
  26. package/dist/css-components/list-tree.js +94 -94
  27. package/dist/css-components/logo-media.js +201 -201
  28. package/dist/css-components/navigation-layout.js +144 -144
  29. package/dist/css-components/panel.js +144 -144
  30. package/dist/css-components/search-box-and-filter.js +263 -263
  31. package/dist/css-components/sites-editorial-ports.js +243 -243
  32. package/dist/css-components/sites-foundation.js +146 -146
  33. package/dist/css-components/sites-rich-lists.js +344 -344
  34. package/dist/css-components/static-content-ports.js +182 -182
  35. package/dist/css-components/tab-section.js +82 -82
  36. package/dist/css-components/table.js +75 -75
  37. package/dist/css-components/tabs-choice-breadcrumbs.js +303 -303
  38. package/dist/css-components/tiered-list-equal-height-row.js +271 -271
  39. package/dist/css-components.js +1791 -2542
  40. package/dist/css-grid.js +172 -172
  41. package/dist/css.js +240 -240
  42. package/docs/publishing.md +30 -13
  43. package/package.json +119 -108
@@ -7,145 +7,145 @@
7
7
  */
8
8
  export function articlePaginationCss(options) {
9
9
  const { bodyCaseTypeStyles, titleTypeStyles } = options;
10
- return `:where(.bf-theme) :where(.bf-article-pagination) {
11
- container-name: bf-article-pagination;
12
- container-type: inline-size;
13
- display: grid;
14
- grid-template-columns: auto minmax(0, 1fr);
15
- margin-block-end: var(--bf-section-space-shallow);
16
- min-inline-size: 0;
17
- }
18
-
19
- :where(.bf-theme) :where(.bf-article-pagination-link) {
20
- background-color: var(--bf-color-background-default);
21
- border: var(--bf-border-width) solid transparent;
22
- box-sizing: border-box;
23
- color: var(--bf-color-text-default);
24
- display: grid;
25
- column-gap: var(--bf-space-2);
26
- grid-template-rows: auto auto;
27
- inline-size: calc((100cqi - var(--bf-space-2)) / 2);
28
- min-inline-size: 0;
29
- padding-block: calc(var(--bf-space-2) + (var(--bf-baseline) / 4) - var(--bf-border-width));
30
- position: relative;
31
- row-gap: var(--bf-space-half);
32
- text-decoration: none;
33
- }
34
-
35
- :where(.bf-theme) :where(.bf-article-pagination-link:hover) {
36
- background-color: var(--bf-color-background-hover);
37
- }
38
-
39
- :where(.bf-theme) :where(.bf-article-pagination-link:focus:not(:focus-visible)) {
40
- outline: none;
41
- }
42
-
43
- :where(.bf-theme) :where(.bf-article-pagination-link:focus-visible) {
44
- outline: 2px solid var(--bf-color-focus);
45
- outline-offset: 2px;
46
- }
47
-
48
- :where(.bf-theme) :where(.bf-article-pagination-link.is-previous) {
49
- grid-column: 1;
50
- grid-template-columns: var(--bf-icon-size-default) minmax(0, 1fr);
51
- padding-inline: var(--bf-space-1) var(--bf-space-2);
52
- text-align: start;
53
- }
54
-
55
- :where(.bf-theme) :where(.bf-article-pagination-link.is-next) {
56
- grid-column: 2;
57
- grid-template-columns: minmax(0, 1fr) var(--bf-icon-size-default);
58
- justify-self: end;
59
- padding-inline: var(--bf-space-2) var(--bf-space-1);
60
- text-align: end;
61
- }
62
-
63
- :where(.bf-theme) :where(.bf-article-pagination-direction) {
64
- ${bodyCaseTypeStyles} color: inherit;
65
- display: contents;
66
- margin: 0;
67
- min-inline-size: 0;
68
- }
69
-
70
- :where(.bf-theme) :where(.bf-article-pagination-link.is-previous .bf-icon) {
71
- align-self: center;
72
- grid-column: 1;
73
- grid-row: 1;
74
- justify-self: start;
75
- }
76
-
77
- :where(.bf-theme) :where(.bf-article-pagination-link.is-previous .bf-article-pagination-label),
78
- :where(.bf-theme) :where(.bf-article-pagination-link.is-previous .bf-article-pagination-title) {
79
- grid-column: 2;
80
- }
81
-
82
- :where(.bf-theme) :where(.bf-article-pagination-link.is-next .bf-icon) {
83
- align-self: center;
84
- grid-column: 2;
85
- grid-row: 1;
86
- justify-self: end;
87
- }
88
-
89
- :where(.bf-theme) :where(.bf-article-pagination-link.is-next .bf-article-pagination-label),
90
- :where(.bf-theme) :where(.bf-article-pagination-link.is-next .bf-article-pagination-title) {
91
- grid-column: 1;
92
- }
93
-
94
- :where(.bf-theme) :where(.bf-article-pagination-direction > .bf-icon) {
95
- --bf-icon-size: var(--bf-icon-size-default);
96
- }
97
-
98
- :where(.bf-theme) .bf-article-pagination:dir(rtl) .bf-article-pagination-link.is-previous .bf-icon {
99
- --bf-icon-transform: rotate(-90deg);
100
- }
101
-
102
- :where(.bf-theme) .bf-article-pagination:dir(rtl) .bf-article-pagination-link.is-next .bf-icon {
103
- --bf-icon-transform: rotate(90deg);
104
- }
105
-
106
- :where(.bf-theme) :where(.bf-article-pagination-label) {
107
- grid-row: 1;
108
- min-inline-size: 0;
109
- overflow-wrap: anywhere;
110
- }
111
-
112
- :where(.bf-theme) :where(.bf-article-pagination-title) {
113
- ${titleTypeStyles} color: inherit;
114
- grid-row: 2;
115
- margin: 0;
116
- overflow-wrap: anywhere;
117
- }
118
-
119
- @container bf-article-pagination (width < 28.75rem) {
120
- :where(.bf-theme) :where(.bf-article-pagination-link:only-child) {
121
- grid-column: 1 / -1;
122
- inline-size: 100%;
123
- }
124
-
125
- :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child)) {
126
- grid-template-columns: var(--bf-icon-size-default);
127
- inline-size: calc(var(--bf-space-6) + var(--bf-space-1));
128
- padding-inline: var(--bf-space-1);
129
- }
130
-
131
- :where(.bf-theme) :where(.bf-article-pagination-link.is-next:not(:only-child)) {
132
- inline-size: 100%;
133
- }
134
-
135
- :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-label),
136
- :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-title) {
137
- block-size: 1px;
138
- border: 0;
139
- clip: rect(0 0 0 0);
140
- clip-path: inset(50%);
141
- inline-size: 1px;
142
- margin: -1px;
143
- overflow: hidden;
144
- padding: 0;
145
- position: absolute;
146
- white-space: nowrap;
147
- }
148
- }
149
-
10
+ return `:where(.bf-theme) :where(.bf-article-pagination) {
11
+ container-name: bf-article-pagination;
12
+ container-type: inline-size;
13
+ display: grid;
14
+ grid-template-columns: auto minmax(0, 1fr);
15
+ margin-block-end: var(--bf-section-space-shallow);
16
+ min-inline-size: 0;
17
+ }
18
+
19
+ :where(.bf-theme) :where(.bf-article-pagination-link) {
20
+ background-color: var(--bf-color-background-default);
21
+ border: var(--bf-border-width) solid transparent;
22
+ box-sizing: border-box;
23
+ color: var(--bf-color-text-default);
24
+ display: grid;
25
+ column-gap: var(--bf-space-2);
26
+ grid-template-rows: auto auto;
27
+ inline-size: calc((100cqi - var(--bf-space-2)) / 2);
28
+ min-inline-size: 0;
29
+ padding-block: calc(var(--bf-space-2) + (var(--bf-baseline) / 4) - var(--bf-border-width));
30
+ position: relative;
31
+ row-gap: var(--bf-space-half);
32
+ text-decoration: none;
33
+ }
34
+
35
+ :where(.bf-theme) :where(.bf-article-pagination-link:hover) {
36
+ background-color: var(--bf-color-background-hover);
37
+ }
38
+
39
+ :where(.bf-theme) :where(.bf-article-pagination-link:focus:not(:focus-visible)) {
40
+ outline: none;
41
+ }
42
+
43
+ :where(.bf-theme) :where(.bf-article-pagination-link:focus-visible) {
44
+ outline: 2px solid var(--bf-color-focus);
45
+ outline-offset: 2px;
46
+ }
47
+
48
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-previous) {
49
+ grid-column: 1;
50
+ grid-template-columns: var(--bf-icon-size-default) minmax(0, 1fr);
51
+ padding-inline: var(--bf-space-1) var(--bf-space-2);
52
+ text-align: start;
53
+ }
54
+
55
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-next) {
56
+ grid-column: 2;
57
+ grid-template-columns: minmax(0, 1fr) var(--bf-icon-size-default);
58
+ justify-self: end;
59
+ padding-inline: var(--bf-space-2) var(--bf-space-1);
60
+ text-align: end;
61
+ }
62
+
63
+ :where(.bf-theme) :where(.bf-article-pagination-direction) {
64
+ ${bodyCaseTypeStyles} color: inherit;
65
+ display: contents;
66
+ margin: 0;
67
+ min-inline-size: 0;
68
+ }
69
+
70
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-previous .bf-icon) {
71
+ align-self: center;
72
+ grid-column: 1;
73
+ grid-row: 1;
74
+ justify-self: start;
75
+ }
76
+
77
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-previous .bf-article-pagination-label),
78
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-previous .bf-article-pagination-title) {
79
+ grid-column: 2;
80
+ }
81
+
82
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-next .bf-icon) {
83
+ align-self: center;
84
+ grid-column: 2;
85
+ grid-row: 1;
86
+ justify-self: end;
87
+ }
88
+
89
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-next .bf-article-pagination-label),
90
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-next .bf-article-pagination-title) {
91
+ grid-column: 1;
92
+ }
93
+
94
+ :where(.bf-theme) :where(.bf-article-pagination-direction > .bf-icon) {
95
+ --bf-icon-size: var(--bf-icon-size-default);
96
+ }
97
+
98
+ :where(.bf-theme) .bf-article-pagination:dir(rtl) .bf-article-pagination-link.is-previous .bf-icon {
99
+ --bf-icon-transform: rotate(-90deg);
100
+ }
101
+
102
+ :where(.bf-theme) .bf-article-pagination:dir(rtl) .bf-article-pagination-link.is-next .bf-icon {
103
+ --bf-icon-transform: rotate(90deg);
104
+ }
105
+
106
+ :where(.bf-theme) :where(.bf-article-pagination-label) {
107
+ grid-row: 1;
108
+ min-inline-size: 0;
109
+ overflow-wrap: anywhere;
110
+ }
111
+
112
+ :where(.bf-theme) :where(.bf-article-pagination-title) {
113
+ ${titleTypeStyles} color: inherit;
114
+ grid-row: 2;
115
+ margin: 0;
116
+ overflow-wrap: anywhere;
117
+ }
118
+
119
+ @container bf-article-pagination (width < 28.75rem) {
120
+ :where(.bf-theme) :where(.bf-article-pagination-link:only-child) {
121
+ grid-column: 1 / -1;
122
+ inline-size: 100%;
123
+ }
124
+
125
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child)) {
126
+ grid-template-columns: var(--bf-icon-size-default);
127
+ inline-size: calc(var(--bf-space-6) + var(--bf-space-1));
128
+ padding-inline: var(--bf-space-1);
129
+ }
130
+
131
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-next:not(:only-child)) {
132
+ inline-size: 100%;
133
+ }
134
+
135
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-label),
136
+ :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-title) {
137
+ block-size: 1px;
138
+ border: 0;
139
+ clip: rect(0 0 0 0);
140
+ clip-path: inset(50%);
141
+ inline-size: 1px;
142
+ margin: -1px;
143
+ overflow: hidden;
144
+ padding: 0;
145
+ position: absolute;
146
+ white-space: nowrap;
147
+ }
148
+ }
149
+
150
150
  `;
151
151
  }
@@ -1,165 +1,165 @@
1
1
  export function buttonActionsCss(options) {
2
2
  const { bodyTypeStyles, buttonMarginBottom, buttonPadding } = options;
3
- return `:where(.bf-theme) :where(.bf-button, .bf-button.is-base) {
4
- ${bodyTypeStyles} appearance: none;
5
- background-color: var(--bf-color-background-default);
6
- border: var(--bf-border-width) solid var(--bf-color-border-high-contrast);
7
- border-radius: var(--bf-radius);
8
- color: var(--bf-color-text-default);
9
- cursor: pointer;
10
- display: inline-block;
11
- margin-bottom: ${buttonMarginBottom};
12
- ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
13
- text-align: center;
14
- text-decoration: none;
15
- }
16
-
17
- :where(.bf-theme) :where(.bf-button) {
18
- background-color: var(--bf-color-background-default);
19
- }
20
-
21
- :where(.bf-theme) :where(.bf-button.is-base) {
22
- background-color: transparent;
23
- border-color: transparent;
24
- }
25
-
26
- :where(.bf-theme) :where(.bf-button:hover, .bf-button.is-base:hover) {
27
- background-color: var(--bf-color-background-hover);
28
- }
29
-
30
- :where(.bf-theme) :where(.bf-button:not(.is-base):is(:active, [aria-pressed='true'])) {
31
- background-color: var(--bf-color-background-active);
32
- }
33
-
34
- :where(.bf-theme) :where(.bf-button, .bf-button.is-base):focus:not(:focus-visible) {
35
- outline: none;
36
- }
37
-
38
- :where(.bf-theme) :where(.bf-button, .bf-button.is-base):focus-visible {
39
- outline: 2px solid var(--bf-color-focus);
40
- outline-offset: 2px;
41
- }
42
-
43
- /* ------------------------------------------------------------------ */
44
- /* Button — semantic positive modifier (Vanilla parity). */
45
- /* Vanilla uses themed positive tokens for default/hover/active */
46
- /* backgrounds plus a white text colour on a coloured surface. */
47
- /* ------------------------------------------------------------------ */
48
-
49
- :where(.bf-theme) :where(.bf-button.is-positive) {
50
- background-color: var(--bf-color-button-positive-default);
51
- border-color: var(--bf-color-button-positive-default);
52
- color: var(--bf-color-button-positive-text);
53
- }
54
-
55
- :where(.bf-theme) :where(.bf-button.is-positive:hover) {
56
- background-color: var(--bf-color-button-positive-hover);
57
- border-color: var(--bf-color-button-positive-hover);
58
- color: var(--bf-color-button-positive-text);
59
- }
60
-
61
- :where(.bf-theme) :where(.bf-button.is-positive:is(:active, [aria-pressed='true'])) {
62
- background-color: var(--bf-color-button-positive-active);
63
- border-color: var(--bf-color-button-positive-active);
64
- color: var(--bf-color-button-positive-text);
65
- }
66
-
67
- /* ------------------------------------------------------------------ */
68
- /* Button — semantic negative modifier (Vanilla parity). */
69
- /* Vanilla uses themed negative tokens for default/hover/active */
70
- /* backgrounds plus a white text colour on a coloured surface. */
71
- /* ------------------------------------------------------------------ */
72
-
73
- :where(.bf-theme) :where(.bf-button.is-negative) {
74
- background-color: var(--bf-color-button-negative-default);
75
- border-color: var(--bf-color-button-negative-default);
76
- color: var(--bf-color-button-negative-text);
77
- }
78
-
79
- :where(.bf-theme) :where(.bf-button.is-negative:hover) {
80
- background-color: var(--bf-color-button-negative-hover);
81
- border-color: var(--bf-color-button-negative-hover);
82
- color: var(--bf-color-button-negative-text);
83
- }
84
-
85
- :where(.bf-theme) :where(.bf-button.is-negative:is(:active, [aria-pressed='true'])) {
86
- background-color: var(--bf-color-button-negative-active);
87
- border-color: var(--bf-color-button-negative-active);
88
- color: var(--bf-color-button-negative-text);
89
- }
90
-
91
- /* ------------------------------------------------------------------ */
92
- /* Button — link-style modifier (Vanilla parity). */
93
- /* BF starts from the shared button control contract, so the modifier */
94
- /* has to strip control chrome and padding back down to inline-link */
95
- /* behavior while reusing the shared link tokens. */
96
- /* ------------------------------------------------------------------ */
97
-
98
- :where(.bf-theme) :where(.bf-button.is-link) {
99
- background-color: transparent;
100
- border: 0;
101
- border-radius: 0;
102
- color: var(--bf-color-link-default);
103
- margin-bottom: 0;
104
- padding-block: 0;
105
- padding-inline: 0;
106
- }
107
-
108
- :where(.bf-theme) :where(.bf-button.is-link:hover) {
109
- background-color: transparent;
110
- color: var(--bf-color-link-default);
111
- text-decoration: underline;
112
- text-decoration-thickness: 1px;
113
- text-underline-offset: 0.075em;
114
- }
115
-
116
- :where(.bf-theme) :where(.bf-button.is-link:focus-visible) {
117
- outline-offset: 0;
118
- }
119
-
120
- /* ------------------------------------------------------------------ */
121
- /* Button — icon-spacing modifier (Vanilla parity). */
122
- /* Icon buttons make the icon/label relationship explicit. Bare text */
123
- /* nodes cannot be distinguished from icon-only buttons in CSS because */
124
- /* :first-child/:last-child ignore text nodes. A real label slot lets */
125
- /* the component use one truthful, token-driven gap in either order. */
126
- /* ------------------------------------------------------------------ */
127
-
128
- :where(.bf-theme) :where(.bf-button.is-icon) > :where(.bf-icon) {
129
- margin: 0;
130
- }
131
-
132
- :where(.bf-theme) :where(.bf-button.is-icon) {
133
- align-items: center;
134
- column-gap: var(--bf-space-1);
135
- display: inline-flex;
136
- justify-content: center;
137
- }
138
-
139
- :where(.bf-theme) :where(.bf-button-label) {
140
- min-inline-size: 0;
141
- }
142
-
143
- :where(.bf-theme) :where(.bf-actions) {
144
- align-items: center;
145
- display: flex;
146
- flex-wrap: wrap;
147
- gap: var(--bf-field-gap);
148
- min-inline-size: 0;
149
- }
150
-
151
- :where(.bf-theme) :where(.bf-actions.is-end) {
152
- justify-content: flex-end;
153
- }
154
-
155
- :where(.bf-theme) :where(.bf-actions.is-nowrap) {
156
- flex-wrap: nowrap;
157
- overflow-x: auto;
158
- scrollbar-width: thin;
159
- }
160
-
161
- :where(.bf-theme) :where(.bf-actions.is-nowrap) > * {
162
- flex: 0 0 auto;
163
- }
3
+ return `:where(.bf-theme) :where(.bf-button, .bf-button.is-base) {
4
+ ${bodyTypeStyles} appearance: none;
5
+ background-color: var(--bf-color-background-default);
6
+ border: var(--bf-border-width) solid var(--bf-color-border-high-contrast);
7
+ border-radius: var(--bf-radius);
8
+ color: var(--bf-color-text-default);
9
+ cursor: pointer;
10
+ display: inline-block;
11
+ margin-bottom: ${buttonMarginBottom};
12
+ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
13
+ text-align: center;
14
+ text-decoration: none;
15
+ }
16
+
17
+ :where(.bf-theme) :where(.bf-button) {
18
+ background-color: var(--bf-color-background-default);
19
+ }
20
+
21
+ :where(.bf-theme) :where(.bf-button.is-base) {
22
+ background-color: transparent;
23
+ border-color: transparent;
24
+ }
25
+
26
+ :where(.bf-theme) :where(.bf-button:hover, .bf-button.is-base:hover) {
27
+ background-color: var(--bf-color-background-hover);
28
+ }
29
+
30
+ :where(.bf-theme) :where(.bf-button:not(.is-base):is(:active, [aria-pressed='true'])) {
31
+ background-color: var(--bf-color-background-active);
32
+ }
33
+
34
+ :where(.bf-theme) :where(.bf-button, .bf-button.is-base):focus:not(:focus-visible) {
35
+ outline: none;
36
+ }
37
+
38
+ :where(.bf-theme) :where(.bf-button, .bf-button.is-base):focus-visible {
39
+ outline: 2px solid var(--bf-color-focus);
40
+ outline-offset: 2px;
41
+ }
42
+
43
+ /* ------------------------------------------------------------------ */
44
+ /* Button — semantic positive modifier (Vanilla parity). */
45
+ /* Vanilla uses themed positive tokens for default/hover/active */
46
+ /* backgrounds plus a white text colour on a coloured surface. */
47
+ /* ------------------------------------------------------------------ */
48
+
49
+ :where(.bf-theme) :where(.bf-button.is-positive) {
50
+ background-color: var(--bf-color-button-positive-default);
51
+ border-color: var(--bf-color-button-positive-default);
52
+ color: var(--bf-color-button-positive-text);
53
+ }
54
+
55
+ :where(.bf-theme) :where(.bf-button.is-positive:hover) {
56
+ background-color: var(--bf-color-button-positive-hover);
57
+ border-color: var(--bf-color-button-positive-hover);
58
+ color: var(--bf-color-button-positive-text);
59
+ }
60
+
61
+ :where(.bf-theme) :where(.bf-button.is-positive:is(:active, [aria-pressed='true'])) {
62
+ background-color: var(--bf-color-button-positive-active);
63
+ border-color: var(--bf-color-button-positive-active);
64
+ color: var(--bf-color-button-positive-text);
65
+ }
66
+
67
+ /* ------------------------------------------------------------------ */
68
+ /* Button — semantic negative modifier (Vanilla parity). */
69
+ /* Vanilla uses themed negative tokens for default/hover/active */
70
+ /* backgrounds plus a white text colour on a coloured surface. */
71
+ /* ------------------------------------------------------------------ */
72
+
73
+ :where(.bf-theme) :where(.bf-button.is-negative) {
74
+ background-color: var(--bf-color-button-negative-default);
75
+ border-color: var(--bf-color-button-negative-default);
76
+ color: var(--bf-color-button-negative-text);
77
+ }
78
+
79
+ :where(.bf-theme) :where(.bf-button.is-negative:hover) {
80
+ background-color: var(--bf-color-button-negative-hover);
81
+ border-color: var(--bf-color-button-negative-hover);
82
+ color: var(--bf-color-button-negative-text);
83
+ }
84
+
85
+ :where(.bf-theme) :where(.bf-button.is-negative:is(:active, [aria-pressed='true'])) {
86
+ background-color: var(--bf-color-button-negative-active);
87
+ border-color: var(--bf-color-button-negative-active);
88
+ color: var(--bf-color-button-negative-text);
89
+ }
90
+
91
+ /* ------------------------------------------------------------------ */
92
+ /* Button — link-style modifier (Vanilla parity). */
93
+ /* BF starts from the shared button control contract, so the modifier */
94
+ /* has to strip control chrome and padding back down to inline-link */
95
+ /* behavior while reusing the shared link tokens. */
96
+ /* ------------------------------------------------------------------ */
97
+
98
+ :where(.bf-theme) :where(.bf-button.is-link) {
99
+ background-color: transparent;
100
+ border: 0;
101
+ border-radius: 0;
102
+ color: var(--bf-color-link-default);
103
+ margin-bottom: 0;
104
+ padding-block: 0;
105
+ padding-inline: 0;
106
+ }
107
+
108
+ :where(.bf-theme) :where(.bf-button.is-link:hover) {
109
+ background-color: transparent;
110
+ color: var(--bf-color-link-default);
111
+ text-decoration: underline;
112
+ text-decoration-thickness: 1px;
113
+ text-underline-offset: 0.075em;
114
+ }
115
+
116
+ :where(.bf-theme) :where(.bf-button.is-link:focus-visible) {
117
+ outline-offset: 0;
118
+ }
119
+
120
+ /* ------------------------------------------------------------------ */
121
+ /* Button — icon-spacing modifier (Vanilla parity). */
122
+ /* Icon buttons make the icon/label relationship explicit. Bare text */
123
+ /* nodes cannot be distinguished from icon-only buttons in CSS because */
124
+ /* :first-child/:last-child ignore text nodes. A real label slot lets */
125
+ /* the component use one truthful, token-driven gap in either order. */
126
+ /* ------------------------------------------------------------------ */
127
+
128
+ :where(.bf-theme) :where(.bf-button.is-icon) > :where(.bf-icon) {
129
+ margin: 0;
130
+ }
131
+
132
+ :where(.bf-theme) :where(.bf-button.is-icon) {
133
+ align-items: center;
134
+ column-gap: var(--bf-space-1);
135
+ display: inline-flex;
136
+ justify-content: center;
137
+ }
138
+
139
+ :where(.bf-theme) :where(.bf-button-label) {
140
+ min-inline-size: 0;
141
+ }
142
+
143
+ :where(.bf-theme) :where(.bf-actions) {
144
+ align-items: center;
145
+ display: flex;
146
+ flex-wrap: wrap;
147
+ gap: var(--bf-field-gap);
148
+ min-inline-size: 0;
149
+ }
150
+
151
+ :where(.bf-theme) :where(.bf-actions.is-end) {
152
+ justify-content: flex-end;
153
+ }
154
+
155
+ :where(.bf-theme) :where(.bf-actions.is-nowrap) {
156
+ flex-wrap: nowrap;
157
+ overflow-x: auto;
158
+ scrollbar-width: thin;
159
+ }
160
+
161
+ :where(.bf-theme) :where(.bf-actions.is-nowrap) > * {
162
+ flex: 0 0 auto;
163
+ }
164
164
  `;
165
165
  }