baseline-foundry 0.1.7 → 0.2.1

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 (80) hide show
  1. package/README.md +22 -7
  2. package/config/canonical-spacing.resolved.json +71 -0
  3. package/config/experiments/ibm-plex-engine-smoke.json +7 -6
  4. package/config/experiments/ubuntu-engine-smoke.json +7 -6
  5. package/config/foundation-theme.json +7 -6
  6. package/config/tiers/app.json +8 -9
  7. package/config/tiers/documentation.json +7 -8
  8. package/config/tiers/editorial.json +7 -8
  9. package/config/tiers/os.json +7 -8
  10. package/dist/application-layout.js +1 -1
  11. package/dist/build.d.ts +1 -0
  12. package/dist/build.js +98 -36
  13. package/dist/css-app-tier.js +4 -46
  14. package/dist/css-component-contracts.d.ts +7 -0
  15. package/dist/css-component-contracts.js +82 -0
  16. package/dist/css-components/application-geometry.d.ts +5 -0
  17. package/dist/css-components/application-geometry.js +31 -0
  18. package/dist/css-components/article-pagination.js +6 -5
  19. package/dist/css-components/button-actions.js +68 -4
  20. package/dist/css-components/cards-options.js +2 -2
  21. package/dist/css-components/chip-badge-status.d.ts +0 -1
  22. package/dist/css-components/chip-badge-status.js +31 -16
  23. package/dist/css-components/content-card.js +11 -10
  24. package/dist/css-components/control-geometry.d.ts +12 -0
  25. package/dist/css-components/control-geometry.js +22 -0
  26. package/dist/css-components/cta-figure-aspect.js +2 -2
  27. package/dist/css-components/document-navigation.js +28 -18
  28. package/dist/css-components/editorial-content.js +1 -1
  29. package/dist/css-components/icon.js +24 -2
  30. package/dist/css-components/interactive-feedback.js +27 -14
  31. package/dist/css-components/interactive-tables.js +9 -6
  32. package/dist/css-components/legacy-navigation.js +32 -25
  33. package/dist/css-components/list-tree.js +5 -5
  34. package/dist/css-components/list.js +17 -12
  35. package/dist/css-components/logo-media.js +2 -2
  36. package/dist/css-components/navigation-geometry.d.ts +5 -0
  37. package/dist/css-components/navigation-geometry.js +30 -0
  38. package/dist/css-components/nested-controls.d.ts +8 -0
  39. package/dist/css-components/nested-controls.js +37 -0
  40. package/dist/css-components/panel.js +12 -13
  41. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  42. package/dist/css-components/search-box-and-filter.js +3 -3
  43. package/dist/css-components/sites-editorial-ports.js +8 -1
  44. package/dist/css-components/sites-foundation.js +2 -2
  45. package/dist/css-components/table.js +9 -1
  46. package/dist/css-components/tabs-choice-breadcrumbs.js +9 -9
  47. package/dist/css-components/tiered-list-equal-height-row.js +2 -2
  48. package/dist/css-components.js +98 -228
  49. package/dist/css.js +44 -1
  50. package/dist/dtcg-spacing.d.ts +40 -0
  51. package/dist/dtcg-spacing.js +163 -0
  52. package/dist/experiments/ibm-plex-engine-smoke/styles.css +550 -360
  53. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +182 -14
  54. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +91 -7
  55. package/dist/index.d.ts +1 -0
  56. package/dist/presets/app-tier/styles.css +693 -494
  57. package/dist/presets/app-tier/surfaces.json +709 -29
  58. package/dist/presets/app-tier/tokens.json +178 -8
  59. package/dist/presets/prose/styles.css +692 -486
  60. package/dist/presets/prose/surfaces.json +709 -29
  61. package/dist/presets/prose/tokens.json +177 -7
  62. package/dist/styles.css +692 -486
  63. package/dist/surfaces.json +709 -29
  64. package/dist/tiers/app/styles.css +693 -494
  65. package/dist/tiers/app/surfaces.json +709 -29
  66. package/dist/tiers/app/tokens.json +178 -8
  67. package/dist/tiers/documentation/styles.css +692 -486
  68. package/dist/tiers/documentation/surfaces.json +709 -29
  69. package/dist/tiers/documentation/tokens.json +177 -7
  70. package/dist/tiers/editorial/styles.css +692 -486
  71. package/dist/tiers/editorial/surfaces.json +709 -29
  72. package/dist/tiers/editorial/tokens.json +177 -7
  73. package/dist/tiers/os/styles.css +692 -486
  74. package/dist/tiers/os/surfaces.json +709 -29
  75. package/dist/tiers/os/tokens.json +177 -7
  76. package/dist/tokens.json +177 -7
  77. package/dist/types.d.ts +13 -13
  78. package/dist/vanilla-theme-colors.js +5 -1
  79. package/docs/publishing.md +7 -1
  80. package/package.json +1 -1
package/dist/styles.css CHANGED
@@ -36,8 +36,35 @@ html.u-baseline-grid::after {
36
36
  }
37
37
 
38
38
  :where(.bf-theme) {
39
- --bf-baseline: 0.5rem;
39
+ /* Resolved Canonical DTCG spacing; these names always retain the pinned final matrix. */
40
+ --spacing-baseline: 0.5rem;
41
+ --spacing-gap-field-block: 0.5rem;
42
+ --spacing-gap-mark-inline: 0.5rem;
43
+ --spacing-gap-group-block: 1.5rem;
44
+ --spacing-gap-pattern-block: 4rem;
45
+ --spacing-gap-region-block: 8rem;
46
+ --spacing-inset-field-inline: 0.5rem;
47
+ --spacing-inset-action-inline: 1rem;
48
+ --spacing-inset-continuation-inline: 2rem;
49
+ --spacing-inset-surface-inline: 1rem;
50
+ --spacing-inset-surface-block: 1rem;
51
+ --spacing-inset-strip-block: 4rem;
52
+ /* Temporary BF compatibility properties alias Canonical directly during
53
+ the bounded public-name deprecation window. */
54
+ --bf-baseline: var(--spacing-baseline);
55
+ --bf-field-gap: var(--spacing-gap-field-block);
56
+ --bf-leading-mark-gap: var(--spacing-gap-mark-inline);
57
+ --bf-section-space-shallow: var(--spacing-gap-group-block);
58
+ --bf-section-space: var(--spacing-gap-pattern-block);
59
+ --bf-section-space-deep: var(--spacing-gap-region-block);
60
+ --bf-component-inline-inset-field: var(--spacing-inset-field-inline);
61
+ --bf-component-inline-inset-action: var(--spacing-inset-action-inline);
62
+ --bf-component-inline-inset-continuation: var(--spacing-inset-continuation-inline);
63
+ --bf-panel-padding-inline: var(--spacing-inset-surface-inline);
64
+ --bf-panel-padding-block: var(--spacing-inset-surface-block);
65
+ --bf-strip-space: var(--spacing-inset-strip-block);
40
66
  --bf-space-0: 0rem;
67
+ --bf-inline-unit: 0.25rem;
41
68
  --bf-space-half: calc(var(--bf-baseline) / 2);
42
69
  --bf-space-1: var(--bf-baseline);
43
70
  --bf-space-2: calc(var(--bf-baseline) * 2);
@@ -50,10 +77,6 @@ html.u-baseline-grid::after {
50
77
  --bf-content-max-width: 90rem;
51
78
  --bf-content-padding-inline: 1rem;
52
79
  --bf-measure: 40rem;
53
- --bf-section-space: 4rem;
54
- --bf-section-space-shallow: 1.5rem;
55
- --bf-section-space-deep: 8rem;
56
- --bf-strip-space: 4rem;
57
80
  --bf-grid-gap-inline: 1rem;
58
81
  --bf-grid-gap-block: 1rem;
59
82
  --bf-page-margin: 1rem;
@@ -152,8 +175,35 @@ html.u-baseline-grid::after {
152
175
  }
153
176
 
154
177
  :where(.bf-theme.bf-tier-editorial) {
155
- --bf-baseline: 0.5rem;
178
+ /* Resolved Canonical DTCG spacing; these names always retain the pinned final matrix. */
179
+ --spacing-baseline: 0.5rem;
180
+ --spacing-gap-field-block: 0.5rem;
181
+ --spacing-gap-mark-inline: 0.5rem;
182
+ --spacing-gap-group-block: 1.5rem;
183
+ --spacing-gap-pattern-block: 4rem;
184
+ --spacing-gap-region-block: 8rem;
185
+ --spacing-inset-field-inline: 0.5rem;
186
+ --spacing-inset-action-inline: 1rem;
187
+ --spacing-inset-continuation-inline: 2rem;
188
+ --spacing-inset-surface-inline: 1rem;
189
+ --spacing-inset-surface-block: 1rem;
190
+ --spacing-inset-strip-block: 4rem;
191
+ /* Temporary BF compatibility properties alias Canonical directly during
192
+ the bounded public-name deprecation window. */
193
+ --bf-baseline: var(--spacing-baseline);
194
+ --bf-field-gap: var(--spacing-gap-field-block);
195
+ --bf-leading-mark-gap: var(--spacing-gap-mark-inline);
196
+ --bf-section-space-shallow: var(--spacing-gap-group-block);
197
+ --bf-section-space: var(--spacing-gap-pattern-block);
198
+ --bf-section-space-deep: var(--spacing-gap-region-block);
199
+ --bf-component-inline-inset-field: var(--spacing-inset-field-inline);
200
+ --bf-component-inline-inset-action: var(--spacing-inset-action-inline);
201
+ --bf-component-inline-inset-continuation: var(--spacing-inset-continuation-inline);
202
+ --bf-panel-padding-inline: var(--spacing-inset-surface-inline);
203
+ --bf-panel-padding-block: var(--spacing-inset-surface-block);
204
+ --bf-strip-space: var(--spacing-inset-strip-block);
156
205
  --bf-space-0: 0rem;
206
+ --bf-inline-unit: 0.25rem;
157
207
  --bf-space-half: calc(var(--bf-baseline) / 2);
158
208
  --bf-space-1: var(--bf-baseline);
159
209
  --bf-space-2: calc(var(--bf-baseline) * 2);
@@ -166,10 +216,6 @@ html.u-baseline-grid::after {
166
216
  --bf-content-max-width: 90rem;
167
217
  --bf-content-padding-inline: 1rem;
168
218
  --bf-measure: 40rem;
169
- --bf-section-space: 4rem;
170
- --bf-section-space-shallow: 1.5rem;
171
- --bf-section-space-deep: 8rem;
172
- --bf-strip-space: 4rem;
173
219
  --bf-grid-gap-inline: 1rem;
174
220
  --bf-grid-gap-block: 1rem;
175
221
  --bf-page-margin: 1rem;
@@ -268,8 +314,35 @@ html.u-baseline-grid::after {
268
314
  }
269
315
 
270
316
  :where(.bf-theme.bf-tier-documentation) {
271
- --bf-baseline: 0.25rem;
317
+ /* Resolved Canonical DTCG spacing; these names always retain the pinned final matrix. */
318
+ --spacing-baseline: 0.25rem;
319
+ --spacing-gap-field-block: 0.5rem;
320
+ --spacing-gap-mark-inline: 0.5rem;
321
+ --spacing-gap-group-block: 1.5rem;
322
+ --spacing-gap-pattern-block: 3rem;
323
+ --spacing-gap-region-block: 6rem;
324
+ --spacing-inset-field-inline: 0.5rem;
325
+ --spacing-inset-action-inline: 0.75rem;
326
+ --spacing-inset-continuation-inline: 1.5rem;
327
+ --spacing-inset-surface-inline: 1rem;
328
+ --spacing-inset-surface-block: 1rem;
329
+ --spacing-inset-strip-block: 3rem;
330
+ /* Temporary BF compatibility properties alias Canonical directly during
331
+ the bounded public-name deprecation window. */
332
+ --bf-baseline: var(--spacing-baseline);
333
+ --bf-field-gap: var(--spacing-gap-field-block);
334
+ --bf-leading-mark-gap: var(--spacing-gap-mark-inline);
335
+ --bf-section-space-shallow: var(--spacing-gap-group-block);
336
+ --bf-section-space: var(--spacing-gap-pattern-block);
337
+ --bf-section-space-deep: var(--spacing-gap-region-block);
338
+ --bf-component-inline-inset-field: var(--spacing-inset-field-inline);
339
+ --bf-component-inline-inset-action: var(--spacing-inset-action-inline);
340
+ --bf-component-inline-inset-continuation: var(--spacing-inset-continuation-inline);
341
+ --bf-panel-padding-inline: var(--spacing-inset-surface-inline);
342
+ --bf-panel-padding-block: var(--spacing-inset-surface-block);
343
+ --bf-strip-space: var(--spacing-inset-strip-block);
272
344
  --bf-space-0: 0rem;
345
+ --bf-inline-unit: 0.25rem;
273
346
  --bf-space-half: calc(var(--bf-baseline) / 2);
274
347
  --bf-space-1: var(--bf-baseline);
275
348
  --bf-space-2: calc(var(--bf-baseline) * 2);
@@ -282,10 +355,6 @@ html.u-baseline-grid::after {
282
355
  --bf-content-max-width: 80rem;
283
356
  --bf-content-padding-inline: 1.5rem;
284
357
  --bf-measure: 38rem;
285
- --bf-section-space: 3rem;
286
- --bf-section-space-shallow: 1.5rem;
287
- --bf-section-space-deep: 6rem;
288
- --bf-strip-space: 3rem;
289
358
  --bf-grid-gap-inline: 1.5rem;
290
359
  --bf-grid-gap-block: 1.5rem;
291
360
  --bf-page-margin: 1.5rem;
@@ -384,8 +453,35 @@ html.u-baseline-grid::after {
384
453
  }
385
454
 
386
455
  :where(.bf-theme.bf-tier-app) {
387
- --bf-baseline: 0.25rem;
456
+ /* Resolved Canonical DTCG spacing; these names always retain the pinned final matrix. */
457
+ --spacing-baseline: 0.25rem;
458
+ --spacing-gap-field-block: 0.5rem;
459
+ --spacing-gap-mark-inline: 0.25rem;
460
+ --spacing-gap-group-block: 0.5rem;
461
+ --spacing-gap-pattern-block: 1rem;
462
+ --spacing-gap-region-block: 2rem;
463
+ --spacing-inset-field-inline: 0.25rem;
464
+ --spacing-inset-action-inline: 0.75rem;
465
+ --spacing-inset-continuation-inline: 1.5rem;
466
+ --spacing-inset-surface-inline: 0.75rem;
467
+ --spacing-inset-surface-block: 0.75rem;
468
+ --spacing-inset-strip-block: 3rem;
469
+ /* Temporary BF compatibility properties alias Canonical directly during
470
+ the bounded public-name deprecation window. */
471
+ --bf-baseline: var(--spacing-baseline);
472
+ --bf-field-gap: var(--spacing-gap-field-block);
473
+ --bf-leading-mark-gap: var(--spacing-gap-mark-inline);
474
+ --bf-section-space-shallow: var(--spacing-gap-group-block);
475
+ --bf-section-space: var(--spacing-gap-pattern-block);
476
+ --bf-section-space-deep: var(--spacing-gap-region-block);
477
+ --bf-component-inline-inset-field: var(--spacing-inset-field-inline);
478
+ --bf-component-inline-inset-action: var(--spacing-inset-action-inline);
479
+ --bf-component-inline-inset-continuation: var(--spacing-inset-continuation-inline);
480
+ --bf-panel-padding-inline: var(--spacing-inset-surface-inline);
481
+ --bf-panel-padding-block: var(--spacing-inset-surface-block);
482
+ --bf-strip-space: var(--spacing-inset-strip-block);
388
483
  --bf-space-0: 0rem;
484
+ --bf-inline-unit: 0.25rem;
389
485
  --bf-space-half: calc(var(--bf-baseline) / 2);
390
486
  --bf-space-1: var(--bf-baseline);
391
487
  --bf-space-2: calc(var(--bf-baseline) * 2);
@@ -398,10 +494,6 @@ html.u-baseline-grid::after {
398
494
  --bf-content-max-width: 60rem;
399
495
  --bf-content-padding-inline: 1rem;
400
496
  --bf-measure: 40rem;
401
- --bf-section-space: 1rem;
402
- --bf-section-space-shallow: 0.5rem;
403
- --bf-section-space-deep: 2rem;
404
- --bf-strip-space: 3rem;
405
497
  --bf-grid-gap-inline: 1.5rem;
406
498
  --bf-grid-gap-block: 1.5rem;
407
499
  --bf-page-margin: 2rem;
@@ -500,8 +592,35 @@ html.u-baseline-grid::after {
500
592
  }
501
593
 
502
594
  :where(.bf-theme.bf-tier-os) {
503
- --bf-baseline: 0.25rem;
595
+ /* Resolved Canonical DTCG spacing; these names always retain the pinned final matrix. */
596
+ --spacing-baseline: 0.25rem;
597
+ --spacing-gap-field-block: 0.25rem;
598
+ --spacing-gap-mark-inline: 0.25rem;
599
+ --spacing-gap-group-block: 1.5rem;
600
+ --spacing-gap-pattern-block: 3rem;
601
+ --spacing-gap-region-block: 6rem;
602
+ --spacing-inset-field-inline: 0.25rem;
603
+ --spacing-inset-action-inline: 0.5rem;
604
+ --spacing-inset-continuation-inline: 1.25rem;
605
+ --spacing-inset-surface-inline: 0.5rem;
606
+ --spacing-inset-surface-block: 0.5rem;
607
+ --spacing-inset-strip-block: 2rem;
608
+ /* Temporary BF compatibility properties alias Canonical directly during
609
+ the bounded public-name deprecation window. */
610
+ --bf-baseline: var(--spacing-baseline);
611
+ --bf-field-gap: var(--spacing-gap-field-block);
612
+ --bf-leading-mark-gap: var(--spacing-gap-mark-inline);
613
+ --bf-section-space-shallow: var(--spacing-gap-group-block);
614
+ --bf-section-space: var(--spacing-gap-pattern-block);
615
+ --bf-section-space-deep: var(--spacing-gap-region-block);
616
+ --bf-component-inline-inset-field: var(--spacing-inset-field-inline);
617
+ --bf-component-inline-inset-action: var(--spacing-inset-action-inline);
618
+ --bf-component-inline-inset-continuation: var(--spacing-inset-continuation-inline);
619
+ --bf-panel-padding-inline: var(--spacing-inset-surface-inline);
620
+ --bf-panel-padding-block: var(--spacing-inset-surface-block);
621
+ --bf-strip-space: var(--spacing-inset-strip-block);
504
622
  --bf-space-0: 0rem;
623
+ --bf-inline-unit: 0.25rem;
505
624
  --bf-space-half: calc(var(--bf-baseline) / 2);
506
625
  --bf-space-1: var(--bf-baseline);
507
626
  --bf-space-2: calc(var(--bf-baseline) * 2);
@@ -514,10 +633,6 @@ html.u-baseline-grid::after {
514
633
  --bf-content-max-width: 60rem;
515
634
  --bf-content-padding-inline: 0.75rem;
516
635
  --bf-measure: 30rem;
517
- --bf-section-space: 3rem;
518
- --bf-section-space-shallow: 1.5rem;
519
- --bf-section-space-deep: 6rem;
520
- --bf-strip-space: 2rem;
521
636
  --bf-grid-gap-inline: 1rem;
522
637
  --bf-grid-gap-block: 1rem;
523
638
  --bf-page-margin: 1rem;
@@ -1223,63 +1338,109 @@ html.u-baseline-grid::after {
1223
1338
  --bf-border-width: 0.0625rem;
1224
1339
  --bf-bar-thickness: 0.1875rem;
1225
1340
  --bf-radius: 0rem;
1226
- --bf-control-block-padding: 0.5rem;
1227
- --bf-control-block-padding-compact: 0.25rem;
1228
- --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
1229
- --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
1230
- --bf-control-inline-padding: 1rem;
1231
- --bf-control-inline-padding-action: 1rem;
1232
- --bf-control-inline-padding-field: 0.5rem;
1341
+ --bf-component-inline-inset-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
1233
1342
  --bf-control-visual-size: 1rem;
1234
- --bf-field-gap: 0.5rem;
1235
- --bf-panel-padding-inline: 1rem;
1236
- --bf-panel-padding-block: 1rem;
1237
- --bf-accordion-indent: 1.5rem;
1238
- /* Action surfaces keep comfortable command targets; field surfaces can tighten independently. */
1239
- --bf-disclosure-gap: 1rem;
1240
- --bf-disclosure-icon-inline-size: 1rem;
1241
- --bf-icon-label-inline-offset: calc(var(--bf-disclosure-icon-inline-size) + var(--bf-disclosure-gap));
1242
- --bf-disclosure-label-inline-offset: var(--bf-icon-label-inline-offset);
1243
- /* Every component-owned inline start resolves to one of these three rails.
1244
- Field and action values remain tier inputs; continuation is the shared
1245
- icon/mark-to-copy line. Structural page, grid and navigation-depth offsets
1246
- are deliberately outside this component inset contract. */
1247
- --bf-component-inline-inset-field: var(--bf-control-inline-padding-field);
1248
- --bf-component-inline-inset-action: var(--bf-control-inline-padding-action);
1249
- --bf-component-inline-inset-continuation: var(--bf-disclosure-label-inline-offset);
1250
- --bf-input-block-padding: var(--bf-body-nudge-start, 0.41rem);
1251
- --bf-button-block-padding: var(--bf-body-nudge-start, 0.41rem);
1252
- /* One border-aware occupied-block contract for body-sized, single-line UI.
1253
- Components may paint their block borders differently, but their text line,
1254
- padding and trailing baseline compensation must resolve through this pair. */
1255
- --bf-single-line-row-padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
1256
- --bf-single-line-row-margin-block-end: calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-button-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
1257
- --bf-single-line-row-block-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-single-line-row-padding-block) * 2) + (var(--bf-border-width) * 2) + var(--bf-single-line-row-margin-block-end));
1258
- --bf-single-line-row-in-box-padding-block-start: var(--bf-body-nudge-start, 0.41rem);
1259
- --bf-single-line-row-in-box-padding-block-end: max(0rem, calc(var(--bf-single-line-row-block-size) - var(--bf-body-line-height, 1.5rem) - var(--bf-single-line-row-in-box-padding-block-start)));
1260
- --bf-single-line-row-visual-offset: calc(var(--bf-body-nudge-start, 0.41rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-control-visual-size)) / 2));
1261
- /* Auxiliary surfaces may opt into a host-owned nested composition. The
1262
- shorter line and capped symmetric padding fit their complete paint inside
1263
- the host body line without introducing a second row rhythm. */
1264
- --bf-nested-auxiliary-line-height: max(var(--bf-body-font-size), calc(var(--bf-body-line-height) - var(--bf-baseline)));
1265
- --bf-nested-auxiliary-padding-block: min(var(--bf-single-line-row-padding-block), max(0rem, calc((var(--bf-body-line-height) - var(--bf-nested-auxiliary-line-height)) / 2)));
1266
- --bf-slider-track-size: calc(var(--bf-baseline) * 0.25);
1267
- --bf-slider-row-block-size: var(--bf-single-line-row-block-size);
1268
- --bf-slider-track-offset: calc(var(--bf-body-nudge-start, 0.41rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-slider-track-size)) / 2));
1269
- --bf-table-row-border-size: var(--bf-border-width);
1270
- --bf-table-row-padding-block-start: var(--bf-single-line-row-in-box-padding-block-start);
1271
- --bf-table-row-block-size: var(--bf-single-line-row-block-size);
1272
- --bf-table-row-padding-block-end: max(0rem, calc(var(--bf-table-row-block-size) - var(--bf-body-line-height, 1.5rem) - var(--bf-table-row-padding-block-start) - var(--bf-table-row-border-size)));
1273
- --bf-table-row-line-height: var(--bf-body-line-height, 1.5rem);
1274
- --bf-switch-track-offset: var(--bf-single-line-row-visual-offset);
1275
- --bf-tick-box-offset: var(--bf-single-line-row-visual-offset);
1343
+ /* Three authoritative component content insets. Page margins, grid
1344
+ gutters, surface placement and navigation depth remain structural. */
1345
+
1346
+ /* Regular single-line interface rows use one metric-derived occupied block.
1347
+ Visible and transparent block borders both consume the frame slots. */
1348
+ --bf-interface-row-line-height: var(--bf-body-line-height, 1.5rem);
1349
+ --bf-interface-row-padding-block: max(0rem, calc(var(--bf-body-nudge-start, 0.41rem) - var(--bf-border-width)));
1350
+ --bf-interface-row-painted-block-size: calc(var(--bf-interface-row-line-height) + (var(--bf-interface-row-padding-block) * 2) + (var(--bf-border-width) * 2));
1351
+ --bf-interface-row-compensation-block-end: mod(calc(var(--bf-baseline) - mod(var(--bf-interface-row-painted-block-size), var(--bf-baseline))), var(--bf-baseline));
1352
+ --bf-interface-row-occupied-block-size: calc(var(--bf-interface-row-painted-block-size) + var(--bf-interface-row-compensation-block-end));
1353
+ --bf-interface-row-content-offset-block-start: calc(var(--bf-border-width) + var(--bf-interface-row-padding-block));
1354
+ --bf-interface-row-visual-offset: calc(var(--bf-interface-row-content-offset-block-start) + ((var(--bf-interface-row-line-height) - var(--bf-control-visual-size)) / 2));
1355
+
1356
+ /* Host-owned rows keep the same occupied target but absorb compensation
1357
+ inside the box. A ruled host subtracts its separator in its own module. */
1358
+ --bf-in-box-row-padding-block-start: var(--bf-interface-row-content-offset-block-start);
1359
+ --bf-in-box-row-padding-block-end: max(0rem, calc(var(--bf-interface-row-occupied-block-size) - var(--bf-interface-row-line-height) - var(--bf-in-box-row-padding-block-start)));
1360
+
1361
+ /* Nested children fit inside the host body line and contribute no external
1362
+ compensation. Zero-footprint surfaces and real two-border controls use
1363
+ the body line minus one baseline; build validation proves that this line
1364
+ can contain the font, visual and framed ledgers for every tier. */
1365
+ --bf-nested-row-line-height: calc(var(--bf-interface-row-line-height) - var(--bf-baseline));
1366
+ --bf-nested-row-padding-block: max(0rem, calc((var(--bf-interface-row-line-height) - var(--bf-nested-row-line-height)) / 2));
1367
+ --bf-nested-row-painted-block-size: calc(var(--bf-nested-row-line-height) + (var(--bf-nested-row-padding-block) * 2));
1368
+ --bf-nested-framed-row-padding-block: max(0rem, calc((var(--bf-interface-row-line-height) - var(--bf-nested-row-line-height) - (var(--bf-border-width) * 2)) / 2));
1369
+ --bf-nested-framed-row-painted-block-size: calc(var(--bf-nested-row-line-height) + (var(--bf-nested-framed-row-padding-block) * 2) + (var(--bf-border-width) * 2));
1370
+ --bf-nested-framed-row-visual-offset: calc(var(--bf-border-width) + var(--bf-nested-framed-row-padding-block) + ((var(--bf-nested-row-line-height) - var(--bf-control-visual-size)) / 2));
1371
+
1372
+ /* Block-derived members consume one inline-minimum name. The default is
1373
+ the regular framed paint; selectors below re-point the name to what each
1374
+ member actually paints, rather than to the row ledger it occupies. */
1375
+ --bf-square-block-size: var(--bf-interface-row-painted-block-size);
1376
+
1377
+ /* Leading marks are positioned backwards from the continuation copy inset;
1378
+ a mark never creates a fourth content inset. */
1276
1379
  --bf-leading-mark-size: var(--bf-control-visual-size);
1277
- --bf-leading-mark-gap: var(--bf-component-inline-inset-field);
1278
1380
  --bf-leading-mark-offset: calc(var(--bf-leading-mark-size) + var(--bf-leading-mark-gap));
1279
1381
  --bf-leading-mark-group-inset: calc(var(--bf-component-inline-inset-continuation) - var(--bf-leading-mark-offset));
1280
1382
  --bf-tick-label-offset: var(--bf-leading-mark-offset);
1383
+ }
1384
+
1385
+ :where(.bf-theme) :where(.bf-badge) {
1386
+ --bf-square-block-size: var(--bf-interface-row-line-height);
1387
+ }
1388
+
1389
+ :where(.bf-theme) :where(.bf-badge.is-nested) {
1390
+ --bf-square-block-size: var(--bf-nested-row-line-height);
1391
+ }
1392
+
1393
+ :where(.bf-theme) :where(.bf-button.is-link.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
1394
+ --bf-square-block-size: var(--bf-body-line-height);
1395
+ }
1396
+
1397
+ :where(.bf-theme) :where(.bf-notification-close) {
1398
+ --bf-square-block-size: var(--bf-notification-close-painted-block-size);
1399
+ }
1400
+
1401
+ :where(.bf-theme.bf-tier-editorial) {
1402
+ --bf-border-width: 0.0625rem;
1403
+ --bf-bar-thickness: 0.1875rem;
1404
+ --bf-radius: 0rem;
1405
+ --bf-component-inline-inset-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
1406
+ --bf-control-visual-size: 1rem;
1407
+ }
1408
+
1409
+ :where(.bf-theme.bf-tier-documentation) {
1410
+ --bf-border-width: 0.0625rem;
1411
+ --bf-bar-thickness: 0.1875rem;
1412
+ --bf-radius: 0rem;
1413
+ --bf-component-inline-inset-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
1414
+ --bf-control-visual-size: 0.875rem;
1415
+ }
1416
+
1417
+ :where(.bf-theme.bf-tier-app) {
1418
+ --bf-border-width: 0.0625rem;
1419
+ --bf-bar-thickness: 0.1875rem;
1420
+ --bf-radius: 0rem;
1421
+ --bf-component-inline-inset-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
1422
+ --bf-control-visual-size: 1rem;
1423
+ }
1424
+
1425
+ :where(.bf-theme.bf-tier-os) {
1426
+ --bf-border-width: 0.0625rem;
1427
+ --bf-bar-thickness: 0.1875rem;
1428
+ --bf-radius: 0rem;
1429
+ --bf-component-inline-inset-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
1430
+ --bf-control-visual-size: 0.75rem;
1431
+ }
1432
+
1433
+ :where(.bf-theme) {
1434
+ --bf-slider-track-size: calc(var(--bf-baseline) * 0.25);
1435
+ --bf-slider-row-block-size: var(--bf-interface-row-occupied-block-size);
1436
+ --bf-slider-track-offset: calc(var(--bf-body-nudge-start, 0.41rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-slider-track-size)) / 2));
1437
+ --bf-switch-track-offset: var(--bf-interface-row-visual-offset);
1438
+ --bf-tick-box-offset: var(--bf-interface-row-visual-offset);
1281
1439
  --bf-radio-dot-size: calc((var(--bf-control-visual-size) * 0.375) + var(--bf-border-width));
1282
1440
  --bf-list-marker-dot-size: calc(var(--bf-border-width) * 4);
1441
+ }
1442
+
1443
+ :where(.bf-theme) {
1283
1444
  --bf-app-drawer-width-icon: 2rem;
1284
1445
  --bf-app-drawer-width-small: 15rem;
1285
1446
  --bf-app-drawer-width-small-max: 20rem;
@@ -1291,22 +1452,28 @@ html.u-baseline-grid::after {
1291
1452
  --bf-app-aside-width-max: var(--bf-app-drawer-width-medium-max);
1292
1453
  --bf-app-navigation-width: 15rem;
1293
1454
  --bf-app-navigation-width-collapsed: 3rem;
1455
+ --bf-application-drawer-width-icon: var(--bf-app-drawer-width-icon);
1456
+ --bf-application-drawer-width-small: var(--bf-app-drawer-width-small);
1457
+ --bf-application-drawer-width-small-max: var(--bf-app-drawer-width-small-max);
1458
+ --bf-application-drawer-width-medium: var(--bf-app-drawer-width-medium);
1459
+ --bf-application-drawer-width-medium-max: var(--bf-app-drawer-width-medium-max);
1460
+ --bf-application-drawer-width-large: var(--bf-app-drawer-width-large);
1461
+ --bf-application-aside-width: var(--bf-app-aside-width);
1462
+ --bf-application-aside-width-min: var(--bf-app-aside-width-min);
1463
+ --bf-application-aside-width-max: var(--bf-app-aside-width-max);
1464
+ --bf-application-navigation-width: var(--bf-app-navigation-width);
1465
+ --bf-application-navigation-width-collapsed: var(--bf-app-navigation-width-collapsed);
1466
+ }
1467
+
1468
+ :where(.bf-theme) {
1469
+ --bf-disclosure-gap: var(--bf-leading-mark-gap);
1470
+ --bf-disclosure-icon-inline-size: 1rem;
1471
+ --bf-disclosure-group-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
1294
1472
  --bf-icon-label-optical-offset-block: 0.1875rem;
1295
- --bf-disclosure-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
1473
+ --bf-disclosure-icon-optical-offset-block: 0rem;
1296
1474
  --bf-side-navigation-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
1297
- --bf-side-navigation-icon-gap: 0.625rem;
1475
+ --bf-side-navigation-icon-gap: var(--bf-leading-mark-gap);
1298
1476
  --bf-navigation-bar-min-block-size: calc(var(--bf-baseline) * 6);
1299
- --bf-authoring-accent: #f6b73c;
1300
- --bf-authoring-accent-hover: #e0a030;
1301
- --bf-authoring-accent-line: rgba(246, 183, 60, 0.9);
1302
- --bf-authoring-accent-strong: rgba(246, 183, 60, 0.95);
1303
- --bf-authoring-accent-outline: rgba(246, 183, 60, 0.4);
1304
- --bf-authoring-accent-outline-strong: rgba(246, 183, 60, 0.8);
1305
- --bf-authoring-accent-shadow: rgba(246, 183, 60, 0.22);
1306
- --bf-authoring-accent-focus-ring: rgba(246, 183, 60, 0.55);
1307
- --bf-application-resize-handle-active: var(--bf-authoring-accent-strong);
1308
- --bf-application-resize-handle-focus-ring: var(--bf-authoring-accent-focus-ring);
1309
- --bf-control-inline-padding-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
1310
1477
  --bf-top-navigation-link-padding-inline: var(--bf-component-inline-inset-action);
1311
1478
  --bf-top-navigation-end-slot-inline-size: calc(1rem + var(--bf-component-inline-inset-field));
1312
1479
  --bf-top-navigation-search-toggle-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
@@ -1320,30 +1487,9 @@ html.u-baseline-grid::after {
1320
1487
  --bf-top-navigation-logo-icon-optical-offset-inline: -0.0125rem;
1321
1488
  --bf-navigation-brand-line-center-block: calc(var(--bf-top-navigation-logo-tag-block-size) - var(--bf-top-navigation-logo-icon-bottom-offset) - (var(--bf-top-navigation-logo-icon-size) / 2));
1322
1489
  --bf-navigation-brand-block-size: calc(var(--bf-navigation-brand-line-center-block) * 2);
1323
- --bf-icon-size-default: 1rem;
1324
- --bf-icon-size-medium: 2.5rem;
1325
- --bf-icon-size-large: 4rem;
1326
- --bf-icon-size-x-large: 4.5rem;
1327
- --bf-icon-size-xx-large: 6rem;
1328
- --bf-leading-icon-size: var(--bf-leading-mark-size);
1329
- --bf-leading-icon-gap: var(--bf-leading-mark-gap);
1330
- --bf-leading-icon-offset: var(--bf-single-line-row-visual-offset);
1331
- --bf-ui-chip-padding-inline: var(--bf-component-inline-inset-field);
1332
- --bf-ui-chip-radius: 999rem;
1333
- --bf-ui-badge-padding-inline: calc(var(--bf-body-line-height, 1.5rem) * 0.25);
1334
- --bf-ui-badge-overhang: calc(var(--bf-ui-badge-padding-inline) * -0.75);
1335
- --bf-grid-max-inline-size: var(--bf-content-max-width);
1336
- --bf-application-drawer-width-icon: var(--bf-app-drawer-width-icon);
1337
- --bf-application-drawer-width-small: var(--bf-app-drawer-width-small);
1338
- --bf-application-drawer-width-small-max: var(--bf-app-drawer-width-small-max);
1339
- --bf-application-drawer-width-medium: var(--bf-app-drawer-width-medium);
1340
- --bf-application-drawer-width-medium-max: var(--bf-app-drawer-width-medium-max);
1341
- --bf-application-drawer-width-large: var(--bf-app-drawer-width-large);
1342
- --bf-application-aside-width: var(--bf-app-aside-width);
1343
- --bf-application-aside-width-min: var(--bf-app-aside-width-min);
1344
- --bf-application-aside-width-max: var(--bf-app-aside-width-max);
1345
- --bf-application-navigation-width: var(--bf-app-navigation-width);
1346
- --bf-application-navigation-width-collapsed: var(--bf-app-navigation-width-collapsed);
1490
+ }
1491
+
1492
+ :where(.bf-theme) {
1347
1493
  --bf-color-text-default: var(--vf-color-text-default, var(--bf-color-text, #000000));
1348
1494
  --bf-color-text-muted: var(--vf-color-text-muted, var(--bf-color-muted, rgba(0, 0, 0, 0.6)));
1349
1495
  --bf-color-text-inactive: var(--vf-color-text-inactive, rgba(0, 0, 0, 0.75));
@@ -1390,9 +1536,10 @@ html.u-baseline-grid::after {
1390
1536
  --bf-color-accent: var(--vf-color-accent, #0f95a1);
1391
1537
  --bf-color-brand: var(--vf-color-brand, #e95420);
1392
1538
  --bf-color-focus: var(--vf-color-focus, #2e96ff);
1539
+ --bf-application-resize-handle-active: rgba(246, 183, 60, 0.95);
1540
+ --bf-application-resize-handle-focus-ring: rgba(246, 183, 60, 0.55);
1393
1541
 
1394
1542
  --bf-ui-icon-chevron-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.25 6.25 8 10l3.75-3.75'/%3E%3C/svg%3E");
1395
- --bf-ui-icon-number-stepper: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23000' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.25 5.75 8 2l3.75 3.75M4.25 10.25 8 14l3.75-3.75'/%3E%3C/svg%3E");
1396
1543
  --bf-ui-icon-close: url("data:image/svg+xml,%3Csvg width='16' height='16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.25 4.25 11.75 11.75M11.75 4.25 4.25 11.75' fill='none' stroke='%23111' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E");
1397
1544
  --bf-ui-icon-error-grey: url("data:image/svg+xml,%3Csvg width='16' height='16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 1.52588e-05C12.4183 1.52588e-05 16 3.58174 16 8.00002C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8.00002C0 3.58174 3.58172 1.52588e-05 8 1.52588e-05ZM10.2821 4.63808L11.3427 5.69874L9.05007 7.99008L11.3427 10.2821L10.2821 11.3427L7.99007 9.05008L5.69873 11.3427L4.63807 10.2821L6.92907 7.99008L4.63807 5.69874L5.69873 4.63808L7.99007 6.92908L10.2821 4.63808ZM1.5 8.00002C1.5 4.41016 4.41015 1.50002 8 1.50002C11.5899 1.50002 14.5 4.41016 14.5 8.00002C14.5 11.5899 11.5899 14.5 8 14.5C4.41015 14.5 1.5 11.5899 1.5 8.00002Z' fill='%23111' fill-rule='evenodd'/%3E%3C/svg%3E");
1398
1545
  --bf-ui-icon-search: url("data:image/svg+xml,%3Csvg width='16' height='16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.964 1a5.964 5.964 0 014.709 9.623l4.303 4.305-1.06 1.06-4.306-4.305A5.964 5.964 0 116.963 1zm0 1.5a4.464 4.464 0 100 8.927 4.464 4.464 0 000-8.927z' fill='%23111' fill-rule='nonzero'/%3E%3C/svg%3E");
@@ -1413,94 +1560,9 @@ html.u-baseline-grid::after {
1413
1560
  }
1414
1561
 
1415
1562
  :where(.bf-theme.bf-engine-cap) :where(.bf-input, input[type='text'], input[type='number'], input[type='search'], input[type='password'], input[type='email'], input[type='url'], textarea, select) {
1416
- margin-bottom: calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-input-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
1417
- }
1418
-
1419
- :where(.bf-theme.bf-tier-editorial) {
1420
- --bf-input-block-padding: 0.41rem;
1421
- --bf-button-block-padding: 0.41rem;
1422
- --bf-border-width: 0.0625rem;
1423
- --bf-bar-thickness: 0.1875rem;
1424
- --bf-radius: 0rem;
1425
- --bf-control-block-padding: 0.5rem;
1426
- --bf-control-block-padding-compact: 0.25rem;
1427
- --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
1428
- --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
1429
- --bf-control-inline-padding: 1rem;
1430
- --bf-control-inline-padding-action: 1rem;
1431
- --bf-control-inline-padding-field: 0.5rem;
1432
- --bf-control-visual-size: 1rem;
1433
- --bf-field-gap: 0.5rem;
1434
- --bf-panel-padding-inline: 1rem;
1435
- --bf-panel-padding-block: 1rem;
1436
- --bf-accordion-indent: 1.5rem;
1437
-
1563
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1438
1564
  }
1439
1565
 
1440
- :where(.bf-theme.bf-tier-documentation) {
1441
- --bf-input-block-padding: 0.0775rem;
1442
- --bf-button-block-padding: 0.0775rem;
1443
- --bf-border-width: 0.0625rem;
1444
- --bf-bar-thickness: 0.1875rem;
1445
- --bf-radius: 0rem;
1446
- --bf-control-block-padding: 0.5rem;
1447
- --bf-control-block-padding-compact: 0.375rem;
1448
- --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
1449
- --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
1450
- --bf-control-inline-padding: 1rem;
1451
- --bf-control-inline-padding-action: 1rem;
1452
- --bf-control-inline-padding-field: 0.5rem;
1453
- --bf-control-visual-size: 0.875rem;
1454
- --bf-field-gap: 0.5rem;
1455
- --bf-panel-padding-inline: 1rem;
1456
- --bf-panel-padding-block: 1rem;
1457
- --bf-accordion-indent: 1.5rem;
1458
-
1459
- }
1460
-
1461
- :where(.bf-theme.bf-tier-app) {
1462
- --bf-input-block-padding: 0.0775rem;
1463
- --bf-button-block-padding: 0.0775rem;
1464
- --bf-border-width: 0.0625rem;
1465
- --bf-bar-thickness: 0.1875rem;
1466
- --bf-radius: 0.125rem;
1467
- --bf-control-block-padding: 0.5rem;
1468
- --bf-control-block-padding-compact: 0.375rem;
1469
- --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
1470
- --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
1471
- --bf-control-inline-padding: 1rem;
1472
- --bf-control-inline-padding-action: 1rem;
1473
- --bf-control-inline-padding-field: 0.25rem;
1474
- --bf-control-visual-size: 1rem;
1475
- --bf-field-gap: 0.5rem;
1476
- --bf-panel-padding-inline: 0.75rem;
1477
- --bf-panel-padding-block: 0.75rem;
1478
- --bf-accordion-indent: 1.5rem;
1479
-
1480
- }
1481
-
1482
- :where(.bf-theme.bf-tier-os) {
1483
- --bf-input-block-padding: 0.245rem;
1484
- --bf-button-block-padding: 0.245rem;
1485
- --bf-border-width: 0.0625rem;
1486
- --bf-bar-thickness: 0.1875rem;
1487
- --bf-radius: 0rem;
1488
- --bf-control-block-padding: 0.375rem;
1489
- --bf-control-block-padding-compact: 0.25rem;
1490
- --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
1491
- --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
1492
- --bf-control-inline-padding: 1rem;
1493
- --bf-control-inline-padding-action: 1rem;
1494
- --bf-control-inline-padding-field: 0.25rem;
1495
- --bf-control-visual-size: 0.75rem;
1496
- --bf-field-gap: 0.25rem;
1497
- --bf-panel-padding-inline: 0.5rem;
1498
- --bf-panel-padding-block: 0.5rem;
1499
- --bf-accordion-indent: 0.75rem;
1500
-
1501
- }
1502
-
1503
-
1504
1566
  :where(.bf-theme.is-dark) {
1505
1567
  --bf-color-text-default: var(--vf-color-text-default, var(--bf-color-text, #ffffff));
1506
1568
  --bf-color-text-muted: var(--vf-color-text-muted, var(--bf-color-muted, rgba(255, 255, 255, 0.6)));
@@ -1548,9 +1610,10 @@ html.u-baseline-grid::after {
1548
1610
  --bf-color-accent: var(--vf-color-accent, #70bbc2);
1549
1611
  --bf-color-brand: var(--vf-color-brand, #e95420);
1550
1612
  --bf-color-focus: var(--vf-color-focus, #99ccff);
1613
+ --bf-application-resize-handle-active: rgba(246, 183, 60, 0.95);
1614
+ --bf-application-resize-handle-focus-ring: rgba(246, 183, 60, 0.55);
1551
1615
 
1552
1616
  --bf-ui-icon-chevron-down: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.25 6.25 8 10l3.75-3.75'/%3E%3C/svg%3E");
1553
- --bf-ui-icon-number-stepper: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.25 5.75 8 2l3.75 3.75M4.25 10.25 8 14l3.75-3.75'/%3E%3C/svg%3E");
1554
1617
  --bf-ui-icon-close: url("data:image/svg+xml,%3Csvg width='16' height='16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4.25 4.25 11.75 11.75M11.75 4.25 4.25 11.75' fill='none' stroke='%23fff' stroke-width='1.5' stroke-linecap='round'/%3E%3C/svg%3E");
1555
1618
  --bf-ui-icon-error-grey: url("data:image/svg+xml,%3Csvg width='16' height='16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 1.52588e-05C12.4183 1.52588e-05 16 3.58174 16 8.00002C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8.00002C0 3.58174 3.58172 1.52588e-05 8 1.52588e-05ZM10.2821 4.63808L11.3427 5.69874L9.05007 7.99008L11.3427 10.2821L10.2821 11.3427L7.99007 9.05008L5.69873 11.3427L4.63807 10.2821L6.92907 7.99008L4.63807 5.69874L5.69873 4.63808L7.99007 6.92908L10.2821 4.63808ZM1.5 8.00002C1.5 4.41016 4.41015 1.50002 8 1.50002C11.5899 1.50002 14.5 4.41016 14.5 8.00002C14.5 11.5899 11.5899 14.5 8 14.5C4.41015 14.5 1.5 11.5899 1.5 8.00002Z' fill='%23fff' fill-rule='evenodd'/%3E%3C/svg%3E");
1556
1619
  --bf-ui-icon-search: url("data:image/svg+xml,%3Csvg width='16' height='16' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6.964 1a5.964 5.964 0 014.709 9.623l4.303 4.305-1.06 1.06-4.306-4.305A5.964 5.964 0 116.963 1zm0 1.5a4.464 4.464 0 100 8.927 4.464 4.464 0 000-8.927z' fill='%23fff' fill-rule='nonzero'/%3E%3C/svg%3E");
@@ -1621,7 +1684,7 @@ html.u-baseline-grid::after {
1621
1684
 
1622
1685
  :where(.bf-theme) :where(.bf-field.is-range) {
1623
1686
  align-items: start;
1624
- column-gap: calc(var(--bf-baseline) * 2);
1687
+ column-gap: var(--bf-component-inline-inset-field);
1625
1688
  display: grid;
1626
1689
  grid-template-columns: max-content minmax(0, 1fr);
1627
1690
  row-gap: var(--bf-field-gap);
@@ -1665,13 +1728,13 @@ html.u-baseline-grid::after {
1665
1728
  margin: 0;
1666
1729
  min-inline-size: 0;
1667
1730
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
1668
- padding-inline: var(--bf-component-inline-inset-continuation);
1731
+ padding-inline: var(--bf-panel-padding-inline);
1669
1732
  padding-block-start: var(--bf-panel-padding-block);
1670
1733
  }
1671
1734
 
1672
1735
  :where(.bf-theme) :where(fieldset, .bf-fieldset) > :where(legend, .bf-legend) {
1673
1736
  margin-bottom: 0;
1674
- padding-inline: calc(var(--bf-baseline) * 0.5);
1737
+ padding-inline: var(--bf-inline-unit);
1675
1738
  }
1676
1739
 
1677
1740
  :where(.bf-theme) :where(.bf-input, input[type='text'], input[type='number'], input[type='search'], input[type='password'], input[type='email'], input[type='url'], textarea, select) {
@@ -1690,8 +1753,8 @@ html.u-baseline-grid::after {
1690
1753
  inline-size: 100%;
1691
1754
  max-inline-size: 100%;
1692
1755
  min-inline-size: 0;
1693
- margin-bottom: calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-input-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
1694
- padding-block: max(0rem, calc(var(--bf-input-block-padding) - var(--bf-border-width)));
1756
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1757
+ padding-block: var(--bf-interface-row-padding-block);
1695
1758
  padding-inline: var(--bf-component-inline-inset-field);
1696
1759
  }
1697
1760
 
@@ -1709,8 +1772,8 @@ html.u-baseline-grid::after {
1709
1772
  content: "\00a0";
1710
1773
  grid-area: color-control;
1711
1774
  line-height: var(--bf-body-line-height);
1712
- margin-bottom: var(--bf-single-line-row-margin-block-end);
1713
- padding-block: var(--bf-single-line-row-padding-block);
1775
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1776
+ padding-block: var(--bf-interface-row-padding-block);
1714
1777
  visibility: hidden;
1715
1778
  }
1716
1779
 
@@ -1719,7 +1782,7 @@ html.u-baseline-grid::after {
1719
1782
  block-size: auto;
1720
1783
  grid-area: color-control;
1721
1784
  inline-size: 100%;
1722
- margin-bottom: var(--bf-single-line-row-margin-block-end);
1785
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1723
1786
  min-block-size: 0;
1724
1787
  padding: var(--bf-border-width);
1725
1788
  }
@@ -1750,7 +1813,7 @@ html.u-baseline-grid::after {
1750
1813
 
1751
1814
  :where(.bf-theme) :where(textarea) {
1752
1815
  block-size: auto;
1753
- min-block-size: calc(var(--bf-control-box-size) * 2);
1816
+ min-block-size: calc((var(--bf-interface-row-occupied-block-size) * 2) - var(--bf-interface-row-compensation-block-end));
1754
1817
  resize: vertical;
1755
1818
  }
1756
1819
 
@@ -1764,7 +1827,7 @@ html.u-baseline-grid::after {
1764
1827
  border: 0 solid transparent;
1765
1828
  box-shadow: inset 0 calc(var(--bf-border-width) * -1) 0 var(--bf-color-border-default);
1766
1829
  color: var(--bf-color-text-default);
1767
- margin-bottom: calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-input-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
1830
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1768
1831
  max-inline-size: 100%;
1769
1832
  min-inline-size: 0;
1770
1833
  padding-block: 0;
@@ -1786,8 +1849,8 @@ html.u-baseline-grid::after {
1786
1849
  cursor: pointer;
1787
1850
  margin-inline-end: var(--bf-field-gap);
1788
1851
  min-block-size: 0;
1789
- padding-block: var(--bf-single-line-row-padding-block);
1790
- padding-inline: var(--bf-control-inline-padding-action-bordered);
1852
+ padding-block: var(--bf-interface-row-padding-block);
1853
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
1791
1854
  }
1792
1855
 
1793
1856
  :where(.bf-theme) :where(input[type='file'])::file-selector-button:hover {
@@ -1800,7 +1863,7 @@ html.u-baseline-grid::after {
1800
1863
  background-repeat: no-repeat;
1801
1864
  background-size: 1rem 1rem;
1802
1865
  overflow: hidden;
1803
- padding-inline-end: calc(var(--bf-component-inline-inset-field) * 2.5);
1866
+ padding-inline-end: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
1804
1867
  text-overflow: ellipsis;
1805
1868
  white-space: nowrap;
1806
1869
  }
@@ -1809,16 +1872,14 @@ html.u-baseline-grid::after {
1809
1872
  font-variant-numeric: tabular-nums;
1810
1873
  }
1811
1874
 
1812
- /* Number fields retain their native input semantics and keyboard stepping,
1813
- while one field-owned background paints the compact pair. Sharing select's
1814
- 1rem canvas and end position avoids a second browser-reserved spin slot. */
1875
+ /* Keep the browser-owned number stepper. A painted replacement cannot expose
1876
+ the native pointer targets, min/max handling, or platform accessibility. */
1815
1877
  :where(.bf-theme) :where(input[type='number']) {
1816
- appearance: textfield;
1817
- background-image: var(--bf-ui-icon-number-stepper);
1818
- background-position: right var(--bf-component-inline-inset-field) center;
1819
- background-repeat: no-repeat;
1820
- background-size: 1rem 1rem;
1821
- padding-inline-end: calc(var(--bf-component-inline-inset-field) * 2.5);
1878
+ appearance: auto;
1879
+ }
1880
+
1881
+ :where(.bf-theme) :where(select:dir(rtl)) {
1882
+ background-position: left var(--bf-component-inline-inset-field) center;
1822
1883
  }
1823
1884
 
1824
1885
  :where(.bf-theme) :where(.bf-slider-input) {
@@ -1830,12 +1891,6 @@ html.u-baseline-grid::after {
1830
1891
  text-align: right;
1831
1892
  }
1832
1893
 
1833
- :where(.bf-theme) :where(input[type='number'])::-webkit-inner-spin-button,
1834
- :where(.bf-theme) :where(input[type='number'])::-webkit-outer-spin-button {
1835
- appearance: none;
1836
- margin: 0;
1837
- }
1838
-
1839
1894
  :where(.bf-theme) :where(.bf-checkbox, .bf-radio) {
1840
1895
  display: grid;
1841
1896
  margin: 0;
@@ -1863,8 +1918,8 @@ html.u-baseline-grid::after {
1863
1918
  border-block: var(--bf-border-width) solid transparent;
1864
1919
  cursor: pointer;
1865
1920
  display: block;
1866
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
1867
- padding-block: var(--bf-single-line-row-padding-block);
1921
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
1922
+ padding-block: var(--bf-interface-row-padding-block);
1868
1923
  padding-inline-start: var(--bf-tick-label-offset);
1869
1924
  position: relative;
1870
1925
  }
@@ -2012,8 +2067,8 @@ html.u-baseline-grid::after {
2012
2067
  border-block: var(--bf-border-width) solid transparent;
2013
2068
  cursor: pointer;
2014
2069
  display: inline-block;
2015
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
2016
- padding-block: var(--bf-single-line-row-padding-block);
2070
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
2071
+ padding-block: var(--bf-interface-row-padding-block);
2017
2072
  }
2018
2073
 
2019
2074
  :where(.bf-theme) :where(.bf-validation-message) {
@@ -2024,9 +2079,9 @@ html.u-baseline-grid::after {
2024
2079
  line-height: var(--bf-body-line-height, 1.5rem);
2025
2080
  border-block: var(--bf-border-width) solid transparent;
2026
2081
  color: var(--bf-color-text-muted);
2027
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
2082
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
2028
2083
  margin-inline-start: var(--bf-leading-mark-group-inset);
2029
- padding-block: var(--bf-single-line-row-padding-block);
2084
+ padding-block: var(--bf-interface-row-padding-block);
2030
2085
  padding-inline-start: var(--bf-leading-mark-offset);
2031
2086
  position: relative;
2032
2087
  }
@@ -2209,6 +2264,23 @@ html.u-baseline-grid::after {
2209
2264
  outline: calc(var(--bf-baseline) * 0.25) solid var(--bf-color-focus);
2210
2265
  }
2211
2266
 
2267
+ :where(.bf-theme) {
2268
+ --bf-icon-size-default: 1rem;
2269
+ --bf-icon-size-medium: 2.5rem;
2270
+ --bf-icon-size-large: 4rem;
2271
+ --bf-icon-size-x-large: 4.5rem;
2272
+ --bf-icon-size-xx-large: 6rem;
2273
+ /* Vanilla's inline-icon metric aligns icon paint to the cap-height centre.
2274
+ Half the scalable border supplies the optical lift. */
2275
+ --bf-inline-icon-baseline-shift: calc((var(--bf-border-width) * 0.5) + ((1cap - var(--bf-icon-size-default)) / 2));
2276
+ /* The default icon can meet the compact body line at a raster edge. Trim its
2277
+ layout margin by one scalable border without moving its cap-centred paint. */
2278
+ --bf-inline-icon-line-box-trim: calc(var(--bf-border-width) * -1);
2279
+ --bf-leading-icon-size: var(--bf-leading-mark-size);
2280
+ --bf-leading-icon-gap: var(--bf-leading-mark-gap);
2281
+ --bf-leading-icon-offset: var(--bf-interface-row-visual-offset);
2282
+ }
2283
+
2212
2284
  :where(.bf-theme) :where(.bf-icon) {
2213
2285
  --bf-icon-image: none;
2214
2286
  --bf-icon-size: var(--bf-icon-size-default);
@@ -2222,29 +2294,34 @@ html.u-baseline-grid::after {
2222
2294
  flex: 0 0 auto;
2223
2295
  inline-size: var(--bf-icon-size);
2224
2296
  margin: 0;
2297
+ margin-block-start: var(--bf-inline-icon-line-box-trim);
2225
2298
  overflow: hidden;
2226
2299
  padding: 0;
2227
2300
  text-indent: 110vw;
2228
2301
  transform: var(--bf-icon-transform);
2229
2302
  transform-origin: center;
2230
- vertical-align: bottom;
2303
+ vertical-align: calc(var(--bf-inline-icon-baseline-shift) + ((var(--bf-icon-size-default) - var(--bf-icon-size)) / 2));
2231
2304
  white-space: nowrap;
2232
2305
  }
2233
2306
 
2234
2307
  :where(.bf-theme) :where(.bf-icon.is-medium) {
2235
2308
  --bf-icon-size: var(--bf-icon-size-medium);
2309
+ --bf-inline-icon-line-box-trim: 0rem;
2236
2310
  }
2237
2311
 
2238
2312
  :where(.bf-theme) :where(.bf-icon.is-large) {
2239
2313
  --bf-icon-size: var(--bf-icon-size-large);
2314
+ --bf-inline-icon-line-box-trim: 0rem;
2240
2315
  }
2241
2316
 
2242
2317
  :where(.bf-theme) :where(.bf-icon.is-x-large) {
2243
2318
  --bf-icon-size: var(--bf-icon-size-x-large);
2319
+ --bf-inline-icon-line-box-trim: 0rem;
2244
2320
  }
2245
2321
 
2246
2322
  :where(.bf-theme) :where(.bf-icon.is-xx-large) {
2247
2323
  --bf-icon-size: var(--bf-icon-size-xx-large);
2324
+ --bf-inline-icon-line-box-trim: 0rem;
2248
2325
  }
2249
2326
 
2250
2327
  :where(.bf-theme) :where(.bf-icon.is-search) {
@@ -2296,9 +2373,9 @@ html.u-baseline-grid::after {
2296
2373
  color: var(--bf-color-text-default);
2297
2374
  cursor: pointer;
2298
2375
  display: inline-block;
2299
- margin-bottom: var(--bf-single-line-row-margin-block-end);
2300
- padding-block: var(--bf-single-line-row-padding-block);
2301
- padding-inline: var(--bf-control-inline-padding-action-bordered);
2376
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
2377
+ padding-block: var(--bf-interface-row-padding-block);
2378
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
2302
2379
  text-align: center;
2303
2380
  text-decoration: none;
2304
2381
  }
@@ -2427,7 +2504,7 @@ html.u-baseline-grid::after {
2427
2504
 
2428
2505
  :where(.bf-theme) :where(.bf-button.is-icon) {
2429
2506
  align-items: center;
2430
- column-gap: var(--bf-space-1);
2507
+ column-gap: var(--bf-leading-mark-gap);
2431
2508
  display: inline-flex;
2432
2509
  justify-content: center;
2433
2510
  }
@@ -2435,21 +2512,44 @@ html.u-baseline-grid::after {
2435
2512
  /* An icon-only flex button has no text line box to preserve the occupied
2436
2513
  * control rhythm. A zero-width metric strut restores the active body line
2437
2514
  * without imposing a target block size or changing icon/label spacing. */
2438
- :where(.bf-theme) :where(.bf-button.is-icon:not(:has(.bf-button-label))) {
2515
+ :where(.bf-theme) :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
2516
+ --bf-action-target-overflow: max(0rem, calc((24px - var(--bf-square-block-size)) / 2));
2517
+
2439
2518
  column-gap: 0;
2519
+ justify-self: start;
2520
+ margin-inline: var(--bf-action-target-overflow);
2521
+ min-inline-size: var(--bf-square-block-size);
2522
+ padding-inline: 0;
2523
+ position: relative;
2440
2524
  }
2441
2525
 
2442
- :where(.bf-theme) :where(.bf-button.is-icon:not(:has(.bf-button-label)))::before {
2526
+ :where(.bf-theme) :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label)))::before {
2443
2527
  block-size: var(--bf-body-line-height);
2444
2528
  content: "";
2445
2529
  inline-size: 0;
2446
2530
  }
2447
2531
 
2532
+ /* WCAG 2.2 SC 2.5.8 defines its minimum in CSS pixels. This transparent,
2533
+ * out-of-flow box extends only the pointer target; it does not change the
2534
+ * control's paint or occupied block geometry. */
2535
+ :where(.bf-theme) :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label)))::after {
2536
+ block-size: max(100%, 24px);
2537
+ content: "";
2538
+ inline-size: max(100%, 24px);
2539
+ left: 50%;
2540
+ pointer-events: auto;
2541
+ position: absolute;
2542
+ top: 50%;
2543
+ translate: -50% -50%;
2544
+ }
2545
+
2448
2546
  :where(.bf-theme) :where(.bf-button-label) {
2449
2547
  min-inline-size: 0;
2450
2548
  }
2451
2549
 
2452
2550
  :where(.bf-theme) :where(.bf-actions) {
2551
+ --bf-action-target-row-gap-floor: var(--bf-baseline);
2552
+
2453
2553
  align-items: center;
2454
2554
  display: flex;
2455
2555
  flex-wrap: wrap;
@@ -2457,6 +2557,19 @@ html.u-baseline-grid::after {
2457
2557
  min-inline-size: 0;
2458
2558
  }
2459
2559
 
2560
+ /* Row-gap has no single-line cost and cannot move a flex item's paint. BF's
2561
+ * wrapping primitives therefore own a positive block-axis target separation
2562
+ * without inspecting their descendants through :has(). */
2563
+ :where(.bf-theme) :where(.bf-actions:not(.is-nowrap)) {
2564
+ row-gap: max(var(--bf-field-gap), var(--bf-action-target-row-gap-floor));
2565
+ }
2566
+
2567
+ :where(.bf-theme) :where(.bf-cluster:not(.is-nowrap)) {
2568
+ --bf-action-target-row-gap-floor: var(--bf-baseline);
2569
+
2570
+ row-gap: max(var(--bf-cluster-space), var(--bf-action-target-row-gap-floor));
2571
+ }
2572
+
2460
2573
  :where(.bf-theme) :where(.bf-actions.is-end) {
2461
2574
  justify-content: flex-end;
2462
2575
  }
@@ -2467,11 +2580,64 @@ html.u-baseline-grid::after {
2467
2580
  scrollbar-width: thin;
2468
2581
  }
2469
2582
 
2583
+ /* A nowrap row becomes a clipping scrollport. Only direct icon-only targets
2584
+ * reserve their own block overflow, so text-only strips keep their original
2585
+ * block size and leading keyline. Existing target-owned inline margins supply
2586
+ * the corresponding logical-edge scroll extent. */
2587
+ :where(.bf-theme) :where(.bf-actions.is-nowrap) > :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
2588
+ --bf-action-target-block-clearance: var(--bf-baseline);
2589
+
2590
+ margin-block-end: calc(var(--bf-action-target-block-clearance) + var(--bf-interface-row-compensation-block-end));
2591
+ margin-block-start: var(--bf-action-target-block-clearance);
2592
+ }
2593
+
2594
+ :where(.bf-theme) :where(.bf-actions.is-nowrap) > :where(.bf-button.is-link.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
2595
+ margin-block-end: var(--bf-action-target-block-clearance);
2596
+ }
2597
+
2598
+ /* Modern CSS rounds the exact inter-row and per-edge scrollport shortfalls up
2599
+ * to the active baseline. The one-baseline fallback is safe for built-in tiers
2600
+ * and remains on phase in older engines. */
2601
+ @supports (row-gap: round(up, 0.0625rem, 0.0625rem)) {
2602
+ :where(.bf-theme) :where(.bf-actions:not(.is-nowrap), .bf-cluster:not(.is-nowrap)) {
2603
+ --bf-action-target-row-gap-floor: round(up, max(0rem, calc(24px - var(--bf-body-line-height) + var(--bf-border-width))), var(--bf-baseline));
2604
+ }
2605
+
2606
+ :where(.bf-theme) :where(.bf-actions.is-nowrap) > :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
2607
+ --bf-action-target-block-clearance: round(up, max(0rem, calc((24px - var(--bf-body-line-height)) / 2)), var(--bf-baseline));
2608
+ }
2609
+ }
2610
+
2470
2611
  :where(.bf-theme) :where(.bf-actions.is-nowrap) > * {
2471
2612
  flex: 0 0 auto;
2472
2613
  }
2473
2614
 
2474
2615
 
2616
+ :where(.bf-theme) :where(input.bf-input.is-nested:not([type]), input.bf-input.is-nested[type='text'], input.bf-input.is-nested[type='number'], input.bf-input.is-nested[type='search'], input.bf-input.is-nested[type='password'], input.bf-input.is-nested[type='email'], input.bf-input.is-nested[type='url'], input.bf-input.is-nested[type='tel'], select.bf-input.is-nested, .bf-button.is-nested:not(.is-link)) {
2617
+ line-height: var(--bf-nested-row-line-height);
2618
+ margin-block: 0;
2619
+ padding-block: var(--bf-nested-framed-row-padding-block);
2620
+ }
2621
+
2622
+ /* Replaced textual controls retain a browser-owned intrinsic block floor even
2623
+ after their line and padding adopt the nested contract. This derived size is the exact
2624
+ sum of that same line, padding and real borders; it is not a density target
2625
+ independent of the active tier. */
2626
+ :where(.bf-theme) :where(input.bf-input.is-nested:not([type]), input.bf-input.is-nested[type='text'], input.bf-input.is-nested[type='number'], input.bf-input.is-nested[type='search'], input.bf-input.is-nested[type='password'], input.bf-input.is-nested[type='email'], input.bf-input.is-nested[type='url'], input.bf-input.is-nested[type='tel'], select.bf-input.is-nested) {
2627
+ block-size: var(--bf-nested-framed-row-painted-block-size);
2628
+ }
2629
+
2630
+ :where(.bf-theme) :where(.bf-checkbox.is-nested, .bf-radio.is-nested) {
2631
+ --bf-tick-box-offset: var(--bf-nested-framed-row-visual-offset);
2632
+ }
2633
+
2634
+ :where(.bf-theme) :where(.bf-checkbox.is-nested > .bf-checkbox-label, .bf-radio.is-nested > .bf-radio-label) {
2635
+ line-height: var(--bf-nested-row-line-height);
2636
+ margin-block: 0;
2637
+ padding-block: var(--bf-nested-framed-row-padding-block);
2638
+ }
2639
+
2640
+
2475
2641
  /* ------------------------------------------------------------------ */
2476
2642
  /* CTA block (Vanilla parity). */
2477
2643
  /* Inline-row of call-to-action items (typically a heading and one or */
@@ -2484,7 +2650,7 @@ html.u-baseline-grid::after {
2484
2650
 
2485
2651
  :where(.bf-theme) :where(.bf-cta-block) {
2486
2652
  align-items: baseline;
2487
- column-gap: var(--bf-space-2);
2653
+ column-gap: var(--bf-component-inline-inset-action);
2488
2654
  display: flex;
2489
2655
  flex-wrap: wrap;
2490
2656
  margin-block-end: 0;
@@ -2521,7 +2687,7 @@ html.u-baseline-grid::after {
2521
2687
  :where(.bf-theme) :where(.bf-figure.is-light-inset) > :where(img, picture, video, canvas, svg, .bf-aspect) {
2522
2688
  background: #fff;
2523
2689
  box-sizing: border-box;
2524
- padding: var(--bf-space-2);
2690
+ padding: var(--bf-space-2) var(--bf-panel-padding-inline);
2525
2691
  }
2526
2692
 
2527
2693
  :where(.bf-theme) :where(.bf-figure-caption) {
@@ -2608,7 +2774,7 @@ html.u-baseline-grid::after {
2608
2774
  margin: 0;
2609
2775
  max-inline-size: 100%;
2610
2776
  padding-block: var(--bf-space-2);
2611
- padding-inline: var(--bf-space-2);
2777
+ padding-inline: var(--bf-panel-padding-inline);
2612
2778
  }
2613
2779
 
2614
2780
  :where(.bf-theme) :where(.bf-notice.is-information) {
@@ -2865,7 +3031,7 @@ html.u-baseline-grid::after {
2865
3031
  :where(.bf-theme) :where(.bf-credential-header) {
2866
3032
  align-items: flex-start;
2867
3033
  display: flex;
2868
- gap: var(--bf-space-2);
3034
+ gap: var(--bf-component-inline-inset-action);
2869
3035
  justify-content: space-between;
2870
3036
  min-inline-size: 0;
2871
3037
  }
@@ -2927,9 +3093,10 @@ html.u-baseline-grid::after {
2927
3093
 
2928
3094
  :where(.bf-theme) :where(.bf-notification, .bf-notification.is-information, .bf-notification.is-positive, .bf-notification.is-caution, .bf-notification.is-negative) {
2929
3095
  --bf-notification-accent: var(--bf-color-border-information);
3096
+ --bf-notification-close-painted-block-size: calc((var(--bf-space-1) * 2) + var(--bf-icon-size-default));
3097
+ --bf-notification-rail-shortfall: max(0rem, calc(var(--bf-bar-thickness) + var(--bf-leading-mark-size) + var(--bf-leading-mark-gap) - var(--bf-component-inline-inset-continuation)));
2930
3098
  background: var(--bf-color-background-default);
2931
3099
  border: var(--bf-border-width) solid var(--bf-color-border-default);
2932
- border-inline-start: var(--bf-bar-thickness) solid var(--bf-notification-accent);
2933
3100
  color: var(--bf-color-text-default);
2934
3101
  margin-block: 0;
2935
3102
  max-inline-size: 100%;
@@ -2937,10 +3104,20 @@ html.u-baseline-grid::after {
2937
3104
  overflow-wrap: anywhere;
2938
3105
  padding-block-end: max(0rem, calc(var(--bf-space-half) - var(--bf-border-width)));
2939
3106
  padding-block-start: 0;
2940
- padding-inline: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness)) var(--bf-space-1);
3107
+ padding-inline: calc(var(--bf-component-inline-inset-continuation) - var(--bf-border-width)) var(--bf-component-inline-inset-action);
2941
3108
  position: relative;
2942
3109
  }
2943
3110
 
3111
+ :where(.bf-theme) :where(.bf-notification:not(.is-borderless))::before {
3112
+ background: var(--bf-notification-accent);
3113
+ content: "";
3114
+ inline-size: var(--bf-bar-thickness);
3115
+ inset-block: calc(var(--bf-border-width) * -1);
3116
+ inset-inline-start: calc((var(--bf-border-width) + var(--bf-notification-rail-shortfall)) * -1);
3117
+ pointer-events: none;
3118
+ position: absolute;
3119
+ }
3120
+
2944
3121
  :where(.bf-theme) :where(.bf-notification.is-positive) {
2945
3122
  --bf-notification-accent: var(--bf-color-border-positive);
2946
3123
  }
@@ -2960,14 +3137,16 @@ html.u-baseline-grid::after {
2960
3137
  :where(.bf-theme) :where(.bf-notification.is-borderless) {
2961
3138
  border: 0;
2962
3139
  padding-block: 0;
2963
- padding-inline: calc(var(--bf-icon-size-default) + var(--bf-space-1)) 0;
3140
+ padding-inline: calc(var(--bf-leading-mark-size) + var(--bf-leading-mark-gap)) 0;
2964
3141
  }
2965
3142
 
2966
3143
  :where(.bf-theme) :where(.bf-notification-icon) {
3144
+ --bf-icon-size: var(--bf-leading-mark-size);
2967
3145
  background-color: var(--bf-notification-accent);
2968
3146
  background-image: none;
2969
- inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start) - var(--bf-border-width));
2970
- inset-inline-start: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness) - var(--bf-icon-size-default) - var(--bf-space-1));
3147
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-h6-nudge-start) - var(--bf-border-width));
3148
+ inset-inline-start: calc(var(--bf-component-inline-inset-continuation) - var(--bf-border-width) - var(--bf-leading-mark-size) - var(--bf-leading-mark-gap));
3149
+ margin-block-start: 0;
2971
3150
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0zm0 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zm-.75 5.25h1.5v5h-1.5v-5zM8 3.5a1 1 0 1 1 0 2 1 1 0 0 1 0-2z'/%3E%3C/svg%3E");
2972
3151
  mask-position: center;
2973
3152
  mask-repeat: no-repeat;
@@ -2988,12 +3167,12 @@ html.u-baseline-grid::after {
2988
3167
  }
2989
3168
 
2990
3169
  :where(.bf-theme) :where(.bf-notification.is-borderless > .bf-notification-icon) {
2991
- inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start));
3170
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-h6-nudge-start));
2992
3171
  inset-inline-start: 0;
2993
3172
  }
2994
3173
 
2995
3174
  :where(.bf-theme) :where(.bf-notification.is-inline > .bf-notification-icon) {
2996
- inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start) - var(--bf-border-width));
3175
+ inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-body-nudge-start) - var(--bf-border-width));
2997
3176
  }
2998
3177
 
2999
3178
  :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
@@ -3005,7 +3184,7 @@ html.u-baseline-grid::after {
3005
3184
  /* Neutralise the shell's top border so the first metric role starts on-grid. */
3006
3185
  margin-block: calc(var(--bf-border-width) * -1) 0;
3007
3186
  padding-block-start: 0;
3008
- padding-inline-end: calc(var(--bf-icon-size-default) + var(--bf-space-1));
3187
+ padding-inline-end: var(--bf-notification-close-painted-block-size);
3009
3188
  }
3010
3189
 
3011
3190
  :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-content) {
@@ -3049,9 +3228,9 @@ html.u-baseline-grid::after {
3049
3228
  }
3050
3229
 
3051
3230
  :where(.bf-theme) :where(.bf-notification-close) {
3052
- block-size: calc((var(--bf-space-1) * 2) + var(--bf-icon-size-default));
3231
+ block-size: var(--bf-square-block-size);
3053
3232
  border: 0;
3054
- inline-size: var(--bf-icon-size-default);
3233
+ inline-size: var(--bf-square-block-size);
3055
3234
  margin-block-end: 0;
3056
3235
  padding: 0;
3057
3236
  position: absolute;
@@ -3069,11 +3248,11 @@ html.u-baseline-grid::after {
3069
3248
  border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
3070
3249
  display: flex;
3071
3250
  flex-wrap: wrap;
3072
- gap: var(--bf-space-1) var(--bf-space-2);
3251
+ gap: var(--bf-space-1) var(--bf-component-inline-inset-action);
3073
3252
  justify-content: space-between;
3074
3253
  margin-block-end: 0;
3075
3254
  padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
3076
- padding-inline-end: var(--bf-space-2);
3255
+ padding-inline-end: var(--bf-component-inline-inset-action);
3077
3256
  }
3078
3257
 
3079
3258
  :where(.bf-theme) :where(.bf-notification.is-inline .bf-notification-meta) {
@@ -3092,7 +3271,7 @@ html.u-baseline-grid::after {
3092
3271
  align-items: flex-start;
3093
3272
  display: flex;
3094
3273
  flex-wrap: wrap;
3095
- gap: var(--bf-space-1) var(--bf-space-2);
3274
+ gap: var(--bf-space-1) var(--bf-component-inline-inset-action);
3096
3275
  margin-inline-start: auto;
3097
3276
  min-inline-size: 0;
3098
3277
  }
@@ -3119,10 +3298,12 @@ html.u-baseline-grid::after {
3119
3298
  cursor: inherit;
3120
3299
  display: inline-block;
3121
3300
  font: inherit;
3122
- margin: -0.125rem calc(var(--bf-space-half) * -1);
3301
+ margin-block: -0.125rem;
3302
+ margin-inline: calc((var(--bf-component-inline-inset-field) / 2) * -1);
3123
3303
  max-inline-size: 100%;
3124
3304
  overflow: hidden;
3125
- padding: 0.125rem var(--bf-space-half);
3305
+ padding-block: 0.125rem;
3306
+ padding-inline: calc(var(--bf-component-inline-inset-field) / 2);
3126
3307
  text-align: inherit;
3127
3308
  text-decoration: inherit;
3128
3309
  text-overflow: inherit;
@@ -3155,9 +3336,10 @@ html.u-baseline-grid::after {
3155
3336
  content: "";
3156
3337
  display: inline-block;
3157
3338
  inline-size: var(--bf-icon-size-default);
3158
- margin-inline-start: var(--bf-space-half);
3339
+ margin-block-start: var(--bf-inline-icon-line-box-trim);
3340
+ margin-inline-start: calc(var(--bf-leading-mark-gap) / 2);
3159
3341
  opacity: 0;
3160
- vertical-align: calc((1cap - var(--bf-icon-size-default)) / 2);
3342
+ vertical-align: var(--bf-inline-icon-baseline-shift);
3161
3343
  }
3162
3344
 
3163
3345
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
@@ -3210,7 +3392,7 @@ html.u-baseline-grid::after {
3210
3392
 
3211
3393
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > tbody) {
3212
3394
  display: grid;
3213
- gap: 0 var(--bf-space-3);
3395
+ gap: 0 var(--bf-component-inline-inset-continuation);
3214
3396
  grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
3215
3397
  inline-size: 100%;
3216
3398
  }
@@ -3220,7 +3402,7 @@ html.u-baseline-grid::after {
3220
3402
  display: block;
3221
3403
  margin-block-end: calc(var(--bf-space-3) - (var(--bf-border-width) * 2));
3222
3404
  min-inline-size: 0;
3223
- padding-inline: var(--bf-space-2);
3405
+ padding-inline: var(--bf-panel-padding-inline);
3224
3406
  }
3225
3407
 
3226
3408
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > tbody > tr > :where(th, td)) {
@@ -3281,7 +3463,7 @@ html.u-baseline-grid::after {
3281
3463
  align-items: center;
3282
3464
  display: flex;
3283
3465
  flex-wrap: wrap;
3284
- column-gap: var(--bf-space-4);
3466
+ column-gap: var(--bf-component-inline-inset-continuation);
3285
3467
  min-inline-size: 0;
3286
3468
  padding-block: var(--bf-space-1);
3287
3469
  }
@@ -3454,7 +3636,7 @@ html.u-baseline-grid::after {
3454
3636
 
3455
3637
  :where(.bf-theme) :where(.bf-media-object-meta) {
3456
3638
  align-items: start;
3457
- column-gap: var(--bf-space-1);
3639
+ column-gap: var(--bf-leading-mark-gap);
3458
3640
  display: grid;
3459
3641
  grid-template-columns: var(--bf-icon-size-default) minmax(0, 1fr);
3460
3642
  min-inline-size: 0;
@@ -3721,10 +3903,10 @@ html.u-baseline-grid::after {
3721
3903
  text-underline-offset: 0.12em;
3722
3904
  }
3723
3905
 
3724
- /* A balanced section switches at the shared readable 50/50 threshold. The
3906
+ /* A balanced section switches at the standard medium container threshold. The
3725
3907
  layout descendant reacts to the root container; the query never tries to
3726
3908
  restyle the container that established it. */
3727
- @container bf-basic-section (width >= 45rem) {
3909
+ @container bf-basic-section (width >= 38.75rem) {
3728
3910
  :where(.bf-theme) :where(.bf-basic-section-layout) {
3729
3911
  column-gap: var(--bf-grid-gap-inline);
3730
3912
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3874,7 +4056,7 @@ html.u-baseline-grid::after {
3874
4056
 
3875
4057
  /* Current Vanilla scopes a one-spacing-unit icon/value gap to the hero. */
3876
4058
  :where(.bf-theme) :where(.bf-hero-chip.bf-chip) {
3877
- column-gap: var(--bf-space-1);
4059
+ column-gap: var(--bf-leading-mark-gap);
3878
4060
  }
3879
4061
 
3880
4062
  :where(.bf-theme) :where(.bf-hero-media > :where(img, picture, video, canvas, svg), .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
@@ -3923,6 +4105,13 @@ html.u-baseline-grid::after {
3923
4105
  }
3924
4106
  }
3925
4107
 
4108
+ /* A compact ruled hero keeps the same half-rem clearance as the native rule
4109
+ primitive. The border occupies one pixel of that clearance, just as the
4110
+ rule's compensated trailing margin does. */
4111
+ :where(.bf-theme) :where(.bf-hero.is-top-flush) {
4112
+ padding-block-start: calc(0.5rem - var(--bf-border-width));
4113
+ }
4114
+
3926
4115
  @container bf-hero (width >= 45rem) {
3927
4116
  :where(.bf-theme) :where(.bf-hero-layout) {
3928
4117
  column-gap: var(--bf-grid-gap-inline);
@@ -4460,9 +4649,8 @@ html.u-baseline-grid::after {
4460
4649
  overscroll-behavior: contain;
4461
4650
  }
4462
4651
 
4463
- /* Panel chrome and content consume the live page-grid gutter through a local
4464
- * derived property, so their internal text rails follow the same
4465
- * viewport brackets as surrounding page content. */
4652
+ /* Panel chrome and content share the continuation component inset through a
4653
+ * local property. Structural surface padding remains a separate contract. */
4466
4654
  :where(.bf-theme) :where(.bf-panel-header) {
4467
4655
  align-items: start;
4468
4656
  display: flex;
@@ -4471,7 +4659,7 @@ html.u-baseline-grid::after {
4471
4659
  justify-content: space-between;
4472
4660
  padding-block-end: var(--bf-panel-padding-block);
4473
4661
  padding-block-start: var(--bf-panel-padding-block);
4474
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4662
+ padding-inline: var(--bf-panel-content-padding-inline);
4475
4663
  }
4476
4664
 
4477
4665
  /* A navigation brand keeps the Canonical tag attached to the panel's top edge
@@ -4481,7 +4669,7 @@ html.u-baseline-grid::after {
4481
4669
  gap: 0;
4482
4670
  padding-block: 0;
4483
4671
  padding-inline-end: 0;
4484
- padding-inline-start: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4672
+ padding-inline-start: var(--bf-panel-content-padding-inline);
4485
4673
  }
4486
4674
 
4487
4675
  :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
@@ -4508,10 +4696,10 @@ html.u-baseline-grid::after {
4508
4696
  flex-wrap: wrap;
4509
4697
  gap: var(--bf-field-gap);
4510
4698
  justify-content: space-between;
4511
- min-block-size: calc(var(--bf-control-box-size-compact) + var(--bf-panel-padding-block));
4699
+ min-block-size: calc(var(--bf-interface-row-occupied-block-size) + var(--bf-panel-padding-block));
4512
4700
  padding-block-end: var(--bf-panel-padding-block);
4513
4701
  padding-block-start: 0;
4514
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4702
+ padding-inline: var(--bf-panel-content-padding-inline);
4515
4703
  }
4516
4704
 
4517
4705
  :where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
@@ -4550,16 +4738,16 @@ html.u-baseline-grid::after {
4550
4738
  align-items: center;
4551
4739
  appearance: none;
4552
4740
  background: transparent;
4553
- border: 0;
4741
+ border: 0 solid transparent;
4742
+ border-block-width: var(--bf-border-width);
4554
4743
  color: var(--bf-color-text-default);
4555
4744
  cursor: pointer;
4556
4745
  display: inline-flex;
4557
- gap: calc(var(--bf-baseline) * 0.5);
4746
+ gap: var(--bf-leading-mark-gap);
4558
4747
  justify-content: flex-start;
4559
- margin: 0;
4560
- min-block-size: var(--bf-control-box-size-compact);
4748
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
4561
4749
  min-inline-size: 0;
4562
- padding-block: var(--bf-control-block-padding-compact);
4750
+ padding-block: var(--bf-interface-row-padding-block);
4563
4751
  padding-inline: 0;
4564
4752
  text-align: left;
4565
4753
  }
@@ -4582,7 +4770,7 @@ html.u-baseline-grid::after {
4582
4770
  min-block-size: 0;
4583
4771
  padding-block-end: var(--bf-panel-padding-block);
4584
4772
  padding-block-start: var(--bf-panel-padding-block);
4585
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4773
+ padding-inline: var(--bf-panel-content-padding-inline);
4586
4774
  }
4587
4775
 
4588
4776
  :where(.bf-theme) :where(.bf-panel-content.is-flush) {
@@ -4707,7 +4895,7 @@ html.u-baseline-grid::after {
4707
4895
 
4708
4896
  :where(.bf-theme) :where(.bf-option-grid) {
4709
4897
  display: grid;
4710
- gap: calc(var(--bf-baseline) * 2.5);
4898
+ gap: var(--bf-component-inline-inset-action);
4711
4899
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 10rem), 1fr));
4712
4900
  }
4713
4901
 
@@ -4720,7 +4908,7 @@ html.u-baseline-grid::after {
4720
4908
  display: grid;
4721
4909
  gap: var(--bf-field-gap);
4722
4910
  margin: 0;
4723
- min-block-size: calc((var(--bf-control-box-size) * 2) + var(--bf-baseline));
4911
+ min-block-size: calc((var(--bf-interface-row-occupied-block-size) * 2) + var(--bf-baseline));
4724
4912
  min-inline-size: 0;
4725
4913
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4726
4914
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
@@ -4917,7 +5105,7 @@ html.u-baseline-grid::after {
4917
5105
  grid-template-rows: minmax(0, 1fr);
4918
5106
  min-inline-size: 0;
4919
5107
  overflow: hidden;
4920
- padding-inline: var(--bf-space-2);
5108
+ padding-inline: var(--bf-panel-padding-inline);
4921
5109
  }
4922
5110
 
4923
5111
  :where(.bf-theme) :where(.bf-content-card-primary, .bf-content-card-description-panel) {
@@ -5022,7 +5210,7 @@ html.u-baseline-grid::after {
5022
5210
  color: var(--bf-color-text-muted);
5023
5211
  display: flex;
5024
5212
  flex-wrap: wrap;
5025
- gap: 0 var(--bf-space-half);
5213
+ gap: 0 var(--bf-leading-mark-gap);
5026
5214
  min-inline-size: 0;
5027
5215
  padding-block-end: var(--bf-space-1);
5028
5216
  }
@@ -5074,7 +5262,7 @@ html.u-baseline-grid::after {
5074
5262
  :where(.bf-theme) :where(.bf-content-card-footer-inner) {
5075
5263
  align-items: center;
5076
5264
  display: flex;
5077
- gap: var(--bf-space-1);
5265
+ gap: var(--bf-leading-mark-gap);
5078
5266
  inline-size: 100%;
5079
5267
  mask-image: linear-gradient(to right, #000 85%, transparent 100%);
5080
5268
  min-block-size: var(--bf-space-4);
@@ -5082,7 +5270,7 @@ html.u-baseline-grid::after {
5082
5270
  overflow-x: auto;
5083
5271
  padding-block-end: var(--bf-space-1);
5084
5272
  padding-block-start: calc(0.5rem - var(--bf-border-width));
5085
- padding-inline: var(--bf-space-2);
5273
+ padding-inline: var(--bf-panel-padding-inline);
5086
5274
  position: relative;
5087
5275
  scrollbar-width: none;
5088
5276
  z-index: 2;
@@ -5105,7 +5293,7 @@ html.u-baseline-grid::after {
5105
5293
  :where(.bf-theme) :where(.bf-content-card-resource) {
5106
5294
  align-items: center;
5107
5295
  display: inline-flex;
5108
- gap: var(--bf-space-half);
5296
+ gap: var(--bf-leading-mark-gap);
5109
5297
  }
5110
5298
 
5111
5299
  :where(.bf-theme) :where(.bf-content-card-resource > *) {
@@ -5114,7 +5302,7 @@ html.u-baseline-grid::after {
5114
5302
 
5115
5303
  :where(.bf-theme) :where(.bf-content-card-footer .bf-chip) {
5116
5304
  margin: 0;
5117
- margin-inline-end: var(--bf-space-3);
5305
+ margin-inline-end: var(--bf-component-inline-inset-continuation);
5118
5306
  }
5119
5307
 
5120
5308
  /* Internal geometry responds to the card's allocated width. The card root is
@@ -5133,10 +5321,10 @@ html.u-baseline-grid::after {
5133
5321
 
5134
5322
  @container bf-content-card (width >= 28.75rem) {
5135
5323
  :where(.bf-theme) :where(.bf-content-card:is(.is-cols-4, .is-cols-6)) :where(.bf-content-card-frame) {
5136
- column-gap: var(--bf-space-2);
5324
+ column-gap: var(--bf-panel-padding-inline);
5137
5325
  flex-direction: row;
5138
5326
  min-block-size: calc((var(--bf-space-12) * 2) - (var(--bf-border-width) * 2));
5139
- padding: var(--bf-space-2) var(--bf-space-2) 0;
5327
+ padding: var(--bf-space-2) var(--bf-panel-padding-inline) 0;
5140
5328
  }
5141
5329
 
5142
5330
  :where(.bf-theme) :where(.bf-content-card:is(.is-cols-4, .is-cols-6):not(.is-image)) :where(.bf-content-card-frame) {
@@ -5182,7 +5370,7 @@ html.u-baseline-grid::after {
5182
5370
  }
5183
5371
 
5184
5372
  :where(.bf-theme) :where(.bf-content-card.is-image-top:is(.is-cols-4, .is-cols-6)) :where(.bf-content-card-body, .bf-content-card-footer-inner) {
5185
- padding-inline: var(--bf-space-2);
5373
+ padding-inline: var(--bf-panel-padding-inline);
5186
5374
  }
5187
5375
  }
5188
5376
 
@@ -5207,7 +5395,8 @@ html.u-baseline-grid::after {
5207
5395
  block-size: 100%;
5208
5396
  grid-column: 2;
5209
5397
  grid-row: 1;
5210
- padding: var(--bf-space-1) var(--bf-space-1) 0;
5398
+ padding-block: var(--bf-space-1) 0;
5399
+ padding-inline: var(--bf-component-inline-inset-field);
5211
5400
  }
5212
5401
 
5213
5402
  :where(.bf-theme) :where(.bf-content-card.is-cols-8) :where(.bf-content-card-image) {
@@ -5310,11 +5499,11 @@ html.u-baseline-grid::after {
5310
5499
  color: var(--bf-color-text-muted);
5311
5500
  cursor: pointer;
5312
5501
  display: flex;
5313
- gap: calc(var(--bf-baseline) * 0.5);
5502
+ gap: var(--bf-leading-mark-gap);
5314
5503
  justify-content: center;
5315
5504
  margin-bottom: 0;
5316
- padding-block-end: calc(var(--bf-single-line-row-padding-block) + var(--bf-single-line-row-margin-block-end));
5317
- padding-block-start: var(--bf-single-line-row-padding-block);
5505
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
5506
+ padding-block-start: var(--bf-interface-row-padding-block);
5318
5507
  padding-inline: var(--bf-component-inline-inset-action);
5319
5508
  text-decoration: none;
5320
5509
  }
@@ -5357,7 +5546,7 @@ html.u-baseline-grid::after {
5357
5546
 
5358
5547
  :where(.bf-theme) :where(.bf-tabs.is-equal) :where(.bf-tabs-list) {
5359
5548
  display: grid;
5360
- gap: calc(var(--bf-baseline) * 2);
5549
+ gap: var(--bf-component-inline-inset-action);
5361
5550
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--bf-ui-tabs-equal-min)), 1fr));
5362
5551
  overflow: visible;
5363
5552
  white-space: normal;
@@ -5387,11 +5576,11 @@ html.u-baseline-grid::after {
5387
5576
  color: var(--bf-color-text-default);
5388
5577
  cursor: pointer;
5389
5578
  display: grid;
5390
- gap: calc(var(--bf-baseline) * 0.75);
5579
+ gap: var(--bf-leading-mark-gap);
5391
5580
  grid-template-columns: auto minmax(0, 1fr) auto;
5392
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
5581
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
5393
5582
  min-inline-size: 0;
5394
- padding-block: var(--bf-single-line-row-padding-block);
5583
+ padding-block: var(--bf-interface-row-padding-block);
5395
5584
  padding-inline: var(--bf-component-inline-inset-field);
5396
5585
  }
5397
5586
 
@@ -5469,7 +5658,7 @@ html.u-baseline-grid::after {
5469
5658
  :where(.bf-theme) :where(.bf-inline-options-options) {
5470
5659
  display: flex;
5471
5660
  flex-wrap: wrap;
5472
- gap: calc(var(--bf-baseline) * 3);
5661
+ gap: var(--bf-component-inline-inset-continuation);
5473
5662
  }
5474
5663
 
5475
5664
  :where(.bf-theme) :where(.bf-inline-options-option) {
@@ -5522,11 +5711,11 @@ html.u-baseline-grid::after {
5522
5711
  cursor: pointer;
5523
5712
  display: inline-flex;
5524
5713
  justify-content: center;
5525
- margin-bottom: var(--bf-single-line-row-margin-block-end);
5714
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
5526
5715
  max-inline-size: 100%;
5527
5716
  overflow: hidden;
5528
- padding-block: var(--bf-single-line-row-padding-block);
5529
- padding-inline: var(--bf-control-inline-padding-action-bordered);
5717
+ padding-block: var(--bf-interface-row-padding-block);
5718
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
5530
5719
  text-align: center;
5531
5720
  text-decoration: none;
5532
5721
  text-overflow: ellipsis;
@@ -5573,7 +5762,7 @@ html.u-baseline-grid::after {
5573
5762
  align-items: center;
5574
5763
  display: flex;
5575
5764
  flex-wrap: wrap;
5576
- gap: calc(var(--bf-baseline) * 0.5) calc(var(--bf-baseline) * 1.25);
5765
+ gap: calc(var(--bf-baseline) * 0.5) var(--bf-leading-mark-gap);
5577
5766
  list-style: none;
5578
5767
  margin: 0;
5579
5768
  min-inline-size: 0;
@@ -5596,7 +5785,7 @@ html.u-baseline-grid::after {
5596
5785
  :where(.bf-theme) :where(.bf-breadcrumbs-item) + :where(.bf-breadcrumbs-item)::before {
5597
5786
  color: var(--bf-color-text-muted);
5598
5787
  content: "/";
5599
- margin-inline-end: calc(var(--bf-baseline) * 0.75);
5788
+ margin-inline-end: var(--bf-leading-mark-gap);
5600
5789
  }
5601
5790
 
5602
5791
  :where(.bf-theme) :where(.bf-breadcrumbs-item) a {
@@ -5721,9 +5910,9 @@ html.u-baseline-grid::after {
5721
5910
  box-sizing: border-box;
5722
5911
  color: var(--bf-color-text-default);
5723
5912
  display: grid;
5724
- column-gap: var(--bf-space-2);
5913
+ column-gap: var(--bf-leading-mark-gap);
5725
5914
  grid-template-rows: auto auto;
5726
- inline-size: calc((100cqi - var(--bf-space-2)) / 2);
5915
+ inline-size: calc((100cqi - var(--bf-leading-mark-gap)) / 2);
5727
5916
  min-inline-size: 0;
5728
5917
  padding-block: calc(var(--bf-space-2) + (var(--bf-baseline) / 4) - var(--bf-border-width));
5729
5918
  position: relative;
@@ -5748,7 +5937,7 @@ html.u-baseline-grid::after {
5748
5937
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous) {
5749
5938
  grid-column: 1;
5750
5939
  grid-template-columns: var(--bf-icon-size-default) minmax(0, 1fr);
5751
- padding-inline: var(--bf-space-1) var(--bf-space-2);
5940
+ padding-inline: var(--bf-leading-mark-gap) var(--bf-component-inline-inset-action);
5752
5941
  text-align: start;
5753
5942
  }
5754
5943
 
@@ -5756,7 +5945,7 @@ html.u-baseline-grid::after {
5756
5945
  grid-column: 2;
5757
5946
  grid-template-columns: minmax(0, 1fr) var(--bf-icon-size-default);
5758
5947
  justify-self: end;
5759
- padding-inline: var(--bf-space-2) var(--bf-space-1);
5948
+ padding-inline: var(--bf-component-inline-inset-action) var(--bf-leading-mark-gap);
5760
5949
  text-align: end;
5761
5950
  }
5762
5951
 
@@ -5798,6 +5987,7 @@ html.u-baseline-grid::after {
5798
5987
 
5799
5988
  :where(.bf-theme) :where(.bf-article-pagination-direction > .bf-icon) {
5800
5989
  --bf-icon-size: var(--bf-icon-size-default);
5990
+ margin-block-start: 0;
5801
5991
  }
5802
5992
 
5803
5993
  :where(.bf-theme) .bf-article-pagination:dir(rtl) .bf-article-pagination-link.is-previous .bf-icon {
@@ -5835,7 +6025,7 @@ html.u-baseline-grid::after {
5835
6025
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child)) {
5836
6026
  grid-template-columns: var(--bf-icon-size-default);
5837
6027
  inline-size: calc(var(--bf-space-6) + var(--bf-space-1));
5838
- padding-inline: var(--bf-space-1);
6028
+ padding-inline: var(--bf-leading-mark-gap);
5839
6029
  }
5840
6030
 
5841
6031
  :where(.bf-theme) :where(.bf-article-pagination-link.is-next:not(:only-child)) {
@@ -5888,8 +6078,8 @@ html.u-baseline-grid::after {
5888
6078
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item) {
5889
6079
  border-block: var(--bf-border-width) solid transparent;
5890
6080
  box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-low-contrast);
5891
- margin-block-end: var(--bf-single-line-row-margin-block-end);
5892
- padding-block: var(--bf-single-line-row-padding-block);
6081
+ margin-block-end: var(--bf-interface-row-compensation-block-end);
6082
+ padding-block: var(--bf-interface-row-padding-block);
5893
6083
  }
5894
6084
 
5895
6085
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item:first-child) {
@@ -5929,7 +6119,7 @@ html.u-baseline-grid::after {
5929
6119
  :where(.bf-theme) :where(ol.bf-list.is-divided) > :where(.bf-list-item) {
5930
6120
  counter-increment: bf-list-counter;
5931
6121
  list-style: none;
5932
- padding-inline-start: calc(var(--bf-baseline) * 4);
6122
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
5933
6123
  position: relative;
5934
6124
  }
5935
6125
 
@@ -5949,7 +6139,7 @@ html.u-baseline-grid::after {
5949
6139
  }
5950
6140
 
5951
6141
  :where(.bf-theme) :where(.bf-list-item) > :where(.bf-list) {
5952
- margin-inline-start: calc(var(--bf-baseline) * 3);
6142
+ margin-inline-start: var(--bf-component-inline-inset-action);
5953
6143
  padding-block-start: var(--bf-body-nudge-end);
5954
6144
  }
5955
6145
 
@@ -5958,6 +6148,8 @@ html.u-baseline-grid::after {
5958
6148
  }
5959
6149
 
5960
6150
  :where(.bf-theme) :where(.bf-inline-list) {
6151
+ --bf-inline-list-space: 0.5rem;
6152
+
5961
6153
  margin: 0;
5962
6154
  padding: 0;
5963
6155
  }
@@ -5970,7 +6162,7 @@ html.u-baseline-grid::after {
5970
6162
  line-height: var(--bf-body-line-height, 1.5rem);
5971
6163
  display: inline-block;
5972
6164
  list-style: none;
5973
- margin-inline-end: calc(var(--bf-baseline) * 1.5);
6165
+ margin-inline-end: var(--bf-inline-list-space);
5974
6166
  padding-block-end: var(--bf-body-nudge-end);
5975
6167
  padding-block-start: var(--bf-body-nudge-start);
5976
6168
  }
@@ -5980,18 +6172,21 @@ html.u-baseline-grid::after {
5980
6172
  }
5981
6173
 
5982
6174
  :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item) {
5983
- margin-inline-end: calc(var(--bf-baseline) * 1);
6175
+ margin-inline-end: 0;
5984
6176
  position: relative;
5985
6177
  }
5986
6178
 
5987
- :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item)::after {
5988
- content: "\2022";
5989
- display: inline;
5990
- margin-inline-start: calc(var(--bf-baseline) * 0.25);
6179
+ :where(.bf-theme) :where(.bf-inline-list.is-middot) {
6180
+ align-items: baseline;
6181
+ column-gap: var(--bf-inline-list-space);
6182
+ display: flex;
6183
+ flex-wrap: wrap;
5991
6184
  }
5992
6185
 
5993
- :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item:last-of-type)::after {
5994
- content: "";
6186
+ :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item:not(:last-of-type))::after {
6187
+ content: "\2022";
6188
+ display: inline;
6189
+ margin-inline-start: var(--bf-inline-list-space);
5995
6190
  }
5996
6191
 
5997
6192
  :where(.bf-theme) :where(.bf-skip-link) {
@@ -6003,8 +6198,8 @@ html.u-baseline-grid::after {
6003
6198
  background: var(--bf-color-background-alt);
6004
6199
  color: var(--bf-color-link-default);
6005
6200
  display: block;
6006
- left: -62.4375rem;
6007
- max-inline-size: calc(100vw - var(--bf-baseline));
6201
+ inset-inline-start: -62.4375rem;
6202
+ max-inline-size: calc(100vw - (var(--bf-inline-unit) * 2));
6008
6203
  position: absolute;
6009
6204
  text-decoration: none;
6010
6205
  top: -62.4375rem;
@@ -6015,16 +6210,24 @@ html.u-baseline-grid::after {
6015
6210
  }
6016
6211
 
6017
6212
  :where(.bf-theme) :where(.bf-skip-link:focus, .bf-skip-link:focus-visible) {
6018
- left: calc(var(--bf-baseline) * 0.5);
6213
+ inset-inline-start: var(--bf-inline-unit);
6019
6214
  outline: 0.125rem solid var(--bf-color-focus);
6020
6215
  outline-offset: 0;
6021
6216
  padding-block: calc(var(--bf-baseline) * 1.5);
6022
- padding-inline: calc(var(--bf-baseline) * 1.5);
6217
+ padding-inline: var(--bf-component-inline-inset-action);
6023
6218
  position: fixed;
6024
6219
  top: calc(var(--bf-baseline) * 0.5);
6025
6220
  z-index: 999999;
6026
6221
  }
6027
6222
 
6223
+ :where(.bf-theme) {
6224
+ --bf-table-row-border-size: var(--bf-border-width);
6225
+ --bf-table-row-padding-block-start: var(--bf-in-box-row-padding-block-start);
6226
+ --bf-table-row-block-size: var(--bf-interface-row-occupied-block-size);
6227
+ --bf-table-row-padding-block-end: max(0rem, calc(var(--bf-table-row-block-size) - var(--bf-body-line-height, 1.5rem) - var(--bf-table-row-padding-block-start) - var(--bf-table-row-border-size)));
6228
+ --bf-table-row-line-height: var(--bf-body-line-height, 1.5rem);
6229
+ }
6230
+
6028
6231
  :where(.bf-theme) :where(.bf-table-scroll) {
6029
6232
  max-inline-size: 100%;
6030
6233
  min-inline-size: 0;
@@ -6109,6 +6312,13 @@ html.u-baseline-grid::after {
6109
6312
  }
6110
6313
 
6111
6314
 
6315
+ :where(.bf-theme) {
6316
+ --bf-ui-chip-padding-inline: var(--bf-component-inline-inset-action);
6317
+ --bf-ui-chip-radius: 999rem;
6318
+ --bf-ui-badge-padding-inline: var(--bf-border-width);
6319
+ --bf-ui-badge-overhang: calc(var(--bf-ui-badge-padding-inline) * -0.75);
6320
+ }
6321
+
6112
6322
  :where(.bf-theme) :where(.bf-chip, .bf-chip.is-positive, .bf-chip.is-caution, .bf-chip.is-negative, .bf-chip.is-information) {
6113
6323
  --bf-ui-chip-border: var(--bf-color-border-neutral);
6114
6324
  --bf-ui-chip-border-hover: var(--bf-color-border-neutral);
@@ -6129,10 +6339,14 @@ html.u-baseline-grid::after {
6129
6339
  display: inline-flex;
6130
6340
  gap: 0;
6131
6341
  inline-size: fit-content;
6342
+ justify-content: center;
6132
6343
  justify-self: start;
6133
- margin: 0 var(--bf-ui-chip-padding-inline) var(--bf-single-line-row-margin-block-end) 0;
6344
+ margin: 0 var(--bf-component-inline-inset-field) var(--bf-interface-row-compensation-block-end) 0;
6134
6345
  max-inline-size: 100%;
6135
- padding-block: var(--bf-single-line-row-padding-block);
6346
+ min-inline-size: min(100%, calc(var(--bf-interface-row-painted-block-size) + (var(--bf-border-width) * 2)));
6347
+ padding-block: var(--bf-interface-row-padding-block);
6348
+ /* Chips use the Action text keyline. The paint-derived floor only governs
6349
+ very short dense labels, keeping them stadium-shaped rather than circular. */
6136
6350
  padding-inline: max(0rem, calc(var(--bf-ui-chip-padding-inline) - var(--bf-border-width)));
6137
6351
  position: relative;
6138
6352
  text-decoration: none;
@@ -6245,17 +6459,17 @@ html.u-baseline-grid::after {
6245
6459
  align-items: center;
6246
6460
  background-color: var(--bf-color-text-default);
6247
6461
  border-radius: 1rem;
6248
- box-sizing: content-box;
6249
6462
  color: var(--bf-color-background-default);
6250
6463
  display: inline-block;
6464
+ inline-size: fit-content;
6465
+ justify-self: start;
6251
6466
  margin: 0;
6252
- max-inline-size: 4ch;
6253
- min-width: calc(var(--bf-body-line-height, 1.5rem) - (var(--bf-ui-badge-padding-inline) * 2));
6254
- overflow: hidden;
6467
+ min-inline-size: var(--bf-square-block-size);
6255
6468
  padding-block: 0;
6256
6469
  padding-inline: var(--bf-ui-badge-padding-inline);
6257
6470
  text-align: center;
6258
6471
  text-indent: 0;
6472
+ white-space: nowrap;
6259
6473
  }
6260
6474
 
6261
6475
  :where(.bf-theme) :where(.bf-badge.is-negative) {
@@ -6266,7 +6480,7 @@ html.u-baseline-grid::after {
6266
6480
  :where(.bf-theme) :where(.bf-chip, .bf-chip.is-positive, .bf-chip.is-caution, .bf-chip.is-negative, .bf-chip.is-information) :where(.bf-badge, .bf-badge.is-negative) {
6267
6481
  align-self: center;
6268
6482
  margin-inline-end: var(--bf-ui-badge-overhang);
6269
- margin-inline-start: var(--bf-ui-chip-padding-inline);
6483
+ margin-inline-start: var(--bf-component-inline-inset-field);
6270
6484
  }
6271
6485
 
6272
6486
  :where(.bf-theme) :where(.bf-status-label, .bf-status-label.is-positive, .bf-status-label.is-caution, .bf-status-label.is-information, .bf-status-label.is-negative) {
@@ -6283,11 +6497,11 @@ html.u-baseline-grid::after {
6283
6497
  font-style: var(--bf-body-font-style, normal);
6284
6498
  font-weight: var(--bf-body-font-weight, 400);
6285
6499
  line-height: var(--bf-body-line-height, 1.5rem);
6286
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6500
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6287
6501
  /* Status paint is physically symmetric and shares the same occupied block
6288
6502
  as a button; typography still comes from the body role. */
6289
- padding-block: var(--bf-single-line-row-padding-block);
6290
- padding-inline: var(--bf-ui-chip-padding-inline);
6503
+ padding-block: var(--bf-interface-row-padding-block);
6504
+ padding-inline: var(--bf-component-inline-inset-field);
6291
6505
  text-align: center;
6292
6506
  text-decoration: none;
6293
6507
  white-space: nowrap;
@@ -6317,17 +6531,21 @@ html.u-baseline-grid::after {
6317
6531
  carrying a second standalone occupied-row contract. This modifier is
6318
6532
  explicit so component density never changes merely because of ancestry. */
6319
6533
  :where(.bf-theme) :where(.bf-chip.is-nested, .bf-status-label.is-nested) {
6320
- line-height: var(--bf-nested-auxiliary-line-height);
6534
+ line-height: var(--bf-nested-row-line-height);
6321
6535
  margin-block: 0;
6322
- padding-block: var(--bf-nested-auxiliary-padding-block);
6536
+ padding-block: var(--bf-nested-row-padding-block);
6323
6537
  }
6324
6538
 
6325
6539
  :where(.bf-theme) :where(.bf-chip.is-nested) {
6326
6540
  border: 0;
6327
6541
  box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-ui-chip-border);
6542
+ min-inline-size: min(100%, calc(var(--bf-nested-row-painted-block-size) + (var(--bf-border-width) * 2)));
6543
+ /* The nested border is inset paint rather than box geometry, so the glyph
6544
+ needs the complete Action inset instead of subtracting a real border. */
6545
+ padding-inline: var(--bf-ui-chip-padding-inline);
6328
6546
  }
6329
6547
 
6330
- /* Chip parts normally carry the standalone body line explicitly. A compact
6548
+ /* Chip parts normally carry the standalone body line explicitly. A nested
6331
6549
  chip must pass its reduced line through to those parts so a nested badge
6332
6550
  can fit without making the host row taller. */
6333
6551
  :where(.bf-theme) :where(.bf-chip.is-nested) :where(.bf-chip-lead, .bf-chip-value) {
@@ -6348,7 +6566,7 @@ html.u-baseline-grid::after {
6348
6566
 
6349
6567
  :where(.bf-theme) :where(.bf-badge.is-nested) {
6350
6568
  align-self: center;
6351
- line-height: var(--bf-nested-auxiliary-line-height);
6569
+ line-height: var(--bf-nested-row-line-height);
6352
6570
  vertical-align: middle;
6353
6571
  }
6354
6572
 
@@ -6397,7 +6615,7 @@ html.u-baseline-grid::after {
6397
6615
  --bf-search-box-trailing-inline-size: calc((var(--bf-search-box-action-inline-size) * 2) + var(--bf-border-width));
6398
6616
  display: flex;
6399
6617
  inline-size: 100%;
6400
- margin: 0 0 calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-input-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
6618
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6401
6619
  max-inline-size: 100%;
6402
6620
  min-inline-size: 0;
6403
6621
  position: relative;
@@ -6479,7 +6697,7 @@ html.u-baseline-grid::after {
6479
6697
  display: flex;
6480
6698
  flex-wrap: wrap;
6481
6699
  gap: var(--bf-field-gap);
6482
- margin: 0 0 calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-input-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
6700
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6483
6701
  min-block-size: 0;
6484
6702
  overflow: visible;
6485
6703
  padding: 0;
@@ -6487,7 +6705,7 @@ html.u-baseline-grid::after {
6487
6705
  }
6488
6706
 
6489
6707
  :where(.bf-theme) :where(.bf-search-and-filter-search-container[aria-expanded='false']) {
6490
- min-block-size: var(--bf-control-box-size);
6708
+ min-block-size: var(--bf-interface-row-painted-block-size);
6491
6709
  }
6492
6710
 
6493
6711
  :where(.bf-theme) :where(.bf-search-and-filter-box) {
@@ -6571,7 +6789,7 @@ html.u-baseline-grid::after {
6571
6789
  cursor: pointer;
6572
6790
  display: inline-flex;
6573
6791
  margin: 0;
6574
- padding-block: var(--bf-button-block-padding);
6792
+ padding-block: var(--bf-body-nudge-start, 0.41rem);
6575
6793
  padding-inline: 0;
6576
6794
  position: static;
6577
6795
  }
@@ -6710,8 +6928,8 @@ html.u-baseline-grid::after {
6710
6928
  border-block: var(--bf-border-width) solid transparent;
6711
6929
  cursor: pointer;
6712
6930
  display: block;
6713
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6714
- padding-block: var(--bf-single-line-row-padding-block);
6931
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6932
+ padding-block: var(--bf-interface-row-padding-block);
6715
6933
  padding-inline: var(--bf-component-inline-inset-continuation) var(--bf-component-inline-inset-action);
6716
6934
  text-decoration: none;
6717
6935
  }
@@ -6748,9 +6966,9 @@ html.u-baseline-grid::after {
6748
6966
  cursor: pointer;
6749
6967
  display: flex;
6750
6968
  gap: var(--bf-disclosure-gap);
6751
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6752
- padding-block: var(--bf-single-line-row-padding-block);
6753
- padding-inline: 0 calc(var(--bf-baseline) * 0.5);
6969
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6970
+ padding-block: var(--bf-interface-row-padding-block);
6971
+ padding-inline: var(--bf-disclosure-group-inset) var(--bf-inline-unit);
6754
6972
  text-align: left;
6755
6973
  width: 100%;
6756
6974
  }
@@ -6786,20 +7004,21 @@ html.u-baseline-grid::after {
6786
7004
 
6787
7005
 
6788
7006
  :where(.bf-theme) :where(.bf-side-navigation, .bf-side-navigation.is-icons, .bf-side-navigation.is-accordion, .bf-side-navigation.is-raw-html) {
6789
- /* Plain navigation commands use the action rail. Icon-led rows move only their mark canvas,
6790
- so their copy reaches the shared continuation rail without a fourth
7007
+ /* Plain navigation commands use the action inset. Icon-led rows move only their mark canvas,
7008
+ so their copy reaches the shared continuation inset without a fourth
6791
7009
  component inset. Navigation depth is added separately below. */
6792
- /* Navigation copy uses one continuation rail whether a row has a leading
7010
+ /* Navigation copy uses one continuation inset whether a row has a leading
6793
7011
  disclosure/icon slot or not. The mark canvas is derived backwards from
6794
- that rail, so iconless rows never introduce a fourth text start. */
7012
+ that inset, so iconless rows never introduce a fourth text start. */
6795
7013
  --bf-side-navigation-content-inset: var(--bf-component-inline-inset-continuation);
6796
- --bf-side-navigation-disclosure-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
6797
- --bf-side-navigation-depth-step: var(--bf-space-2);
7014
+ --bf-side-navigation-disclosure-inset: var(--bf-disclosure-group-inset);
7015
+ --bf-side-navigation-depth-step: var(--bf-component-inline-inset-action);
6798
7016
  --bf-side-navigation-group-gap: 1.5rem;
6799
7017
  --bf-side-navigation-heading-list-gap: 0.5rem;
6800
7018
  color: var(--bf-color-text-inactive);
6801
7019
  display: block;
6802
7020
  inline-size: 100%;
7021
+ min-inline-size: 0;
6803
7022
  }
6804
7023
 
6805
7024
  :where(.bf-theme) :where(.bf-side-navigation-groups) {
@@ -6880,7 +7099,7 @@ html.u-baseline-grid::after {
6880
7099
  border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
6881
7100
  margin-bottom: calc(var(--bf-baseline) * 2);
6882
7101
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
6883
- padding-inline: var(--bf-component-inline-inset-continuation);
7102
+ padding-inline: var(--bf-panel-padding-inline);
6884
7103
  padding-top: var(--bf-panel-padding-block);
6885
7104
  position: sticky;
6886
7105
  top: 0;
@@ -6901,11 +7120,11 @@ html.u-baseline-grid::after {
6901
7120
  color: var(--bf-color-text-default);
6902
7121
  cursor: pointer;
6903
7122
  display: inline-flex;
6904
- gap: calc(var(--bf-baseline) * 0.5);
7123
+ gap: var(--bf-leading-mark-gap);
6905
7124
  justify-content: center;
6906
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6907
- padding-block: var(--bf-single-line-row-padding-block);
6908
- padding-inline: var(--bf-control-inline-padding-action-bordered);
7125
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
7126
+ padding-block: var(--bf-interface-row-padding-block);
7127
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
6909
7128
  text-decoration: none;
6910
7129
  }
6911
7130
 
@@ -6962,15 +7181,17 @@ html.u-baseline-grid::after {
6962
7181
 
6963
7182
  :where(.bf-theme) :where(.bf-side-navigation-list) {
6964
7183
  display: grid;
6965
- grid-auto-rows: var(--bf-single-line-row-block-size);
7184
+ grid-auto-rows: minmax(var(--bf-interface-row-occupied-block-size), auto);
6966
7185
  list-style: none;
6967
7186
  margin: 0;
7187
+ min-inline-size: 0;
6968
7188
  padding: 0;
6969
7189
  }
6970
7190
 
6971
7191
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) {
6972
7192
  display: grid;
6973
7193
  margin: 0;
7194
+ min-inline-size: 0;
6974
7195
  position: relative;
6975
7196
  }
6976
7197
 
@@ -6987,11 +7208,15 @@ html.u-baseline-grid::after {
6987
7208
  border-block: var(--bf-border-width) solid transparent;
6988
7209
  color: var(--bf-color-text-inactive);
6989
7210
  display: flex;
6990
- gap: calc(var(--bf-baseline) * 0.5);
7211
+ gap: var(--bf-leading-mark-gap);
6991
7212
  inline-size: 100%;
6992
7213
  justify-content: flex-start;
6993
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6994
- padding-block: var(--bf-single-line-row-padding-block);
7214
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
7215
+ min-inline-size: 0;
7216
+ /* A navigation row is the focus owner. Put nested interactive controls in a
7217
+ following panel/list item rather than inside the clipped row itself. */
7218
+ overflow: hidden;
7219
+ padding-block: var(--bf-interface-row-padding-block);
6995
7220
  padding-inline: var(--bf-side-navigation-content-inset);
6996
7221
  --bf-side-navigation-row-inset: var(--bf-side-navigation-content-inset);
6997
7222
  position: relative;
@@ -7111,7 +7336,7 @@ html.u-baseline-grid::after {
7111
7336
  line-height: var(--bf-body-line-height, 1.5rem);
7112
7337
  align-items: center;
7113
7338
  color: var(--bf-color-text-default);
7114
- column-gap: calc(var(--bf-baseline) * 1.5);
7339
+ column-gap: var(--bf-leading-mark-gap);
7115
7340
  display: inline-flex;
7116
7341
  inline-size: auto;
7117
7342
  justify-content: flex-start;
@@ -7203,7 +7428,7 @@ html.u-baseline-grid::after {
7203
7428
  color: var(--bf-color-text-default);
7204
7429
  cursor: pointer;
7205
7430
  display: inline-flex;
7206
- gap: calc(var(--bf-baseline) * 1);
7431
+ gap: var(--bf-leading-mark-gap);
7207
7432
  inline-size: 100%;
7208
7433
  justify-content: flex-start;
7209
7434
  margin: 0;
@@ -7300,12 +7525,12 @@ html.u-baseline-grid::after {
7300
7525
  align-items: center;
7301
7526
  color: var(--bf-color-text-default);
7302
7527
  display: flex;
7303
- gap: calc(var(--bf-baseline) * 2);
7528
+ gap: var(--bf-component-inline-inset-action);
7304
7529
  inline-size: 100%;
7305
7530
  justify-content: space-between;
7306
7531
  min-inline-size: 0;
7307
7532
  padding-block: var(--bf-top-navigation-link-padding-block);
7308
- padding-inline: calc(var(--bf-top-navigation-link-padding-inline) + (var(--bf-baseline) * 2)) var(--bf-top-navigation-link-padding-inline);
7533
+ padding-inline: calc(var(--bf-top-navigation-link-padding-inline) + var(--bf-component-inline-inset-action)) var(--bf-top-navigation-link-padding-inline);
7309
7534
  text-align: left;
7310
7535
  text-decoration: none;
7311
7536
  white-space: nowrap;
@@ -7410,7 +7635,7 @@ html.u-baseline-grid::after {
7410
7635
  :where(.bf-theme) :where(.bf-top-navigation-row) {
7411
7636
  align-items: stretch;
7412
7637
  flex-direction: row;
7413
- gap: calc(var(--bf-baseline) * 2);
7638
+ gap: var(--bf-component-inline-inset-action);
7414
7639
  }
7415
7640
 
7416
7641
  :where(.bf-theme) :where(.bf-top-navigation-banner) {
@@ -7547,8 +7772,8 @@ html.u-baseline-grid::after {
7547
7772
  cursor: pointer;
7548
7773
  inset-block-start: 0;
7549
7774
  margin: 0;
7550
- min-block-size: var(--bf-control-box-size-compact);
7551
- padding-inline: calc(var(--bf-baseline) * 0.5);
7775
+ min-block-size: var(--bf-interface-row-occupied-block-size);
7776
+ padding-inline: var(--bf-inline-unit);
7552
7777
  position: absolute;
7553
7778
  right: 0;
7554
7779
  }
@@ -7586,8 +7811,8 @@ html.u-baseline-grid::after {
7586
7811
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-icon) {
7587
7812
  align-items: center;
7588
7813
  display: inline-flex;
7589
- flex: 0 0 1rem;
7590
- inline-size: 1rem;
7814
+ flex: 0 0 var(--bf-disclosure-icon-inline-size);
7815
+ inline-size: var(--bf-disclosure-icon-inline-size);
7591
7816
  justify-content: center;
7592
7817
  transform: translateY(var(--bf-side-navigation-icon-optical-offset-block));
7593
7818
  }
@@ -7597,7 +7822,7 @@ html.u-baseline-grid::after {
7597
7822
  }
7598
7823
 
7599
7824
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
7600
- --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - 1rem - var(--bf-side-navigation-icon-gap)));
7825
+ --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-side-navigation-icon-gap)));
7601
7826
  align-items: baseline;
7602
7827
  column-gap: var(--bf-side-navigation-icon-gap);
7603
7828
  }
@@ -7606,8 +7831,8 @@ html.u-baseline-grid::after {
7606
7831
  icon without collapsing the shared icon track and pulling their copy left. */
7607
7832
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text):not(:has(> .bf-side-navigation-icon))::before {
7608
7833
  content: "";
7609
- flex: 0 0 1rem;
7610
- inline-size: 1rem;
7834
+ flex: 0 0 var(--bf-disclosure-icon-inline-size);
7835
+ inline-size: var(--bf-disclosure-icon-inline-size);
7611
7836
  }
7612
7837
 
7613
7838
  /* A collapsed icon rail cannot communicate an iconless destination. Remove
@@ -7719,8 +7944,8 @@ html.u-baseline-grid::after {
7719
7944
  display: block;
7720
7945
  margin: 0;
7721
7946
  overflow: hidden;
7722
- padding-block-end: var(--bf-single-line-row-in-box-padding-block-end);
7723
- padding-block-start: var(--bf-single-line-row-in-box-padding-block-start);
7947
+ padding-block-end: var(--bf-in-box-row-padding-block-end);
7948
+ padding-block-start: var(--bf-in-box-row-padding-block-start);
7724
7949
  padding-inline: var(--bf-component-inline-inset-action);
7725
7950
  text-align: left;
7726
7951
  text-decoration: none;
@@ -7758,6 +7983,8 @@ html.u-baseline-grid::after {
7758
7983
  }
7759
7984
 
7760
7985
  :where(.bf-theme) :where(.bf-tooltip) {
7986
+ --bf-tooltip-arrow-size: calc(var(--bf-baseline) * 0.5);
7987
+ --bf-tooltip-arrow-offset-inline: calc(var(--bf-tooltip-arrow-size) * 1.5);
7761
7988
  display: inline-flex;
7762
7989
  position: relative;
7763
7990
  text-decoration: inherit;
@@ -7779,7 +8006,7 @@ html.u-baseline-grid::after {
7779
8006
  box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-color-border-default), 0 0.75rem 2rem rgba(0, 0, 0, 0.24);
7780
8007
  color: var(--bf-color-text-default);
7781
8008
  inline-size: max-content;
7782
- left: 0;
8009
+ inset-inline-start: 0;
7783
8010
  margin: 0;
7784
8011
  max-inline-size: min(20rem, calc(100vw - (var(--bf-baseline) * 4)));
7785
8012
  opacity: 0;
@@ -7803,17 +8030,17 @@ html.u-baseline-grid::after {
7803
8030
 
7804
8031
  :where(.bf-theme) :where(.bf-tooltip-message)::before {
7805
8032
  block-size: 0;
7806
- border-bottom: calc(var(--bf-baseline) * 0.5) solid var(--bf-color-background-alt);
7807
- border-inline: calc(var(--bf-baseline) * 0.5) solid transparent;
8033
+ border-bottom: var(--bf-tooltip-arrow-size) solid var(--bf-color-background-alt);
8034
+ border-inline: var(--bf-tooltip-arrow-size) solid transparent;
7808
8035
  bottom: 100%;
7809
8036
  content: "";
7810
8037
  inline-size: 0;
7811
- left: calc(var(--bf-baseline) * 0.75);
8038
+ inset-inline-start: var(--bf-tooltip-arrow-offset-inline);
7812
8039
  position: absolute;
7813
8040
  }
7814
8041
 
7815
8042
  :where(.bf-theme) :where(.bf-tooltip.is-detached) > :where(.bf-tooltip-message) {
7816
- left: auto;
8043
+ inset-inline-start: auto;
7817
8044
  pointer-events: auto;
7818
8045
  position: static;
7819
8046
  top: auto;
@@ -7825,23 +8052,23 @@ html.u-baseline-grid::after {
7825
8052
  }
7826
8053
 
7827
8054
  :where(.bf-theme) :where(.bf-tooltip.is-btm-center) > :where(.bf-tooltip-message) {
7828
- left: 50%;
8055
+ inset-inline-start: 50%;
7829
8056
  transform: translate(-50%, calc(var(--bf-baseline) - var(--bf-border-width)));
7830
8057
  }
7831
8058
 
7832
8059
  :where(.bf-theme) :where(.bf-tooltip.is-btm-center) > :where(.bf-tooltip-message)::before {
7833
- left: 50%;
8060
+ inset-inline-start: 50%;
7834
8061
  transform: translateX(-50%);
7835
8062
  }
7836
8063
 
7837
8064
  :where(.bf-theme) :where(.bf-tooltip.is-btm-right) > :where(.bf-tooltip-message) {
7838
- left: auto;
7839
- right: 0;
8065
+ inset-inline-end: 0;
8066
+ inset-inline-start: auto;
7840
8067
  }
7841
8068
 
7842
8069
  :where(.bf-theme) :where(.bf-tooltip.is-btm-right) > :where(.bf-tooltip-message)::before {
7843
- left: auto;
7844
- right: calc(var(--bf-baseline) * 0.75);
8070
+ inset-inline-end: var(--bf-tooltip-arrow-offset-inline);
8071
+ inset-inline-start: auto;
7845
8072
  }
7846
8073
 
7847
8074
  :where(.bf-theme) :where(.bf-tooltip.is-top-left, .bf-tooltip.is-top-center, .bf-tooltip.is-top-right) > :where(.bf-tooltip-message) {
@@ -7852,30 +8079,30 @@ html.u-baseline-grid::after {
7852
8079
 
7853
8080
  :where(.bf-theme) :where(.bf-tooltip.is-top-left, .bf-tooltip.is-top-center, .bf-tooltip.is-top-right) > :where(.bf-tooltip-message)::before {
7854
8081
  border-bottom: 0;
7855
- border-inline: calc(var(--bf-baseline) * 0.5) solid transparent;
7856
- border-top: calc(var(--bf-baseline) * 0.5) solid var(--bf-color-background-alt);
8082
+ border-inline: var(--bf-tooltip-arrow-size) solid transparent;
8083
+ border-top: var(--bf-tooltip-arrow-size) solid var(--bf-color-background-alt);
7857
8084
  bottom: auto;
7858
8085
  top: 100%;
7859
8086
  }
7860
8087
 
7861
8088
  :where(.bf-theme) :where(.bf-tooltip.is-top-center) > :where(.bf-tooltip-message) {
7862
- left: 50%;
8089
+ inset-inline-start: 50%;
7863
8090
  transform: translate(-50%, calc(var(--bf-baseline) * -1));
7864
8091
  }
7865
8092
 
7866
8093
  :where(.bf-theme) :where(.bf-tooltip.is-top-center) > :where(.bf-tooltip-message)::before {
7867
- left: 50%;
8094
+ inset-inline-start: 50%;
7868
8095
  transform: translateX(-50%);
7869
8096
  }
7870
8097
 
7871
8098
  :where(.bf-theme) :where(.bf-tooltip.is-top-right) > :where(.bf-tooltip-message) {
7872
- left: auto;
7873
- right: 0;
8099
+ inset-inline-end: 0;
8100
+ inset-inline-start: auto;
7874
8101
  }
7875
8102
 
7876
8103
  :where(.bf-theme) :where(.bf-tooltip.is-top-right) > :where(.bf-tooltip-message)::before {
7877
- left: auto;
7878
- right: calc(var(--bf-baseline) * 0.75);
8104
+ inset-inline-end: var(--bf-tooltip-arrow-offset-inline);
8105
+ inset-inline-start: auto;
7879
8106
  }
7880
8107
 
7881
8108
  :where(.bf-theme) :where(nav.bf-pagination) {
@@ -7909,9 +8136,10 @@ html.u-baseline-grid::after {
7909
8136
  font-weight: var(--bf-body-font-weight, 400);
7910
8137
  line-height: var(--bf-body-line-height, 1.5rem);
7911
8138
  color: var(--bf-color-text-muted);
7912
- min-block-size: var(--bf-control-box-size);
7913
- padding-block: var(--bf-control-block-padding);
7914
- padding-inline: calc(var(--bf-baseline) * 0.5);
8139
+ border-block: var(--bf-border-width) solid transparent;
8140
+ margin-block-end: var(--bf-interface-row-compensation-block-end);
8141
+ padding-block: var(--bf-interface-row-padding-block);
8142
+ padding-inline: var(--bf-inline-unit);
7915
8143
  }
7916
8144
 
7917
8145
  :where(.bf-theme) :where(.bf-pagination-link, .bf-pagination-link.is-previous, .bf-pagination-link.is-next) {
@@ -7927,16 +8155,20 @@ html.u-baseline-grid::after {
7927
8155
  color: var(--bf-color-text-default);
7928
8156
  cursor: pointer;
7929
8157
  display: inline-flex;
7930
- gap: calc(var(--bf-baseline) * 0.5);
8158
+ gap: var(--bf-leading-mark-gap);
7931
8159
  justify-content: center;
7932
- margin-bottom: var(--bf-single-line-row-margin-block-end);
7933
- min-inline-size: var(--bf-control-box-size);
7934
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
7935
- padding-inline: var(--bf-control-inline-padding-action-bordered);
8160
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
8161
+ padding-block: var(--bf-interface-row-padding-block);
8162
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
7936
8163
  text-align: center;
7937
8164
  text-decoration: none;
7938
8165
  }
7939
8166
 
8167
+ :where(.bf-theme) :where(.bf-pagination-link:not(.is-previous):not(.is-next)) {
8168
+ min-inline-size: var(--bf-square-block-size);
8169
+ padding-inline: 0;
8170
+ }
8171
+
7940
8172
  :where(.bf-theme) :where(.bf-pagination-link:hover, .bf-pagination-link.is-previous:hover, .bf-pagination-link.is-next:hover) {
7941
8173
  background-color: var(--bf-color-background-hover);
7942
8174
  }
@@ -8033,9 +8265,9 @@ html.u-baseline-grid::after {
8033
8265
  gap: var(--bf-disclosure-gap);
8034
8266
  inline-size: 100%;
8035
8267
  justify-content: flex-start;
8036
- margin-block-end: var(--bf-single-line-row-margin-block-end);
8037
- padding-block: var(--bf-single-line-row-padding-block);
8038
- padding-inline: 0;
8268
+ margin-block-end: var(--bf-interface-row-compensation-block-end);
8269
+ padding-block: var(--bf-interface-row-padding-block);
8270
+ padding-inline: var(--bf-disclosure-group-inset) 0;
8039
8271
  text-align: left;
8040
8272
  }
8041
8273
 
@@ -8096,7 +8328,7 @@ html.u-baseline-grid::after {
8096
8328
  }
8097
8329
 
8098
8330
  :where(.bf-theme) :where(.bf-modal.is-workflow) {
8099
- --bf-modal-workflow-viewport-gap: calc(var(--bf-baseline) * 4);
8331
+ --bf-modal-workflow-viewport-gap: var(--bf-component-inline-inset-continuation);
8100
8332
  --bf-modal-workflow-max-inline-size: 42rem;
8101
8333
  --bf-modal-workflow-min-inline-size: 32rem;
8102
8334
  --bf-modal-workflow-max-block-size: 40rem;
@@ -8136,7 +8368,7 @@ html.u-baseline-grid::after {
8136
8368
  :where(.bf-theme) :where(.bf-modal-header, .bf-modal-body, .bf-modal-footer) {
8137
8369
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
8138
8370
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
8139
- padding-inline: var(--bf-component-inline-inset-continuation);
8371
+ padding-inline: var(--bf-panel-padding-inline);
8140
8372
  }
8141
8373
 
8142
8374
  :where(.bf-theme) :where(.bf-modal-header) {
@@ -8311,7 +8543,7 @@ html.u-baseline-grid::after {
8311
8543
 
8312
8544
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon) {
8313
8545
  cursor: copy;
8314
- padding-inline-start: calc(var(--bf-component-inline-inset-continuation) + (var(--bf-baseline) * 3));
8546
+ padding-inline-start: calc(var(--bf-component-inline-inset-continuation) + var(--bf-leading-mark-gap));
8315
8547
  position: relative;
8316
8548
  }
8317
8549
 
@@ -8415,8 +8647,8 @@ html.u-baseline-grid::after {
8415
8647
  * visible and exposed at a time. */
8416
8648
  :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) {
8417
8649
  align-items: start;
8418
- column-gap: calc(var(--bf-baseline) * 2);
8419
- padding-inline-end: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
8650
+ column-gap: var(--bf-leading-mark-gap);
8651
+ padding-inline-end: var(--bf-panel-content-padding-inline);
8420
8652
  }
8421
8653
 
8422
8654
  :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) {
@@ -8509,7 +8741,7 @@ html.u-baseline-grid::after {
8509
8741
  :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-link, .bf-side-navigation-text) {
8510
8742
  align-items: center;
8511
8743
  justify-content: center;
8512
- padding-inline: calc(var(--bf-baseline) * 1.25);
8744
+ padding-inline: var(--bf-component-inline-inset-action);
8513
8745
  }
8514
8746
 
8515
8747
  :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-list)::after {
@@ -8517,7 +8749,7 @@ html.u-baseline-grid::after {
8517
8749
  }
8518
8750
 
8519
8751
  :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-item.is-title > .bf-side-navigation-link, .bf-side-navigation-item.is-title > .bf-side-navigation-text) {
8520
- padding-inline: calc(var(--bf-baseline) * 1.25);
8752
+ padding-inline: var(--bf-component-inline-inset-action);
8521
8753
  }
8522
8754
 
8523
8755
  :where(.bf-theme) :where(.bf-application:has(> .bf-aside.is-pinned:not(.is-collapsed))) {
@@ -8644,7 +8876,7 @@ html.u-baseline-grid::after {
8644
8876
  cursor: ew-resize;
8645
8877
  display: none;
8646
8878
  inset-block: 0;
8647
- inset-inline-start: calc(var(--bf-baseline) * -3);
8879
+ inset-inline-start: calc(var(--bf-inline-unit) * -3);
8648
8880
  outline: none;
8649
8881
  position: absolute;
8650
8882
  touch-action: none;
@@ -8661,7 +8893,7 @@ html.u-baseline-grid::after {
8661
8893
  }
8662
8894
 
8663
8895
  :where(.bf-theme) :where(.bf-application-aside-resize-handle)::after {
8664
- background: var(--bf-color-border-default);
8896
+ background: transparent;
8665
8897
  border-radius: 62.4375rem;
8666
8898
  content: "";
8667
8899
  inset-block: var(--bf-panel-padding-block);
@@ -8683,7 +8915,9 @@ html.u-baseline-grid::after {
8683
8915
  outline-offset: -0.125rem;
8684
8916
  }
8685
8917
 
8686
- @media (min-width: 64.75rem) {
8918
+ /* Application navigation becomes persistent at 48rem. Standalone top and
8919
+ * document navigation keep their own large-screen contracts. */
8920
+ @media (min-width: 48rem) {
8687
8921
  :where(.bf-theme) :where(.bf-application:has(> .bf-navigation)) {
8688
8922
  grid-template-areas:
8689
8923
  "navigation-bar navigation-bar"
@@ -8726,6 +8960,10 @@ html.u-baseline-grid::after {
8726
8960
  display: none;
8727
8961
  }
8728
8962
 
8963
+ :where(.bf-theme) :where(.bf-application) :where(.bf-side-navigation-toggle) {
8964
+ display: none;
8965
+ }
8966
+
8729
8967
  :where(.bf-theme) :where(.bf-navigation-drawer),
8730
8968
  :where(.bf-theme) :where(.bf-navigation:not(.is-collapsed)) > :where(.bf-navigation-drawer) {
8731
8969
  block-size: 100%;
@@ -8959,7 +9197,7 @@ html.u-baseline-grid::after {
8959
9197
  overflow: hidden;
8960
9198
  overflow-wrap: anywhere;
8961
9199
  padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8962
- padding-inline: var(--bf-space-2) 0;
9200
+ padding-inline: var(--bf-component-inline-inset-action) 0;
8963
9201
  position: relative;
8964
9202
  text-decoration: none;
8965
9203
  text-overflow: ellipsis;
@@ -9002,7 +9240,7 @@ html.u-baseline-grid::after {
9002
9240
  }
9003
9241
 
9004
9242
  :where(.bf-theme) :where(.bf-in-page-navigation-list .bf-in-page-navigation-list .bf-in-page-navigation-link) {
9005
- padding-inline-start: var(--bf-space-4);
9243
+ padding-inline-start: calc(var(--bf-component-inline-inset-action) * 2);
9006
9244
  }
9007
9245
 
9008
9246
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle) {
@@ -9013,15 +9251,16 @@ html.u-baseline-grid::after {
9013
9251
  line-height: var(--bf-body-line-height, 1.5rem);
9014
9252
  align-items: center;
9015
9253
  background: var(--bf-color-background-default);
9016
- border: 0;
9254
+ border: 0 solid transparent;
9255
+ border-block-width: var(--bf-border-width);
9017
9256
  color: var(--bf-color-text-default);
9018
9257
  cursor: pointer;
9019
9258
  display: none;
9020
9259
  justify-content: center;
9021
9260
  margin: 0;
9022
- min-block-size: var(--bf-control-box-size-compact);
9023
- padding-block: var(--bf-control-block-padding-compact);
9024
- padding-inline: var(--bf-space-1);
9261
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
9262
+ padding-block-start: var(--bf-interface-row-padding-block);
9263
+ padding-inline: var(--bf-leading-mark-gap);
9025
9264
  }
9026
9265
 
9027
9266
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle:hover) {
@@ -9039,6 +9278,7 @@ html.u-baseline-grid::after {
9039
9278
 
9040
9279
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle > .bf-icon) {
9041
9280
  --bf-icon-size: var(--bf-icon-size-default);
9281
+ margin-block-start: 0;
9042
9282
  }
9043
9283
 
9044
9284
  @container bf-in-page-navigation (width < 40rem) {
@@ -9082,10 +9322,12 @@ html.u-baseline-grid::after {
9082
9322
  }
9083
9323
 
9084
9324
  :where(.bf-theme) :where(.bf-in-page-navigation-link) {
9325
+ border-block: var(--bf-border-width) solid transparent;
9085
9326
  display: block;
9086
9327
  overflow: hidden;
9087
- padding-block: calc(var(--bf-control-block-padding-compact) - var(--bf-border-width));
9088
- padding-inline: var(--bf-space-1);
9328
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
9329
+ padding-block-start: var(--bf-interface-row-padding-block);
9330
+ padding-inline: var(--bf-leading-mark-gap);
9089
9331
  text-overflow: ellipsis;
9090
9332
  white-space: nowrap;
9091
9333
  }
@@ -9120,7 +9362,7 @@ html.u-baseline-grid::after {
9120
9362
  grid-row: 1;
9121
9363
  margin: 0;
9122
9364
  padding-block: calc(var(--bf-h6-nudge-start) + var(--bf-space-1)) calc(var(--bf-h6-nudge-end) + var(--bf-space-1));
9123
- padding-inline: var(--bf-space-2);
9365
+ padding-inline: var(--bf-component-inline-inset-action);
9124
9366
  }
9125
9367
 
9126
9368
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded > .bf-in-page-navigation-nav > .bf-in-page-navigation-list, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) > .bf-in-page-navigation-nav > .bf-in-page-navigation-list) {
@@ -9146,7 +9388,7 @@ html.u-baseline-grid::after {
9146
9388
  display: -webkit-box;
9147
9389
  overflow-wrap: anywhere;
9148
9390
  padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
9149
- padding-inline: var(--bf-space-2) 0;
9391
+ padding-inline: var(--bf-component-inline-inset-action) 0;
9150
9392
  white-space: normal;
9151
9393
  }
9152
9394
 
@@ -9171,7 +9413,7 @@ html.u-baseline-grid::after {
9171
9413
  * controller contracts while matching Vanilla's reduced chrome. */
9172
9414
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) {
9173
9415
  background: var(--bf-color-background-alt);
9174
- --bf-top-navigation-link-padding-block: var(--bf-control-block-padding-compact);
9416
+ --bf-top-navigation-reduced-row-block-size: var(--bf-interface-row-occupied-block-size);
9175
9417
  }
9176
9418
 
9177
9419
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo-tag) {
@@ -9184,10 +9426,13 @@ html.u-baseline-grid::after {
9184
9426
 
9185
9427
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo) > :where(.bf-top-navigation-link),
9186
9428
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-link, .bf-top-navigation-menu-toggle, .bf-top-navigation-search-toggle) {
9429
+ border: 0 solid transparent;
9430
+ border-block-width: var(--bf-border-width);
9187
9431
  color: var(--bf-color-text-muted);
9188
9432
  font-size: var(--bf-body-font-size);
9189
9433
  line-height: var(--bf-body-line-height);
9190
- padding-block: var(--bf-top-navigation-link-padding-block);
9434
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
9435
+ padding-block-start: var(--bf-interface-row-padding-block);
9191
9436
  }
9192
9437
 
9193
9438
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo.is-canonical-tagged) > :where(.bf-top-navigation-link) {
@@ -9212,7 +9457,7 @@ html.u-baseline-grid::after {
9212
9457
 
9213
9458
  @media (min-width: 64.75rem) {
9214
9459
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-dropdown) {
9215
- top: calc((var(--bf-top-navigation-link-padding-block) * 2) + var(--bf-body-line-height));
9460
+ top: var(--bf-top-navigation-reduced-row-block-size);
9216
9461
  }
9217
9462
 
9218
9463
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-search) {
@@ -9221,7 +9466,7 @@ html.u-baseline-grid::after {
9221
9466
  box-shadow: 0 calc(var(--bf-baseline) * 0.5) calc(var(--bf-baseline) * 2) rgba(0, 0, 0, 0.16);
9222
9467
  inset-block-start: 100%;
9223
9468
  inset-inline-end: 0;
9224
- padding: var(--bf-control-block-padding-compact) var(--bf-top-navigation-link-padding-inline);
9469
+ padding: var(--bf-panel-padding-block) var(--bf-top-navigation-link-padding-inline);
9225
9470
  position: absolute;
9226
9471
  }
9227
9472
 
@@ -9269,6 +9514,7 @@ html.u-baseline-grid::after {
9269
9514
  color: var(--bf-color-text-default);
9270
9515
  margin: 0;
9271
9516
  padding-block-end: 0;
9517
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
9272
9518
  }
9273
9519
 
9274
9520
  :where(.bf-theme) :where(.bf-table-of-contents-list) {
@@ -9300,9 +9546,11 @@ html.u-baseline-grid::after {
9300
9546
  border-block: var(--bf-border-width) solid transparent;
9301
9547
  color: var(--bf-color-link-default);
9302
9548
  display: block;
9303
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
9549
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
9304
9550
  overflow-wrap: anywhere;
9305
- padding-block: var(--bf-single-line-row-padding-block);
9551
+ padding-block: var(--bf-interface-row-padding-block);
9552
+ padding-inline-end: var(--bf-component-inline-inset-action);
9553
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
9306
9554
  text-decoration: none;
9307
9555
  }
9308
9556
 
@@ -9326,12 +9574,12 @@ html.u-baseline-grid::after {
9326
9574
  }
9327
9575
 
9328
9576
  :where(.bf-theme) :where(.bf-table-of-contents-list .bf-table-of-contents-list) {
9329
- margin-inline-start: var(--bf-space-2);
9577
+ margin-inline-start: var(--bf-component-inline-inset-action);
9330
9578
  }
9331
9579
 
9332
9580
  @container bf-table-of-contents (width < 20rem) {
9333
9581
  :where(.bf-theme) :where(.bf-table-of-contents-list .bf-table-of-contents-list) {
9334
- margin-inline-start: var(--bf-space-1);
9582
+ margin-inline-start: var(--bf-leading-mark-gap);
9335
9583
  }
9336
9584
  }
9337
9585
 
@@ -9430,9 +9678,9 @@ html.u-baseline-grid::after {
9430
9678
  }
9431
9679
 
9432
9680
  /* ------------------------------------------------------------------ */
9433
- /* Header split (≥ 45rem): the shared readable 50/50 title/content split. */
9681
+ /* Header split (≥ 38.75rem): the standard medium 50/50 title/content split. */
9434
9682
  /* ------------------------------------------------------------------ */
9435
- @container (width >= 45rem) {
9683
+ @container (width >= 38.75rem) {
9436
9684
  :where(.bf-theme) :where(.bf-tiered-list:not(.is-description-full-width)) :where(.bf-tiered-list-header) {
9437
9685
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
9438
9686
  }
@@ -9811,35 +10059,13 @@ html.u-baseline-grid::after {
9811
10059
  grid-column: 1 / -1;
9812
10060
  }
9813
10061
 
9814
- /* Canonical app-tier preset: light application chrome, Ubuntu Sans, and app-surface control overrides. */
10062
+ /* Canonical app-tier preset: application chrome only. Component
10063
+ typography and spacing resolve from the tier inputs in their source modules. */
9815
10064
  :where(.bf-theme.bf-tier-app) {
9816
10065
  --bf-app-demo-page-bg: var(--vf-color-background-alt, #f7f7f7);
9817
- --bf-radius: 0;
9818
10066
  color-scheme: light;
9819
10067
  }
9820
10068
 
9821
- :where(.bf-theme.bf-tier-app) :where(.bf-form-label, .bf-form-help, .bf-button, .bf-button.is-base, .bf-status-label, .bf-chip, .bf-checkbox-label, .bf-radio-label, .bf-tabs-link, .bf-accordion-tab, .bf-validation-message) {
9822
- font-family: inherit;
9823
- font-size: var(--bf-body-font-size);
9824
- font-style: normal;
9825
- font-weight: 400;
9826
- line-height: var(--bf-body-line-height);
9827
- }
9828
-
9829
- /* Preserve the public nested fit after the preset's general typography pass.
9830
- The modifier remains explicit and zero-specificity in every app scope. */
9831
- :where(.bf-theme.bf-tier-app) :where(.bf-status-label.is-nested, .bf-chip.is-nested) {
9832
- line-height: var(--bf-nested-auxiliary-line-height);
9833
- }
9834
-
9835
- :where(.bf-theme.bf-tier-app) :where(.bf-input, .bf-button, .bf-button.is-base) {
9836
- font-family: inherit;
9837
- font-size: var(--bf-body-font-size);
9838
- font-style: normal;
9839
- font-weight: 400;
9840
- line-height: var(--bf-body-line-height);
9841
- }
9842
-
9843
10069
  :where(.bf-theme.bf-tier-app) :where(.bf-application) {
9844
10070
  background: var(--bf-app-demo-page-bg);
9845
10071
  }
@@ -9850,13 +10076,6 @@ html.u-baseline-grid::after {
9850
10076
  box-shadow: 0 0.625rem 1.25rem rgba(0, 0, 0, 0.12), 0 0 0.1875rem rgba(0, 0, 0, 0.12);
9851
10077
  }
9852
10078
 
9853
- :where(.bf-theme.bf-tier-app) :where(.bf-panel-header) {
9854
- align-items: start;
9855
- gap: calc(var(--bf-baseline) * 1.5);
9856
- padding-block-end: var(--bf-panel-padding-block);
9857
- padding-block-start: var(--bf-panel-padding-block);
9858
- }
9859
-
9860
10079
  :where(.bf-theme.bf-tier-app) :where(.bf-panel-header.is-navigation-brand) {
9861
10080
  gap: 0;
9862
10081
  padding-block: 0;
@@ -9867,22 +10086,10 @@ html.u-baseline-grid::after {
9867
10086
  }
9868
10087
 
9869
10088
  :where(.bf-theme.bf-tier-app) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) {
9870
- gap: calc(var(--bf-baseline) * 2);
10089
+ gap: var(--bf-leading-mark-gap);
9871
10090
  padding-block: 0;
9872
10091
  }
9873
10092
 
9874
- :where(.bf-theme.bf-tier-app) :where(.bf-panel-controls) {
9875
- gap: calc(var(--bf-baseline) * 1.5);
9876
- }
9877
-
9878
- :where(.bf-theme.bf-tier-app) :where(.bf-navigation-bar, .bf-navigation-drawer, .bf-aside) :where(.bf-panel-title) {
9879
- font-family: inherit;
9880
- font-size: 1rem;
9881
- font-style: normal;
9882
- font-weight: 400;
9883
- line-height: 1.5rem;
9884
- }
9885
-
9886
10093
  :where(.bf-theme.bf-tier-app) :where(.bf-side-navigation-link.is-active, .bf-side-navigation-link[aria-current='page'], .bf-side-navigation-link[aria-current='true']) {
9887
10094
  background: transparent;
9888
10095
  box-shadow: inset var(--bf-bar-thickness) 0 0 var(--vf-color-link-default, #0066cc);
@@ -9890,8 +10097,7 @@ html.u-baseline-grid::after {
9890
10097
 
9891
10098
  :where(.bf-theme.bf-tier-app) :where(.bf-navigation-bar),
9892
10099
  :where(.bf-theme.bf-tier-app) :where(.bf-navigation-drawer),
9893
- :where(.bf-theme.bf-tier-app) :where(.bf-aside),
9894
- :where(.bf-theme.bf-tier-app) :where(.bf-panel) {
10100
+ :where(.bf-theme.bf-tier-app) :where(.bf-aside) {
9895
10101
  background: var(--vf-color-background-default, #ffffff);
9896
10102
  }
9897
10103