baseline-foundry 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +17 -9
  2. package/config/experiments/ibm-plex-engine-smoke.json +1 -1
  3. package/config/experiments/ubuntu-engine-smoke.json +1 -1
  4. package/config/foundation-theme.json +1 -1
  5. package/config/tiers/app.json +6 -6
  6. package/config/tiers/documentation.json +2 -2
  7. package/config/tiers/editorial.json +1 -1
  8. package/config/tiers/os.json +6 -6
  9. package/dist/baseline-grid-overlay.js +2 -2
  10. package/dist/build.js +4 -4
  11. package/dist/code-snippet.js +1 -1
  12. package/dist/css-app-tier.js +16 -5
  13. package/dist/css-components/article-pagination.js +9 -8
  14. package/dist/css-components/button-actions.js +24 -4
  15. package/dist/css-components/cards-options.js +8 -8
  16. package/dist/css-components/chip-badge-status.d.ts +0 -3
  17. package/dist/css-components/chip-badge-status.js +57 -10
  18. package/dist/css-components/content-card.d.ts +7 -7
  19. package/dist/css-components/content-card.js +17 -16
  20. package/dist/css-components/control-row.d.ts +1 -1
  21. package/dist/css-components/control-row.js +1 -1
  22. package/dist/css-components/document-navigation.js +66 -29
  23. package/dist/css-components/editorial-content.js +1 -1
  24. package/dist/css-components/interactive-feedback.js +50 -28
  25. package/dist/css-components/interactive-tables.js +13 -8
  26. package/dist/css-components/legacy-navigation.d.ts +0 -1
  27. package/dist/css-components/legacy-navigation.js +108 -32
  28. package/dist/css-components/linked-logo-site-layout.d.ts +3 -3
  29. package/dist/css-components/linked-logo-site-layout.js +17 -20
  30. package/dist/css-components/list-tree.js +21 -19
  31. package/dist/css-components/list.js +9 -7
  32. package/dist/css-components/logo-media.d.ts +6 -6
  33. package/dist/css-components/logo-media.js +38 -27
  34. package/dist/css-components/navigation-layout.js +6 -8
  35. package/dist/css-components/panel.js +12 -12
  36. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  37. package/dist/css-components/search-box-and-filter.js +18 -19
  38. package/dist/css-components/sites-editorial-ports.d.ts +3 -4
  39. package/dist/css-components/sites-editorial-ports.js +61 -29
  40. package/dist/css-components/sites-foundation.js +15 -19
  41. package/dist/css-components/sites-rich-lists.d.ts +5 -5
  42. package/dist/css-components/sites-rich-lists.js +26 -36
  43. package/dist/css-components/static-content-ports.d.ts +3 -3
  44. package/dist/css-components/static-content-ports.js +51 -37
  45. package/dist/css-components/tab-section.d.ts +3 -3
  46. package/dist/css-components/tab-section.js +34 -26
  47. package/dist/css-components/table.js +4 -7
  48. package/dist/css-components/tabs-choice-breadcrumbs.js +25 -21
  49. package/dist/css-components/tiered-list-equal-height-row.js +10 -10
  50. package/dist/css-components.js +243 -124
  51. package/dist/css-grid.d.ts +1 -1
  52. package/dist/css-grid.js +18 -8
  53. package/dist/css.js +94 -18
  54. package/dist/experiments/ibm-plex-engine-smoke/styles.css +1005 -563
  55. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +2 -2
  56. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +1 -1
  57. package/dist/in-page-navigation.js +1 -1
  58. package/dist/presets/app-tier/styles.css +1046 -593
  59. package/dist/presets/app-tier/surfaces.json +17 -17
  60. package/dist/presets/app-tier/tokens.json +7 -7
  61. package/dist/presets/prose/styles.css +1036 -587
  62. package/dist/presets/prose/surfaces.json +17 -17
  63. package/dist/presets/prose/tokens.json +1 -1
  64. package/dist/resizable-aside.js +12 -4
  65. package/dist/styles.css +1036 -587
  66. package/dist/surfaces.json +17 -17
  67. package/dist/tiers/app/styles.css +1046 -593
  68. package/dist/tiers/app/surfaces.json +17 -17
  69. package/dist/tiers/app/tokens.json +7 -7
  70. package/dist/tiers/documentation/styles.css +1037 -588
  71. package/dist/tiers/documentation/surfaces.json +17 -17
  72. package/dist/tiers/documentation/tokens.json +2 -2
  73. package/dist/tiers/editorial/styles.css +1036 -587
  74. package/dist/tiers/editorial/surfaces.json +17 -17
  75. package/dist/tiers/editorial/tokens.json +1 -1
  76. package/dist/tiers/os/styles.css +1042 -593
  77. package/dist/tiers/os/surfaces.json +17 -17
  78. package/dist/tiers/os/tokens.json +7 -7
  79. package/dist/tokens.json +1 -1
  80. package/dist/types.d.ts +1 -1
  81. package/docs/publishing.md +1 -1
  82. package/package.json +2 -2
@@ -10,8 +10,8 @@
10
10
  background-image: linear-gradient(
11
11
  to top,
12
12
  var(--bf-baseline-grid-color),
13
- var(--bf-baseline-grid-color) 1px,
14
- transparent 1px,
13
+ var(--bf-baseline-grid-color) 0.0625rem,
14
+ transparent 0.0625rem,
15
15
  transparent
16
16
  );
17
17
  background-size: 100% var(--bf-baseline-grid-size);
@@ -279,7 +279,7 @@ html.u-baseline-grid::after {
279
279
  --bf-space-8: calc(var(--bf-baseline) * 8);
280
280
  --bf-space-12: calc(var(--bf-baseline) * 12);
281
281
  --bf-space-16: calc(var(--bf-baseline) * 16);
282
- --bf-content-max-width: 96rem;
282
+ --bf-content-max-width: 80rem;
283
283
  --bf-content-padding-inline: 1.5rem;
284
284
  --bf-measure: 38rem;
285
285
  --bf-section-space: 3rem;
@@ -395,13 +395,13 @@ html.u-baseline-grid::after {
395
395
  --bf-space-8: calc(var(--bf-baseline) * 8);
396
396
  --bf-space-12: calc(var(--bf-baseline) * 12);
397
397
  --bf-space-16: calc(var(--bf-baseline) * 16);
398
- --bf-content-max-width: 90rem;
398
+ --bf-content-max-width: 60rem;
399
399
  --bf-content-padding-inline: 1rem;
400
400
  --bf-measure: 40rem;
401
401
  --bf-section-space: 1rem;
402
402
  --bf-section-space-shallow: 0.5rem;
403
403
  --bf-section-space-deep: 2rem;
404
- --bf-strip-space: 4rem;
404
+ --bf-strip-space: 3rem;
405
405
  --bf-grid-gap-inline: 1.5rem;
406
406
  --bf-grid-gap-block: 1.5rem;
407
407
  --bf-page-margin: 2rem;
@@ -511,13 +511,13 @@ html.u-baseline-grid::after {
511
511
  --bf-space-8: calc(var(--bf-baseline) * 8);
512
512
  --bf-space-12: calc(var(--bf-baseline) * 12);
513
513
  --bf-space-16: calc(var(--bf-baseline) * 16);
514
- --bf-content-max-width: 67.5rem;
514
+ --bf-content-max-width: 60rem;
515
515
  --bf-content-padding-inline: 0.75rem;
516
516
  --bf-measure: 30rem;
517
517
  --bf-section-space: 3rem;
518
518
  --bf-section-space-shallow: 1.5rem;
519
519
  --bf-section-space-deep: 6rem;
520
- --bf-strip-space: 3rem;
520
+ --bf-strip-space: 2rem;
521
521
  --bf-grid-gap-inline: 1rem;
522
522
  --bf-grid-gap-block: 1rem;
523
523
  --bf-page-margin: 1rem;
@@ -785,7 +785,7 @@ html.u-baseline-grid::after {
785
785
  :where(.bf-theme) :where(a) {
786
786
  color: var(--bf-color-link);
787
787
  text-decoration: none;
788
- text-decoration-thickness: 1px;
788
+ text-decoration-thickness: 0.0625rem;
789
789
  text-underline-offset: 0.12em;
790
790
  }
791
791
 
@@ -798,8 +798,22 @@ html.u-baseline-grid::after {
798
798
  }
799
799
 
800
800
  :where(.bf-theme) :where(a:focus-visible) {
801
- outline: 2px solid var(--bf-color-focus);
802
- outline-offset: 2px;
801
+ outline: 0.125rem solid var(--bf-color-focus);
802
+ outline-offset: 0.125rem;
803
+ }
804
+
805
+ /* Standalone anchors need the same metric-owned text box as adjacent body
806
+ * controls. Raw anchors remain inline so prose links still participate in the
807
+ * surrounding line box. */
808
+ :where(.bf-theme) :where(a.bf-text-link) {
809
+ display: inline-block;
810
+ font-family: var(--bf-body-font-family);
811
+ font-size: var(--bf-body-font-size);
812
+ font-style: var(--bf-body-font-style);
813
+ font-weight: var(--bf-body-font-weight);
814
+ line-height: var(--bf-body-line-height);
815
+ margin-block: 0 var(--bf-body-margin-bottom);
816
+ padding-block: var(--bf-body-nudge-start) 0;
803
817
  }
804
818
 
805
819
  :where(.bf-theme) :where(code) {
@@ -810,7 +824,7 @@ html.u-baseline-grid::after {
810
824
  :where(.bf-theme) :where(.bf-page) {
811
825
  margin-inline: auto;
812
826
  max-inline-size: var(--bf-content-max-width);
813
- padding-inline: max(var(--bf-page-margin), var(--bf-content-padding-inline));
827
+ padding-inline: var(--bf-page-margin);
814
828
  }
815
829
 
816
830
  :where(.bf-theme) :where(.bf-page.is-fill) {
@@ -893,7 +907,14 @@ html.u-baseline-grid::after {
893
907
  }
894
908
 
895
909
  :where(.bf-theme) :where(.bf-stack.is-flush) {
896
- --bf-stack-space: 0px;
910
+ --bf-stack-space: 0rem;
911
+ }
912
+
913
+ /* A metric-flush stack is an explicit relationship between adjacent text
914
+ * roles. It retains the outer role nudges while cancelling only the preceding
915
+ * end compensation and following start nudge; no guessed negative gap is used. */
916
+ :where(.bf-theme) :where(.bf-stack.is-metric-flush) {
917
+ --bf-stack-space: 0rem;
897
918
  }
898
919
 
899
920
  :where(.bf-theme) :where(.bf-stack.is-extra-dense) {
@@ -921,10 +942,19 @@ html.u-baseline-grid::after {
921
942
  }
922
943
 
923
944
  :where(.bf-theme) :where(.bf-cluster) {
945
+ --bf-cluster-space: var(--bf-space-2);
924
946
  align-items: flex-start;
925
947
  display: flex;
926
948
  flex-wrap: wrap;
927
- gap: var(--bf-space-2);
949
+ gap: var(--bf-cluster-space);
950
+ }
951
+
952
+ :where(.bf-theme) :where(.bf-cluster.is-dense) {
953
+ --bf-cluster-space: var(--bf-space-1);
954
+ }
955
+
956
+ :where(.bf-theme) :where(.bf-cluster.is-nowrap) {
957
+ flex-wrap: nowrap;
928
958
  }
929
959
 
930
960
  :where(.bf-theme) :where(.bf-cluster.is-split) {
@@ -1046,6 +1076,14 @@ html.u-baseline-grid::after {
1046
1076
  }
1047
1077
 
1048
1078
 
1079
+ :where(.bf-theme) .bf-stack.is-metric-flush > :where(blockquote, p, h1, h2, h3, h4, h5, h6, .bf-body, .bf-h1, .bf-h2, .bf-h3, .bf-h4, .bf-h5, .bf-h6):has(+ :where(blockquote, p, h1, h2, h3, h4, h5, h6, .bf-body, .bf-h1, .bf-h2, .bf-h3, .bf-h4, .bf-h5, .bf-h6)) {
1080
+ margin-block-end: 0;
1081
+ }
1082
+
1083
+ :where(.bf-theme) .bf-stack.is-metric-flush > :where(blockquote, p, h1, h2, h3, h4, h5, h6, .bf-body, .bf-h1, .bf-h2, .bf-h3, .bf-h4, .bf-h5, .bf-h6) + :where(blockquote, p, h1, h2, h3, h4, h5, h6, .bf-body, .bf-h1, .bf-h2, .bf-h3, .bf-h4, .bf-h5, .bf-h6) {
1084
+ padding-block-start: 0;
1085
+ }
1086
+
1049
1087
  /* DEMO ONLY — Cap-derived nudges are unreliable (ascender ≠ cap height).
1050
1088
  The approximation (line-height + 1cap) / 2 drifts at larger sizes.
1051
1089
  Kept as a reference for why metrics-derived nudges are used instead. */
@@ -1101,10 +1139,36 @@ html.u-baseline-grid::after {
1101
1139
 
1102
1140
  :where(.bf-theme) :where(ul, ol) {
1103
1141
  margin-bottom: 0;
1142
+ padding-block-end: 0;
1104
1143
  }
1105
1144
 
1106
- :where(.bf-theme) :where(.bf-prose ul, .bf-prose ol) {
1107
- padding-inline-start: var(--bf-space-4);
1145
+ :where(.bf-theme) :where(.bf-prose ol) {
1146
+ padding-inline-start: calc(var(--bf-leading-mark-group-inset) + var(--bf-leading-mark-offset) - (var(--bf-leading-mark-size) * 0.5));
1147
+ }
1148
+
1149
+ :where(.bf-theme) :where(.bf-prose ol > li) {
1150
+ padding-inline-start: calc(var(--bf-leading-mark-size) * 0.5);
1151
+ }
1152
+
1153
+ :where(.bf-theme) :where(.bf-prose ul) {
1154
+ list-style: none;
1155
+ padding-inline-start: var(--bf-leading-mark-group-inset);
1156
+ }
1157
+
1158
+ :where(.bf-theme) :where(.bf-prose ul > li) {
1159
+ padding-inline-start: var(--bf-leading-mark-offset);
1160
+ position: relative;
1161
+ }
1162
+
1163
+ :where(.bf-theme) :where(.bf-prose ul > li)::before {
1164
+ background: currentColor;
1165
+ block-size: var(--bf-list-marker-dot-size);
1166
+ border-radius: 50%;
1167
+ content: "";
1168
+ inline-size: var(--bf-list-marker-dot-size);
1169
+ inset-block-start: calc(var(--bf-tick-box-offset) + ((var(--bf-leading-mark-size) - var(--bf-list-marker-dot-size)) * 0.5));
1170
+ inset-inline-start: calc((var(--bf-leading-mark-size) - var(--bf-list-marker-dot-size)) * 0.5);
1171
+ position: absolute;
1108
1172
  }
1109
1173
 
1110
1174
  :where(.bf-theme) :where(.bf-prose li) {
@@ -1114,39 +1178,37 @@ html.u-baseline-grid::after {
1114
1178
  }
1115
1179
 
1116
1180
  :where(.bf-theme) :where(.bf-prose blockquote) {
1117
- border-inline-start: 1px solid var(--bf-color-rule);
1118
- color: var(--bf-color-muted);
1181
+ color: var(--bf-color-text-default);
1119
1182
  font-family: var(--bf-body-font-family, "Ubuntu Sans", "Segoe UI", system-ui, sans-serif);
1120
1183
  font-size: var(--bf-body-font-size, 1rem);
1121
1184
  font-style: var(--bf-body-font-style, normal);
1122
1185
  font-weight: var(--bf-body-font-weight, 400);
1123
1186
  line-height: var(--bf-body-line-height, 1.5rem);
1124
1187
  margin-bottom: var(--bf-body-margin-bottom, 0.09rem);
1125
- max-inline-size: calc(var(--bf-measure) + var(--bf-space-4));
1188
+ max-inline-size: var(--bf-measure);
1126
1189
  padding-block-end: 0rem;
1127
1190
  padding-block-start: var(--bf-body-nudge-start, 0.41rem);
1128
- padding-inline-start: var(--bf-space-3);
1129
1191
  }
1130
1192
 
1131
- :where(.bf-theme) :where(.bf-rule, .bf-prose hr) {
1193
+ :where(.bf-theme) :where(hr) {
1132
1194
  background: var(--bf-color-rule);
1133
- block-size: 1px;
1195
+ block-size: 0.0625rem;
1134
1196
  border: 0;
1135
1197
  inline-size: 100%;
1136
1198
  /* Reserve one half-rem rhythm step after the rule, including its */
1137
1199
  /* thickness, so borderless content does not touch the divider. */
1138
- margin: 0 0 calc(0.5rem - 1px);
1200
+ margin: 0 0 calc(0.5rem - 0.0625rem);
1139
1201
  }
1140
1202
 
1141
1203
  /* Highlight rules share the same scalable emphasis-bar geometry as active
1142
1204
  * navigation, tabs, notifications, and document-navigation markers. */
1143
- :where(.bf-theme) :where(.bf-rule.is-highlighted, .bf-prose hr.is-highlighted) {
1205
+ :where(.bf-theme) :where(hr.is-highlighted) {
1144
1206
  block-size: var(--bf-bar-thickness);
1145
1207
  margin-block-end: calc(0.5rem - var(--bf-bar-thickness));
1146
1208
  }
1147
1209
 
1148
1210
  :where(.bf-theme) :where(.bf-token-row) {
1149
- border-top: 1px solid var(--bf-color-rule);
1211
+ border-top: 0.0625rem solid var(--bf-color-rule);
1150
1212
  display: grid;
1151
1213
  gap: var(--bf-space-1);
1152
1214
  padding-top: var(--bf-space-2);
@@ -1158,7 +1220,7 @@ html.u-baseline-grid::after {
1158
1220
  }
1159
1221
 
1160
1222
  :where(.bf-theme) {
1161
- --bf-border-width: 1px;
1223
+ --bf-border-width: 0.0625rem;
1162
1224
  --bf-bar-thickness: 0.1875rem;
1163
1225
  --bf-radius: 0rem;
1164
1226
  --bf-control-block-padding: 0.5rem;
@@ -1176,22 +1238,48 @@ html.u-baseline-grid::after {
1176
1238
  /* Action surfaces keep comfortable command targets; field surfaces can tighten independently. */
1177
1239
  --bf-disclosure-gap: 1rem;
1178
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);
1179
1250
  --bf-input-block-padding: var(--bf-body-nudge-start, 0.41rem);
1180
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(1em, 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)));
1181
1266
  --bf-slider-track-size: calc(var(--bf-baseline) * 0.25);
1182
- --bf-slider-row-block-size: max(var(--bf-control-box-size-compact), calc(var(--bf-body-nudge-start, 0.41rem) + var(--bf-body-line-height, 1.5rem) + var(--bf-body-nudge-end)));
1267
+ --bf-slider-row-block-size: var(--bf-single-line-row-block-size);
1183
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));
1184
1269
  --bf-table-row-border-size: var(--bf-border-width);
1185
- --bf-table-row-padding: var(--bf-body-nudge-start, 0.41rem);
1186
- --bf-table-row-content-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-table-row-padding) * 2) + var(--bf-table-row-border-size));
1187
- --bf-table-row-block-size: calc(var(--bf-table-row-content-size) + mod(calc(var(--bf-baseline) - mod(var(--bf-table-row-content-size), var(--bf-baseline))), var(--bf-baseline)));
1188
- --bf-table-row-line-height: calc(var(--bf-table-row-block-size) - (var(--bf-table-row-padding) * 2) - var(--bf-table-row-border-size));
1189
- --bf-switch-row-block-size: calc(var(--bf-body-nudge-start, 0.41rem) + var(--bf-body-line-height, 1.5rem) + var(--bf-body-nudge-end));
1190
- --bf-switch-track-offset: calc(var(--bf-body-nudge-start, 0.41rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-control-visual-size)) / 2));
1191
- --bf-tick-row-block-size: max(var(--bf-control-box-size-compact), calc(var(--bf-body-nudge-start, 0.41rem) + var(--bf-body-line-height, 1.5rem) + var(--bf-body-nudge-end)));
1192
- --bf-tick-box-offset: calc(var(--bf-body-nudge-start, 0.41rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-control-visual-size)) / 2));
1193
- --bf-tick-label-offset: calc(var(--bf-control-visual-size) + var(--bf-control-inline-padding-field));
1194
- --bf-radio-dot-size: calc(var(--bf-control-visual-size) * 0.375);
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);
1276
+ --bf-leading-mark-size: var(--bf-control-visual-size);
1277
+ --bf-leading-mark-gap: var(--bf-component-inline-inset-field);
1278
+ --bf-leading-mark-offset: calc(var(--bf-leading-mark-size) + var(--bf-leading-mark-gap));
1279
+ --bf-leading-mark-group-inset: calc(var(--bf-component-inline-inset-continuation) - var(--bf-leading-mark-offset));
1280
+ --bf-tick-label-offset: var(--bf-leading-mark-offset);
1281
+ --bf-radio-dot-size: calc((var(--bf-control-visual-size) * 0.375) + var(--bf-border-width));
1282
+ --bf-list-marker-dot-size: calc(var(--bf-border-width) * 4);
1195
1283
  --bf-app-drawer-width-icon: 2rem;
1196
1284
  --bf-app-drawer-width-small: 15rem;
1197
1285
  --bf-app-drawer-width-small-max: 20rem;
@@ -1203,7 +1291,9 @@ html.u-baseline-grid::after {
1203
1291
  --bf-app-aside-width-max: var(--bf-app-drawer-width-medium-max);
1204
1292
  --bf-app-navigation-width: 15rem;
1205
1293
  --bf-app-navigation-width-collapsed: 3rem;
1206
- --bf-side-navigation-icon-optical-offset-block: 0.1875rem;
1294
+ --bf-icon-label-optical-offset-block: 0.1875rem;
1295
+ --bf-disclosure-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
1296
+ --bf-side-navigation-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
1207
1297
  --bf-side-navigation-icon-gap: 0.625rem;
1208
1298
  --bf-navigation-bar-min-block-size: calc(var(--bf-baseline) * 6);
1209
1299
  --bf-authoring-accent: #f6b73c;
@@ -1216,9 +1306,10 @@ html.u-baseline-grid::after {
1216
1306
  --bf-authoring-accent-focus-ring: rgba(246, 183, 60, 0.55);
1217
1307
  --bf-application-resize-handle-active: var(--bf-authoring-accent-strong);
1218
1308
  --bf-application-resize-handle-focus-ring: var(--bf-authoring-accent-focus-ring);
1219
- --bf-top-navigation-link-padding-inline: var(--bf-control-inline-padding-action);
1220
- --bf-top-navigation-end-slot-inline-size: calc(1rem + var(--bf-control-inline-padding-field));
1221
- --bf-top-navigation-search-toggle-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
1309
+ --bf-control-inline-padding-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
1310
+ --bf-top-navigation-link-padding-inline: var(--bf-component-inline-inset-action);
1311
+ --bf-top-navigation-end-slot-inline-size: calc(1rem + var(--bf-component-inline-inset-field));
1312
+ --bf-top-navigation-search-toggle-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
1222
1313
  --bf-top-navigation-link-padding-block: max(var(--bf-body-nudge-start), calc(var(--bf-baseline) * 1.5));
1223
1314
  --bf-top-navigation-search-max-inline-size: 20rem;
1224
1315
  --bf-top-navigation-logo-tag-inline-size: 1.375rem;
@@ -1227,18 +1318,18 @@ html.u-baseline-grid::after {
1227
1318
  --bf-top-navigation-logo-tag-gap: 0.25rem;
1228
1319
  --bf-top-navigation-logo-icon-bottom-offset: 0.375rem;
1229
1320
  --bf-top-navigation-logo-icon-optical-offset-inline: -0.0125rem;
1230
- --bf-navigation-brand-title-optical-offset-block: 0rem;
1321
+ --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
+ --bf-navigation-brand-block-size: calc(var(--bf-navigation-brand-line-center-block) * 2);
1231
1323
  --bf-icon-size-default: 1rem;
1232
1324
  --bf-icon-size-medium: 2.5rem;
1233
1325
  --bf-icon-size-large: 4rem;
1234
1326
  --bf-icon-size-x-large: 4.5rem;
1235
1327
  --bf-icon-size-xx-large: 6rem;
1236
- --bf-leading-icon-size: calc(var(--bf-baseline) * 2);
1237
- --bf-leading-icon-gap: calc(var(--bf-baseline) * 1);
1238
- --bf-leading-icon-offset: calc(var(--bf-body-nudge-start, 0.41rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-leading-icon-size)) / 2));
1239
- --bf-ui-chip-padding-inline: calc(var(--bf-body-line-height, 1.5rem) * 0.4);
1240
- --bf-ui-chip-padding-block: max(0rem, calc((var(--bf-control-inline-padding-action) * 0.25) - var(--bf-border-width)));
1241
- --bf-ui-chip-block-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-ui-chip-padding-block) * 2) + (var(--bf-border-width) * 2));
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;
1242
1333
  --bf-ui-badge-padding-inline: calc(var(--bf-body-line-height, 1.5rem) * 0.25);
1243
1334
  --bf-ui-badge-overhang: calc(var(--bf-ui-badge-padding-inline) * -0.75);
1244
1335
  --bf-grid-max-inline-size: var(--bf-content-max-width);
@@ -1301,6 +1392,7 @@ html.u-baseline-grid::after {
1301
1392
  --bf-color-focus: var(--vf-color-focus, #2e96ff);
1302
1393
 
1303
1394
  --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");
1304
1396
  --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");
1305
1397
  --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");
1306
1398
  --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");
@@ -1325,11 +1417,9 @@ html.u-baseline-grid::after {
1325
1417
  }
1326
1418
 
1327
1419
  :where(.bf-theme.bf-tier-editorial) {
1328
- --bf-control-baseline-reserve: 0rem;
1329
1420
  --bf-input-block-padding: 0.41rem;
1330
1421
  --bf-button-block-padding: 0.41rem;
1331
- --bf-table-row-padding: 0.41rem;
1332
- --bf-border-width: 1px;
1422
+ --bf-border-width: 0.0625rem;
1333
1423
  --bf-bar-thickness: 0.1875rem;
1334
1424
  --bf-radius: 0rem;
1335
1425
  --bf-control-block-padding: 0.5rem;
@@ -1348,11 +1438,9 @@ html.u-baseline-grid::after {
1348
1438
  }
1349
1439
 
1350
1440
  :where(.bf-theme.bf-tier-documentation) {
1351
- --bf-control-baseline-reserve: 0rem;
1352
1441
  --bf-input-block-padding: 0.0775rem;
1353
1442
  --bf-button-block-padding: 0.0775rem;
1354
- --bf-table-row-padding: 0.0775rem;
1355
- --bf-border-width: 1px;
1443
+ --bf-border-width: 0.0625rem;
1356
1444
  --bf-bar-thickness: 0.1875rem;
1357
1445
  --bf-radius: 0rem;
1358
1446
  --bf-control-block-padding: 0.5rem;
@@ -1371,53 +1459,48 @@ html.u-baseline-grid::after {
1371
1459
  }
1372
1460
 
1373
1461
  :where(.bf-theme.bf-tier-app) {
1374
- --bf-control-baseline-reserve: 0rem;
1375
1462
  --bf-input-block-padding: 0.0775rem;
1376
1463
  --bf-button-block-padding: 0.0775rem;
1377
- --bf-table-row-padding: 0.0775rem;
1378
- --bf-border-width: 1px;
1464
+ --bf-border-width: 0.0625rem;
1379
1465
  --bf-bar-thickness: 0.1875rem;
1380
1466
  --bf-radius: 0.125rem;
1381
1467
  --bf-control-block-padding: 0.5rem;
1382
1468
  --bf-control-block-padding-compact: 0.375rem;
1383
1469
  --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
1384
1470
  --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
1385
- --bf-control-inline-padding: 0.5rem;
1386
- --bf-control-inline-padding-action: 0.5rem;
1471
+ --bf-control-inline-padding: 1rem;
1472
+ --bf-control-inline-padding-action: 1rem;
1387
1473
  --bf-control-inline-padding-field: 0.25rem;
1388
1474
  --bf-control-visual-size: 1rem;
1389
1475
  --bf-field-gap: 0.5rem;
1390
- --bf-panel-padding-inline: 1.5rem;
1391
- --bf-panel-padding-block: 1.5rem;
1476
+ --bf-panel-padding-inline: 0.75rem;
1477
+ --bf-panel-padding-block: 0.75rem;
1392
1478
  --bf-accordion-indent: 1.5rem;
1393
1479
 
1394
1480
  }
1395
1481
 
1396
1482
  :where(.bf-theme.bf-tier-os) {
1397
- --bf-control-baseline-reserve: 0rem;
1398
1483
  --bf-input-block-padding: 0.245rem;
1399
1484
  --bf-button-block-padding: 0.245rem;
1400
- --bf-table-row-padding: 0.245rem;
1401
- --bf-border-width: 1px;
1485
+ --bf-border-width: 0.0625rem;
1402
1486
  --bf-bar-thickness: 0.1875rem;
1403
1487
  --bf-radius: 0rem;
1404
1488
  --bf-control-block-padding: 0.375rem;
1405
1489
  --bf-control-block-padding-compact: 0.25rem;
1406
1490
  --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
1407
1491
  --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
1408
- --bf-control-inline-padding: 0.5rem;
1409
- --bf-control-inline-padding-action: 0.5rem;
1492
+ --bf-control-inline-padding: 1rem;
1493
+ --bf-control-inline-padding-action: 1rem;
1410
1494
  --bf-control-inline-padding-field: 0.25rem;
1411
1495
  --bf-control-visual-size: 0.75rem;
1412
1496
  --bf-field-gap: 0.25rem;
1413
- --bf-panel-padding-inline: 1rem;
1414
- --bf-panel-padding-block: 1rem;
1497
+ --bf-panel-padding-inline: 0.5rem;
1498
+ --bf-panel-padding-block: 0.5rem;
1415
1499
  --bf-accordion-indent: 0.75rem;
1416
1500
 
1417
1501
  }
1418
1502
 
1419
1503
 
1420
- :where(.bf-theme.is-dark),
1421
1504
  :where(.bf-theme.is-dark) {
1422
1505
  --bf-color-text-default: var(--vf-color-text-default, var(--bf-color-text, #ffffff));
1423
1506
  --bf-color-text-muted: var(--vf-color-text-muted, var(--bf-color-muted, rgba(255, 255, 255, 0.6)));
@@ -1467,6 +1550,7 @@ html.u-baseline-grid::after {
1467
1550
  --bf-color-focus: var(--vf-color-focus, #99ccff);
1468
1551
 
1469
1552
  --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");
1470
1554
  --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");
1471
1555
  --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");
1472
1556
  --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");
@@ -1560,6 +1644,10 @@ html.u-baseline-grid::after {
1560
1644
  grid-template-columns: minmax(0, 1fr);
1561
1645
  }
1562
1646
 
1647
+ :where(.bf-theme) :where(.bf-field.is-range.is-stacked) > :where(.bf-control, .bf-form-help) {
1648
+ grid-column: 1;
1649
+ }
1650
+
1563
1651
  :where(.bf-theme) :where(.bf-field.is-range.is-stacked) > :where(.bf-control) {
1564
1652
  min-inline-size: 0;
1565
1653
  }
@@ -1577,7 +1665,7 @@ html.u-baseline-grid::after {
1577
1665
  margin: 0;
1578
1666
  min-inline-size: 0;
1579
1667
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
1580
- padding-inline: var(--bf-panel-padding-inline);
1668
+ padding-inline: var(--bf-component-inline-inset-continuation);
1581
1669
  padding-block-start: var(--bf-panel-padding-block);
1582
1670
  }
1583
1671
 
@@ -1604,13 +1692,36 @@ html.u-baseline-grid::after {
1604
1692
  min-inline-size: 0;
1605
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)));
1606
1694
  padding-block: max(0rem, calc(var(--bf-input-block-padding) - var(--bf-border-width)));
1607
- padding-inline: var(--bf-control-inline-padding-field);
1695
+ padding-inline: var(--bf-component-inline-inset-field);
1608
1696
  }
1609
1697
 
1610
- :where(.bf-theme) :where(input[type='color'].bf-color-input) {
1698
+ :where(.bf-theme) :where(.bf-color-control) {
1699
+ display: grid;
1700
+ grid-template-areas: "color-control";
1611
1701
  inline-size: 4rem;
1612
- min-block-size: var(--bf-control-box-size);
1613
- padding: calc(var(--bf-baseline) * 0.5);
1702
+ }
1703
+
1704
+ /* Native color inputs do not expose a body-text line box. This invisible
1705
+ metric strut gives their wrapper the same natural padding/border/margin
1706
+ construction as every textual control, including under browser zoom. */
1707
+ :where(.bf-theme) :where(.bf-color-control)::before {
1708
+ border-block: var(--bf-border-width) solid transparent;
1709
+ content: "\00a0";
1710
+ grid-area: color-control;
1711
+ 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);
1714
+ visibility: hidden;
1715
+ }
1716
+
1717
+ :where(.bf-theme) :where(.bf-color-control) > :where(input[type='color'].bf-color-input) {
1718
+ align-self: stretch;
1719
+ block-size: auto;
1720
+ grid-area: color-control;
1721
+ inline-size: 100%;
1722
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
1723
+ min-block-size: 0;
1724
+ padding: var(--bf-border-width);
1614
1725
  }
1615
1726
 
1616
1727
  :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):hover {
@@ -1623,8 +1734,8 @@ html.u-baseline-grid::after {
1623
1734
 
1624
1735
  :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):focus-visible {
1625
1736
  background-color: var(--bf-color-background-active);
1626
- outline: 2px solid var(--bf-color-focus);
1627
- outline-offset: 2px;
1737
+ outline: 0.125rem solid var(--bf-color-focus);
1738
+ outline-offset: 0.125rem;
1628
1739
  }
1629
1740
 
1630
1741
  :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):disabled {
@@ -1651,13 +1762,12 @@ html.u-baseline-grid::after {
1651
1762
  line-height: var(--bf-body-line-height, 1.5rem);
1652
1763
  background: transparent;
1653
1764
  border: 0 solid transparent;
1654
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-default);
1655
- border-top: var(--bf-border-width) solid transparent;
1765
+ box-shadow: inset 0 calc(var(--bf-border-width) * -1) 0 var(--bf-color-border-default);
1656
1766
  color: var(--bf-color-text-default);
1657
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)));
1658
1768
  max-inline-size: 100%;
1659
1769
  min-inline-size: 0;
1660
- padding-block: max(0rem, calc(var(--bf-input-block-padding) - var(--bf-border-width)));
1770
+ padding-block: 0;
1661
1771
  padding-inline: 0;
1662
1772
  width: 100%;
1663
1773
  }
@@ -1675,9 +1785,9 @@ html.u-baseline-grid::after {
1675
1785
  color: var(--bf-color-text-default);
1676
1786
  cursor: pointer;
1677
1787
  margin-inline-end: var(--bf-field-gap);
1678
- min-block-size: var(--bf-control-box-size-compact);
1679
- padding-block: max(0rem, calc(var(--bf-control-block-padding-compact) - var(--bf-border-width)));
1680
- padding-inline: var(--bf-control-inline-padding-action);
1788
+ min-block-size: 0;
1789
+ padding-block: var(--bf-single-line-row-padding-block);
1790
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
1681
1791
  }
1682
1792
 
1683
1793
  :where(.bf-theme) :where(input[type='file'])::file-selector-button:hover {
@@ -1686,16 +1796,31 @@ html.u-baseline-grid::after {
1686
1796
 
1687
1797
  :where(.bf-theme) :where(select) {
1688
1798
  background-image: var(--bf-ui-icon-chevron-down);
1689
- background-position: right var(--bf-control-inline-padding-field) center;
1799
+ background-position: right var(--bf-component-inline-inset-field) center;
1690
1800
  background-repeat: no-repeat;
1691
1801
  background-size: 1rem 1rem;
1692
- padding-inline-end: calc(var(--bf-control-inline-padding-field) * 2.5);
1802
+ overflow: hidden;
1803
+ padding-inline-end: calc(var(--bf-component-inline-inset-field) * 2.5);
1804
+ text-overflow: ellipsis;
1805
+ white-space: nowrap;
1693
1806
  }
1694
1807
 
1695
1808
  :where(.bf-theme) :where(input[type='number'], .bf-slider-input) {
1696
1809
  font-variant-numeric: tabular-nums;
1697
1810
  }
1698
1811
 
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. */
1815
+ :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);
1822
+ }
1823
+
1699
1824
  :where(.bf-theme) :where(.bf-slider-input) {
1700
1825
  flex: 0 1 5rem;
1701
1826
  inline-size: min(100%, 5rem);
@@ -1707,12 +1832,14 @@ html.u-baseline-grid::after {
1707
1832
 
1708
1833
  :where(.bf-theme) :where(input[type='number'])::-webkit-inner-spin-button,
1709
1834
  :where(.bf-theme) :where(input[type='number'])::-webkit-outer-spin-button {
1835
+ appearance: none;
1710
1836
  margin: 0;
1711
1837
  }
1712
1838
 
1713
1839
  :where(.bf-theme) :where(.bf-checkbox, .bf-radio) {
1840
+ display: grid;
1714
1841
  margin: 0;
1715
- min-block-size: var(--bf-tick-row-block-size);
1842
+ padding-inline-start: var(--bf-leading-mark-group-inset);
1716
1843
  position: relative;
1717
1844
  }
1718
1845
 
@@ -1733,12 +1860,11 @@ html.u-baseline-grid::after {
1733
1860
  font-weight: var(--bf-body-font-weight, 400);
1734
1861
  line-height: var(--bf-body-line-height, 1.5rem);
1735
1862
  color: var(--bf-color-text-default);
1863
+ border-block: var(--bf-border-width) solid transparent;
1736
1864
  cursor: pointer;
1737
1865
  display: block;
1738
- margin-bottom: 0;
1739
- min-block-size: var(--bf-tick-row-block-size);
1740
- padding-block-end: var(--bf-body-nudge-end);
1741
- padding-block-start: var(--bf-body-nudge-start, 0.41rem);
1866
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
1867
+ padding-block: var(--bf-single-line-row-padding-block);
1742
1868
  padding-inline-start: var(--bf-tick-label-offset);
1743
1869
  position: relative;
1744
1870
  }
@@ -1769,7 +1895,7 @@ html.u-baseline-grid::after {
1769
1895
  border-left: calc(var(--bf-border-width) * 2) solid var(--bf-color-background-default);
1770
1896
  inline-size: calc(var(--bf-control-visual-size) * 0.6);
1771
1897
  inset-inline-start: calc(var(--bf-control-visual-size) * 0.2);
1772
- inset-block-start: calc(var(--bf-tick-box-offset) + (var(--bf-control-visual-size) * 0.18));
1898
+ inset-block-start: calc(var(--bf-tick-box-offset) + (var(--bf-control-visual-size) * 0.18) + (var(--bf-border-width) * 2));
1773
1899
  opacity: 0;
1774
1900
  transform: rotate(-45deg);
1775
1901
  }
@@ -1807,20 +1933,19 @@ html.u-baseline-grid::after {
1807
1933
  }
1808
1934
 
1809
1935
  :where(.bf-theme) :where(.bf-checkbox-input:focus-visible + .bf-checkbox-label)::before {
1810
- outline: 2px solid var(--bf-color-focus);
1811
- outline-offset: 2px;
1936
+ outline: 0.125rem solid var(--bf-color-focus);
1937
+ outline-offset: 0.125rem;
1812
1938
  }
1813
1939
 
1814
1940
  :where(.bf-theme) :where(.bf-radio-input:focus-visible + .bf-radio-label)::before {
1815
- outline: 2px solid var(--bf-color-focus);
1816
- outline-offset: 2px;
1941
+ outline: 0.125rem solid var(--bf-color-focus);
1942
+ outline-offset: 0.125rem;
1817
1943
  }
1818
1944
 
1819
1945
  :where(.bf-theme) :where(.bf-switch) {
1820
1946
  align-items: flex-start;
1821
1947
  display: inline-flex;
1822
1948
  gap: var(--bf-field-gap);
1823
- min-block-size: var(--bf-switch-row-block-size);
1824
1949
  position: relative;
1825
1950
  }
1826
1951
 
@@ -1869,8 +1994,8 @@ html.u-baseline-grid::after {
1869
1994
  }
1870
1995
 
1871
1996
  :where(.bf-theme) :where(.bf-switch-input:focus-visible + .bf-switch-slider) {
1872
- outline: 2px solid var(--bf-color-focus);
1873
- outline-offset: 2px;
1997
+ outline: 0.125rem solid var(--bf-color-focus);
1998
+ outline-offset: 0.125rem;
1874
1999
  }
1875
2000
 
1876
2001
  :where(.bf-theme) :where(.bf-switch-input:disabled + .bf-switch-slider) {
@@ -1884,11 +2009,11 @@ html.u-baseline-grid::after {
1884
2009
  font-weight: var(--bf-body-font-weight, 400);
1885
2010
  line-height: var(--bf-body-line-height, 1.5rem);
1886
2011
  color: var(--bf-color-text-default);
2012
+ border-block: var(--bf-border-width) solid transparent;
1887
2013
  cursor: pointer;
1888
2014
  display: inline-block;
1889
- margin: 0 0 var(--bf-body-margin-bottom);
1890
- padding-block-end: 0;
1891
- padding-block-start: var(--bf-body-nudge-start, 0.41rem);
2015
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
2016
+ padding-block: var(--bf-single-line-row-padding-block);
1892
2017
  }
1893
2018
 
1894
2019
  :where(.bf-theme) :where(.bf-validation-message) {
@@ -1897,11 +2022,12 @@ html.u-baseline-grid::after {
1897
2022
  font-style: var(--bf-body-font-style, normal);
1898
2023
  font-weight: var(--bf-body-font-weight, 400);
1899
2024
  line-height: var(--bf-body-line-height, 1.5rem);
2025
+ border-block: var(--bf-border-width) solid transparent;
1900
2026
  color: var(--bf-color-text-muted);
1901
- margin: 0 0 var(--bf-body-margin-bottom);
1902
- padding-block-end: 0;
1903
- padding-block-start: var(--bf-body-nudge-start, 0.41rem);
1904
- padding-inline-start: calc(var(--bf-control-visual-size) + var(--bf-field-gap));
2027
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
2028
+ margin-inline-start: var(--bf-leading-mark-group-inset);
2029
+ padding-block: var(--bf-single-line-row-padding-block);
2030
+ padding-inline-start: var(--bf-leading-mark-offset);
1905
2031
  position: relative;
1906
2032
  }
1907
2033
 
@@ -2020,6 +2146,15 @@ html.u-baseline-grid::after {
2020
2146
  padding: 0;
2021
2147
  }
2022
2148
 
2149
+ /* A composite slider's numeric field owns the shared occupied row. Stretching
2150
+ the track within that real sibling height avoids a second nominal-height
2151
+ calculation that can diverge when rem borders are rasterised under zoom. */
2152
+ :where(.bf-theme) :where(.bf-slider:not(.is-stacked)):not(:where(.bf-field.is-range.is-stacked) :where(.bf-slider)) > :where(input[type='range']) {
2153
+ align-self: stretch;
2154
+ block-size: auto;
2155
+ margin-block: 0;
2156
+ }
2157
+
2023
2158
  :where(.bf-theme) :where(input[type='range']):focus:not(:focus-visible) {
2024
2159
  outline: none;
2025
2160
  }
@@ -2036,7 +2171,7 @@ html.u-baseline-grid::after {
2036
2171
  border: var(--bf-border-width) solid var(--bf-color-border-high-contrast);
2037
2172
  block-size: var(--bf-control-visual-size);
2038
2173
  border-radius: 50%;
2039
- box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 1px rgba(0, 0, 0, 0.2);
2174
+ box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 0.0625rem rgba(0, 0, 0, 0.2);
2040
2175
  inline-size: var(--bf-control-visual-size);
2041
2176
  margin-top: calc((var(--bf-slider-track-size) - var(--bf-control-visual-size)) / 2);
2042
2177
  }
@@ -2062,7 +2197,7 @@ html.u-baseline-grid::after {
2062
2197
  border: var(--bf-border-width) solid var(--bf-color-border-high-contrast);
2063
2198
  block-size: var(--bf-control-visual-size);
2064
2199
  border-radius: 50%;
2065
- box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 1px rgba(0, 0, 0, 0.2);
2200
+ box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 0.0625rem rgba(0, 0, 0, 0.2);
2066
2201
  inline-size: var(--bf-control-visual-size);
2067
2202
  }
2068
2203
 
@@ -2161,9 +2296,9 @@ html.u-baseline-grid::after {
2161
2296
  color: var(--bf-color-text-default);
2162
2297
  cursor: pointer;
2163
2298
  display: inline-block;
2164
- margin-bottom: 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)));
2165
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
2166
- padding-inline: var(--bf-control-inline-padding-action);
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);
2167
2302
  text-align: center;
2168
2303
  text-decoration: none;
2169
2304
  }
@@ -2181,6 +2316,13 @@ html.u-baseline-grid::after {
2181
2316
  background-color: var(--bf-color-background-hover);
2182
2317
  }
2183
2318
 
2319
+ /* Anchor buttons are controls, not prose links. Qualifying the element and
2320
+ * its interaction states prevents the generic anchor underline from leaking
2321
+ * through while leaving the explicit is-link variant unchanged. */
2322
+ :where(.bf-theme) :where(a.bf-button:not(.is-link):is(:hover, :active)) {
2323
+ text-decoration: none;
2324
+ }
2325
+
2184
2326
  :where(.bf-theme) :where(.bf-button:not(.is-base):is(:active, [aria-pressed='true'])) {
2185
2327
  background-color: var(--bf-color-background-active);
2186
2328
  }
@@ -2190,8 +2332,8 @@ html.u-baseline-grid::after {
2190
2332
  }
2191
2333
 
2192
2334
  :where(.bf-theme) :where(.bf-button, .bf-button.is-base):focus-visible {
2193
- outline: 2px solid var(--bf-color-focus);
2194
- outline-offset: 2px;
2335
+ outline: 0.125rem solid var(--bf-color-focus);
2336
+ outline-offset: 0.125rem;
2195
2337
  }
2196
2338
 
2197
2339
  /* ------------------------------------------------------------------ */
@@ -2263,7 +2405,7 @@ html.u-baseline-grid::after {
2263
2405
  background-color: transparent;
2264
2406
  color: var(--bf-color-link-default);
2265
2407
  text-decoration: underline;
2266
- text-decoration-thickness: 1px;
2408
+ text-decoration-thickness: 0.0625rem;
2267
2409
  text-underline-offset: 0.075em;
2268
2410
  }
2269
2411
 
@@ -2290,6 +2432,19 @@ html.u-baseline-grid::after {
2290
2432
  justify-content: center;
2291
2433
  }
2292
2434
 
2435
+ /* An icon-only flex button has no text line box to preserve the occupied
2436
+ * control rhythm. A zero-width metric strut restores the active body line
2437
+ * 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))) {
2439
+ column-gap: 0;
2440
+ }
2441
+
2442
+ :where(.bf-theme) :where(.bf-button.is-icon:not(:has(.bf-button-label)))::before {
2443
+ block-size: var(--bf-body-line-height);
2444
+ content: "";
2445
+ inline-size: 0;
2446
+ }
2447
+
2293
2448
  :where(.bf-theme) :where(.bf-button-label) {
2294
2449
  min-inline-size: 0;
2295
2450
  }
@@ -2450,7 +2605,7 @@ html.u-baseline-grid::after {
2450
2605
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-notice-border);
2451
2606
  color: var(--bf-color-text-default);
2452
2607
  display: flow-root;
2453
- margin-block: 0 var(--bf-section-space-shallow);
2608
+ margin: 0;
2454
2609
  max-inline-size: 100%;
2455
2610
  padding-block: var(--bf-space-2);
2456
2611
  padding-inline: var(--bf-space-2);
@@ -2496,16 +2651,15 @@ html.u-baseline-grid::after {
2496
2651
  /* ------------------------------------------------------------------ */
2497
2652
  /* Static content ports — Vanilla data spotlight and divided section. */
2498
2653
  /* Their children retain role-owned rhythm; these layout */
2499
- /* wrappers add only structural columns, rules, and explicit section ends. */
2654
+ /* wrappers add only structural columns, rules, and internal gaps. */
2500
2655
  /* ------------------------------------------------------------------ */
2501
2656
 
2502
2657
  /* Data spotlight: Vanilla's equal-height wrap becomes an intrinsic grid.
2503
2658
  Each item begins with a public highlighted rule using the shared emphasis
2504
- thickness. Item padding remains item-owned, so compositions never erase the
2505
- shallow inter-row rhythm when the pattern narrows. */
2659
+ thickness. The items container owns every inter-row gap. */
2506
2660
  :where(.bf-theme) :where(.bf-data-spotlight) {
2507
2661
  container-type: inline-size;
2508
- margin-block-end: var(--bf-section-space);
2662
+ margin: 0;
2509
2663
  min-inline-size: 0;
2510
2664
  }
2511
2665
 
@@ -2518,15 +2672,13 @@ html.u-baseline-grid::after {
2518
2672
  display: grid;
2519
2673
  grid-template-columns: minmax(0, 1fr);
2520
2674
  min-inline-size: 0;
2675
+ row-gap: var(--bf-section-space-shallow);
2521
2676
  }
2522
2677
 
2523
2678
  :where(.bf-theme) :where(.bf-data-spotlight-item) {
2524
2679
  min-inline-size: 0;
2525
2680
  overflow-wrap: anywhere;
2526
- }
2527
-
2528
- :where(.bf-theme) :where(.bf-data-spotlight-item:not(:last-child)) {
2529
- padding-block-end: var(--bf-section-space-shallow);
2681
+ padding: 0;
2530
2682
  }
2531
2683
 
2532
2684
  :where(.bf-theme) :where(.bf-data-spotlight-stat) {
@@ -2579,6 +2731,14 @@ html.u-baseline-grid::after {
2579
2731
  @container (width >= 38.75rem) {
2580
2732
  :where(.bf-theme) :where(.bf-data-spotlight-items) {
2581
2733
  grid-template-columns: repeat(2, minmax(0, 1fr));
2734
+ row-gap: var(--bf-space-1);
2735
+ }
2736
+
2737
+ :where(.bf-theme) :where(.bf-data-spotlight-items)::after {
2738
+ block-size: calc(var(--bf-section-space-shallow) - (var(--bf-space-1) * 2));
2739
+ content: "";
2740
+ grid-column: 1 / -1;
2741
+ grid-row: 6;
2582
2742
  }
2583
2743
 
2584
2744
  :where(.bf-theme) :where(.bf-data-spotlight-header, .bf-data-spotlight-item) {
@@ -2587,10 +2747,6 @@ html.u-baseline-grid::after {
2587
2747
  grid-template-rows: subgrid;
2588
2748
  }
2589
2749
 
2590
- :where(.bf-theme) :where(.bf-data-spotlight-item) {
2591
- padding-block-end: 0;
2592
- }
2593
-
2594
2750
  :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-header) {
2595
2751
  block-size: 0;
2596
2752
  overflow: visible;
@@ -2598,7 +2754,13 @@ html.u-baseline-grid::after {
2598
2754
 
2599
2755
  :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
2600
2756
  :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-child(-n + 2)) {
2601
- padding-block-end: var(--bf-section-space-shallow);
2757
+ grid-row: span 5;
2758
+ }
2759
+
2760
+ :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-item:nth-of-type(2)),
2761
+ :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:nth-of-type(n + 2)),
2762
+ :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-of-type(n + 3)) {
2763
+ grid-row: 7 / span 5;
2602
2764
  }
2603
2765
  }
2604
2766
 
@@ -2611,15 +2773,18 @@ html.u-baseline-grid::after {
2611
2773
  grid-template-columns: repeat(4, minmax(0, 1fr));
2612
2774
  }
2613
2775
 
2776
+ :where(.bf-theme) :where(.bf-data-spotlight-items)::after {
2777
+ content: none;
2778
+ }
2779
+
2614
2780
  :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-header) {
2615
2781
  block-size: 0;
2616
2782
  grid-column: span 2;
2617
2783
  overflow: visible;
2618
2784
  }
2619
2785
 
2620
- :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
2621
- :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-child(-n + 2)) {
2622
- padding-block-end: 0;
2786
+ :where(.bf-theme) :where(.bf-data-spotlight-item) {
2787
+ grid-row: span 5;
2623
2788
  }
2624
2789
  }
2625
2790
 
@@ -2628,7 +2793,7 @@ html.u-baseline-grid::after {
2628
2793
  headings, copy, and content items keep their own metric-derived rhythm. */
2629
2794
  :where(.bf-theme) :where(.bf-divided-section) {
2630
2795
  container-type: inline-size;
2631
- margin-block-end: var(--bf-section-space);
2796
+ margin: 0;
2632
2797
  min-inline-size: 0;
2633
2798
  }
2634
2799
 
@@ -2647,37 +2812,41 @@ html.u-baseline-grid::after {
2647
2812
  }
2648
2813
 
2649
2814
  :where(.bf-theme) :where(.bf-divided-section-list) {
2650
- align-content: start;
2651
- display: grid;
2815
+ --bf-divided-section-rule-to-content: calc(0.5rem - var(--bf-border-width));
2816
+ --bf-stack-space: 1.5rem;
2652
2817
  list-style: none;
2653
2818
  margin: 0;
2654
2819
  padding: 0;
2655
2820
  }
2656
2821
 
2822
+ /* Preserve the pre-0.1.5 list markup; canonical composition also carries
2823
+ bf-stack so the container remains the explicit owner of item spacing. */
2824
+ :where(.bf-theme) :where(.bf-divided-section-list:not(.bf-stack)) {
2825
+ align-content: start;
2826
+ display: grid;
2827
+ gap: var(--bf-stack-space);
2828
+ }
2829
+
2657
2830
  :where(.bf-theme) :where(.bf-divided-section-item) {
2658
2831
  align-content: start;
2659
2832
  display: grid;
2833
+ margin: 0;
2660
2834
  min-inline-size: 0;
2661
2835
  overflow-wrap: anywhere;
2836
+ padding: 0;
2837
+ position: relative;
2662
2838
  }
2663
2839
 
2664
- :where(.bf-theme) :where(.bf-divided-section-item:not(:last-child)) {
2665
- padding-block-end: var(--bf-section-space-shallow);
2666
- }
2667
-
2668
- :where(.bf-theme) :where(.bf-divided-section-item + .bf-divided-section-item) {
2669
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
2670
- padding-block-start: calc(var(--bf-section-space-shallow) - var(--bf-border-width));
2671
- }
2672
-
2673
- @container (width >= 38.75rem) {
2674
- :where(.bf-theme) :where(.bf-divided-section.is-split-medium) :where(.bf-divided-section-layout) {
2675
- column-gap: var(--bf-grid-gap-inline);
2676
- grid-template-columns: repeat(2, minmax(0, 1fr));
2677
- }
2840
+ :where(.bf-theme) :where(.bf-divided-section-item + .bf-divided-section-item)::before {
2841
+ background: var(--bf-color-border-low-contrast);
2842
+ block-size: var(--bf-border-width);
2843
+ content: "";
2844
+ inset-block-start: calc((var(--bf-divided-section-rule-to-content) + var(--bf-border-width)) * -1);
2845
+ inset-inline: 0;
2846
+ position: absolute;
2678
2847
  }
2679
2848
 
2680
- @container (width >= 64.75rem) {
2849
+ @container (width >= 45rem) {
2681
2850
  :where(.bf-theme) :where(.bf-divided-section) :where(.bf-divided-section-layout) {
2682
2851
  column-gap: var(--bf-grid-gap-inline);
2683
2852
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -2762,12 +2931,13 @@ html.u-baseline-grid::after {
2762
2931
  border: var(--bf-border-width) solid var(--bf-color-border-default);
2763
2932
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-notification-accent);
2764
2933
  color: var(--bf-color-text-default);
2765
- margin-block: 0 var(--bf-space-3);
2934
+ margin-block: 0;
2766
2935
  max-inline-size: 100%;
2767
2936
  min-inline-size: 0;
2768
2937
  overflow-wrap: anywhere;
2769
- padding-block: calc(var(--bf-space-1) - var(--bf-border-width));
2770
- padding-inline: calc((var(--bf-space-2) * 2) + var(--bf-icon-size-default)) 0;
2938
+ padding-block-end: max(0rem, calc(var(--bf-space-half) - var(--bf-border-width)));
2939
+ padding-block-start: 0;
2940
+ padding-inline: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness)) var(--bf-space-1);
2771
2941
  position: relative;
2772
2942
  }
2773
2943
 
@@ -2790,14 +2960,14 @@ html.u-baseline-grid::after {
2790
2960
  :where(.bf-theme) :where(.bf-notification.is-borderless) {
2791
2961
  border: 0;
2792
2962
  padding-block: 0;
2793
- padding-inline: calc(var(--bf-space-2) * 2) 0;
2963
+ padding-inline: calc(var(--bf-icon-size-default) + var(--bf-space-1)) 0;
2794
2964
  }
2795
2965
 
2796
2966
  :where(.bf-theme) :where(.bf-notification-icon) {
2797
2967
  background-color: var(--bf-notification-accent);
2798
2968
  background-image: none;
2799
- inset-block-start: calc(var(--bf-space-1) + ((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start));
2800
- inset-inline-start: var(--bf-space-2);
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));
2801
2971
  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");
2802
2972
  mask-position: center;
2803
2973
  mask-repeat: no-repeat;
@@ -2818,22 +2988,52 @@ html.u-baseline-grid::after {
2818
2988
  }
2819
2989
 
2820
2990
  :where(.bf-theme) :where(.bf-notification.is-borderless > .bf-notification-icon) {
2821
- inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start));
2991
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start));
2822
2992
  inset-inline-start: 0;
2823
2993
  }
2824
2994
 
2995
+ :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));
2997
+ }
2998
+
2825
2999
  :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
2826
3000
  max-inline-size: 100%;
2827
3001
  min-inline-size: 0;
2828
3002
  }
2829
3003
 
2830
3004
  :where(.bf-theme) :where(.bf-notification-content) {
2831
- margin-block-end: calc(var(--bf-space-2) - var(--bf-body-nudge-start));
2832
- padding-block-start: var(--bf-body-nudge-start);
2833
- padding-inline-end: var(--bf-space-4);
3005
+ /* Neutralise the shell's top border so the first metric role starts on-grid. */
3006
+ margin-block: calc(var(--bf-border-width) * -1) 0;
3007
+ padding-block-start: 0;
3008
+ padding-inline-end: calc(var(--bf-icon-size-default) + var(--bf-space-1));
3009
+ }
3010
+
3011
+ :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-content) {
3012
+ --bf-stack-space: 0rem;
3013
+ margin-block-start: 0;
3014
+ }
3015
+
3016
+ /* Metadata-bearing notifications use a full baseline between title and copy,
3017
+ and pair it with the full end inset. This keeps both the metadata boundary
3018
+ and the complete shell on-grid; simpler messages retain compact rhythm. */
3019
+ :where(.bf-theme) :where(.bf-notification:has(> .bf-notification-meta)) {
3020
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width));
3021
+ }
3022
+
3023
+ :where(.bf-theme) :where(.bf-notification.is-inline) {
3024
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width));
2834
3025
  }
2835
3026
 
2836
- :where(.bf-theme) :where(.bf-notification-title, .bf-notification-message, .bf-notification-timestamp) {
3027
+ /* Return the cancelled H6/body metric edges to the shell boundary. The
3028
+ * Documentation tier deliberately gives those roles different metrics, so
3029
+ * deriving this inset keeps every bordered notification on-grid without
3030
+ * reopening the visible title/copy gap. Keep this after the shell variants so
3031
+ * the metric relationship owns their final compensation. */
3032
+ :where(.bf-theme) :where(.bf-notification:has(> .bf-notification-content.is-metric-flush):not(.is-borderless)) {
3033
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width) + var(--bf-baseline) - var(--bf-h6-nudge-start) - var(--bf-body-margin-bottom));
3034
+ }
3035
+
3036
+ :where(.bf-theme) :where(.bf-notification-message, .bf-notification-timestamp) {
2837
3037
  font-family: var(--bf-body-font-family);
2838
3038
  font-size: var(--bf-body-font-size);
2839
3039
  font-style: var(--bf-body-font-style);
@@ -2841,20 +3041,11 @@ html.u-baseline-grid::after {
2841
3041
  max-inline-size: 100%;
2842
3042
  }
2843
3043
 
2844
- :where(.bf-theme) :where(.bf-notification-title) {
2845
- font-weight: 600;
2846
- margin-block: 0;
2847
- padding-block: 0;
2848
- }
2849
-
2850
3044
  :where(.bf-theme) :where(.bf-notification-message) {
2851
3045
  font-weight: var(--bf-body-font-weight);
2852
- margin-block: 0;
2853
- padding-block: 0;
2854
- }
2855
-
2856
- :where(.bf-theme) :where(.bf-notification.is-inline .bf-notification-title, .bf-notification.is-inline .bf-notification-message) {
2857
- display: inline;
3046
+ margin-block: 0 var(--bf-body-margin-bottom);
3047
+ padding-block-end: 0;
3048
+ padding-block-start: var(--bf-body-nudge-start);
2858
3049
  }
2859
3050
 
2860
3051
  :where(.bf-theme) :where(.bf-notification-close) {
@@ -2864,8 +3055,8 @@ html.u-baseline-grid::after {
2864
3055
  margin-block-end: 0;
2865
3056
  padding: 0;
2866
3057
  position: absolute;
2867
- inset-block-start: var(--bf-space-1);
2868
- inset-inline-end: var(--bf-space-1);
3058
+ inset-block-start: 0;
3059
+ inset-inline-end: 0;
2869
3060
  }
2870
3061
 
2871
3062
  :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-close) {
@@ -2880,7 +3071,7 @@ html.u-baseline-grid::after {
2880
3071
  flex-wrap: wrap;
2881
3072
  gap: var(--bf-space-1) var(--bf-space-2);
2882
3073
  justify-content: space-between;
2883
- margin-block-end: var(--bf-space-1);
3074
+ margin-block-end: 0;
2884
3075
  padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
2885
3076
  padding-inline-end: var(--bf-space-2);
2886
3077
  }
@@ -2893,7 +3084,7 @@ html.u-baseline-grid::after {
2893
3084
  :where(.bf-theme) :where(.bf-notification-timestamp) {
2894
3085
  color: var(--bf-color-text-muted);
2895
3086
  font-weight: var(--bf-body-font-weight);
2896
- margin-block: 0 calc(var(--bf-space-2) - var(--bf-body-nudge-start));
3087
+ margin-block: 0 var(--bf-body-margin-bottom);
2897
3088
  padding-block: var(--bf-body-nudge-start) 0;
2898
3089
  }
2899
3090
 
@@ -2908,7 +3099,7 @@ html.u-baseline-grid::after {
2908
3099
 
2909
3100
  :where(.bf-theme) :where(.bf-notification-actions > .bf-button.is-link) {
2910
3101
  flex: 0 0 auto;
2911
- margin-block-end: calc(var(--bf-space-2) - var(--bf-body-nudge-start));
3102
+ margin-block-end: var(--bf-body-margin-bottom);
2912
3103
  padding-block: var(--bf-body-nudge-start) 0;
2913
3104
  }
2914
3105
 
@@ -2928,10 +3119,10 @@ html.u-baseline-grid::after {
2928
3119
  cursor: inherit;
2929
3120
  display: inline-block;
2930
3121
  font: inherit;
2931
- margin: -2px calc(var(--bf-space-half) * -1);
3122
+ margin: -0.125rem calc(var(--bf-space-half) * -1);
2932
3123
  max-inline-size: 100%;
2933
3124
  overflow: hidden;
2934
- padding: 2px var(--bf-space-half);
3125
+ padding: 0.125rem var(--bf-space-half);
2935
3126
  text-align: inherit;
2936
3127
  text-decoration: inherit;
2937
3128
  text-overflow: inherit;
@@ -2942,7 +3133,7 @@ html.u-baseline-grid::after {
2942
3133
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort]:hover, .bf-table-sort-button:focus-visible) {
2943
3134
  color: var(--bf-color-link-default);
2944
3135
  text-decoration: underline;
2945
- text-decoration-thickness: 1px;
3136
+ text-decoration-thickness: 0.0625rem;
2946
3137
  text-underline-offset: 0.075em;
2947
3138
  }
2948
3139
 
@@ -2951,11 +3142,11 @@ html.u-baseline-grid::after {
2951
3142
  }
2952
3143
 
2953
3144
  :where(.bf-theme) :where(.bf-table-sort-button:focus-visible) {
2954
- outline: 2px solid var(--bf-color-focus);
2955
- outline-offset: -2px;
3145
+ outline: 0.125rem solid var(--bf-color-focus);
3146
+ outline-offset: -0.125rem;
2956
3147
  }
2957
3148
 
2958
- :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
3149
+ :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort])::after {
2959
3150
  background-image: var(--bf-ui-icon-chevron-down);
2960
3151
  background-position: center;
2961
3152
  background-repeat: no-repeat;
@@ -2965,9 +3156,14 @@ html.u-baseline-grid::after {
2965
3156
  display: inline-block;
2966
3157
  inline-size: var(--bf-icon-size-default);
2967
3158
  margin-inline-start: var(--bf-space-half);
3159
+ opacity: 0;
2968
3160
  vertical-align: calc((1cap - var(--bf-icon-size-default)) / 2);
2969
3161
  }
2970
3162
 
3163
+ :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
3164
+ opacity: 1;
3165
+ }
3166
+
2971
3167
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'])::after {
2972
3168
  transform: rotate(180deg);
2973
3169
  }
@@ -3004,9 +3200,9 @@ html.u-baseline-grid::after {
3004
3200
  }
3005
3201
 
3006
3202
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > thead) {
3007
- block-size: 1px;
3203
+ block-size: 0.0625rem;
3008
3204
  clip-path: inset(50%);
3009
- inline-size: 1px;
3205
+ inline-size: 0.0625rem;
3010
3206
  overflow: hidden;
3011
3207
  position: absolute;
3012
3208
  white-space: nowrap;
@@ -3077,7 +3273,7 @@ html.u-baseline-grid::after {
3077
3273
  :where(.bf-theme) :where(.bf-logo-section) {
3078
3274
  container-name: bf-logo-section;
3079
3275
  container-type: inline-size;
3080
- margin-block-end: var(--bf-section-space-shallow);
3276
+ margin: 0;
3081
3277
  min-inline-size: 0;
3082
3278
  }
3083
3279
 
@@ -3111,8 +3307,8 @@ html.u-baseline-grid::after {
3111
3307
  }
3112
3308
 
3113
3309
  :where(.bf-theme) :where(.bf-logo-section-link:focus-visible) {
3114
- outline: 2px solid var(--bf-color-focus);
3115
- outline-offset: 2px;
3310
+ outline: 0.125rem solid var(--bf-color-focus);
3311
+ outline-offset: 0.125rem;
3116
3312
  }
3117
3313
 
3118
3314
  :where(.bf-theme) :where(.bf-logo-section-logo) {
@@ -3139,7 +3335,7 @@ html.u-baseline-grid::after {
3139
3335
  inline-size: 100%;
3140
3336
  }
3141
3337
 
3142
- /* Vanilla's small breakpoint is 620px. The items descendant, rather than the
3338
+ /* Vanilla's small breakpoint is 38.75rem. The items descendant, rather than the
3143
3339
  query container itself, responds when its allocated space reaches it. */
3144
3340
  @container bf-logo-section (width >= 38.75rem) {
3145
3341
  :where(.bf-theme) :where(.bf-logo-section-items) {
@@ -3163,19 +3359,21 @@ html.u-baseline-grid::after {
3163
3359
 
3164
3360
  /* ------------------------------------------------------------------ */
3165
3361
  /* Media object — semantic media/content slots with a container-owned */
3166
- /* structural collapse only. Content roles retain their own spacing. */
3362
+ /* structural collapse. Content roles retain their metric boxes. */
3167
3363
  /* ------------------------------------------------------------------ */
3168
3364
 
3169
3365
  :where(.bf-theme) :where(.bf-media-object) {
3170
- margin-block-end: var(--bf-section-space-shallow);
3366
+ container-name: bf-media-object;
3367
+ container-type: inline-size;
3368
+ margin: 0;
3171
3369
  min-inline-size: 0;
3172
3370
  }
3173
3371
 
3174
3372
  :where(.bf-theme) :where(.bf-media-object-layout) {
3175
- display: grid;
3176
3373
  align-items: start;
3177
- column-gap: var(--bf-space-2);
3178
- grid-template-columns: auto minmax(0, 1fr);
3374
+ column-gap: var(--bf-grid-gap-inline);
3375
+ display: grid;
3376
+ grid-template-columns: repeat(4, minmax(0, 1fr));
3179
3377
  min-inline-size: 0;
3180
3378
  }
3181
3379
 
@@ -3187,6 +3385,10 @@ html.u-baseline-grid::after {
3187
3385
  min-inline-size: 0;
3188
3386
  }
3189
3387
 
3388
+ :where(.bf-theme) :where(.bf-media-object-media) {
3389
+ grid-column: 1 / span 2;
3390
+ }
3391
+
3190
3392
  :where(.bf-theme) :where(.bf-media-object-media > :where(img, picture, svg, video)) {
3191
3393
  block-size: 100%;
3192
3394
  display: block;
@@ -3201,6 +3403,7 @@ html.u-baseline-grid::after {
3201
3403
  }
3202
3404
 
3203
3405
  :where(.bf-theme) :where(.bf-media-object-content) {
3406
+ grid-column: 3 / -1;
3204
3407
  min-inline-size: 0;
3205
3408
  overflow-wrap: anywhere;
3206
3409
  }
@@ -3240,8 +3443,12 @@ html.u-baseline-grid::after {
3240
3443
  }
3241
3444
 
3242
3445
  :where(.bf-theme) :where(.bf-media-object-meta-list) {
3446
+ --bf-stack-space: var(--bf-space-1);
3447
+ align-content: start;
3448
+ display: grid;
3449
+ gap: var(--bf-stack-space);
3243
3450
  list-style: none;
3244
- margin: var(--bf-space-1) 0 0;
3451
+ margin: 0;
3245
3452
  padding: 0;
3246
3453
  }
3247
3454
 
@@ -3254,22 +3461,22 @@ html.u-baseline-grid::after {
3254
3461
  overflow-wrap: anywhere;
3255
3462
  }
3256
3463
 
3257
- :where(.bf-theme) :where(.bf-media-object-meta + .bf-media-object-meta) {
3258
- margin-block-start: var(--bf-space-1);
3259
- }
3260
-
3261
3464
  :where(.bf-theme) :where(.bf-media-object-meta .bf-icon) {
3262
3465
  margin-block-start: var(--bf-body-nudge-start);
3263
3466
  }
3264
3467
 
3265
- :where(.bf-theme) :where(.bf-media-object.is-media-end) :where(.bf-media-object-content) {
3266
- grid-column: 1;
3267
- grid-row: 1;
3268
- }
3468
+ @container bf-media-object (width >= 38.75rem) {
3469
+ :where(.bf-theme) :where(.bf-media-object-layout) {
3470
+ grid-template-columns: repeat(8, minmax(0, 1fr));
3471
+ }
3269
3472
 
3270
- :where(.bf-theme) :where(.bf-media-object.is-media-end) :where(.bf-media-object-media) {
3271
- grid-column: 2;
3272
- grid-row: 1;
3473
+ :where(.bf-theme) :where(.bf-media-object-media) {
3474
+ grid-column: 1 / span 2;
3475
+ }
3476
+
3477
+ :where(.bf-theme) :where(.bf-media-object-content) {
3478
+ grid-column: 3 / -1;
3479
+ }
3273
3480
  }
3274
3481
 
3275
3482
 
@@ -3280,20 +3487,13 @@ html.u-baseline-grid::after {
3280
3487
  :where(.bf-theme) :where(.bf-linked-logo-section) {
3281
3488
  container-name: bf-linked-logo-section;
3282
3489
  container-type: inline-size;
3283
- margin-block-end: var(--bf-section-space);
3490
+ margin: 0;
3284
3491
  min-inline-size: 0;
3285
3492
  }
3286
3493
 
3287
- :where(.bf-theme) :where(.bf-linked-logo-section.is-shallow) {
3288
- margin-block-end: var(--bf-section-space-shallow);
3289
- }
3290
-
3291
- :where(.bf-theme) :where(.bf-linked-logo-section.is-deep) {
3292
- margin-block-end: var(--bf-section-space-deep);
3293
- }
3294
-
3295
3494
  :where(.bf-theme) :where(.bf-linked-logo-section-layout) {
3296
3495
  display: grid;
3496
+ gap: var(--bf-section-space-shallow);
3297
3497
  grid-template-columns: minmax(0, 1fr);
3298
3498
  min-inline-size: 0;
3299
3499
  }
@@ -3326,7 +3526,7 @@ html.u-baseline-grid::after {
3326
3526
  max-inline-size: none;
3327
3527
  }
3328
3528
 
3329
- :where(.bf-theme) :where(.bf-linked-logo-section-card) {
3529
+ :where(.bf-theme) :where(a.bf-linked-logo-section-card) {
3330
3530
  align-content: start;
3331
3531
  align-items: stretch;
3332
3532
  color: inherit;
@@ -3338,7 +3538,7 @@ html.u-baseline-grid::after {
3338
3538
  text-decoration: none;
3339
3539
  }
3340
3540
 
3341
- :where(.bf-theme) :where(.bf-linked-logo-section-card:hover) :where(.bf-linked-logo-section-card-copy) {
3541
+ :where(.bf-theme) :where(a.bf-linked-logo-section-card:hover) :where(.bf-linked-logo-section-card-copy) {
3342
3542
  text-decoration: underline;
3343
3543
  }
3344
3544
 
@@ -3357,7 +3557,7 @@ html.u-baseline-grid::after {
3357
3557
  of baselines tall. Keep the visual ratio exact and put only the residual
3358
3558
  rhythm compensation after the mark; the copy keeps its own semantic
3359
3559
  spacing and the occupied card still lands on the tier grid. */
3360
- @supports (margin-block-end: round(up, 1px, 1px)) {
3560
+ @supports (margin-block-end: round(up, 0.0625rem, 0.0625rem)) {
3361
3561
  :where(.bf-theme) :where(.bf-linked-logo-section-mark) {
3362
3562
  margin-block-end: calc(
3363
3563
  round(up, calc(100cqi * 9 / 16), var(--bf-baseline))
@@ -3389,21 +3589,25 @@ html.u-baseline-grid::after {
3389
3589
  overflow-wrap: anywhere;
3390
3590
  }
3391
3591
 
3392
- /* Vanilla's linked-logo block moves from one to two cards per row at the
3393
- 4-column medium grid. The section itself does not split until the 8-column
3394
- large grid: its macro uses large-only grid columns for the 50/50 and 25/75
3395
- rails. The root establishes the query context; only descendants change. */
3592
+ /* The linked-logo block moves from one to two cards per row at the 4-column
3593
+ medium grid. The balanced 50/50 section split uses the shared readable
3594
+ threshold; the 25/75 content rail and four-card density retain their
3595
+ separately measured wide threshold. The root establishes the query context;
3596
+ only descendants change. */
3396
3597
  @container bf-linked-logo-section (width >= 38.75rem) {
3397
3598
  :where(.bf-theme) :where(.bf-linked-logo-section-logos) :where(.bf-logo-section-items) {
3398
3599
  grid-template-columns: repeat(2, minmax(0, 1fr));
3399
3600
  }
3400
3601
  }
3401
3602
 
3402
- @container bf-linked-logo-section (width >= 64.75rem) {
3603
+ @container bf-linked-logo-section (width >= 45rem) {
3403
3604
  :where(.bf-theme) :where(.bf-linked-logo-section.is-50-50) :where(.bf-linked-logo-section-layout) {
3404
3605
  column-gap: var(--bf-grid-gap-inline);
3405
3606
  grid-template-columns: repeat(2, minmax(0, 1fr));
3406
3607
  }
3608
+ }
3609
+
3610
+ @container bf-linked-logo-section (width >= 64.75rem) {
3407
3611
 
3408
3612
  :where(.bf-theme) :where(.bf-linked-logo-section.is-25-75) :where(.bf-linked-logo-section-layout) {
3409
3613
  column-gap: var(--bf-grid-gap-inline);
@@ -3506,33 +3710,25 @@ html.u-baseline-grid::after {
3506
3710
  }
3507
3711
 
3508
3712
  /* A section title may be the route action without looking like body copy. */
3509
- :where(.bf-theme) :where(.bf-basic-section-title-link, .bf-basic-section-title-link:visited) {
3713
+ :where(.bf-theme) :where(a.bf-basic-section-title-link, a.bf-basic-section-title-link:visited) {
3510
3714
  color: var(--bf-color-link-default);
3511
3715
  text-decoration: none;
3512
3716
  }
3513
3717
 
3514
- :where(.bf-theme) :where(.bf-basic-section-title-link:hover) {
3718
+ :where(.bf-theme) :where(a.bf-basic-section-title-link:hover) {
3515
3719
  text-decoration: underline;
3516
3720
  text-decoration-thickness: var(--bf-border-width);
3517
3721
  text-underline-offset: 0.12em;
3518
3722
  }
3519
3723
 
3520
- /* Vanilla splits at medium only on request, otherwise at its large breakpoint.
3521
- The layout descendant reacts to the root container; the query never tries to
3724
+ /* A balanced section switches at the shared readable 50/50 threshold. The
3725
+ layout descendant reacts to the root container; the query never tries to
3522
3726
  restyle the container that established it. */
3523
- @container bf-basic-section (width >= 38.75rem) {
3524
- :where(.bf-theme) :where(.bf-basic-section.is-split-medium) :where(.bf-basic-section-layout) {
3525
- column-gap: var(--bf-grid-gap-inline);
3526
- grid-template-columns: repeat(2, minmax(0, 1fr));
3527
- }
3528
- }
3529
-
3530
- @container bf-basic-section (width >= 64.75rem) {
3531
- :where(.bf-theme) :where(.bf-basic-section:not(.is-split-medium)) :where(.bf-basic-section-layout) {
3727
+ @container bf-basic-section (width >= 45rem) {
3728
+ :where(.bf-theme) :where(.bf-basic-section-layout) {
3532
3729
  column-gap: var(--bf-grid-gap-inline);
3533
3730
  grid-template-columns: repeat(2, minmax(0, 1fr));
3534
3731
  }
3535
-
3536
3732
  }
3537
3733
 
3538
3734
  /* CTA section: Vanilla's 25/75 variant is an offset content rail. The full
@@ -3548,19 +3744,23 @@ html.u-baseline-grid::after {
3548
3744
  display: grid;
3549
3745
  grid-template-columns: minmax(0, 1fr);
3550
3746
  min-inline-size: 0;
3551
- padding-block: calc(var(--bf-section-space-deep) / 2);
3552
3747
  }
3553
3748
 
3554
3749
  :where(.bf-theme) :where(.bf-cta-section-content) {
3750
+ --bf-stack-space: var(--bf-section-space-shallow);
3751
+ align-content: start;
3752
+ display: grid;
3753
+ gap: var(--bf-stack-space);
3555
3754
  min-inline-size: 0;
3556
3755
  overflow-wrap: anywhere;
3557
3756
  }
3558
3757
 
3559
- @container bf-cta-section (width >= 64.75rem) {
3560
- :where(.bf-theme) :where(.bf-cta-section-layout) {
3561
- padding-block: var(--bf-section-space-deep);
3562
- }
3758
+ :where(.bf-theme) :where(.bf-cta-section-copy) {
3759
+ min-inline-size: 0;
3760
+ overflow-wrap: anywhere;
3761
+ }
3563
3762
 
3763
+ @container bf-cta-section (width >= 64.75rem) {
3564
3764
  :where(.bf-theme) :where(.bf-cta-section.is-offset) :where(.bf-cta-section-layout) {
3565
3765
  column-gap: var(--bf-grid-gap-inline);
3566
3766
  grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
@@ -3628,15 +3828,15 @@ html.u-baseline-grid::after {
3628
3828
  /* semantic gaps and every text child keeps metric compensation. */
3629
3829
  /* ------------------------------------------------------------------ */
3630
3830
 
3631
- /* Hero: its deliberately asymmetric boundary mirrors the current Vanilla
3632
- section--hero: a compact arrival space, then the normal section exit. The
3633
- entry rule replaces one pixel of padding so it never changes the rhythm. */
3831
+ /* Hero: the compact arrival space belongs inside its entry rule. The outer
3832
+ stack owns the section exit, and the rule replaces one pixel of padding so
3833
+ it never changes the rhythm. */
3634
3834
  :where(.bf-theme) :where(.bf-hero) {
3635
3835
  border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
3636
3836
  container-name: bf-hero;
3637
3837
  container-type: inline-size;
3638
3838
  min-inline-size: 0;
3639
- padding-block-end: calc(var(--bf-section-space) / 2);
3839
+ padding-block-end: 0;
3640
3840
  padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
3641
3841
  }
3642
3842
 
@@ -3649,6 +3849,7 @@ html.u-baseline-grid::after {
3649
3849
 
3650
3850
  :where(.bf-theme) :where(.bf-hero-layout) {
3651
3851
  display: grid;
3852
+ gap: var(--bf-section-space-shallow);
3652
3853
  grid-template-columns: minmax(0, 1fr);
3653
3854
  min-inline-size: 0;
3654
3855
  }
@@ -3658,9 +3859,9 @@ html.u-baseline-grid::after {
3658
3859
  overflow-wrap: anywhere;
3659
3860
  }
3660
3861
 
3661
- /* The normal hero keeps title, supporting heading, chip, prose and CTA in a
3662
- semantic copy stack. Hero titles are h1 slots and supporting titles are h2
3663
- slots. */
3862
+ /* Legacy copy slots remain valid for signpost variants. The default arrival
3863
+ composition separates a title area from its supporting content area, and
3864
+ the demo composes each area with the public stack density modifiers. */
3664
3865
  :where(.bf-theme) :where(.bf-hero-copy) {
3665
3866
  align-content: start;
3666
3867
  display: grid;
@@ -3687,7 +3888,7 @@ html.u-baseline-grid::after {
3687
3888
  allocated a fluid grid track. Snap only the media block to the active tier
3688
3889
  baseline so the following semantic text remains on-grid; its inline track
3689
3890
  and the surrounding Vanilla proportions remain unchanged. */
3690
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3891
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3691
3892
  :where(.bf-theme) :where(.bf-hero-media > .bf-aspect, .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
3692
3893
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3693
3894
  }
@@ -3710,14 +3911,10 @@ html.u-baseline-grid::after {
3710
3911
  inline-size: 100%;
3711
3912
  }
3712
3913
 
3713
- /* Vanilla's desktop hero boundary is 1036px. The layout descendant responds
3714
- to the root container so embedding it in a narrower rail still collapses
3715
- correctly. */
3716
- /* The section boundary itself follows Vanilla's page-level desktop switch;
3717
- the composition below continues to react to the allocated container. */
3914
+ /* The section boundary follows the page-level desktop switch, while the
3915
+ two-column composition uses its measured intrinsic allocation below. */
3718
3916
  @media (width >= 64.75rem) {
3719
3917
  :where(.bf-theme) :where(.bf-hero) {
3720
- padding-block-end: var(--bf-section-space);
3721
3918
  padding-block-start: calc(var(--bf-space-3) - var(--bf-border-width));
3722
3919
  }
3723
3920
 
@@ -3726,7 +3923,7 @@ html.u-baseline-grid::after {
3726
3923
  }
3727
3924
  }
3728
3925
 
3729
- @container bf-hero (width >= 64.75rem) {
3926
+ @container bf-hero (width >= 45rem) {
3730
3927
  :where(.bf-theme) :where(.bf-hero-layout) {
3731
3928
  column-gap: var(--bf-grid-gap-inline);
3732
3929
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3746,9 +3943,10 @@ html.u-baseline-grid::after {
3746
3943
  }
3747
3944
  }
3748
3945
 
3749
- /* Vanilla can intentionally split the three proportioned layouts at its
3750
- medium threshold. The modifier changes only structural tracks. */
3751
- @container bf-hero (width >= 38.75rem) {
3946
+ /* The named variants retain their proportion but share the readable split
3947
+ threshold with the default hero. The modifier changes only structural
3948
+ tracks; it does not introduce an earlier cramped layout. */
3949
+ @container bf-hero (width >= 45rem) {
3752
3950
  :where(.bf-theme) :where(.bf-hero.is-split-medium) :where(.bf-hero-layout) {
3753
3951
  column-gap: var(--bf-grid-gap-inline);
3754
3952
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3768,14 +3966,10 @@ html.u-baseline-grid::after {
3768
3966
  :where(.bf-theme) :where(.bf-quote-wrapper) {
3769
3967
  container-name: bf-quote-wrapper;
3770
3968
  container-type: inline-size;
3771
- margin-block-end: var(--bf-section-space);
3969
+ margin: 0;
3772
3970
  min-inline-size: 0;
3773
3971
  }
3774
3972
 
3775
- :where(.bf-theme) :where(.bf-quote-wrapper.is-shallow) {
3776
- margin-block-end: var(--bf-section-space-shallow);
3777
- }
3778
-
3779
3973
  :where(.bf-theme) :where(.bf-quote-wrapper-header, .bf-quote-wrapper-layout, .bf-quote-wrapper-signpost, .bf-quote-wrapper-content, .bf-quote-wrapper-citation, .bf-quote-wrapper-media) {
3780
3974
  min-inline-size: 0;
3781
3975
  overflow-wrap: anywhere;
@@ -3822,7 +4016,7 @@ html.u-baseline-grid::after {
3822
4016
  /* The quote rail can also be a fractional grid track. Keep its media from
3823
4017
  introducing a sub-baseline row while leaving quotation and citation rhythm
3824
4018
  entirely baseline-compensated while its stack owns semantic gaps. */
3825
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
4019
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3826
4020
  :where(.bf-theme) :where(.bf-quote-wrapper-signpost > :where(img, picture, svg), .bf-quote-wrapper-media > .bf-aspect) {
3827
4021
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3828
4022
  }
@@ -3861,8 +4055,47 @@ html.u-baseline-grid::after {
3861
4055
  }
3862
4056
 
3863
4057
  @container bf-quote-wrapper (width >= 64.75rem) {
4058
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) {
4059
+ grid-template-columns: repeat(8, minmax(0, 1fr));
4060
+ }
4061
+
4062
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) > :first-child {
4063
+ grid-column: 1 / span 6;
4064
+ }
4065
+
4066
+ :where(.bf-theme) :where(.bf-quote-wrapper-header-link) {
4067
+ grid-column: 7 / -1;
4068
+ }
4069
+
4070
+ :where(.bf-theme) :where(.bf-quote-wrapper-layout) {
4071
+ grid-template-columns: repeat(8, minmax(0, 1fr));
4072
+ }
4073
+
4074
+ :where(.bf-theme) :where(.bf-quote-wrapper-signpost) {
4075
+ grid-column: 1 / span 2;
4076
+ }
4077
+
4078
+ :where(.bf-theme) :where(.bf-quote-wrapper-content, .bf-quote-wrapper-content:only-child) {
4079
+ display: grid;
4080
+ grid-column: 3 / -1;
4081
+ grid-template-columns: subgrid;
4082
+ }
4083
+
3864
4084
  :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
3865
- grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
4085
+ grid-column: 1 / -1;
4086
+ grid-template-columns: subgrid;
4087
+ }
4088
+
4089
+ :where(.bf-theme) :where(.bf-quote-wrapper-prose) {
4090
+ grid-column: 1 / span 4;
4091
+ }
4092
+
4093
+ :where(.bf-theme) :where(.bf-quote-wrapper-citation) {
4094
+ grid-column: 5 / -1;
4095
+ }
4096
+
4097
+ :where(.bf-theme) :where(.bf-quote-wrapper-content) > :where(.bf-cta-block, .bf-quote-wrapper-media) {
4098
+ grid-column: 1 / -1;
3866
4099
  }
3867
4100
  }
3868
4101
 
@@ -3875,19 +4108,13 @@ html.u-baseline-grid::after {
3875
4108
  container-name: bf-rich-list;
3876
4109
  container-type: inline-size;
3877
4110
  min-inline-size: 0;
3878
- padding-block-end: calc(var(--bf-section-space) / 2);
3879
- }
3880
-
3881
- :where(.bf-theme) :where(.bf-rich-list.is-shallow) {
3882
- padding-block-end: var(--bf-section-space-shallow);
3883
- }
3884
-
3885
- :where(.bf-theme) :where(.bf-rich-list.is-deep) {
3886
- padding-block-end: calc(var(--bf-section-space-deep) / 2);
3887
4111
  }
3888
4112
 
3889
4113
  :where(.bf-theme) :where(.bf-rich-list-layout) {
4114
+ --bf-stack-space: var(--bf-space-1);
4115
+ align-content: start;
3890
4116
  display: grid;
4117
+ gap: var(--bf-stack-space);
3891
4118
  grid-template-columns: minmax(0, 1fr);
3892
4119
  min-inline-size: 0;
3893
4120
  }
@@ -3902,14 +4129,11 @@ html.u-baseline-grid::after {
3902
4129
  overflow-wrap: anywhere;
3903
4130
  }
3904
4131
 
3905
- @media (width >= 64.75rem) {
3906
- :where(.bf-theme) :where(.bf-rich-list:not(.is-shallow)) {
3907
- padding-block-end: var(--bf-section-space);
3908
- }
3909
-
3910
- :where(.bf-theme) :where(.bf-rich-list.is-deep) {
3911
- padding-block-end: var(--bf-section-space-deep);
3912
- }
4132
+ :where(.bf-theme) :where(.bf-rich-list-support, .bf-rich-list-content) {
4133
+ --bf-stack-space: var(--bf-space-1);
4134
+ align-content: start;
4135
+ display: grid;
4136
+ gap: var(--bf-stack-space);
3913
4137
  }
3914
4138
 
3915
4139
  /* ------------------------------------------------------------------ */
@@ -3936,7 +4160,7 @@ html.u-baseline-grid::after {
3936
4160
  /* A full-width ratio inside a fluid Sites rail otherwise leaves the next
3937
4161
  heading on a fractional pixel. The visual alone absorbs the trailing
3938
4162
  compensation; semantic children retain their own margins unchanged. */
3939
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
4163
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3940
4164
  :where(.bf-theme) :where(.bf-rich-list-visual > .bf-aspect) {
3941
4165
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3942
4166
  }
@@ -3975,8 +4199,12 @@ html.u-baseline-grid::after {
3975
4199
 
3976
4200
  /* Prefixes are logical here even though the shared list predates BF's
3977
4201
  logical-property rule. This keeps ticks, bullets and numbers RTL-safe. */
4202
+ :where(.bf-theme) :where(.bf-rich-list-list:has(> .bf-list-item:is(.is-ticked, .is-crossed)), .bf-rich-list-list.is-bulleted, ol.bf-rich-list-list) {
4203
+ padding-inline-start: var(--bf-leading-mark-group-inset);
4204
+ }
4205
+
3978
4206
  :where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed) {
3979
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
4207
+ padding-inline-start: var(--bf-leading-mark-offset);
3980
4208
  }
3981
4209
 
3982
4210
  :where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed)::before {
@@ -3986,7 +4214,7 @@ html.u-baseline-grid::after {
3986
4214
  }
3987
4215
 
3988
4216
  :where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item) {
3989
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
4217
+ padding-inline-start: var(--bf-leading-mark-offset);
3990
4218
  }
3991
4219
 
3992
4220
  :where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item)::before {
@@ -4005,7 +4233,7 @@ html.u-baseline-grid::after {
4005
4233
 
4006
4234
  :where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item) {
4007
4235
  counter-increment: bf-rich-horizontal-counter;
4008
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
4236
+ padding-inline-start: var(--bf-leading-mark-offset);
4009
4237
  }
4010
4238
 
4011
4239
  :where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item)::before {
@@ -4052,7 +4280,7 @@ html.u-baseline-grid::after {
4052
4280
  }
4053
4281
  }
4054
4282
 
4055
- @container bf-rich-list (width >= 64.75rem) {
4283
+ @container bf-rich-list (width >= 45rem) {
4056
4284
  :where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) {
4057
4285
  column-gap: var(--bf-grid-gap-inline);
4058
4286
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -4066,7 +4294,7 @@ html.u-baseline-grid::after {
4066
4294
  grid-column: 2;
4067
4295
  }
4068
4296
 
4069
- :where(.bf-theme) :where(.bf-rich-list.is-horizontal) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
4297
+ :where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
4070
4298
  grid-column: 2;
4071
4299
  }
4072
4300
  }
@@ -4081,7 +4309,6 @@ html.u-baseline-grid::after {
4081
4309
 
4082
4310
  :where(.bf-theme) :where(.bf-rich-list.is-vertical) :where(.bf-rich-list-media) {
4083
4311
  container-type: inline-size;
4084
- padding-block-end: var(--bf-section-space-shallow);
4085
4312
  }
4086
4313
 
4087
4314
  :where(.bf-theme) :where(.bf-rich-list.is-vertical.is-flipped) :where(.bf-rich-list-media) {
@@ -4100,7 +4327,7 @@ html.u-baseline-grid::after {
4100
4327
  /* The media object deliberately stretches across fluid 1/2 and 2/3 ratios.
4101
4328
  Snap that resulting block, rather than resetting content spacing, so each
4102
4329
  tier's baseline survives both portrait and landscape allocations. */
4103
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
4330
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
4104
4331
  :where(.bf-theme) :where(.bf-rich-list-media-frame) {
4105
4332
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
4106
4333
  }
@@ -4143,11 +4370,7 @@ html.u-baseline-grid::after {
4143
4370
  /* Auto height has no shallow media wrapper in Vanilla. At narrow widths it
4144
4371
  remains a normal 3:2 frame; at the wide split it stretches with the content
4145
4372
  rail, clamped between the equivalent 16:9 and 2:3 heights. */
4146
- :where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) {
4147
- padding-block-end: 0;
4148
- }
4149
-
4150
- @container bf-rich-list (width >= 64.75rem) {
4373
+ @container bf-rich-list (width >= 45rem) {
4151
4374
  :where(.bf-theme) :where(.bf-rich-list.is-vertical) > :where(.bf-rich-list-layout) {
4152
4375
  align-items: stretch;
4153
4376
  column-gap: var(--bf-grid-gap-inline);
@@ -4196,7 +4419,7 @@ html.u-baseline-grid::after {
4196
4419
  min-block-size: 56.25cqi;
4197
4420
  }
4198
4421
 
4199
- @supports (min-block-size: round(up, 1px, 1px)) {
4422
+ @supports (min-block-size: round(up, 0.0625rem, 0.0625rem)) {
4200
4423
  :where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) :where(.bf-rich-list-media-frame) {
4201
4424
  max-block-size: round(down, 150cqi, var(--bf-baseline));
4202
4425
  min-block-size: round(up, 56.25cqi, var(--bf-baseline));
@@ -4214,6 +4437,7 @@ html.u-baseline-grid::after {
4214
4437
 
4215
4438
 
4216
4439
  :where(.bf-theme) :where(.bf-panel) {
4440
+ --bf-panel-content-padding-inline: var(--bf-component-inline-inset-continuation);
4217
4441
  background: var(--bf-color-background-default);
4218
4442
  color: var(--bf-color-text-default);
4219
4443
  display: flex;
@@ -4236,6 +4460,9 @@ html.u-baseline-grid::after {
4236
4460
  overscroll-behavior: contain;
4237
4461
  }
4238
4462
 
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. */
4239
4466
  :where(.bf-theme) :where(.bf-panel-header) {
4240
4467
  align-items: start;
4241
4468
  display: flex;
@@ -4244,7 +4471,7 @@ html.u-baseline-grid::after {
4244
4471
  justify-content: space-between;
4245
4472
  padding-block-end: var(--bf-panel-padding-block);
4246
4473
  padding-block-start: var(--bf-panel-padding-block);
4247
- padding-inline: var(--bf-panel-padding-inline);
4474
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4248
4475
  }
4249
4476
 
4250
4477
  /* A navigation brand keeps the Canonical tag attached to the panel's top edge
@@ -4254,17 +4481,13 @@ html.u-baseline-grid::after {
4254
4481
  gap: 0;
4255
4482
  padding-block: 0;
4256
4483
  padding-inline-end: 0;
4257
- padding-inline-start: var(--bf-panel-padding-inline);
4484
+ padding-inline-start: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4258
4485
  }
4259
4486
 
4260
4487
  :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
4261
4488
  inline-size: 100%;
4262
4489
  }
4263
4490
 
4264
- :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) :where(.bf-top-navigation-logo-title) {
4265
- transform: translateY(var(--bf-navigation-brand-title-optical-offset-block));
4266
- }
4267
-
4268
4491
  :where(.bf-theme) :where(.bf-panel-header) > :where(.bf-panel-title) {
4269
4492
  min-inline-size: 0;
4270
4493
  }
@@ -4285,10 +4508,10 @@ html.u-baseline-grid::after {
4285
4508
  flex-wrap: wrap;
4286
4509
  gap: var(--bf-field-gap);
4287
4510
  justify-content: space-between;
4288
- min-block-size: calc(var(--bf-control-box-size-compact) + (var(--bf-panel-padding-block) * 2));
4511
+ min-block-size: calc(var(--bf-control-box-size-compact) + var(--bf-panel-padding-block));
4289
4512
  padding-block-end: var(--bf-panel-padding-block);
4290
- padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4291
- padding-inline: var(--bf-panel-padding-inline);
4513
+ padding-block-start: 0;
4514
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4292
4515
  }
4293
4516
 
4294
4517
  :where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
@@ -4350,8 +4573,8 @@ html.u-baseline-grid::after {
4350
4573
  }
4351
4574
 
4352
4575
  :where(.bf-theme) :where(.bf-panel-toggle:focus-visible) {
4353
- outline: 2px solid var(--bf-color-focus);
4354
- outline-offset: 2px;
4576
+ outline: 0.125rem solid var(--bf-color-focus);
4577
+ outline-offset: 0.125rem;
4355
4578
  }
4356
4579
 
4357
4580
  :where(.bf-theme) :where(.bf-panel-content) {
@@ -4359,7 +4582,7 @@ html.u-baseline-grid::after {
4359
4582
  min-block-size: 0;
4360
4583
  padding-block-end: var(--bf-panel-padding-block);
4361
4584
  padding-block-start: var(--bf-panel-padding-block);
4362
- padding-inline: var(--bf-panel-padding-inline);
4585
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4363
4586
  }
4364
4587
 
4365
4588
  :where(.bf-theme) :where(.bf-panel-content.is-flush) {
@@ -4384,7 +4607,7 @@ html.u-baseline-grid::after {
4384
4607
  overflow: auto;
4385
4608
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4386
4609
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4387
- padding-inline: var(--bf-panel-padding-inline);
4610
+ padding-inline: var(--bf-component-inline-inset-continuation);
4388
4611
  }
4389
4612
 
4390
4613
  :where(.bf-theme) :where(.bf-card.is-highlighted) {
@@ -4409,7 +4632,7 @@ html.u-baseline-grid::after {
4409
4632
 
4410
4633
  :where(.bf-theme) :where(a.bf-card:hover, a.bf-card.is-highlighted:hover, a.bf-card.is-overlay:hover, a.bf-card.is-muted:hover) {
4411
4634
  border-color: var(--bf-color-focus);
4412
- transform: translateY(-1px);
4635
+ transform: translateY(-0.0625rem);
4413
4636
  }
4414
4637
 
4415
4638
  :where(.bf-theme) :where(a.bf-card:focus:not(:focus-visible), a.bf-card.is-highlighted:focus:not(:focus-visible), a.bf-card.is-overlay:focus:not(:focus-visible), a.bf-card.is-muted:focus:not(:focus-visible)) {
@@ -4417,8 +4640,8 @@ html.u-baseline-grid::after {
4417
4640
  }
4418
4641
 
4419
4642
  :where(.bf-theme) :where(a.bf-card:focus-visible, a.bf-card.is-highlighted:focus-visible, a.bf-card.is-overlay:focus-visible, a.bf-card.is-muted:focus-visible) {
4420
- outline: 2px solid var(--bf-color-focus);
4421
- outline-offset: -2px;
4643
+ outline: 0.125rem solid var(--bf-color-focus);
4644
+ outline-offset: -0.125rem;
4422
4645
  }
4423
4646
 
4424
4647
  :where(.bf-theme) :where(.bf-card.is-preview) {
@@ -4501,7 +4724,7 @@ html.u-baseline-grid::after {
4501
4724
  min-inline-size: 0;
4502
4725
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4503
4726
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4504
- padding-inline: var(--bf-panel-padding-inline);
4727
+ padding-inline: var(--bf-component-inline-inset-continuation);
4505
4728
  text-align: left;
4506
4729
  }
4507
4730
 
@@ -4514,7 +4737,7 @@ html.u-baseline-grid::after {
4514
4737
  :where(.bf-theme) :where(button.bf-option-card:hover:not(:disabled)) {
4515
4738
  background: var(--bf-color-background-hover);
4516
4739
  border-color: var(--bf-color-focus);
4517
- transform: translateY(-1px);
4740
+ transform: translateY(-0.0625rem);
4518
4741
  }
4519
4742
 
4520
4743
  :where(.bf-theme) :where(.bf-option-card.is-active),
@@ -4525,8 +4748,8 @@ html.u-baseline-grid::after {
4525
4748
  }
4526
4749
 
4527
4750
  :where(.bf-theme) :where(button.bf-option-card:focus-visible) {
4528
- outline: 2px solid var(--bf-color-focus);
4529
- outline-offset: -2px;
4751
+ outline: 0.125rem solid var(--bf-color-focus);
4752
+ outline-offset: -0.125rem;
4530
4753
  }
4531
4754
 
4532
4755
  :where(.bf-theme) :where(.bf-option-card-label) {
@@ -4574,7 +4797,7 @@ html.u-baseline-grid::after {
4574
4797
  /* Snap the grid-row wrapper after intrinsic image/copy measurement. Because
4575
4798
  the card flexes inside it, peers retain Vanilla's equal-height row while
4576
4799
  the card edge and the following row both land on BF baselines. */
4577
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
4800
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
4578
4801
  :where(.bf-theme) :where(.bf-content-card-wrapper) {
4579
4802
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
4580
4803
  }
@@ -4751,7 +4974,7 @@ html.u-baseline-grid::after {
4751
4974
  text-transform: var(--bf-h1-text-transform);
4752
4975
  }
4753
4976
 
4754
- :where(.bf-theme) :where(.bf-content-card-main-link) {
4977
+ :where(.bf-theme) :where(a.bf-content-card-main-link) {
4755
4978
  -webkit-box-orient: vertical;
4756
4979
  -webkit-line-clamp: 3;
4757
4980
  color: inherit;
@@ -4771,7 +4994,7 @@ html.u-baseline-grid::after {
4771
4994
  z-index: 1;
4772
4995
  }
4773
4996
 
4774
- :where(.bf-theme) :where(.bf-content-card-main-link:is(:hover, :focus, :active, :visited)) {
4997
+ :where(.bf-theme) :where(a.bf-content-card-main-link:is(:hover, :focus, :active, :visited)) {
4775
4998
  color: inherit;
4776
4999
  text-decoration: none;
4777
5000
  }
@@ -4781,8 +5004,8 @@ html.u-baseline-grid::after {
4781
5004
  }
4782
5005
 
4783
5006
  :where(.bf-theme) :where(.bf-content-card:has(.bf-content-card-main-link:focus-visible)) {
4784
- outline: 3px solid var(--bf-color-focus);
4785
- outline-offset: 2px;
5007
+ outline: 0.1875rem solid var(--bf-color-focus);
5008
+ outline-offset: 0.125rem;
4786
5009
  }
4787
5010
 
4788
5011
  /* All nested actions sit above the expanded main-link hit area. This includes
@@ -4858,6 +5081,7 @@ html.u-baseline-grid::after {
4858
5081
  min-inline-size: 0;
4859
5082
  overflow-x: auto;
4860
5083
  padding-block-end: var(--bf-space-1);
5084
+ padding-block-start: calc(0.5rem - var(--bf-border-width));
4861
5085
  padding-inline: var(--bf-space-2);
4862
5086
  position: relative;
4863
5087
  scrollbar-width: none;
@@ -4895,11 +5119,11 @@ html.u-baseline-grid::after {
4895
5119
 
4896
5120
  /* Internal geometry responds to the card's allocated width. The card root is
4897
5121
  only the container; the frame/media/body descendants own queried styles. */
4898
- /* Vanilla switches the viewport at 620px/1036px. A four-column card is much
5122
+ /* Vanilla switches the viewport at 38.75rem/64.75rem. A four-column card is much
4899
5123
  narrower than that viewport after grid margins and gutters, so its internal
4900
- horizontal layout uses Vanilla's 460px minimum viable allocation. The
4901
- eight-column 50/50 split starts at the roughly 960px allocation left by the
4902
- 1036px viewport. This preserves the rendered switch in embedded BF grids. */
5124
+ horizontal layout uses Vanilla's 28.75rem minimum viable allocation. The
5125
+ eight-column 50/50 split starts at the roughly 60rem allocation left by the
5126
+ 64.75rem viewport. This preserves the rendered switch in embedded BF grids. */
4903
5127
  @container bf-content-card (width < 28.75rem) {
4904
5128
  :where(.bf-theme) :where(.bf-content-card-frame:not(:has(.bf-content-card-footer))) {
4905
5129
  min-block-size: 0;
@@ -5051,18 +5275,16 @@ html.u-baseline-grid::after {
5051
5275
 
5052
5276
  :where(.bf-theme) :where(.bf-tabs) {
5053
5277
  display: grid;
5278
+ gap: var(--bf-space-2);
5054
5279
  min-inline-size: 0;
5055
5280
  }
5056
5281
 
5057
5282
  :where(.bf-theme) :where(.bf-tabs-list) {
5058
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-default);
5283
+ box-shadow: inset 0 calc(var(--bf-border-width) * -1) 0 var(--bf-color-border-default);
5059
5284
  display: flex;
5060
5285
  gap: 0;
5061
5286
  list-style: none;
5062
- /* Tabs keep their occupied block on the grid at the list boundary rather
5063
- than leaving each link's control compensation between its active rule and
5064
- the list rule. */
5065
- margin: 0 0 calc((var(--bf-baseline) * 2) - var(--bf-border-width));
5287
+ margin: 0;
5066
5288
  min-inline-size: 0;
5067
5289
  overflow-x: auto;
5068
5290
  padding: 0;
@@ -5084,16 +5306,16 @@ html.u-baseline-grid::after {
5084
5306
  align-items: center;
5085
5307
  background: transparent;
5086
5308
  border: 0;
5087
- border-bottom: var(--bf-bar-thickness) solid transparent;
5309
+ border-block: var(--bf-border-width) solid transparent;
5088
5310
  color: var(--bf-color-text-muted);
5089
5311
  cursor: pointer;
5090
- display: inline-flex;
5312
+ display: flex;
5091
5313
  gap: calc(var(--bf-baseline) * 0.5);
5092
5314
  justify-content: center;
5093
5315
  margin-bottom: 0;
5094
- padding-block-end: calc(var(--bf-body-nudge-end) + var(--bf-baseline) - var(--bf-bar-thickness));
5095
- padding-block-start: var(--bf-body-nudge-start);
5096
- padding-inline: var(--bf-control-inline-padding-action);
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);
5318
+ padding-inline: var(--bf-component-inline-inset-action);
5097
5319
  text-decoration: none;
5098
5320
  }
5099
5321
 
@@ -5102,18 +5324,22 @@ html.u-baseline-grid::after {
5102
5324
  color: var(--bf-color-text-default);
5103
5325
  }
5104
5326
 
5327
+ :where(.bf-theme) :where(a.bf-tabs-link:hover) {
5328
+ text-decoration: none;
5329
+ }
5330
+
5105
5331
  :where(.bf-theme) :where(.bf-tabs-link:focus:not(:focus-visible)) {
5106
5332
  outline: none;
5107
5333
  }
5108
5334
 
5109
5335
  :where(.bf-theme) :where(.bf-tabs-link:focus-visible) {
5110
5336
  color: var(--bf-color-text-default);
5111
- outline: 2px solid var(--bf-color-focus);
5112
- outline-offset: -2px;
5337
+ outline: 0.125rem solid var(--bf-color-focus);
5338
+ outline-offset: -0.125rem;
5113
5339
  }
5114
5340
 
5115
5341
  :where(.bf-theme) :where(.bf-tabs-link.is-active, .bf-tabs-link[aria-selected='true']) {
5116
- border-bottom-color: var(--bf-color-text-default);
5342
+ box-shadow: inset 0 calc(var(--bf-bar-thickness) * -1) 0 var(--bf-color-text-default);
5117
5343
  color: var(--bf-color-text-default);
5118
5344
  }
5119
5345
 
@@ -5163,10 +5389,10 @@ html.u-baseline-grid::after {
5163
5389
  display: grid;
5164
5390
  gap: calc(var(--bf-baseline) * 0.75);
5165
5391
  grid-template-columns: auto minmax(0, 1fr) auto;
5166
- margin: 0 0 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)));
5392
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
5167
5393
  min-inline-size: 0;
5168
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
5169
- padding-inline: var(--bf-control-inline-padding-field);
5394
+ padding-block: var(--bf-single-line-row-padding-block);
5395
+ padding-inline: var(--bf-component-inline-inset-field);
5170
5396
  }
5171
5397
 
5172
5398
  :where(.bf-theme) :where(.bf-choice-row:hover) {
@@ -5174,8 +5400,8 @@ html.u-baseline-grid::after {
5174
5400
  }
5175
5401
 
5176
5402
  :where(.bf-theme) :where(.bf-choice-row:has(:focus-visible)) {
5177
- outline: 2px solid var(--bf-color-focus);
5178
- outline-offset: -2px;
5403
+ outline: 0.125rem solid var(--bf-color-focus);
5404
+ outline-offset: -0.125rem;
5179
5405
  }
5180
5406
 
5181
5407
  :where(.bf-theme) :where(.bf-choice-row input[type='radio']) {
@@ -5222,7 +5448,7 @@ html.u-baseline-grid::after {
5222
5448
  gap: var(--bf-field-gap);
5223
5449
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
5224
5450
  padding-block-start: var(--bf-panel-padding-block);
5225
- padding-inline: var(--bf-panel-padding-inline);
5451
+ padding-inline: var(--bf-component-inline-inset-continuation);
5226
5452
  }
5227
5453
 
5228
5454
  :where(.bf-theme) :where(.bf-inline-options-heading) {
@@ -5296,11 +5522,11 @@ html.u-baseline-grid::after {
5296
5522
  cursor: pointer;
5297
5523
  display: inline-flex;
5298
5524
  justify-content: center;
5299
- margin-bottom: 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)));
5525
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
5300
5526
  max-inline-size: 100%;
5301
5527
  overflow: hidden;
5302
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
5303
- padding-inline: var(--bf-control-inline-padding-action);
5528
+ padding-block: var(--bf-single-line-row-padding-block);
5529
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
5304
5530
  text-align: center;
5305
5531
  text-decoration: none;
5306
5532
  text-overflow: ellipsis;
@@ -5326,8 +5552,8 @@ html.u-baseline-grid::after {
5326
5552
  }
5327
5553
 
5328
5554
  :where(.bf-theme) :where(.bf-segmented-control-button:focus-visible, .bf-tab-buttons-button:focus-visible) {
5329
- outline: 2px solid var(--bf-color-focus);
5330
- outline-offset: -2px;
5555
+ outline: 0.125rem solid var(--bf-color-focus);
5556
+ outline-offset: -0.125rem;
5331
5557
  z-index: 2;
5332
5558
  }
5333
5559
 
@@ -5361,8 +5587,10 @@ html.u-baseline-grid::after {
5361
5587
  font-weight: var(--bf-body-font-weight, 400);
5362
5588
  line-height: var(--bf-body-line-height, 1.5rem);
5363
5589
  color: var(--bf-color-text-muted);
5364
- margin: 0;
5590
+ margin: 0 0 var(--bf-body-margin-bottom);
5365
5591
  min-inline-size: 0;
5592
+ padding-block-end: 0;
5593
+ padding-block-start: var(--bf-body-nudge-start);
5366
5594
  }
5367
5595
 
5368
5596
  :where(.bf-theme) :where(.bf-breadcrumbs-item) + :where(.bf-breadcrumbs-item)::before {
@@ -5393,26 +5621,35 @@ html.u-baseline-grid::after {
5393
5621
  :where(.bf-theme) :where(.bf-tab-section) {
5394
5622
  container-name: bf-tab-section;
5395
5623
  container-type: inline-size;
5396
- margin-block-end: var(--bf-section-space);
5624
+ margin: 0;
5397
5625
  min-inline-size: 0;
5398
5626
  }
5399
5627
 
5400
- :where(.bf-theme) :where(.bf-tab-section.is-shallow) {
5401
- margin-block-end: var(--bf-section-space-shallow);
5628
+ :where(.bf-theme) :where(.bf-tab-section-layout) {
5629
+ display: grid;
5630
+ grid-template-columns: minmax(0, 1fr);
5631
+ min-inline-size: 0;
5402
5632
  }
5403
5633
 
5404
- :where(.bf-theme) :where(.bf-tab-section.is-deep) {
5405
- margin-block-end: var(--bf-section-space-deep);
5634
+ :where(.bf-theme) :where(.bf-tab-section-rule) {
5635
+ grid-column: 1 / -1;
5406
5636
  }
5407
5637
 
5408
- :where(.bf-theme) :where(.bf-tab-section-layout) {
5638
+ :where(.bf-theme) :where(.bf-tab-section-body) {
5639
+ --bf-stack-space: var(--bf-section-space-shallow);
5640
+ align-content: start;
5409
5641
  display: grid;
5642
+ gap: var(--bf-stack-space);
5410
5643
  grid-template-columns: minmax(0, 1fr);
5411
5644
  min-inline-size: 0;
5412
5645
  }
5413
5646
 
5414
- :where(.bf-theme) :where(.bf-tab-section-rule) {
5415
- grid-column: 1 / -1;
5647
+ :where(.bf-theme) :where(.bf-tab-section-copy) {
5648
+ align-content: start;
5649
+ display: grid;
5650
+ grid-template-columns: minmax(0, 1fr);
5651
+ min-inline-size: 0;
5652
+ row-gap: var(--bf-space-1);
5416
5653
  }
5417
5654
 
5418
5655
  :where(.bf-theme) :where(.bf-tab-section-header, .bf-tab-section-intro, .bf-tab-section-tabs) {
@@ -5420,51 +5657,50 @@ html.u-baseline-grid::after {
5420
5657
  overflow-wrap: anywhere;
5421
5658
  }
5422
5659
 
5423
- /* Vanilla wraps every tab rail except the unadorned 50/50 special case in a
5424
- shallow section. This explicit composition padding does not change any
5425
- child's semantic margins. */
5426
- :where(.bf-theme) :where(.bf-tab-section:not(.is-50-50)) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs),
5427
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-tabs) {
5428
- padding-block-start: var(--bf-section-space-shallow);
5660
+ :where(.bf-theme) :where(.bf-tab-section-tabs) {
5661
+ align-self: start;
5429
5662
  }
5430
5663
 
5431
- @container bf-tab-section (width >= 64.75rem) {
5432
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) {
5664
+ @container bf-tab-section (width >= 45rem) {
5665
+ :where(.bf-theme) :where(.bf-tab-section-body) {
5433
5666
  column-gap: var(--bf-grid-gap-inline);
5434
5667
  grid-template-columns: repeat(4, minmax(0, 1fr));
5435
5668
  }
5436
5669
 
5437
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
5670
+ :where(.bf-theme) :where(.bf-tab-section-copy) {
5438
5671
  grid-column: 1 / -1;
5672
+ grid-template-columns: subgrid;
5439
5673
  }
5440
5674
 
5441
5675
  /* With supporting copy or actions, Vanilla's heading row is 50/50 for all
5442
5676
  three section layouts. The following tab rail retains its own requested
5443
5677
  full, half or three-quarter span. */
5444
- :where(.bf-theme) :where(.bf-tab-section-layout:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-header) {
5678
+ :where(.bf-theme) :where(.bf-tab-section-copy:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-header) {
5445
5679
  grid-column: 1 / 3;
5446
5680
  }
5447
5681
 
5448
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-intro) {
5682
+ :where(.bf-theme) :where(.bf-tab-section-copy) > :where(.bf-tab-section-intro) {
5449
5683
  grid-column: 3 / -1;
5450
5684
  }
5451
5685
 
5452
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5686
+ :where(.bf-theme) :where(.bf-tab-section-body) > :where(.bf-tab-section-tabs) {
5453
5687
  grid-column: 1 / -1;
5454
5688
  }
5455
5689
 
5456
5690
  /* An unadorned 50/50 section lets auto-placement put the heading and tabs
5457
5691
  in the same row. If an intro exists, it occupies that right-hand cell and
5458
5692
  the tabs move to the following row, matching the upstream rendering. */
5459
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
5693
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) :where(.bf-tab-section-copy:not(:has(> .bf-tab-section-intro))) {
5460
5694
  grid-column: 1 / 3;
5695
+ grid-row: 1;
5461
5696
  }
5462
5697
 
5463
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5698
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) :where(.bf-tab-section-copy:not(:has(> .bf-tab-section-intro))) + :where(.bf-tab-section-tabs) {
5464
5699
  grid-column: 3 / -1;
5700
+ grid-row: 1;
5465
5701
  }
5466
5702
 
5467
- :where(.bf-theme) :where(.bf-tab-section.is-25-75) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5703
+ :where(.bf-theme) :where(.bf-tab-section.is-25-75) :where(.bf-tab-section-body) > :where(.bf-tab-section-tabs) {
5468
5704
  grid-column: 2 / -1;
5469
5705
  }
5470
5706
  }
@@ -5475,11 +5711,11 @@ html.u-baseline-grid::after {
5475
5711
  container-type: inline-size;
5476
5712
  display: grid;
5477
5713
  grid-template-columns: auto minmax(0, 1fr);
5478
- margin-block-end: var(--bf-section-space-shallow);
5714
+ margin: 0;
5479
5715
  min-inline-size: 0;
5480
5716
  }
5481
5717
 
5482
- :where(.bf-theme) :where(.bf-article-pagination-link) {
5718
+ :where(.bf-theme) :where(a.bf-article-pagination-link) {
5483
5719
  background-color: var(--bf-color-background-default);
5484
5720
  border: var(--bf-border-width) solid transparent;
5485
5721
  box-sizing: border-box;
@@ -5495,8 +5731,9 @@ html.u-baseline-grid::after {
5495
5731
  text-decoration: none;
5496
5732
  }
5497
5733
 
5498
- :where(.bf-theme) :where(.bf-article-pagination-link:hover) {
5734
+ :where(.bf-theme) :where(a.bf-article-pagination-link:hover) {
5499
5735
  background-color: var(--bf-color-background-hover);
5736
+ text-decoration: none;
5500
5737
  }
5501
5738
 
5502
5739
  :where(.bf-theme) :where(.bf-article-pagination-link:focus:not(:focus-visible)) {
@@ -5504,8 +5741,8 @@ html.u-baseline-grid::after {
5504
5741
  }
5505
5742
 
5506
5743
  :where(.bf-theme) :where(.bf-article-pagination-link:focus-visible) {
5507
- outline: 2px solid var(--bf-color-focus);
5508
- outline-offset: 2px;
5744
+ outline: 0.125rem solid var(--bf-color-focus);
5745
+ outline-offset: 0.125rem;
5509
5746
  }
5510
5747
 
5511
5748
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous) {
@@ -5607,12 +5844,12 @@ html.u-baseline-grid::after {
5607
5844
 
5608
5845
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-label),
5609
5846
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-title) {
5610
- block-size: 1px;
5847
+ block-size: 0.0625rem;
5611
5848
  border: 0;
5612
5849
  clip: rect(0 0 0 0);
5613
5850
  clip-path: inset(50%);
5614
- inline-size: 1px;
5615
- margin: -1px;
5851
+ inline-size: 0.0625rem;
5852
+ margin: -0.0625rem;
5616
5853
  overflow: hidden;
5617
5854
  padding: 0;
5618
5855
  position: absolute;
@@ -5630,6 +5867,10 @@ html.u-baseline-grid::after {
5630
5867
  padding: 0;
5631
5868
  }
5632
5869
 
5870
+ :where(.bf-theme) :where(.bf-list:has(> .bf-list-item:is(.is-ticked, .is-crossed)), ol.bf-list.is-divided) {
5871
+ padding-inline-start: var(--bf-leading-mark-group-inset);
5872
+ }
5873
+
5633
5874
  :where(.bf-theme) :where(.bf-list-item) {
5634
5875
  font-family: var(--bf-body-font-family, "Ubuntu Sans", "Segoe UI", system-ui, sans-serif);
5635
5876
  font-size: var(--bf-body-font-size, 1rem);
@@ -5645,8 +5886,10 @@ html.u-baseline-grid::after {
5645
5886
  }
5646
5887
 
5647
5888
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item) {
5648
- box-shadow: inset 0 1px 0 var(--bf-color-border-low-contrast);
5649
- padding-block-end: var(--bf-baseline);
5889
+ border-block: var(--bf-border-width) solid transparent;
5890
+ 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);
5650
5893
  }
5651
5894
 
5652
5895
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item:first-child) {
@@ -5654,7 +5897,7 @@ html.u-baseline-grid::after {
5654
5897
  }
5655
5898
 
5656
5899
  :where(.bf-theme) :where(.bf-list-item.is-ticked, .bf-list-item.is-crossed) {
5657
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
5900
+ padding-inline-start: var(--bf-leading-mark-offset);
5658
5901
  position: relative;
5659
5902
  }
5660
5903
 
@@ -5679,10 +5922,6 @@ html.u-baseline-grid::after {
5679
5922
  background-image: var(--bf-ui-icon-error-grey);
5680
5923
  }
5681
5924
 
5682
- :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item.is-ticked, .bf-list-item.is-crossed)::before {
5683
- top: calc(var(--bf-leading-icon-offset) + (var(--bf-baseline) * 0.5));
5684
- }
5685
-
5686
5925
  :where(.bf-theme) :where(ol.bf-list.is-divided) {
5687
5926
  counter-reset: bf-list-counter;
5688
5927
  }
@@ -5764,11 +6003,11 @@ html.u-baseline-grid::after {
5764
6003
  background: var(--bf-color-background-alt);
5765
6004
  color: var(--bf-color-link-default);
5766
6005
  display: block;
5767
- left: -999px;
6006
+ left: -62.4375rem;
5768
6007
  max-inline-size: calc(100vw - var(--bf-baseline));
5769
6008
  position: absolute;
5770
6009
  text-decoration: none;
5771
- top: -999px;
6010
+ top: -62.4375rem;
5772
6011
  }
5773
6012
 
5774
6013
  :where(.bf-theme) :where(.bf-skip-link:hover) {
@@ -5777,7 +6016,7 @@ html.u-baseline-grid::after {
5777
6016
 
5778
6017
  :where(.bf-theme) :where(.bf-skip-link:focus, .bf-skip-link:focus-visible) {
5779
6018
  left: calc(var(--bf-baseline) * 0.5);
5780
- outline: 2px solid var(--bf-color-focus);
6019
+ outline: 0.125rem solid var(--bf-color-focus);
5781
6020
  outline-offset: 0;
5782
6021
  padding-block: calc(var(--bf-baseline) * 1.5);
5783
6022
  padding-inline: calc(var(--bf-baseline) * 1.5);
@@ -5828,15 +6067,16 @@ html.u-baseline-grid::after {
5828
6067
  line-height: var(--bf-table-row-line-height);
5829
6068
  margin: 0;
5830
6069
  overflow: hidden;
5831
- padding-block: var(--bf-table-row-padding);
5832
- padding-inline: calc(var(--bf-baseline) * 0.75);
6070
+ padding-block-end: var(--bf-table-row-padding-block-end);
6071
+ padding-block-start: var(--bf-table-row-padding-block-start);
6072
+ padding-inline: var(--bf-component-inline-inset-field);
5833
6073
  text-align: left;
5834
6074
  text-overflow: ellipsis;
5835
6075
  vertical-align: top;
5836
6076
  }
5837
6077
 
5838
6078
  :where(.bf-theme) :where(th.is-icon-placeholder, td.is-icon-placeholder, .bf-table-cell.is-icon-placeholder) {
5839
- padding-inline-start: calc((var(--bf-baseline) * 0.75) + var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
6079
+ padding-inline-start: calc(var(--bf-component-inline-inset-field) + var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
5840
6080
  }
5841
6081
 
5842
6082
  :where(.bf-theme) :where(th.is-icon-placeholder, td.is-icon-placeholder, .bf-table-cell.is-icon-placeholder) > :where(.bf-icon:first-child) {
@@ -5864,10 +6104,6 @@ html.u-baseline-grid::after {
5864
6104
  border-block-end-color: var(--bf-color-border-low-contrast);
5865
6105
  }
5866
6106
 
5867
- :where(.bf-theme) :where(tbody tr:has(.bf-status-label) > td) {
5868
- padding-block: calc((var(--bf-baseline) - var(--bf-table-row-border-size)) / 2);
5869
- }
5870
-
5871
6107
  :where(.bf-theme) :where(tbody tr:hover td) {
5872
6108
  background: color-mix(in srgb, var(--bf-color-background-hover) 68%, transparent);
5873
6109
  }
@@ -5888,21 +6124,23 @@ html.u-baseline-grid::after {
5888
6124
  align-items: baseline;
5889
6125
  background-color: var(--bf-ui-chip-background);
5890
6126
  border: var(--bf-border-width) solid var(--bf-ui-chip-border);
5891
- border-radius: 1rem;
6127
+ border-radius: var(--bf-ui-chip-radius);
5892
6128
  color: var(--bf-color-text-default);
5893
6129
  display: inline-flex;
5894
6130
  gap: 0;
5895
6131
  inline-size: fit-content;
5896
6132
  justify-self: start;
5897
- margin: 0 var(--bf-ui-chip-padding-inline) var(--bf-field-gap) 0;
6133
+ margin: 0 var(--bf-ui-chip-padding-inline) var(--bf-single-line-row-margin-block-end) 0;
5898
6134
  max-inline-size: 100%;
5899
- min-block-size: var(--bf-ui-chip-block-size);
5900
- padding-block: var(--bf-ui-chip-padding-block);
5901
- padding-inline: var(--bf-ui-chip-padding-inline);
6135
+ padding-block: var(--bf-single-line-row-padding-block);
6136
+ padding-inline: max(0rem, calc(var(--bf-ui-chip-padding-inline) - var(--bf-border-width)));
5902
6137
  position: relative;
5903
6138
  text-decoration: none;
5904
6139
  user-select: none;
5905
- vertical-align: calc(var(--bf-border-width) - var(--bf-body-nudge-start, 0.41rem));
6140
+ /* Inline-flex exposes the first text child's baseline. The surrounding
6141
+ border-aware row contract now matches buttons instead of inventing a
6142
+ second chip-only occupied height. */
6143
+ vertical-align: baseline;
5906
6144
  white-space: nowrap;
5907
6145
  }
5908
6146
 
@@ -5942,6 +6180,15 @@ html.u-baseline-grid::after {
5942
6180
  --bf-ui-chip-background-active: var(--bf-color-background-information-active);
5943
6181
  }
5944
6182
 
6183
+ :where(.bf-theme) :where(.bf-chip.is-borderless) {
6184
+ --bf-ui-chip-border: transparent;
6185
+ --bf-ui-chip-border-hover: transparent;
6186
+ --bf-ui-chip-border-active: transparent;
6187
+ --bf-ui-chip-background: transparent;
6188
+ --bf-ui-chip-background-hover: transparent;
6189
+ --bf-ui-chip-background-active: transparent;
6190
+ }
6191
+
5945
6192
  :where(.bf-theme) :where(.bf-chip, .bf-chip.is-positive, .bf-chip.is-caution, .bf-chip.is-negative, .bf-chip.is-information):hover {
5946
6193
  background-color: var(--bf-ui-chip-background-hover);
5947
6194
  border-color: var(--bf-ui-chip-border-hover);
@@ -6026,16 +6273,20 @@ html.u-baseline-grid::after {
6026
6273
  --bf-ui-status-background: color-mix(in srgb, var(--bf-color-background-alt) 70%, black);
6027
6274
  --bf-ui-status-color: var(--bf-color-button-positive-text);
6028
6275
  background-color: var(--bf-ui-status-background);
6276
+ border-block: var(--bf-border-width) solid transparent;
6029
6277
  color: var(--bf-ui-status-color);
6030
6278
  display: inline-block;
6279
+ inline-size: fit-content;
6280
+ justify-self: start;
6031
6281
  font-family: var(--bf-body-font-family, "Ubuntu Sans", "Segoe UI", system-ui, sans-serif);
6032
6282
  font-size: var(--bf-body-font-size, 1rem);
6033
6283
  font-style: var(--bf-body-font-style, normal);
6034
6284
  font-weight: var(--bf-body-font-weight, 400);
6035
6285
  line-height: var(--bf-body-line-height, 1.5rem);
6036
- margin: 0;
6037
- padding-block-end: var(--bf-h5-nudge-end);
6038
- padding-block-start: var(--bf-h5-nudge-start, 0.41rem);
6286
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6287
+ /* Status paint is physically symmetric and shares the same occupied block
6288
+ as a button; typography still comes from the body role. */
6289
+ padding-block: var(--bf-single-line-row-padding-block);
6039
6290
  padding-inline: var(--bf-ui-chip-padding-inline);
6040
6291
  text-align: center;
6041
6292
  text-decoration: none;
@@ -6062,6 +6313,38 @@ html.u-baseline-grid::after {
6062
6313
  --bf-ui-status-color: var(--bf-color-button-negative-text);
6063
6314
  }
6064
6315
 
6316
+ /* Nested auxiliary surfaces fit a body-sized flex/grid host instead of
6317
+ carrying a second standalone occupied-row contract. This modifier is
6318
+ explicit so component density never changes merely because of ancestry. */
6319
+ :where(.bf-theme) :where(.bf-chip.is-nested, .bf-status-label.is-nested) {
6320
+ line-height: var(--bf-nested-auxiliary-line-height);
6321
+ margin-block: 0;
6322
+ padding-block: var(--bf-nested-auxiliary-padding-block);
6323
+ }
6324
+
6325
+ :where(.bf-theme) :where(.bf-chip.is-nested) {
6326
+ border: 0;
6327
+ box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-ui-chip-border);
6328
+ }
6329
+
6330
+ :where(.bf-theme) :where(.bf-chip.is-nested:hover) {
6331
+ box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-ui-chip-border-hover);
6332
+ }
6333
+
6334
+ :where(.bf-theme) :where(.bf-chip.is-nested:is(:active, [aria-pressed='true'], .is-selected)) {
6335
+ box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-ui-chip-border-active);
6336
+ }
6337
+
6338
+ :where(.bf-theme) :where(.bf-status-label.is-nested) {
6339
+ border-block-width: 0;
6340
+ }
6341
+
6342
+ :where(.bf-theme) :where(.bf-badge.is-nested) {
6343
+ align-self: center;
6344
+ line-height: var(--bf-nested-auxiliary-line-height);
6345
+ vertical-align: middle;
6346
+ }
6347
+
6065
6348
 
6066
6349
  :where(.bf-theme) :where(.bf-chip-dismiss, .bf-search-box-reset, .bf-search-and-filter-clear) {
6067
6350
  appearance: none;
@@ -6073,7 +6356,7 @@ html.u-baseline-grid::after {
6073
6356
  margin: 0;
6074
6357
  padding: 0;
6075
6358
  position: relative;
6076
- text-indent: -9999px;
6359
+ text-indent: -624.9375rem;
6077
6360
  }
6078
6361
 
6079
6362
  :where(.bf-theme) :where(.bf-chip-dismiss) {
@@ -6085,7 +6368,7 @@ html.u-baseline-grid::after {
6085
6368
  :where(.bf-theme) :where(.bf-chip-dismiss, .bf-search-box-reset, .bf-search-and-filter-clear)::before,
6086
6369
  :where(.bf-theme) :where(.bf-chip-dismiss, .bf-search-box-reset, .bf-search-and-filter-clear)::after {
6087
6370
  background: currentColor;
6088
- block-size: 2px;
6371
+ block-size: 0.125rem;
6089
6372
  content: "";
6090
6373
  inline-size: 0.75rem;
6091
6374
  left: 50%;
@@ -6103,7 +6386,7 @@ html.u-baseline-grid::after {
6103
6386
 
6104
6387
 
6105
6388
  :where(.bf-theme) :where(.bf-search-box) {
6106
- --bf-search-box-action-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
6389
+ --bf-search-box-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
6107
6390
  --bf-search-box-trailing-inline-size: calc((var(--bf-search-box-action-inline-size) * 2) + var(--bf-border-width));
6108
6391
  display: flex;
6109
6392
  inline-size: 100%;
@@ -6120,12 +6403,12 @@ html.u-baseline-grid::after {
6120
6403
 
6121
6404
  :where(.bf-theme) :where(.bf-search-box-reset, .bf-search-box-button) {
6122
6405
  align-items: center;
6123
- block-size: var(--bf-control-box-size);
6406
+ block-size: auto;
6124
6407
  display: inline-flex;
6125
6408
  inline-size: var(--bf-search-box-action-inline-size);
6409
+ inset-block: 0;
6126
6410
  justify-content: center;
6127
6411
  position: absolute;
6128
- top: 0;
6129
6412
  }
6130
6413
 
6131
6414
  :where(.bf-theme) :where(.bf-search-box-reset) {
@@ -6142,7 +6425,7 @@ html.u-baseline-grid::after {
6142
6425
  inset-inline-end: var(--bf-border-width);
6143
6426
  margin: 0;
6144
6427
  padding: 0;
6145
- text-indent: -9999px;
6428
+ text-indent: -624.9375rem;
6146
6429
  }
6147
6430
 
6148
6431
  :where(.bf-theme) :where(.bf-search-box-button)::before {
@@ -6169,8 +6452,8 @@ html.u-baseline-grid::after {
6169
6452
  }
6170
6453
 
6171
6454
  :where(.bf-theme) :where(.bf-search-box-reset:focus-visible, .bf-search-box-button:focus-visible) {
6172
- outline: 2px solid var(--bf-color-focus);
6173
- outline-offset: -2px;
6455
+ outline: 0.125rem solid var(--bf-color-focus);
6456
+ outline-offset: -0.125rem;
6174
6457
  }
6175
6458
 
6176
6459
  :where(.bf-theme) :where(.bf-search-and-filter) {
@@ -6185,7 +6468,7 @@ html.u-baseline-grid::after {
6185
6468
  :where(.bf-theme) :where(.bf-search-and-filter-search-container) {
6186
6469
  align-items: stretch;
6187
6470
  background: transparent;
6188
- box-shadow: inset 0 -1px 0 var(--bf-color-border-high-contrast);
6471
+ box-shadow: inset 0 -0.0625rem 0 var(--bf-color-border-high-contrast);
6189
6472
  display: flex;
6190
6473
  flex-wrap: wrap;
6191
6474
  gap: var(--bf-field-gap);
@@ -6201,7 +6484,7 @@ html.u-baseline-grid::after {
6201
6484
  }
6202
6485
 
6203
6486
  :where(.bf-theme) :where(.bf-search-and-filter-box) {
6204
- --bf-search-and-filter-action-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
6487
+ --bf-search-and-filter-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
6205
6488
  --bf-search-and-filter-trailing-inline-size: calc(var(--bf-search-and-filter-action-inline-size) * 2);
6206
6489
  display: inline-flex;
6207
6490
  flex: 1 1 12rem;
@@ -6218,17 +6501,17 @@ html.u-baseline-grid::after {
6218
6501
  :where(.bf-theme) :where(.bf-search-and-filter-search-button) {
6219
6502
  appearance: none;
6220
6503
  background: transparent;
6221
- block-size: var(--bf-control-box-size);
6504
+ block-size: auto;
6222
6505
  border: 0;
6223
6506
  color: var(--bf-color-text-default);
6224
6507
  cursor: pointer;
6225
6508
  inline-size: var(--bf-search-and-filter-action-inline-size);
6509
+ inset-block: 0;
6226
6510
  inset-inline-end: 0;
6227
6511
  margin: 0;
6228
6512
  padding: 0;
6229
6513
  position: absolute;
6230
- text-indent: -9999px;
6231
- top: 0;
6514
+ text-indent: -624.9375rem;
6232
6515
  }
6233
6516
 
6234
6517
  :where(.bf-theme) :where(.bf-search-and-filter-search-button)::before {
@@ -6255,16 +6538,16 @@ html.u-baseline-grid::after {
6255
6538
  }
6256
6539
 
6257
6540
  :where(.bf-theme) :where(.bf-search-and-filter-search-button:focus-visible, .bf-search-and-filter-selected-count:focus-visible) {
6258
- outline: 2px solid var(--bf-color-focus);
6259
- outline-offset: -2px;
6541
+ outline: 0.125rem solid var(--bf-color-focus);
6542
+ outline-offset: -0.125rem;
6260
6543
  }
6261
6544
 
6262
6545
  :where(.bf-theme) :where(.bf-search-and-filter-clear) {
6263
- block-size: var(--bf-control-box-size);
6546
+ block-size: auto;
6264
6547
  inline-size: var(--bf-search-and-filter-action-inline-size);
6548
+ inset-block: 0;
6265
6549
  inset-inline-end: var(--bf-search-and-filter-action-inline-size);
6266
6550
  position: absolute;
6267
- top: 0;
6268
6551
  }
6269
6552
 
6270
6553
  :where(.bf-theme) :where(.bf-search-and-filter-selected-count) {
@@ -6294,12 +6577,12 @@ html.u-baseline-grid::after {
6294
6577
  background-color: var(--bf-color-background-inputs);
6295
6578
  border: var(--bf-border-width) solid var(--bf-color-border-default);
6296
6579
  border-top: 0;
6297
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
6580
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
6298
6581
  display: grid;
6299
6582
  gap: var(--bf-field-gap);
6300
6583
  opacity: 1;
6301
6584
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
6302
- padding-inline: var(--bf-panel-padding-inline);
6585
+ padding-inline: var(--bf-component-inline-inset-continuation);
6303
6586
  padding-top: var(--bf-panel-padding-block);
6304
6587
  position: absolute;
6305
6588
  top: 100%;
@@ -6344,12 +6627,6 @@ html.u-baseline-grid::after {
6344
6627
  }
6345
6628
 
6346
6629
  :where(.bf-theme) :where(.bf-filter-panel-section-heading) {
6347
- font-family: var(--bf-h6-font-family, "Ubuntu Sans", "Segoe UI", system-ui, sans-serif);
6348
- font-size: var(--bf-h6-font-size, 1rem);
6349
- font-style: var(--bf-h6-font-style, normal);
6350
- font-weight: var(--bf-h6-font-weight, 550);
6351
- line-height: var(--bf-h6-line-height, 1.5rem);
6352
- color: var(--bf-color-text-muted);
6353
6630
  margin: 0;
6354
6631
  padding-block: 0;
6355
6632
  }
@@ -6396,7 +6673,7 @@ html.u-baseline-grid::after {
6396
6673
  :where(.bf-theme) :where(.bf-list-tree) {
6397
6674
  list-style: none;
6398
6675
  margin: 0;
6399
- padding-left: calc(var(--bf-baseline) * 0.5);
6676
+ padding-left: 0;
6400
6677
  }
6401
6678
 
6402
6679
  :where(.bf-theme) :where(.bf-list-tree) :where(.bf-list-tree) {
@@ -6410,27 +6687,29 @@ html.u-baseline-grid::after {
6410
6687
  }
6411
6688
 
6412
6689
  :where(.bf-theme) :where(.bf-list-tree-item) {
6690
+ display: grid;
6413
6691
  margin: 0;
6414
- padding-left: calc(var(--bf-baseline) * 1.5);
6692
+ padding-left: 0;
6415
6693
  position: relative;
6416
6694
  }
6417
6695
 
6418
- :where(.bf-theme) :where(.bf-list-tree-link) {
6696
+ :where(.bf-theme) :where(a.bf-list-tree-link) {
6419
6697
  font-family: var(--bf-body-font-family, "Ubuntu Sans", "Segoe UI", system-ui, sans-serif);
6420
6698
  font-size: var(--bf-body-font-size, 1rem);
6421
6699
  font-style: var(--bf-body-font-style, normal);
6422
6700
  font-weight: var(--bf-body-font-weight, 400);
6423
6701
  line-height: var(--bf-body-line-height, 1.5rem);
6424
6702
  color: var(--bf-color-text-default);
6703
+ border-block: var(--bf-border-width) solid transparent;
6425
6704
  cursor: pointer;
6426
6705
  display: block;
6427
- margin: 0;
6428
- min-block-size: var(--bf-control-box-size-compact);
6429
- padding-block: var(--bf-control-block-padding-compact);
6706
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6707
+ padding-block: var(--bf-single-line-row-padding-block);
6708
+ padding-inline: var(--bf-component-inline-inset-continuation) var(--bf-component-inline-inset-action);
6430
6709
  text-decoration: none;
6431
6710
  }
6432
6711
 
6433
- :where(.bf-theme) :where(.bf-list-tree-link):hover {
6712
+ :where(.bf-theme) :where(a.bf-list-tree-link:hover) {
6434
6713
  color: var(--bf-color-link-default);
6435
6714
  text-decoration: underline;
6436
6715
  }
@@ -6444,8 +6723,8 @@ html.u-baseline-grid::after {
6444
6723
  }
6445
6724
 
6446
6725
  :where(.bf-theme) :where(.bf-list-tree-link):focus-visible {
6447
- outline: 2px solid var(--bf-color-focus);
6448
- outline-offset: -2px;
6726
+ outline: 0.125rem solid var(--bf-color-focus);
6727
+ outline-offset: -0.125rem;
6449
6728
  }
6450
6729
 
6451
6730
  :where(.bf-theme) :where(.bf-list-tree-toggle) {
@@ -6457,14 +6736,14 @@ html.u-baseline-grid::after {
6457
6736
  align-items: center;
6458
6737
  background: transparent;
6459
6738
  border: 0;
6739
+ border-block: var(--bf-border-width) solid transparent;
6460
6740
  color: var(--bf-color-text-default);
6461
6741
  cursor: pointer;
6462
- display: inline-flex;
6463
- gap: calc(var(--bf-baseline) * 0.5);
6464
- margin: 0 0 0 calc(var(--bf-baseline) * -1.5);
6465
- min-block-size: var(--bf-control-box-size-compact);
6466
- padding-block: var(--bf-control-block-padding-compact);
6467
- padding-inline: calc(var(--bf-baseline) * 0.25) calc(var(--bf-baseline) * 0.5);
6742
+ display: flex;
6743
+ gap: var(--bf-disclosure-gap);
6744
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6745
+ padding-block: var(--bf-single-line-row-padding-block);
6746
+ padding-inline: 0 calc(var(--bf-baseline) * 0.5);
6468
6747
  text-align: left;
6469
6748
  width: 100%;
6470
6749
  }
@@ -6478,8 +6757,8 @@ html.u-baseline-grid::after {
6478
6757
  }
6479
6758
 
6480
6759
  :where(.bf-theme) :where(.bf-list-tree-toggle):focus-visible {
6481
- outline: 2px solid var(--bf-color-focus);
6482
- outline-offset: -2px;
6760
+ outline: 0.125rem solid var(--bf-color-focus);
6761
+ outline-offset: -0.125rem;
6483
6762
  }
6484
6763
 
6485
6764
  :where(.bf-theme) :where(.bf-list-tree-toggle)::before {
@@ -6491,20 +6770,63 @@ html.u-baseline-grid::after {
6491
6770
  content: "";
6492
6771
  flex: 0 0 1rem;
6493
6772
  inline-size: 1rem;
6494
- transform: rotate(-90deg);
6773
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
6495
6774
  }
6496
6775
 
6497
6776
  :where(.bf-theme) :where(.bf-list-tree-toggle[aria-expanded='true'])::before {
6498
- transform: rotate(0deg);
6777
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(0deg);
6499
6778
  }
6500
6779
 
6501
6780
 
6502
6781
  :where(.bf-theme) :where(.bf-side-navigation, .bf-side-navigation.is-icons, .bf-side-navigation.is-accordion, .bf-side-navigation.is-raw-html) {
6782
+ /* Plain navigation commands use the action rail. Icon-led rows move only their mark canvas,
6783
+ so their copy reaches the shared continuation rail without a fourth
6784
+ component inset. Navigation depth is added separately below. */
6785
+ /* Navigation copy uses one continuation rail whether a row has a leading
6786
+ disclosure/icon slot or not. The mark canvas is derived backwards from
6787
+ that rail, so iconless rows never introduce a fourth text start. */
6788
+ --bf-side-navigation-content-inset: var(--bf-component-inline-inset-continuation);
6789
+ --bf-side-navigation-disclosure-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
6790
+ --bf-side-navigation-depth-step: var(--bf-space-2);
6791
+ --bf-side-navigation-group-gap: 1.5rem;
6792
+ --bf-side-navigation-heading-list-gap: 0.5rem;
6503
6793
  color: var(--bf-color-text-inactive);
6504
6794
  display: block;
6505
6795
  inline-size: 100%;
6506
6796
  }
6507
6797
 
6798
+ :where(.bf-theme) :where(.bf-side-navigation-groups) {
6799
+ align-content: start;
6800
+ display: grid;
6801
+ gap: var(--bf-side-navigation-group-gap);
6802
+ }
6803
+
6804
+ :where(.bf-theme) :where(.bf-side-navigation-group) {
6805
+ display: grid;
6806
+ gap: var(--bf-side-navigation-heading-list-gap);
6807
+ min-inline-size: 0;
6808
+ }
6809
+
6810
+ /* Keep the divider and heading as one tight header. The group owns only the
6811
+ larger transition from that header to its list, so the compensated rule
6812
+ cannot change the heading/list phase. */
6813
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) {
6814
+ display: grid;
6815
+ gap: 0rem;
6816
+ min-inline-size: 0;
6817
+ }
6818
+
6819
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) > hr {
6820
+ inline-size: auto;
6821
+ margin-inline: var(--bf-side-navigation-content-inset) 0;
6822
+ }
6823
+
6824
+ /* A single-line group heading occupies four baselines. min-block-size keeps
6825
+ that phase exact while still allowing a long heading to wrap and grow. */
6826
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) > :where(.bf-side-navigation-heading) {
6827
+ min-block-size: calc((var(--bf-baseline) * 4) - var(--bf-body-margin-bottom));
6828
+ }
6829
+
6508
6830
  :where(.bf-theme) :where(.bf-side-navigation-drawer) {
6509
6831
  background: var(--bf-color-background-default);
6510
6832
  bottom: 0;
@@ -6521,7 +6843,7 @@ html.u-baseline-grid::after {
6521
6843
  }
6522
6844
 
6523
6845
  :where(.bf-theme) :where(.bf-side-navigation, .bf-side-navigation.is-icons, .bf-side-navigation.is-accordion, .bf-side-navigation.is-raw-html):where(.is-drawer-expanded) :where(.bf-side-navigation-drawer) {
6524
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
6846
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
6525
6847
  transform: translateX(0);
6526
6848
  }
6527
6849
 
@@ -6551,7 +6873,7 @@ html.u-baseline-grid::after {
6551
6873
  border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
6552
6874
  margin-bottom: calc(var(--bf-baseline) * 2);
6553
6875
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
6554
- padding-inline: var(--bf-panel-padding-inline);
6876
+ padding-inline: var(--bf-component-inline-inset-continuation);
6555
6877
  padding-top: var(--bf-panel-padding-block);
6556
6878
  position: sticky;
6557
6879
  top: 0;
@@ -6574,9 +6896,9 @@ html.u-baseline-grid::after {
6574
6896
  display: inline-flex;
6575
6897
  gap: calc(var(--bf-baseline) * 0.5);
6576
6898
  justify-content: center;
6577
- margin: 0 0 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)));
6578
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
6579
- padding-inline: var(--bf-control-inline-padding-action);
6899
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6900
+ padding-block: var(--bf-single-line-row-padding-block);
6901
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
6580
6902
  text-decoration: none;
6581
6903
  }
6582
6904
 
@@ -6611,8 +6933,8 @@ html.u-baseline-grid::after {
6611
6933
  }
6612
6934
 
6613
6935
  :where(.bf-theme) :where(.bf-side-navigation-toggle:focus-visible) {
6614
- outline: 2px solid var(--bf-color-focus);
6615
- outline-offset: -2px;
6936
+ outline: 0.125rem solid var(--bf-color-focus);
6937
+ outline-offset: -0.125rem;
6616
6938
  }
6617
6939
 
6618
6940
  :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked) {
@@ -6624,22 +6946,23 @@ html.u-baseline-grid::after {
6624
6946
  display: block;
6625
6947
  margin: 0 0 var(--bf-body-margin-bottom);
6626
6948
  padding-block: var(--bf-body-nudge-start) 0;
6949
+ padding-inline: var(--bf-side-navigation-content-inset);
6627
6950
  }
6628
6951
 
6629
- :where(.bf-theme) :where(.bf-side-navigation-list) {
6630
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
6631
- list-style: none;
6632
- margin: 0 0 calc(var(--bf-baseline) * 2);
6633
- padding: 0 0 calc((var(--bf-baseline) * 2) - var(--bf-border-width));
6952
+ :where(.bf-theme) :where(.bf-side-navigation-heading.is-linked) {
6953
+ padding-inline: 0;
6634
6954
  }
6635
6955
 
6636
- :where(.bf-theme) :where(.bf-side-navigation-list:last-of-type) {
6637
- border-bottom: 0;
6638
- margin-bottom: 0;
6639
- padding-bottom: 0;
6956
+ :where(.bf-theme) :where(.bf-side-navigation-list) {
6957
+ display: grid;
6958
+ grid-auto-rows: var(--bf-single-line-row-block-size);
6959
+ list-style: none;
6960
+ margin: 0;
6961
+ padding: 0;
6640
6962
  }
6641
6963
 
6642
6964
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) {
6965
+ display: grid;
6643
6966
  margin: 0;
6644
6967
  position: relative;
6645
6968
  }
@@ -6651,23 +6974,26 @@ html.u-baseline-grid::after {
6651
6974
  font-weight: var(--bf-body-font-weight, 400);
6652
6975
  line-height: var(--bf-body-line-height, 1.5rem);
6653
6976
  align-items: center;
6977
+ align-self: start;
6654
6978
  background: transparent;
6655
6979
  border: 0;
6980
+ border-block: var(--bf-border-width) solid transparent;
6656
6981
  color: var(--bf-color-text-inactive);
6657
6982
  display: flex;
6658
6983
  gap: calc(var(--bf-baseline) * 0.5);
6659
6984
  inline-size: 100%;
6660
6985
  justify-content: flex-start;
6661
- margin: 0;
6662
- min-block-size: var(--bf-control-box-size-compact);
6663
- padding-block: max(0rem, calc(var(--bf-control-block-padding-compact) - 0rem));
6664
- padding-inline: var(--bf-panel-padding-inline);
6986
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6987
+ padding-block: var(--bf-single-line-row-padding-block);
6988
+ padding-inline: var(--bf-side-navigation-content-inset);
6989
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-content-inset);
6665
6990
  position: relative;
6666
6991
  text-align: left;
6667
6992
  text-decoration: none;
6668
6993
  }
6669
6994
 
6670
6995
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button) {
6996
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-disclosure-inset);
6671
6997
  gap: var(--bf-disclosure-gap);
6672
6998
  }
6673
6999
 
@@ -6676,22 +7002,21 @@ html.u-baseline-grid::after {
6676
7002
  font-weight: 600;
6677
7003
  }
6678
7004
 
6679
- :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked),
6680
7005
  :where(.bf-theme) :where(.bf-side-navigation-list) > :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
6681
- padding-inline-start: var(--bf-panel-padding-inline);
7006
+ padding-inline-start: var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset));
6682
7007
  }
6683
7008
 
6684
7009
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6685
7010
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6686
7011
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
6687
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 2));
7012
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + var(--bf-side-navigation-depth-step));
6688
7013
  }
6689
7014
 
6690
7015
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6691
7016
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6692
7017
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6693
7018
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
6694
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 4));
7019
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 2));
6695
7020
  }
6696
7021
 
6697
7022
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
@@ -6699,7 +7024,7 @@ html.u-baseline-grid::after {
6699
7024
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6700
7025
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6701
7026
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
6702
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 6));
7027
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 3));
6703
7028
  }
6704
7029
 
6705
7030
  :where(.bf-theme) :where(.bf-side-navigation-link:hover, .bf-side-navigation-accordion-button:hover) {
@@ -6708,13 +7033,17 @@ html.u-baseline-grid::after {
6708
7033
  text-decoration: none;
6709
7034
  }
6710
7035
 
7036
+ :where(.bf-theme) :where(a.bf-side-navigation-link:is(:hover, :active)) {
7037
+ text-decoration: none;
7038
+ }
7039
+
6711
7040
  :where(.bf-theme) :where(.bf-side-navigation-link:focus:not(:focus-visible), .bf-side-navigation-accordion-button:focus:not(:focus-visible)) {
6712
7041
  outline: none;
6713
7042
  }
6714
7043
 
6715
7044
  :where(.bf-theme) :where(.bf-side-navigation-link:focus-visible, .bf-side-navigation-accordion-button:focus-visible) {
6716
- outline: 2px solid var(--bf-color-focus);
6717
- outline-offset: -2px;
7045
+ outline: 0.125rem solid var(--bf-color-focus);
7046
+ outline-offset: -0.125rem;
6718
7047
  }
6719
7048
 
6720
7049
  :where(.bf-theme) :where(.bf-side-navigation-link.is-active, .bf-side-navigation-link[aria-current='page'], .bf-side-navigation-link[aria-current='true']) {
@@ -6885,13 +7214,17 @@ html.u-baseline-grid::after {
6885
7214
  text-decoration: none;
6886
7215
  }
6887
7216
 
7217
+ :where(.bf-theme) :where(a.bf-top-navigation-link:is(:hover, :active)) {
7218
+ text-decoration: none;
7219
+ }
7220
+
6888
7221
  :where(.bf-theme) :where(.bf-top-navigation-link:focus:not(:focus-visible), .bf-top-navigation-menu-toggle:focus:not(:focus-visible), .bf-top-navigation-search-toggle:focus:not(:focus-visible)) {
6889
7222
  outline: none;
6890
7223
  }
6891
7224
 
6892
7225
  :where(.bf-theme) :where(.bf-top-navigation-link:focus-visible, .bf-top-navigation-menu-toggle:focus-visible, .bf-top-navigation-search-toggle:focus-visible) {
6893
- outline: 2px solid var(--bf-color-focus);
6894
- outline-offset: -2px;
7226
+ outline: 0.125rem solid var(--bf-color-focus);
7227
+ outline-offset: -0.125rem;
6895
7228
  }
6896
7229
 
6897
7230
  :where(.bf-theme) :where(.bf-top-navigation-item.is-selected) > :where(.bf-top-navigation-link),
@@ -7015,8 +7348,8 @@ html.u-baseline-grid::after {
7015
7348
  }
7016
7349
 
7017
7350
  :where(.bf-theme) :where(.bf-top-navigation-dropdown-item:focus-visible) {
7018
- outline: 2px solid var(--bf-color-focus);
7019
- outline-offset: -2px;
7351
+ outline: 0.125rem solid var(--bf-color-focus);
7352
+ outline-offset: -0.125rem;
7020
7353
  }
7021
7354
 
7022
7355
  :where(.bf-theme) :where(.bf-top-navigation-search-label) {
@@ -7187,11 +7520,12 @@ html.u-baseline-grid::after {
7187
7520
  content: "";
7188
7521
  flex: 0 0 var(--bf-disclosure-icon-inline-size);
7189
7522
  inline-size: var(--bf-disclosure-icon-inline-size);
7523
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block));
7190
7524
  transition: transform 120ms ease;
7191
7525
  }
7192
7526
 
7193
7527
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button[aria-expanded='false'], .bf-side-navigation-expand[aria-expanded='false'])::before {
7194
- transform: rotate(-90deg);
7528
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
7195
7529
  }
7196
7530
 
7197
7531
  :where(.bf-theme) :where(.bf-side-navigation-expand) {
@@ -7256,14 +7590,34 @@ html.u-baseline-grid::after {
7256
7590
  }
7257
7591
 
7258
7592
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
7593
+ --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - 1rem - var(--bf-side-navigation-icon-gap)));
7259
7594
  align-items: baseline;
7260
7595
  column-gap: var(--bf-side-navigation-icon-gap);
7261
7596
  }
7262
7597
 
7598
+ /* Icon navigation keeps one stable label edge. Rows may omit a decorative
7599
+ icon without collapsing the shared icon track and pulling their copy left. */
7600
+ :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 {
7601
+ content: "";
7602
+ flex: 0 0 1rem;
7603
+ inline-size: 1rem;
7604
+ }
7605
+
7606
+ /* A collapsed icon rail cannot communicate an iconless destination. Remove
7607
+ the alignment spacer with the hidden label so it cannot become a blank
7608
+ visual affordance in that state. */
7609
+ :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text):not(:has(> .bf-side-navigation-icon))::before {
7610
+ content: none;
7611
+ }
7612
+
7263
7613
  /* Icon-navigation headings share the label edge, not the icon edge. This
7264
7614
  keeps section names aligned with both the menu copy and a tagged wordmark. */
7265
- :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked) {
7266
- padding-inline-start: calc(var(--bf-panel-padding-inline) + 1rem + var(--bf-side-navigation-icon-gap));
7615
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading:not(.is-linked)) {
7616
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
7617
+ }
7618
+
7619
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading.is-linked) > :where(.bf-side-navigation-link) {
7620
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
7267
7621
  }
7268
7622
 
7269
7623
  :where(.bf-theme) :where(.bf-side-navigation-icon) > svg {
@@ -7307,7 +7661,7 @@ html.u-baseline-grid::after {
7307
7661
  :where(.bf-theme) :where(.bf-contextual-menu-dropdown) {
7308
7662
  background: var(--bf-color-background-default);
7309
7663
  border: var(--bf-border-width) solid var(--bf-color-border-default);
7310
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
7664
+ box-shadow: 0 0.75rem 2rem rgba(0, 0, 0, 0.28);
7311
7665
  display: none;
7312
7666
  list-style: none;
7313
7667
  margin: 0;
@@ -7341,7 +7695,7 @@ html.u-baseline-grid::after {
7341
7695
  }
7342
7696
 
7343
7697
  :where(.bf-theme) :where(.bf-contextual-menu-group) + :where(.bf-contextual-menu-group) {
7344
- box-shadow: inset 0 1px 0 var(--bf-color-border-default);
7698
+ box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-default);
7345
7699
  }
7346
7700
 
7347
7701
  :where(.bf-theme) :where(.bf-contextual-menu-link) {
@@ -7358,8 +7712,9 @@ html.u-baseline-grid::after {
7358
7712
  display: block;
7359
7713
  margin: 0;
7360
7714
  overflow: hidden;
7361
- padding-block: var(--bf-control-block-padding-compact);
7362
- padding-inline: var(--bf-panel-padding-inline);
7715
+ padding-block-end: var(--bf-single-line-row-in-box-padding-block-end);
7716
+ padding-block-start: var(--bf-single-line-row-in-box-padding-block-start);
7717
+ padding-inline: var(--bf-component-inline-inset-action);
7363
7718
  text-align: left;
7364
7719
  text-decoration: none;
7365
7720
  text-overflow: ellipsis;
@@ -7385,8 +7740,8 @@ html.u-baseline-grid::after {
7385
7740
  }
7386
7741
 
7387
7742
  :where(.bf-theme) :where(.bf-contextual-menu-link):focus-visible {
7388
- outline: 2px solid var(--bf-color-focus);
7389
- outline-offset: -2px;
7743
+ outline: 0.125rem solid var(--bf-color-focus);
7744
+ outline-offset: -0.125rem;
7390
7745
  }
7391
7746
 
7392
7747
  :where(.bf-theme) :where(.bf-contextual-menu-link.is-disabled, .bf-contextual-menu-link[disabled]) {
@@ -7414,7 +7769,7 @@ html.u-baseline-grid::after {
7414
7769
  font-weight: var(--bf-body-font-weight, 400);
7415
7770
  line-height: var(--bf-body-line-height, 1.5rem);
7416
7771
  background-color: var(--bf-color-background-alt);
7417
- box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-color-border-default), 0 12px 32px rgba(0, 0, 0, 0.24);
7772
+ 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);
7418
7773
  color: var(--bf-color-text-default);
7419
7774
  inline-size: max-content;
7420
7775
  left: 0;
@@ -7423,7 +7778,7 @@ html.u-baseline-grid::after {
7423
7778
  opacity: 0;
7424
7779
  padding-block-end: var(--bf-body-nudge-end);
7425
7780
  padding-block-start: var(--bf-body-nudge-start, 0.41rem);
7426
- padding-inline: var(--bf-panel-padding-inline);
7781
+ padding-inline: var(--bf-component-inline-inset-continuation);
7427
7782
  pointer-events: none;
7428
7783
  position: absolute;
7429
7784
  top: 100%;
@@ -7567,10 +7922,10 @@ html.u-baseline-grid::after {
7567
7922
  display: inline-flex;
7568
7923
  gap: calc(var(--bf-baseline) * 0.5);
7569
7924
  justify-content: center;
7570
- margin-bottom: 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)));
7925
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
7571
7926
  min-inline-size: var(--bf-control-box-size);
7572
7927
  padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
7573
- padding-inline: var(--bf-control-inline-padding-action);
7928
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
7574
7929
  text-align: center;
7575
7930
  text-decoration: none;
7576
7931
  }
@@ -7584,8 +7939,8 @@ html.u-baseline-grid::after {
7584
7939
  }
7585
7940
 
7586
7941
  :where(.bf-theme) :where(.bf-pagination-link:focus-visible, .bf-pagination-link.is-previous:focus-visible, .bf-pagination-link.is-next:focus-visible) {
7587
- outline: 2px solid var(--bf-color-focus);
7588
- outline-offset: 2px;
7942
+ outline: 0.125rem solid var(--bf-color-focus);
7943
+ outline-offset: 0.125rem;
7589
7944
  }
7590
7945
 
7591
7946
  :where(.bf-theme) :where(.bf-pagination-link.is-active, .bf-pagination-link[aria-current='page'], .bf-pagination-link[aria-current='true']) {
@@ -7664,14 +8019,15 @@ html.u-baseline-grid::after {
7664
8019
  appearance: none;
7665
8020
  background: transparent;
7666
8021
  border: 0;
8022
+ border-block: var(--bf-border-width) solid transparent;
7667
8023
  color: var(--bf-color-text-default);
7668
8024
  cursor: pointer;
7669
8025
  display: flex;
7670
8026
  gap: var(--bf-disclosure-gap);
7671
8027
  inline-size: 100%;
7672
8028
  justify-content: flex-start;
7673
- min-block-size: var(--bf-control-box-size);
7674
- padding-block: var(--bf-control-block-padding);
8029
+ margin-block-end: var(--bf-single-line-row-margin-block-end);
8030
+ padding-block: var(--bf-single-line-row-padding-block);
7675
8031
  padding-inline: 0;
7676
8032
  text-align: left;
7677
8033
  }
@@ -7681,8 +8037,8 @@ html.u-baseline-grid::after {
7681
8037
  }
7682
8038
 
7683
8039
  :where(.bf-theme) :where(.bf-accordion-tab):focus-visible {
7684
- outline: 2px solid var(--bf-color-focus);
7685
- outline-offset: 2px;
8040
+ outline: 0.125rem solid var(--bf-color-focus);
8041
+ outline-offset: 0.125rem;
7686
8042
  }
7687
8043
 
7688
8044
  :where(.bf-theme) :where(.bf-accordion-tab)::before {
@@ -7695,18 +8051,19 @@ html.u-baseline-grid::after {
7695
8051
  display: inline-block;
7696
8052
  flex: none;
7697
8053
  inline-size: var(--bf-disclosure-icon-inline-size);
8054
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block));
7698
8055
  transition: transform 120ms ease;
7699
8056
  }
7700
8057
 
7701
8058
  :where(.bf-theme) :where(.bf-accordion-tab[aria-expanded='false'])::before {
7702
- transform: rotate(-90deg);
8059
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
7703
8060
  }
7704
8061
 
7705
8062
  :where(.bf-theme) :where(.bf-accordion-panel) {
7706
8063
  margin: 0;
7707
8064
  overflow: hidden;
7708
8065
  padding-block-start: var(--bf-baseline);
7709
- padding-inline-start: calc(var(--bf-accordion-indent) + var(--bf-body-font-size, 1rem) + var(--bf-baseline));
8066
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
7710
8067
  }
7711
8068
 
7712
8069
  :where(.bf-theme) :where(.bf-accordion-panel[aria-hidden='true']) {
@@ -7772,7 +8129,7 @@ html.u-baseline-grid::after {
7772
8129
  :where(.bf-theme) :where(.bf-modal-header, .bf-modal-body, .bf-modal-footer) {
7773
8130
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
7774
8131
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
7775
- padding-inline: var(--bf-panel-padding-inline);
8132
+ padding-inline: var(--bf-component-inline-inset-continuation);
7776
8133
  }
7777
8134
 
7778
8135
  :where(.bf-theme) :where(.bf-modal-header) {
@@ -7846,7 +8203,7 @@ html.u-baseline-grid::after {
7846
8203
  :where(.bf-theme) :where(.bf-code-snippet-header) {
7847
8204
  align-items: start;
7848
8205
  background: var(--bf-color-background-active);
7849
- box-shadow: inset 0 -1px 0 var(--bf-color-border-default);
8206
+ box-shadow: inset 0 -0.0625rem 0 var(--bf-color-border-default);
7850
8207
  display: flex;
7851
8208
  flex-wrap: wrap;
7852
8209
  justify-content: space-between;
@@ -7868,7 +8225,7 @@ html.u-baseline-grid::after {
7868
8225
  margin: 0;
7869
8226
  overflow-wrap: anywhere;
7870
8227
  padding-block: var(--bf-panel-padding-block);
7871
- padding-inline: var(--bf-panel-padding-inline);
8228
+ padding-inline: var(--bf-component-inline-inset-continuation);
7872
8229
  }
7873
8230
 
7874
8231
  :where(.bf-theme) :where(.bf-code-snippet-dropdowns) {
@@ -7883,7 +8240,7 @@ html.u-baseline-grid::after {
7883
8240
  :where(.bf-theme) :where(.bf-code-snippet-header.is-stacked) :where(.bf-code-snippet-dropdowns) {
7884
8241
  justify-content: stretch;
7885
8242
  margin-inline-start: 0;
7886
- box-shadow: inset 0 1px 0 var(--bf-color-border-default);
8243
+ box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-default);
7887
8244
  width: 100%;
7888
8245
  }
7889
8246
 
@@ -7902,12 +8259,12 @@ html.u-baseline-grid::after {
7902
8259
  min-block-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-panel-padding-block) * 2));
7903
8260
  min-inline-size: 0;
7904
8261
  padding-block: var(--bf-panel-padding-block);
7905
- padding-inline: var(--bf-panel-padding-inline);
8262
+ padding-inline: var(--bf-component-inline-inset-action);
7906
8263
  text-align: start;
7907
8264
  }
7908
8265
 
7909
8266
  :where(.bf-theme) :where(.bf-code-snippet-dropdown) + :where(.bf-code-snippet-dropdown) {
7910
- box-shadow: inset 1px 0 0 var(--bf-color-border-default);
8267
+ box-shadow: inset 0.0625rem 0 0 var(--bf-color-border-default);
7911
8268
  }
7912
8269
 
7913
8270
  :where(.bf-theme) :where(.bf-code-snippet-dropdown):focus:not(:focus-visible) {
@@ -7915,8 +8272,8 @@ html.u-baseline-grid::after {
7915
8272
  }
7916
8273
 
7917
8274
  :where(.bf-theme) :where(.bf-code-snippet-dropdown):focus-visible {
7918
- outline: 2px solid var(--bf-color-focus);
7919
- outline-offset: -2px;
8275
+ outline: 0.125rem solid var(--bf-color-focus);
8276
+ outline-offset: -0.125rem;
7920
8277
  }
7921
8278
 
7922
8279
  :where(.bf-theme) :where(.bf-code-snippet-block, .bf-code-snippet-block.is-icon, .bf-code-snippet-block.is-numbered) {
@@ -7931,7 +8288,7 @@ html.u-baseline-grid::after {
7931
8288
  min-inline-size: 0;
7932
8289
  overflow-x: auto;
7933
8290
  padding-block: var(--bf-panel-padding-block);
7934
- padding-inline: var(--bf-panel-padding-inline);
8291
+ padding-inline: var(--bf-component-inline-inset-continuation);
7935
8292
  tab-size: 2;
7936
8293
  white-space: pre;
7937
8294
  }
@@ -7947,7 +8304,7 @@ html.u-baseline-grid::after {
7947
8304
 
7948
8305
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon) {
7949
8306
  cursor: copy;
7950
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 3));
8307
+ padding-inline-start: calc(var(--bf-component-inline-inset-continuation) + (var(--bf-baseline) * 3));
7951
8308
  position: relative;
7952
8309
  }
7953
8310
 
@@ -7959,7 +8316,7 @@ html.u-baseline-grid::after {
7959
8316
  line-height: var(--bf-h6-line-height, 1.5rem);
7960
8317
  color: var(--bf-color-text-muted);
7961
8318
  content: "$";
7962
- inset-inline-start: var(--bf-panel-padding-inline);
8319
+ inset-inline-start: var(--bf-component-inline-inset-continuation);
7963
8320
  inset-block-start: var(--bf-panel-padding-block);
7964
8321
  position: absolute;
7965
8322
  }
@@ -7974,7 +8331,7 @@ html.u-baseline-grid::after {
7974
8331
 
7975
8332
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon.is-copied) {
7976
8333
  background: color-mix(in srgb, var(--bf-color-background-alt) 78%, var(--bf-color-background-information-default));
7977
- box-shadow: inset 0 0 0 1px var(--bf-color-border-information);
8334
+ box-shadow: inset 0 0 0 0.0625rem var(--bf-color-border-information);
7978
8335
  }
7979
8336
 
7980
8337
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon):focus:not(:focus-visible) {
@@ -7982,8 +8339,8 @@ html.u-baseline-grid::after {
7982
8339
  }
7983
8340
 
7984
8341
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon):focus-visible {
7985
- outline: 2px solid var(--bf-color-focus);
7986
- outline-offset: -2px;
8342
+ outline: 0.125rem solid var(--bf-color-focus);
8343
+ outline-offset: -0.125rem;
7987
8344
  }
7988
8345
 
7989
8346
  :where(.bf-theme) :where(.bf-code-snippet-block.is-numbered) {
@@ -8045,6 +8402,32 @@ html.u-baseline-grid::after {
8045
8402
  z-index: 40;
8046
8403
  }
8047
8404
 
8405
+ /* A responsive application brand occupies the persistent bar only while the
8406
+ * full navigation brand is unavailable. The same public tagged-logo contract
8407
+ * is used in both locations; state CSS guarantees that only one copy is
8408
+ * visible and exposed at a time. */
8409
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) {
8410
+ align-items: start;
8411
+ column-gap: calc(var(--bf-baseline) * 2);
8412
+ padding-inline-end: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
8413
+ }
8414
+
8415
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) {
8416
+ margin-block-end: calc(var(--bf-border-width) * -1);
8417
+ }
8418
+
8419
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
8420
+ flex: 1 1 12rem;
8421
+ inline-size: auto;
8422
+ min-inline-size: 0;
8423
+ }
8424
+
8425
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation:not(.is-collapsed)))
8426
+ > :where(.bf-navigation-bar.is-responsive)
8427
+ :where(.bf-top-navigation-logo) {
8428
+ visibility: hidden;
8429
+ }
8430
+
8048
8431
  :where(.bf-theme) :where(.bf-navigation) {
8049
8432
  grid-column: 1 / -1;
8050
8433
  grid-row: 1 / -1;
@@ -8091,7 +8474,7 @@ html.u-baseline-grid::after {
8091
8474
  }
8092
8475
 
8093
8476
  :where(.bf-theme) :where(.bf-navigation:not(.is-collapsed)) > :where(.bf-navigation-drawer) {
8094
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
8477
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
8095
8478
  transform: translateX(0);
8096
8479
  visibility: visible;
8097
8480
  }
@@ -8101,10 +8484,10 @@ html.u-baseline-grid::after {
8101
8484
  }
8102
8485
 
8103
8486
  :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-label) {
8104
- block-size: 1px;
8487
+ block-size: 0.0625rem;
8105
8488
  clip-path: inset(50%);
8106
- inline-size: 1px;
8107
- max-inline-size: 1px;
8489
+ inline-size: 0.0625rem;
8490
+ max-inline-size: 0.0625rem;
8108
8491
  opacity: 0;
8109
8492
  overflow: hidden;
8110
8493
  pointer-events: none;
@@ -8122,8 +8505,8 @@ html.u-baseline-grid::after {
8122
8505
  padding-inline: calc(var(--bf-baseline) * 1.25);
8123
8506
  }
8124
8507
 
8125
- :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-list) {
8126
- border-bottom-color: transparent;
8508
+ :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-list)::after {
8509
+ content: none;
8127
8510
  }
8128
8511
 
8129
8512
  :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) {
@@ -8136,6 +8519,14 @@ html.u-baseline-grid::after {
8136
8519
  grid-template-rows: minmax(0, 1fr);
8137
8520
  }
8138
8521
 
8522
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation)):has(> .bf-aside.is-pinned:not(.is-collapsed)) {
8523
+ grid-template-areas:
8524
+ "navigation-bar navigation-bar"
8525
+ "main aside";
8526
+ grid-template-columns: minmax(0, 1fr) minmax(0, var(--bf-application-aside-width));
8527
+ grid-template-rows: min-content minmax(0, 1fr);
8528
+ }
8529
+
8139
8530
  :where(.bf-theme) :where(.bf-main) {
8140
8531
  grid-area: main;
8141
8532
  min-block-size: 0;
@@ -8174,7 +8565,7 @@ html.u-baseline-grid::after {
8174
8565
  :where(.bf-theme) :where(.bf-aside.is-overlay, .bf-aside.is-drawer) {
8175
8566
  align-self: stretch;
8176
8567
  block-size: auto;
8177
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
8568
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
8178
8569
  bottom: 0;
8179
8570
  grid-column: 1 / -1;
8180
8571
  grid-row: 1 / -1;
@@ -8264,14 +8655,14 @@ html.u-baseline-grid::after {
8264
8655
 
8265
8656
  :where(.bf-theme) :where(.bf-application-aside-resize-handle)::after {
8266
8657
  background: var(--bf-color-border-default);
8267
- border-radius: 999px;
8658
+ border-radius: 62.4375rem;
8268
8659
  content: "";
8269
8660
  inset-block: var(--bf-panel-padding-block);
8270
- inset-inline-start: calc(50% - 1px);
8661
+ inset-inline-start: calc(50% - 0.0625rem);
8271
8662
  opacity: 0.95;
8272
8663
  position: absolute;
8273
8664
  transition: background-color 120ms ease, opacity 120ms ease;
8274
- width: 2px;
8665
+ width: 0.125rem;
8275
8666
  }
8276
8667
 
8277
8668
  :where(.bf-theme) :where(.bf-application-aside-resize-handle):hover::after,
@@ -8281,8 +8672,8 @@ html.u-baseline-grid::after {
8281
8672
  }
8282
8673
 
8283
8674
  :where(.bf-theme) :where(.bf-application-aside-resize-handle):focus-visible {
8284
- outline: 2px solid var(--bf-application-resize-handle-focus-ring);
8285
- outline-offset: -2px;
8675
+ outline: 0.125rem solid var(--bf-application-resize-handle-focus-ring);
8676
+ outline-offset: -0.125rem;
8286
8677
  }
8287
8678
 
8288
8679
  @media (min-width: 64.75rem) {
@@ -8301,6 +8692,16 @@ html.u-baseline-grid::after {
8301
8692
  grid-template-columns: minmax(0, var(--bf-application-navigation-width)) minmax(0, 1fr) minmax(0, var(--bf-application-aside-width));
8302
8693
  }
8303
8694
 
8695
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation:not(.is-collapsed))) > :where(.bf-navigation-bar.is-responsive) {
8696
+ block-size: 0;
8697
+ border: 0;
8698
+ min-block-size: 0;
8699
+ overflow: hidden;
8700
+ pointer-events: none;
8701
+ position: absolute;
8702
+ visibility: hidden;
8703
+ }
8704
+
8304
8705
  :where(.bf-theme) :where(.bf-application:has(> .bf-navigation.is-collapsed)) {
8305
8706
  --bf-application-navigation-width: var(--bf-application-navigation-width-collapsed);
8306
8707
  }
@@ -8346,8 +8747,8 @@ html.u-baseline-grid::after {
8346
8747
  }
8347
8748
 
8348
8749
  /* The tagged treatment is opt-in. The Circle of Friends is aligned to the
8349
- * first title line, then the 38px tag extends upward to the navigation edge.
8350
- * Its 22px inline size preserves the established 38:22 (~1.73) tag ratio; the
8750
+ * first title line, then the 2.375rem tag extends upward to the navigation edge.
8751
+ * Its 1.375rem inline size preserves the established 38:22 (~1.73) tag ratio; the
8351
8752
  * tag must not stretch to the full occupied navigation row. */
8352
8753
  :where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) {
8353
8754
  min-inline-size: 0;
@@ -8401,13 +8802,11 @@ html.u-baseline-grid::after {
8401
8802
  line-height: var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5));
8402
8803
  overflow: visible;
8403
8804
  overflow-wrap: anywhere;
8404
- /* The first title line and the 16px mark share the mark's fixed centre:
8405
- * tag block-end minus the 6px inset minus half the mark. Symmetric title
8406
- * padding keeps the occupied row stable across all four type-density tiers. */
8805
+ /* The first title line and the 1rem mark share the public brand-line centre.
8806
+ * The derived brand block is twice that fixed centre, so the orange tag can
8807
+ * extend upward without changing the title or adjacent-header baseline. */
8407
8808
  padding-block: calc(
8408
- var(--bf-top-navigation-logo-tag-block-size)
8409
- - var(--bf-top-navigation-logo-icon-bottom-offset)
8410
- - (var(--bf-top-navigation-logo-icon-size) / 2)
8809
+ var(--bf-navigation-brand-line-center-block)
8411
8810
  - (var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5rem)) / 2)
8412
8811
  );
8413
8812
  text-overflow: clip;
@@ -8488,11 +8887,15 @@ html.u-baseline-grid::after {
8488
8887
  :where(.bf-theme) :where(.bf-in-page-navigation) {
8489
8888
  container-name: bf-in-page-navigation;
8490
8889
  container-type: inline-size;
8491
- margin-block: 0 var(--bf-section-space-shallow);
8890
+ margin: 0;
8492
8891
  min-inline-size: 0;
8493
8892
  }
8494
8893
 
8495
8894
  :where(.bf-theme) :where(.bf-in-page-navigation-nav) {
8895
+ --bf-stack-space: var(--bf-space-1);
8896
+ align-content: start;
8897
+ display: grid;
8898
+ gap: var(--bf-stack-space);
8496
8899
  max-block-size: 100dvb;
8497
8900
  min-inline-size: 0;
8498
8901
  overflow: auto;
@@ -8508,12 +8911,17 @@ html.u-baseline-grid::after {
8508
8911
  line-height: var(--bf-h6-line-height, 1.5rem);
8509
8912
  color: var(--bf-color-text-muted);
8510
8913
  display: block;
8511
- margin: 0 0 var(--bf-space-1);
8512
- padding-block: var(--bf-h6-nudge-start) var(--bf-h6-nudge-end);
8914
+ margin-block: 0 var(--bf-h6-margin-bottom);
8915
+ padding-block-end: 0;
8916
+ padding-block-start: var(--bf-h6-nudge-start);
8513
8917
  }
8514
8918
 
8515
8919
  :where(.bf-theme) :where(.bf-in-page-navigation-list) {
8920
+ --bf-stack-space: var(--bf-space-1);
8921
+ align-content: start;
8516
8922
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-color-border-low-contrast);
8923
+ display: grid;
8924
+ gap: var(--bf-stack-space);
8517
8925
  list-style: none;
8518
8926
  margin: 0;
8519
8927
  min-inline-size: 0;
@@ -8521,13 +8929,16 @@ html.u-baseline-grid::after {
8521
8929
  }
8522
8930
 
8523
8931
  :where(.bf-theme) :where(.bf-in-page-navigation-item) {
8932
+ align-content: start;
8933
+ display: grid;
8934
+ gap: var(--bf-stack-space);
8524
8935
  margin: 0;
8525
8936
  min-inline-size: 0;
8526
8937
  padding: 0;
8527
8938
  position: relative;
8528
8939
  }
8529
8940
 
8530
- :where(.bf-theme) :where(.bf-in-page-navigation-link) {
8941
+ :where(.bf-theme) :where(a.bf-in-page-navigation-link) {
8531
8942
  font-family: var(--bf-body-font-family, "Ubuntu Sans", "Segoe UI", system-ui, sans-serif);
8532
8943
  font-size: var(--bf-body-font-size, 1rem);
8533
8944
  font-style: var(--bf-body-font-style, normal);
@@ -8540,7 +8951,7 @@ html.u-baseline-grid::after {
8540
8951
  min-inline-size: 0;
8541
8952
  overflow: hidden;
8542
8953
  overflow-wrap: anywhere;
8543
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
8954
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8544
8955
  padding-inline: var(--bf-space-2) 0;
8545
8956
  position: relative;
8546
8957
  text-decoration: none;
@@ -8548,7 +8959,7 @@ html.u-baseline-grid::after {
8548
8959
  -webkit-box-orient: vertical;
8549
8960
  }
8550
8961
 
8551
- :where(.bf-theme) :where(.bf-in-page-navigation-link:hover) {
8962
+ :where(.bf-theme) :where(a.bf-in-page-navigation-link:hover) {
8552
8963
  color: var(--bf-color-text-default);
8553
8964
  text-decoration: none;
8554
8965
  }
@@ -8558,8 +8969,8 @@ html.u-baseline-grid::after {
8558
8969
  }
8559
8970
 
8560
8971
  :where(.bf-theme) :where(.bf-in-page-navigation-link:focus-visible) {
8561
- outline: 2px solid var(--bf-color-focus);
8562
- outline-offset: 2px;
8972
+ outline: 0.125rem solid var(--bf-color-focus);
8973
+ outline-offset: 0.125rem;
8563
8974
  }
8564
8975
 
8565
8976
  :where(.bf-theme) :where(.bf-in-page-navigation-link.is-active, .bf-in-page-navigation-link[aria-current]) {
@@ -8615,8 +9026,8 @@ html.u-baseline-grid::after {
8615
9026
  }
8616
9027
 
8617
9028
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle:focus-visible) {
8618
- outline: 2px solid var(--bf-color-focus);
8619
- outline-offset: -2px;
9029
+ outline: 0.125rem solid var(--bf-color-focus);
9030
+ outline-offset: -0.125rem;
8620
9031
  }
8621
9032
 
8622
9033
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle > .bf-icon) {
@@ -8630,6 +9041,7 @@ html.u-baseline-grid::after {
8630
9041
  border-block-end: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
8631
9042
  display: grid;
8632
9043
  grid-template-columns: minmax(0, 1fr) auto;
9044
+ row-gap: 0;
8633
9045
  max-block-size: none;
8634
9046
  overflow: visible;
8635
9047
  position: static;
@@ -8642,6 +9054,7 @@ html.u-baseline-grid::after {
8642
9054
  :where(.bf-theme) :where(.bf-in-page-navigation-list) {
8643
9055
  border: 0;
8644
9056
  display: flex;
9057
+ gap: 0;
8645
9058
  grid-column: 1;
8646
9059
  grid-row: 1;
8647
9060
  margin: 0;
@@ -8706,7 +9119,8 @@ html.u-baseline-grid::after {
8706
9119
  :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) {
8707
9120
  background: var(--bf-color-background-alt);
8708
9121
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-color-border-low-contrast);
8709
- display: block;
9122
+ display: grid;
9123
+ gap: var(--bf-stack-space);
8710
9124
  grid-column: 1 / -1;
8711
9125
  grid-row: 2;
8712
9126
  /* The mobile nav owns a bottom rule; reserve its thickness within the
@@ -8717,20 +9131,21 @@ html.u-baseline-grid::after {
8717
9131
  }
8718
9132
 
8719
9133
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-item, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-item) {
8720
- display: block;
9134
+ display: grid;
8721
9135
  max-inline-size: none;
8722
9136
  }
8723
9137
 
8724
9138
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-link, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link) {
8725
9139
  display: -webkit-box;
8726
9140
  overflow-wrap: anywhere;
8727
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
9141
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8728
9142
  padding-inline: var(--bf-space-2) 0;
8729
9143
  white-space: normal;
8730
9144
  }
8731
9145
 
8732
9146
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-list .bf-in-page-navigation-list, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-list .bf-in-page-navigation-list) {
8733
- display: block;
9147
+ display: grid;
9148
+ gap: var(--bf-stack-space);
8734
9149
  }
8735
9150
 
8736
9151
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-link.is-active, .bf-in-page-navigation.is-expanded .bf-in-page-navigation-link[aria-current], .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link.is-active, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link[aria-current])::before {
@@ -8813,35 +9228,47 @@ html.u-baseline-grid::after {
8813
9228
  /* ------------------------------------------------------------------ */
8814
9229
 
8815
9230
  :where(.bf-theme) :where(.bf-table-of-contents) {
9231
+ --bf-table-of-contents-section-gap: var(--bf-section-space-shallow);
9232
+ align-content: start;
8816
9233
  container-name: bf-table-of-contents;
8817
9234
  container-type: inline-size;
8818
- margin-block: 0 var(--bf-section-space-shallow);
9235
+ display: grid;
9236
+ gap: var(--bf-table-of-contents-section-gap);
9237
+ margin: 0;
8819
9238
  min-inline-size: 0;
8820
9239
  }
8821
9240
 
8822
9241
  :where(.bf-theme) :where(.bf-table-of-contents-section) {
9242
+ --bf-stack-space: 0rem;
9243
+ align-content: start;
9244
+ display: grid;
9245
+ gap: var(--bf-stack-space);
8823
9246
  margin: 0;
8824
9247
  min-inline-size: 0;
8825
- padding-block-end: var(--bf-space-2);
9248
+ padding: 0;
9249
+ position: relative;
8826
9250
  }
8827
9251
 
8828
- :where(.bf-theme) :where(.bf-table-of-contents-section + .bf-table-of-contents-section) {
8829
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
8830
- padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
9252
+ :where(.bf-theme) :where(.bf-table-of-contents-section + .bf-table-of-contents-section)::before {
9253
+ background: var(--bf-color-border-low-contrast);
9254
+ block-size: var(--bf-border-width);
9255
+ content: "";
9256
+ inset-block-start: 0;
9257
+ inset-inline: 0;
9258
+ position: absolute;
8831
9259
  }
8832
9260
 
8833
9261
  :where(.bf-theme) :where(.bf-table-of-contents-heading) {
8834
- font-family: var(--bf-h6-font-family, "Ubuntu Sans", "Segoe UI", system-ui, sans-serif);
8835
- font-size: var(--bf-h6-font-size, 1rem);
8836
- font-style: var(--bf-h6-font-style, normal);
8837
- font-weight: var(--bf-h6-font-weight, 550);
8838
- line-height: var(--bf-h6-line-height, 1.5rem);
8839
- color: var(--bf-color-text-muted);
8840
- margin: 0 0 var(--bf-space-1);
8841
- padding-block: var(--bf-h6-nudge-start) var(--bf-h6-nudge-end);
9262
+ color: var(--bf-color-text-default);
9263
+ margin: 0;
9264
+ padding-block-end: 0;
8842
9265
  }
8843
9266
 
8844
9267
  :where(.bf-theme) :where(.bf-table-of-contents-list) {
9268
+ --bf-stack-space: 0rem;
9269
+ align-content: start;
9270
+ display: grid;
9271
+ gap: var(--bf-stack-space);
8845
9272
  list-style: none;
8846
9273
  margin: 0;
8847
9274
  min-inline-size: 0;
@@ -8849,26 +9276,30 @@ html.u-baseline-grid::after {
8849
9276
  }
8850
9277
 
8851
9278
  :where(.bf-theme) :where(.bf-table-of-contents-item) {
9279
+ align-content: start;
9280
+ display: grid;
9281
+ gap: var(--bf-stack-space);
8852
9282
  margin: 0;
8853
9283
  min-inline-size: 0;
8854
9284
  padding: 0;
8855
9285
  }
8856
9286
 
8857
- :where(.bf-theme) :where(.bf-table-of-contents-link) {
9287
+ :where(.bf-theme) :where(a.bf-table-of-contents-link) {
8858
9288
  font-family: var(--bf-body-font-family, "Ubuntu Sans", "Segoe UI", system-ui, sans-serif);
8859
9289
  font-size: var(--bf-body-font-size, 1rem);
8860
9290
  font-style: var(--bf-body-font-style, normal);
8861
9291
  font-weight: var(--bf-body-font-weight, 400);
8862
9292
  line-height: var(--bf-body-line-height, 1.5rem);
9293
+ border-block: var(--bf-border-width) solid transparent;
8863
9294
  color: var(--bf-color-link-default);
8864
9295
  display: block;
8865
- margin: 0;
9296
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
8866
9297
  overflow-wrap: anywhere;
8867
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
9298
+ padding-block: var(--bf-single-line-row-padding-block);
8868
9299
  text-decoration: none;
8869
9300
  }
8870
9301
 
8871
- :where(.bf-theme) :where(.bf-table-of-contents-link:hover) {
9302
+ :where(.bf-theme) :where(a.bf-table-of-contents-link:hover) {
8872
9303
  color: var(--bf-color-text-default);
8873
9304
  text-decoration: underline;
8874
9305
  }
@@ -8878,8 +9309,8 @@ html.u-baseline-grid::after {
8878
9309
  }
8879
9310
 
8880
9311
  :where(.bf-theme) :where(.bf-table-of-contents-link:focus-visible) {
8881
- outline: 2px solid var(--bf-color-focus);
8882
- outline-offset: 2px;
9312
+ outline: 0.125rem solid var(--bf-color-focus);
9313
+ outline-offset: 0.125rem;
8883
9314
  }
8884
9315
 
8885
9316
  :where(.bf-theme) :where(.bf-table-of-contents-link.is-active, .bf-table-of-contents-link[aria-current]) {
@@ -8959,9 +9390,9 @@ html.u-baseline-grid::after {
8959
9390
  padding: 0;
8960
9391
  }
8961
9392
 
8962
- :where(.bf-theme) :where(.bf-tiered-list-header) > :where(.bf-rule),
8963
- :where(.bf-theme) :where(.bf-tiered-list-item) > :where(.bf-rule),
8964
- :where(.bf-theme) :where(.bf-tiered-list-cta) > :where(.bf-rule) {
9393
+ :where(.bf-theme) :where(.bf-tiered-list-header) > hr,
9394
+ :where(.bf-theme) :where(.bf-tiered-list-item) > hr,
9395
+ :where(.bf-theme) :where(.bf-tiered-list-cta) > hr {
8965
9396
  grid-column: 1 / -1;
8966
9397
  }
8967
9398
 
@@ -8976,8 +9407,8 @@ html.u-baseline-grid::after {
8976
9407
  grid-template-columns: repeat(8, minmax(0, 1fr));
8977
9408
  }
8978
9409
 
8979
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item) > :where(.bf-rule),
8980
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta) > :where(.bf-rule) {
9410
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item) > hr,
9411
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta) > hr {
8981
9412
  grid-column: 3 / span 6;
8982
9413
  }
8983
9414
 
@@ -8992,9 +9423,9 @@ html.u-baseline-grid::after {
8992
9423
  }
8993
9424
 
8994
9425
  /* ------------------------------------------------------------------ */
8995
- /* Header split (≥ 64.75rem): unchanged 50/50 title/description. */
9426
+ /* Header split (≥ 45rem): the shared readable 50/50 title/content split. */
8996
9427
  /* ------------------------------------------------------------------ */
8997
- @container (width >= 64.75rem) {
9428
+ @container (width >= 45rem) {
8998
9429
  :where(.bf-theme) :where(.bf-tiered-list:not(.is-description-full-width)) :where(.bf-tiered-list-header) {
8999
9430
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
9000
9431
  }
@@ -9018,7 +9449,7 @@ html.u-baseline-grid::after {
9018
9449
  queries cannot style their own container, so responsive descendants span
9019
9450
  these tracks instead of relying on an ineligible self-query. */
9020
9451
  grid-template-columns: repeat(8, minmax(0, 1fr));
9021
- margin-block-end: var(--bf-section-space-shallow);
9452
+ margin: 0;
9022
9453
  position: relative;
9023
9454
  }
9024
9455
 
@@ -9035,7 +9466,7 @@ html.u-baseline-grid::after {
9035
9466
  /* Responsive aspect media can make a shared subgrid track land between
9036
9467
  baselines. Snap that media box itself; the surrounding composition still
9037
9468
  does not own or erase any child's semantic margins. */
9038
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
9469
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
9039
9470
  :where(.bf-theme) :where(.bf-equal-height-row-item) > :where(.bf-aspect) {
9040
9471
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
9041
9472
  }
@@ -9114,7 +9545,7 @@ html.u-baseline-grid::after {
9114
9545
  :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
9115
9546
  :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after {
9116
9547
  background-color: var(--bf-color-border-low-contrast);
9117
- block-size: 1px;
9548
+ block-size: 0.0625rem;
9118
9549
  content: "";
9119
9550
  display: none;
9120
9551
  grid-column: 1 / -1;
@@ -9187,8 +9618,8 @@ html.u-baseline-grid::after {
9187
9618
  /* ------------------------------------------------------------------ */
9188
9619
  /* Gutter and margin escalation — viewport-based, all tiers */
9189
9620
  /* Grid spec v0.3 §2.3: gutters set by global viewport breakpoint. */
9190
- /* Baseline Foundry models the spec's 460px x-small row as part of the */
9191
- /* default <620px bracket because the values do not change at 460px. */
9621
+ /* Baseline Foundry models the spec's 28.75rem x-small row as part of the */
9622
+ /* default <38.75rem bracket because the values do not change at 28.75rem. */
9192
9623
  /* ------------------------------------------------------------------ */
9193
9624
 
9194
9625
  :where(.bf-theme) {
@@ -9271,6 +9702,13 @@ html.u-baseline-grid::after {
9271
9702
  padding-inline: 0;
9272
9703
  }
9273
9704
 
9705
+ /* A page is the outer grid row and therefore owns its horizontal gutter.
9706
+ * Fixed-width regions nested anywhere inside it retain their cap and
9707
+ * centering behavior without introducing a second page inset. */
9708
+ :where(.bf-theme) :where(.bf-page) :where(.bf-fixed-width) {
9709
+ padding-inline: 0;
9710
+ }
9711
+
9274
9712
  /* ------------------------------------------------------------------ */
9275
9713
  /* Grid base — 4 columns, all tiers */
9276
9714
  /* ------------------------------------------------------------------ */
@@ -9292,7 +9730,7 @@ html.u-baseline-grid::after {
9292
9730
 
9293
9731
  :where(.bf-theme) :where(.bf-grid.is-guide) > * {
9294
9732
  background: color-mix(in srgb, var(--bf-color-accent) 18%, var(--bf-color-background-default));
9295
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--bf-color-accent) 50%, var(--bf-color-rule));
9733
+ box-shadow: inset 0 0 0 0.0625rem color-mix(in srgb, var(--bf-color-accent) 50%, var(--bf-color-rule));
9296
9734
  min-block-size: calc(var(--bf-baseline) * 4);
9297
9735
  }
9298
9736
 
@@ -9375,18 +9813,24 @@ html.u-baseline-grid::after {
9375
9813
 
9376
9814
  :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) {
9377
9815
  font-family: inherit;
9378
- font-size: 0.875rem;
9816
+ font-size: var(--bf-body-font-size);
9379
9817
  font-style: normal;
9380
9818
  font-weight: 400;
9381
- line-height: 1.25rem;
9819
+ line-height: var(--bf-body-line-height);
9820
+ }
9821
+
9822
+ /* Preserve the public nested fit after the preset's general typography pass.
9823
+ The modifier remains explicit and zero-specificity in every app scope. */
9824
+ :where(.bf-theme.bf-tier-app) :where(.bf-status-label.is-nested, .bf-chip.is-nested) {
9825
+ line-height: var(--bf-nested-auxiliary-line-height);
9382
9826
  }
9383
9827
 
9384
9828
  :where(.bf-theme.bf-tier-app) :where(.bf-input, .bf-button, .bf-button.is-base) {
9385
9829
  font-family: inherit;
9386
- font-size: 0.875rem;
9830
+ font-size: var(--bf-body-font-size);
9387
9831
  font-style: normal;
9388
9832
  font-weight: 400;
9389
- line-height: 1.25rem;
9833
+ line-height: var(--bf-body-line-height);
9390
9834
  }
9391
9835
 
9392
9836
  :where(.bf-theme.bf-tier-app) :where(.bf-application) {
@@ -9396,7 +9840,7 @@ html.u-baseline-grid::after {
9396
9840
  :where(.bf-theme.bf-tier-app) :where(.bf-navigation-drawer),
9397
9841
  :where(.bf-theme.bf-tier-app) :where(.bf-navigation:not(.is-collapsed)) > :where(.bf-navigation-drawer),
9398
9842
  :where(.bf-theme.bf-tier-app) :where(.bf-aside.is-overlay, .bf-aside.is-drawer) {
9399
- box-shadow: 0 10px 20px rgba(0, 0, 0, 0.12), 0 0 3px rgba(0, 0, 0, 0.12);
9843
+ box-shadow: 0 0.625rem 1.25rem rgba(0, 0, 0, 0.12), 0 0 0.1875rem rgba(0, 0, 0, 0.12);
9400
9844
  }
9401
9845
 
9402
9846
  :where(.bf-theme.bf-tier-app) :where(.bf-panel-header) {
@@ -9415,6 +9859,11 @@ html.u-baseline-grid::after {
9415
9859
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
9416
9860
  }
9417
9861
 
9862
+ :where(.bf-theme.bf-tier-app) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) {
9863
+ gap: calc(var(--bf-baseline) * 2);
9864
+ padding-block: 0;
9865
+ }
9866
+
9418
9867
  :where(.bf-theme.bf-tier-app) :where(.bf-panel-controls) {
9419
9868
  gap: calc(var(--bf-baseline) * 1.5);
9420
9869
  }