baseline-foundry 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +22 -7
  2. package/config/canonical-spacing.resolved.json +71 -0
  3. package/config/experiments/ibm-plex-engine-smoke.json +7 -6
  4. package/config/experiments/ubuntu-engine-smoke.json +7 -6
  5. package/config/foundation-theme.json +7 -6
  6. package/config/tiers/app.json +8 -9
  7. package/config/tiers/documentation.json +7 -8
  8. package/config/tiers/editorial.json +7 -8
  9. package/config/tiers/os.json +7 -8
  10. package/dist/application-layout.js +1 -1
  11. package/dist/build.d.ts +1 -0
  12. package/dist/build.js +98 -36
  13. package/dist/css-app-tier.js +4 -46
  14. package/dist/css-component-contracts.d.ts +7 -0
  15. package/dist/css-component-contracts.js +82 -0
  16. package/dist/css-components/application-geometry.d.ts +5 -0
  17. package/dist/css-components/application-geometry.js +31 -0
  18. package/dist/css-components/article-pagination.js +6 -5
  19. package/dist/css-components/button-actions.js +68 -4
  20. package/dist/css-components/cards-options.js +2 -2
  21. package/dist/css-components/chip-badge-status.d.ts +0 -1
  22. package/dist/css-components/chip-badge-status.js +37 -15
  23. package/dist/css-components/content-card.js +11 -10
  24. package/dist/css-components/control-geometry.d.ts +12 -0
  25. package/dist/css-components/control-geometry.js +22 -0
  26. package/dist/css-components/cta-figure-aspect.js +2 -2
  27. package/dist/css-components/document-navigation.js +28 -18
  28. package/dist/css-components/editorial-content.js +1 -1
  29. package/dist/css-components/icon.js +24 -2
  30. package/dist/css-components/interactive-feedback.js +27 -14
  31. package/dist/css-components/interactive-tables.js +9 -6
  32. package/dist/css-components/legacy-navigation.js +32 -25
  33. package/dist/css-components/list-tree.js +5 -5
  34. package/dist/css-components/list.js +17 -12
  35. package/dist/css-components/logo-media.js +2 -2
  36. package/dist/css-components/navigation-geometry.d.ts +5 -0
  37. package/dist/css-components/navigation-geometry.js +30 -0
  38. package/dist/css-components/nested-controls.d.ts +8 -0
  39. package/dist/css-components/nested-controls.js +37 -0
  40. package/dist/css-components/panel.js +12 -13
  41. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  42. package/dist/css-components/search-box-and-filter.js +3 -3
  43. package/dist/css-components/sites-editorial-ports.js +8 -1
  44. package/dist/css-components/sites-foundation.js +2 -2
  45. package/dist/css-components/table.js +9 -1
  46. package/dist/css-components/tabs-choice-breadcrumbs.js +9 -9
  47. package/dist/css-components/tiered-list-equal-height-row.js +2 -2
  48. package/dist/css-components.js +99 -229
  49. package/dist/css.js +44 -1
  50. package/dist/dtcg-spacing.d.ts +40 -0
  51. package/dist/dtcg-spacing.js +163 -0
  52. package/dist/experiments/ibm-plex-engine-smoke/styles.css +557 -360
  53. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +182 -14
  54. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +91 -7
  55. package/dist/index.d.ts +1 -0
  56. package/dist/presets/app-tier/styles.css +700 -494
  57. package/dist/presets/app-tier/surfaces.json +709 -29
  58. package/dist/presets/app-tier/tokens.json +178 -8
  59. package/dist/presets/prose/styles.css +699 -486
  60. package/dist/presets/prose/surfaces.json +709 -29
  61. package/dist/presets/prose/tokens.json +177 -7
  62. package/dist/styles.css +699 -486
  63. package/dist/surfaces.json +709 -29
  64. package/dist/tiers/app/styles.css +700 -494
  65. package/dist/tiers/app/surfaces.json +709 -29
  66. package/dist/tiers/app/tokens.json +178 -8
  67. package/dist/tiers/documentation/styles.css +699 -486
  68. package/dist/tiers/documentation/surfaces.json +709 -29
  69. package/dist/tiers/documentation/tokens.json +177 -7
  70. package/dist/tiers/editorial/styles.css +699 -486
  71. package/dist/tiers/editorial/surfaces.json +709 -29
  72. package/dist/tiers/editorial/tokens.json +177 -7
  73. package/dist/tiers/os/styles.css +699 -486
  74. package/dist/tiers/os/surfaces.json +709 -29
  75. package/dist/tiers/os/tokens.json +177 -7
  76. package/dist/tokens.json +177 -7
  77. package/dist/types.d.ts +13 -13
  78. package/dist/vanilla-theme-colors.js +5 -1
  79. package/docs/publishing.md +7 -1
  80. package/package.json +1 -1
@@ -54,8 +54,21 @@ html.u-baseline-grid::after {
54
54
  }
55
55
 
56
56
  :where(.bf-theme) {
57
+ /* Theme-config spacing remains in BF's namespace; it does not claim Canonical provenance. */
57
58
  --bf-baseline: 0.5rem;
59
+ --bf-field-gap: 0.5rem;
60
+ --bf-leading-mark-gap: 0.5rem;
61
+ --bf-section-space-shallow: 1.5rem;
62
+ --bf-section-space: 4rem;
63
+ --bf-section-space-deep: 8rem;
64
+ --bf-component-inline-inset-field: 0.5rem;
65
+ --bf-component-inline-inset-action: 1rem;
66
+ --bf-component-inline-inset-continuation: 2rem;
67
+ --bf-panel-padding-inline: 1rem;
68
+ --bf-panel-padding-block: 1rem;
69
+ --bf-strip-space: 4rem;
58
70
  --bf-space-0: 0rem;
71
+ --bf-inline-unit: 0.25rem;
59
72
  --bf-space-half: calc(var(--bf-baseline) / 2);
60
73
  --bf-space-1: var(--bf-baseline);
61
74
  --bf-space-2: calc(var(--bf-baseline) * 2);
@@ -68,10 +81,6 @@ html.u-baseline-grid::after {
68
81
  --bf-content-max-width: 120rem;
69
82
  --bf-content-padding-inline: 1.5rem;
70
83
  --bf-measure: 40rem;
71
- --bf-section-space: 4rem;
72
- --bf-section-space-shallow: 1.5rem;
73
- --bf-section-space-deep: 8rem;
74
- --bf-strip-space: 4rem;
75
84
  --bf-grid-gap-inline: 1.5rem;
76
85
  --bf-grid-gap-block: 1.5rem;
77
86
  --bf-page-margin: 1.5rem;
@@ -170,8 +179,21 @@ html.u-baseline-grid::after {
170
179
  }
171
180
 
172
181
  :where(.bf-theme.bf-surface-ubuntu-engine-smoke) {
182
+ /* Theme-config spacing remains in BF's namespace; it does not claim Canonical provenance. */
173
183
  --bf-baseline: 0.5rem;
184
+ --bf-field-gap: 0.5rem;
185
+ --bf-leading-mark-gap: 0.5rem;
186
+ --bf-section-space-shallow: 1.5rem;
187
+ --bf-section-space: 4rem;
188
+ --bf-section-space-deep: 8rem;
189
+ --bf-component-inline-inset-field: 0.5rem;
190
+ --bf-component-inline-inset-action: 1rem;
191
+ --bf-component-inline-inset-continuation: 2rem;
192
+ --bf-panel-padding-inline: 1rem;
193
+ --bf-panel-padding-block: 1rem;
194
+ --bf-strip-space: 4rem;
174
195
  --bf-space-0: 0rem;
196
+ --bf-inline-unit: 0.25rem;
175
197
  --bf-space-half: calc(var(--bf-baseline) / 2);
176
198
  --bf-space-1: var(--bf-baseline);
177
199
  --bf-space-2: calc(var(--bf-baseline) * 2);
@@ -184,10 +206,6 @@ html.u-baseline-grid::after {
184
206
  --bf-content-max-width: 120rem;
185
207
  --bf-content-padding-inline: 1.5rem;
186
208
  --bf-measure: 40rem;
187
- --bf-section-space: 4rem;
188
- --bf-section-space-shallow: 1.5rem;
189
- --bf-section-space-deep: 8rem;
190
- --bf-strip-space: 4rem;
191
209
  --bf-grid-gap-inline: 1.5rem;
192
210
  --bf-grid-gap-block: 1.5rem;
193
211
  --bf-page-margin: 1.5rem;
@@ -893,63 +911,85 @@ html.u-baseline-grid::after {
893
911
  --bf-border-width: 0.0625rem;
894
912
  --bf-bar-thickness: 0.1875rem;
895
913
  --bf-radius: 0rem;
896
- --bf-control-block-padding: 0.5rem;
897
- --bf-control-block-padding-compact: 0.25rem;
898
- --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
899
- --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
900
- --bf-control-inline-padding: 1rem;
901
- --bf-control-inline-padding-action: 1rem;
902
- --bf-control-inline-padding-field: 0.5rem;
914
+ --bf-component-inline-inset-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
903
915
  --bf-control-visual-size: 1rem;
904
- --bf-field-gap: 0.5rem;
905
- --bf-panel-padding-inline: 1rem;
906
- --bf-panel-padding-block: 1rem;
907
- --bf-accordion-indent: 1.5rem;
908
- /* Action surfaces keep comfortable command targets; field surfaces can tighten independently. */
909
- --bf-disclosure-gap: 1rem;
910
- --bf-disclosure-icon-inline-size: 1rem;
911
- --bf-icon-label-inline-offset: calc(var(--bf-disclosure-icon-inline-size) + var(--bf-disclosure-gap));
912
- --bf-disclosure-label-inline-offset: var(--bf-icon-label-inline-offset);
913
- /* Every component-owned inline start resolves to one of these three rails.
914
- Field and action values remain tier inputs; continuation is the shared
915
- icon/mark-to-copy line. Structural page, grid and navigation-depth offsets
916
- are deliberately outside this component inset contract. */
917
- --bf-component-inline-inset-field: var(--bf-control-inline-padding-field);
918
- --bf-component-inline-inset-action: var(--bf-control-inline-padding-action);
919
- --bf-component-inline-inset-continuation: var(--bf-disclosure-label-inline-offset);
920
- --bf-input-block-padding: var(--bf-body-nudge-start, 0.375rem);
921
- --bf-button-block-padding: var(--bf-body-nudge-start, 0.375rem);
922
- /* One border-aware occupied-block contract for body-sized, single-line UI.
923
- Components may paint their block borders differently, but their text line,
924
- padding and trailing baseline compensation must resolve through this pair. */
925
- --bf-single-line-row-padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
926
- --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)));
927
- --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));
928
- --bf-single-line-row-in-box-padding-block-start: var(--bf-body-nudge-start, 0.375rem);
929
- --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)));
930
- --bf-single-line-row-visual-offset: calc(var(--bf-body-nudge-start, 0.375rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-control-visual-size)) / 2));
931
- /* Auxiliary surfaces may opt into a host-owned nested composition. The
932
- shorter line and capped symmetric padding fit their complete paint inside
933
- the host body line without introducing a second row rhythm. */
934
- --bf-nested-auxiliary-line-height: max(1em, calc(var(--bf-body-line-height) - var(--bf-baseline)));
935
- --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)));
936
- --bf-slider-track-size: calc(var(--bf-baseline) * 0.25);
937
- --bf-slider-row-block-size: var(--bf-single-line-row-block-size);
938
- --bf-slider-track-offset: calc(var(--bf-body-nudge-start, 0.375rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-slider-track-size)) / 2));
939
- --bf-table-row-border-size: var(--bf-border-width);
940
- --bf-table-row-padding-block-start: var(--bf-single-line-row-in-box-padding-block-start);
941
- --bf-table-row-block-size: var(--bf-single-line-row-block-size);
942
- --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)));
943
- --bf-table-row-line-height: var(--bf-body-line-height, 1.5rem);
944
- --bf-switch-track-offset: var(--bf-single-line-row-visual-offset);
945
- --bf-tick-box-offset: var(--bf-single-line-row-visual-offset);
916
+ /* Three authoritative component content insets. Page margins, grid
917
+ gutters, surface placement and navigation depth remain structural. */
918
+
919
+ /* Regular single-line interface rows use one metric-derived occupied block.
920
+ Visible and transparent block borders both consume the frame slots. */
921
+ --bf-interface-row-line-height: var(--bf-body-line-height, 1.5rem);
922
+ --bf-interface-row-padding-block: max(0rem, calc(var(--bf-body-nudge-start, 0.375rem) - var(--bf-border-width)));
923
+ --bf-interface-row-painted-block-size: calc(var(--bf-interface-row-line-height) + (var(--bf-interface-row-padding-block) * 2) + (var(--bf-border-width) * 2));
924
+ --bf-interface-row-compensation-block-end: mod(calc(var(--bf-baseline) - mod(var(--bf-interface-row-painted-block-size), var(--bf-baseline))), var(--bf-baseline));
925
+ --bf-interface-row-occupied-block-size: calc(var(--bf-interface-row-painted-block-size) + var(--bf-interface-row-compensation-block-end));
926
+ --bf-interface-row-content-offset-block-start: calc(var(--bf-border-width) + var(--bf-interface-row-padding-block));
927
+ --bf-interface-row-visual-offset: calc(var(--bf-interface-row-content-offset-block-start) + ((var(--bf-interface-row-line-height) - var(--bf-control-visual-size)) / 2));
928
+
929
+ /* Host-owned rows keep the same occupied target but absorb compensation
930
+ inside the box. A ruled host subtracts its separator in its own module. */
931
+ --bf-in-box-row-padding-block-start: var(--bf-interface-row-content-offset-block-start);
932
+ --bf-in-box-row-padding-block-end: max(0rem, calc(var(--bf-interface-row-occupied-block-size) - var(--bf-interface-row-line-height) - var(--bf-in-box-row-padding-block-start)));
933
+
934
+ /* Nested children fit inside the host body line and contribute no external
935
+ compensation. Zero-footprint surfaces and real two-border controls use
936
+ the body line minus one baseline; build validation proves that this line
937
+ can contain the font, visual and framed ledgers for every tier. */
938
+ --bf-nested-row-line-height: calc(var(--bf-interface-row-line-height) - var(--bf-baseline));
939
+ --bf-nested-row-padding-block: max(0rem, calc((var(--bf-interface-row-line-height) - var(--bf-nested-row-line-height)) / 2));
940
+ --bf-nested-row-painted-block-size: calc(var(--bf-nested-row-line-height) + (var(--bf-nested-row-padding-block) * 2));
941
+ --bf-nested-framed-row-padding-block: max(0rem, calc((var(--bf-interface-row-line-height) - var(--bf-nested-row-line-height) - (var(--bf-border-width) * 2)) / 2));
942
+ --bf-nested-framed-row-painted-block-size: calc(var(--bf-nested-row-line-height) + (var(--bf-nested-framed-row-padding-block) * 2) + (var(--bf-border-width) * 2));
943
+ --bf-nested-framed-row-visual-offset: calc(var(--bf-border-width) + var(--bf-nested-framed-row-padding-block) + ((var(--bf-nested-row-line-height) - var(--bf-control-visual-size)) / 2));
944
+
945
+ /* Block-derived members consume one inline-minimum name. The default is
946
+ the regular framed paint; selectors below re-point the name to what each
947
+ member actually paints, rather than to the row ledger it occupies. */
948
+ --bf-square-block-size: var(--bf-interface-row-painted-block-size);
949
+
950
+ /* Leading marks are positioned backwards from the continuation copy inset;
951
+ a mark never creates a fourth content inset. */
946
952
  --bf-leading-mark-size: var(--bf-control-visual-size);
947
- --bf-leading-mark-gap: var(--bf-component-inline-inset-field);
948
953
  --bf-leading-mark-offset: calc(var(--bf-leading-mark-size) + var(--bf-leading-mark-gap));
949
954
  --bf-leading-mark-group-inset: calc(var(--bf-component-inline-inset-continuation) - var(--bf-leading-mark-offset));
950
955
  --bf-tick-label-offset: var(--bf-leading-mark-offset);
956
+ }
957
+
958
+ :where(.bf-theme) :where(.bf-badge) {
959
+ --bf-square-block-size: var(--bf-interface-row-line-height);
960
+ }
961
+
962
+ :where(.bf-theme) :where(.bf-badge.is-nested) {
963
+ --bf-square-block-size: var(--bf-nested-row-line-height);
964
+ }
965
+
966
+ :where(.bf-theme) :where(.bf-button.is-link.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
967
+ --bf-square-block-size: var(--bf-body-line-height);
968
+ }
969
+
970
+ :where(.bf-theme) :where(.bf-notification-close) {
971
+ --bf-square-block-size: var(--bf-notification-close-painted-block-size);
972
+ }
973
+
974
+ :where(.bf-theme.bf-surface-ubuntu-engine-smoke) {
975
+ --bf-border-width: 0.0625rem;
976
+ --bf-bar-thickness: 0.1875rem;
977
+ --bf-radius: 0rem;
978
+ --bf-component-inline-inset-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
979
+ --bf-control-visual-size: 1rem;
980
+ }
981
+
982
+ :where(.bf-theme) {
983
+ --bf-slider-track-size: calc(var(--bf-baseline) * 0.25);
984
+ --bf-slider-row-block-size: var(--bf-interface-row-occupied-block-size);
985
+ --bf-slider-track-offset: calc(var(--bf-body-nudge-start, 0.375rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-slider-track-size)) / 2));
986
+ --bf-switch-track-offset: var(--bf-interface-row-visual-offset);
987
+ --bf-tick-box-offset: var(--bf-interface-row-visual-offset);
951
988
  --bf-radio-dot-size: calc((var(--bf-control-visual-size) * 0.375) + var(--bf-border-width));
952
989
  --bf-list-marker-dot-size: calc(var(--bf-border-width) * 4);
990
+ }
991
+
992
+ :where(.bf-theme) {
953
993
  --bf-app-drawer-width-icon: 2rem;
954
994
  --bf-app-drawer-width-small: 15rem;
955
995
  --bf-app-drawer-width-small-max: 20rem;
@@ -961,22 +1001,28 @@ html.u-baseline-grid::after {
961
1001
  --bf-app-aside-width-max: var(--bf-app-drawer-width-medium-max);
962
1002
  --bf-app-navigation-width: 15rem;
963
1003
  --bf-app-navigation-width-collapsed: 3rem;
1004
+ --bf-application-drawer-width-icon: var(--bf-app-drawer-width-icon);
1005
+ --bf-application-drawer-width-small: var(--bf-app-drawer-width-small);
1006
+ --bf-application-drawer-width-small-max: var(--bf-app-drawer-width-small-max);
1007
+ --bf-application-drawer-width-medium: var(--bf-app-drawer-width-medium);
1008
+ --bf-application-drawer-width-medium-max: var(--bf-app-drawer-width-medium-max);
1009
+ --bf-application-drawer-width-large: var(--bf-app-drawer-width-large);
1010
+ --bf-application-aside-width: var(--bf-app-aside-width);
1011
+ --bf-application-aside-width-min: var(--bf-app-aside-width-min);
1012
+ --bf-application-aside-width-max: var(--bf-app-aside-width-max);
1013
+ --bf-application-navigation-width: var(--bf-app-navigation-width);
1014
+ --bf-application-navigation-width-collapsed: var(--bf-app-navigation-width-collapsed);
1015
+ }
1016
+
1017
+ :where(.bf-theme) {
1018
+ --bf-disclosure-gap: var(--bf-leading-mark-gap);
1019
+ --bf-disclosure-icon-inline-size: 1rem;
1020
+ --bf-disclosure-group-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
964
1021
  --bf-icon-label-optical-offset-block: 0.1875rem;
965
- --bf-disclosure-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
1022
+ --bf-disclosure-icon-optical-offset-block: 0rem;
966
1023
  --bf-side-navigation-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
967
- --bf-side-navigation-icon-gap: 0.625rem;
1024
+ --bf-side-navigation-icon-gap: var(--bf-leading-mark-gap);
968
1025
  --bf-navigation-bar-min-block-size: calc(var(--bf-baseline) * 6);
969
- --bf-authoring-accent: #f6b73c;
970
- --bf-authoring-accent-hover: #e0a030;
971
- --bf-authoring-accent-line: rgba(246, 183, 60, 0.9);
972
- --bf-authoring-accent-strong: rgba(246, 183, 60, 0.95);
973
- --bf-authoring-accent-outline: rgba(246, 183, 60, 0.4);
974
- --bf-authoring-accent-outline-strong: rgba(246, 183, 60, 0.8);
975
- --bf-authoring-accent-shadow: rgba(246, 183, 60, 0.22);
976
- --bf-authoring-accent-focus-ring: rgba(246, 183, 60, 0.55);
977
- --bf-application-resize-handle-active: var(--bf-authoring-accent-strong);
978
- --bf-application-resize-handle-focus-ring: var(--bf-authoring-accent-focus-ring);
979
- --bf-control-inline-padding-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
980
1026
  --bf-top-navigation-link-padding-inline: var(--bf-component-inline-inset-action);
981
1027
  --bf-top-navigation-end-slot-inline-size: calc(1rem + var(--bf-component-inline-inset-field));
982
1028
  --bf-top-navigation-search-toggle-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
@@ -990,30 +1036,9 @@ html.u-baseline-grid::after {
990
1036
  --bf-top-navigation-logo-icon-optical-offset-inline: -0.0125rem;
991
1037
  --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));
992
1038
  --bf-navigation-brand-block-size: calc(var(--bf-navigation-brand-line-center-block) * 2);
993
- --bf-icon-size-default: 1rem;
994
- --bf-icon-size-medium: 2.5rem;
995
- --bf-icon-size-large: 4rem;
996
- --bf-icon-size-x-large: 4.5rem;
997
- --bf-icon-size-xx-large: 6rem;
998
- --bf-leading-icon-size: var(--bf-leading-mark-size);
999
- --bf-leading-icon-gap: var(--bf-leading-mark-gap);
1000
- --bf-leading-icon-offset: var(--bf-single-line-row-visual-offset);
1001
- --bf-ui-chip-padding-inline: var(--bf-component-inline-inset-field);
1002
- --bf-ui-chip-radius: 999rem;
1003
- --bf-ui-badge-padding-inline: calc(var(--bf-body-line-height, 1.5rem) * 0.25);
1004
- --bf-ui-badge-overhang: calc(var(--bf-ui-badge-padding-inline) * -0.75);
1005
- --bf-grid-max-inline-size: var(--bf-content-max-width);
1006
- --bf-application-drawer-width-icon: var(--bf-app-drawer-width-icon);
1007
- --bf-application-drawer-width-small: var(--bf-app-drawer-width-small);
1008
- --bf-application-drawer-width-small-max: var(--bf-app-drawer-width-small-max);
1009
- --bf-application-drawer-width-medium: var(--bf-app-drawer-width-medium);
1010
- --bf-application-drawer-width-medium-max: var(--bf-app-drawer-width-medium-max);
1011
- --bf-application-drawer-width-large: var(--bf-app-drawer-width-large);
1012
- --bf-application-aside-width: var(--bf-app-aside-width);
1013
- --bf-application-aside-width-min: var(--bf-app-aside-width-min);
1014
- --bf-application-aside-width-max: var(--bf-app-aside-width-max);
1015
- --bf-application-navigation-width: var(--bf-app-navigation-width);
1016
- --bf-application-navigation-width-collapsed: var(--bf-app-navigation-width-collapsed);
1039
+ }
1040
+
1041
+ :where(.bf-theme) {
1017
1042
  --bf-color-text-default: var(--vf-color-text-default, var(--bf-color-text, #000000));
1018
1043
  --bf-color-text-muted: var(--vf-color-text-muted, var(--bf-color-muted, rgba(0, 0, 0, 0.6)));
1019
1044
  --bf-color-text-inactive: var(--vf-color-text-inactive, rgba(0, 0, 0, 0.75));
@@ -1060,9 +1085,10 @@ html.u-baseline-grid::after {
1060
1085
  --bf-color-accent: var(--vf-color-accent, #0f95a1);
1061
1086
  --bf-color-brand: var(--vf-color-brand, #e95420);
1062
1087
  --bf-color-focus: var(--vf-color-focus, #2e96ff);
1088
+ --bf-application-resize-handle-active: rgba(246, 183, 60, 0.95);
1089
+ --bf-application-resize-handle-focus-ring: rgba(246, 183, 60, 0.55);
1063
1090
 
1064
1091
  --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");
1065
- --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");
1066
1092
  --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");
1067
1093
  --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");
1068
1094
  --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");
@@ -1083,31 +1109,9 @@ html.u-baseline-grid::after {
1083
1109
  }
1084
1110
 
1085
1111
  :where(.bf-theme.bf-engine-cap) :where(.bf-input, input[type='text'], input[type='number'], input[type='search'], input[type='password'], input[type='email'], input[type='url'], textarea, select) {
1086
- 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)));
1087
- }
1088
-
1089
- :where(.bf-theme.bf-surface-ubuntu-engine-smoke) {
1090
- --bf-input-block-padding: 0.41rem;
1091
- --bf-button-block-padding: 0.41rem;
1092
- --bf-border-width: 0.0625rem;
1093
- --bf-bar-thickness: 0.1875rem;
1094
- --bf-radius: 0rem;
1095
- --bf-control-block-padding: 0.5rem;
1096
- --bf-control-block-padding-compact: 0.25rem;
1097
- --bf-control-box-size: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding) * 2));
1098
- --bf-control-box-size-compact: calc(var(--bf-body-line-height) + (var(--bf-control-block-padding-compact) * 2));
1099
- --bf-control-inline-padding: 1rem;
1100
- --bf-control-inline-padding-action: 1rem;
1101
- --bf-control-inline-padding-field: 0.5rem;
1102
- --bf-control-visual-size: 1rem;
1103
- --bf-field-gap: 0.5rem;
1104
- --bf-panel-padding-inline: 1rem;
1105
- --bf-panel-padding-block: 1rem;
1106
- --bf-accordion-indent: 1.5rem;
1107
-
1112
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1108
1113
  }
1109
1114
 
1110
-
1111
1115
  :where(.bf-theme.is-dark) {
1112
1116
  --bf-color-text-default: var(--vf-color-text-default, var(--bf-color-text, #ffffff));
1113
1117
  --bf-color-text-muted: var(--vf-color-text-muted, var(--bf-color-muted, rgba(255, 255, 255, 0.6)));
@@ -1155,9 +1159,10 @@ html.u-baseline-grid::after {
1155
1159
  --bf-color-accent: var(--vf-color-accent, #70bbc2);
1156
1160
  --bf-color-brand: var(--vf-color-brand, #e95420);
1157
1161
  --bf-color-focus: var(--vf-color-focus, #99ccff);
1162
+ --bf-application-resize-handle-active: rgba(246, 183, 60, 0.95);
1163
+ --bf-application-resize-handle-focus-ring: rgba(246, 183, 60, 0.55);
1158
1164
 
1159
1165
  --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");
1160
- --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");
1161
1166
  --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");
1162
1167
  --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");
1163
1168
  --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");
@@ -1173,7 +1178,7 @@ html.u-baseline-grid::after {
1173
1178
  margin: 0;
1174
1179
  }
1175
1180
 
1176
- .bf-theme button {
1181
+ :where(.bf-theme) :where(button) {
1177
1182
  font: inherit;
1178
1183
  }
1179
1184
 
@@ -1228,7 +1233,7 @@ html.u-baseline-grid::after {
1228
1233
 
1229
1234
  :where(.bf-theme) :where(.bf-field.is-range) {
1230
1235
  align-items: start;
1231
- column-gap: calc(var(--bf-baseline) * 2);
1236
+ column-gap: var(--bf-component-inline-inset-field);
1232
1237
  display: grid;
1233
1238
  grid-template-columns: max-content minmax(0, 1fr);
1234
1239
  row-gap: var(--bf-field-gap);
@@ -1272,13 +1277,13 @@ html.u-baseline-grid::after {
1272
1277
  margin: 0;
1273
1278
  min-inline-size: 0;
1274
1279
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
1275
- padding-inline: var(--bf-component-inline-inset-continuation);
1280
+ padding-inline: var(--bf-panel-padding-inline);
1276
1281
  padding-block-start: var(--bf-panel-padding-block);
1277
1282
  }
1278
1283
 
1279
1284
  :where(.bf-theme) :where(fieldset, .bf-fieldset) > :where(legend, .bf-legend) {
1280
1285
  margin-bottom: 0;
1281
- padding-inline: calc(var(--bf-baseline) * 0.5);
1286
+ padding-inline: var(--bf-inline-unit);
1282
1287
  }
1283
1288
 
1284
1289
  :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) {
@@ -1297,8 +1302,8 @@ html.u-baseline-grid::after {
1297
1302
  inline-size: 100%;
1298
1303
  max-inline-size: 100%;
1299
1304
  min-inline-size: 0;
1300
- 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)));
1301
- padding-block: max(0rem, calc(var(--bf-input-block-padding) - var(--bf-border-width)));
1305
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1306
+ padding-block: var(--bf-interface-row-padding-block);
1302
1307
  padding-inline: var(--bf-component-inline-inset-field);
1303
1308
  }
1304
1309
 
@@ -1316,8 +1321,8 @@ html.u-baseline-grid::after {
1316
1321
  content: "\00a0";
1317
1322
  grid-area: color-control;
1318
1323
  line-height: var(--bf-body-line-height);
1319
- margin-bottom: var(--bf-single-line-row-margin-block-end);
1320
- padding-block: var(--bf-single-line-row-padding-block);
1324
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1325
+ padding-block: var(--bf-interface-row-padding-block);
1321
1326
  visibility: hidden;
1322
1327
  }
1323
1328
 
@@ -1326,7 +1331,7 @@ html.u-baseline-grid::after {
1326
1331
  block-size: auto;
1327
1332
  grid-area: color-control;
1328
1333
  inline-size: 100%;
1329
- margin-bottom: var(--bf-single-line-row-margin-block-end);
1334
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1330
1335
  min-block-size: 0;
1331
1336
  padding: var(--bf-border-width);
1332
1337
  }
@@ -1357,7 +1362,7 @@ html.u-baseline-grid::after {
1357
1362
 
1358
1363
  :where(.bf-theme) :where(textarea) {
1359
1364
  block-size: auto;
1360
- min-block-size: calc(var(--bf-control-box-size) * 2);
1365
+ min-block-size: calc((var(--bf-interface-row-occupied-block-size) * 2) - var(--bf-interface-row-compensation-block-end));
1361
1366
  resize: vertical;
1362
1367
  }
1363
1368
 
@@ -1371,7 +1376,7 @@ html.u-baseline-grid::after {
1371
1376
  border: 0 solid transparent;
1372
1377
  box-shadow: inset 0 calc(var(--bf-border-width) * -1) 0 var(--bf-color-border-default);
1373
1378
  color: var(--bf-color-text-default);
1374
- 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)));
1379
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1375
1380
  max-inline-size: 100%;
1376
1381
  min-inline-size: 0;
1377
1382
  padding-block: 0;
@@ -1393,8 +1398,8 @@ html.u-baseline-grid::after {
1393
1398
  cursor: pointer;
1394
1399
  margin-inline-end: var(--bf-field-gap);
1395
1400
  min-block-size: 0;
1396
- padding-block: var(--bf-single-line-row-padding-block);
1397
- padding-inline: var(--bf-control-inline-padding-action-bordered);
1401
+ padding-block: var(--bf-interface-row-padding-block);
1402
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
1398
1403
  }
1399
1404
 
1400
1405
  :where(.bf-theme) :where(input[type='file'])::file-selector-button:hover {
@@ -1407,7 +1412,7 @@ html.u-baseline-grid::after {
1407
1412
  background-repeat: no-repeat;
1408
1413
  background-size: 1rem 1rem;
1409
1414
  overflow: hidden;
1410
- padding-inline-end: calc(var(--bf-component-inline-inset-field) * 2.5);
1415
+ padding-inline-end: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
1411
1416
  text-overflow: ellipsis;
1412
1417
  white-space: nowrap;
1413
1418
  }
@@ -1416,16 +1421,14 @@ html.u-baseline-grid::after {
1416
1421
  font-variant-numeric: tabular-nums;
1417
1422
  }
1418
1423
 
1419
- /* Number fields retain their native input semantics and keyboard stepping,
1420
- while one field-owned background paints the compact pair. Sharing select's
1421
- 1rem canvas and end position avoids a second browser-reserved spin slot. */
1424
+ /* Keep the browser-owned number stepper. A painted replacement cannot expose
1425
+ the native pointer targets, min/max handling, or platform accessibility. */
1422
1426
  :where(.bf-theme) :where(input[type='number']) {
1423
- appearance: textfield;
1424
- background-image: var(--bf-ui-icon-number-stepper);
1425
- background-position: right var(--bf-component-inline-inset-field) center;
1426
- background-repeat: no-repeat;
1427
- background-size: 1rem 1rem;
1428
- padding-inline-end: calc(var(--bf-component-inline-inset-field) * 2.5);
1427
+ appearance: auto;
1428
+ }
1429
+
1430
+ :where(.bf-theme) :where(select:dir(rtl)) {
1431
+ background-position: left var(--bf-component-inline-inset-field) center;
1429
1432
  }
1430
1433
 
1431
1434
  :where(.bf-theme) :where(.bf-slider-input) {
@@ -1437,12 +1440,6 @@ html.u-baseline-grid::after {
1437
1440
  text-align: right;
1438
1441
  }
1439
1442
 
1440
- :where(.bf-theme) :where(input[type='number'])::-webkit-inner-spin-button,
1441
- :where(.bf-theme) :where(input[type='number'])::-webkit-outer-spin-button {
1442
- appearance: none;
1443
- margin: 0;
1444
- }
1445
-
1446
1443
  :where(.bf-theme) :where(.bf-checkbox, .bf-radio) {
1447
1444
  display: grid;
1448
1445
  margin: 0;
@@ -1470,8 +1467,8 @@ html.u-baseline-grid::after {
1470
1467
  border-block: var(--bf-border-width) solid transparent;
1471
1468
  cursor: pointer;
1472
1469
  display: block;
1473
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
1474
- padding-block: var(--bf-single-line-row-padding-block);
1470
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
1471
+ padding-block: var(--bf-interface-row-padding-block);
1475
1472
  padding-inline-start: var(--bf-tick-label-offset);
1476
1473
  position: relative;
1477
1474
  }
@@ -1619,8 +1616,8 @@ html.u-baseline-grid::after {
1619
1616
  border-block: var(--bf-border-width) solid transparent;
1620
1617
  cursor: pointer;
1621
1618
  display: inline-block;
1622
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
1623
- padding-block: var(--bf-single-line-row-padding-block);
1619
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
1620
+ padding-block: var(--bf-interface-row-padding-block);
1624
1621
  }
1625
1622
 
1626
1623
  :where(.bf-theme) :where(.bf-validation-message) {
@@ -1631,9 +1628,9 @@ html.u-baseline-grid::after {
1631
1628
  line-height: var(--bf-body-line-height, 1.5rem);
1632
1629
  border-block: var(--bf-border-width) solid transparent;
1633
1630
  color: var(--bf-color-text-muted);
1634
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
1631
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
1635
1632
  margin-inline-start: var(--bf-leading-mark-group-inset);
1636
- padding-block: var(--bf-single-line-row-padding-block);
1633
+ padding-block: var(--bf-interface-row-padding-block);
1637
1634
  padding-inline-start: var(--bf-leading-mark-offset);
1638
1635
  position: relative;
1639
1636
  }
@@ -1816,6 +1813,23 @@ html.u-baseline-grid::after {
1816
1813
  outline: calc(var(--bf-baseline) * 0.25) solid var(--bf-color-focus);
1817
1814
  }
1818
1815
 
1816
+ :where(.bf-theme) {
1817
+ --bf-icon-size-default: 1rem;
1818
+ --bf-icon-size-medium: 2.5rem;
1819
+ --bf-icon-size-large: 4rem;
1820
+ --bf-icon-size-x-large: 4.5rem;
1821
+ --bf-icon-size-xx-large: 6rem;
1822
+ /* Vanilla's inline-icon metric aligns icon paint to the cap-height centre.
1823
+ Half the scalable border supplies the optical lift. */
1824
+ --bf-inline-icon-baseline-shift: calc((var(--bf-border-width) * 0.5) + ((1cap - var(--bf-icon-size-default)) / 2));
1825
+ /* The default icon can meet the compact body line at a raster edge. Trim its
1826
+ layout margin by one scalable border without moving its cap-centred paint. */
1827
+ --bf-inline-icon-line-box-trim: calc(var(--bf-border-width) * -1);
1828
+ --bf-leading-icon-size: var(--bf-leading-mark-size);
1829
+ --bf-leading-icon-gap: var(--bf-leading-mark-gap);
1830
+ --bf-leading-icon-offset: var(--bf-interface-row-visual-offset);
1831
+ }
1832
+
1819
1833
  :where(.bf-theme) :where(.bf-icon) {
1820
1834
  --bf-icon-image: none;
1821
1835
  --bf-icon-size: var(--bf-icon-size-default);
@@ -1829,29 +1843,34 @@ html.u-baseline-grid::after {
1829
1843
  flex: 0 0 auto;
1830
1844
  inline-size: var(--bf-icon-size);
1831
1845
  margin: 0;
1846
+ margin-block-start: var(--bf-inline-icon-line-box-trim);
1832
1847
  overflow: hidden;
1833
1848
  padding: 0;
1834
1849
  text-indent: 110vw;
1835
1850
  transform: var(--bf-icon-transform);
1836
1851
  transform-origin: center;
1837
- vertical-align: bottom;
1852
+ vertical-align: calc(var(--bf-inline-icon-baseline-shift) + ((var(--bf-icon-size-default) - var(--bf-icon-size)) / 2));
1838
1853
  white-space: nowrap;
1839
1854
  }
1840
1855
 
1841
1856
  :where(.bf-theme) :where(.bf-icon.is-medium) {
1842
1857
  --bf-icon-size: var(--bf-icon-size-medium);
1858
+ --bf-inline-icon-line-box-trim: 0rem;
1843
1859
  }
1844
1860
 
1845
1861
  :where(.bf-theme) :where(.bf-icon.is-large) {
1846
1862
  --bf-icon-size: var(--bf-icon-size-large);
1863
+ --bf-inline-icon-line-box-trim: 0rem;
1847
1864
  }
1848
1865
 
1849
1866
  :where(.bf-theme) :where(.bf-icon.is-x-large) {
1850
1867
  --bf-icon-size: var(--bf-icon-size-x-large);
1868
+ --bf-inline-icon-line-box-trim: 0rem;
1851
1869
  }
1852
1870
 
1853
1871
  :where(.bf-theme) :where(.bf-icon.is-xx-large) {
1854
1872
  --bf-icon-size: var(--bf-icon-size-xx-large);
1873
+ --bf-inline-icon-line-box-trim: 0rem;
1855
1874
  }
1856
1875
 
1857
1876
  :where(.bf-theme) :where(.bf-icon.is-search) {
@@ -1903,9 +1922,9 @@ html.u-baseline-grid::after {
1903
1922
  color: var(--bf-color-text-default);
1904
1923
  cursor: pointer;
1905
1924
  display: inline-block;
1906
- margin-bottom: var(--bf-single-line-row-margin-block-end);
1907
- padding-block: var(--bf-single-line-row-padding-block);
1908
- padding-inline: var(--bf-control-inline-padding-action-bordered);
1925
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
1926
+ padding-block: var(--bf-interface-row-padding-block);
1927
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
1909
1928
  text-align: center;
1910
1929
  text-decoration: none;
1911
1930
  }
@@ -2034,7 +2053,7 @@ html.u-baseline-grid::after {
2034
2053
 
2035
2054
  :where(.bf-theme) :where(.bf-button.is-icon) {
2036
2055
  align-items: center;
2037
- column-gap: var(--bf-space-1);
2056
+ column-gap: var(--bf-leading-mark-gap);
2038
2057
  display: inline-flex;
2039
2058
  justify-content: center;
2040
2059
  }
@@ -2042,21 +2061,44 @@ html.u-baseline-grid::after {
2042
2061
  /* An icon-only flex button has no text line box to preserve the occupied
2043
2062
  * control rhythm. A zero-width metric strut restores the active body line
2044
2063
  * without imposing a target block size or changing icon/label spacing. */
2045
- :where(.bf-theme) :where(.bf-button.is-icon:not(:has(.bf-button-label))) {
2064
+ :where(.bf-theme) :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
2065
+ --bf-action-target-overflow: max(0rem, calc((24px - var(--bf-square-block-size)) / 2));
2066
+
2046
2067
  column-gap: 0;
2068
+ justify-self: start;
2069
+ margin-inline: var(--bf-action-target-overflow);
2070
+ min-inline-size: var(--bf-square-block-size);
2071
+ padding-inline: 0;
2072
+ position: relative;
2047
2073
  }
2048
2074
 
2049
- :where(.bf-theme) :where(.bf-button.is-icon:not(:has(.bf-button-label)))::before {
2075
+ :where(.bf-theme) :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label)))::before {
2050
2076
  block-size: var(--bf-body-line-height);
2051
2077
  content: "";
2052
2078
  inline-size: 0;
2053
2079
  }
2054
2080
 
2081
+ /* WCAG 2.2 SC 2.5.8 defines its minimum in CSS pixels. This transparent,
2082
+ * out-of-flow box extends only the pointer target; it does not change the
2083
+ * control's paint or occupied block geometry. */
2084
+ :where(.bf-theme) :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label)))::after {
2085
+ block-size: max(100%, 24px);
2086
+ content: "";
2087
+ inline-size: max(100%, 24px);
2088
+ left: 50%;
2089
+ pointer-events: auto;
2090
+ position: absolute;
2091
+ top: 50%;
2092
+ translate: -50% -50%;
2093
+ }
2094
+
2055
2095
  :where(.bf-theme) :where(.bf-button-label) {
2056
2096
  min-inline-size: 0;
2057
2097
  }
2058
2098
 
2059
2099
  :where(.bf-theme) :where(.bf-actions) {
2100
+ --bf-action-target-row-gap-floor: var(--bf-baseline);
2101
+
2060
2102
  align-items: center;
2061
2103
  display: flex;
2062
2104
  flex-wrap: wrap;
@@ -2064,6 +2106,19 @@ html.u-baseline-grid::after {
2064
2106
  min-inline-size: 0;
2065
2107
  }
2066
2108
 
2109
+ /* Row-gap has no single-line cost and cannot move a flex item's paint. BF's
2110
+ * wrapping primitives therefore own a positive block-axis target separation
2111
+ * without inspecting their descendants through :has(). */
2112
+ :where(.bf-theme) :where(.bf-actions:not(.is-nowrap)) {
2113
+ row-gap: max(var(--bf-field-gap), var(--bf-action-target-row-gap-floor));
2114
+ }
2115
+
2116
+ :where(.bf-theme) :where(.bf-cluster:not(.is-nowrap)) {
2117
+ --bf-action-target-row-gap-floor: var(--bf-baseline);
2118
+
2119
+ row-gap: max(var(--bf-cluster-space), var(--bf-action-target-row-gap-floor));
2120
+ }
2121
+
2067
2122
  :where(.bf-theme) :where(.bf-actions.is-end) {
2068
2123
  justify-content: flex-end;
2069
2124
  }
@@ -2074,11 +2129,64 @@ html.u-baseline-grid::after {
2074
2129
  scrollbar-width: thin;
2075
2130
  }
2076
2131
 
2132
+ /* A nowrap row becomes a clipping scrollport. Only direct icon-only targets
2133
+ * reserve their own block overflow, so text-only strips keep their original
2134
+ * block size and leading keyline. Existing target-owned inline margins supply
2135
+ * the corresponding logical-edge scroll extent. */
2136
+ :where(.bf-theme) :where(.bf-actions.is-nowrap) > :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
2137
+ --bf-action-target-block-clearance: var(--bf-baseline);
2138
+
2139
+ margin-block-end: calc(var(--bf-action-target-block-clearance) + var(--bf-interface-row-compensation-block-end));
2140
+ margin-block-start: var(--bf-action-target-block-clearance);
2141
+ }
2142
+
2143
+ :where(.bf-theme) :where(.bf-actions.is-nowrap) > :where(.bf-button.is-link.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
2144
+ margin-block-end: var(--bf-action-target-block-clearance);
2145
+ }
2146
+
2147
+ /* Modern CSS rounds the exact inter-row and per-edge scrollport shortfalls up
2148
+ * to the active baseline. The one-baseline fallback is safe for built-in tiers
2149
+ * and remains on phase in older engines. */
2150
+ @supports (row-gap: round(up, 0.0625rem, 0.0625rem)) {
2151
+ :where(.bf-theme) :where(.bf-actions:not(.is-nowrap), .bf-cluster:not(.is-nowrap)) {
2152
+ --bf-action-target-row-gap-floor: round(up, max(0rem, calc(24px - var(--bf-body-line-height) + var(--bf-border-width))), var(--bf-baseline));
2153
+ }
2154
+
2155
+ :where(.bf-theme) :where(.bf-actions.is-nowrap) > :where(.bf-button.is-icon:not(.is-nested):not(:has(.bf-button-label))) {
2156
+ --bf-action-target-block-clearance: round(up, max(0rem, calc((24px - var(--bf-body-line-height)) / 2)), var(--bf-baseline));
2157
+ }
2158
+ }
2159
+
2077
2160
  :where(.bf-theme) :where(.bf-actions.is-nowrap) > * {
2078
2161
  flex: 0 0 auto;
2079
2162
  }
2080
2163
 
2081
2164
 
2165
+ :where(.bf-theme) :where(input.bf-input.is-nested:not([type]), input.bf-input.is-nested[type='text'], input.bf-input.is-nested[type='number'], input.bf-input.is-nested[type='search'], input.bf-input.is-nested[type='password'], input.bf-input.is-nested[type='email'], input.bf-input.is-nested[type='url'], input.bf-input.is-nested[type='tel'], select.bf-input.is-nested, .bf-button.is-nested:not(.is-link)) {
2166
+ line-height: var(--bf-nested-row-line-height);
2167
+ margin-block: 0;
2168
+ padding-block: var(--bf-nested-framed-row-padding-block);
2169
+ }
2170
+
2171
+ /* Replaced textual controls retain a browser-owned intrinsic block floor even
2172
+ after their line and padding adopt the nested contract. This derived size is the exact
2173
+ sum of that same line, padding and real borders; it is not a density target
2174
+ independent of the active tier. */
2175
+ :where(.bf-theme) :where(input.bf-input.is-nested:not([type]), input.bf-input.is-nested[type='text'], input.bf-input.is-nested[type='number'], input.bf-input.is-nested[type='search'], input.bf-input.is-nested[type='password'], input.bf-input.is-nested[type='email'], input.bf-input.is-nested[type='url'], input.bf-input.is-nested[type='tel'], select.bf-input.is-nested) {
2176
+ block-size: var(--bf-nested-framed-row-painted-block-size);
2177
+ }
2178
+
2179
+ :where(.bf-theme) :where(.bf-checkbox.is-nested, .bf-radio.is-nested) {
2180
+ --bf-tick-box-offset: var(--bf-nested-framed-row-visual-offset);
2181
+ }
2182
+
2183
+ :where(.bf-theme) :where(.bf-checkbox.is-nested > .bf-checkbox-label, .bf-radio.is-nested > .bf-radio-label) {
2184
+ line-height: var(--bf-nested-row-line-height);
2185
+ margin-block: 0;
2186
+ padding-block: var(--bf-nested-framed-row-padding-block);
2187
+ }
2188
+
2189
+
2082
2190
  /* ------------------------------------------------------------------ */
2083
2191
  /* CTA block (Vanilla parity). */
2084
2192
  /* Inline-row of call-to-action items (typically a heading and one or */
@@ -2091,7 +2199,7 @@ html.u-baseline-grid::after {
2091
2199
 
2092
2200
  :where(.bf-theme) :where(.bf-cta-block) {
2093
2201
  align-items: baseline;
2094
- column-gap: var(--bf-space-2);
2202
+ column-gap: var(--bf-component-inline-inset-action);
2095
2203
  display: flex;
2096
2204
  flex-wrap: wrap;
2097
2205
  margin-block-end: 0;
@@ -2128,7 +2236,7 @@ html.u-baseline-grid::after {
2128
2236
  :where(.bf-theme) :where(.bf-figure.is-light-inset) > :where(img, picture, video, canvas, svg, .bf-aspect) {
2129
2237
  background: #fff;
2130
2238
  box-sizing: border-box;
2131
- padding: var(--bf-space-2);
2239
+ padding: var(--bf-space-2) var(--bf-panel-padding-inline);
2132
2240
  }
2133
2241
 
2134
2242
  :where(.bf-theme) :where(.bf-figure-caption) {
@@ -2215,7 +2323,7 @@ html.u-baseline-grid::after {
2215
2323
  margin: 0;
2216
2324
  max-inline-size: 100%;
2217
2325
  padding-block: var(--bf-space-2);
2218
- padding-inline: var(--bf-space-2);
2326
+ padding-inline: var(--bf-panel-padding-inline);
2219
2327
  }
2220
2328
 
2221
2329
  :where(.bf-theme) :where(.bf-notice.is-information) {
@@ -2472,7 +2580,7 @@ html.u-baseline-grid::after {
2472
2580
  :where(.bf-theme) :where(.bf-credential-header) {
2473
2581
  align-items: flex-start;
2474
2582
  display: flex;
2475
- gap: var(--bf-space-2);
2583
+ gap: var(--bf-component-inline-inset-action);
2476
2584
  justify-content: space-between;
2477
2585
  min-inline-size: 0;
2478
2586
  }
@@ -2534,9 +2642,10 @@ html.u-baseline-grid::after {
2534
2642
 
2535
2643
  :where(.bf-theme) :where(.bf-notification, .bf-notification.is-information, .bf-notification.is-positive, .bf-notification.is-caution, .bf-notification.is-negative) {
2536
2644
  --bf-notification-accent: var(--bf-color-border-information);
2645
+ --bf-notification-close-painted-block-size: calc((var(--bf-space-1) * 2) + var(--bf-icon-size-default));
2646
+ --bf-notification-rail-shortfall: max(0rem, calc(var(--bf-bar-thickness) + var(--bf-leading-mark-size) + var(--bf-leading-mark-gap) - var(--bf-component-inline-inset-continuation)));
2537
2647
  background: var(--bf-color-background-default);
2538
2648
  border: var(--bf-border-width) solid var(--bf-color-border-default);
2539
- border-inline-start: var(--bf-bar-thickness) solid var(--bf-notification-accent);
2540
2649
  color: var(--bf-color-text-default);
2541
2650
  margin-block: 0;
2542
2651
  max-inline-size: 100%;
@@ -2544,10 +2653,20 @@ html.u-baseline-grid::after {
2544
2653
  overflow-wrap: anywhere;
2545
2654
  padding-block-end: max(0rem, calc(var(--bf-space-half) - var(--bf-border-width)));
2546
2655
  padding-block-start: 0;
2547
- padding-inline: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness)) var(--bf-space-1);
2656
+ padding-inline: calc(var(--bf-component-inline-inset-continuation) - var(--bf-border-width)) var(--bf-component-inline-inset-action);
2548
2657
  position: relative;
2549
2658
  }
2550
2659
 
2660
+ :where(.bf-theme) :where(.bf-notification:not(.is-borderless))::before {
2661
+ background: var(--bf-notification-accent);
2662
+ content: "";
2663
+ inline-size: var(--bf-bar-thickness);
2664
+ inset-block: calc(var(--bf-border-width) * -1);
2665
+ inset-inline-start: calc((var(--bf-border-width) + var(--bf-notification-rail-shortfall)) * -1);
2666
+ pointer-events: none;
2667
+ position: absolute;
2668
+ }
2669
+
2551
2670
  :where(.bf-theme) :where(.bf-notification.is-positive) {
2552
2671
  --bf-notification-accent: var(--bf-color-border-positive);
2553
2672
  }
@@ -2567,14 +2686,16 @@ html.u-baseline-grid::after {
2567
2686
  :where(.bf-theme) :where(.bf-notification.is-borderless) {
2568
2687
  border: 0;
2569
2688
  padding-block: 0;
2570
- padding-inline: calc(var(--bf-icon-size-default) + var(--bf-space-1)) 0;
2689
+ padding-inline: calc(var(--bf-leading-mark-size) + var(--bf-leading-mark-gap)) 0;
2571
2690
  }
2572
2691
 
2573
2692
  :where(.bf-theme) :where(.bf-notification-icon) {
2693
+ --bf-icon-size: var(--bf-leading-mark-size);
2574
2694
  background-color: var(--bf-notification-accent);
2575
2695
  background-image: none;
2576
- inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start) - var(--bf-border-width));
2577
- inset-inline-start: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness) - var(--bf-icon-size-default) - var(--bf-space-1));
2696
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-h6-nudge-start) - var(--bf-border-width));
2697
+ inset-inline-start: calc(var(--bf-component-inline-inset-continuation) - var(--bf-border-width) - var(--bf-leading-mark-size) - var(--bf-leading-mark-gap));
2698
+ margin-block-start: 0;
2578
2699
  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");
2579
2700
  mask-position: center;
2580
2701
  mask-repeat: no-repeat;
@@ -2595,12 +2716,12 @@ html.u-baseline-grid::after {
2595
2716
  }
2596
2717
 
2597
2718
  :where(.bf-theme) :where(.bf-notification.is-borderless > .bf-notification-icon) {
2598
- inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start));
2719
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-h6-nudge-start));
2599
2720
  inset-inline-start: 0;
2600
2721
  }
2601
2722
 
2602
2723
  :where(.bf-theme) :where(.bf-notification.is-inline > .bf-notification-icon) {
2603
- inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start) - var(--bf-border-width));
2724
+ inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-body-nudge-start) - var(--bf-border-width));
2604
2725
  }
2605
2726
 
2606
2727
  :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
@@ -2612,7 +2733,7 @@ html.u-baseline-grid::after {
2612
2733
  /* Neutralise the shell's top border so the first metric role starts on-grid. */
2613
2734
  margin-block: calc(var(--bf-border-width) * -1) 0;
2614
2735
  padding-block-start: 0;
2615
- padding-inline-end: calc(var(--bf-icon-size-default) + var(--bf-space-1));
2736
+ padding-inline-end: var(--bf-notification-close-painted-block-size);
2616
2737
  }
2617
2738
 
2618
2739
  :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-content) {
@@ -2656,9 +2777,9 @@ html.u-baseline-grid::after {
2656
2777
  }
2657
2778
 
2658
2779
  :where(.bf-theme) :where(.bf-notification-close) {
2659
- block-size: calc((var(--bf-space-1) * 2) + var(--bf-icon-size-default));
2780
+ block-size: var(--bf-square-block-size);
2660
2781
  border: 0;
2661
- inline-size: var(--bf-icon-size-default);
2782
+ inline-size: var(--bf-square-block-size);
2662
2783
  margin-block-end: 0;
2663
2784
  padding: 0;
2664
2785
  position: absolute;
@@ -2676,11 +2797,11 @@ html.u-baseline-grid::after {
2676
2797
  border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
2677
2798
  display: flex;
2678
2799
  flex-wrap: wrap;
2679
- gap: var(--bf-space-1) var(--bf-space-2);
2800
+ gap: var(--bf-space-1) var(--bf-component-inline-inset-action);
2680
2801
  justify-content: space-between;
2681
2802
  margin-block-end: 0;
2682
2803
  padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
2683
- padding-inline-end: var(--bf-space-2);
2804
+ padding-inline-end: var(--bf-component-inline-inset-action);
2684
2805
  }
2685
2806
 
2686
2807
  :where(.bf-theme) :where(.bf-notification.is-inline .bf-notification-meta) {
@@ -2699,7 +2820,7 @@ html.u-baseline-grid::after {
2699
2820
  align-items: flex-start;
2700
2821
  display: flex;
2701
2822
  flex-wrap: wrap;
2702
- gap: var(--bf-space-1) var(--bf-space-2);
2823
+ gap: var(--bf-space-1) var(--bf-component-inline-inset-action);
2703
2824
  margin-inline-start: auto;
2704
2825
  min-inline-size: 0;
2705
2826
  }
@@ -2726,10 +2847,12 @@ html.u-baseline-grid::after {
2726
2847
  cursor: inherit;
2727
2848
  display: inline-block;
2728
2849
  font: inherit;
2729
- margin: -0.125rem calc(var(--bf-space-half) * -1);
2850
+ margin-block: -0.125rem;
2851
+ margin-inline: calc((var(--bf-component-inline-inset-field) / 2) * -1);
2730
2852
  max-inline-size: 100%;
2731
2853
  overflow: hidden;
2732
- padding: 0.125rem var(--bf-space-half);
2854
+ padding-block: 0.125rem;
2855
+ padding-inline: calc(var(--bf-component-inline-inset-field) / 2);
2733
2856
  text-align: inherit;
2734
2857
  text-decoration: inherit;
2735
2858
  text-overflow: inherit;
@@ -2762,9 +2885,10 @@ html.u-baseline-grid::after {
2762
2885
  content: "";
2763
2886
  display: inline-block;
2764
2887
  inline-size: var(--bf-icon-size-default);
2765
- margin-inline-start: var(--bf-space-half);
2888
+ margin-block-start: var(--bf-inline-icon-line-box-trim);
2889
+ margin-inline-start: calc(var(--bf-leading-mark-gap) / 2);
2766
2890
  opacity: 0;
2767
- vertical-align: calc((1cap - var(--bf-icon-size-default)) / 2);
2891
+ vertical-align: var(--bf-inline-icon-baseline-shift);
2768
2892
  }
2769
2893
 
2770
2894
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
@@ -2817,7 +2941,7 @@ html.u-baseline-grid::after {
2817
2941
 
2818
2942
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > tbody) {
2819
2943
  display: grid;
2820
- gap: 0 var(--bf-space-3);
2944
+ gap: 0 var(--bf-component-inline-inset-continuation);
2821
2945
  grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
2822
2946
  inline-size: 100%;
2823
2947
  }
@@ -2827,7 +2951,7 @@ html.u-baseline-grid::after {
2827
2951
  display: block;
2828
2952
  margin-block-end: calc(var(--bf-space-3) - (var(--bf-border-width) * 2));
2829
2953
  min-inline-size: 0;
2830
- padding-inline: var(--bf-space-2);
2954
+ padding-inline: var(--bf-panel-padding-inline);
2831
2955
  }
2832
2956
 
2833
2957
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > tbody > tr > :where(th, td)) {
@@ -2888,7 +3012,7 @@ html.u-baseline-grid::after {
2888
3012
  align-items: center;
2889
3013
  display: flex;
2890
3014
  flex-wrap: wrap;
2891
- column-gap: var(--bf-space-4);
3015
+ column-gap: var(--bf-component-inline-inset-continuation);
2892
3016
  min-inline-size: 0;
2893
3017
  padding-block: var(--bf-space-1);
2894
3018
  }
@@ -3061,7 +3185,7 @@ html.u-baseline-grid::after {
3061
3185
 
3062
3186
  :where(.bf-theme) :where(.bf-media-object-meta) {
3063
3187
  align-items: start;
3064
- column-gap: var(--bf-space-1);
3188
+ column-gap: var(--bf-leading-mark-gap);
3065
3189
  display: grid;
3066
3190
  grid-template-columns: var(--bf-icon-size-default) minmax(0, 1fr);
3067
3191
  min-inline-size: 0;
@@ -3328,10 +3452,10 @@ html.u-baseline-grid::after {
3328
3452
  text-underline-offset: 0.12em;
3329
3453
  }
3330
3454
 
3331
- /* A balanced section switches at the shared readable 50/50 threshold. The
3455
+ /* A balanced section switches at the standard medium container threshold. The
3332
3456
  layout descendant reacts to the root container; the query never tries to
3333
3457
  restyle the container that established it. */
3334
- @container bf-basic-section (width >= 45rem) {
3458
+ @container bf-basic-section (width >= 38.75rem) {
3335
3459
  :where(.bf-theme) :where(.bf-basic-section-layout) {
3336
3460
  column-gap: var(--bf-grid-gap-inline);
3337
3461
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3481,7 +3605,7 @@ html.u-baseline-grid::after {
3481
3605
 
3482
3606
  /* Current Vanilla scopes a one-spacing-unit icon/value gap to the hero. */
3483
3607
  :where(.bf-theme) :where(.bf-hero-chip.bf-chip) {
3484
- column-gap: var(--bf-space-1);
3608
+ column-gap: var(--bf-leading-mark-gap);
3485
3609
  }
3486
3610
 
3487
3611
  :where(.bf-theme) :where(.bf-hero-media > :where(img, picture, video, canvas, svg), .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
@@ -3530,6 +3654,13 @@ html.u-baseline-grid::after {
3530
3654
  }
3531
3655
  }
3532
3656
 
3657
+ /* A hero can keep its entry rule while placing its content directly against
3658
+ that boundary. Scope this exception to the hero instead of publishing a
3659
+ global padding utility. */
3660
+ :where(.bf-theme) :where(.bf-hero.is-top-flush) {
3661
+ padding-block-start: 0;
3662
+ }
3663
+
3533
3664
  @container bf-hero (width >= 45rem) {
3534
3665
  :where(.bf-theme) :where(.bf-hero-layout) {
3535
3666
  column-gap: var(--bf-grid-gap-inline);
@@ -4067,9 +4198,8 @@ html.u-baseline-grid::after {
4067
4198
  overscroll-behavior: contain;
4068
4199
  }
4069
4200
 
4070
- /* Panel chrome and content consume the live page-grid gutter through a local
4071
- * derived property, so their internal text rails follow the same
4072
- * viewport brackets as surrounding page content. */
4201
+ /* Panel chrome and content share the continuation component inset through a
4202
+ * local property. Structural surface padding remains a separate contract. */
4073
4203
  :where(.bf-theme) :where(.bf-panel-header) {
4074
4204
  align-items: start;
4075
4205
  display: flex;
@@ -4078,7 +4208,7 @@ html.u-baseline-grid::after {
4078
4208
  justify-content: space-between;
4079
4209
  padding-block-end: var(--bf-panel-padding-block);
4080
4210
  padding-block-start: var(--bf-panel-padding-block);
4081
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4211
+ padding-inline: var(--bf-panel-content-padding-inline);
4082
4212
  }
4083
4213
 
4084
4214
  /* A navigation brand keeps the Canonical tag attached to the panel's top edge
@@ -4088,7 +4218,7 @@ html.u-baseline-grid::after {
4088
4218
  gap: 0;
4089
4219
  padding-block: 0;
4090
4220
  padding-inline-end: 0;
4091
- padding-inline-start: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4221
+ padding-inline-start: var(--bf-panel-content-padding-inline);
4092
4222
  }
4093
4223
 
4094
4224
  :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
@@ -4115,10 +4245,10 @@ html.u-baseline-grid::after {
4115
4245
  flex-wrap: wrap;
4116
4246
  gap: var(--bf-field-gap);
4117
4247
  justify-content: space-between;
4118
- min-block-size: calc(var(--bf-control-box-size-compact) + var(--bf-panel-padding-block));
4248
+ min-block-size: calc(var(--bf-interface-row-occupied-block-size) + var(--bf-panel-padding-block));
4119
4249
  padding-block-end: var(--bf-panel-padding-block);
4120
4250
  padding-block-start: 0;
4121
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4251
+ padding-inline: var(--bf-panel-content-padding-inline);
4122
4252
  }
4123
4253
 
4124
4254
  :where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
@@ -4157,16 +4287,16 @@ html.u-baseline-grid::after {
4157
4287
  align-items: center;
4158
4288
  appearance: none;
4159
4289
  background: transparent;
4160
- border: 0;
4290
+ border: 0 solid transparent;
4291
+ border-block-width: var(--bf-border-width);
4161
4292
  color: var(--bf-color-text-default);
4162
4293
  cursor: pointer;
4163
4294
  display: inline-flex;
4164
- gap: calc(var(--bf-baseline) * 0.5);
4295
+ gap: var(--bf-leading-mark-gap);
4165
4296
  justify-content: flex-start;
4166
- margin: 0;
4167
- min-block-size: var(--bf-control-box-size-compact);
4297
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
4168
4298
  min-inline-size: 0;
4169
- padding-block: var(--bf-control-block-padding-compact);
4299
+ padding-block: var(--bf-interface-row-padding-block);
4170
4300
  padding-inline: 0;
4171
4301
  text-align: left;
4172
4302
  }
@@ -4189,7 +4319,7 @@ html.u-baseline-grid::after {
4189
4319
  min-block-size: 0;
4190
4320
  padding-block-end: var(--bf-panel-padding-block);
4191
4321
  padding-block-start: var(--bf-panel-padding-block);
4192
- padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
4322
+ padding-inline: var(--bf-panel-content-padding-inline);
4193
4323
  }
4194
4324
 
4195
4325
  :where(.bf-theme) :where(.bf-panel-content.is-flush) {
@@ -4314,7 +4444,7 @@ html.u-baseline-grid::after {
4314
4444
 
4315
4445
  :where(.bf-theme) :where(.bf-option-grid) {
4316
4446
  display: grid;
4317
- gap: calc(var(--bf-baseline) * 2.5);
4447
+ gap: var(--bf-component-inline-inset-action);
4318
4448
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 10rem), 1fr));
4319
4449
  }
4320
4450
 
@@ -4327,7 +4457,7 @@ html.u-baseline-grid::after {
4327
4457
  display: grid;
4328
4458
  gap: var(--bf-field-gap);
4329
4459
  margin: 0;
4330
- min-block-size: calc((var(--bf-control-box-size) * 2) + var(--bf-baseline));
4460
+ min-block-size: calc((var(--bf-interface-row-occupied-block-size) * 2) + var(--bf-baseline));
4331
4461
  min-inline-size: 0;
4332
4462
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4333
4463
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
@@ -4524,7 +4654,7 @@ html.u-baseline-grid::after {
4524
4654
  grid-template-rows: minmax(0, 1fr);
4525
4655
  min-inline-size: 0;
4526
4656
  overflow: hidden;
4527
- padding-inline: var(--bf-space-2);
4657
+ padding-inline: var(--bf-panel-padding-inline);
4528
4658
  }
4529
4659
 
4530
4660
  :where(.bf-theme) :where(.bf-content-card-primary, .bf-content-card-description-panel) {
@@ -4629,7 +4759,7 @@ html.u-baseline-grid::after {
4629
4759
  color: var(--bf-color-text-muted);
4630
4760
  display: flex;
4631
4761
  flex-wrap: wrap;
4632
- gap: 0 var(--bf-space-half);
4762
+ gap: 0 var(--bf-leading-mark-gap);
4633
4763
  min-inline-size: 0;
4634
4764
  padding-block-end: var(--bf-space-1);
4635
4765
  }
@@ -4681,7 +4811,7 @@ html.u-baseline-grid::after {
4681
4811
  :where(.bf-theme) :where(.bf-content-card-footer-inner) {
4682
4812
  align-items: center;
4683
4813
  display: flex;
4684
- gap: var(--bf-space-1);
4814
+ gap: var(--bf-leading-mark-gap);
4685
4815
  inline-size: 100%;
4686
4816
  mask-image: linear-gradient(to right, #000 85%, transparent 100%);
4687
4817
  min-block-size: var(--bf-space-4);
@@ -4689,7 +4819,7 @@ html.u-baseline-grid::after {
4689
4819
  overflow-x: auto;
4690
4820
  padding-block-end: var(--bf-space-1);
4691
4821
  padding-block-start: calc(0.5rem - var(--bf-border-width));
4692
- padding-inline: var(--bf-space-2);
4822
+ padding-inline: var(--bf-panel-padding-inline);
4693
4823
  position: relative;
4694
4824
  scrollbar-width: none;
4695
4825
  z-index: 2;
@@ -4712,7 +4842,7 @@ html.u-baseline-grid::after {
4712
4842
  :where(.bf-theme) :where(.bf-content-card-resource) {
4713
4843
  align-items: center;
4714
4844
  display: inline-flex;
4715
- gap: var(--bf-space-half);
4845
+ gap: var(--bf-leading-mark-gap);
4716
4846
  }
4717
4847
 
4718
4848
  :where(.bf-theme) :where(.bf-content-card-resource > *) {
@@ -4721,7 +4851,7 @@ html.u-baseline-grid::after {
4721
4851
 
4722
4852
  :where(.bf-theme) :where(.bf-content-card-footer .bf-chip) {
4723
4853
  margin: 0;
4724
- margin-inline-end: var(--bf-space-3);
4854
+ margin-inline-end: var(--bf-component-inline-inset-continuation);
4725
4855
  }
4726
4856
 
4727
4857
  /* Internal geometry responds to the card's allocated width. The card root is
@@ -4740,10 +4870,10 @@ html.u-baseline-grid::after {
4740
4870
 
4741
4871
  @container bf-content-card (width >= 28.75rem) {
4742
4872
  :where(.bf-theme) :where(.bf-content-card:is(.is-cols-4, .is-cols-6)) :where(.bf-content-card-frame) {
4743
- column-gap: var(--bf-space-2);
4873
+ column-gap: var(--bf-panel-padding-inline);
4744
4874
  flex-direction: row;
4745
4875
  min-block-size: calc((var(--bf-space-12) * 2) - (var(--bf-border-width) * 2));
4746
- padding: var(--bf-space-2) var(--bf-space-2) 0;
4876
+ padding: var(--bf-space-2) var(--bf-panel-padding-inline) 0;
4747
4877
  }
4748
4878
 
4749
4879
  :where(.bf-theme) :where(.bf-content-card:is(.is-cols-4, .is-cols-6):not(.is-image)) :where(.bf-content-card-frame) {
@@ -4789,7 +4919,7 @@ html.u-baseline-grid::after {
4789
4919
  }
4790
4920
 
4791
4921
  :where(.bf-theme) :where(.bf-content-card.is-image-top:is(.is-cols-4, .is-cols-6)) :where(.bf-content-card-body, .bf-content-card-footer-inner) {
4792
- padding-inline: var(--bf-space-2);
4922
+ padding-inline: var(--bf-panel-padding-inline);
4793
4923
  }
4794
4924
  }
4795
4925
 
@@ -4814,7 +4944,8 @@ html.u-baseline-grid::after {
4814
4944
  block-size: 100%;
4815
4945
  grid-column: 2;
4816
4946
  grid-row: 1;
4817
- padding: var(--bf-space-1) var(--bf-space-1) 0;
4947
+ padding-block: var(--bf-space-1) 0;
4948
+ padding-inline: var(--bf-component-inline-inset-field);
4818
4949
  }
4819
4950
 
4820
4951
  :where(.bf-theme) :where(.bf-content-card.is-cols-8) :where(.bf-content-card-image) {
@@ -4917,11 +5048,11 @@ html.u-baseline-grid::after {
4917
5048
  color: var(--bf-color-text-muted);
4918
5049
  cursor: pointer;
4919
5050
  display: flex;
4920
- gap: calc(var(--bf-baseline) * 0.5);
5051
+ gap: var(--bf-leading-mark-gap);
4921
5052
  justify-content: center;
4922
5053
  margin-bottom: 0;
4923
- padding-block-end: calc(var(--bf-single-line-row-padding-block) + var(--bf-single-line-row-margin-block-end));
4924
- padding-block-start: var(--bf-single-line-row-padding-block);
5054
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
5055
+ padding-block-start: var(--bf-interface-row-padding-block);
4925
5056
  padding-inline: var(--bf-component-inline-inset-action);
4926
5057
  text-decoration: none;
4927
5058
  }
@@ -4964,7 +5095,7 @@ html.u-baseline-grid::after {
4964
5095
 
4965
5096
  :where(.bf-theme) :where(.bf-tabs.is-equal) :where(.bf-tabs-list) {
4966
5097
  display: grid;
4967
- gap: calc(var(--bf-baseline) * 2);
5098
+ gap: var(--bf-component-inline-inset-action);
4968
5099
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--bf-ui-tabs-equal-min)), 1fr));
4969
5100
  overflow: visible;
4970
5101
  white-space: normal;
@@ -4994,11 +5125,11 @@ html.u-baseline-grid::after {
4994
5125
  color: var(--bf-color-text-default);
4995
5126
  cursor: pointer;
4996
5127
  display: grid;
4997
- gap: calc(var(--bf-baseline) * 0.75);
5128
+ gap: var(--bf-leading-mark-gap);
4998
5129
  grid-template-columns: auto minmax(0, 1fr) auto;
4999
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
5130
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
5000
5131
  min-inline-size: 0;
5001
- padding-block: var(--bf-single-line-row-padding-block);
5132
+ padding-block: var(--bf-interface-row-padding-block);
5002
5133
  padding-inline: var(--bf-component-inline-inset-field);
5003
5134
  }
5004
5135
 
@@ -5076,7 +5207,7 @@ html.u-baseline-grid::after {
5076
5207
  :where(.bf-theme) :where(.bf-inline-options-options) {
5077
5208
  display: flex;
5078
5209
  flex-wrap: wrap;
5079
- gap: calc(var(--bf-baseline) * 3);
5210
+ gap: var(--bf-component-inline-inset-continuation);
5080
5211
  }
5081
5212
 
5082
5213
  :where(.bf-theme) :where(.bf-inline-options-option) {
@@ -5129,11 +5260,11 @@ html.u-baseline-grid::after {
5129
5260
  cursor: pointer;
5130
5261
  display: inline-flex;
5131
5262
  justify-content: center;
5132
- margin-bottom: var(--bf-single-line-row-margin-block-end);
5263
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
5133
5264
  max-inline-size: 100%;
5134
5265
  overflow: hidden;
5135
- padding-block: var(--bf-single-line-row-padding-block);
5136
- padding-inline: var(--bf-control-inline-padding-action-bordered);
5266
+ padding-block: var(--bf-interface-row-padding-block);
5267
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
5137
5268
  text-align: center;
5138
5269
  text-decoration: none;
5139
5270
  text-overflow: ellipsis;
@@ -5180,7 +5311,7 @@ html.u-baseline-grid::after {
5180
5311
  align-items: center;
5181
5312
  display: flex;
5182
5313
  flex-wrap: wrap;
5183
- gap: calc(var(--bf-baseline) * 0.5) calc(var(--bf-baseline) * 1.25);
5314
+ gap: calc(var(--bf-baseline) * 0.5) var(--bf-leading-mark-gap);
5184
5315
  list-style: none;
5185
5316
  margin: 0;
5186
5317
  min-inline-size: 0;
@@ -5203,7 +5334,7 @@ html.u-baseline-grid::after {
5203
5334
  :where(.bf-theme) :where(.bf-breadcrumbs-item) + :where(.bf-breadcrumbs-item)::before {
5204
5335
  color: var(--bf-color-text-muted);
5205
5336
  content: "/";
5206
- margin-inline-end: calc(var(--bf-baseline) * 0.75);
5337
+ margin-inline-end: var(--bf-leading-mark-gap);
5207
5338
  }
5208
5339
 
5209
5340
  :where(.bf-theme) :where(.bf-breadcrumbs-item) a {
@@ -5328,9 +5459,9 @@ html.u-baseline-grid::after {
5328
5459
  box-sizing: border-box;
5329
5460
  color: var(--bf-color-text-default);
5330
5461
  display: grid;
5331
- column-gap: var(--bf-space-2);
5462
+ column-gap: var(--bf-leading-mark-gap);
5332
5463
  grid-template-rows: auto auto;
5333
- inline-size: calc((100cqi - var(--bf-space-2)) / 2);
5464
+ inline-size: calc((100cqi - var(--bf-leading-mark-gap)) / 2);
5334
5465
  min-inline-size: 0;
5335
5466
  padding-block: calc(var(--bf-space-2) + (var(--bf-baseline) / 4) - var(--bf-border-width));
5336
5467
  position: relative;
@@ -5355,7 +5486,7 @@ html.u-baseline-grid::after {
5355
5486
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous) {
5356
5487
  grid-column: 1;
5357
5488
  grid-template-columns: var(--bf-icon-size-default) minmax(0, 1fr);
5358
- padding-inline: var(--bf-space-1) var(--bf-space-2);
5489
+ padding-inline: var(--bf-leading-mark-gap) var(--bf-component-inline-inset-action);
5359
5490
  text-align: start;
5360
5491
  }
5361
5492
 
@@ -5363,7 +5494,7 @@ html.u-baseline-grid::after {
5363
5494
  grid-column: 2;
5364
5495
  grid-template-columns: minmax(0, 1fr) var(--bf-icon-size-default);
5365
5496
  justify-self: end;
5366
- padding-inline: var(--bf-space-2) var(--bf-space-1);
5497
+ padding-inline: var(--bf-component-inline-inset-action) var(--bf-leading-mark-gap);
5367
5498
  text-align: end;
5368
5499
  }
5369
5500
 
@@ -5405,6 +5536,7 @@ html.u-baseline-grid::after {
5405
5536
 
5406
5537
  :where(.bf-theme) :where(.bf-article-pagination-direction > .bf-icon) {
5407
5538
  --bf-icon-size: var(--bf-icon-size-default);
5539
+ margin-block-start: 0;
5408
5540
  }
5409
5541
 
5410
5542
  :where(.bf-theme) .bf-article-pagination:dir(rtl) .bf-article-pagination-link.is-previous .bf-icon {
@@ -5442,7 +5574,7 @@ html.u-baseline-grid::after {
5442
5574
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child)) {
5443
5575
  grid-template-columns: var(--bf-icon-size-default);
5444
5576
  inline-size: calc(var(--bf-space-6) + var(--bf-space-1));
5445
- padding-inline: var(--bf-space-1);
5577
+ padding-inline: var(--bf-leading-mark-gap);
5446
5578
  }
5447
5579
 
5448
5580
  :where(.bf-theme) :where(.bf-article-pagination-link.is-next:not(:only-child)) {
@@ -5495,8 +5627,8 @@ html.u-baseline-grid::after {
5495
5627
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item) {
5496
5628
  border-block: var(--bf-border-width) solid transparent;
5497
5629
  box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-low-contrast);
5498
- margin-block-end: var(--bf-single-line-row-margin-block-end);
5499
- padding-block: var(--bf-single-line-row-padding-block);
5630
+ margin-block-end: var(--bf-interface-row-compensation-block-end);
5631
+ padding-block: var(--bf-interface-row-padding-block);
5500
5632
  }
5501
5633
 
5502
5634
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item:first-child) {
@@ -5536,7 +5668,7 @@ html.u-baseline-grid::after {
5536
5668
  :where(.bf-theme) :where(ol.bf-list.is-divided) > :where(.bf-list-item) {
5537
5669
  counter-increment: bf-list-counter;
5538
5670
  list-style: none;
5539
- padding-inline-start: calc(var(--bf-baseline) * 4);
5671
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
5540
5672
  position: relative;
5541
5673
  }
5542
5674
 
@@ -5556,7 +5688,7 @@ html.u-baseline-grid::after {
5556
5688
  }
5557
5689
 
5558
5690
  :where(.bf-theme) :where(.bf-list-item) > :where(.bf-list) {
5559
- margin-inline-start: calc(var(--bf-baseline) * 3);
5691
+ margin-inline-start: var(--bf-component-inline-inset-action);
5560
5692
  padding-block-start: var(--bf-body-nudge-end);
5561
5693
  }
5562
5694
 
@@ -5565,6 +5697,8 @@ html.u-baseline-grid::after {
5565
5697
  }
5566
5698
 
5567
5699
  :where(.bf-theme) :where(.bf-inline-list) {
5700
+ --bf-inline-list-space: 0.5rem;
5701
+
5568
5702
  margin: 0;
5569
5703
  padding: 0;
5570
5704
  }
@@ -5577,7 +5711,7 @@ html.u-baseline-grid::after {
5577
5711
  line-height: var(--bf-body-line-height, 1.5rem);
5578
5712
  display: inline-block;
5579
5713
  list-style: none;
5580
- margin-inline-end: calc(var(--bf-baseline) * 1.5);
5714
+ margin-inline-end: var(--bf-inline-list-space);
5581
5715
  padding-block-end: var(--bf-body-nudge-end);
5582
5716
  padding-block-start: var(--bf-body-nudge-start);
5583
5717
  }
@@ -5587,18 +5721,21 @@ html.u-baseline-grid::after {
5587
5721
  }
5588
5722
 
5589
5723
  :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item) {
5590
- margin-inline-end: calc(var(--bf-baseline) * 1);
5724
+ margin-inline-end: 0;
5591
5725
  position: relative;
5592
5726
  }
5593
5727
 
5594
- :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item)::after {
5595
- content: "\2022";
5596
- display: inline;
5597
- margin-inline-start: calc(var(--bf-baseline) * 0.25);
5728
+ :where(.bf-theme) :where(.bf-inline-list.is-middot) {
5729
+ align-items: baseline;
5730
+ column-gap: var(--bf-inline-list-space);
5731
+ display: flex;
5732
+ flex-wrap: wrap;
5598
5733
  }
5599
5734
 
5600
- :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item:last-of-type)::after {
5601
- content: "";
5735
+ :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item:not(:last-of-type))::after {
5736
+ content: "\2022";
5737
+ display: inline;
5738
+ margin-inline-start: var(--bf-inline-list-space);
5602
5739
  }
5603
5740
 
5604
5741
  :where(.bf-theme) :where(.bf-skip-link) {
@@ -5610,8 +5747,8 @@ html.u-baseline-grid::after {
5610
5747
  background: var(--bf-color-background-alt);
5611
5748
  color: var(--bf-color-link-default);
5612
5749
  display: block;
5613
- left: -62.4375rem;
5614
- max-inline-size: calc(100vw - var(--bf-baseline));
5750
+ inset-inline-start: -62.4375rem;
5751
+ max-inline-size: calc(100vw - (var(--bf-inline-unit) * 2));
5615
5752
  position: absolute;
5616
5753
  text-decoration: none;
5617
5754
  top: -62.4375rem;
@@ -5622,16 +5759,24 @@ html.u-baseline-grid::after {
5622
5759
  }
5623
5760
 
5624
5761
  :where(.bf-theme) :where(.bf-skip-link:focus, .bf-skip-link:focus-visible) {
5625
- left: calc(var(--bf-baseline) * 0.5);
5762
+ inset-inline-start: var(--bf-inline-unit);
5626
5763
  outline: 0.125rem solid var(--bf-color-focus);
5627
5764
  outline-offset: 0;
5628
5765
  padding-block: calc(var(--bf-baseline) * 1.5);
5629
- padding-inline: calc(var(--bf-baseline) * 1.5);
5766
+ padding-inline: var(--bf-component-inline-inset-action);
5630
5767
  position: fixed;
5631
5768
  top: calc(var(--bf-baseline) * 0.5);
5632
5769
  z-index: 999999;
5633
5770
  }
5634
5771
 
5772
+ :where(.bf-theme) {
5773
+ --bf-table-row-border-size: var(--bf-border-width);
5774
+ --bf-table-row-padding-block-start: var(--bf-in-box-row-padding-block-start);
5775
+ --bf-table-row-block-size: var(--bf-interface-row-occupied-block-size);
5776
+ --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)));
5777
+ --bf-table-row-line-height: var(--bf-body-line-height, 1.5rem);
5778
+ }
5779
+
5635
5780
  :where(.bf-theme) :where(.bf-table-scroll) {
5636
5781
  max-inline-size: 100%;
5637
5782
  min-inline-size: 0;
@@ -5716,6 +5861,13 @@ html.u-baseline-grid::after {
5716
5861
  }
5717
5862
 
5718
5863
 
5864
+ :where(.bf-theme) {
5865
+ --bf-ui-chip-padding-inline: var(--bf-component-inline-inset-action);
5866
+ --bf-ui-chip-radius: 999rem;
5867
+ --bf-ui-badge-padding-inline: var(--bf-border-width);
5868
+ --bf-ui-badge-overhang: calc(var(--bf-ui-badge-padding-inline) * -0.75);
5869
+ }
5870
+
5719
5871
  :where(.bf-theme) :where(.bf-chip, .bf-chip.is-positive, .bf-chip.is-caution, .bf-chip.is-negative, .bf-chip.is-information) {
5720
5872
  --bf-ui-chip-border: var(--bf-color-border-neutral);
5721
5873
  --bf-ui-chip-border-hover: var(--bf-color-border-neutral);
@@ -5736,10 +5888,14 @@ html.u-baseline-grid::after {
5736
5888
  display: inline-flex;
5737
5889
  gap: 0;
5738
5890
  inline-size: fit-content;
5891
+ justify-content: center;
5739
5892
  justify-self: start;
5740
- margin: 0 var(--bf-ui-chip-padding-inline) var(--bf-single-line-row-margin-block-end) 0;
5893
+ margin: 0 var(--bf-component-inline-inset-field) var(--bf-interface-row-compensation-block-end) 0;
5741
5894
  max-inline-size: 100%;
5742
- padding-block: var(--bf-single-line-row-padding-block);
5895
+ min-inline-size: min(100%, calc(var(--bf-interface-row-painted-block-size) + (var(--bf-border-width) * 2)));
5896
+ padding-block: var(--bf-interface-row-padding-block);
5897
+ /* Chips use the Action text keyline. The paint-derived floor only governs
5898
+ very short dense labels, keeping them stadium-shaped rather than circular. */
5743
5899
  padding-inline: max(0rem, calc(var(--bf-ui-chip-padding-inline) - var(--bf-border-width)));
5744
5900
  position: relative;
5745
5901
  text-decoration: none;
@@ -5852,17 +6008,17 @@ html.u-baseline-grid::after {
5852
6008
  align-items: center;
5853
6009
  background-color: var(--bf-color-text-default);
5854
6010
  border-radius: 1rem;
5855
- box-sizing: content-box;
5856
6011
  color: var(--bf-color-background-default);
5857
6012
  display: inline-block;
6013
+ inline-size: fit-content;
6014
+ justify-self: start;
5858
6015
  margin: 0;
5859
- max-inline-size: 4ch;
5860
- min-width: calc(var(--bf-body-line-height, 1.5rem) - (var(--bf-ui-badge-padding-inline) * 2));
5861
- overflow: hidden;
6016
+ min-inline-size: var(--bf-square-block-size);
5862
6017
  padding-block: 0;
5863
6018
  padding-inline: var(--bf-ui-badge-padding-inline);
5864
6019
  text-align: center;
5865
6020
  text-indent: 0;
6021
+ white-space: nowrap;
5866
6022
  }
5867
6023
 
5868
6024
  :where(.bf-theme) :where(.bf-badge.is-negative) {
@@ -5873,7 +6029,7 @@ html.u-baseline-grid::after {
5873
6029
  :where(.bf-theme) :where(.bf-chip, .bf-chip.is-positive, .bf-chip.is-caution, .bf-chip.is-negative, .bf-chip.is-information) :where(.bf-badge, .bf-badge.is-negative) {
5874
6030
  align-self: center;
5875
6031
  margin-inline-end: var(--bf-ui-badge-overhang);
5876
- margin-inline-start: var(--bf-ui-chip-padding-inline);
6032
+ margin-inline-start: var(--bf-component-inline-inset-field);
5877
6033
  }
5878
6034
 
5879
6035
  :where(.bf-theme) :where(.bf-status-label, .bf-status-label.is-positive, .bf-status-label.is-caution, .bf-status-label.is-information, .bf-status-label.is-negative) {
@@ -5890,11 +6046,11 @@ html.u-baseline-grid::after {
5890
6046
  font-style: var(--bf-body-font-style, normal);
5891
6047
  font-weight: var(--bf-body-font-weight, 400);
5892
6048
  line-height: var(--bf-body-line-height, 1.5rem);
5893
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6049
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
5894
6050
  /* Status paint is physically symmetric and shares the same occupied block
5895
6051
  as a button; typography still comes from the body role. */
5896
- padding-block: var(--bf-single-line-row-padding-block);
5897
- padding-inline: var(--bf-ui-chip-padding-inline);
6052
+ padding-block: var(--bf-interface-row-padding-block);
6053
+ padding-inline: var(--bf-component-inline-inset-field);
5898
6054
  text-align: center;
5899
6055
  text-decoration: none;
5900
6056
  white-space: nowrap;
@@ -5924,14 +6080,25 @@ html.u-baseline-grid::after {
5924
6080
  carrying a second standalone occupied-row contract. This modifier is
5925
6081
  explicit so component density never changes merely because of ancestry. */
5926
6082
  :where(.bf-theme) :where(.bf-chip.is-nested, .bf-status-label.is-nested) {
5927
- line-height: var(--bf-nested-auxiliary-line-height);
6083
+ line-height: var(--bf-nested-row-line-height);
5928
6084
  margin-block: 0;
5929
- padding-block: var(--bf-nested-auxiliary-padding-block);
6085
+ padding-block: var(--bf-nested-row-padding-block);
5930
6086
  }
5931
6087
 
5932
6088
  :where(.bf-theme) :where(.bf-chip.is-nested) {
5933
6089
  border: 0;
5934
6090
  box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-ui-chip-border);
6091
+ min-inline-size: min(100%, calc(var(--bf-nested-row-painted-block-size) + (var(--bf-border-width) * 2)));
6092
+ /* The nested border is inset paint rather than box geometry, so the glyph
6093
+ needs the complete Action inset instead of subtracting a real border. */
6094
+ padding-inline: var(--bf-ui-chip-padding-inline);
6095
+ }
6096
+
6097
+ /* Chip parts normally carry the standalone body line explicitly. A nested
6098
+ chip must pass its reduced line through to those parts so a nested badge
6099
+ can fit without making the host row taller. */
6100
+ :where(.bf-theme) :where(.bf-chip.is-nested) :where(.bf-chip-lead, .bf-chip-value) {
6101
+ line-height: inherit;
5935
6102
  }
5936
6103
 
5937
6104
  :where(.bf-theme) :where(.bf-chip.is-nested:hover) {
@@ -5948,7 +6115,7 @@ html.u-baseline-grid::after {
5948
6115
 
5949
6116
  :where(.bf-theme) :where(.bf-badge.is-nested) {
5950
6117
  align-self: center;
5951
- line-height: var(--bf-nested-auxiliary-line-height);
6118
+ line-height: var(--bf-nested-row-line-height);
5952
6119
  vertical-align: middle;
5953
6120
  }
5954
6121
 
@@ -5997,7 +6164,7 @@ html.u-baseline-grid::after {
5997
6164
  --bf-search-box-trailing-inline-size: calc((var(--bf-search-box-action-inline-size) * 2) + var(--bf-border-width));
5998
6165
  display: flex;
5999
6166
  inline-size: 100%;
6000
- margin: 0 0 calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-input-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
6167
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6001
6168
  max-inline-size: 100%;
6002
6169
  min-inline-size: 0;
6003
6170
  position: relative;
@@ -6079,7 +6246,7 @@ html.u-baseline-grid::after {
6079
6246
  display: flex;
6080
6247
  flex-wrap: wrap;
6081
6248
  gap: var(--bf-field-gap);
6082
- margin: 0 0 calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-input-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
6249
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6083
6250
  min-block-size: 0;
6084
6251
  overflow: visible;
6085
6252
  padding: 0;
@@ -6087,7 +6254,7 @@ html.u-baseline-grid::after {
6087
6254
  }
6088
6255
 
6089
6256
  :where(.bf-theme) :where(.bf-search-and-filter-search-container[aria-expanded='false']) {
6090
- min-block-size: var(--bf-control-box-size);
6257
+ min-block-size: var(--bf-interface-row-painted-block-size);
6091
6258
  }
6092
6259
 
6093
6260
  :where(.bf-theme) :where(.bf-search-and-filter-box) {
@@ -6171,7 +6338,7 @@ html.u-baseline-grid::after {
6171
6338
  cursor: pointer;
6172
6339
  display: inline-flex;
6173
6340
  margin: 0;
6174
- padding-block: var(--bf-button-block-padding);
6341
+ padding-block: var(--bf-body-nudge-start, 0.375rem);
6175
6342
  padding-inline: 0;
6176
6343
  position: static;
6177
6344
  }
@@ -6310,8 +6477,8 @@ html.u-baseline-grid::after {
6310
6477
  border-block: var(--bf-border-width) solid transparent;
6311
6478
  cursor: pointer;
6312
6479
  display: block;
6313
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6314
- padding-block: var(--bf-single-line-row-padding-block);
6480
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6481
+ padding-block: var(--bf-interface-row-padding-block);
6315
6482
  padding-inline: var(--bf-component-inline-inset-continuation) var(--bf-component-inline-inset-action);
6316
6483
  text-decoration: none;
6317
6484
  }
@@ -6348,9 +6515,9 @@ html.u-baseline-grid::after {
6348
6515
  cursor: pointer;
6349
6516
  display: flex;
6350
6517
  gap: var(--bf-disclosure-gap);
6351
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6352
- padding-block: var(--bf-single-line-row-padding-block);
6353
- padding-inline: 0 calc(var(--bf-baseline) * 0.5);
6518
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6519
+ padding-block: var(--bf-interface-row-padding-block);
6520
+ padding-inline: var(--bf-disclosure-group-inset) var(--bf-inline-unit);
6354
6521
  text-align: left;
6355
6522
  width: 100%;
6356
6523
  }
@@ -6386,20 +6553,21 @@ html.u-baseline-grid::after {
6386
6553
 
6387
6554
 
6388
6555
  :where(.bf-theme) :where(.bf-side-navigation, .bf-side-navigation.is-icons, .bf-side-navigation.is-accordion, .bf-side-navigation.is-raw-html) {
6389
- /* Plain navigation commands use the action rail. Icon-led rows move only their mark canvas,
6390
- so their copy reaches the shared continuation rail without a fourth
6556
+ /* Plain navigation commands use the action inset. Icon-led rows move only their mark canvas,
6557
+ so their copy reaches the shared continuation inset without a fourth
6391
6558
  component inset. Navigation depth is added separately below. */
6392
- /* Navigation copy uses one continuation rail whether a row has a leading
6559
+ /* Navigation copy uses one continuation inset whether a row has a leading
6393
6560
  disclosure/icon slot or not. The mark canvas is derived backwards from
6394
- that rail, so iconless rows never introduce a fourth text start. */
6561
+ that inset, so iconless rows never introduce a fourth text start. */
6395
6562
  --bf-side-navigation-content-inset: var(--bf-component-inline-inset-continuation);
6396
- --bf-side-navigation-disclosure-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
6397
- --bf-side-navigation-depth-step: var(--bf-space-2);
6563
+ --bf-side-navigation-disclosure-inset: var(--bf-disclosure-group-inset);
6564
+ --bf-side-navigation-depth-step: var(--bf-component-inline-inset-action);
6398
6565
  --bf-side-navigation-group-gap: 1.5rem;
6399
6566
  --bf-side-navigation-heading-list-gap: 0.5rem;
6400
6567
  color: var(--bf-color-text-inactive);
6401
6568
  display: block;
6402
6569
  inline-size: 100%;
6570
+ min-inline-size: 0;
6403
6571
  }
6404
6572
 
6405
6573
  :where(.bf-theme) :where(.bf-side-navigation-groups) {
@@ -6480,7 +6648,7 @@ html.u-baseline-grid::after {
6480
6648
  border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
6481
6649
  margin-bottom: calc(var(--bf-baseline) * 2);
6482
6650
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
6483
- padding-inline: var(--bf-component-inline-inset-continuation);
6651
+ padding-inline: var(--bf-panel-padding-inline);
6484
6652
  padding-top: var(--bf-panel-padding-block);
6485
6653
  position: sticky;
6486
6654
  top: 0;
@@ -6501,11 +6669,11 @@ html.u-baseline-grid::after {
6501
6669
  color: var(--bf-color-text-default);
6502
6670
  cursor: pointer;
6503
6671
  display: inline-flex;
6504
- gap: calc(var(--bf-baseline) * 0.5);
6672
+ gap: var(--bf-leading-mark-gap);
6505
6673
  justify-content: center;
6506
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6507
- padding-block: var(--bf-single-line-row-padding-block);
6508
- padding-inline: var(--bf-control-inline-padding-action-bordered);
6674
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6675
+ padding-block: var(--bf-interface-row-padding-block);
6676
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
6509
6677
  text-decoration: none;
6510
6678
  }
6511
6679
 
@@ -6562,15 +6730,17 @@ html.u-baseline-grid::after {
6562
6730
 
6563
6731
  :where(.bf-theme) :where(.bf-side-navigation-list) {
6564
6732
  display: grid;
6565
- grid-auto-rows: var(--bf-single-line-row-block-size);
6733
+ grid-auto-rows: minmax(var(--bf-interface-row-occupied-block-size), auto);
6566
6734
  list-style: none;
6567
6735
  margin: 0;
6736
+ min-inline-size: 0;
6568
6737
  padding: 0;
6569
6738
  }
6570
6739
 
6571
6740
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) {
6572
6741
  display: grid;
6573
6742
  margin: 0;
6743
+ min-inline-size: 0;
6574
6744
  position: relative;
6575
6745
  }
6576
6746
 
@@ -6587,11 +6757,15 @@ html.u-baseline-grid::after {
6587
6757
  border-block: var(--bf-border-width) solid transparent;
6588
6758
  color: var(--bf-color-text-inactive);
6589
6759
  display: flex;
6590
- gap: calc(var(--bf-baseline) * 0.5);
6760
+ gap: var(--bf-leading-mark-gap);
6591
6761
  inline-size: 100%;
6592
6762
  justify-content: flex-start;
6593
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
6594
- padding-block: var(--bf-single-line-row-padding-block);
6763
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
6764
+ min-inline-size: 0;
6765
+ /* A navigation row is the focus owner. Put nested interactive controls in a
6766
+ following panel/list item rather than inside the clipped row itself. */
6767
+ overflow: hidden;
6768
+ padding-block: var(--bf-interface-row-padding-block);
6595
6769
  padding-inline: var(--bf-side-navigation-content-inset);
6596
6770
  --bf-side-navigation-row-inset: var(--bf-side-navigation-content-inset);
6597
6771
  position: relative;
@@ -6711,7 +6885,7 @@ html.u-baseline-grid::after {
6711
6885
  line-height: var(--bf-body-line-height, 1.5rem);
6712
6886
  align-items: center;
6713
6887
  color: var(--bf-color-text-default);
6714
- column-gap: calc(var(--bf-baseline) * 1.5);
6888
+ column-gap: var(--bf-leading-mark-gap);
6715
6889
  display: inline-flex;
6716
6890
  inline-size: auto;
6717
6891
  justify-content: flex-start;
@@ -6803,7 +6977,7 @@ html.u-baseline-grid::after {
6803
6977
  color: var(--bf-color-text-default);
6804
6978
  cursor: pointer;
6805
6979
  display: inline-flex;
6806
- gap: calc(var(--bf-baseline) * 1);
6980
+ gap: var(--bf-leading-mark-gap);
6807
6981
  inline-size: 100%;
6808
6982
  justify-content: flex-start;
6809
6983
  margin: 0;
@@ -6900,12 +7074,12 @@ html.u-baseline-grid::after {
6900
7074
  align-items: center;
6901
7075
  color: var(--bf-color-text-default);
6902
7076
  display: flex;
6903
- gap: calc(var(--bf-baseline) * 2);
7077
+ gap: var(--bf-component-inline-inset-action);
6904
7078
  inline-size: 100%;
6905
7079
  justify-content: space-between;
6906
7080
  min-inline-size: 0;
6907
7081
  padding-block: var(--bf-top-navigation-link-padding-block);
6908
- padding-inline: calc(var(--bf-top-navigation-link-padding-inline) + (var(--bf-baseline) * 2)) var(--bf-top-navigation-link-padding-inline);
7082
+ padding-inline: calc(var(--bf-top-navigation-link-padding-inline) + var(--bf-component-inline-inset-action)) var(--bf-top-navigation-link-padding-inline);
6909
7083
  text-align: left;
6910
7084
  text-decoration: none;
6911
7085
  white-space: nowrap;
@@ -7010,7 +7184,7 @@ html.u-baseline-grid::after {
7010
7184
  :where(.bf-theme) :where(.bf-top-navigation-row) {
7011
7185
  align-items: stretch;
7012
7186
  flex-direction: row;
7013
- gap: calc(var(--bf-baseline) * 2);
7187
+ gap: var(--bf-component-inline-inset-action);
7014
7188
  }
7015
7189
 
7016
7190
  :where(.bf-theme) :where(.bf-top-navigation-banner) {
@@ -7147,8 +7321,8 @@ html.u-baseline-grid::after {
7147
7321
  cursor: pointer;
7148
7322
  inset-block-start: 0;
7149
7323
  margin: 0;
7150
- min-block-size: var(--bf-control-box-size-compact);
7151
- padding-inline: calc(var(--bf-baseline) * 0.5);
7324
+ min-block-size: var(--bf-interface-row-occupied-block-size);
7325
+ padding-inline: var(--bf-inline-unit);
7152
7326
  position: absolute;
7153
7327
  right: 0;
7154
7328
  }
@@ -7186,8 +7360,8 @@ html.u-baseline-grid::after {
7186
7360
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-icon) {
7187
7361
  align-items: center;
7188
7362
  display: inline-flex;
7189
- flex: 0 0 1rem;
7190
- inline-size: 1rem;
7363
+ flex: 0 0 var(--bf-disclosure-icon-inline-size);
7364
+ inline-size: var(--bf-disclosure-icon-inline-size);
7191
7365
  justify-content: center;
7192
7366
  transform: translateY(var(--bf-side-navigation-icon-optical-offset-block));
7193
7367
  }
@@ -7197,7 +7371,7 @@ html.u-baseline-grid::after {
7197
7371
  }
7198
7372
 
7199
7373
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
7200
- --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - 1rem - var(--bf-side-navigation-icon-gap)));
7374
+ --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-side-navigation-icon-gap)));
7201
7375
  align-items: baseline;
7202
7376
  column-gap: var(--bf-side-navigation-icon-gap);
7203
7377
  }
@@ -7206,8 +7380,8 @@ html.u-baseline-grid::after {
7206
7380
  icon without collapsing the shared icon track and pulling their copy left. */
7207
7381
  :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 {
7208
7382
  content: "";
7209
- flex: 0 0 1rem;
7210
- inline-size: 1rem;
7383
+ flex: 0 0 var(--bf-disclosure-icon-inline-size);
7384
+ inline-size: var(--bf-disclosure-icon-inline-size);
7211
7385
  }
7212
7386
 
7213
7387
  /* A collapsed icon rail cannot communicate an iconless destination. Remove
@@ -7319,8 +7493,8 @@ html.u-baseline-grid::after {
7319
7493
  display: block;
7320
7494
  margin: 0;
7321
7495
  overflow: hidden;
7322
- padding-block-end: var(--bf-single-line-row-in-box-padding-block-end);
7323
- padding-block-start: var(--bf-single-line-row-in-box-padding-block-start);
7496
+ padding-block-end: var(--bf-in-box-row-padding-block-end);
7497
+ padding-block-start: var(--bf-in-box-row-padding-block-start);
7324
7498
  padding-inline: var(--bf-component-inline-inset-action);
7325
7499
  text-align: left;
7326
7500
  text-decoration: none;
@@ -7358,6 +7532,8 @@ html.u-baseline-grid::after {
7358
7532
  }
7359
7533
 
7360
7534
  :where(.bf-theme) :where(.bf-tooltip) {
7535
+ --bf-tooltip-arrow-size: calc(var(--bf-baseline) * 0.5);
7536
+ --bf-tooltip-arrow-offset-inline: calc(var(--bf-tooltip-arrow-size) * 1.5);
7361
7537
  display: inline-flex;
7362
7538
  position: relative;
7363
7539
  text-decoration: inherit;
@@ -7379,7 +7555,7 @@ html.u-baseline-grid::after {
7379
7555
  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);
7380
7556
  color: var(--bf-color-text-default);
7381
7557
  inline-size: max-content;
7382
- left: 0;
7558
+ inset-inline-start: 0;
7383
7559
  margin: 0;
7384
7560
  max-inline-size: min(20rem, calc(100vw - (var(--bf-baseline) * 4)));
7385
7561
  opacity: 0;
@@ -7403,17 +7579,17 @@ html.u-baseline-grid::after {
7403
7579
 
7404
7580
  :where(.bf-theme) :where(.bf-tooltip-message)::before {
7405
7581
  block-size: 0;
7406
- border-bottom: calc(var(--bf-baseline) * 0.5) solid var(--bf-color-background-alt);
7407
- border-inline: calc(var(--bf-baseline) * 0.5) solid transparent;
7582
+ border-bottom: var(--bf-tooltip-arrow-size) solid var(--bf-color-background-alt);
7583
+ border-inline: var(--bf-tooltip-arrow-size) solid transparent;
7408
7584
  bottom: 100%;
7409
7585
  content: "";
7410
7586
  inline-size: 0;
7411
- left: calc(var(--bf-baseline) * 0.75);
7587
+ inset-inline-start: var(--bf-tooltip-arrow-offset-inline);
7412
7588
  position: absolute;
7413
7589
  }
7414
7590
 
7415
7591
  :where(.bf-theme) :where(.bf-tooltip.is-detached) > :where(.bf-tooltip-message) {
7416
- left: auto;
7592
+ inset-inline-start: auto;
7417
7593
  pointer-events: auto;
7418
7594
  position: static;
7419
7595
  top: auto;
@@ -7425,23 +7601,23 @@ html.u-baseline-grid::after {
7425
7601
  }
7426
7602
 
7427
7603
  :where(.bf-theme) :where(.bf-tooltip.is-btm-center) > :where(.bf-tooltip-message) {
7428
- left: 50%;
7604
+ inset-inline-start: 50%;
7429
7605
  transform: translate(-50%, calc(var(--bf-baseline) - var(--bf-border-width)));
7430
7606
  }
7431
7607
 
7432
7608
  :where(.bf-theme) :where(.bf-tooltip.is-btm-center) > :where(.bf-tooltip-message)::before {
7433
- left: 50%;
7609
+ inset-inline-start: 50%;
7434
7610
  transform: translateX(-50%);
7435
7611
  }
7436
7612
 
7437
7613
  :where(.bf-theme) :where(.bf-tooltip.is-btm-right) > :where(.bf-tooltip-message) {
7438
- left: auto;
7439
- right: 0;
7614
+ inset-inline-end: 0;
7615
+ inset-inline-start: auto;
7440
7616
  }
7441
7617
 
7442
7618
  :where(.bf-theme) :where(.bf-tooltip.is-btm-right) > :where(.bf-tooltip-message)::before {
7443
- left: auto;
7444
- right: calc(var(--bf-baseline) * 0.75);
7619
+ inset-inline-end: var(--bf-tooltip-arrow-offset-inline);
7620
+ inset-inline-start: auto;
7445
7621
  }
7446
7622
 
7447
7623
  :where(.bf-theme) :where(.bf-tooltip.is-top-left, .bf-tooltip.is-top-center, .bf-tooltip.is-top-right) > :where(.bf-tooltip-message) {
@@ -7452,30 +7628,30 @@ html.u-baseline-grid::after {
7452
7628
 
7453
7629
  :where(.bf-theme) :where(.bf-tooltip.is-top-left, .bf-tooltip.is-top-center, .bf-tooltip.is-top-right) > :where(.bf-tooltip-message)::before {
7454
7630
  border-bottom: 0;
7455
- border-inline: calc(var(--bf-baseline) * 0.5) solid transparent;
7456
- border-top: calc(var(--bf-baseline) * 0.5) solid var(--bf-color-background-alt);
7631
+ border-inline: var(--bf-tooltip-arrow-size) solid transparent;
7632
+ border-top: var(--bf-tooltip-arrow-size) solid var(--bf-color-background-alt);
7457
7633
  bottom: auto;
7458
7634
  top: 100%;
7459
7635
  }
7460
7636
 
7461
7637
  :where(.bf-theme) :where(.bf-tooltip.is-top-center) > :where(.bf-tooltip-message) {
7462
- left: 50%;
7638
+ inset-inline-start: 50%;
7463
7639
  transform: translate(-50%, calc(var(--bf-baseline) * -1));
7464
7640
  }
7465
7641
 
7466
7642
  :where(.bf-theme) :where(.bf-tooltip.is-top-center) > :where(.bf-tooltip-message)::before {
7467
- left: 50%;
7643
+ inset-inline-start: 50%;
7468
7644
  transform: translateX(-50%);
7469
7645
  }
7470
7646
 
7471
7647
  :where(.bf-theme) :where(.bf-tooltip.is-top-right) > :where(.bf-tooltip-message) {
7472
- left: auto;
7473
- right: 0;
7648
+ inset-inline-end: 0;
7649
+ inset-inline-start: auto;
7474
7650
  }
7475
7651
 
7476
7652
  :where(.bf-theme) :where(.bf-tooltip.is-top-right) > :where(.bf-tooltip-message)::before {
7477
- left: auto;
7478
- right: calc(var(--bf-baseline) * 0.75);
7653
+ inset-inline-end: var(--bf-tooltip-arrow-offset-inline);
7654
+ inset-inline-start: auto;
7479
7655
  }
7480
7656
 
7481
7657
  :where(.bf-theme) :where(nav.bf-pagination) {
@@ -7509,9 +7685,10 @@ html.u-baseline-grid::after {
7509
7685
  font-weight: var(--bf-body-font-weight, 400);
7510
7686
  line-height: var(--bf-body-line-height, 1.5rem);
7511
7687
  color: var(--bf-color-text-muted);
7512
- min-block-size: var(--bf-control-box-size);
7513
- padding-block: var(--bf-control-block-padding);
7514
- padding-inline: calc(var(--bf-baseline) * 0.5);
7688
+ border-block: var(--bf-border-width) solid transparent;
7689
+ margin-block-end: var(--bf-interface-row-compensation-block-end);
7690
+ padding-block: var(--bf-interface-row-padding-block);
7691
+ padding-inline: var(--bf-inline-unit);
7515
7692
  }
7516
7693
 
7517
7694
  :where(.bf-theme) :where(.bf-pagination-link, .bf-pagination-link.is-previous, .bf-pagination-link.is-next) {
@@ -7527,16 +7704,20 @@ html.u-baseline-grid::after {
7527
7704
  color: var(--bf-color-text-default);
7528
7705
  cursor: pointer;
7529
7706
  display: inline-flex;
7530
- gap: calc(var(--bf-baseline) * 0.5);
7707
+ gap: var(--bf-leading-mark-gap);
7531
7708
  justify-content: center;
7532
- margin-bottom: var(--bf-single-line-row-margin-block-end);
7533
- min-inline-size: var(--bf-control-box-size);
7534
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
7535
- padding-inline: var(--bf-control-inline-padding-action-bordered);
7709
+ margin-bottom: var(--bf-interface-row-compensation-block-end);
7710
+ padding-block: var(--bf-interface-row-padding-block);
7711
+ padding-inline: var(--bf-component-inline-inset-action-bordered);
7536
7712
  text-align: center;
7537
7713
  text-decoration: none;
7538
7714
  }
7539
7715
 
7716
+ :where(.bf-theme) :where(.bf-pagination-link:not(.is-previous):not(.is-next)) {
7717
+ min-inline-size: var(--bf-square-block-size);
7718
+ padding-inline: 0;
7719
+ }
7720
+
7540
7721
  :where(.bf-theme) :where(.bf-pagination-link:hover, .bf-pagination-link.is-previous:hover, .bf-pagination-link.is-next:hover) {
7541
7722
  background-color: var(--bf-color-background-hover);
7542
7723
  }
@@ -7633,9 +7814,9 @@ html.u-baseline-grid::after {
7633
7814
  gap: var(--bf-disclosure-gap);
7634
7815
  inline-size: 100%;
7635
7816
  justify-content: flex-start;
7636
- margin-block-end: var(--bf-single-line-row-margin-block-end);
7637
- padding-block: var(--bf-single-line-row-padding-block);
7638
- padding-inline: 0;
7817
+ margin-block-end: var(--bf-interface-row-compensation-block-end);
7818
+ padding-block: var(--bf-interface-row-padding-block);
7819
+ padding-inline: var(--bf-disclosure-group-inset) 0;
7639
7820
  text-align: left;
7640
7821
  }
7641
7822
 
@@ -7696,7 +7877,7 @@ html.u-baseline-grid::after {
7696
7877
  }
7697
7878
 
7698
7879
  :where(.bf-theme) :where(.bf-modal.is-workflow) {
7699
- --bf-modal-workflow-viewport-gap: calc(var(--bf-baseline) * 4);
7880
+ --bf-modal-workflow-viewport-gap: var(--bf-component-inline-inset-continuation);
7700
7881
  --bf-modal-workflow-max-inline-size: 42rem;
7701
7882
  --bf-modal-workflow-min-inline-size: 32rem;
7702
7883
  --bf-modal-workflow-max-block-size: 40rem;
@@ -7736,7 +7917,7 @@ html.u-baseline-grid::after {
7736
7917
  :where(.bf-theme) :where(.bf-modal-header, .bf-modal-body, .bf-modal-footer) {
7737
7918
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
7738
7919
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
7739
- padding-inline: var(--bf-component-inline-inset-continuation);
7920
+ padding-inline: var(--bf-panel-padding-inline);
7740
7921
  }
7741
7922
 
7742
7923
  :where(.bf-theme) :where(.bf-modal-header) {
@@ -7911,7 +8092,7 @@ html.u-baseline-grid::after {
7911
8092
 
7912
8093
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon) {
7913
8094
  cursor: copy;
7914
- padding-inline-start: calc(var(--bf-component-inline-inset-continuation) + (var(--bf-baseline) * 3));
8095
+ padding-inline-start: calc(var(--bf-component-inline-inset-continuation) + var(--bf-leading-mark-gap));
7915
8096
  position: relative;
7916
8097
  }
7917
8098
 
@@ -8015,8 +8196,8 @@ html.u-baseline-grid::after {
8015
8196
  * visible and exposed at a time. */
8016
8197
  :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) {
8017
8198
  align-items: start;
8018
- column-gap: calc(var(--bf-baseline) * 2);
8019
- padding-inline-end: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
8199
+ column-gap: var(--bf-leading-mark-gap);
8200
+ padding-inline-end: var(--bf-panel-content-padding-inline);
8020
8201
  }
8021
8202
 
8022
8203
  :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) {
@@ -8109,7 +8290,7 @@ html.u-baseline-grid::after {
8109
8290
  :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-link, .bf-side-navigation-text) {
8110
8291
  align-items: center;
8111
8292
  justify-content: center;
8112
- padding-inline: calc(var(--bf-baseline) * 1.25);
8293
+ padding-inline: var(--bf-component-inline-inset-action);
8113
8294
  }
8114
8295
 
8115
8296
  :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-list)::after {
@@ -8117,7 +8298,7 @@ html.u-baseline-grid::after {
8117
8298
  }
8118
8299
 
8119
8300
  :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) {
8120
- padding-inline: calc(var(--bf-baseline) * 1.25);
8301
+ padding-inline: var(--bf-component-inline-inset-action);
8121
8302
  }
8122
8303
 
8123
8304
  :where(.bf-theme) :where(.bf-application:has(> .bf-aside.is-pinned:not(.is-collapsed))) {
@@ -8244,7 +8425,7 @@ html.u-baseline-grid::after {
8244
8425
  cursor: ew-resize;
8245
8426
  display: none;
8246
8427
  inset-block: 0;
8247
- inset-inline-start: calc(var(--bf-baseline) * -3);
8428
+ inset-inline-start: calc(var(--bf-inline-unit) * -3);
8248
8429
  outline: none;
8249
8430
  position: absolute;
8250
8431
  touch-action: none;
@@ -8261,7 +8442,7 @@ html.u-baseline-grid::after {
8261
8442
  }
8262
8443
 
8263
8444
  :where(.bf-theme) :where(.bf-application-aside-resize-handle)::after {
8264
- background: var(--bf-color-border-default);
8445
+ background: transparent;
8265
8446
  border-radius: 62.4375rem;
8266
8447
  content: "";
8267
8448
  inset-block: var(--bf-panel-padding-block);
@@ -8283,7 +8464,9 @@ html.u-baseline-grid::after {
8283
8464
  outline-offset: -0.125rem;
8284
8465
  }
8285
8466
 
8286
- @media (min-width: 64.75rem) {
8467
+ /* Application navigation becomes persistent at 48rem. Standalone top and
8468
+ * document navigation keep their own large-screen contracts. */
8469
+ @media (min-width: 48rem) {
8287
8470
  :where(.bf-theme) :where(.bf-application:has(> .bf-navigation)) {
8288
8471
  grid-template-areas:
8289
8472
  "navigation-bar navigation-bar"
@@ -8326,6 +8509,10 @@ html.u-baseline-grid::after {
8326
8509
  display: none;
8327
8510
  }
8328
8511
 
8512
+ :where(.bf-theme) :where(.bf-application) :where(.bf-side-navigation-toggle) {
8513
+ display: none;
8514
+ }
8515
+
8329
8516
  :where(.bf-theme) :where(.bf-navigation-drawer),
8330
8517
  :where(.bf-theme) :where(.bf-navigation:not(.is-collapsed)) > :where(.bf-navigation-drawer) {
8331
8518
  block-size: 100%;
@@ -8559,7 +8746,7 @@ html.u-baseline-grid::after {
8559
8746
  overflow: hidden;
8560
8747
  overflow-wrap: anywhere;
8561
8748
  padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8562
- padding-inline: var(--bf-space-2) 0;
8749
+ padding-inline: var(--bf-component-inline-inset-action) 0;
8563
8750
  position: relative;
8564
8751
  text-decoration: none;
8565
8752
  text-overflow: ellipsis;
@@ -8602,7 +8789,7 @@ html.u-baseline-grid::after {
8602
8789
  }
8603
8790
 
8604
8791
  :where(.bf-theme) :where(.bf-in-page-navigation-list .bf-in-page-navigation-list .bf-in-page-navigation-link) {
8605
- padding-inline-start: var(--bf-space-4);
8792
+ padding-inline-start: calc(var(--bf-component-inline-inset-action) * 2);
8606
8793
  }
8607
8794
 
8608
8795
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle) {
@@ -8613,15 +8800,16 @@ html.u-baseline-grid::after {
8613
8800
  line-height: var(--bf-body-line-height, 1.5rem);
8614
8801
  align-items: center;
8615
8802
  background: var(--bf-color-background-default);
8616
- border: 0;
8803
+ border: 0 solid transparent;
8804
+ border-block-width: var(--bf-border-width);
8617
8805
  color: var(--bf-color-text-default);
8618
8806
  cursor: pointer;
8619
8807
  display: none;
8620
8808
  justify-content: center;
8621
8809
  margin: 0;
8622
- min-block-size: var(--bf-control-box-size-compact);
8623
- padding-block: var(--bf-control-block-padding-compact);
8624
- padding-inline: var(--bf-space-1);
8810
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
8811
+ padding-block-start: var(--bf-interface-row-padding-block);
8812
+ padding-inline: var(--bf-leading-mark-gap);
8625
8813
  }
8626
8814
 
8627
8815
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle:hover) {
@@ -8639,6 +8827,7 @@ html.u-baseline-grid::after {
8639
8827
 
8640
8828
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle > .bf-icon) {
8641
8829
  --bf-icon-size: var(--bf-icon-size-default);
8830
+ margin-block-start: 0;
8642
8831
  }
8643
8832
 
8644
8833
  @container bf-in-page-navigation (width < 40rem) {
@@ -8682,10 +8871,12 @@ html.u-baseline-grid::after {
8682
8871
  }
8683
8872
 
8684
8873
  :where(.bf-theme) :where(.bf-in-page-navigation-link) {
8874
+ border-block: var(--bf-border-width) solid transparent;
8685
8875
  display: block;
8686
8876
  overflow: hidden;
8687
- padding-block: calc(var(--bf-control-block-padding-compact) - var(--bf-border-width));
8688
- padding-inline: var(--bf-space-1);
8877
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
8878
+ padding-block-start: var(--bf-interface-row-padding-block);
8879
+ padding-inline: var(--bf-leading-mark-gap);
8689
8880
  text-overflow: ellipsis;
8690
8881
  white-space: nowrap;
8691
8882
  }
@@ -8720,7 +8911,7 @@ html.u-baseline-grid::after {
8720
8911
  grid-row: 1;
8721
8912
  margin: 0;
8722
8913
  padding-block: calc(var(--bf-h6-nudge-start) + var(--bf-space-1)) calc(var(--bf-h6-nudge-end) + var(--bf-space-1));
8723
- padding-inline: var(--bf-space-2);
8914
+ padding-inline: var(--bf-component-inline-inset-action);
8724
8915
  }
8725
8916
 
8726
8917
  :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) {
@@ -8746,7 +8937,7 @@ html.u-baseline-grid::after {
8746
8937
  display: -webkit-box;
8747
8938
  overflow-wrap: anywhere;
8748
8939
  padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8749
- padding-inline: var(--bf-space-2) 0;
8940
+ padding-inline: var(--bf-component-inline-inset-action) 0;
8750
8941
  white-space: normal;
8751
8942
  }
8752
8943
 
@@ -8771,7 +8962,7 @@ html.u-baseline-grid::after {
8771
8962
  * controller contracts while matching Vanilla's reduced chrome. */
8772
8963
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) {
8773
8964
  background: var(--bf-color-background-alt);
8774
- --bf-top-navigation-link-padding-block: var(--bf-control-block-padding-compact);
8965
+ --bf-top-navigation-reduced-row-block-size: var(--bf-interface-row-occupied-block-size);
8775
8966
  }
8776
8967
 
8777
8968
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo-tag) {
@@ -8784,10 +8975,13 @@ html.u-baseline-grid::after {
8784
8975
 
8785
8976
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo) > :where(.bf-top-navigation-link),
8786
8977
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-link, .bf-top-navigation-menu-toggle, .bf-top-navigation-search-toggle) {
8978
+ border: 0 solid transparent;
8979
+ border-block-width: var(--bf-border-width);
8787
8980
  color: var(--bf-color-text-muted);
8788
8981
  font-size: var(--bf-body-font-size);
8789
8982
  line-height: var(--bf-body-line-height);
8790
- padding-block: var(--bf-top-navigation-link-padding-block);
8983
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
8984
+ padding-block-start: var(--bf-interface-row-padding-block);
8791
8985
  }
8792
8986
 
8793
8987
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo.is-canonical-tagged) > :where(.bf-top-navigation-link) {
@@ -8812,7 +9006,7 @@ html.u-baseline-grid::after {
8812
9006
 
8813
9007
  @media (min-width: 64.75rem) {
8814
9008
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-dropdown) {
8815
- top: calc((var(--bf-top-navigation-link-padding-block) * 2) + var(--bf-body-line-height));
9009
+ top: var(--bf-top-navigation-reduced-row-block-size);
8816
9010
  }
8817
9011
 
8818
9012
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-search) {
@@ -8821,7 +9015,7 @@ html.u-baseline-grid::after {
8821
9015
  box-shadow: 0 calc(var(--bf-baseline) * 0.5) calc(var(--bf-baseline) * 2) rgba(0, 0, 0, 0.16);
8822
9016
  inset-block-start: 100%;
8823
9017
  inset-inline-end: 0;
8824
- padding: var(--bf-control-block-padding-compact) var(--bf-top-navigation-link-padding-inline);
9018
+ padding: var(--bf-panel-padding-block) var(--bf-top-navigation-link-padding-inline);
8825
9019
  position: absolute;
8826
9020
  }
8827
9021
 
@@ -8869,6 +9063,7 @@ html.u-baseline-grid::after {
8869
9063
  color: var(--bf-color-text-default);
8870
9064
  margin: 0;
8871
9065
  padding-block-end: 0;
9066
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
8872
9067
  }
8873
9068
 
8874
9069
  :where(.bf-theme) :where(.bf-table-of-contents-list) {
@@ -8900,9 +9095,11 @@ html.u-baseline-grid::after {
8900
9095
  border-block: var(--bf-border-width) solid transparent;
8901
9096
  color: var(--bf-color-link-default);
8902
9097
  display: block;
8903
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
9098
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
8904
9099
  overflow-wrap: anywhere;
8905
- padding-block: var(--bf-single-line-row-padding-block);
9100
+ padding-block: var(--bf-interface-row-padding-block);
9101
+ padding-inline-end: var(--bf-component-inline-inset-action);
9102
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
8906
9103
  text-decoration: none;
8907
9104
  }
8908
9105
 
@@ -8926,12 +9123,12 @@ html.u-baseline-grid::after {
8926
9123
  }
8927
9124
 
8928
9125
  :where(.bf-theme) :where(.bf-table-of-contents-list .bf-table-of-contents-list) {
8929
- margin-inline-start: var(--bf-space-2);
9126
+ margin-inline-start: var(--bf-component-inline-inset-action);
8930
9127
  }
8931
9128
 
8932
9129
  @container bf-table-of-contents (width < 20rem) {
8933
9130
  :where(.bf-theme) :where(.bf-table-of-contents-list .bf-table-of-contents-list) {
8934
- margin-inline-start: var(--bf-space-1);
9131
+ margin-inline-start: var(--bf-leading-mark-gap);
8935
9132
  }
8936
9133
  }
8937
9134
 
@@ -9030,9 +9227,9 @@ html.u-baseline-grid::after {
9030
9227
  }
9031
9228
 
9032
9229
  /* ------------------------------------------------------------------ */
9033
- /* Header split (≥ 45rem): the shared readable 50/50 title/content split. */
9230
+ /* Header split (≥ 38.75rem): the standard medium 50/50 title/content split. */
9034
9231
  /* ------------------------------------------------------------------ */
9035
- @container (width >= 45rem) {
9232
+ @container (width >= 38.75rem) {
9036
9233
  :where(.bf-theme) :where(.bf-tiered-list:not(.is-description-full-width)) :where(.bf-tiered-list-header) {
9037
9234
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
9038
9235
  }