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
@@ -12,195 +12,195 @@
12
12
  * classes to receive correct four-tier typography.
13
13
  */
14
14
  export function staticContentPortsCss() {
15
- return `/* ------------------------------------------------------------------ */
16
- /* Static content ports — Vanilla data spotlight and divided section. */
17
- /* Their children retain role-owned rhythm; these layout */
18
- /* wrappers add only structural columns, rules, and explicit section ends. */
19
- /* ------------------------------------------------------------------ */
20
-
21
- /* Data spotlight: Vanilla's equal-height wrap becomes an intrinsic grid.
22
- Each item begins with a public highlighted rule using the shared emphasis
23
- thickness. Item padding remains item-owned, so compositions never erase the
24
- shallow inter-row rhythm when the pattern narrows. */
25
- :where(.bf-theme) :where(.bf-data-spotlight) {
26
- container-type: inline-size;
27
- margin-block-end: var(--bf-section-space);
28
- min-inline-size: 0;
29
- }
30
-
31
- :where(.bf-theme) :where(.bf-data-spotlight-header) {
32
- min-inline-size: 0;
33
- }
34
-
35
- :where(.bf-theme) :where(.bf-data-spotlight-items) {
36
- column-gap: var(--bf-grid-gap-inline);
37
- display: grid;
38
- grid-template-columns: minmax(0, 1fr);
39
- min-inline-size: 0;
40
- }
41
-
42
- :where(.bf-theme) :where(.bf-data-spotlight-item) {
43
- min-inline-size: 0;
44
- overflow-wrap: anywhere;
45
- }
46
-
47
- :where(.bf-theme) :where(.bf-data-spotlight-item:not(:last-child)) {
48
- padding-block-end: var(--bf-section-space-shallow);
49
- }
50
-
51
- :where(.bf-theme) :where(.bf-data-spotlight-stat) {
52
- color: var(--bf-color-text-default);
53
- display: block;
54
- font-family: var(--bf-h1-font-family);
55
- font-size: var(--bf-h1-font-size);
56
- font-style: var(--bf-h1-font-style);
57
- font-variant-caps: var(--bf-h1-font-variant-caps);
58
- font-weight: var(--bf-h1-font-weight);
59
- letter-spacing: var(--bf-h1-letter-spacing);
60
- line-height: var(--bf-h1-line-height);
61
- margin-block: 0 var(--bf-h1-margin-bottom);
62
- overflow-wrap: anywhere;
63
- padding-block-end: 0;
64
- padding-block-start: var(--bf-h1-nudge-start);
65
- text-transform: var(--bf-h1-text-transform);
66
- }
67
-
68
- :where(.bf-theme) :where(.bf-data-spotlight-headline) {
69
- font-family: var(--bf-h3-font-family);
70
- font-size: var(--bf-h3-font-size);
71
- font-style: var(--bf-h3-font-style);
72
- font-variant-caps: var(--bf-h3-font-variant-caps);
73
- font-weight: var(--bf-h3-font-weight);
74
- letter-spacing: var(--bf-h3-letter-spacing);
75
- line-height: var(--bf-h3-line-height);
76
- margin-block: 0 var(--bf-h3-margin-bottom);
77
- min-inline-size: 0;
78
- padding-block-end: 0;
79
- padding-block-start: var(--bf-h3-nudge-start);
80
- text-transform: var(--bf-h3-text-transform);
81
- }
82
-
83
- :where(.bf-theme) :where(.bf-data-spotlight-description, .bf-data-spotlight-action) {
84
- min-inline-size: 0;
85
- overflow-wrap: anywhere;
86
- }
87
-
88
- :where(.bf-theme) :where(.bf-data-spotlight-action) {
89
- display: block;
90
- margin-block: 0 var(--bf-body-margin-bottom);
91
- padding-block-end: 0;
92
- padding-block-start: var(--bf-body-nudge-start);
93
- }
94
-
95
- /* Vanilla's tablet wrap has two equal items per row. For three items the
96
- in-grid title shares the first row; its first statistic owns the shallow
97
- row separation. Four items give both first-row statistics that separation. */
98
- @container (width >= 38.75rem) {
99
- :where(.bf-theme) :where(.bf-data-spotlight-items) {
100
- grid-template-columns: repeat(2, minmax(0, 1fr));
101
- }
102
-
103
- :where(.bf-theme) :where(.bf-data-spotlight-header, .bf-data-spotlight-item) {
104
- display: grid;
105
- grid-row: span 5;
106
- grid-template-rows: subgrid;
107
- }
108
-
109
- :where(.bf-theme) :where(.bf-data-spotlight-item) {
110
- padding-block-end: 0;
111
- }
112
-
113
- :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-header) {
114
- block-size: 0;
115
- overflow: visible;
116
- }
117
-
118
- :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
119
- :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-child(-n + 2)) {
120
- padding-block-end: var(--bf-section-space-shallow);
121
- }
122
- }
123
-
124
- /* At Vanilla's large threshold the four stat blocks align in one row. Two
125
- blocks reserve the leading half for the overhanging title; three reserve a
126
- single leading column. The zero block-size matches Vanilla's height: 0
127
- title cell without hiding its readable text. */
128
- @container (width >= 64.75rem) {
129
- :where(.bf-theme) :where(.bf-data-spotlight-items) {
130
- grid-template-columns: repeat(4, minmax(0, 1fr));
131
- }
132
-
133
- :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-header) {
134
- block-size: 0;
135
- grid-column: span 2;
136
- overflow: visible;
137
- }
138
-
139
- :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
140
- :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-child(-n + 2)) {
141
- padding-block-end: 0;
142
- }
143
- }
144
-
145
- /* Divided section: Vanilla's ruled 50/50 section is a one-column composition
146
- until the relevant container can support the split. The rule is structural;
147
- headings, copy, and content items keep their own metric-derived rhythm. */
148
- :where(.bf-theme) :where(.bf-divided-section) {
149
- container-type: inline-size;
150
- margin-block-end: var(--bf-section-space);
151
- min-inline-size: 0;
152
- }
153
-
154
- :where(.bf-theme) :where(.bf-divided-section-layout) {
155
- display: grid;
156
- grid-template-columns: minmax(0, 1fr);
157
- min-inline-size: 0;
158
- }
159
-
160
- :where(.bf-theme) :where(.bf-divided-section-rule) {
161
- grid-column: 1 / -1;
162
- }
163
-
164
- :where(.bf-theme) :where(.bf-divided-section-header, .bf-divided-section-content) {
165
- min-inline-size: 0;
166
- }
167
-
15
+ return `/* ------------------------------------------------------------------ */
16
+ /* Static content ports — Vanilla data spotlight and divided section. */
17
+ /* Their children retain role-owned rhythm; these layout */
18
+ /* wrappers add only structural columns, rules, and explicit section ends. */
19
+ /* ------------------------------------------------------------------ */
20
+
21
+ /* Data spotlight: Vanilla's equal-height wrap becomes an intrinsic grid.
22
+ Each item begins with a public highlighted rule using the shared emphasis
23
+ thickness. Item padding remains item-owned, so compositions never erase the
24
+ shallow inter-row rhythm when the pattern narrows. */
25
+ :where(.bf-theme) :where(.bf-data-spotlight) {
26
+ container-type: inline-size;
27
+ margin-block-end: var(--bf-section-space);
28
+ min-inline-size: 0;
29
+ }
30
+
31
+ :where(.bf-theme) :where(.bf-data-spotlight-header) {
32
+ min-inline-size: 0;
33
+ }
34
+
35
+ :where(.bf-theme) :where(.bf-data-spotlight-items) {
36
+ column-gap: var(--bf-grid-gap-inline);
37
+ display: grid;
38
+ grid-template-columns: minmax(0, 1fr);
39
+ min-inline-size: 0;
40
+ }
41
+
42
+ :where(.bf-theme) :where(.bf-data-spotlight-item) {
43
+ min-inline-size: 0;
44
+ overflow-wrap: anywhere;
45
+ }
46
+
47
+ :where(.bf-theme) :where(.bf-data-spotlight-item:not(:last-child)) {
48
+ padding-block-end: var(--bf-section-space-shallow);
49
+ }
50
+
51
+ :where(.bf-theme) :where(.bf-data-spotlight-stat) {
52
+ color: var(--bf-color-text-default);
53
+ display: block;
54
+ font-family: var(--bf-h1-font-family);
55
+ font-size: var(--bf-h1-font-size);
56
+ font-style: var(--bf-h1-font-style);
57
+ font-variant-caps: var(--bf-h1-font-variant-caps);
58
+ font-weight: var(--bf-h1-font-weight);
59
+ letter-spacing: var(--bf-h1-letter-spacing);
60
+ line-height: var(--bf-h1-line-height);
61
+ margin-block: 0 var(--bf-h1-margin-bottom);
62
+ overflow-wrap: anywhere;
63
+ padding-block-end: 0;
64
+ padding-block-start: var(--bf-h1-nudge-start);
65
+ text-transform: var(--bf-h1-text-transform);
66
+ }
67
+
68
+ :where(.bf-theme) :where(.bf-data-spotlight-headline) {
69
+ font-family: var(--bf-h3-font-family);
70
+ font-size: var(--bf-h3-font-size);
71
+ font-style: var(--bf-h3-font-style);
72
+ font-variant-caps: var(--bf-h3-font-variant-caps);
73
+ font-weight: var(--bf-h3-font-weight);
74
+ letter-spacing: var(--bf-h3-letter-spacing);
75
+ line-height: var(--bf-h3-line-height);
76
+ margin-block: 0 var(--bf-h3-margin-bottom);
77
+ min-inline-size: 0;
78
+ padding-block-end: 0;
79
+ padding-block-start: var(--bf-h3-nudge-start);
80
+ text-transform: var(--bf-h3-text-transform);
81
+ }
82
+
83
+ :where(.bf-theme) :where(.bf-data-spotlight-description, .bf-data-spotlight-action) {
84
+ min-inline-size: 0;
85
+ overflow-wrap: anywhere;
86
+ }
87
+
88
+ :where(.bf-theme) :where(.bf-data-spotlight-action) {
89
+ display: block;
90
+ margin-block: 0 var(--bf-body-margin-bottom);
91
+ padding-block-end: 0;
92
+ padding-block-start: var(--bf-body-nudge-start);
93
+ }
94
+
95
+ /* Vanilla's tablet wrap has two equal items per row. For three items the
96
+ in-grid title shares the first row; its first statistic owns the shallow
97
+ row separation. Four items give both first-row statistics that separation. */
98
+ @container (width >= 38.75rem) {
99
+ :where(.bf-theme) :where(.bf-data-spotlight-items) {
100
+ grid-template-columns: repeat(2, minmax(0, 1fr));
101
+ }
102
+
103
+ :where(.bf-theme) :where(.bf-data-spotlight-header, .bf-data-spotlight-item) {
104
+ display: grid;
105
+ grid-row: span 5;
106
+ grid-template-rows: subgrid;
107
+ }
108
+
109
+ :where(.bf-theme) :where(.bf-data-spotlight-item) {
110
+ padding-block-end: 0;
111
+ }
112
+
113
+ :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-header) {
114
+ block-size: 0;
115
+ overflow: visible;
116
+ }
117
+
118
+ :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
119
+ :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-child(-n + 2)) {
120
+ padding-block-end: var(--bf-section-space-shallow);
121
+ }
122
+ }
123
+
124
+ /* At Vanilla's large threshold the four stat blocks align in one row. Two
125
+ blocks reserve the leading half for the overhanging title; three reserve a
126
+ single leading column. The zero block-size matches Vanilla's height: 0
127
+ title cell without hiding its readable text. */
128
+ @container (width >= 64.75rem) {
129
+ :where(.bf-theme) :where(.bf-data-spotlight-items) {
130
+ grid-template-columns: repeat(4, minmax(0, 1fr));
131
+ }
132
+
133
+ :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-header) {
134
+ block-size: 0;
135
+ grid-column: span 2;
136
+ overflow: visible;
137
+ }
138
+
139
+ :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
140
+ :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-child(-n + 2)) {
141
+ padding-block-end: 0;
142
+ }
143
+ }
144
+
145
+ /* Divided section: Vanilla's ruled 50/50 section is a one-column composition
146
+ until the relevant container can support the split. The rule is structural;
147
+ headings, copy, and content items keep their own metric-derived rhythm. */
148
+ :where(.bf-theme) :where(.bf-divided-section) {
149
+ container-type: inline-size;
150
+ margin-block-end: var(--bf-section-space);
151
+ min-inline-size: 0;
152
+ }
153
+
154
+ :where(.bf-theme) :where(.bf-divided-section-layout) {
155
+ display: grid;
156
+ grid-template-columns: minmax(0, 1fr);
157
+ min-inline-size: 0;
158
+ }
159
+
160
+ :where(.bf-theme) :where(.bf-divided-section-rule) {
161
+ grid-column: 1 / -1;
162
+ }
163
+
164
+ :where(.bf-theme) :where(.bf-divided-section-header, .bf-divided-section-content) {
165
+ min-inline-size: 0;
166
+ }
167
+
168
168
  :where(.bf-theme) :where(.bf-divided-section-list) {
169
169
  align-content: start;
170
170
  display: grid;
171
171
  list-style: none;
172
- margin: 0;
173
- padding: 0;
174
- }
175
-
172
+ margin: 0;
173
+ padding: 0;
174
+ }
175
+
176
176
  :where(.bf-theme) :where(.bf-divided-section-item) {
177
177
  align-content: start;
178
178
  display: grid;
179
179
  min-inline-size: 0;
180
- overflow-wrap: anywhere;
181
- }
182
-
183
- :where(.bf-theme) :where(.bf-divided-section-item:not(:last-child)) {
184
- padding-block-end: var(--bf-section-space-shallow);
185
- }
186
-
187
- :where(.bf-theme) :where(.bf-divided-section-item + .bf-divided-section-item) {
188
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
189
- padding-block-start: calc(var(--bf-section-space-shallow) - var(--bf-border-width));
190
- }
191
-
192
- @container (width >= 38.75rem) {
193
- :where(.bf-theme) :where(.bf-divided-section.is-split-medium) :where(.bf-divided-section-layout) {
194
- column-gap: var(--bf-grid-gap-inline);
195
- grid-template-columns: repeat(2, minmax(0, 1fr));
196
- }
197
- }
198
-
199
- @container (width >= 64.75rem) {
200
- :where(.bf-theme) :where(.bf-divided-section) :where(.bf-divided-section-layout) {
201
- column-gap: var(--bf-grid-gap-inline);
202
- grid-template-columns: repeat(2, minmax(0, 1fr));
203
- }
204
- }
180
+ overflow-wrap: anywhere;
181
+ }
182
+
183
+ :where(.bf-theme) :where(.bf-divided-section-item:not(:last-child)) {
184
+ padding-block-end: var(--bf-section-space-shallow);
185
+ }
186
+
187
+ :where(.bf-theme) :where(.bf-divided-section-item + .bf-divided-section-item) {
188
+ border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
189
+ padding-block-start: calc(var(--bf-section-space-shallow) - var(--bf-border-width));
190
+ }
191
+
192
+ @container (width >= 38.75rem) {
193
+ :where(.bf-theme) :where(.bf-divided-section.is-split-medium) :where(.bf-divided-section-layout) {
194
+ column-gap: var(--bf-grid-gap-inline);
195
+ grid-template-columns: repeat(2, minmax(0, 1fr));
196
+ }
197
+ }
198
+
199
+ @container (width >= 64.75rem) {
200
+ :where(.bf-theme) :where(.bf-divided-section) :where(.bf-divided-section-layout) {
201
+ column-gap: var(--bf-grid-gap-inline);
202
+ grid-template-columns: repeat(2, minmax(0, 1fr));
203
+ }
204
+ }
205
205
  `;
206
206
  }
@@ -17,87 +17,87 @@
17
17
  * root establishes the container; every query styles descendants only.
18
18
  */
19
19
  export function tabSectionCss() {
20
- return `/* ------------------------------------------------------------------ */
21
- /* Sites tab section — structural layout over the existing BF tabs API. */
22
- /* ------------------------------------------------------------------ */
23
-
24
- :where(.bf-theme) :where(.bf-tab-section) {
25
- container-name: bf-tab-section;
26
- container-type: inline-size;
27
- margin-block-end: var(--bf-section-space);
28
- min-inline-size: 0;
29
- }
30
-
31
- :where(.bf-theme) :where(.bf-tab-section.is-shallow) {
32
- margin-block-end: var(--bf-section-space-shallow);
33
- }
34
-
35
- :where(.bf-theme) :where(.bf-tab-section.is-deep) {
36
- margin-block-end: var(--bf-section-space-deep);
37
- }
38
-
39
- :where(.bf-theme) :where(.bf-tab-section-layout) {
40
- display: grid;
41
- grid-template-columns: minmax(0, 1fr);
42
- min-inline-size: 0;
43
- }
44
-
45
- :where(.bf-theme) :where(.bf-tab-section-rule) {
46
- grid-column: 1 / -1;
47
- }
48
-
49
- :where(.bf-theme) :where(.bf-tab-section-header, .bf-tab-section-intro, .bf-tab-section-tabs) {
50
- min-inline-size: 0;
51
- overflow-wrap: anywhere;
52
- }
53
-
54
- /* Vanilla wraps every tab rail except the unadorned 50/50 special case in a
55
- shallow section. This explicit composition padding does not change any
56
- child's semantic margins. */
57
- :where(.bf-theme) :where(.bf-tab-section:not(.is-50-50)) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs),
58
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-tabs) {
59
- padding-block-start: var(--bf-section-space-shallow);
60
- }
61
-
62
- @container bf-tab-section (width >= 64.75rem) {
63
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) {
64
- column-gap: var(--bf-grid-gap-inline);
65
- grid-template-columns: repeat(4, minmax(0, 1fr));
66
- }
67
-
68
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
69
- grid-column: 1 / -1;
70
- }
71
-
72
- /* With supporting copy or actions, Vanilla's heading row is 50/50 for all
73
- three section layouts. The following tab rail retains its own requested
74
- full, half or three-quarter span. */
75
- :where(.bf-theme) :where(.bf-tab-section-layout:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-header) {
76
- grid-column: 1 / 3;
77
- }
78
-
79
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-intro) {
80
- grid-column: 3 / -1;
81
- }
82
-
83
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
84
- grid-column: 1 / -1;
85
- }
86
-
87
- /* An unadorned 50/50 section lets auto-placement put the heading and tabs
88
- in the same row. If an intro exists, it occupies that right-hand cell and
89
- the tabs move to the following row, matching the upstream rendering. */
90
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
91
- grid-column: 1 / 3;
92
- }
93
-
94
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
95
- grid-column: 3 / -1;
96
- }
97
-
98
- :where(.bf-theme) :where(.bf-tab-section.is-25-75) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
99
- grid-column: 2 / -1;
100
- }
101
- }
20
+ return `/* ------------------------------------------------------------------ */
21
+ /* Sites tab section — structural layout over the existing BF tabs API. */
22
+ /* ------------------------------------------------------------------ */
23
+
24
+ :where(.bf-theme) :where(.bf-tab-section) {
25
+ container-name: bf-tab-section;
26
+ container-type: inline-size;
27
+ margin-block-end: var(--bf-section-space);
28
+ min-inline-size: 0;
29
+ }
30
+
31
+ :where(.bf-theme) :where(.bf-tab-section.is-shallow) {
32
+ margin-block-end: var(--bf-section-space-shallow);
33
+ }
34
+
35
+ :where(.bf-theme) :where(.bf-tab-section.is-deep) {
36
+ margin-block-end: var(--bf-section-space-deep);
37
+ }
38
+
39
+ :where(.bf-theme) :where(.bf-tab-section-layout) {
40
+ display: grid;
41
+ grid-template-columns: minmax(0, 1fr);
42
+ min-inline-size: 0;
43
+ }
44
+
45
+ :where(.bf-theme) :where(.bf-tab-section-rule) {
46
+ grid-column: 1 / -1;
47
+ }
48
+
49
+ :where(.bf-theme) :where(.bf-tab-section-header, .bf-tab-section-intro, .bf-tab-section-tabs) {
50
+ min-inline-size: 0;
51
+ overflow-wrap: anywhere;
52
+ }
53
+
54
+ /* Vanilla wraps every tab rail except the unadorned 50/50 special case in a
55
+ shallow section. This explicit composition padding does not change any
56
+ child's semantic margins. */
57
+ :where(.bf-theme) :where(.bf-tab-section:not(.is-50-50)) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs),
58
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-tabs) {
59
+ padding-block-start: var(--bf-section-space-shallow);
60
+ }
61
+
62
+ @container bf-tab-section (width >= 64.75rem) {
63
+ :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) {
64
+ column-gap: var(--bf-grid-gap-inline);
65
+ grid-template-columns: repeat(4, minmax(0, 1fr));
66
+ }
67
+
68
+ :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
69
+ grid-column: 1 / -1;
70
+ }
71
+
72
+ /* With supporting copy or actions, Vanilla's heading row is 50/50 for all
73
+ three section layouts. The following tab rail retains its own requested
74
+ full, half or three-quarter span. */
75
+ :where(.bf-theme) :where(.bf-tab-section-layout:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-header) {
76
+ grid-column: 1 / 3;
77
+ }
78
+
79
+ :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-intro) {
80
+ grid-column: 3 / -1;
81
+ }
82
+
83
+ :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
84
+ grid-column: 1 / -1;
85
+ }
86
+
87
+ /* An unadorned 50/50 section lets auto-placement put the heading and tabs
88
+ in the same row. If an intro exists, it occupies that right-hand cell and
89
+ the tabs move to the following row, matching the upstream rendering. */
90
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
91
+ grid-column: 1 / 3;
92
+ }
93
+
94
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
95
+ grid-column: 3 / -1;
96
+ }
97
+
98
+ :where(.bf-theme) :where(.bf-tab-section.is-25-75) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
99
+ grid-column: 2 / -1;
100
+ }
101
+ }
102
102
  `;
103
103
  }