baseline-foundry 0.1.4 → 0.1.6

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 (82) hide show
  1. package/README.md +17 -9
  2. package/config/experiments/ibm-plex-engine-smoke.json +1 -1
  3. package/config/experiments/ubuntu-engine-smoke.json +1 -1
  4. package/config/foundation-theme.json +1 -1
  5. package/config/tiers/app.json +6 -6
  6. package/config/tiers/documentation.json +2 -2
  7. package/config/tiers/editorial.json +1 -1
  8. package/config/tiers/os.json +6 -6
  9. package/dist/baseline-grid-overlay.js +2 -2
  10. package/dist/build.js +4 -4
  11. package/dist/code-snippet.js +1 -1
  12. package/dist/css-app-tier.js +16 -5
  13. package/dist/css-components/article-pagination.js +9 -8
  14. package/dist/css-components/button-actions.js +24 -4
  15. package/dist/css-components/cards-options.js +8 -8
  16. package/dist/css-components/chip-badge-status.d.ts +0 -3
  17. package/dist/css-components/chip-badge-status.js +57 -10
  18. package/dist/css-components/content-card.d.ts +7 -7
  19. package/dist/css-components/content-card.js +17 -16
  20. package/dist/css-components/control-row.d.ts +1 -1
  21. package/dist/css-components/control-row.js +1 -1
  22. package/dist/css-components/document-navigation.js +66 -29
  23. package/dist/css-components/editorial-content.js +1 -1
  24. package/dist/css-components/interactive-feedback.js +50 -28
  25. package/dist/css-components/interactive-tables.js +13 -8
  26. package/dist/css-components/legacy-navigation.d.ts +0 -1
  27. package/dist/css-components/legacy-navigation.js +108 -32
  28. package/dist/css-components/linked-logo-site-layout.d.ts +3 -3
  29. package/dist/css-components/linked-logo-site-layout.js +17 -20
  30. package/dist/css-components/list-tree.js +21 -19
  31. package/dist/css-components/list.js +9 -7
  32. package/dist/css-components/logo-media.d.ts +6 -6
  33. package/dist/css-components/logo-media.js +38 -27
  34. package/dist/css-components/navigation-layout.js +6 -8
  35. package/dist/css-components/panel.js +12 -12
  36. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  37. package/dist/css-components/search-box-and-filter.js +18 -19
  38. package/dist/css-components/sites-editorial-ports.d.ts +3 -4
  39. package/dist/css-components/sites-editorial-ports.js +61 -29
  40. package/dist/css-components/sites-foundation.js +15 -19
  41. package/dist/css-components/sites-rich-lists.d.ts +5 -5
  42. package/dist/css-components/sites-rich-lists.js +26 -36
  43. package/dist/css-components/static-content-ports.d.ts +3 -3
  44. package/dist/css-components/static-content-ports.js +51 -37
  45. package/dist/css-components/tab-section.d.ts +3 -3
  46. package/dist/css-components/tab-section.js +34 -26
  47. package/dist/css-components/table.js +4 -7
  48. package/dist/css-components/tabs-choice-breadcrumbs.js +25 -21
  49. package/dist/css-components/tiered-list-equal-height-row.js +10 -10
  50. package/dist/css-components.js +243 -124
  51. package/dist/css-grid.d.ts +1 -1
  52. package/dist/css-grid.js +18 -8
  53. package/dist/css.js +94 -18
  54. package/dist/experiments/ibm-plex-engine-smoke/styles.css +1005 -563
  55. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +2 -2
  56. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +1 -1
  57. package/dist/in-page-navigation.js +1 -1
  58. package/dist/presets/app-tier/styles.css +1046 -593
  59. package/dist/presets/app-tier/surfaces.json +17 -17
  60. package/dist/presets/app-tier/tokens.json +7 -7
  61. package/dist/presets/prose/styles.css +1036 -587
  62. package/dist/presets/prose/surfaces.json +17 -17
  63. package/dist/presets/prose/tokens.json +1 -1
  64. package/dist/resizable-aside.js +12 -4
  65. package/dist/styles.css +1036 -587
  66. package/dist/surfaces.json +17 -17
  67. package/dist/tiers/app/styles.css +1046 -593
  68. package/dist/tiers/app/surfaces.json +17 -17
  69. package/dist/tiers/app/tokens.json +7 -7
  70. package/dist/tiers/documentation/styles.css +1037 -588
  71. package/dist/tiers/documentation/surfaces.json +17 -17
  72. package/dist/tiers/documentation/tokens.json +2 -2
  73. package/dist/tiers/editorial/styles.css +1036 -587
  74. package/dist/tiers/editorial/surfaces.json +17 -17
  75. package/dist/tiers/editorial/tokens.json +1 -1
  76. package/dist/tiers/os/styles.css +1042 -593
  77. package/dist/tiers/os/surfaces.json +17 -17
  78. package/dist/tiers/os/tokens.json +7 -7
  79. package/dist/tokens.json +1 -1
  80. package/dist/types.d.ts +1 -1
  81. package/docs/publishing.md +1 -1
  82. package/package.json +2 -2
@@ -8,12 +8,12 @@
8
8
  * content paired with one responsive image or video slot.
9
9
  *
10
10
  * Vanilla → BF spacing mapping:
11
- * - horizontal item 8px/16px block padding → `space-1`/`space-2`;
12
- * - 16px grid gutters → `grid-gap-inline`;
13
- * - shallow/default/deep section exitsBF's existing section tokens;
14
- * - the 620px/1036px page breakpoints → 38.75rem/64.75rem container
11
+ * - horizontal item 0.5rem/1rem block padding → `space-1`/`space-2`;
12
+ * - 1rem grid gutters → `grid-gap-inline`;
13
+ * - the 38.75rem/64.75rem page breakpoints38.75rem/64.75rem container
15
14
  * thresholds for descendants. Text roles keep their own metric-derived
16
- * margins and baseline compensation in every tier.
15
+ * margins and baseline compensation in every tier. Parent stacks own every
16
+ * boundary outside the pattern.
17
17
  */
18
18
  export function sitesRichListsCss() {
19
19
  return `/* ------------------------------------------------------------------ */
@@ -24,19 +24,13 @@ export function sitesRichListsCss() {
24
24
  container-name: bf-rich-list;
25
25
  container-type: inline-size;
26
26
  min-inline-size: 0;
27
- padding-block-end: calc(var(--bf-section-space) / 2);
28
- }
29
-
30
- :where(.bf-theme) :where(.bf-rich-list.is-shallow) {
31
- padding-block-end: var(--bf-section-space-shallow);
32
- }
33
-
34
- :where(.bf-theme) :where(.bf-rich-list.is-deep) {
35
- padding-block-end: calc(var(--bf-section-space-deep) / 2);
36
27
  }
37
28
 
38
29
  :where(.bf-theme) :where(.bf-rich-list-layout) {
30
+ --bf-stack-space: var(--bf-space-1);
31
+ align-content: start;
39
32
  display: grid;
33
+ gap: var(--bf-stack-space);
40
34
  grid-template-columns: minmax(0, 1fr);
41
35
  min-inline-size: 0;
42
36
  }
@@ -51,14 +45,11 @@ export function sitesRichListsCss() {
51
45
  overflow-wrap: anywhere;
52
46
  }
53
47
 
54
- @media (width >= 64.75rem) {
55
- :where(.bf-theme) :where(.bf-rich-list:not(.is-shallow)) {
56
- padding-block-end: var(--bf-section-space);
57
- }
58
-
59
- :where(.bf-theme) :where(.bf-rich-list.is-deep) {
60
- padding-block-end: var(--bf-section-space-deep);
61
- }
48
+ :where(.bf-theme) :where(.bf-rich-list-support, .bf-rich-list-content) {
49
+ --bf-stack-space: var(--bf-space-1);
50
+ align-content: start;
51
+ display: grid;
52
+ gap: var(--bf-stack-space);
62
53
  }
63
54
 
64
55
  /* ------------------------------------------------------------------ */
@@ -85,7 +76,7 @@ export function sitesRichListsCss() {
85
76
  /* A full-width ratio inside a fluid Sites rail otherwise leaves the next
86
77
  heading on a fractional pixel. The visual alone absorbs the trailing
87
78
  compensation; semantic children retain their own margins unchanged. */
88
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
79
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
89
80
  :where(.bf-theme) :where(.bf-rich-list-visual > .bf-aspect) {
90
81
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
91
82
  }
@@ -124,8 +115,12 @@ export function sitesRichListsCss() {
124
115
 
125
116
  /* Prefixes are logical here even though the shared list predates BF's
126
117
  logical-property rule. This keeps ticks, bullets and numbers RTL-safe. */
118
+ :where(.bf-theme) :where(.bf-rich-list-list:has(> .bf-list-item:is(.is-ticked, .is-crossed)), .bf-rich-list-list.is-bulleted, ol.bf-rich-list-list) {
119
+ padding-inline-start: var(--bf-leading-mark-group-inset);
120
+ }
121
+
127
122
  :where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed) {
128
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
123
+ padding-inline-start: var(--bf-leading-mark-offset);
129
124
  }
130
125
 
131
126
  :where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed)::before {
@@ -135,7 +130,7 @@ export function sitesRichListsCss() {
135
130
  }
136
131
 
137
132
  :where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item) {
138
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
133
+ padding-inline-start: var(--bf-leading-mark-offset);
139
134
  }
140
135
 
141
136
  :where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item)::before {
@@ -154,7 +149,7 @@ export function sitesRichListsCss() {
154
149
 
155
150
  :where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item) {
156
151
  counter-increment: bf-rich-horizontal-counter;
157
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
152
+ padding-inline-start: var(--bf-leading-mark-offset);
158
153
  }
159
154
 
160
155
  :where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item)::before {
@@ -201,7 +196,7 @@ export function sitesRichListsCss() {
201
196
  }
202
197
  }
203
198
 
204
- @container bf-rich-list (width >= 64.75rem) {
199
+ @container bf-rich-list (width >= 45rem) {
205
200
  :where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) {
206
201
  column-gap: var(--bf-grid-gap-inline);
207
202
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -215,7 +210,7 @@ export function sitesRichListsCss() {
215
210
  grid-column: 2;
216
211
  }
217
212
 
218
- :where(.bf-theme) :where(.bf-rich-list.is-horizontal) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
213
+ :where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
219
214
  grid-column: 2;
220
215
  }
221
216
  }
@@ -230,7 +225,6 @@ export function sitesRichListsCss() {
230
225
 
231
226
  :where(.bf-theme) :where(.bf-rich-list.is-vertical) :where(.bf-rich-list-media) {
232
227
  container-type: inline-size;
233
- padding-block-end: var(--bf-section-space-shallow);
234
228
  }
235
229
 
236
230
  :where(.bf-theme) :where(.bf-rich-list.is-vertical.is-flipped) :where(.bf-rich-list-media) {
@@ -249,7 +243,7 @@ export function sitesRichListsCss() {
249
243
  /* The media object deliberately stretches across fluid 1/2 and 2/3 ratios.
250
244
  Snap that resulting block, rather than resetting content spacing, so each
251
245
  tier's baseline survives both portrait and landscape allocations. */
252
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
246
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
253
247
  :where(.bf-theme) :where(.bf-rich-list-media-frame) {
254
248
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
255
249
  }
@@ -292,11 +286,7 @@ export function sitesRichListsCss() {
292
286
  /* Auto height has no shallow media wrapper in Vanilla. At narrow widths it
293
287
  remains a normal 3:2 frame; at the wide split it stretches with the content
294
288
  rail, clamped between the equivalent 16:9 and 2:3 heights. */
295
- :where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) {
296
- padding-block-end: 0;
297
- }
298
-
299
- @container bf-rich-list (width >= 64.75rem) {
289
+ @container bf-rich-list (width >= 45rem) {
300
290
  :where(.bf-theme) :where(.bf-rich-list.is-vertical) > :where(.bf-rich-list-layout) {
301
291
  align-items: stretch;
302
292
  column-gap: var(--bf-grid-gap-inline);
@@ -345,7 +335,7 @@ export function sitesRichListsCss() {
345
335
  min-block-size: 56.25cqi;
346
336
  }
347
337
 
348
- @supports (min-block-size: round(up, 1px, 1px)) {
338
+ @supports (min-block-size: round(up, 0.0625rem, 0.0625rem)) {
349
339
  :where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) :where(.bf-rich-list-media-frame) {
350
340
  max-block-size: round(down, 150cqi, var(--bf-baseline));
351
341
  min-block-size: round(up, 56.25cqi, var(--bf-baseline));
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Static Vanilla parity ports: data spotlight and divided section. The
3
- * 38.75rem and 64.75rem container thresholds preserve Vanilla's 620px and
4
- * 1036px composition changes while allowing the patterns to respond to their
5
- * allocated inline size.
3
+ * Components use an intrinsic medium threshold for their density changes and
4
+ * the shared 45rem readable-split threshold for default balanced content,
5
+ * while responding to their allocated inline size.
6
6
  *
7
7
  * Vanilla → BF token mapping:
8
8
  * - `$spv--strip-shallow` (1.5rem) → `--bf-section-space-shallow`.
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * Static Vanilla parity ports: data spotlight and divided section. The
3
- * 38.75rem and 64.75rem container thresholds preserve Vanilla's 620px and
4
- * 1036px composition changes while allowing the patterns to respond to their
5
- * allocated inline size.
3
+ * Components use an intrinsic medium threshold for their density changes and
4
+ * the shared 45rem readable-split threshold for default balanced content,
5
+ * while responding to their allocated inline size.
6
6
  *
7
7
  * Vanilla → BF token mapping:
8
8
  * - `$spv--strip-shallow` (1.5rem) → `--bf-section-space-shallow`.
@@ -15,16 +15,15 @@ export function staticContentPortsCss() {
15
15
  return `/* ------------------------------------------------------------------ */
16
16
  /* Static content ports — Vanilla data spotlight and divided section. */
17
17
  /* Their children retain role-owned rhythm; these layout */
18
- /* wrappers add only structural columns, rules, and explicit section ends. */
18
+ /* wrappers add only structural columns, rules, and internal gaps. */
19
19
  /* ------------------------------------------------------------------ */
20
20
 
21
21
  /* Data spotlight: Vanilla's equal-height wrap becomes an intrinsic grid.
22
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. */
23
+ thickness. The items container owns every inter-row gap. */
25
24
  :where(.bf-theme) :where(.bf-data-spotlight) {
26
25
  container-type: inline-size;
27
- margin-block-end: var(--bf-section-space);
26
+ margin: 0;
28
27
  min-inline-size: 0;
29
28
  }
30
29
 
@@ -37,15 +36,13 @@ export function staticContentPortsCss() {
37
36
  display: grid;
38
37
  grid-template-columns: minmax(0, 1fr);
39
38
  min-inline-size: 0;
39
+ row-gap: var(--bf-section-space-shallow);
40
40
  }
41
41
 
42
42
  :where(.bf-theme) :where(.bf-data-spotlight-item) {
43
43
  min-inline-size: 0;
44
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);
45
+ padding: 0;
49
46
  }
50
47
 
51
48
  :where(.bf-theme) :where(.bf-data-spotlight-stat) {
@@ -98,6 +95,14 @@ export function staticContentPortsCss() {
98
95
  @container (width >= 38.75rem) {
99
96
  :where(.bf-theme) :where(.bf-data-spotlight-items) {
100
97
  grid-template-columns: repeat(2, minmax(0, 1fr));
98
+ row-gap: var(--bf-space-1);
99
+ }
100
+
101
+ :where(.bf-theme) :where(.bf-data-spotlight-items)::after {
102
+ block-size: calc(var(--bf-section-space-shallow) - (var(--bf-space-1) * 2));
103
+ content: "";
104
+ grid-column: 1 / -1;
105
+ grid-row: 6;
101
106
  }
102
107
 
103
108
  :where(.bf-theme) :where(.bf-data-spotlight-header, .bf-data-spotlight-item) {
@@ -106,10 +111,6 @@ export function staticContentPortsCss() {
106
111
  grid-template-rows: subgrid;
107
112
  }
108
113
 
109
- :where(.bf-theme) :where(.bf-data-spotlight-item) {
110
- padding-block-end: 0;
111
- }
112
-
113
114
  :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-header) {
114
115
  block-size: 0;
115
116
  overflow: visible;
@@ -117,7 +118,13 @@ export function staticContentPortsCss() {
117
118
 
118
119
  :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
119
120
  :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
+ grid-row: span 5;
122
+ }
123
+
124
+ :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-item:nth-of-type(2)),
125
+ :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:nth-of-type(n + 2)),
126
+ :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-of-type(n + 3)) {
127
+ grid-row: 7 / span 5;
121
128
  }
122
129
  }
123
130
 
@@ -130,15 +137,18 @@ export function staticContentPortsCss() {
130
137
  grid-template-columns: repeat(4, minmax(0, 1fr));
131
138
  }
132
139
 
140
+ :where(.bf-theme) :where(.bf-data-spotlight-items)::after {
141
+ content: none;
142
+ }
143
+
133
144
  :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-header) {
134
145
  block-size: 0;
135
146
  grid-column: span 2;
136
147
  overflow: visible;
137
148
  }
138
149
 
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;
150
+ :where(.bf-theme) :where(.bf-data-spotlight-item) {
151
+ grid-row: span 5;
142
152
  }
143
153
  }
144
154
 
@@ -147,7 +157,7 @@ export function staticContentPortsCss() {
147
157
  headings, copy, and content items keep their own metric-derived rhythm. */
148
158
  :where(.bf-theme) :where(.bf-divided-section) {
149
159
  container-type: inline-size;
150
- margin-block-end: var(--bf-section-space);
160
+ margin: 0;
151
161
  min-inline-size: 0;
152
162
  }
153
163
 
@@ -166,37 +176,41 @@ export function staticContentPortsCss() {
166
176
  }
167
177
 
168
178
  :where(.bf-theme) :where(.bf-divided-section-list) {
169
- align-content: start;
170
- display: grid;
179
+ --bf-divided-section-rule-to-content: calc(0.5rem - var(--bf-border-width));
180
+ --bf-stack-space: 1.5rem;
171
181
  list-style: none;
172
182
  margin: 0;
173
183
  padding: 0;
174
184
  }
175
185
 
186
+ /* Preserve the pre-0.1.5 list markup; canonical composition also carries
187
+ bf-stack so the container remains the explicit owner of item spacing. */
188
+ :where(.bf-theme) :where(.bf-divided-section-list:not(.bf-stack)) {
189
+ align-content: start;
190
+ display: grid;
191
+ gap: var(--bf-stack-space);
192
+ }
193
+
176
194
  :where(.bf-theme) :where(.bf-divided-section-item) {
177
195
  align-content: start;
178
196
  display: grid;
197
+ margin: 0;
179
198
  min-inline-size: 0;
180
199
  overflow-wrap: anywhere;
200
+ padding: 0;
201
+ position: relative;
181
202
  }
182
203
 
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));
204
+ :where(.bf-theme) :where(.bf-divided-section-item + .bf-divided-section-item)::before {
205
+ background: var(--bf-color-border-low-contrast);
206
+ block-size: var(--bf-border-width);
207
+ content: "";
208
+ inset-block-start: calc((var(--bf-divided-section-rule-to-content) + var(--bf-border-width)) * -1);
209
+ inset-inline: 0;
210
+ position: absolute;
190
211
  }
191
212
 
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) {
213
+ @container (width >= 45rem) {
200
214
  :where(.bf-theme) :where(.bf-divided-section) :where(.bf-divided-section-layout) {
201
215
  column-gap: var(--bf-grid-gap-inline);
202
216
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -7,10 +7,10 @@
7
7
  * divided-section and basic-section remain independent BF components.
8
8
  *
9
9
  * Vanilla → BF mapping:
10
- * - 1036px large-grid switch → the 64.75rem descendant container query.
11
- * - p-section / shallow / deep BF section boundary tokens.
10
+ * - 45rem readable split switch → the 45rem descendant container query.
11
+ * - section boundaries the parent stack selected by the composition.
12
12
  * - the intermediate p-section--shallow before a separate tab rail →
13
- * padding-block-start on that rail using --bf-section-space-shallow.
13
+ * a shallow gap owned by the tab-section body.
14
14
  * - 8-column 4/4 and 2/6 spans → intrinsic 1/1 and 1/3 tracks.
15
15
  *
16
16
  * Heading type and content rhythm remain owned by semantic BF elements. The
@@ -7,10 +7,10 @@
7
7
  * divided-section and basic-section remain independent BF components.
8
8
  *
9
9
  * Vanilla → BF mapping:
10
- * - 1036px large-grid switch → the 64.75rem descendant container query.
11
- * - p-section / shallow / deep BF section boundary tokens.
10
+ * - 45rem readable split switch → the 45rem descendant container query.
11
+ * - section boundaries the parent stack selected by the composition.
12
12
  * - the intermediate p-section--shallow before a separate tab rail →
13
- * padding-block-start on that rail using --bf-section-space-shallow.
13
+ * a shallow gap owned by the tab-section body.
14
14
  * - 8-column 4/4 and 2/6 spans → intrinsic 1/1 and 1/3 tracks.
15
15
  *
16
16
  * Heading type and content rhythm remain owned by semantic BF elements. The
@@ -24,26 +24,35 @@ export function tabSectionCss() {
24
24
  :where(.bf-theme) :where(.bf-tab-section) {
25
25
  container-name: bf-tab-section;
26
26
  container-type: inline-size;
27
- margin-block-end: var(--bf-section-space);
27
+ margin: 0;
28
28
  min-inline-size: 0;
29
29
  }
30
30
 
31
- :where(.bf-theme) :where(.bf-tab-section.is-shallow) {
32
- margin-block-end: var(--bf-section-space-shallow);
31
+ :where(.bf-theme) :where(.bf-tab-section-layout) {
32
+ display: grid;
33
+ grid-template-columns: minmax(0, 1fr);
34
+ min-inline-size: 0;
33
35
  }
34
36
 
35
- :where(.bf-theme) :where(.bf-tab-section.is-deep) {
36
- margin-block-end: var(--bf-section-space-deep);
37
+ :where(.bf-theme) :where(.bf-tab-section-rule) {
38
+ grid-column: 1 / -1;
37
39
  }
38
40
 
39
- :where(.bf-theme) :where(.bf-tab-section-layout) {
41
+ :where(.bf-theme) :where(.bf-tab-section-body) {
42
+ --bf-stack-space: var(--bf-section-space-shallow);
43
+ align-content: start;
40
44
  display: grid;
45
+ gap: var(--bf-stack-space);
41
46
  grid-template-columns: minmax(0, 1fr);
42
47
  min-inline-size: 0;
43
48
  }
44
49
 
45
- :where(.bf-theme) :where(.bf-tab-section-rule) {
46
- grid-column: 1 / -1;
50
+ :where(.bf-theme) :where(.bf-tab-section-copy) {
51
+ align-content: start;
52
+ display: grid;
53
+ grid-template-columns: minmax(0, 1fr);
54
+ min-inline-size: 0;
55
+ row-gap: var(--bf-space-1);
47
56
  }
48
57
 
49
58
  :where(.bf-theme) :where(.bf-tab-section-header, .bf-tab-section-intro, .bf-tab-section-tabs) {
@@ -51,51 +60,50 @@ export function tabSectionCss() {
51
60
  overflow-wrap: anywhere;
52
61
  }
53
62
 
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);
63
+ :where(.bf-theme) :where(.bf-tab-section-tabs) {
64
+ align-self: start;
60
65
  }
61
66
 
62
- @container bf-tab-section (width >= 64.75rem) {
63
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) {
67
+ @container bf-tab-section (width >= 45rem) {
68
+ :where(.bf-theme) :where(.bf-tab-section-body) {
64
69
  column-gap: var(--bf-grid-gap-inline);
65
70
  grid-template-columns: repeat(4, minmax(0, 1fr));
66
71
  }
67
72
 
68
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
73
+ :where(.bf-theme) :where(.bf-tab-section-copy) {
69
74
  grid-column: 1 / -1;
75
+ grid-template-columns: subgrid;
70
76
  }
71
77
 
72
78
  /* With supporting copy or actions, Vanilla's heading row is 50/50 for all
73
79
  three section layouts. The following tab rail retains its own requested
74
80
  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) {
81
+ :where(.bf-theme) :where(.bf-tab-section-copy:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-header) {
76
82
  grid-column: 1 / 3;
77
83
  }
78
84
 
79
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-intro) {
85
+ :where(.bf-theme) :where(.bf-tab-section-copy) > :where(.bf-tab-section-intro) {
80
86
  grid-column: 3 / -1;
81
87
  }
82
88
 
83
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
89
+ :where(.bf-theme) :where(.bf-tab-section-body) > :where(.bf-tab-section-tabs) {
84
90
  grid-column: 1 / -1;
85
91
  }
86
92
 
87
93
  /* An unadorned 50/50 section lets auto-placement put the heading and tabs
88
94
  in the same row. If an intro exists, it occupies that right-hand cell and
89
95
  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) {
96
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) :where(.bf-tab-section-copy:not(:has(> .bf-tab-section-intro))) {
91
97
  grid-column: 1 / 3;
98
+ grid-row: 1;
92
99
  }
93
100
 
94
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
101
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) :where(.bf-tab-section-copy:not(:has(> .bf-tab-section-intro))) + :where(.bf-tab-section-tabs) {
95
102
  grid-column: 3 / -1;
103
+ grid-row: 1;
96
104
  }
97
105
 
98
- :where(.bf-theme) :where(.bf-tab-section.is-25-75) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
106
+ :where(.bf-theme) :where(.bf-tab-section.is-25-75) :where(.bf-tab-section-body) > :where(.bf-tab-section-tabs) {
99
107
  grid-column: 2 / -1;
100
108
  }
101
109
  }
@@ -37,15 +37,16 @@ ${bodyTypeStyles} color: var(--bf-color-text-muted);
37
37
  line-height: var(--bf-table-row-line-height);
38
38
  margin: 0;
39
39
  overflow: hidden;
40
- padding-block: var(--bf-table-row-padding);
41
- padding-inline: calc(var(--bf-baseline) * 0.75);
40
+ padding-block-end: var(--bf-table-row-padding-block-end);
41
+ padding-block-start: var(--bf-table-row-padding-block-start);
42
+ padding-inline: var(--bf-component-inline-inset-field);
42
43
  text-align: left;
43
44
  text-overflow: ellipsis;
44
45
  vertical-align: top;
45
46
  }
46
47
 
47
48
  :where(.bf-theme) :where(th.is-icon-placeholder, td.is-icon-placeholder, .bf-table-cell.is-icon-placeholder) {
48
- padding-inline-start: calc((var(--bf-baseline) * 0.75) + var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
49
+ padding-inline-start: calc(var(--bf-component-inline-inset-field) + var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
49
50
  }
50
51
 
51
52
  :where(.bf-theme) :where(th.is-icon-placeholder, td.is-icon-placeholder, .bf-table-cell.is-icon-placeholder) > :where(.bf-icon:first-child) {
@@ -68,10 +69,6 @@ ${bodyMediumTypeStyles} color: var(--bf-color-text-default);
68
69
  border-block-end-color: var(--bf-color-border-low-contrast);
69
70
  }
70
71
 
71
- :where(.bf-theme) :where(tbody tr:has(.bf-status-label) > td) {
72
- padding-block: calc((var(--bf-baseline) - var(--bf-table-row-border-size)) / 2);
73
- }
74
-
75
72
  :where(.bf-theme) :where(tbody tr:hover td) {
76
73
  background: color-mix(in srgb, var(--bf-color-background-hover) 68%, transparent);
77
74
  }
@@ -2,18 +2,16 @@ export function tabsChoiceBreadcrumbsCss(options) {
2
2
  const { bodyCaseTypeStyles, bodyStrongTypeStyles, bodyTypeStyles, buttonMarginBottom, buttonPadding, } = options;
3
3
  return `:where(.bf-theme) :where(.bf-tabs) {
4
4
  display: grid;
5
+ gap: var(--bf-space-2);
5
6
  min-inline-size: 0;
6
7
  }
7
8
 
8
9
  :where(.bf-theme) :where(.bf-tabs-list) {
9
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-default);
10
+ box-shadow: inset 0 calc(var(--bf-border-width) * -1) 0 var(--bf-color-border-default);
10
11
  display: flex;
11
12
  gap: 0;
12
13
  list-style: none;
13
- /* Tabs keep their occupied block on the grid at the list boundary rather
14
- than leaving each link's control compensation between its active rule and
15
- the list rule. */
16
- margin: 0 0 calc((var(--bf-baseline) * 2) - var(--bf-border-width));
14
+ margin: 0;
17
15
  min-inline-size: 0;
18
16
  overflow-x: auto;
19
17
  padding: 0;
@@ -30,16 +28,16 @@ export function tabsChoiceBreadcrumbsCss(options) {
30
28
  ${bodyTypeStyles} align-items: center;
31
29
  background: transparent;
32
30
  border: 0;
33
- border-bottom: var(--bf-bar-thickness) solid transparent;
31
+ border-block: var(--bf-border-width) solid transparent;
34
32
  color: var(--bf-color-text-muted);
35
33
  cursor: pointer;
36
- display: inline-flex;
34
+ display: flex;
37
35
  gap: calc(var(--bf-baseline) * 0.5);
38
36
  justify-content: center;
39
37
  margin-bottom: 0;
40
- padding-block-end: calc(var(--bf-body-nudge-end) + var(--bf-baseline) - var(--bf-bar-thickness));
41
- padding-block-start: var(--bf-body-nudge-start);
42
- padding-inline: var(--bf-control-inline-padding-action);
38
+ padding-block-end: calc(var(--bf-single-line-row-padding-block) + var(--bf-single-line-row-margin-block-end));
39
+ padding-block-start: var(--bf-single-line-row-padding-block);
40
+ padding-inline: var(--bf-component-inline-inset-action);
43
41
  text-decoration: none;
44
42
  }
45
43
 
@@ -48,18 +46,22 @@ ${bodyTypeStyles} align-items: center;
48
46
  color: var(--bf-color-text-default);
49
47
  }
50
48
 
49
+ :where(.bf-theme) :where(a.bf-tabs-link:hover) {
50
+ text-decoration: none;
51
+ }
52
+
51
53
  :where(.bf-theme) :where(.bf-tabs-link:focus:not(:focus-visible)) {
52
54
  outline: none;
53
55
  }
54
56
 
55
57
  :where(.bf-theme) :where(.bf-tabs-link:focus-visible) {
56
58
  color: var(--bf-color-text-default);
57
- outline: 2px solid var(--bf-color-focus);
58
- outline-offset: -2px;
59
+ outline: 0.125rem solid var(--bf-color-focus);
60
+ outline-offset: -0.125rem;
59
61
  }
60
62
 
61
63
  :where(.bf-theme) :where(.bf-tabs-link.is-active, .bf-tabs-link[aria-selected='true']) {
62
- border-bottom-color: var(--bf-color-text-default);
64
+ box-shadow: inset 0 calc(var(--bf-bar-thickness) * -1) 0 var(--bf-color-text-default);
63
65
  color: var(--bf-color-text-default);
64
66
  }
65
67
 
@@ -111,7 +113,7 @@ ${bodyTypeStyles} align-items: center;
111
113
  grid-template-columns: auto minmax(0, 1fr) auto;
112
114
  margin: 0 0 ${buttonMarginBottom};
113
115
  min-inline-size: 0;
114
- ${buttonPadding} padding-inline: var(--bf-control-inline-padding-field);
116
+ ${buttonPadding} padding-inline: var(--bf-component-inline-inset-field);
115
117
  }
116
118
 
117
119
  :where(.bf-theme) :where(.bf-choice-row:hover) {
@@ -119,8 +121,8 @@ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-field);
119
121
  }
120
122
 
121
123
  :where(.bf-theme) :where(.bf-choice-row:has(:focus-visible)) {
122
- outline: 2px solid var(--bf-color-focus);
123
- outline-offset: -2px;
124
+ outline: 0.125rem solid var(--bf-color-focus);
125
+ outline-offset: -0.125rem;
124
126
  }
125
127
 
126
128
  :where(.bf-theme) :where(.bf-choice-row input[type='radio']) {
@@ -157,7 +159,7 @@ ${bodyTypeStyles} color: var(--bf-color-text-muted);
157
159
  gap: var(--bf-field-gap);
158
160
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
159
161
  padding-block-start: var(--bf-panel-padding-block);
160
- padding-inline: var(--bf-panel-padding-inline);
162
+ padding-inline: var(--bf-component-inline-inset-continuation);
161
163
  }
162
164
 
163
165
  :where(.bf-theme) :where(.bf-inline-options-heading) {
@@ -224,7 +226,7 @@ ${bodyTypeStyles} align-items: center;
224
226
  margin-bottom: ${buttonMarginBottom};
225
227
  max-inline-size: 100%;
226
228
  overflow: hidden;
227
- ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
229
+ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action-bordered);
228
230
  text-align: center;
229
231
  text-decoration: none;
230
232
  text-overflow: ellipsis;
@@ -250,8 +252,8 @@ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
250
252
  }
251
253
 
252
254
  :where(.bf-theme) :where(.bf-segmented-control-button:focus-visible, .bf-tab-buttons-button:focus-visible) {
253
- outline: 2px solid var(--bf-color-focus);
254
- outline-offset: -2px;
255
+ outline: 0.125rem solid var(--bf-color-focus);
256
+ outline-offset: -0.125rem;
255
257
  z-index: 2;
256
258
  }
257
259
 
@@ -280,8 +282,10 @@ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
280
282
 
281
283
  :where(.bf-theme) :where(.bf-breadcrumbs-item) {
282
284
  ${bodyCaseTypeStyles} color: var(--bf-color-text-muted);
283
- margin: 0;
285
+ margin: 0 0 var(--bf-body-margin-bottom);
284
286
  min-inline-size: 0;
287
+ padding-block-end: 0;
288
+ padding-block-start: var(--bf-body-nudge-start);
285
289
  }
286
290
 
287
291
  :where(.bf-theme) :where(.bf-breadcrumbs-item) + :where(.bf-breadcrumbs-item)::before {