baseline-foundry 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +17 -9
  2. package/config/experiments/ibm-plex-engine-smoke.json +1 -1
  3. package/config/experiments/ubuntu-engine-smoke.json +1 -1
  4. package/config/foundation-theme.json +1 -1
  5. package/config/tiers/app.json +6 -6
  6. package/config/tiers/documentation.json +2 -2
  7. package/config/tiers/editorial.json +1 -1
  8. package/config/tiers/os.json +6 -6
  9. package/dist/baseline-grid-overlay.js +2 -2
  10. package/dist/build.js +4 -4
  11. package/dist/code-snippet.js +1 -1
  12. package/dist/css-app-tier.js +16 -5
  13. package/dist/css-components/article-pagination.js +9 -8
  14. package/dist/css-components/button-actions.js +24 -4
  15. package/dist/css-components/cards-options.js +8 -8
  16. package/dist/css-components/chip-badge-status.d.ts +0 -3
  17. package/dist/css-components/chip-badge-status.js +57 -10
  18. package/dist/css-components/content-card.d.ts +7 -7
  19. package/dist/css-components/content-card.js +17 -16
  20. package/dist/css-components/control-row.d.ts +1 -1
  21. package/dist/css-components/control-row.js +1 -1
  22. package/dist/css-components/document-navigation.js +66 -29
  23. package/dist/css-components/editorial-content.js +1 -1
  24. package/dist/css-components/interactive-feedback.js +50 -28
  25. package/dist/css-components/interactive-tables.js +13 -8
  26. package/dist/css-components/legacy-navigation.d.ts +0 -1
  27. package/dist/css-components/legacy-navigation.js +108 -32
  28. package/dist/css-components/linked-logo-site-layout.d.ts +3 -3
  29. package/dist/css-components/linked-logo-site-layout.js +17 -20
  30. package/dist/css-components/list-tree.js +21 -19
  31. package/dist/css-components/list.js +9 -7
  32. package/dist/css-components/logo-media.d.ts +6 -6
  33. package/dist/css-components/logo-media.js +38 -27
  34. package/dist/css-components/navigation-layout.js +6 -8
  35. package/dist/css-components/panel.js +12 -12
  36. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  37. package/dist/css-components/search-box-and-filter.js +18 -19
  38. package/dist/css-components/sites-editorial-ports.d.ts +3 -4
  39. package/dist/css-components/sites-editorial-ports.js +61 -29
  40. package/dist/css-components/sites-foundation.js +15 -19
  41. package/dist/css-components/sites-rich-lists.d.ts +5 -5
  42. package/dist/css-components/sites-rich-lists.js +26 -36
  43. package/dist/css-components/static-content-ports.d.ts +3 -3
  44. package/dist/css-components/static-content-ports.js +51 -37
  45. package/dist/css-components/tab-section.d.ts +3 -3
  46. package/dist/css-components/tab-section.js +34 -26
  47. package/dist/css-components/table.js +4 -7
  48. package/dist/css-components/tabs-choice-breadcrumbs.js +25 -21
  49. package/dist/css-components/tiered-list-equal-height-row.js +10 -10
  50. package/dist/css-components.js +243 -124
  51. package/dist/css-grid.d.ts +1 -1
  52. package/dist/css-grid.js +18 -8
  53. package/dist/css.js +94 -18
  54. package/dist/experiments/ibm-plex-engine-smoke/styles.css +1005 -563
  55. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +2 -2
  56. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +1 -1
  57. package/dist/in-page-navigation.js +1 -1
  58. package/dist/presets/app-tier/styles.css +1046 -593
  59. package/dist/presets/app-tier/surfaces.json +17 -17
  60. package/dist/presets/app-tier/tokens.json +7 -7
  61. package/dist/presets/prose/styles.css +1036 -587
  62. package/dist/presets/prose/surfaces.json +17 -17
  63. package/dist/presets/prose/tokens.json +1 -1
  64. package/dist/resizable-aside.js +12 -4
  65. package/dist/styles.css +1036 -587
  66. package/dist/surfaces.json +17 -17
  67. package/dist/tiers/app/styles.css +1046 -593
  68. package/dist/tiers/app/surfaces.json +17 -17
  69. package/dist/tiers/app/tokens.json +7 -7
  70. package/dist/tiers/documentation/styles.css +1037 -588
  71. package/dist/tiers/documentation/surfaces.json +17 -17
  72. package/dist/tiers/documentation/tokens.json +2 -2
  73. package/dist/tiers/editorial/styles.css +1036 -587
  74. package/dist/tiers/editorial/surfaces.json +17 -17
  75. package/dist/tiers/editorial/tokens.json +1 -1
  76. package/dist/tiers/os/styles.css +1042 -593
  77. package/dist/tiers/os/surfaces.json +17 -17
  78. package/dist/tiers/os/tokens.json +7 -7
  79. package/dist/tokens.json +1 -1
  80. package/dist/types.d.ts +1 -1
  81. package/docs/publishing.md +1 -1
  82. package/package.json +2 -2
@@ -28,8 +28,8 @@
28
28
  background-image: linear-gradient(
29
29
  to top,
30
30
  var(--bf-baseline-grid-color),
31
- var(--bf-baseline-grid-color) 1px,
32
- transparent 1px,
31
+ var(--bf-baseline-grid-color) 0.0625rem,
32
+ transparent 0.0625rem,
33
33
  transparent
34
34
  );
35
35
  background-size: 100% var(--bf-baseline-grid-size);
@@ -455,7 +455,7 @@ html.u-baseline-grid::after {
455
455
  :where(.bf-theme) :where(a) {
456
456
  color: var(--bf-color-link);
457
457
  text-decoration: none;
458
- text-decoration-thickness: 1px;
458
+ text-decoration-thickness: 0.0625rem;
459
459
  text-underline-offset: 0.12em;
460
460
  }
461
461
 
@@ -468,8 +468,22 @@ html.u-baseline-grid::after {
468
468
  }
469
469
 
470
470
  :where(.bf-theme) :where(a:focus-visible) {
471
- outline: 2px solid var(--bf-color-focus);
472
- outline-offset: 2px;
471
+ outline: 0.125rem solid var(--bf-color-focus);
472
+ outline-offset: 0.125rem;
473
+ }
474
+
475
+ /* Standalone anchors need the same metric-owned text box as adjacent body
476
+ * controls. Raw anchors remain inline so prose links still participate in the
477
+ * surrounding line box. */
478
+ :where(.bf-theme) :where(a.bf-text-link) {
479
+ display: inline-block;
480
+ font-family: var(--bf-body-font-family);
481
+ font-size: var(--bf-body-font-size);
482
+ font-style: var(--bf-body-font-style);
483
+ font-weight: var(--bf-body-font-weight);
484
+ line-height: var(--bf-body-line-height);
485
+ margin-block: 0 var(--bf-body-margin-bottom);
486
+ padding-block: var(--bf-body-nudge-start) 0;
473
487
  }
474
488
 
475
489
  :where(.bf-theme) :where(code) {
@@ -480,7 +494,7 @@ html.u-baseline-grid::after {
480
494
  :where(.bf-theme) :where(.bf-page) {
481
495
  margin-inline: auto;
482
496
  max-inline-size: var(--bf-content-max-width);
483
- padding-inline: max(var(--bf-page-margin), var(--bf-content-padding-inline));
497
+ padding-inline: var(--bf-page-margin);
484
498
  }
485
499
 
486
500
  :where(.bf-theme) :where(.bf-page.is-fill) {
@@ -563,7 +577,14 @@ html.u-baseline-grid::after {
563
577
  }
564
578
 
565
579
  :where(.bf-theme) :where(.bf-stack.is-flush) {
566
- --bf-stack-space: 0px;
580
+ --bf-stack-space: 0rem;
581
+ }
582
+
583
+ /* A metric-flush stack is an explicit relationship between adjacent text
584
+ * roles. It retains the outer role nudges while cancelling only the preceding
585
+ * end compensation and following start nudge; no guessed negative gap is used. */
586
+ :where(.bf-theme) :where(.bf-stack.is-metric-flush) {
587
+ --bf-stack-space: 0rem;
567
588
  }
568
589
 
569
590
  :where(.bf-theme) :where(.bf-stack.is-extra-dense) {
@@ -591,10 +612,19 @@ html.u-baseline-grid::after {
591
612
  }
592
613
 
593
614
  :where(.bf-theme) :where(.bf-cluster) {
615
+ --bf-cluster-space: var(--bf-space-2);
594
616
  align-items: flex-start;
595
617
  display: flex;
596
618
  flex-wrap: wrap;
597
- gap: var(--bf-space-2);
619
+ gap: var(--bf-cluster-space);
620
+ }
621
+
622
+ :where(.bf-theme) :where(.bf-cluster.is-dense) {
623
+ --bf-cluster-space: var(--bf-space-1);
624
+ }
625
+
626
+ :where(.bf-theme) :where(.bf-cluster.is-nowrap) {
627
+ flex-wrap: nowrap;
598
628
  }
599
629
 
600
630
  :where(.bf-theme) :where(.bf-cluster.is-split) {
@@ -716,6 +746,14 @@ html.u-baseline-grid::after {
716
746
  }
717
747
 
718
748
 
749
+ :where(.bf-theme) .bf-stack.is-metric-flush > :where(blockquote, p, h1, h2, h3, h4, h5, h6, .bf-body, .bf-h1, .bf-h2, .bf-h3, .bf-h4, .bf-h5, .bf-h6):has(+ :where(blockquote, p, h1, h2, h3, h4, h5, h6, .bf-body, .bf-h1, .bf-h2, .bf-h3, .bf-h4, .bf-h5, .bf-h6)) {
750
+ margin-block-end: 0;
751
+ }
752
+
753
+ :where(.bf-theme) .bf-stack.is-metric-flush > :where(blockquote, p, h1, h2, h3, h4, h5, h6, .bf-body, .bf-h1, .bf-h2, .bf-h3, .bf-h4, .bf-h5, .bf-h6) + :where(blockquote, p, h1, h2, h3, h4, h5, h6, .bf-body, .bf-h1, .bf-h2, .bf-h3, .bf-h4, .bf-h5, .bf-h6) {
754
+ padding-block-start: 0;
755
+ }
756
+
719
757
  /* DEMO ONLY — Cap-derived nudges are unreliable (ascender ≠ cap height).
720
758
  The approximation (line-height + 1cap) / 2 drifts at larger sizes.
721
759
  Kept as a reference for why metrics-derived nudges are used instead. */
@@ -771,10 +809,36 @@ html.u-baseline-grid::after {
771
809
 
772
810
  :where(.bf-theme) :where(ul, ol) {
773
811
  margin-bottom: 0;
812
+ padding-block-end: 0;
774
813
  }
775
814
 
776
- :where(.bf-theme) :where(.bf-prose ul, .bf-prose ol) {
777
- padding-inline-start: var(--bf-space-4);
815
+ :where(.bf-theme) :where(.bf-prose ol) {
816
+ padding-inline-start: calc(var(--bf-leading-mark-group-inset) + var(--bf-leading-mark-offset) - (var(--bf-leading-mark-size) * 0.5));
817
+ }
818
+
819
+ :where(.bf-theme) :where(.bf-prose ol > li) {
820
+ padding-inline-start: calc(var(--bf-leading-mark-size) * 0.5);
821
+ }
822
+
823
+ :where(.bf-theme) :where(.bf-prose ul) {
824
+ list-style: none;
825
+ padding-inline-start: var(--bf-leading-mark-group-inset);
826
+ }
827
+
828
+ :where(.bf-theme) :where(.bf-prose ul > li) {
829
+ padding-inline-start: var(--bf-leading-mark-offset);
830
+ position: relative;
831
+ }
832
+
833
+ :where(.bf-theme) :where(.bf-prose ul > li)::before {
834
+ background: currentColor;
835
+ block-size: var(--bf-list-marker-dot-size);
836
+ border-radius: 50%;
837
+ content: "";
838
+ inline-size: var(--bf-list-marker-dot-size);
839
+ inset-block-start: calc(var(--bf-tick-box-offset) + ((var(--bf-leading-mark-size) - var(--bf-list-marker-dot-size)) * 0.5));
840
+ inset-inline-start: calc((var(--bf-leading-mark-size) - var(--bf-list-marker-dot-size)) * 0.5);
841
+ position: absolute;
778
842
  }
779
843
 
780
844
  :where(.bf-theme) :where(.bf-prose li) {
@@ -784,39 +848,37 @@ html.u-baseline-grid::after {
784
848
  }
785
849
 
786
850
  :where(.bf-theme) :where(.bf-prose blockquote) {
787
- border-inline-start: 1px solid var(--bf-color-rule);
788
- color: var(--bf-color-muted);
851
+ color: var(--bf-color-text-default);
789
852
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
790
853
  font-size: var(--bf-body-font-size, 1rem);
791
854
  font-style: var(--bf-body-font-style, normal);
792
855
  font-weight: var(--bf-body-font-weight, 400);
793
856
  line-height: var(--bf-body-line-height, 1.5rem);
794
857
  margin-bottom: var(--bf-body-margin-bottom, 0.125rem);
795
- max-inline-size: calc(var(--bf-measure) + var(--bf-space-4));
858
+ max-inline-size: var(--bf-measure);
796
859
  padding-block-end: 0rem;
797
860
  padding-block-start: var(--bf-body-nudge-start, 0.375rem);
798
- padding-inline-start: var(--bf-space-3);
799
861
  }
800
862
 
801
- :where(.bf-theme) :where(.bf-rule, .bf-prose hr) {
863
+ :where(.bf-theme) :where(hr) {
802
864
  background: var(--bf-color-rule);
803
- block-size: 1px;
865
+ block-size: 0.0625rem;
804
866
  border: 0;
805
867
  inline-size: 100%;
806
868
  /* Reserve one half-rem rhythm step after the rule, including its */
807
869
  /* thickness, so borderless content does not touch the divider. */
808
- margin: 0 0 calc(0.5rem - 1px);
870
+ margin: 0 0 calc(0.5rem - 0.0625rem);
809
871
  }
810
872
 
811
873
  /* Highlight rules share the same scalable emphasis-bar geometry as active
812
874
  * navigation, tabs, notifications, and document-navigation markers. */
813
- :where(.bf-theme) :where(.bf-rule.is-highlighted, .bf-prose hr.is-highlighted) {
875
+ :where(.bf-theme) :where(hr.is-highlighted) {
814
876
  block-size: var(--bf-bar-thickness);
815
877
  margin-block-end: calc(0.5rem - var(--bf-bar-thickness));
816
878
  }
817
879
 
818
880
  :where(.bf-theme) :where(.bf-token-row) {
819
- border-top: 1px solid var(--bf-color-rule);
881
+ border-top: 0.0625rem solid var(--bf-color-rule);
820
882
  display: grid;
821
883
  gap: var(--bf-space-1);
822
884
  padding-top: var(--bf-space-2);
@@ -828,7 +890,7 @@ html.u-baseline-grid::after {
828
890
  }
829
891
 
830
892
  :where(.bf-theme) {
831
- --bf-border-width: 1px;
893
+ --bf-border-width: 0.0625rem;
832
894
  --bf-bar-thickness: 0.1875rem;
833
895
  --bf-radius: 0rem;
834
896
  --bf-control-block-padding: 0.5rem;
@@ -846,22 +908,48 @@ html.u-baseline-grid::after {
846
908
  /* Action surfaces keep comfortable command targets; field surfaces can tighten independently. */
847
909
  --bf-disclosure-gap: 1rem;
848
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);
849
920
  --bf-input-block-padding: var(--bf-body-nudge-start, 0.375rem);
850
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)));
851
936
  --bf-slider-track-size: calc(var(--bf-baseline) * 0.25);
852
- --bf-slider-row-block-size: max(var(--bf-control-box-size-compact), calc(var(--bf-body-nudge-start, 0.375rem) + var(--bf-body-line-height, 1.5rem) + var(--bf-body-nudge-end)));
937
+ --bf-slider-row-block-size: var(--bf-single-line-row-block-size);
853
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));
854
939
  --bf-table-row-border-size: var(--bf-border-width);
855
- --bf-table-row-padding: var(--bf-body-nudge-start, 0.375rem);
856
- --bf-table-row-content-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-table-row-padding) * 2) + var(--bf-table-row-border-size));
857
- --bf-table-row-block-size: calc(var(--bf-table-row-content-size) + mod(calc(var(--bf-baseline) - mod(var(--bf-table-row-content-size), var(--bf-baseline))), var(--bf-baseline)));
858
- --bf-table-row-line-height: calc(var(--bf-table-row-block-size) - (var(--bf-table-row-padding) * 2) - var(--bf-table-row-border-size));
859
- --bf-switch-row-block-size: calc(var(--bf-body-nudge-start, 0.375rem) + var(--bf-body-line-height, 1.5rem) + var(--bf-body-nudge-end));
860
- --bf-switch-track-offset: calc(var(--bf-body-nudge-start, 0.375rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-control-visual-size)) / 2));
861
- --bf-tick-row-block-size: max(var(--bf-control-box-size-compact), calc(var(--bf-body-nudge-start, 0.375rem) + var(--bf-body-line-height, 1.5rem) + var(--bf-body-nudge-end)));
862
- --bf-tick-box-offset: calc(var(--bf-body-nudge-start, 0.375rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-control-visual-size)) / 2));
863
- --bf-tick-label-offset: calc(var(--bf-control-visual-size) + var(--bf-control-inline-padding-field));
864
- --bf-radio-dot-size: calc(var(--bf-control-visual-size) * 0.375);
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);
946
+ --bf-leading-mark-size: var(--bf-control-visual-size);
947
+ --bf-leading-mark-gap: var(--bf-component-inline-inset-field);
948
+ --bf-leading-mark-offset: calc(var(--bf-leading-mark-size) + var(--bf-leading-mark-gap));
949
+ --bf-leading-mark-group-inset: calc(var(--bf-component-inline-inset-continuation) - var(--bf-leading-mark-offset));
950
+ --bf-tick-label-offset: var(--bf-leading-mark-offset);
951
+ --bf-radio-dot-size: calc((var(--bf-control-visual-size) * 0.375) + var(--bf-border-width));
952
+ --bf-list-marker-dot-size: calc(var(--bf-border-width) * 4);
865
953
  --bf-app-drawer-width-icon: 2rem;
866
954
  --bf-app-drawer-width-small: 15rem;
867
955
  --bf-app-drawer-width-small-max: 20rem;
@@ -873,7 +961,9 @@ html.u-baseline-grid::after {
873
961
  --bf-app-aside-width-max: var(--bf-app-drawer-width-medium-max);
874
962
  --bf-app-navigation-width: 15rem;
875
963
  --bf-app-navigation-width-collapsed: 3rem;
876
- --bf-side-navigation-icon-optical-offset-block: 0.1875rem;
964
+ --bf-icon-label-optical-offset-block: 0.1875rem;
965
+ --bf-disclosure-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
966
+ --bf-side-navigation-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
877
967
  --bf-side-navigation-icon-gap: 0.625rem;
878
968
  --bf-navigation-bar-min-block-size: calc(var(--bf-baseline) * 6);
879
969
  --bf-authoring-accent: #f6b73c;
@@ -886,9 +976,10 @@ html.u-baseline-grid::after {
886
976
  --bf-authoring-accent-focus-ring: rgba(246, 183, 60, 0.55);
887
977
  --bf-application-resize-handle-active: var(--bf-authoring-accent-strong);
888
978
  --bf-application-resize-handle-focus-ring: var(--bf-authoring-accent-focus-ring);
889
- --bf-top-navigation-link-padding-inline: var(--bf-control-inline-padding-action);
890
- --bf-top-navigation-end-slot-inline-size: calc(1rem + var(--bf-control-inline-padding-field));
891
- --bf-top-navigation-search-toggle-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
979
+ --bf-control-inline-padding-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
980
+ --bf-top-navigation-link-padding-inline: var(--bf-component-inline-inset-action);
981
+ --bf-top-navigation-end-slot-inline-size: calc(1rem + var(--bf-component-inline-inset-field));
982
+ --bf-top-navigation-search-toggle-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
892
983
  --bf-top-navigation-link-padding-block: max(var(--bf-body-nudge-start), calc(var(--bf-baseline) * 1.5));
893
984
  --bf-top-navigation-search-max-inline-size: 20rem;
894
985
  --bf-top-navigation-logo-tag-inline-size: 1.375rem;
@@ -897,18 +988,18 @@ html.u-baseline-grid::after {
897
988
  --bf-top-navigation-logo-tag-gap: 0.25rem;
898
989
  --bf-top-navigation-logo-icon-bottom-offset: 0.375rem;
899
990
  --bf-top-navigation-logo-icon-optical-offset-inline: -0.0125rem;
900
- --bf-navigation-brand-title-optical-offset-block: 0rem;
991
+ --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
+ --bf-navigation-brand-block-size: calc(var(--bf-navigation-brand-line-center-block) * 2);
901
993
  --bf-icon-size-default: 1rem;
902
994
  --bf-icon-size-medium: 2.5rem;
903
995
  --bf-icon-size-large: 4rem;
904
996
  --bf-icon-size-x-large: 4.5rem;
905
997
  --bf-icon-size-xx-large: 6rem;
906
- --bf-leading-icon-size: calc(var(--bf-baseline) * 2);
907
- --bf-leading-icon-gap: calc(var(--bf-baseline) * 1);
908
- --bf-leading-icon-offset: calc(var(--bf-body-nudge-start, 0.375rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-leading-icon-size)) / 2));
909
- --bf-ui-chip-padding-inline: calc(var(--bf-body-line-height, 1.5rem) * 0.4);
910
- --bf-ui-chip-padding-block: max(0rem, calc((var(--bf-control-inline-padding-action) * 0.25) - var(--bf-border-width)));
911
- --bf-ui-chip-block-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-ui-chip-padding-block) * 2) + (var(--bf-border-width) * 2));
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;
912
1003
  --bf-ui-badge-padding-inline: calc(var(--bf-body-line-height, 1.5rem) * 0.25);
913
1004
  --bf-ui-badge-overhang: calc(var(--bf-ui-badge-padding-inline) * -0.75);
914
1005
  --bf-grid-max-inline-size: var(--bf-content-max-width);
@@ -971,6 +1062,7 @@ html.u-baseline-grid::after {
971
1062
  --bf-color-focus: var(--vf-color-focus, #2e96ff);
972
1063
 
973
1064
  --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");
974
1066
  --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");
975
1067
  --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");
976
1068
  --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");
@@ -995,11 +1087,9 @@ html.u-baseline-grid::after {
995
1087
  }
996
1088
 
997
1089
  :where(.bf-theme.bf-surface-ubuntu-engine-smoke) {
998
- --bf-control-baseline-reserve: 0rem;
999
1090
  --bf-input-block-padding: 0.41rem;
1000
1091
  --bf-button-block-padding: 0.41rem;
1001
- --bf-table-row-padding: 0.41rem;
1002
- --bf-border-width: 1px;
1092
+ --bf-border-width: 0.0625rem;
1003
1093
  --bf-bar-thickness: 0.1875rem;
1004
1094
  --bf-radius: 0rem;
1005
1095
  --bf-control-block-padding: 0.5rem;
@@ -1018,7 +1108,6 @@ html.u-baseline-grid::after {
1018
1108
  }
1019
1109
 
1020
1110
 
1021
- :where(.bf-theme.is-dark),
1022
1111
  :where(.bf-theme.is-dark) {
1023
1112
  --bf-color-text-default: var(--vf-color-text-default, var(--bf-color-text, #ffffff));
1024
1113
  --bf-color-text-muted: var(--vf-color-text-muted, var(--bf-color-muted, rgba(255, 255, 255, 0.6)));
@@ -1068,6 +1157,7 @@ html.u-baseline-grid::after {
1068
1157
  --bf-color-focus: var(--vf-color-focus, #99ccff);
1069
1158
 
1070
1159
  --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");
1071
1161
  --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");
1072
1162
  --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");
1073
1163
  --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");
@@ -1161,6 +1251,10 @@ html.u-baseline-grid::after {
1161
1251
  grid-template-columns: minmax(0, 1fr);
1162
1252
  }
1163
1253
 
1254
+ :where(.bf-theme) :where(.bf-field.is-range.is-stacked) > :where(.bf-control, .bf-form-help) {
1255
+ grid-column: 1;
1256
+ }
1257
+
1164
1258
  :where(.bf-theme) :where(.bf-field.is-range.is-stacked) > :where(.bf-control) {
1165
1259
  min-inline-size: 0;
1166
1260
  }
@@ -1178,7 +1272,7 @@ html.u-baseline-grid::after {
1178
1272
  margin: 0;
1179
1273
  min-inline-size: 0;
1180
1274
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
1181
- padding-inline: var(--bf-panel-padding-inline);
1275
+ padding-inline: var(--bf-component-inline-inset-continuation);
1182
1276
  padding-block-start: var(--bf-panel-padding-block);
1183
1277
  }
1184
1278
 
@@ -1205,13 +1299,36 @@ html.u-baseline-grid::after {
1205
1299
  min-inline-size: 0;
1206
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)));
1207
1301
  padding-block: max(0rem, calc(var(--bf-input-block-padding) - var(--bf-border-width)));
1208
- padding-inline: var(--bf-control-inline-padding-field);
1302
+ padding-inline: var(--bf-component-inline-inset-field);
1209
1303
  }
1210
1304
 
1211
- :where(.bf-theme) :where(input[type='color'].bf-color-input) {
1305
+ :where(.bf-theme) :where(.bf-color-control) {
1306
+ display: grid;
1307
+ grid-template-areas: "color-control";
1212
1308
  inline-size: 4rem;
1213
- min-block-size: var(--bf-control-box-size);
1214
- padding: calc(var(--bf-baseline) * 0.5);
1309
+ }
1310
+
1311
+ /* Native color inputs do not expose a body-text line box. This invisible
1312
+ metric strut gives their wrapper the same natural padding/border/margin
1313
+ construction as every textual control, including under browser zoom. */
1314
+ :where(.bf-theme) :where(.bf-color-control)::before {
1315
+ border-block: var(--bf-border-width) solid transparent;
1316
+ content: "\00a0";
1317
+ grid-area: color-control;
1318
+ 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);
1321
+ visibility: hidden;
1322
+ }
1323
+
1324
+ :where(.bf-theme) :where(.bf-color-control) > :where(input[type='color'].bf-color-input) {
1325
+ align-self: stretch;
1326
+ block-size: auto;
1327
+ grid-area: color-control;
1328
+ inline-size: 100%;
1329
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
1330
+ min-block-size: 0;
1331
+ padding: var(--bf-border-width);
1215
1332
  }
1216
1333
 
1217
1334
  :where(.bf-theme) :where(.bf-input, input[type='text'], input[type='number'], input[type='search'], input[type='password'], input[type='email'], input[type='url'], textarea, select):hover {
@@ -1224,8 +1341,8 @@ html.u-baseline-grid::after {
1224
1341
 
1225
1342
  :where(.bf-theme) :where(.bf-input, input[type='text'], input[type='number'], input[type='search'], input[type='password'], input[type='email'], input[type='url'], textarea, select):focus-visible {
1226
1343
  background-color: var(--bf-color-background-active);
1227
- outline: 2px solid var(--bf-color-focus);
1228
- outline-offset: 2px;
1344
+ outline: 0.125rem solid var(--bf-color-focus);
1345
+ outline-offset: 0.125rem;
1229
1346
  }
1230
1347
 
1231
1348
  :where(.bf-theme) :where(.bf-input, input[type='text'], input[type='number'], input[type='search'], input[type='password'], input[type='email'], input[type='url'], textarea, select):disabled {
@@ -1252,13 +1369,12 @@ html.u-baseline-grid::after {
1252
1369
  line-height: var(--bf-body-line-height, 1.5rem);
1253
1370
  background: transparent;
1254
1371
  border: 0 solid transparent;
1255
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-default);
1256
- border-top: var(--bf-border-width) solid transparent;
1372
+ box-shadow: inset 0 calc(var(--bf-border-width) * -1) 0 var(--bf-color-border-default);
1257
1373
  color: var(--bf-color-text-default);
1258
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)));
1259
1375
  max-inline-size: 100%;
1260
1376
  min-inline-size: 0;
1261
- padding-block: max(0rem, calc(var(--bf-input-block-padding) - var(--bf-border-width)));
1377
+ padding-block: 0;
1262
1378
  padding-inline: 0;
1263
1379
  width: 100%;
1264
1380
  }
@@ -1276,9 +1392,9 @@ html.u-baseline-grid::after {
1276
1392
  color: var(--bf-color-text-default);
1277
1393
  cursor: pointer;
1278
1394
  margin-inline-end: var(--bf-field-gap);
1279
- min-block-size: var(--bf-control-box-size-compact);
1280
- padding-block: max(0rem, calc(var(--bf-control-block-padding-compact) - var(--bf-border-width)));
1281
- padding-inline: var(--bf-control-inline-padding-action);
1395
+ min-block-size: 0;
1396
+ padding-block: var(--bf-single-line-row-padding-block);
1397
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
1282
1398
  }
1283
1399
 
1284
1400
  :where(.bf-theme) :where(input[type='file'])::file-selector-button:hover {
@@ -1287,16 +1403,31 @@ html.u-baseline-grid::after {
1287
1403
 
1288
1404
  :where(.bf-theme) :where(select) {
1289
1405
  background-image: var(--bf-ui-icon-chevron-down);
1290
- background-position: right var(--bf-control-inline-padding-field) center;
1406
+ background-position: right var(--bf-component-inline-inset-field) center;
1291
1407
  background-repeat: no-repeat;
1292
1408
  background-size: 1rem 1rem;
1293
- padding-inline-end: calc(var(--bf-control-inline-padding-field) * 2.5);
1409
+ overflow: hidden;
1410
+ padding-inline-end: calc(var(--bf-component-inline-inset-field) * 2.5);
1411
+ text-overflow: ellipsis;
1412
+ white-space: nowrap;
1294
1413
  }
1295
1414
 
1296
1415
  :where(.bf-theme) :where(input[type='number'], .bf-slider-input) {
1297
1416
  font-variant-numeric: tabular-nums;
1298
1417
  }
1299
1418
 
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. */
1422
+ :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);
1429
+ }
1430
+
1300
1431
  :where(.bf-theme) :where(.bf-slider-input) {
1301
1432
  flex: 0 1 5rem;
1302
1433
  inline-size: min(100%, 5rem);
@@ -1308,12 +1439,14 @@ html.u-baseline-grid::after {
1308
1439
 
1309
1440
  :where(.bf-theme) :where(input[type='number'])::-webkit-inner-spin-button,
1310
1441
  :where(.bf-theme) :where(input[type='number'])::-webkit-outer-spin-button {
1442
+ appearance: none;
1311
1443
  margin: 0;
1312
1444
  }
1313
1445
 
1314
1446
  :where(.bf-theme) :where(.bf-checkbox, .bf-radio) {
1447
+ display: grid;
1315
1448
  margin: 0;
1316
- min-block-size: var(--bf-tick-row-block-size);
1449
+ padding-inline-start: var(--bf-leading-mark-group-inset);
1317
1450
  position: relative;
1318
1451
  }
1319
1452
 
@@ -1334,12 +1467,11 @@ html.u-baseline-grid::after {
1334
1467
  font-weight: var(--bf-body-font-weight, 400);
1335
1468
  line-height: var(--bf-body-line-height, 1.5rem);
1336
1469
  color: var(--bf-color-text-default);
1470
+ border-block: var(--bf-border-width) solid transparent;
1337
1471
  cursor: pointer;
1338
1472
  display: block;
1339
- margin-bottom: 0;
1340
- min-block-size: var(--bf-tick-row-block-size);
1341
- padding-block-end: var(--bf-body-nudge-end);
1342
- padding-block-start: var(--bf-body-nudge-start, 0.375rem);
1473
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
1474
+ padding-block: var(--bf-single-line-row-padding-block);
1343
1475
  padding-inline-start: var(--bf-tick-label-offset);
1344
1476
  position: relative;
1345
1477
  }
@@ -1370,7 +1502,7 @@ html.u-baseline-grid::after {
1370
1502
  border-left: calc(var(--bf-border-width) * 2) solid var(--bf-color-background-default);
1371
1503
  inline-size: calc(var(--bf-control-visual-size) * 0.6);
1372
1504
  inset-inline-start: calc(var(--bf-control-visual-size) * 0.2);
1373
- inset-block-start: calc(var(--bf-tick-box-offset) + (var(--bf-control-visual-size) * 0.18));
1505
+ inset-block-start: calc(var(--bf-tick-box-offset) + (var(--bf-control-visual-size) * 0.18) + (var(--bf-border-width) * 2));
1374
1506
  opacity: 0;
1375
1507
  transform: rotate(-45deg);
1376
1508
  }
@@ -1408,20 +1540,19 @@ html.u-baseline-grid::after {
1408
1540
  }
1409
1541
 
1410
1542
  :where(.bf-theme) :where(.bf-checkbox-input:focus-visible + .bf-checkbox-label)::before {
1411
- outline: 2px solid var(--bf-color-focus);
1412
- outline-offset: 2px;
1543
+ outline: 0.125rem solid var(--bf-color-focus);
1544
+ outline-offset: 0.125rem;
1413
1545
  }
1414
1546
 
1415
1547
  :where(.bf-theme) :where(.bf-radio-input:focus-visible + .bf-radio-label)::before {
1416
- outline: 2px solid var(--bf-color-focus);
1417
- outline-offset: 2px;
1548
+ outline: 0.125rem solid var(--bf-color-focus);
1549
+ outline-offset: 0.125rem;
1418
1550
  }
1419
1551
 
1420
1552
  :where(.bf-theme) :where(.bf-switch) {
1421
1553
  align-items: flex-start;
1422
1554
  display: inline-flex;
1423
1555
  gap: var(--bf-field-gap);
1424
- min-block-size: var(--bf-switch-row-block-size);
1425
1556
  position: relative;
1426
1557
  }
1427
1558
 
@@ -1470,8 +1601,8 @@ html.u-baseline-grid::after {
1470
1601
  }
1471
1602
 
1472
1603
  :where(.bf-theme) :where(.bf-switch-input:focus-visible + .bf-switch-slider) {
1473
- outline: 2px solid var(--bf-color-focus);
1474
- outline-offset: 2px;
1604
+ outline: 0.125rem solid var(--bf-color-focus);
1605
+ outline-offset: 0.125rem;
1475
1606
  }
1476
1607
 
1477
1608
  :where(.bf-theme) :where(.bf-switch-input:disabled + .bf-switch-slider) {
@@ -1485,11 +1616,11 @@ html.u-baseline-grid::after {
1485
1616
  font-weight: var(--bf-body-font-weight, 400);
1486
1617
  line-height: var(--bf-body-line-height, 1.5rem);
1487
1618
  color: var(--bf-color-text-default);
1619
+ border-block: var(--bf-border-width) solid transparent;
1488
1620
  cursor: pointer;
1489
1621
  display: inline-block;
1490
- margin: 0 0 var(--bf-body-margin-bottom);
1491
- padding-block-end: 0;
1492
- padding-block-start: var(--bf-body-nudge-start, 0.375rem);
1622
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
1623
+ padding-block: var(--bf-single-line-row-padding-block);
1493
1624
  }
1494
1625
 
1495
1626
  :where(.bf-theme) :where(.bf-validation-message) {
@@ -1498,11 +1629,12 @@ html.u-baseline-grid::after {
1498
1629
  font-style: var(--bf-body-font-style, normal);
1499
1630
  font-weight: var(--bf-body-font-weight, 400);
1500
1631
  line-height: var(--bf-body-line-height, 1.5rem);
1632
+ border-block: var(--bf-border-width) solid transparent;
1501
1633
  color: var(--bf-color-text-muted);
1502
- margin: 0 0 var(--bf-body-margin-bottom);
1503
- padding-block-end: 0;
1504
- padding-block-start: var(--bf-body-nudge-start, 0.375rem);
1505
- padding-inline-start: calc(var(--bf-control-visual-size) + var(--bf-field-gap));
1634
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
1635
+ margin-inline-start: var(--bf-leading-mark-group-inset);
1636
+ padding-block: var(--bf-single-line-row-padding-block);
1637
+ padding-inline-start: var(--bf-leading-mark-offset);
1506
1638
  position: relative;
1507
1639
  }
1508
1640
 
@@ -1621,6 +1753,15 @@ html.u-baseline-grid::after {
1621
1753
  padding: 0;
1622
1754
  }
1623
1755
 
1756
+ /* A composite slider's numeric field owns the shared occupied row. Stretching
1757
+ the track within that real sibling height avoids a second nominal-height
1758
+ calculation that can diverge when rem borders are rasterised under zoom. */
1759
+ :where(.bf-theme) :where(.bf-slider:not(.is-stacked)):not(:where(.bf-field.is-range.is-stacked) :where(.bf-slider)) > :where(input[type='range']) {
1760
+ align-self: stretch;
1761
+ block-size: auto;
1762
+ margin-block: 0;
1763
+ }
1764
+
1624
1765
  :where(.bf-theme) :where(input[type='range']):focus:not(:focus-visible) {
1625
1766
  outline: none;
1626
1767
  }
@@ -1637,7 +1778,7 @@ html.u-baseline-grid::after {
1637
1778
  border: var(--bf-border-width) solid var(--bf-color-border-high-contrast);
1638
1779
  block-size: var(--bf-control-visual-size);
1639
1780
  border-radius: 50%;
1640
- box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 1px rgba(0, 0, 0, 0.2);
1781
+ box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 0.0625rem rgba(0, 0, 0, 0.2);
1641
1782
  inline-size: var(--bf-control-visual-size);
1642
1783
  margin-top: calc((var(--bf-slider-track-size) - var(--bf-control-visual-size)) / 2);
1643
1784
  }
@@ -1663,7 +1804,7 @@ html.u-baseline-grid::after {
1663
1804
  border: var(--bf-border-width) solid var(--bf-color-border-high-contrast);
1664
1805
  block-size: var(--bf-control-visual-size);
1665
1806
  border-radius: 50%;
1666
- box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 1px rgba(0, 0, 0, 0.2);
1807
+ box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 0.0625rem rgba(0, 0, 0, 0.2);
1667
1808
  inline-size: var(--bf-control-visual-size);
1668
1809
  }
1669
1810
 
@@ -1762,9 +1903,9 @@ html.u-baseline-grid::after {
1762
1903
  color: var(--bf-color-text-default);
1763
1904
  cursor: pointer;
1764
1905
  display: inline-block;
1765
- margin-bottom: calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-button-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
1766
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
1767
- padding-inline: var(--bf-control-inline-padding-action);
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);
1768
1909
  text-align: center;
1769
1910
  text-decoration: none;
1770
1911
  }
@@ -1782,6 +1923,13 @@ html.u-baseline-grid::after {
1782
1923
  background-color: var(--bf-color-background-hover);
1783
1924
  }
1784
1925
 
1926
+ /* Anchor buttons are controls, not prose links. Qualifying the element and
1927
+ * its interaction states prevents the generic anchor underline from leaking
1928
+ * through while leaving the explicit is-link variant unchanged. */
1929
+ :where(.bf-theme) :where(a.bf-button:not(.is-link):is(:hover, :active)) {
1930
+ text-decoration: none;
1931
+ }
1932
+
1785
1933
  :where(.bf-theme) :where(.bf-button:not(.is-base):is(:active, [aria-pressed='true'])) {
1786
1934
  background-color: var(--bf-color-background-active);
1787
1935
  }
@@ -1791,8 +1939,8 @@ html.u-baseline-grid::after {
1791
1939
  }
1792
1940
 
1793
1941
  :where(.bf-theme) :where(.bf-button, .bf-button.is-base):focus-visible {
1794
- outline: 2px solid var(--bf-color-focus);
1795
- outline-offset: 2px;
1942
+ outline: 0.125rem solid var(--bf-color-focus);
1943
+ outline-offset: 0.125rem;
1796
1944
  }
1797
1945
 
1798
1946
  /* ------------------------------------------------------------------ */
@@ -1864,7 +2012,7 @@ html.u-baseline-grid::after {
1864
2012
  background-color: transparent;
1865
2013
  color: var(--bf-color-link-default);
1866
2014
  text-decoration: underline;
1867
- text-decoration-thickness: 1px;
2015
+ text-decoration-thickness: 0.0625rem;
1868
2016
  text-underline-offset: 0.075em;
1869
2017
  }
1870
2018
 
@@ -1891,6 +2039,19 @@ html.u-baseline-grid::after {
1891
2039
  justify-content: center;
1892
2040
  }
1893
2041
 
2042
+ /* An icon-only flex button has no text line box to preserve the occupied
2043
+ * control rhythm. A zero-width metric strut restores the active body line
2044
+ * 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))) {
2046
+ column-gap: 0;
2047
+ }
2048
+
2049
+ :where(.bf-theme) :where(.bf-button.is-icon:not(:has(.bf-button-label)))::before {
2050
+ block-size: var(--bf-body-line-height);
2051
+ content: "";
2052
+ inline-size: 0;
2053
+ }
2054
+
1894
2055
  :where(.bf-theme) :where(.bf-button-label) {
1895
2056
  min-inline-size: 0;
1896
2057
  }
@@ -2051,7 +2212,7 @@ html.u-baseline-grid::after {
2051
2212
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-notice-border);
2052
2213
  color: var(--bf-color-text-default);
2053
2214
  display: flow-root;
2054
- margin-block: 0 var(--bf-section-space-shallow);
2215
+ margin: 0;
2055
2216
  max-inline-size: 100%;
2056
2217
  padding-block: var(--bf-space-2);
2057
2218
  padding-inline: var(--bf-space-2);
@@ -2097,16 +2258,15 @@ html.u-baseline-grid::after {
2097
2258
  /* ------------------------------------------------------------------ */
2098
2259
  /* Static content ports — Vanilla data spotlight and divided section. */
2099
2260
  /* Their children retain role-owned rhythm; these layout */
2100
- /* wrappers add only structural columns, rules, and explicit section ends. */
2261
+ /* wrappers add only structural columns, rules, and internal gaps. */
2101
2262
  /* ------------------------------------------------------------------ */
2102
2263
 
2103
2264
  /* Data spotlight: Vanilla's equal-height wrap becomes an intrinsic grid.
2104
2265
  Each item begins with a public highlighted rule using the shared emphasis
2105
- thickness. Item padding remains item-owned, so compositions never erase the
2106
- shallow inter-row rhythm when the pattern narrows. */
2266
+ thickness. The items container owns every inter-row gap. */
2107
2267
  :where(.bf-theme) :where(.bf-data-spotlight) {
2108
2268
  container-type: inline-size;
2109
- margin-block-end: var(--bf-section-space);
2269
+ margin: 0;
2110
2270
  min-inline-size: 0;
2111
2271
  }
2112
2272
 
@@ -2119,15 +2279,13 @@ html.u-baseline-grid::after {
2119
2279
  display: grid;
2120
2280
  grid-template-columns: minmax(0, 1fr);
2121
2281
  min-inline-size: 0;
2282
+ row-gap: var(--bf-section-space-shallow);
2122
2283
  }
2123
2284
 
2124
2285
  :where(.bf-theme) :where(.bf-data-spotlight-item) {
2125
2286
  min-inline-size: 0;
2126
2287
  overflow-wrap: anywhere;
2127
- }
2128
-
2129
- :where(.bf-theme) :where(.bf-data-spotlight-item:not(:last-child)) {
2130
- padding-block-end: var(--bf-section-space-shallow);
2288
+ padding: 0;
2131
2289
  }
2132
2290
 
2133
2291
  :where(.bf-theme) :where(.bf-data-spotlight-stat) {
@@ -2180,6 +2338,14 @@ html.u-baseline-grid::after {
2180
2338
  @container (width >= 38.75rem) {
2181
2339
  :where(.bf-theme) :where(.bf-data-spotlight-items) {
2182
2340
  grid-template-columns: repeat(2, minmax(0, 1fr));
2341
+ row-gap: var(--bf-space-1);
2342
+ }
2343
+
2344
+ :where(.bf-theme) :where(.bf-data-spotlight-items)::after {
2345
+ block-size: calc(var(--bf-section-space-shallow) - (var(--bf-space-1) * 2));
2346
+ content: "";
2347
+ grid-column: 1 / -1;
2348
+ grid-row: 6;
2183
2349
  }
2184
2350
 
2185
2351
  :where(.bf-theme) :where(.bf-data-spotlight-header, .bf-data-spotlight-item) {
@@ -2188,10 +2354,6 @@ html.u-baseline-grid::after {
2188
2354
  grid-template-rows: subgrid;
2189
2355
  }
2190
2356
 
2191
- :where(.bf-theme) :where(.bf-data-spotlight-item) {
2192
- padding-block-end: 0;
2193
- }
2194
-
2195
2357
  :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-header) {
2196
2358
  block-size: 0;
2197
2359
  overflow: visible;
@@ -2199,7 +2361,13 @@ html.u-baseline-grid::after {
2199
2361
 
2200
2362
  :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
2201
2363
  :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-child(-n + 2)) {
2202
- padding-block-end: var(--bf-section-space-shallow);
2364
+ grid-row: span 5;
2365
+ }
2366
+
2367
+ :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-item:nth-of-type(2)),
2368
+ :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:nth-of-type(n + 2)),
2369
+ :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-of-type(n + 3)) {
2370
+ grid-row: 7 / span 5;
2203
2371
  }
2204
2372
  }
2205
2373
 
@@ -2212,15 +2380,18 @@ html.u-baseline-grid::after {
2212
2380
  grid-template-columns: repeat(4, minmax(0, 1fr));
2213
2381
  }
2214
2382
 
2383
+ :where(.bf-theme) :where(.bf-data-spotlight-items)::after {
2384
+ content: none;
2385
+ }
2386
+
2215
2387
  :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-header) {
2216
2388
  block-size: 0;
2217
2389
  grid-column: span 2;
2218
2390
  overflow: visible;
2219
2391
  }
2220
2392
 
2221
- :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
2222
- :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-child(-n + 2)) {
2223
- padding-block-end: 0;
2393
+ :where(.bf-theme) :where(.bf-data-spotlight-item) {
2394
+ grid-row: span 5;
2224
2395
  }
2225
2396
  }
2226
2397
 
@@ -2229,7 +2400,7 @@ html.u-baseline-grid::after {
2229
2400
  headings, copy, and content items keep their own metric-derived rhythm. */
2230
2401
  :where(.bf-theme) :where(.bf-divided-section) {
2231
2402
  container-type: inline-size;
2232
- margin-block-end: var(--bf-section-space);
2403
+ margin: 0;
2233
2404
  min-inline-size: 0;
2234
2405
  }
2235
2406
 
@@ -2248,37 +2419,41 @@ html.u-baseline-grid::after {
2248
2419
  }
2249
2420
 
2250
2421
  :where(.bf-theme) :where(.bf-divided-section-list) {
2251
- align-content: start;
2252
- display: grid;
2422
+ --bf-divided-section-rule-to-content: calc(0.5rem - var(--bf-border-width));
2423
+ --bf-stack-space: 1.5rem;
2253
2424
  list-style: none;
2254
2425
  margin: 0;
2255
2426
  padding: 0;
2256
2427
  }
2257
2428
 
2429
+ /* Preserve the pre-0.1.5 list markup; canonical composition also carries
2430
+ bf-stack so the container remains the explicit owner of item spacing. */
2431
+ :where(.bf-theme) :where(.bf-divided-section-list:not(.bf-stack)) {
2432
+ align-content: start;
2433
+ display: grid;
2434
+ gap: var(--bf-stack-space);
2435
+ }
2436
+
2258
2437
  :where(.bf-theme) :where(.bf-divided-section-item) {
2259
2438
  align-content: start;
2260
2439
  display: grid;
2440
+ margin: 0;
2261
2441
  min-inline-size: 0;
2262
2442
  overflow-wrap: anywhere;
2443
+ padding: 0;
2444
+ position: relative;
2263
2445
  }
2264
2446
 
2265
- :where(.bf-theme) :where(.bf-divided-section-item:not(:last-child)) {
2266
- padding-block-end: var(--bf-section-space-shallow);
2267
- }
2268
-
2269
- :where(.bf-theme) :where(.bf-divided-section-item + .bf-divided-section-item) {
2270
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
2271
- padding-block-start: calc(var(--bf-section-space-shallow) - var(--bf-border-width));
2272
- }
2273
-
2274
- @container (width >= 38.75rem) {
2275
- :where(.bf-theme) :where(.bf-divided-section.is-split-medium) :where(.bf-divided-section-layout) {
2276
- column-gap: var(--bf-grid-gap-inline);
2277
- grid-template-columns: repeat(2, minmax(0, 1fr));
2278
- }
2447
+ :where(.bf-theme) :where(.bf-divided-section-item + .bf-divided-section-item)::before {
2448
+ background: var(--bf-color-border-low-contrast);
2449
+ block-size: var(--bf-border-width);
2450
+ content: "";
2451
+ inset-block-start: calc((var(--bf-divided-section-rule-to-content) + var(--bf-border-width)) * -1);
2452
+ inset-inline: 0;
2453
+ position: absolute;
2279
2454
  }
2280
2455
 
2281
- @container (width >= 64.75rem) {
2456
+ @container (width >= 45rem) {
2282
2457
  :where(.bf-theme) :where(.bf-divided-section) :where(.bf-divided-section-layout) {
2283
2458
  column-gap: var(--bf-grid-gap-inline);
2284
2459
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -2363,12 +2538,13 @@ html.u-baseline-grid::after {
2363
2538
  border: var(--bf-border-width) solid var(--bf-color-border-default);
2364
2539
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-notification-accent);
2365
2540
  color: var(--bf-color-text-default);
2366
- margin-block: 0 var(--bf-space-3);
2541
+ margin-block: 0;
2367
2542
  max-inline-size: 100%;
2368
2543
  min-inline-size: 0;
2369
2544
  overflow-wrap: anywhere;
2370
- padding-block: calc(var(--bf-space-1) - var(--bf-border-width));
2371
- padding-inline: calc((var(--bf-space-2) * 2) + var(--bf-icon-size-default)) 0;
2545
+ padding-block-end: max(0rem, calc(var(--bf-space-half) - var(--bf-border-width)));
2546
+ padding-block-start: 0;
2547
+ padding-inline: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness)) var(--bf-space-1);
2372
2548
  position: relative;
2373
2549
  }
2374
2550
 
@@ -2391,14 +2567,14 @@ html.u-baseline-grid::after {
2391
2567
  :where(.bf-theme) :where(.bf-notification.is-borderless) {
2392
2568
  border: 0;
2393
2569
  padding-block: 0;
2394
- padding-inline: calc(var(--bf-space-2) * 2) 0;
2570
+ padding-inline: calc(var(--bf-icon-size-default) + var(--bf-space-1)) 0;
2395
2571
  }
2396
2572
 
2397
2573
  :where(.bf-theme) :where(.bf-notification-icon) {
2398
2574
  background-color: var(--bf-notification-accent);
2399
2575
  background-image: none;
2400
- inset-block-start: calc(var(--bf-space-1) + ((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start));
2401
- inset-inline-start: var(--bf-space-2);
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));
2402
2578
  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");
2403
2579
  mask-position: center;
2404
2580
  mask-repeat: no-repeat;
@@ -2419,22 +2595,52 @@ html.u-baseline-grid::after {
2419
2595
  }
2420
2596
 
2421
2597
  :where(.bf-theme) :where(.bf-notification.is-borderless > .bf-notification-icon) {
2422
- inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start));
2598
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start));
2423
2599
  inset-inline-start: 0;
2424
2600
  }
2425
2601
 
2602
+ :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));
2604
+ }
2605
+
2426
2606
  :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
2427
2607
  max-inline-size: 100%;
2428
2608
  min-inline-size: 0;
2429
2609
  }
2430
2610
 
2431
2611
  :where(.bf-theme) :where(.bf-notification-content) {
2432
- margin-block-end: calc(var(--bf-space-2) - var(--bf-body-nudge-start));
2433
- padding-block-start: var(--bf-body-nudge-start);
2434
- padding-inline-end: var(--bf-space-4);
2612
+ /* Neutralise the shell's top border so the first metric role starts on-grid. */
2613
+ margin-block: calc(var(--bf-border-width) * -1) 0;
2614
+ padding-block-start: 0;
2615
+ padding-inline-end: calc(var(--bf-icon-size-default) + var(--bf-space-1));
2616
+ }
2617
+
2618
+ :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-content) {
2619
+ --bf-stack-space: 0rem;
2620
+ margin-block-start: 0;
2621
+ }
2622
+
2623
+ /* Metadata-bearing notifications use a full baseline between title and copy,
2624
+ and pair it with the full end inset. This keeps both the metadata boundary
2625
+ and the complete shell on-grid; simpler messages retain compact rhythm. */
2626
+ :where(.bf-theme) :where(.bf-notification:has(> .bf-notification-meta)) {
2627
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width));
2628
+ }
2629
+
2630
+ :where(.bf-theme) :where(.bf-notification.is-inline) {
2631
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width));
2632
+ }
2633
+
2634
+ /* Return the cancelled H6/body metric edges to the shell boundary. The
2635
+ * Documentation tier deliberately gives those roles different metrics, so
2636
+ * deriving this inset keeps every bordered notification on-grid without
2637
+ * reopening the visible title/copy gap. Keep this after the shell variants so
2638
+ * the metric relationship owns their final compensation. */
2639
+ :where(.bf-theme) :where(.bf-notification:has(> .bf-notification-content.is-metric-flush):not(.is-borderless)) {
2640
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width) + var(--bf-baseline) - var(--bf-h6-nudge-start) - var(--bf-body-margin-bottom));
2435
2641
  }
2436
2642
 
2437
- :where(.bf-theme) :where(.bf-notification-title, .bf-notification-message, .bf-notification-timestamp) {
2643
+ :where(.bf-theme) :where(.bf-notification-message, .bf-notification-timestamp) {
2438
2644
  font-family: var(--bf-body-font-family);
2439
2645
  font-size: var(--bf-body-font-size);
2440
2646
  font-style: var(--bf-body-font-style);
@@ -2442,20 +2648,11 @@ html.u-baseline-grid::after {
2442
2648
  max-inline-size: 100%;
2443
2649
  }
2444
2650
 
2445
- :where(.bf-theme) :where(.bf-notification-title) {
2446
- font-weight: 600;
2447
- margin-block: 0;
2448
- padding-block: 0;
2449
- }
2450
-
2451
2651
  :where(.bf-theme) :where(.bf-notification-message) {
2452
2652
  font-weight: var(--bf-body-font-weight);
2453
- margin-block: 0;
2454
- padding-block: 0;
2455
- }
2456
-
2457
- :where(.bf-theme) :where(.bf-notification.is-inline .bf-notification-title, .bf-notification.is-inline .bf-notification-message) {
2458
- display: inline;
2653
+ margin-block: 0 var(--bf-body-margin-bottom);
2654
+ padding-block-end: 0;
2655
+ padding-block-start: var(--bf-body-nudge-start);
2459
2656
  }
2460
2657
 
2461
2658
  :where(.bf-theme) :where(.bf-notification-close) {
@@ -2465,8 +2662,8 @@ html.u-baseline-grid::after {
2465
2662
  margin-block-end: 0;
2466
2663
  padding: 0;
2467
2664
  position: absolute;
2468
- inset-block-start: var(--bf-space-1);
2469
- inset-inline-end: var(--bf-space-1);
2665
+ inset-block-start: 0;
2666
+ inset-inline-end: 0;
2470
2667
  }
2471
2668
 
2472
2669
  :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-close) {
@@ -2481,7 +2678,7 @@ html.u-baseline-grid::after {
2481
2678
  flex-wrap: wrap;
2482
2679
  gap: var(--bf-space-1) var(--bf-space-2);
2483
2680
  justify-content: space-between;
2484
- margin-block-end: var(--bf-space-1);
2681
+ margin-block-end: 0;
2485
2682
  padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
2486
2683
  padding-inline-end: var(--bf-space-2);
2487
2684
  }
@@ -2494,7 +2691,7 @@ html.u-baseline-grid::after {
2494
2691
  :where(.bf-theme) :where(.bf-notification-timestamp) {
2495
2692
  color: var(--bf-color-text-muted);
2496
2693
  font-weight: var(--bf-body-font-weight);
2497
- margin-block: 0 calc(var(--bf-space-2) - var(--bf-body-nudge-start));
2694
+ margin-block: 0 var(--bf-body-margin-bottom);
2498
2695
  padding-block: var(--bf-body-nudge-start) 0;
2499
2696
  }
2500
2697
 
@@ -2509,7 +2706,7 @@ html.u-baseline-grid::after {
2509
2706
 
2510
2707
  :where(.bf-theme) :where(.bf-notification-actions > .bf-button.is-link) {
2511
2708
  flex: 0 0 auto;
2512
- margin-block-end: calc(var(--bf-space-2) - var(--bf-body-nudge-start));
2709
+ margin-block-end: var(--bf-body-margin-bottom);
2513
2710
  padding-block: var(--bf-body-nudge-start) 0;
2514
2711
  }
2515
2712
 
@@ -2529,10 +2726,10 @@ html.u-baseline-grid::after {
2529
2726
  cursor: inherit;
2530
2727
  display: inline-block;
2531
2728
  font: inherit;
2532
- margin: -2px calc(var(--bf-space-half) * -1);
2729
+ margin: -0.125rem calc(var(--bf-space-half) * -1);
2533
2730
  max-inline-size: 100%;
2534
2731
  overflow: hidden;
2535
- padding: 2px var(--bf-space-half);
2732
+ padding: 0.125rem var(--bf-space-half);
2536
2733
  text-align: inherit;
2537
2734
  text-decoration: inherit;
2538
2735
  text-overflow: inherit;
@@ -2543,7 +2740,7 @@ html.u-baseline-grid::after {
2543
2740
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort]:hover, .bf-table-sort-button:focus-visible) {
2544
2741
  color: var(--bf-color-link-default);
2545
2742
  text-decoration: underline;
2546
- text-decoration-thickness: 1px;
2743
+ text-decoration-thickness: 0.0625rem;
2547
2744
  text-underline-offset: 0.075em;
2548
2745
  }
2549
2746
 
@@ -2552,11 +2749,11 @@ html.u-baseline-grid::after {
2552
2749
  }
2553
2750
 
2554
2751
  :where(.bf-theme) :where(.bf-table-sort-button:focus-visible) {
2555
- outline: 2px solid var(--bf-color-focus);
2556
- outline-offset: -2px;
2752
+ outline: 0.125rem solid var(--bf-color-focus);
2753
+ outline-offset: -0.125rem;
2557
2754
  }
2558
2755
 
2559
- :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
2756
+ :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort])::after {
2560
2757
  background-image: var(--bf-ui-icon-chevron-down);
2561
2758
  background-position: center;
2562
2759
  background-repeat: no-repeat;
@@ -2566,9 +2763,14 @@ html.u-baseline-grid::after {
2566
2763
  display: inline-block;
2567
2764
  inline-size: var(--bf-icon-size-default);
2568
2765
  margin-inline-start: var(--bf-space-half);
2766
+ opacity: 0;
2569
2767
  vertical-align: calc((1cap - var(--bf-icon-size-default)) / 2);
2570
2768
  }
2571
2769
 
2770
+ :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
2771
+ opacity: 1;
2772
+ }
2773
+
2572
2774
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'])::after {
2573
2775
  transform: rotate(180deg);
2574
2776
  }
@@ -2605,9 +2807,9 @@ html.u-baseline-grid::after {
2605
2807
  }
2606
2808
 
2607
2809
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > thead) {
2608
- block-size: 1px;
2810
+ block-size: 0.0625rem;
2609
2811
  clip-path: inset(50%);
2610
- inline-size: 1px;
2812
+ inline-size: 0.0625rem;
2611
2813
  overflow: hidden;
2612
2814
  position: absolute;
2613
2815
  white-space: nowrap;
@@ -2678,7 +2880,7 @@ html.u-baseline-grid::after {
2678
2880
  :where(.bf-theme) :where(.bf-logo-section) {
2679
2881
  container-name: bf-logo-section;
2680
2882
  container-type: inline-size;
2681
- margin-block-end: var(--bf-section-space-shallow);
2883
+ margin: 0;
2682
2884
  min-inline-size: 0;
2683
2885
  }
2684
2886
 
@@ -2712,8 +2914,8 @@ html.u-baseline-grid::after {
2712
2914
  }
2713
2915
 
2714
2916
  :where(.bf-theme) :where(.bf-logo-section-link:focus-visible) {
2715
- outline: 2px solid var(--bf-color-focus);
2716
- outline-offset: 2px;
2917
+ outline: 0.125rem solid var(--bf-color-focus);
2918
+ outline-offset: 0.125rem;
2717
2919
  }
2718
2920
 
2719
2921
  :where(.bf-theme) :where(.bf-logo-section-logo) {
@@ -2740,7 +2942,7 @@ html.u-baseline-grid::after {
2740
2942
  inline-size: 100%;
2741
2943
  }
2742
2944
 
2743
- /* Vanilla's small breakpoint is 620px. The items descendant, rather than the
2945
+ /* Vanilla's small breakpoint is 38.75rem. The items descendant, rather than the
2744
2946
  query container itself, responds when its allocated space reaches it. */
2745
2947
  @container bf-logo-section (width >= 38.75rem) {
2746
2948
  :where(.bf-theme) :where(.bf-logo-section-items) {
@@ -2764,19 +2966,21 @@ html.u-baseline-grid::after {
2764
2966
 
2765
2967
  /* ------------------------------------------------------------------ */
2766
2968
  /* Media object — semantic media/content slots with a container-owned */
2767
- /* structural collapse only. Content roles retain their own spacing. */
2969
+ /* structural collapse. Content roles retain their metric boxes. */
2768
2970
  /* ------------------------------------------------------------------ */
2769
2971
 
2770
2972
  :where(.bf-theme) :where(.bf-media-object) {
2771
- margin-block-end: var(--bf-section-space-shallow);
2973
+ container-name: bf-media-object;
2974
+ container-type: inline-size;
2975
+ margin: 0;
2772
2976
  min-inline-size: 0;
2773
2977
  }
2774
2978
 
2775
2979
  :where(.bf-theme) :where(.bf-media-object-layout) {
2776
- display: grid;
2777
2980
  align-items: start;
2778
- column-gap: var(--bf-space-2);
2779
- grid-template-columns: auto minmax(0, 1fr);
2981
+ column-gap: var(--bf-grid-gap-inline);
2982
+ display: grid;
2983
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2780
2984
  min-inline-size: 0;
2781
2985
  }
2782
2986
 
@@ -2788,6 +2992,10 @@ html.u-baseline-grid::after {
2788
2992
  min-inline-size: 0;
2789
2993
  }
2790
2994
 
2995
+ :where(.bf-theme) :where(.bf-media-object-media) {
2996
+ grid-column: 1 / span 2;
2997
+ }
2998
+
2791
2999
  :where(.bf-theme) :where(.bf-media-object-media > :where(img, picture, svg, video)) {
2792
3000
  block-size: 100%;
2793
3001
  display: block;
@@ -2802,6 +3010,7 @@ html.u-baseline-grid::after {
2802
3010
  }
2803
3011
 
2804
3012
  :where(.bf-theme) :where(.bf-media-object-content) {
3013
+ grid-column: 3 / -1;
2805
3014
  min-inline-size: 0;
2806
3015
  overflow-wrap: anywhere;
2807
3016
  }
@@ -2841,8 +3050,12 @@ html.u-baseline-grid::after {
2841
3050
  }
2842
3051
 
2843
3052
  :where(.bf-theme) :where(.bf-media-object-meta-list) {
3053
+ --bf-stack-space: var(--bf-space-1);
3054
+ align-content: start;
3055
+ display: grid;
3056
+ gap: var(--bf-stack-space);
2844
3057
  list-style: none;
2845
- margin: var(--bf-space-1) 0 0;
3058
+ margin: 0;
2846
3059
  padding: 0;
2847
3060
  }
2848
3061
 
@@ -2855,22 +3068,22 @@ html.u-baseline-grid::after {
2855
3068
  overflow-wrap: anywhere;
2856
3069
  }
2857
3070
 
2858
- :where(.bf-theme) :where(.bf-media-object-meta + .bf-media-object-meta) {
2859
- margin-block-start: var(--bf-space-1);
2860
- }
2861
-
2862
3071
  :where(.bf-theme) :where(.bf-media-object-meta .bf-icon) {
2863
3072
  margin-block-start: var(--bf-body-nudge-start);
2864
3073
  }
2865
3074
 
2866
- :where(.bf-theme) :where(.bf-media-object.is-media-end) :where(.bf-media-object-content) {
2867
- grid-column: 1;
2868
- grid-row: 1;
2869
- }
3075
+ @container bf-media-object (width >= 38.75rem) {
3076
+ :where(.bf-theme) :where(.bf-media-object-layout) {
3077
+ grid-template-columns: repeat(8, minmax(0, 1fr));
3078
+ }
2870
3079
 
2871
- :where(.bf-theme) :where(.bf-media-object.is-media-end) :where(.bf-media-object-media) {
2872
- grid-column: 2;
2873
- grid-row: 1;
3080
+ :where(.bf-theme) :where(.bf-media-object-media) {
3081
+ grid-column: 1 / span 2;
3082
+ }
3083
+
3084
+ :where(.bf-theme) :where(.bf-media-object-content) {
3085
+ grid-column: 3 / -1;
3086
+ }
2874
3087
  }
2875
3088
 
2876
3089
 
@@ -2881,20 +3094,13 @@ html.u-baseline-grid::after {
2881
3094
  :where(.bf-theme) :where(.bf-linked-logo-section) {
2882
3095
  container-name: bf-linked-logo-section;
2883
3096
  container-type: inline-size;
2884
- margin-block-end: var(--bf-section-space);
3097
+ margin: 0;
2885
3098
  min-inline-size: 0;
2886
3099
  }
2887
3100
 
2888
- :where(.bf-theme) :where(.bf-linked-logo-section.is-shallow) {
2889
- margin-block-end: var(--bf-section-space-shallow);
2890
- }
2891
-
2892
- :where(.bf-theme) :where(.bf-linked-logo-section.is-deep) {
2893
- margin-block-end: var(--bf-section-space-deep);
2894
- }
2895
-
2896
3101
  :where(.bf-theme) :where(.bf-linked-logo-section-layout) {
2897
3102
  display: grid;
3103
+ gap: var(--bf-section-space-shallow);
2898
3104
  grid-template-columns: minmax(0, 1fr);
2899
3105
  min-inline-size: 0;
2900
3106
  }
@@ -2927,7 +3133,7 @@ html.u-baseline-grid::after {
2927
3133
  max-inline-size: none;
2928
3134
  }
2929
3135
 
2930
- :where(.bf-theme) :where(.bf-linked-logo-section-card) {
3136
+ :where(.bf-theme) :where(a.bf-linked-logo-section-card) {
2931
3137
  align-content: start;
2932
3138
  align-items: stretch;
2933
3139
  color: inherit;
@@ -2939,7 +3145,7 @@ html.u-baseline-grid::after {
2939
3145
  text-decoration: none;
2940
3146
  }
2941
3147
 
2942
- :where(.bf-theme) :where(.bf-linked-logo-section-card:hover) :where(.bf-linked-logo-section-card-copy) {
3148
+ :where(.bf-theme) :where(a.bf-linked-logo-section-card:hover) :where(.bf-linked-logo-section-card-copy) {
2943
3149
  text-decoration: underline;
2944
3150
  }
2945
3151
 
@@ -2958,7 +3164,7 @@ html.u-baseline-grid::after {
2958
3164
  of baselines tall. Keep the visual ratio exact and put only the residual
2959
3165
  rhythm compensation after the mark; the copy keeps its own semantic
2960
3166
  spacing and the occupied card still lands on the tier grid. */
2961
- @supports (margin-block-end: round(up, 1px, 1px)) {
3167
+ @supports (margin-block-end: round(up, 0.0625rem, 0.0625rem)) {
2962
3168
  :where(.bf-theme) :where(.bf-linked-logo-section-mark) {
2963
3169
  margin-block-end: calc(
2964
3170
  round(up, calc(100cqi * 9 / 16), var(--bf-baseline))
@@ -2990,21 +3196,25 @@ html.u-baseline-grid::after {
2990
3196
  overflow-wrap: anywhere;
2991
3197
  }
2992
3198
 
2993
- /* Vanilla's linked-logo block moves from one to two cards per row at the
2994
- 4-column medium grid. The section itself does not split until the 8-column
2995
- large grid: its macro uses large-only grid columns for the 50/50 and 25/75
2996
- rails. The root establishes the query context; only descendants change. */
3199
+ /* The linked-logo block moves from one to two cards per row at the 4-column
3200
+ medium grid. The balanced 50/50 section split uses the shared readable
3201
+ threshold; the 25/75 content rail and four-card density retain their
3202
+ separately measured wide threshold. The root establishes the query context;
3203
+ only descendants change. */
2997
3204
  @container bf-linked-logo-section (width >= 38.75rem) {
2998
3205
  :where(.bf-theme) :where(.bf-linked-logo-section-logos) :where(.bf-logo-section-items) {
2999
3206
  grid-template-columns: repeat(2, minmax(0, 1fr));
3000
3207
  }
3001
3208
  }
3002
3209
 
3003
- @container bf-linked-logo-section (width >= 64.75rem) {
3210
+ @container bf-linked-logo-section (width >= 45rem) {
3004
3211
  :where(.bf-theme) :where(.bf-linked-logo-section.is-50-50) :where(.bf-linked-logo-section-layout) {
3005
3212
  column-gap: var(--bf-grid-gap-inline);
3006
3213
  grid-template-columns: repeat(2, minmax(0, 1fr));
3007
3214
  }
3215
+ }
3216
+
3217
+ @container bf-linked-logo-section (width >= 64.75rem) {
3008
3218
 
3009
3219
  :where(.bf-theme) :where(.bf-linked-logo-section.is-25-75) :where(.bf-linked-logo-section-layout) {
3010
3220
  column-gap: var(--bf-grid-gap-inline);
@@ -3107,35 +3317,27 @@ html.u-baseline-grid::after {
3107
3317
  }
3108
3318
 
3109
3319
  /* A section title may be the route action without looking like body copy. */
3110
- :where(.bf-theme) :where(.bf-basic-section-title-link, .bf-basic-section-title-link:visited) {
3320
+ :where(.bf-theme) :where(a.bf-basic-section-title-link, a.bf-basic-section-title-link:visited) {
3111
3321
  color: var(--bf-color-link-default);
3112
3322
  text-decoration: none;
3113
3323
  }
3114
3324
 
3115
- :where(.bf-theme) :where(.bf-basic-section-title-link:hover) {
3325
+ :where(.bf-theme) :where(a.bf-basic-section-title-link:hover) {
3116
3326
  text-decoration: underline;
3117
3327
  text-decoration-thickness: var(--bf-border-width);
3118
3328
  text-underline-offset: 0.12em;
3119
3329
  }
3120
3330
 
3121
- /* Vanilla splits at medium only on request, otherwise at its large breakpoint.
3122
- The layout descendant reacts to the root container; the query never tries to
3331
+ /* A balanced section switches at the shared readable 50/50 threshold. The
3332
+ layout descendant reacts to the root container; the query never tries to
3123
3333
  restyle the container that established it. */
3124
- @container bf-basic-section (width >= 38.75rem) {
3125
- :where(.bf-theme) :where(.bf-basic-section.is-split-medium) :where(.bf-basic-section-layout) {
3334
+ @container bf-basic-section (width >= 45rem) {
3335
+ :where(.bf-theme) :where(.bf-basic-section-layout) {
3126
3336
  column-gap: var(--bf-grid-gap-inline);
3127
3337
  grid-template-columns: repeat(2, minmax(0, 1fr));
3128
3338
  }
3129
3339
  }
3130
3340
 
3131
- @container bf-basic-section (width >= 64.75rem) {
3132
- :where(.bf-theme) :where(.bf-basic-section:not(.is-split-medium)) :where(.bf-basic-section-layout) {
3133
- column-gap: var(--bf-grid-gap-inline);
3134
- grid-template-columns: repeat(2, minmax(0, 1fr));
3135
- }
3136
-
3137
- }
3138
-
3139
3341
  /* CTA section: Vanilla's 25/75 variant is an offset content rail. The full
3140
3342
  variant stays naturally full-width. Typography and action presentation are
3141
3343
  supplied by real heading elements and bf-cta-block. */
@@ -3149,19 +3351,23 @@ html.u-baseline-grid::after {
3149
3351
  display: grid;
3150
3352
  grid-template-columns: minmax(0, 1fr);
3151
3353
  min-inline-size: 0;
3152
- padding-block: calc(var(--bf-section-space-deep) / 2);
3153
3354
  }
3154
3355
 
3155
3356
  :where(.bf-theme) :where(.bf-cta-section-content) {
3357
+ --bf-stack-space: var(--bf-section-space-shallow);
3358
+ align-content: start;
3359
+ display: grid;
3360
+ gap: var(--bf-stack-space);
3156
3361
  min-inline-size: 0;
3157
3362
  overflow-wrap: anywhere;
3158
3363
  }
3159
3364
 
3160
- @container bf-cta-section (width >= 64.75rem) {
3161
- :where(.bf-theme) :where(.bf-cta-section-layout) {
3162
- padding-block: var(--bf-section-space-deep);
3163
- }
3365
+ :where(.bf-theme) :where(.bf-cta-section-copy) {
3366
+ min-inline-size: 0;
3367
+ overflow-wrap: anywhere;
3368
+ }
3164
3369
 
3370
+ @container bf-cta-section (width >= 64.75rem) {
3165
3371
  :where(.bf-theme) :where(.bf-cta-section.is-offset) :where(.bf-cta-section-layout) {
3166
3372
  column-gap: var(--bf-grid-gap-inline);
3167
3373
  grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
@@ -3229,15 +3435,15 @@ html.u-baseline-grid::after {
3229
3435
  /* semantic gaps and every text child keeps metric compensation. */
3230
3436
  /* ------------------------------------------------------------------ */
3231
3437
 
3232
- /* Hero: its deliberately asymmetric boundary mirrors the current Vanilla
3233
- section--hero: a compact arrival space, then the normal section exit. The
3234
- entry rule replaces one pixel of padding so it never changes the rhythm. */
3438
+ /* Hero: the compact arrival space belongs inside its entry rule. The outer
3439
+ stack owns the section exit, and the rule replaces one pixel of padding so
3440
+ it never changes the rhythm. */
3235
3441
  :where(.bf-theme) :where(.bf-hero) {
3236
3442
  border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
3237
3443
  container-name: bf-hero;
3238
3444
  container-type: inline-size;
3239
3445
  min-inline-size: 0;
3240
- padding-block-end: calc(var(--bf-section-space) / 2);
3446
+ padding-block-end: 0;
3241
3447
  padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
3242
3448
  }
3243
3449
 
@@ -3250,6 +3456,7 @@ html.u-baseline-grid::after {
3250
3456
 
3251
3457
  :where(.bf-theme) :where(.bf-hero-layout) {
3252
3458
  display: grid;
3459
+ gap: var(--bf-section-space-shallow);
3253
3460
  grid-template-columns: minmax(0, 1fr);
3254
3461
  min-inline-size: 0;
3255
3462
  }
@@ -3259,9 +3466,9 @@ html.u-baseline-grid::after {
3259
3466
  overflow-wrap: anywhere;
3260
3467
  }
3261
3468
 
3262
- /* The normal hero keeps title, supporting heading, chip, prose and CTA in a
3263
- semantic copy stack. Hero titles are h1 slots and supporting titles are h2
3264
- slots. */
3469
+ /* Legacy copy slots remain valid for signpost variants. The default arrival
3470
+ composition separates a title area from its supporting content area, and
3471
+ the demo composes each area with the public stack density modifiers. */
3265
3472
  :where(.bf-theme) :where(.bf-hero-copy) {
3266
3473
  align-content: start;
3267
3474
  display: grid;
@@ -3288,7 +3495,7 @@ html.u-baseline-grid::after {
3288
3495
  allocated a fluid grid track. Snap only the media block to the active tier
3289
3496
  baseline so the following semantic text remains on-grid; its inline track
3290
3497
  and the surrounding Vanilla proportions remain unchanged. */
3291
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3498
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3292
3499
  :where(.bf-theme) :where(.bf-hero-media > .bf-aspect, .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
3293
3500
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3294
3501
  }
@@ -3311,14 +3518,10 @@ html.u-baseline-grid::after {
3311
3518
  inline-size: 100%;
3312
3519
  }
3313
3520
 
3314
- /* Vanilla's desktop hero boundary is 1036px. The layout descendant responds
3315
- to the root container so embedding it in a narrower rail still collapses
3316
- correctly. */
3317
- /* The section boundary itself follows Vanilla's page-level desktop switch;
3318
- the composition below continues to react to the allocated container. */
3521
+ /* The section boundary follows the page-level desktop switch, while the
3522
+ two-column composition uses its measured intrinsic allocation below. */
3319
3523
  @media (width >= 64.75rem) {
3320
3524
  :where(.bf-theme) :where(.bf-hero) {
3321
- padding-block-end: var(--bf-section-space);
3322
3525
  padding-block-start: calc(var(--bf-space-3) - var(--bf-border-width));
3323
3526
  }
3324
3527
 
@@ -3327,7 +3530,7 @@ html.u-baseline-grid::after {
3327
3530
  }
3328
3531
  }
3329
3532
 
3330
- @container bf-hero (width >= 64.75rem) {
3533
+ @container bf-hero (width >= 45rem) {
3331
3534
  :where(.bf-theme) :where(.bf-hero-layout) {
3332
3535
  column-gap: var(--bf-grid-gap-inline);
3333
3536
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3347,9 +3550,10 @@ html.u-baseline-grid::after {
3347
3550
  }
3348
3551
  }
3349
3552
 
3350
- /* Vanilla can intentionally split the three proportioned layouts at its
3351
- medium threshold. The modifier changes only structural tracks. */
3352
- @container bf-hero (width >= 38.75rem) {
3553
+ /* The named variants retain their proportion but share the readable split
3554
+ threshold with the default hero. The modifier changes only structural
3555
+ tracks; it does not introduce an earlier cramped layout. */
3556
+ @container bf-hero (width >= 45rem) {
3353
3557
  :where(.bf-theme) :where(.bf-hero.is-split-medium) :where(.bf-hero-layout) {
3354
3558
  column-gap: var(--bf-grid-gap-inline);
3355
3559
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3369,14 +3573,10 @@ html.u-baseline-grid::after {
3369
3573
  :where(.bf-theme) :where(.bf-quote-wrapper) {
3370
3574
  container-name: bf-quote-wrapper;
3371
3575
  container-type: inline-size;
3372
- margin-block-end: var(--bf-section-space);
3576
+ margin: 0;
3373
3577
  min-inline-size: 0;
3374
3578
  }
3375
3579
 
3376
- :where(.bf-theme) :where(.bf-quote-wrapper.is-shallow) {
3377
- margin-block-end: var(--bf-section-space-shallow);
3378
- }
3379
-
3380
3580
  :where(.bf-theme) :where(.bf-quote-wrapper-header, .bf-quote-wrapper-layout, .bf-quote-wrapper-signpost, .bf-quote-wrapper-content, .bf-quote-wrapper-citation, .bf-quote-wrapper-media) {
3381
3581
  min-inline-size: 0;
3382
3582
  overflow-wrap: anywhere;
@@ -3423,7 +3623,7 @@ html.u-baseline-grid::after {
3423
3623
  /* The quote rail can also be a fractional grid track. Keep its media from
3424
3624
  introducing a sub-baseline row while leaving quotation and citation rhythm
3425
3625
  entirely baseline-compensated while its stack owns semantic gaps. */
3426
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3626
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3427
3627
  :where(.bf-theme) :where(.bf-quote-wrapper-signpost > :where(img, picture, svg), .bf-quote-wrapper-media > .bf-aspect) {
3428
3628
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3429
3629
  }
@@ -3462,8 +3662,47 @@ html.u-baseline-grid::after {
3462
3662
  }
3463
3663
 
3464
3664
  @container bf-quote-wrapper (width >= 64.75rem) {
3665
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) {
3666
+ grid-template-columns: repeat(8, minmax(0, 1fr));
3667
+ }
3668
+
3669
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) > :first-child {
3670
+ grid-column: 1 / span 6;
3671
+ }
3672
+
3673
+ :where(.bf-theme) :where(.bf-quote-wrapper-header-link) {
3674
+ grid-column: 7 / -1;
3675
+ }
3676
+
3677
+ :where(.bf-theme) :where(.bf-quote-wrapper-layout) {
3678
+ grid-template-columns: repeat(8, minmax(0, 1fr));
3679
+ }
3680
+
3681
+ :where(.bf-theme) :where(.bf-quote-wrapper-signpost) {
3682
+ grid-column: 1 / span 2;
3683
+ }
3684
+
3685
+ :where(.bf-theme) :where(.bf-quote-wrapper-content, .bf-quote-wrapper-content:only-child) {
3686
+ display: grid;
3687
+ grid-column: 3 / -1;
3688
+ grid-template-columns: subgrid;
3689
+ }
3690
+
3465
3691
  :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
3466
- grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
3692
+ grid-column: 1 / -1;
3693
+ grid-template-columns: subgrid;
3694
+ }
3695
+
3696
+ :where(.bf-theme) :where(.bf-quote-wrapper-prose) {
3697
+ grid-column: 1 / span 4;
3698
+ }
3699
+
3700
+ :where(.bf-theme) :where(.bf-quote-wrapper-citation) {
3701
+ grid-column: 5 / -1;
3702
+ }
3703
+
3704
+ :where(.bf-theme) :where(.bf-quote-wrapper-content) > :where(.bf-cta-block, .bf-quote-wrapper-media) {
3705
+ grid-column: 1 / -1;
3467
3706
  }
3468
3707
  }
3469
3708
 
@@ -3476,19 +3715,13 @@ html.u-baseline-grid::after {
3476
3715
  container-name: bf-rich-list;
3477
3716
  container-type: inline-size;
3478
3717
  min-inline-size: 0;
3479
- padding-block-end: calc(var(--bf-section-space) / 2);
3480
- }
3481
-
3482
- :where(.bf-theme) :where(.bf-rich-list.is-shallow) {
3483
- padding-block-end: var(--bf-section-space-shallow);
3484
- }
3485
-
3486
- :where(.bf-theme) :where(.bf-rich-list.is-deep) {
3487
- padding-block-end: calc(var(--bf-section-space-deep) / 2);
3488
3718
  }
3489
3719
 
3490
3720
  :where(.bf-theme) :where(.bf-rich-list-layout) {
3721
+ --bf-stack-space: var(--bf-space-1);
3722
+ align-content: start;
3491
3723
  display: grid;
3724
+ gap: var(--bf-stack-space);
3492
3725
  grid-template-columns: minmax(0, 1fr);
3493
3726
  min-inline-size: 0;
3494
3727
  }
@@ -3503,14 +3736,11 @@ html.u-baseline-grid::after {
3503
3736
  overflow-wrap: anywhere;
3504
3737
  }
3505
3738
 
3506
- @media (width >= 64.75rem) {
3507
- :where(.bf-theme) :where(.bf-rich-list:not(.is-shallow)) {
3508
- padding-block-end: var(--bf-section-space);
3509
- }
3510
-
3511
- :where(.bf-theme) :where(.bf-rich-list.is-deep) {
3512
- padding-block-end: var(--bf-section-space-deep);
3513
- }
3739
+ :where(.bf-theme) :where(.bf-rich-list-support, .bf-rich-list-content) {
3740
+ --bf-stack-space: var(--bf-space-1);
3741
+ align-content: start;
3742
+ display: grid;
3743
+ gap: var(--bf-stack-space);
3514
3744
  }
3515
3745
 
3516
3746
  /* ------------------------------------------------------------------ */
@@ -3537,7 +3767,7 @@ html.u-baseline-grid::after {
3537
3767
  /* A full-width ratio inside a fluid Sites rail otherwise leaves the next
3538
3768
  heading on a fractional pixel. The visual alone absorbs the trailing
3539
3769
  compensation; semantic children retain their own margins unchanged. */
3540
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3770
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3541
3771
  :where(.bf-theme) :where(.bf-rich-list-visual > .bf-aspect) {
3542
3772
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3543
3773
  }
@@ -3576,8 +3806,12 @@ html.u-baseline-grid::after {
3576
3806
 
3577
3807
  /* Prefixes are logical here even though the shared list predates BF's
3578
3808
  logical-property rule. This keeps ticks, bullets and numbers RTL-safe. */
3809
+ :where(.bf-theme) :where(.bf-rich-list-list:has(> .bf-list-item:is(.is-ticked, .is-crossed)), .bf-rich-list-list.is-bulleted, ol.bf-rich-list-list) {
3810
+ padding-inline-start: var(--bf-leading-mark-group-inset);
3811
+ }
3812
+
3579
3813
  :where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed) {
3580
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
3814
+ padding-inline-start: var(--bf-leading-mark-offset);
3581
3815
  }
3582
3816
 
3583
3817
  :where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed)::before {
@@ -3587,7 +3821,7 @@ html.u-baseline-grid::after {
3587
3821
  }
3588
3822
 
3589
3823
  :where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item) {
3590
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
3824
+ padding-inline-start: var(--bf-leading-mark-offset);
3591
3825
  }
3592
3826
 
3593
3827
  :where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item)::before {
@@ -3606,7 +3840,7 @@ html.u-baseline-grid::after {
3606
3840
 
3607
3841
  :where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item) {
3608
3842
  counter-increment: bf-rich-horizontal-counter;
3609
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
3843
+ padding-inline-start: var(--bf-leading-mark-offset);
3610
3844
  }
3611
3845
 
3612
3846
  :where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item)::before {
@@ -3653,7 +3887,7 @@ html.u-baseline-grid::after {
3653
3887
  }
3654
3888
  }
3655
3889
 
3656
- @container bf-rich-list (width >= 64.75rem) {
3890
+ @container bf-rich-list (width >= 45rem) {
3657
3891
  :where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) {
3658
3892
  column-gap: var(--bf-grid-gap-inline);
3659
3893
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3667,7 +3901,7 @@ html.u-baseline-grid::after {
3667
3901
  grid-column: 2;
3668
3902
  }
3669
3903
 
3670
- :where(.bf-theme) :where(.bf-rich-list.is-horizontal) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
3904
+ :where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
3671
3905
  grid-column: 2;
3672
3906
  }
3673
3907
  }
@@ -3682,7 +3916,6 @@ html.u-baseline-grid::after {
3682
3916
 
3683
3917
  :where(.bf-theme) :where(.bf-rich-list.is-vertical) :where(.bf-rich-list-media) {
3684
3918
  container-type: inline-size;
3685
- padding-block-end: var(--bf-section-space-shallow);
3686
3919
  }
3687
3920
 
3688
3921
  :where(.bf-theme) :where(.bf-rich-list.is-vertical.is-flipped) :where(.bf-rich-list-media) {
@@ -3701,7 +3934,7 @@ html.u-baseline-grid::after {
3701
3934
  /* The media object deliberately stretches across fluid 1/2 and 2/3 ratios.
3702
3935
  Snap that resulting block, rather than resetting content spacing, so each
3703
3936
  tier's baseline survives both portrait and landscape allocations. */
3704
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3937
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3705
3938
  :where(.bf-theme) :where(.bf-rich-list-media-frame) {
3706
3939
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3707
3940
  }
@@ -3744,11 +3977,7 @@ html.u-baseline-grid::after {
3744
3977
  /* Auto height has no shallow media wrapper in Vanilla. At narrow widths it
3745
3978
  remains a normal 3:2 frame; at the wide split it stretches with the content
3746
3979
  rail, clamped between the equivalent 16:9 and 2:3 heights. */
3747
- :where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) {
3748
- padding-block-end: 0;
3749
- }
3750
-
3751
- @container bf-rich-list (width >= 64.75rem) {
3980
+ @container bf-rich-list (width >= 45rem) {
3752
3981
  :where(.bf-theme) :where(.bf-rich-list.is-vertical) > :where(.bf-rich-list-layout) {
3753
3982
  align-items: stretch;
3754
3983
  column-gap: var(--bf-grid-gap-inline);
@@ -3797,7 +4026,7 @@ html.u-baseline-grid::after {
3797
4026
  min-block-size: 56.25cqi;
3798
4027
  }
3799
4028
 
3800
- @supports (min-block-size: round(up, 1px, 1px)) {
4029
+ @supports (min-block-size: round(up, 0.0625rem, 0.0625rem)) {
3801
4030
  :where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) :where(.bf-rich-list-media-frame) {
3802
4031
  max-block-size: round(down, 150cqi, var(--bf-baseline));
3803
4032
  min-block-size: round(up, 56.25cqi, var(--bf-baseline));
@@ -3815,6 +4044,7 @@ html.u-baseline-grid::after {
3815
4044
 
3816
4045
 
3817
4046
  :where(.bf-theme) :where(.bf-panel) {
4047
+ --bf-panel-content-padding-inline: var(--bf-component-inline-inset-continuation);
3818
4048
  background: var(--bf-color-background-default);
3819
4049
  color: var(--bf-color-text-default);
3820
4050
  display: flex;
@@ -3837,6 +4067,9 @@ html.u-baseline-grid::after {
3837
4067
  overscroll-behavior: contain;
3838
4068
  }
3839
4069
 
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. */
3840
4073
  :where(.bf-theme) :where(.bf-panel-header) {
3841
4074
  align-items: start;
3842
4075
  display: flex;
@@ -3845,7 +4078,7 @@ html.u-baseline-grid::after {
3845
4078
  justify-content: space-between;
3846
4079
  padding-block-end: var(--bf-panel-padding-block);
3847
4080
  padding-block-start: var(--bf-panel-padding-block);
3848
- padding-inline: var(--bf-panel-padding-inline);
4081
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
3849
4082
  }
3850
4083
 
3851
4084
  /* A navigation brand keeps the Canonical tag attached to the panel's top edge
@@ -3855,17 +4088,13 @@ html.u-baseline-grid::after {
3855
4088
  gap: 0;
3856
4089
  padding-block: 0;
3857
4090
  padding-inline-end: 0;
3858
- padding-inline-start: var(--bf-panel-padding-inline);
4091
+ padding-inline-start: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
3859
4092
  }
3860
4093
 
3861
4094
  :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
3862
4095
  inline-size: 100%;
3863
4096
  }
3864
4097
 
3865
- :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) :where(.bf-top-navigation-logo-title) {
3866
- transform: translateY(var(--bf-navigation-brand-title-optical-offset-block));
3867
- }
3868
-
3869
4098
  :where(.bf-theme) :where(.bf-panel-header) > :where(.bf-panel-title) {
3870
4099
  min-inline-size: 0;
3871
4100
  }
@@ -3886,10 +4115,10 @@ html.u-baseline-grid::after {
3886
4115
  flex-wrap: wrap;
3887
4116
  gap: var(--bf-field-gap);
3888
4117
  justify-content: space-between;
3889
- min-block-size: calc(var(--bf-control-box-size-compact) + (var(--bf-panel-padding-block) * 2));
4118
+ min-block-size: calc(var(--bf-control-box-size-compact) + var(--bf-panel-padding-block));
3890
4119
  padding-block-end: var(--bf-panel-padding-block);
3891
- padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
3892
- padding-inline: var(--bf-panel-padding-inline);
4120
+ padding-block-start: 0;
4121
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
3893
4122
  }
3894
4123
 
3895
4124
  :where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
@@ -3951,8 +4180,8 @@ html.u-baseline-grid::after {
3951
4180
  }
3952
4181
 
3953
4182
  :where(.bf-theme) :where(.bf-panel-toggle:focus-visible) {
3954
- outline: 2px solid var(--bf-color-focus);
3955
- outline-offset: 2px;
4183
+ outline: 0.125rem solid var(--bf-color-focus);
4184
+ outline-offset: 0.125rem;
3956
4185
  }
3957
4186
 
3958
4187
  :where(.bf-theme) :where(.bf-panel-content) {
@@ -3960,7 +4189,7 @@ html.u-baseline-grid::after {
3960
4189
  min-block-size: 0;
3961
4190
  padding-block-end: var(--bf-panel-padding-block);
3962
4191
  padding-block-start: var(--bf-panel-padding-block);
3963
- padding-inline: var(--bf-panel-padding-inline);
4192
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
3964
4193
  }
3965
4194
 
3966
4195
  :where(.bf-theme) :where(.bf-panel-content.is-flush) {
@@ -3985,7 +4214,7 @@ html.u-baseline-grid::after {
3985
4214
  overflow: auto;
3986
4215
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
3987
4216
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
3988
- padding-inline: var(--bf-panel-padding-inline);
4217
+ padding-inline: var(--bf-component-inline-inset-continuation);
3989
4218
  }
3990
4219
 
3991
4220
  :where(.bf-theme) :where(.bf-card.is-highlighted) {
@@ -4010,7 +4239,7 @@ html.u-baseline-grid::after {
4010
4239
 
4011
4240
  :where(.bf-theme) :where(a.bf-card:hover, a.bf-card.is-highlighted:hover, a.bf-card.is-overlay:hover, a.bf-card.is-muted:hover) {
4012
4241
  border-color: var(--bf-color-focus);
4013
- transform: translateY(-1px);
4242
+ transform: translateY(-0.0625rem);
4014
4243
  }
4015
4244
 
4016
4245
  :where(.bf-theme) :where(a.bf-card:focus:not(:focus-visible), a.bf-card.is-highlighted:focus:not(:focus-visible), a.bf-card.is-overlay:focus:not(:focus-visible), a.bf-card.is-muted:focus:not(:focus-visible)) {
@@ -4018,8 +4247,8 @@ html.u-baseline-grid::after {
4018
4247
  }
4019
4248
 
4020
4249
  :where(.bf-theme) :where(a.bf-card:focus-visible, a.bf-card.is-highlighted:focus-visible, a.bf-card.is-overlay:focus-visible, a.bf-card.is-muted:focus-visible) {
4021
- outline: 2px solid var(--bf-color-focus);
4022
- outline-offset: -2px;
4250
+ outline: 0.125rem solid var(--bf-color-focus);
4251
+ outline-offset: -0.125rem;
4023
4252
  }
4024
4253
 
4025
4254
  :where(.bf-theme) :where(.bf-card.is-preview) {
@@ -4102,7 +4331,7 @@ html.u-baseline-grid::after {
4102
4331
  min-inline-size: 0;
4103
4332
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4104
4333
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4105
- padding-inline: var(--bf-panel-padding-inline);
4334
+ padding-inline: var(--bf-component-inline-inset-continuation);
4106
4335
  text-align: left;
4107
4336
  }
4108
4337
 
@@ -4115,7 +4344,7 @@ html.u-baseline-grid::after {
4115
4344
  :where(.bf-theme) :where(button.bf-option-card:hover:not(:disabled)) {
4116
4345
  background: var(--bf-color-background-hover);
4117
4346
  border-color: var(--bf-color-focus);
4118
- transform: translateY(-1px);
4347
+ transform: translateY(-0.0625rem);
4119
4348
  }
4120
4349
 
4121
4350
  :where(.bf-theme) :where(.bf-option-card.is-active),
@@ -4126,8 +4355,8 @@ html.u-baseline-grid::after {
4126
4355
  }
4127
4356
 
4128
4357
  :where(.bf-theme) :where(button.bf-option-card:focus-visible) {
4129
- outline: 2px solid var(--bf-color-focus);
4130
- outline-offset: -2px;
4358
+ outline: 0.125rem solid var(--bf-color-focus);
4359
+ outline-offset: -0.125rem;
4131
4360
  }
4132
4361
 
4133
4362
  :where(.bf-theme) :where(.bf-option-card-label) {
@@ -4175,7 +4404,7 @@ html.u-baseline-grid::after {
4175
4404
  /* Snap the grid-row wrapper after intrinsic image/copy measurement. Because
4176
4405
  the card flexes inside it, peers retain Vanilla's equal-height row while
4177
4406
  the card edge and the following row both land on BF baselines. */
4178
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
4407
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
4179
4408
  :where(.bf-theme) :where(.bf-content-card-wrapper) {
4180
4409
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
4181
4410
  }
@@ -4352,7 +4581,7 @@ html.u-baseline-grid::after {
4352
4581
  text-transform: var(--bf-h1-text-transform);
4353
4582
  }
4354
4583
 
4355
- :where(.bf-theme) :where(.bf-content-card-main-link) {
4584
+ :where(.bf-theme) :where(a.bf-content-card-main-link) {
4356
4585
  -webkit-box-orient: vertical;
4357
4586
  -webkit-line-clamp: 3;
4358
4587
  color: inherit;
@@ -4372,7 +4601,7 @@ html.u-baseline-grid::after {
4372
4601
  z-index: 1;
4373
4602
  }
4374
4603
 
4375
- :where(.bf-theme) :where(.bf-content-card-main-link:is(:hover, :focus, :active, :visited)) {
4604
+ :where(.bf-theme) :where(a.bf-content-card-main-link:is(:hover, :focus, :active, :visited)) {
4376
4605
  color: inherit;
4377
4606
  text-decoration: none;
4378
4607
  }
@@ -4382,8 +4611,8 @@ html.u-baseline-grid::after {
4382
4611
  }
4383
4612
 
4384
4613
  :where(.bf-theme) :where(.bf-content-card:has(.bf-content-card-main-link:focus-visible)) {
4385
- outline: 3px solid var(--bf-color-focus);
4386
- outline-offset: 2px;
4614
+ outline: 0.1875rem solid var(--bf-color-focus);
4615
+ outline-offset: 0.125rem;
4387
4616
  }
4388
4617
 
4389
4618
  /* All nested actions sit above the expanded main-link hit area. This includes
@@ -4459,6 +4688,7 @@ html.u-baseline-grid::after {
4459
4688
  min-inline-size: 0;
4460
4689
  overflow-x: auto;
4461
4690
  padding-block-end: var(--bf-space-1);
4691
+ padding-block-start: calc(0.5rem - var(--bf-border-width));
4462
4692
  padding-inline: var(--bf-space-2);
4463
4693
  position: relative;
4464
4694
  scrollbar-width: none;
@@ -4496,11 +4726,11 @@ html.u-baseline-grid::after {
4496
4726
 
4497
4727
  /* Internal geometry responds to the card's allocated width. The card root is
4498
4728
  only the container; the frame/media/body descendants own queried styles. */
4499
- /* Vanilla switches the viewport at 620px/1036px. A four-column card is much
4729
+ /* Vanilla switches the viewport at 38.75rem/64.75rem. A four-column card is much
4500
4730
  narrower than that viewport after grid margins and gutters, so its internal
4501
- horizontal layout uses Vanilla's 460px minimum viable allocation. The
4502
- eight-column 50/50 split starts at the roughly 960px allocation left by the
4503
- 1036px viewport. This preserves the rendered switch in embedded BF grids. */
4731
+ horizontal layout uses Vanilla's 28.75rem minimum viable allocation. The
4732
+ eight-column 50/50 split starts at the roughly 60rem allocation left by the
4733
+ 64.75rem viewport. This preserves the rendered switch in embedded BF grids. */
4504
4734
  @container bf-content-card (width < 28.75rem) {
4505
4735
  :where(.bf-theme) :where(.bf-content-card-frame:not(:has(.bf-content-card-footer))) {
4506
4736
  min-block-size: 0;
@@ -4652,18 +4882,16 @@ html.u-baseline-grid::after {
4652
4882
 
4653
4883
  :where(.bf-theme) :where(.bf-tabs) {
4654
4884
  display: grid;
4885
+ gap: var(--bf-space-2);
4655
4886
  min-inline-size: 0;
4656
4887
  }
4657
4888
 
4658
4889
  :where(.bf-theme) :where(.bf-tabs-list) {
4659
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-default);
4890
+ box-shadow: inset 0 calc(var(--bf-border-width) * -1) 0 var(--bf-color-border-default);
4660
4891
  display: flex;
4661
4892
  gap: 0;
4662
4893
  list-style: none;
4663
- /* Tabs keep their occupied block on the grid at the list boundary rather
4664
- than leaving each link's control compensation between its active rule and
4665
- the list rule. */
4666
- margin: 0 0 calc((var(--bf-baseline) * 2) - var(--bf-border-width));
4894
+ margin: 0;
4667
4895
  min-inline-size: 0;
4668
4896
  overflow-x: auto;
4669
4897
  padding: 0;
@@ -4685,16 +4913,16 @@ html.u-baseline-grid::after {
4685
4913
  align-items: center;
4686
4914
  background: transparent;
4687
4915
  border: 0;
4688
- border-bottom: var(--bf-bar-thickness) solid transparent;
4916
+ border-block: var(--bf-border-width) solid transparent;
4689
4917
  color: var(--bf-color-text-muted);
4690
4918
  cursor: pointer;
4691
- display: inline-flex;
4919
+ display: flex;
4692
4920
  gap: calc(var(--bf-baseline) * 0.5);
4693
4921
  justify-content: center;
4694
4922
  margin-bottom: 0;
4695
- padding-block-end: calc(var(--bf-body-nudge-end) + var(--bf-baseline) - var(--bf-bar-thickness));
4696
- padding-block-start: var(--bf-body-nudge-start);
4697
- padding-inline: var(--bf-control-inline-padding-action);
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);
4925
+ padding-inline: var(--bf-component-inline-inset-action);
4698
4926
  text-decoration: none;
4699
4927
  }
4700
4928
 
@@ -4703,18 +4931,22 @@ html.u-baseline-grid::after {
4703
4931
  color: var(--bf-color-text-default);
4704
4932
  }
4705
4933
 
4934
+ :where(.bf-theme) :where(a.bf-tabs-link:hover) {
4935
+ text-decoration: none;
4936
+ }
4937
+
4706
4938
  :where(.bf-theme) :where(.bf-tabs-link:focus:not(:focus-visible)) {
4707
4939
  outline: none;
4708
4940
  }
4709
4941
 
4710
4942
  :where(.bf-theme) :where(.bf-tabs-link:focus-visible) {
4711
4943
  color: var(--bf-color-text-default);
4712
- outline: 2px solid var(--bf-color-focus);
4713
- outline-offset: -2px;
4944
+ outline: 0.125rem solid var(--bf-color-focus);
4945
+ outline-offset: -0.125rem;
4714
4946
  }
4715
4947
 
4716
4948
  :where(.bf-theme) :where(.bf-tabs-link.is-active, .bf-tabs-link[aria-selected='true']) {
4717
- border-bottom-color: var(--bf-color-text-default);
4949
+ box-shadow: inset 0 calc(var(--bf-bar-thickness) * -1) 0 var(--bf-color-text-default);
4718
4950
  color: var(--bf-color-text-default);
4719
4951
  }
4720
4952
 
@@ -4764,10 +4996,10 @@ html.u-baseline-grid::after {
4764
4996
  display: grid;
4765
4997
  gap: calc(var(--bf-baseline) * 0.75);
4766
4998
  grid-template-columns: auto minmax(0, 1fr) auto;
4767
- margin: 0 0 calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-button-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
4999
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
4768
5000
  min-inline-size: 0;
4769
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
4770
- padding-inline: var(--bf-control-inline-padding-field);
5001
+ padding-block: var(--bf-single-line-row-padding-block);
5002
+ padding-inline: var(--bf-component-inline-inset-field);
4771
5003
  }
4772
5004
 
4773
5005
  :where(.bf-theme) :where(.bf-choice-row:hover) {
@@ -4775,8 +5007,8 @@ html.u-baseline-grid::after {
4775
5007
  }
4776
5008
 
4777
5009
  :where(.bf-theme) :where(.bf-choice-row:has(:focus-visible)) {
4778
- outline: 2px solid var(--bf-color-focus);
4779
- outline-offset: -2px;
5010
+ outline: 0.125rem solid var(--bf-color-focus);
5011
+ outline-offset: -0.125rem;
4780
5012
  }
4781
5013
 
4782
5014
  :where(.bf-theme) :where(.bf-choice-row input[type='radio']) {
@@ -4823,7 +5055,7 @@ html.u-baseline-grid::after {
4823
5055
  gap: var(--bf-field-gap);
4824
5056
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4825
5057
  padding-block-start: var(--bf-panel-padding-block);
4826
- padding-inline: var(--bf-panel-padding-inline);
5058
+ padding-inline: var(--bf-component-inline-inset-continuation);
4827
5059
  }
4828
5060
 
4829
5061
  :where(.bf-theme) :where(.bf-inline-options-heading) {
@@ -4897,11 +5129,11 @@ html.u-baseline-grid::after {
4897
5129
  cursor: pointer;
4898
5130
  display: inline-flex;
4899
5131
  justify-content: center;
4900
- margin-bottom: calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-button-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
5132
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
4901
5133
  max-inline-size: 100%;
4902
5134
  overflow: hidden;
4903
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
4904
- padding-inline: var(--bf-control-inline-padding-action);
5135
+ padding-block: var(--bf-single-line-row-padding-block);
5136
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
4905
5137
  text-align: center;
4906
5138
  text-decoration: none;
4907
5139
  text-overflow: ellipsis;
@@ -4927,8 +5159,8 @@ html.u-baseline-grid::after {
4927
5159
  }
4928
5160
 
4929
5161
  :where(.bf-theme) :where(.bf-segmented-control-button:focus-visible, .bf-tab-buttons-button:focus-visible) {
4930
- outline: 2px solid var(--bf-color-focus);
4931
- outline-offset: -2px;
5162
+ outline: 0.125rem solid var(--bf-color-focus);
5163
+ outline-offset: -0.125rem;
4932
5164
  z-index: 2;
4933
5165
  }
4934
5166
 
@@ -4962,8 +5194,10 @@ html.u-baseline-grid::after {
4962
5194
  font-weight: var(--bf-body-font-weight, 400);
4963
5195
  line-height: var(--bf-body-line-height, 1.5rem);
4964
5196
  color: var(--bf-color-text-muted);
4965
- margin: 0;
5197
+ margin: 0 0 var(--bf-body-margin-bottom);
4966
5198
  min-inline-size: 0;
5199
+ padding-block-end: 0;
5200
+ padding-block-start: var(--bf-body-nudge-start);
4967
5201
  }
4968
5202
 
4969
5203
  :where(.bf-theme) :where(.bf-breadcrumbs-item) + :where(.bf-breadcrumbs-item)::before {
@@ -4994,26 +5228,35 @@ html.u-baseline-grid::after {
4994
5228
  :where(.bf-theme) :where(.bf-tab-section) {
4995
5229
  container-name: bf-tab-section;
4996
5230
  container-type: inline-size;
4997
- margin-block-end: var(--bf-section-space);
5231
+ margin: 0;
4998
5232
  min-inline-size: 0;
4999
5233
  }
5000
5234
 
5001
- :where(.bf-theme) :where(.bf-tab-section.is-shallow) {
5002
- margin-block-end: var(--bf-section-space-shallow);
5235
+ :where(.bf-theme) :where(.bf-tab-section-layout) {
5236
+ display: grid;
5237
+ grid-template-columns: minmax(0, 1fr);
5238
+ min-inline-size: 0;
5003
5239
  }
5004
5240
 
5005
- :where(.bf-theme) :where(.bf-tab-section.is-deep) {
5006
- margin-block-end: var(--bf-section-space-deep);
5241
+ :where(.bf-theme) :where(.bf-tab-section-rule) {
5242
+ grid-column: 1 / -1;
5007
5243
  }
5008
5244
 
5009
- :where(.bf-theme) :where(.bf-tab-section-layout) {
5245
+ :where(.bf-theme) :where(.bf-tab-section-body) {
5246
+ --bf-stack-space: var(--bf-section-space-shallow);
5247
+ align-content: start;
5010
5248
  display: grid;
5249
+ gap: var(--bf-stack-space);
5011
5250
  grid-template-columns: minmax(0, 1fr);
5012
5251
  min-inline-size: 0;
5013
5252
  }
5014
5253
 
5015
- :where(.bf-theme) :where(.bf-tab-section-rule) {
5016
- grid-column: 1 / -1;
5254
+ :where(.bf-theme) :where(.bf-tab-section-copy) {
5255
+ align-content: start;
5256
+ display: grid;
5257
+ grid-template-columns: minmax(0, 1fr);
5258
+ min-inline-size: 0;
5259
+ row-gap: var(--bf-space-1);
5017
5260
  }
5018
5261
 
5019
5262
  :where(.bf-theme) :where(.bf-tab-section-header, .bf-tab-section-intro, .bf-tab-section-tabs) {
@@ -5021,51 +5264,50 @@ html.u-baseline-grid::after {
5021
5264
  overflow-wrap: anywhere;
5022
5265
  }
5023
5266
 
5024
- /* Vanilla wraps every tab rail except the unadorned 50/50 special case in a
5025
- shallow section. This explicit composition padding does not change any
5026
- child's semantic margins. */
5027
- :where(.bf-theme) :where(.bf-tab-section:not(.is-50-50)) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs),
5028
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-tabs) {
5029
- padding-block-start: var(--bf-section-space-shallow);
5267
+ :where(.bf-theme) :where(.bf-tab-section-tabs) {
5268
+ align-self: start;
5030
5269
  }
5031
5270
 
5032
- @container bf-tab-section (width >= 64.75rem) {
5033
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) {
5271
+ @container bf-tab-section (width >= 45rem) {
5272
+ :where(.bf-theme) :where(.bf-tab-section-body) {
5034
5273
  column-gap: var(--bf-grid-gap-inline);
5035
5274
  grid-template-columns: repeat(4, minmax(0, 1fr));
5036
5275
  }
5037
5276
 
5038
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
5277
+ :where(.bf-theme) :where(.bf-tab-section-copy) {
5039
5278
  grid-column: 1 / -1;
5279
+ grid-template-columns: subgrid;
5040
5280
  }
5041
5281
 
5042
5282
  /* With supporting copy or actions, Vanilla's heading row is 50/50 for all
5043
5283
  three section layouts. The following tab rail retains its own requested
5044
5284
  full, half or three-quarter span. */
5045
- :where(.bf-theme) :where(.bf-tab-section-layout:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-header) {
5285
+ :where(.bf-theme) :where(.bf-tab-section-copy:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-header) {
5046
5286
  grid-column: 1 / 3;
5047
5287
  }
5048
5288
 
5049
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-intro) {
5289
+ :where(.bf-theme) :where(.bf-tab-section-copy) > :where(.bf-tab-section-intro) {
5050
5290
  grid-column: 3 / -1;
5051
5291
  }
5052
5292
 
5053
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5293
+ :where(.bf-theme) :where(.bf-tab-section-body) > :where(.bf-tab-section-tabs) {
5054
5294
  grid-column: 1 / -1;
5055
5295
  }
5056
5296
 
5057
5297
  /* An unadorned 50/50 section lets auto-placement put the heading and tabs
5058
5298
  in the same row. If an intro exists, it occupies that right-hand cell and
5059
5299
  the tabs move to the following row, matching the upstream rendering. */
5060
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
5300
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) :where(.bf-tab-section-copy:not(:has(> .bf-tab-section-intro))) {
5061
5301
  grid-column: 1 / 3;
5302
+ grid-row: 1;
5062
5303
  }
5063
5304
 
5064
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5305
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) :where(.bf-tab-section-copy:not(:has(> .bf-tab-section-intro))) + :where(.bf-tab-section-tabs) {
5065
5306
  grid-column: 3 / -1;
5307
+ grid-row: 1;
5066
5308
  }
5067
5309
 
5068
- :where(.bf-theme) :where(.bf-tab-section.is-25-75) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5310
+ :where(.bf-theme) :where(.bf-tab-section.is-25-75) :where(.bf-tab-section-body) > :where(.bf-tab-section-tabs) {
5069
5311
  grid-column: 2 / -1;
5070
5312
  }
5071
5313
  }
@@ -5076,11 +5318,11 @@ html.u-baseline-grid::after {
5076
5318
  container-type: inline-size;
5077
5319
  display: grid;
5078
5320
  grid-template-columns: auto minmax(0, 1fr);
5079
- margin-block-end: var(--bf-section-space-shallow);
5321
+ margin: 0;
5080
5322
  min-inline-size: 0;
5081
5323
  }
5082
5324
 
5083
- :where(.bf-theme) :where(.bf-article-pagination-link) {
5325
+ :where(.bf-theme) :where(a.bf-article-pagination-link) {
5084
5326
  background-color: var(--bf-color-background-default);
5085
5327
  border: var(--bf-border-width) solid transparent;
5086
5328
  box-sizing: border-box;
@@ -5096,8 +5338,9 @@ html.u-baseline-grid::after {
5096
5338
  text-decoration: none;
5097
5339
  }
5098
5340
 
5099
- :where(.bf-theme) :where(.bf-article-pagination-link:hover) {
5341
+ :where(.bf-theme) :where(a.bf-article-pagination-link:hover) {
5100
5342
  background-color: var(--bf-color-background-hover);
5343
+ text-decoration: none;
5101
5344
  }
5102
5345
 
5103
5346
  :where(.bf-theme) :where(.bf-article-pagination-link:focus:not(:focus-visible)) {
@@ -5105,8 +5348,8 @@ html.u-baseline-grid::after {
5105
5348
  }
5106
5349
 
5107
5350
  :where(.bf-theme) :where(.bf-article-pagination-link:focus-visible) {
5108
- outline: 2px solid var(--bf-color-focus);
5109
- outline-offset: 2px;
5351
+ outline: 0.125rem solid var(--bf-color-focus);
5352
+ outline-offset: 0.125rem;
5110
5353
  }
5111
5354
 
5112
5355
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous) {
@@ -5208,12 +5451,12 @@ html.u-baseline-grid::after {
5208
5451
 
5209
5452
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-label),
5210
5453
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-title) {
5211
- block-size: 1px;
5454
+ block-size: 0.0625rem;
5212
5455
  border: 0;
5213
5456
  clip: rect(0 0 0 0);
5214
5457
  clip-path: inset(50%);
5215
- inline-size: 1px;
5216
- margin: -1px;
5458
+ inline-size: 0.0625rem;
5459
+ margin: -0.0625rem;
5217
5460
  overflow: hidden;
5218
5461
  padding: 0;
5219
5462
  position: absolute;
@@ -5231,6 +5474,10 @@ html.u-baseline-grid::after {
5231
5474
  padding: 0;
5232
5475
  }
5233
5476
 
5477
+ :where(.bf-theme) :where(.bf-list:has(> .bf-list-item:is(.is-ticked, .is-crossed)), ol.bf-list.is-divided) {
5478
+ padding-inline-start: var(--bf-leading-mark-group-inset);
5479
+ }
5480
+
5234
5481
  :where(.bf-theme) :where(.bf-list-item) {
5235
5482
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
5236
5483
  font-size: var(--bf-body-font-size, 1rem);
@@ -5246,8 +5493,10 @@ html.u-baseline-grid::after {
5246
5493
  }
5247
5494
 
5248
5495
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item) {
5249
- box-shadow: inset 0 1px 0 var(--bf-color-border-low-contrast);
5250
- padding-block-end: var(--bf-baseline);
5496
+ border-block: var(--bf-border-width) solid transparent;
5497
+ 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);
5251
5500
  }
5252
5501
 
5253
5502
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item:first-child) {
@@ -5255,7 +5504,7 @@ html.u-baseline-grid::after {
5255
5504
  }
5256
5505
 
5257
5506
  :where(.bf-theme) :where(.bf-list-item.is-ticked, .bf-list-item.is-crossed) {
5258
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
5507
+ padding-inline-start: var(--bf-leading-mark-offset);
5259
5508
  position: relative;
5260
5509
  }
5261
5510
 
@@ -5280,10 +5529,6 @@ html.u-baseline-grid::after {
5280
5529
  background-image: var(--bf-ui-icon-error-grey);
5281
5530
  }
5282
5531
 
5283
- :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item.is-ticked, .bf-list-item.is-crossed)::before {
5284
- top: calc(var(--bf-leading-icon-offset) + (var(--bf-baseline) * 0.5));
5285
- }
5286
-
5287
5532
  :where(.bf-theme) :where(ol.bf-list.is-divided) {
5288
5533
  counter-reset: bf-list-counter;
5289
5534
  }
@@ -5365,11 +5610,11 @@ html.u-baseline-grid::after {
5365
5610
  background: var(--bf-color-background-alt);
5366
5611
  color: var(--bf-color-link-default);
5367
5612
  display: block;
5368
- left: -999px;
5613
+ left: -62.4375rem;
5369
5614
  max-inline-size: calc(100vw - var(--bf-baseline));
5370
5615
  position: absolute;
5371
5616
  text-decoration: none;
5372
- top: -999px;
5617
+ top: -62.4375rem;
5373
5618
  }
5374
5619
 
5375
5620
  :where(.bf-theme) :where(.bf-skip-link:hover) {
@@ -5378,7 +5623,7 @@ html.u-baseline-grid::after {
5378
5623
 
5379
5624
  :where(.bf-theme) :where(.bf-skip-link:focus, .bf-skip-link:focus-visible) {
5380
5625
  left: calc(var(--bf-baseline) * 0.5);
5381
- outline: 2px solid var(--bf-color-focus);
5626
+ outline: 0.125rem solid var(--bf-color-focus);
5382
5627
  outline-offset: 0;
5383
5628
  padding-block: calc(var(--bf-baseline) * 1.5);
5384
5629
  padding-inline: calc(var(--bf-baseline) * 1.5);
@@ -5429,15 +5674,16 @@ html.u-baseline-grid::after {
5429
5674
  line-height: var(--bf-table-row-line-height);
5430
5675
  margin: 0;
5431
5676
  overflow: hidden;
5432
- padding-block: var(--bf-table-row-padding);
5433
- padding-inline: calc(var(--bf-baseline) * 0.75);
5677
+ padding-block-end: var(--bf-table-row-padding-block-end);
5678
+ padding-block-start: var(--bf-table-row-padding-block-start);
5679
+ padding-inline: var(--bf-component-inline-inset-field);
5434
5680
  text-align: left;
5435
5681
  text-overflow: ellipsis;
5436
5682
  vertical-align: top;
5437
5683
  }
5438
5684
 
5439
5685
  :where(.bf-theme) :where(th.is-icon-placeholder, td.is-icon-placeholder, .bf-table-cell.is-icon-placeholder) {
5440
- padding-inline-start: calc((var(--bf-baseline) * 0.75) + var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
5686
+ padding-inline-start: calc(var(--bf-component-inline-inset-field) + var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
5441
5687
  }
5442
5688
 
5443
5689
  :where(.bf-theme) :where(th.is-icon-placeholder, td.is-icon-placeholder, .bf-table-cell.is-icon-placeholder) > :where(.bf-icon:first-child) {
@@ -5465,10 +5711,6 @@ html.u-baseline-grid::after {
5465
5711
  border-block-end-color: var(--bf-color-border-low-contrast);
5466
5712
  }
5467
5713
 
5468
- :where(.bf-theme) :where(tbody tr:has(.bf-status-label) > td) {
5469
- padding-block: calc((var(--bf-baseline) - var(--bf-table-row-border-size)) / 2);
5470
- }
5471
-
5472
5714
  :where(.bf-theme) :where(tbody tr:hover td) {
5473
5715
  background: color-mix(in srgb, var(--bf-color-background-hover) 68%, transparent);
5474
5716
  }
@@ -5489,21 +5731,23 @@ html.u-baseline-grid::after {
5489
5731
  align-items: baseline;
5490
5732
  background-color: var(--bf-ui-chip-background);
5491
5733
  border: var(--bf-border-width) solid var(--bf-ui-chip-border);
5492
- border-radius: 1rem;
5734
+ border-radius: var(--bf-ui-chip-radius);
5493
5735
  color: var(--bf-color-text-default);
5494
5736
  display: inline-flex;
5495
5737
  gap: 0;
5496
5738
  inline-size: fit-content;
5497
5739
  justify-self: start;
5498
- margin: 0 var(--bf-ui-chip-padding-inline) var(--bf-field-gap) 0;
5740
+ margin: 0 var(--bf-ui-chip-padding-inline) var(--bf-single-line-row-margin-block-end) 0;
5499
5741
  max-inline-size: 100%;
5500
- min-block-size: var(--bf-ui-chip-block-size);
5501
- padding-block: var(--bf-ui-chip-padding-block);
5502
- padding-inline: var(--bf-ui-chip-padding-inline);
5742
+ padding-block: var(--bf-single-line-row-padding-block);
5743
+ padding-inline: max(0rem, calc(var(--bf-ui-chip-padding-inline) - var(--bf-border-width)));
5503
5744
  position: relative;
5504
5745
  text-decoration: none;
5505
5746
  user-select: none;
5506
- vertical-align: calc(var(--bf-border-width) - var(--bf-body-nudge-start, 0.375rem));
5747
+ /* Inline-flex exposes the first text child's baseline. The surrounding
5748
+ border-aware row contract now matches buttons instead of inventing a
5749
+ second chip-only occupied height. */
5750
+ vertical-align: baseline;
5507
5751
  white-space: nowrap;
5508
5752
  }
5509
5753
 
@@ -5543,6 +5787,15 @@ html.u-baseline-grid::after {
5543
5787
  --bf-ui-chip-background-active: var(--bf-color-background-information-active);
5544
5788
  }
5545
5789
 
5790
+ :where(.bf-theme) :where(.bf-chip.is-borderless) {
5791
+ --bf-ui-chip-border: transparent;
5792
+ --bf-ui-chip-border-hover: transparent;
5793
+ --bf-ui-chip-border-active: transparent;
5794
+ --bf-ui-chip-background: transparent;
5795
+ --bf-ui-chip-background-hover: transparent;
5796
+ --bf-ui-chip-background-active: transparent;
5797
+ }
5798
+
5546
5799
  :where(.bf-theme) :where(.bf-chip, .bf-chip.is-positive, .bf-chip.is-caution, .bf-chip.is-negative, .bf-chip.is-information):hover {
5547
5800
  background-color: var(--bf-ui-chip-background-hover);
5548
5801
  border-color: var(--bf-ui-chip-border-hover);
@@ -5627,16 +5880,20 @@ html.u-baseline-grid::after {
5627
5880
  --bf-ui-status-background: color-mix(in srgb, var(--bf-color-background-alt) 70%, black);
5628
5881
  --bf-ui-status-color: var(--bf-color-button-positive-text);
5629
5882
  background-color: var(--bf-ui-status-background);
5883
+ border-block: var(--bf-border-width) solid transparent;
5630
5884
  color: var(--bf-ui-status-color);
5631
5885
  display: inline-block;
5886
+ inline-size: fit-content;
5887
+ justify-self: start;
5632
5888
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
5633
5889
  font-size: var(--bf-body-font-size, 1rem);
5634
5890
  font-style: var(--bf-body-font-style, normal);
5635
5891
  font-weight: var(--bf-body-font-weight, 400);
5636
5892
  line-height: var(--bf-body-line-height, 1.5rem);
5637
- margin: 0;
5638
- padding-block-end: var(--bf-h5-nudge-end);
5639
- padding-block-start: var(--bf-h5-nudge-start, 0.375rem);
5893
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
5894
+ /* Status paint is physically symmetric and shares the same occupied block
5895
+ as a button; typography still comes from the body role. */
5896
+ padding-block: var(--bf-single-line-row-padding-block);
5640
5897
  padding-inline: var(--bf-ui-chip-padding-inline);
5641
5898
  text-align: center;
5642
5899
  text-decoration: none;
@@ -5663,6 +5920,38 @@ html.u-baseline-grid::after {
5663
5920
  --bf-ui-status-color: var(--bf-color-button-negative-text);
5664
5921
  }
5665
5922
 
5923
+ /* Nested auxiliary surfaces fit a body-sized flex/grid host instead of
5924
+ carrying a second standalone occupied-row contract. This modifier is
5925
+ explicit so component density never changes merely because of ancestry. */
5926
+ :where(.bf-theme) :where(.bf-chip.is-nested, .bf-status-label.is-nested) {
5927
+ line-height: var(--bf-nested-auxiliary-line-height);
5928
+ margin-block: 0;
5929
+ padding-block: var(--bf-nested-auxiliary-padding-block);
5930
+ }
5931
+
5932
+ :where(.bf-theme) :where(.bf-chip.is-nested) {
5933
+ border: 0;
5934
+ box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-ui-chip-border);
5935
+ }
5936
+
5937
+ :where(.bf-theme) :where(.bf-chip.is-nested:hover) {
5938
+ box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-ui-chip-border-hover);
5939
+ }
5940
+
5941
+ :where(.bf-theme) :where(.bf-chip.is-nested:is(:active, [aria-pressed='true'], .is-selected)) {
5942
+ box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-ui-chip-border-active);
5943
+ }
5944
+
5945
+ :where(.bf-theme) :where(.bf-status-label.is-nested) {
5946
+ border-block-width: 0;
5947
+ }
5948
+
5949
+ :where(.bf-theme) :where(.bf-badge.is-nested) {
5950
+ align-self: center;
5951
+ line-height: var(--bf-nested-auxiliary-line-height);
5952
+ vertical-align: middle;
5953
+ }
5954
+
5666
5955
 
5667
5956
  :where(.bf-theme) :where(.bf-chip-dismiss, .bf-search-box-reset, .bf-search-and-filter-clear) {
5668
5957
  appearance: none;
@@ -5674,7 +5963,7 @@ html.u-baseline-grid::after {
5674
5963
  margin: 0;
5675
5964
  padding: 0;
5676
5965
  position: relative;
5677
- text-indent: -9999px;
5966
+ text-indent: -624.9375rem;
5678
5967
  }
5679
5968
 
5680
5969
  :where(.bf-theme) :where(.bf-chip-dismiss) {
@@ -5686,7 +5975,7 @@ html.u-baseline-grid::after {
5686
5975
  :where(.bf-theme) :where(.bf-chip-dismiss, .bf-search-box-reset, .bf-search-and-filter-clear)::before,
5687
5976
  :where(.bf-theme) :where(.bf-chip-dismiss, .bf-search-box-reset, .bf-search-and-filter-clear)::after {
5688
5977
  background: currentColor;
5689
- block-size: 2px;
5978
+ block-size: 0.125rem;
5690
5979
  content: "";
5691
5980
  inline-size: 0.75rem;
5692
5981
  left: 50%;
@@ -5704,7 +5993,7 @@ html.u-baseline-grid::after {
5704
5993
 
5705
5994
 
5706
5995
  :where(.bf-theme) :where(.bf-search-box) {
5707
- --bf-search-box-action-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
5996
+ --bf-search-box-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
5708
5997
  --bf-search-box-trailing-inline-size: calc((var(--bf-search-box-action-inline-size) * 2) + var(--bf-border-width));
5709
5998
  display: flex;
5710
5999
  inline-size: 100%;
@@ -5721,12 +6010,12 @@ html.u-baseline-grid::after {
5721
6010
 
5722
6011
  :where(.bf-theme) :where(.bf-search-box-reset, .bf-search-box-button) {
5723
6012
  align-items: center;
5724
- block-size: var(--bf-control-box-size);
6013
+ block-size: auto;
5725
6014
  display: inline-flex;
5726
6015
  inline-size: var(--bf-search-box-action-inline-size);
6016
+ inset-block: 0;
5727
6017
  justify-content: center;
5728
6018
  position: absolute;
5729
- top: 0;
5730
6019
  }
5731
6020
 
5732
6021
  :where(.bf-theme) :where(.bf-search-box-reset) {
@@ -5743,7 +6032,7 @@ html.u-baseline-grid::after {
5743
6032
  inset-inline-end: var(--bf-border-width);
5744
6033
  margin: 0;
5745
6034
  padding: 0;
5746
- text-indent: -9999px;
6035
+ text-indent: -624.9375rem;
5747
6036
  }
5748
6037
 
5749
6038
  :where(.bf-theme) :where(.bf-search-box-button)::before {
@@ -5770,8 +6059,8 @@ html.u-baseline-grid::after {
5770
6059
  }
5771
6060
 
5772
6061
  :where(.bf-theme) :where(.bf-search-box-reset:focus-visible, .bf-search-box-button:focus-visible) {
5773
- outline: 2px solid var(--bf-color-focus);
5774
- outline-offset: -2px;
6062
+ outline: 0.125rem solid var(--bf-color-focus);
6063
+ outline-offset: -0.125rem;
5775
6064
  }
5776
6065
 
5777
6066
  :where(.bf-theme) :where(.bf-search-and-filter) {
@@ -5786,7 +6075,7 @@ html.u-baseline-grid::after {
5786
6075
  :where(.bf-theme) :where(.bf-search-and-filter-search-container) {
5787
6076
  align-items: stretch;
5788
6077
  background: transparent;
5789
- box-shadow: inset 0 -1px 0 var(--bf-color-border-high-contrast);
6078
+ box-shadow: inset 0 -0.0625rem 0 var(--bf-color-border-high-contrast);
5790
6079
  display: flex;
5791
6080
  flex-wrap: wrap;
5792
6081
  gap: var(--bf-field-gap);
@@ -5802,7 +6091,7 @@ html.u-baseline-grid::after {
5802
6091
  }
5803
6092
 
5804
6093
  :where(.bf-theme) :where(.bf-search-and-filter-box) {
5805
- --bf-search-and-filter-action-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
6094
+ --bf-search-and-filter-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
5806
6095
  --bf-search-and-filter-trailing-inline-size: calc(var(--bf-search-and-filter-action-inline-size) * 2);
5807
6096
  display: inline-flex;
5808
6097
  flex: 1 1 12rem;
@@ -5819,17 +6108,17 @@ html.u-baseline-grid::after {
5819
6108
  :where(.bf-theme) :where(.bf-search-and-filter-search-button) {
5820
6109
  appearance: none;
5821
6110
  background: transparent;
5822
- block-size: var(--bf-control-box-size);
6111
+ block-size: auto;
5823
6112
  border: 0;
5824
6113
  color: var(--bf-color-text-default);
5825
6114
  cursor: pointer;
5826
6115
  inline-size: var(--bf-search-and-filter-action-inline-size);
6116
+ inset-block: 0;
5827
6117
  inset-inline-end: 0;
5828
6118
  margin: 0;
5829
6119
  padding: 0;
5830
6120
  position: absolute;
5831
- text-indent: -9999px;
5832
- top: 0;
6121
+ text-indent: -624.9375rem;
5833
6122
  }
5834
6123
 
5835
6124
  :where(.bf-theme) :where(.bf-search-and-filter-search-button)::before {
@@ -5856,16 +6145,16 @@ html.u-baseline-grid::after {
5856
6145
  }
5857
6146
 
5858
6147
  :where(.bf-theme) :where(.bf-search-and-filter-search-button:focus-visible, .bf-search-and-filter-selected-count:focus-visible) {
5859
- outline: 2px solid var(--bf-color-focus);
5860
- outline-offset: -2px;
6148
+ outline: 0.125rem solid var(--bf-color-focus);
6149
+ outline-offset: -0.125rem;
5861
6150
  }
5862
6151
 
5863
6152
  :where(.bf-theme) :where(.bf-search-and-filter-clear) {
5864
- block-size: var(--bf-control-box-size);
6153
+ block-size: auto;
5865
6154
  inline-size: var(--bf-search-and-filter-action-inline-size);
6155
+ inset-block: 0;
5866
6156
  inset-inline-end: var(--bf-search-and-filter-action-inline-size);
5867
6157
  position: absolute;
5868
- top: 0;
5869
6158
  }
5870
6159
 
5871
6160
  :where(.bf-theme) :where(.bf-search-and-filter-selected-count) {
@@ -5895,12 +6184,12 @@ html.u-baseline-grid::after {
5895
6184
  background-color: var(--bf-color-background-inputs);
5896
6185
  border: var(--bf-border-width) solid var(--bf-color-border-default);
5897
6186
  border-top: 0;
5898
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
6187
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
5899
6188
  display: grid;
5900
6189
  gap: var(--bf-field-gap);
5901
6190
  opacity: 1;
5902
6191
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
5903
- padding-inline: var(--bf-panel-padding-inline);
6192
+ padding-inline: var(--bf-component-inline-inset-continuation);
5904
6193
  padding-top: var(--bf-panel-padding-block);
5905
6194
  position: absolute;
5906
6195
  top: 100%;
@@ -5945,12 +6234,6 @@ html.u-baseline-grid::after {
5945
6234
  }
5946
6235
 
5947
6236
  :where(.bf-theme) :where(.bf-filter-panel-section-heading) {
5948
- font-family: var(--bf-h6-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
5949
- font-size: var(--bf-h6-font-size, 1rem);
5950
- font-style: var(--bf-h6-font-style, normal);
5951
- font-weight: var(--bf-h6-font-weight, 400);
5952
- line-height: var(--bf-h6-line-height, 1.5rem);
5953
- color: var(--bf-color-text-muted);
5954
6237
  margin: 0;
5955
6238
  padding-block: 0;
5956
6239
  }
@@ -5997,7 +6280,7 @@ html.u-baseline-grid::after {
5997
6280
  :where(.bf-theme) :where(.bf-list-tree) {
5998
6281
  list-style: none;
5999
6282
  margin: 0;
6000
- padding-left: calc(var(--bf-baseline) * 0.5);
6283
+ padding-left: 0;
6001
6284
  }
6002
6285
 
6003
6286
  :where(.bf-theme) :where(.bf-list-tree) :where(.bf-list-tree) {
@@ -6011,27 +6294,29 @@ html.u-baseline-grid::after {
6011
6294
  }
6012
6295
 
6013
6296
  :where(.bf-theme) :where(.bf-list-tree-item) {
6297
+ display: grid;
6014
6298
  margin: 0;
6015
- padding-left: calc(var(--bf-baseline) * 1.5);
6299
+ padding-left: 0;
6016
6300
  position: relative;
6017
6301
  }
6018
6302
 
6019
- :where(.bf-theme) :where(.bf-list-tree-link) {
6303
+ :where(.bf-theme) :where(a.bf-list-tree-link) {
6020
6304
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
6021
6305
  font-size: var(--bf-body-font-size, 1rem);
6022
6306
  font-style: var(--bf-body-font-style, normal);
6023
6307
  font-weight: var(--bf-body-font-weight, 400);
6024
6308
  line-height: var(--bf-body-line-height, 1.5rem);
6025
6309
  color: var(--bf-color-text-default);
6310
+ border-block: var(--bf-border-width) solid transparent;
6026
6311
  cursor: pointer;
6027
6312
  display: block;
6028
- margin: 0;
6029
- min-block-size: var(--bf-control-box-size-compact);
6030
- padding-block: var(--bf-control-block-padding-compact);
6313
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6314
+ padding-block: var(--bf-single-line-row-padding-block);
6315
+ padding-inline: var(--bf-component-inline-inset-continuation) var(--bf-component-inline-inset-action);
6031
6316
  text-decoration: none;
6032
6317
  }
6033
6318
 
6034
- :where(.bf-theme) :where(.bf-list-tree-link):hover {
6319
+ :where(.bf-theme) :where(a.bf-list-tree-link:hover) {
6035
6320
  color: var(--bf-color-link-default);
6036
6321
  text-decoration: underline;
6037
6322
  }
@@ -6045,8 +6330,8 @@ html.u-baseline-grid::after {
6045
6330
  }
6046
6331
 
6047
6332
  :where(.bf-theme) :where(.bf-list-tree-link):focus-visible {
6048
- outline: 2px solid var(--bf-color-focus);
6049
- outline-offset: -2px;
6333
+ outline: 0.125rem solid var(--bf-color-focus);
6334
+ outline-offset: -0.125rem;
6050
6335
  }
6051
6336
 
6052
6337
  :where(.bf-theme) :where(.bf-list-tree-toggle) {
@@ -6058,14 +6343,14 @@ html.u-baseline-grid::after {
6058
6343
  align-items: center;
6059
6344
  background: transparent;
6060
6345
  border: 0;
6346
+ border-block: var(--bf-border-width) solid transparent;
6061
6347
  color: var(--bf-color-text-default);
6062
6348
  cursor: pointer;
6063
- display: inline-flex;
6064
- gap: calc(var(--bf-baseline) * 0.5);
6065
- margin: 0 0 0 calc(var(--bf-baseline) * -1.5);
6066
- min-block-size: var(--bf-control-box-size-compact);
6067
- padding-block: var(--bf-control-block-padding-compact);
6068
- padding-inline: calc(var(--bf-baseline) * 0.25) calc(var(--bf-baseline) * 0.5);
6349
+ display: flex;
6350
+ 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);
6069
6354
  text-align: left;
6070
6355
  width: 100%;
6071
6356
  }
@@ -6079,8 +6364,8 @@ html.u-baseline-grid::after {
6079
6364
  }
6080
6365
 
6081
6366
  :where(.bf-theme) :where(.bf-list-tree-toggle):focus-visible {
6082
- outline: 2px solid var(--bf-color-focus);
6083
- outline-offset: -2px;
6367
+ outline: 0.125rem solid var(--bf-color-focus);
6368
+ outline-offset: -0.125rem;
6084
6369
  }
6085
6370
 
6086
6371
  :where(.bf-theme) :where(.bf-list-tree-toggle)::before {
@@ -6092,20 +6377,63 @@ html.u-baseline-grid::after {
6092
6377
  content: "";
6093
6378
  flex: 0 0 1rem;
6094
6379
  inline-size: 1rem;
6095
- transform: rotate(-90deg);
6380
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
6096
6381
  }
6097
6382
 
6098
6383
  :where(.bf-theme) :where(.bf-list-tree-toggle[aria-expanded='true'])::before {
6099
- transform: rotate(0deg);
6384
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(0deg);
6100
6385
  }
6101
6386
 
6102
6387
 
6103
6388
  :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
6391
+ component inset. Navigation depth is added separately below. */
6392
+ /* Navigation copy uses one continuation rail whether a row has a leading
6393
+ disclosure/icon slot or not. The mark canvas is derived backwards from
6394
+ that rail, so iconless rows never introduce a fourth text start. */
6395
+ --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);
6398
+ --bf-side-navigation-group-gap: 1.5rem;
6399
+ --bf-side-navigation-heading-list-gap: 0.5rem;
6104
6400
  color: var(--bf-color-text-inactive);
6105
6401
  display: block;
6106
6402
  inline-size: 100%;
6107
6403
  }
6108
6404
 
6405
+ :where(.bf-theme) :where(.bf-side-navigation-groups) {
6406
+ align-content: start;
6407
+ display: grid;
6408
+ gap: var(--bf-side-navigation-group-gap);
6409
+ }
6410
+
6411
+ :where(.bf-theme) :where(.bf-side-navigation-group) {
6412
+ display: grid;
6413
+ gap: var(--bf-side-navigation-heading-list-gap);
6414
+ min-inline-size: 0;
6415
+ }
6416
+
6417
+ /* Keep the divider and heading as one tight header. The group owns only the
6418
+ larger transition from that header to its list, so the compensated rule
6419
+ cannot change the heading/list phase. */
6420
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) {
6421
+ display: grid;
6422
+ gap: 0rem;
6423
+ min-inline-size: 0;
6424
+ }
6425
+
6426
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) > hr {
6427
+ inline-size: auto;
6428
+ margin-inline: var(--bf-side-navigation-content-inset) 0;
6429
+ }
6430
+
6431
+ /* A single-line group heading occupies four baselines. min-block-size keeps
6432
+ that phase exact while still allowing a long heading to wrap and grow. */
6433
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) > :where(.bf-side-navigation-heading) {
6434
+ min-block-size: calc((var(--bf-baseline) * 4) - var(--bf-body-margin-bottom));
6435
+ }
6436
+
6109
6437
  :where(.bf-theme) :where(.bf-side-navigation-drawer) {
6110
6438
  background: var(--bf-color-background-default);
6111
6439
  bottom: 0;
@@ -6122,7 +6450,7 @@ html.u-baseline-grid::after {
6122
6450
  }
6123
6451
 
6124
6452
  :where(.bf-theme) :where(.bf-side-navigation, .bf-side-navigation.is-icons, .bf-side-navigation.is-accordion, .bf-side-navigation.is-raw-html):where(.is-drawer-expanded) :where(.bf-side-navigation-drawer) {
6125
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
6453
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
6126
6454
  transform: translateX(0);
6127
6455
  }
6128
6456
 
@@ -6152,7 +6480,7 @@ html.u-baseline-grid::after {
6152
6480
  border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
6153
6481
  margin-bottom: calc(var(--bf-baseline) * 2);
6154
6482
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
6155
- padding-inline: var(--bf-panel-padding-inline);
6483
+ padding-inline: var(--bf-component-inline-inset-continuation);
6156
6484
  padding-top: var(--bf-panel-padding-block);
6157
6485
  position: sticky;
6158
6486
  top: 0;
@@ -6175,9 +6503,9 @@ html.u-baseline-grid::after {
6175
6503
  display: inline-flex;
6176
6504
  gap: calc(var(--bf-baseline) * 0.5);
6177
6505
  justify-content: center;
6178
- margin: 0 0 calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-button-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
6179
- padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
6180
- padding-inline: var(--bf-control-inline-padding-action);
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);
6181
6509
  text-decoration: none;
6182
6510
  }
6183
6511
 
@@ -6212,8 +6540,8 @@ html.u-baseline-grid::after {
6212
6540
  }
6213
6541
 
6214
6542
  :where(.bf-theme) :where(.bf-side-navigation-toggle:focus-visible) {
6215
- outline: 2px solid var(--bf-color-focus);
6216
- outline-offset: -2px;
6543
+ outline: 0.125rem solid var(--bf-color-focus);
6544
+ outline-offset: -0.125rem;
6217
6545
  }
6218
6546
 
6219
6547
  :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked) {
@@ -6225,22 +6553,23 @@ html.u-baseline-grid::after {
6225
6553
  display: block;
6226
6554
  margin: 0 0 var(--bf-body-margin-bottom);
6227
6555
  padding-block: var(--bf-body-nudge-start) 0;
6556
+ padding-inline: var(--bf-side-navigation-content-inset);
6228
6557
  }
6229
6558
 
6230
- :where(.bf-theme) :where(.bf-side-navigation-list) {
6231
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
6232
- list-style: none;
6233
- margin: 0 0 calc(var(--bf-baseline) * 2);
6234
- padding: 0 0 calc((var(--bf-baseline) * 2) - var(--bf-border-width));
6559
+ :where(.bf-theme) :where(.bf-side-navigation-heading.is-linked) {
6560
+ padding-inline: 0;
6235
6561
  }
6236
6562
 
6237
- :where(.bf-theme) :where(.bf-side-navigation-list:last-of-type) {
6238
- border-bottom: 0;
6239
- margin-bottom: 0;
6240
- padding-bottom: 0;
6563
+ :where(.bf-theme) :where(.bf-side-navigation-list) {
6564
+ display: grid;
6565
+ grid-auto-rows: var(--bf-single-line-row-block-size);
6566
+ list-style: none;
6567
+ margin: 0;
6568
+ padding: 0;
6241
6569
  }
6242
6570
 
6243
6571
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) {
6572
+ display: grid;
6244
6573
  margin: 0;
6245
6574
  position: relative;
6246
6575
  }
@@ -6252,23 +6581,26 @@ html.u-baseline-grid::after {
6252
6581
  font-weight: var(--bf-body-font-weight, 400);
6253
6582
  line-height: var(--bf-body-line-height, 1.5rem);
6254
6583
  align-items: center;
6584
+ align-self: start;
6255
6585
  background: transparent;
6256
6586
  border: 0;
6587
+ border-block: var(--bf-border-width) solid transparent;
6257
6588
  color: var(--bf-color-text-inactive);
6258
6589
  display: flex;
6259
6590
  gap: calc(var(--bf-baseline) * 0.5);
6260
6591
  inline-size: 100%;
6261
6592
  justify-content: flex-start;
6262
- margin: 0;
6263
- min-block-size: var(--bf-control-box-size-compact);
6264
- padding-block: max(0rem, calc(var(--bf-control-block-padding-compact) - 0rem));
6265
- padding-inline: var(--bf-panel-padding-inline);
6593
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6594
+ padding-block: var(--bf-single-line-row-padding-block);
6595
+ padding-inline: var(--bf-side-navigation-content-inset);
6596
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-content-inset);
6266
6597
  position: relative;
6267
6598
  text-align: left;
6268
6599
  text-decoration: none;
6269
6600
  }
6270
6601
 
6271
6602
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button) {
6603
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-disclosure-inset);
6272
6604
  gap: var(--bf-disclosure-gap);
6273
6605
  }
6274
6606
 
@@ -6277,22 +6609,21 @@ html.u-baseline-grid::after {
6277
6609
  font-weight: 600;
6278
6610
  }
6279
6611
 
6280
- :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked),
6281
6612
  :where(.bf-theme) :where(.bf-side-navigation-list) > :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
6282
- padding-inline-start: var(--bf-panel-padding-inline);
6613
+ padding-inline-start: var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset));
6283
6614
  }
6284
6615
 
6285
6616
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6286
6617
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6287
6618
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
6288
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 2));
6619
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + var(--bf-side-navigation-depth-step));
6289
6620
  }
6290
6621
 
6291
6622
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6292
6623
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6293
6624
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6294
6625
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
6295
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 4));
6626
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 2));
6296
6627
  }
6297
6628
 
6298
6629
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
@@ -6300,7 +6631,7 @@ html.u-baseline-grid::after {
6300
6631
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6301
6632
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6302
6633
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
6303
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 6));
6634
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 3));
6304
6635
  }
6305
6636
 
6306
6637
  :where(.bf-theme) :where(.bf-side-navigation-link:hover, .bf-side-navigation-accordion-button:hover) {
@@ -6309,13 +6640,17 @@ html.u-baseline-grid::after {
6309
6640
  text-decoration: none;
6310
6641
  }
6311
6642
 
6643
+ :where(.bf-theme) :where(a.bf-side-navigation-link:is(:hover, :active)) {
6644
+ text-decoration: none;
6645
+ }
6646
+
6312
6647
  :where(.bf-theme) :where(.bf-side-navigation-link:focus:not(:focus-visible), .bf-side-navigation-accordion-button:focus:not(:focus-visible)) {
6313
6648
  outline: none;
6314
6649
  }
6315
6650
 
6316
6651
  :where(.bf-theme) :where(.bf-side-navigation-link:focus-visible, .bf-side-navigation-accordion-button:focus-visible) {
6317
- outline: 2px solid var(--bf-color-focus);
6318
- outline-offset: -2px;
6652
+ outline: 0.125rem solid var(--bf-color-focus);
6653
+ outline-offset: -0.125rem;
6319
6654
  }
6320
6655
 
6321
6656
  :where(.bf-theme) :where(.bf-side-navigation-link.is-active, .bf-side-navigation-link[aria-current='page'], .bf-side-navigation-link[aria-current='true']) {
@@ -6486,13 +6821,17 @@ html.u-baseline-grid::after {
6486
6821
  text-decoration: none;
6487
6822
  }
6488
6823
 
6824
+ :where(.bf-theme) :where(a.bf-top-navigation-link:is(:hover, :active)) {
6825
+ text-decoration: none;
6826
+ }
6827
+
6489
6828
  :where(.bf-theme) :where(.bf-top-navigation-link:focus:not(:focus-visible), .bf-top-navigation-menu-toggle:focus:not(:focus-visible), .bf-top-navigation-search-toggle:focus:not(:focus-visible)) {
6490
6829
  outline: none;
6491
6830
  }
6492
6831
 
6493
6832
  :where(.bf-theme) :where(.bf-top-navigation-link:focus-visible, .bf-top-navigation-menu-toggle:focus-visible, .bf-top-navigation-search-toggle:focus-visible) {
6494
- outline: 2px solid var(--bf-color-focus);
6495
- outline-offset: -2px;
6833
+ outline: 0.125rem solid var(--bf-color-focus);
6834
+ outline-offset: -0.125rem;
6496
6835
  }
6497
6836
 
6498
6837
  :where(.bf-theme) :where(.bf-top-navigation-item.is-selected) > :where(.bf-top-navigation-link),
@@ -6616,8 +6955,8 @@ html.u-baseline-grid::after {
6616
6955
  }
6617
6956
 
6618
6957
  :where(.bf-theme) :where(.bf-top-navigation-dropdown-item:focus-visible) {
6619
- outline: 2px solid var(--bf-color-focus);
6620
- outline-offset: -2px;
6958
+ outline: 0.125rem solid var(--bf-color-focus);
6959
+ outline-offset: -0.125rem;
6621
6960
  }
6622
6961
 
6623
6962
  :where(.bf-theme) :where(.bf-top-navigation-search-label) {
@@ -6788,11 +7127,12 @@ html.u-baseline-grid::after {
6788
7127
  content: "";
6789
7128
  flex: 0 0 var(--bf-disclosure-icon-inline-size);
6790
7129
  inline-size: var(--bf-disclosure-icon-inline-size);
7130
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block));
6791
7131
  transition: transform 120ms ease;
6792
7132
  }
6793
7133
 
6794
7134
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button[aria-expanded='false'], .bf-side-navigation-expand[aria-expanded='false'])::before {
6795
- transform: rotate(-90deg);
7135
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
6796
7136
  }
6797
7137
 
6798
7138
  :where(.bf-theme) :where(.bf-side-navigation-expand) {
@@ -6857,14 +7197,34 @@ html.u-baseline-grid::after {
6857
7197
  }
6858
7198
 
6859
7199
  :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)));
6860
7201
  align-items: baseline;
6861
7202
  column-gap: var(--bf-side-navigation-icon-gap);
6862
7203
  }
6863
7204
 
7205
+ /* Icon navigation keeps one stable label edge. Rows may omit a decorative
7206
+ icon without collapsing the shared icon track and pulling their copy left. */
7207
+ :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
+ content: "";
7209
+ flex: 0 0 1rem;
7210
+ inline-size: 1rem;
7211
+ }
7212
+
7213
+ /* A collapsed icon rail cannot communicate an iconless destination. Remove
7214
+ the alignment spacer with the hidden label so it cannot become a blank
7215
+ visual affordance in that state. */
7216
+ :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text):not(:has(> .bf-side-navigation-icon))::before {
7217
+ content: none;
7218
+ }
7219
+
6864
7220
  /* Icon-navigation headings share the label edge, not the icon edge. This
6865
7221
  keeps section names aligned with both the menu copy and a tagged wordmark. */
6866
- :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked) {
6867
- padding-inline-start: calc(var(--bf-panel-padding-inline) + 1rem + var(--bf-side-navigation-icon-gap));
7222
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading:not(.is-linked)) {
7223
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
7224
+ }
7225
+
7226
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading.is-linked) > :where(.bf-side-navigation-link) {
7227
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
6868
7228
  }
6869
7229
 
6870
7230
  :where(.bf-theme) :where(.bf-side-navigation-icon) > svg {
@@ -6908,7 +7268,7 @@ html.u-baseline-grid::after {
6908
7268
  :where(.bf-theme) :where(.bf-contextual-menu-dropdown) {
6909
7269
  background: var(--bf-color-background-default);
6910
7270
  border: var(--bf-border-width) solid var(--bf-color-border-default);
6911
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
7271
+ box-shadow: 0 0.75rem 2rem rgba(0, 0, 0, 0.28);
6912
7272
  display: none;
6913
7273
  list-style: none;
6914
7274
  margin: 0;
@@ -6942,7 +7302,7 @@ html.u-baseline-grid::after {
6942
7302
  }
6943
7303
 
6944
7304
  :where(.bf-theme) :where(.bf-contextual-menu-group) + :where(.bf-contextual-menu-group) {
6945
- box-shadow: inset 0 1px 0 var(--bf-color-border-default);
7305
+ box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-default);
6946
7306
  }
6947
7307
 
6948
7308
  :where(.bf-theme) :where(.bf-contextual-menu-link) {
@@ -6959,8 +7319,9 @@ html.u-baseline-grid::after {
6959
7319
  display: block;
6960
7320
  margin: 0;
6961
7321
  overflow: hidden;
6962
- padding-block: var(--bf-control-block-padding-compact);
6963
- padding-inline: var(--bf-panel-padding-inline);
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);
7324
+ padding-inline: var(--bf-component-inline-inset-action);
6964
7325
  text-align: left;
6965
7326
  text-decoration: none;
6966
7327
  text-overflow: ellipsis;
@@ -6986,8 +7347,8 @@ html.u-baseline-grid::after {
6986
7347
  }
6987
7348
 
6988
7349
  :where(.bf-theme) :where(.bf-contextual-menu-link):focus-visible {
6989
- outline: 2px solid var(--bf-color-focus);
6990
- outline-offset: -2px;
7350
+ outline: 0.125rem solid var(--bf-color-focus);
7351
+ outline-offset: -0.125rem;
6991
7352
  }
6992
7353
 
6993
7354
  :where(.bf-theme) :where(.bf-contextual-menu-link.is-disabled, .bf-contextual-menu-link[disabled]) {
@@ -7015,7 +7376,7 @@ html.u-baseline-grid::after {
7015
7376
  font-weight: var(--bf-body-font-weight, 400);
7016
7377
  line-height: var(--bf-body-line-height, 1.5rem);
7017
7378
  background-color: var(--bf-color-background-alt);
7018
- box-shadow: inset 0 0 0 var(--bf-border-width) var(--bf-color-border-default), 0 12px 32px rgba(0, 0, 0, 0.24);
7379
+ 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);
7019
7380
  color: var(--bf-color-text-default);
7020
7381
  inline-size: max-content;
7021
7382
  left: 0;
@@ -7024,7 +7385,7 @@ html.u-baseline-grid::after {
7024
7385
  opacity: 0;
7025
7386
  padding-block-end: var(--bf-body-nudge-end);
7026
7387
  padding-block-start: var(--bf-body-nudge-start, 0.375rem);
7027
- padding-inline: var(--bf-panel-padding-inline);
7388
+ padding-inline: var(--bf-component-inline-inset-continuation);
7028
7389
  pointer-events: none;
7029
7390
  position: absolute;
7030
7391
  top: 100%;
@@ -7168,10 +7529,10 @@ html.u-baseline-grid::after {
7168
7529
  display: inline-flex;
7169
7530
  gap: calc(var(--bf-baseline) * 0.5);
7170
7531
  justify-content: center;
7171
- margin-bottom: calc(0rem + mod(calc(var(--bf-baseline) - mod(calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-button-block-padding) * 2)), var(--bf-baseline))), var(--bf-baseline)));
7532
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
7172
7533
  min-inline-size: var(--bf-control-box-size);
7173
7534
  padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
7174
- padding-inline: var(--bf-control-inline-padding-action);
7535
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
7175
7536
  text-align: center;
7176
7537
  text-decoration: none;
7177
7538
  }
@@ -7185,8 +7546,8 @@ html.u-baseline-grid::after {
7185
7546
  }
7186
7547
 
7187
7548
  :where(.bf-theme) :where(.bf-pagination-link:focus-visible, .bf-pagination-link.is-previous:focus-visible, .bf-pagination-link.is-next:focus-visible) {
7188
- outline: 2px solid var(--bf-color-focus);
7189
- outline-offset: 2px;
7549
+ outline: 0.125rem solid var(--bf-color-focus);
7550
+ outline-offset: 0.125rem;
7190
7551
  }
7191
7552
 
7192
7553
  :where(.bf-theme) :where(.bf-pagination-link.is-active, .bf-pagination-link[aria-current='page'], .bf-pagination-link[aria-current='true']) {
@@ -7265,14 +7626,15 @@ html.u-baseline-grid::after {
7265
7626
  appearance: none;
7266
7627
  background: transparent;
7267
7628
  border: 0;
7629
+ border-block: var(--bf-border-width) solid transparent;
7268
7630
  color: var(--bf-color-text-default);
7269
7631
  cursor: pointer;
7270
7632
  display: flex;
7271
7633
  gap: var(--bf-disclosure-gap);
7272
7634
  inline-size: 100%;
7273
7635
  justify-content: flex-start;
7274
- min-block-size: var(--bf-control-box-size);
7275
- padding-block: var(--bf-control-block-padding);
7636
+ margin-block-end: var(--bf-single-line-row-margin-block-end);
7637
+ padding-block: var(--bf-single-line-row-padding-block);
7276
7638
  padding-inline: 0;
7277
7639
  text-align: left;
7278
7640
  }
@@ -7282,8 +7644,8 @@ html.u-baseline-grid::after {
7282
7644
  }
7283
7645
 
7284
7646
  :where(.bf-theme) :where(.bf-accordion-tab):focus-visible {
7285
- outline: 2px solid var(--bf-color-focus);
7286
- outline-offset: 2px;
7647
+ outline: 0.125rem solid var(--bf-color-focus);
7648
+ outline-offset: 0.125rem;
7287
7649
  }
7288
7650
 
7289
7651
  :where(.bf-theme) :where(.bf-accordion-tab)::before {
@@ -7296,18 +7658,19 @@ html.u-baseline-grid::after {
7296
7658
  display: inline-block;
7297
7659
  flex: none;
7298
7660
  inline-size: var(--bf-disclosure-icon-inline-size);
7661
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block));
7299
7662
  transition: transform 120ms ease;
7300
7663
  }
7301
7664
 
7302
7665
  :where(.bf-theme) :where(.bf-accordion-tab[aria-expanded='false'])::before {
7303
- transform: rotate(-90deg);
7666
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
7304
7667
  }
7305
7668
 
7306
7669
  :where(.bf-theme) :where(.bf-accordion-panel) {
7307
7670
  margin: 0;
7308
7671
  overflow: hidden;
7309
7672
  padding-block-start: var(--bf-baseline);
7310
- padding-inline-start: calc(var(--bf-accordion-indent) + var(--bf-body-font-size, 1rem) + var(--bf-baseline));
7673
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
7311
7674
  }
7312
7675
 
7313
7676
  :where(.bf-theme) :where(.bf-accordion-panel[aria-hidden='true']) {
@@ -7373,7 +7736,7 @@ html.u-baseline-grid::after {
7373
7736
  :where(.bf-theme) :where(.bf-modal-header, .bf-modal-body, .bf-modal-footer) {
7374
7737
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
7375
7738
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
7376
- padding-inline: var(--bf-panel-padding-inline);
7739
+ padding-inline: var(--bf-component-inline-inset-continuation);
7377
7740
  }
7378
7741
 
7379
7742
  :where(.bf-theme) :where(.bf-modal-header) {
@@ -7447,7 +7810,7 @@ html.u-baseline-grid::after {
7447
7810
  :where(.bf-theme) :where(.bf-code-snippet-header) {
7448
7811
  align-items: start;
7449
7812
  background: var(--bf-color-background-active);
7450
- box-shadow: inset 0 -1px 0 var(--bf-color-border-default);
7813
+ box-shadow: inset 0 -0.0625rem 0 var(--bf-color-border-default);
7451
7814
  display: flex;
7452
7815
  flex-wrap: wrap;
7453
7816
  justify-content: space-between;
@@ -7469,7 +7832,7 @@ html.u-baseline-grid::after {
7469
7832
  margin: 0;
7470
7833
  overflow-wrap: anywhere;
7471
7834
  padding-block: var(--bf-panel-padding-block);
7472
- padding-inline: var(--bf-panel-padding-inline);
7835
+ padding-inline: var(--bf-component-inline-inset-continuation);
7473
7836
  }
7474
7837
 
7475
7838
  :where(.bf-theme) :where(.bf-code-snippet-dropdowns) {
@@ -7484,7 +7847,7 @@ html.u-baseline-grid::after {
7484
7847
  :where(.bf-theme) :where(.bf-code-snippet-header.is-stacked) :where(.bf-code-snippet-dropdowns) {
7485
7848
  justify-content: stretch;
7486
7849
  margin-inline-start: 0;
7487
- box-shadow: inset 0 1px 0 var(--bf-color-border-default);
7850
+ box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-default);
7488
7851
  width: 100%;
7489
7852
  }
7490
7853
 
@@ -7503,12 +7866,12 @@ html.u-baseline-grid::after {
7503
7866
  min-block-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-panel-padding-block) * 2));
7504
7867
  min-inline-size: 0;
7505
7868
  padding-block: var(--bf-panel-padding-block);
7506
- padding-inline: var(--bf-panel-padding-inline);
7869
+ padding-inline: var(--bf-component-inline-inset-action);
7507
7870
  text-align: start;
7508
7871
  }
7509
7872
 
7510
7873
  :where(.bf-theme) :where(.bf-code-snippet-dropdown) + :where(.bf-code-snippet-dropdown) {
7511
- box-shadow: inset 1px 0 0 var(--bf-color-border-default);
7874
+ box-shadow: inset 0.0625rem 0 0 var(--bf-color-border-default);
7512
7875
  }
7513
7876
 
7514
7877
  :where(.bf-theme) :where(.bf-code-snippet-dropdown):focus:not(:focus-visible) {
@@ -7516,8 +7879,8 @@ html.u-baseline-grid::after {
7516
7879
  }
7517
7880
 
7518
7881
  :where(.bf-theme) :where(.bf-code-snippet-dropdown):focus-visible {
7519
- outline: 2px solid var(--bf-color-focus);
7520
- outline-offset: -2px;
7882
+ outline: 0.125rem solid var(--bf-color-focus);
7883
+ outline-offset: -0.125rem;
7521
7884
  }
7522
7885
 
7523
7886
  :where(.bf-theme) :where(.bf-code-snippet-block, .bf-code-snippet-block.is-icon, .bf-code-snippet-block.is-numbered) {
@@ -7532,7 +7895,7 @@ html.u-baseline-grid::after {
7532
7895
  min-inline-size: 0;
7533
7896
  overflow-x: auto;
7534
7897
  padding-block: var(--bf-panel-padding-block);
7535
- padding-inline: var(--bf-panel-padding-inline);
7898
+ padding-inline: var(--bf-component-inline-inset-continuation);
7536
7899
  tab-size: 2;
7537
7900
  white-space: pre;
7538
7901
  }
@@ -7548,7 +7911,7 @@ html.u-baseline-grid::after {
7548
7911
 
7549
7912
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon) {
7550
7913
  cursor: copy;
7551
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 3));
7914
+ padding-inline-start: calc(var(--bf-component-inline-inset-continuation) + (var(--bf-baseline) * 3));
7552
7915
  position: relative;
7553
7916
  }
7554
7917
 
@@ -7560,7 +7923,7 @@ html.u-baseline-grid::after {
7560
7923
  line-height: var(--bf-h6-line-height, 1.5rem);
7561
7924
  color: var(--bf-color-text-muted);
7562
7925
  content: "$";
7563
- inset-inline-start: var(--bf-panel-padding-inline);
7926
+ inset-inline-start: var(--bf-component-inline-inset-continuation);
7564
7927
  inset-block-start: var(--bf-panel-padding-block);
7565
7928
  position: absolute;
7566
7929
  }
@@ -7575,7 +7938,7 @@ html.u-baseline-grid::after {
7575
7938
 
7576
7939
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon.is-copied) {
7577
7940
  background: color-mix(in srgb, var(--bf-color-background-alt) 78%, var(--bf-color-background-information-default));
7578
- box-shadow: inset 0 0 0 1px var(--bf-color-border-information);
7941
+ box-shadow: inset 0 0 0 0.0625rem var(--bf-color-border-information);
7579
7942
  }
7580
7943
 
7581
7944
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon):focus:not(:focus-visible) {
@@ -7583,8 +7946,8 @@ html.u-baseline-grid::after {
7583
7946
  }
7584
7947
 
7585
7948
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon):focus-visible {
7586
- outline: 2px solid var(--bf-color-focus);
7587
- outline-offset: -2px;
7949
+ outline: 0.125rem solid var(--bf-color-focus);
7950
+ outline-offset: -0.125rem;
7588
7951
  }
7589
7952
 
7590
7953
  :where(.bf-theme) :where(.bf-code-snippet-block.is-numbered) {
@@ -7646,6 +8009,32 @@ html.u-baseline-grid::after {
7646
8009
  z-index: 40;
7647
8010
  }
7648
8011
 
8012
+ /* A responsive application brand occupies the persistent bar only while the
8013
+ * full navigation brand is unavailable. The same public tagged-logo contract
8014
+ * is used in both locations; state CSS guarantees that only one copy is
8015
+ * visible and exposed at a time. */
8016
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) {
8017
+ 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));
8020
+ }
8021
+
8022
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) {
8023
+ margin-block-end: calc(var(--bf-border-width) * -1);
8024
+ }
8025
+
8026
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
8027
+ flex: 1 1 12rem;
8028
+ inline-size: auto;
8029
+ min-inline-size: 0;
8030
+ }
8031
+
8032
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation:not(.is-collapsed)))
8033
+ > :where(.bf-navigation-bar.is-responsive)
8034
+ :where(.bf-top-navigation-logo) {
8035
+ visibility: hidden;
8036
+ }
8037
+
7649
8038
  :where(.bf-theme) :where(.bf-navigation) {
7650
8039
  grid-column: 1 / -1;
7651
8040
  grid-row: 1 / -1;
@@ -7692,7 +8081,7 @@ html.u-baseline-grid::after {
7692
8081
  }
7693
8082
 
7694
8083
  :where(.bf-theme) :where(.bf-navigation:not(.is-collapsed)) > :where(.bf-navigation-drawer) {
7695
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
8084
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
7696
8085
  transform: translateX(0);
7697
8086
  visibility: visible;
7698
8087
  }
@@ -7702,10 +8091,10 @@ html.u-baseline-grid::after {
7702
8091
  }
7703
8092
 
7704
8093
  :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-label) {
7705
- block-size: 1px;
8094
+ block-size: 0.0625rem;
7706
8095
  clip-path: inset(50%);
7707
- inline-size: 1px;
7708
- max-inline-size: 1px;
8096
+ inline-size: 0.0625rem;
8097
+ max-inline-size: 0.0625rem;
7709
8098
  opacity: 0;
7710
8099
  overflow: hidden;
7711
8100
  pointer-events: none;
@@ -7723,8 +8112,8 @@ html.u-baseline-grid::after {
7723
8112
  padding-inline: calc(var(--bf-baseline) * 1.25);
7724
8113
  }
7725
8114
 
7726
- :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-list) {
7727
- border-bottom-color: transparent;
8115
+ :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-list)::after {
8116
+ content: none;
7728
8117
  }
7729
8118
 
7730
8119
  :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) {
@@ -7737,6 +8126,14 @@ html.u-baseline-grid::after {
7737
8126
  grid-template-rows: minmax(0, 1fr);
7738
8127
  }
7739
8128
 
8129
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation)):has(> .bf-aside.is-pinned:not(.is-collapsed)) {
8130
+ grid-template-areas:
8131
+ "navigation-bar navigation-bar"
8132
+ "main aside";
8133
+ grid-template-columns: minmax(0, 1fr) minmax(0, var(--bf-application-aside-width));
8134
+ grid-template-rows: min-content minmax(0, 1fr);
8135
+ }
8136
+
7740
8137
  :where(.bf-theme) :where(.bf-main) {
7741
8138
  grid-area: main;
7742
8139
  min-block-size: 0;
@@ -7775,7 +8172,7 @@ html.u-baseline-grid::after {
7775
8172
  :where(.bf-theme) :where(.bf-aside.is-overlay, .bf-aside.is-drawer) {
7776
8173
  align-self: stretch;
7777
8174
  block-size: auto;
7778
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
8175
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
7779
8176
  bottom: 0;
7780
8177
  grid-column: 1 / -1;
7781
8178
  grid-row: 1 / -1;
@@ -7865,14 +8262,14 @@ html.u-baseline-grid::after {
7865
8262
 
7866
8263
  :where(.bf-theme) :where(.bf-application-aside-resize-handle)::after {
7867
8264
  background: var(--bf-color-border-default);
7868
- border-radius: 999px;
8265
+ border-radius: 62.4375rem;
7869
8266
  content: "";
7870
8267
  inset-block: var(--bf-panel-padding-block);
7871
- inset-inline-start: calc(50% - 1px);
8268
+ inset-inline-start: calc(50% - 0.0625rem);
7872
8269
  opacity: 0.95;
7873
8270
  position: absolute;
7874
8271
  transition: background-color 120ms ease, opacity 120ms ease;
7875
- width: 2px;
8272
+ width: 0.125rem;
7876
8273
  }
7877
8274
 
7878
8275
  :where(.bf-theme) :where(.bf-application-aside-resize-handle):hover::after,
@@ -7882,8 +8279,8 @@ html.u-baseline-grid::after {
7882
8279
  }
7883
8280
 
7884
8281
  :where(.bf-theme) :where(.bf-application-aside-resize-handle):focus-visible {
7885
- outline: 2px solid var(--bf-application-resize-handle-focus-ring);
7886
- outline-offset: -2px;
8282
+ outline: 0.125rem solid var(--bf-application-resize-handle-focus-ring);
8283
+ outline-offset: -0.125rem;
7887
8284
  }
7888
8285
 
7889
8286
  @media (min-width: 64.75rem) {
@@ -7902,6 +8299,16 @@ html.u-baseline-grid::after {
7902
8299
  grid-template-columns: minmax(0, var(--bf-application-navigation-width)) minmax(0, 1fr) minmax(0, var(--bf-application-aside-width));
7903
8300
  }
7904
8301
 
8302
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation:not(.is-collapsed))) > :where(.bf-navigation-bar.is-responsive) {
8303
+ block-size: 0;
8304
+ border: 0;
8305
+ min-block-size: 0;
8306
+ overflow: hidden;
8307
+ pointer-events: none;
8308
+ position: absolute;
8309
+ visibility: hidden;
8310
+ }
8311
+
7905
8312
  :where(.bf-theme) :where(.bf-application:has(> .bf-navigation.is-collapsed)) {
7906
8313
  --bf-application-navigation-width: var(--bf-application-navigation-width-collapsed);
7907
8314
  }
@@ -7947,8 +8354,8 @@ html.u-baseline-grid::after {
7947
8354
  }
7948
8355
 
7949
8356
  /* The tagged treatment is opt-in. The Circle of Friends is aligned to the
7950
- * first title line, then the 38px tag extends upward to the navigation edge.
7951
- * Its 22px inline size preserves the established 38:22 (~1.73) tag ratio; the
8357
+ * first title line, then the 2.375rem tag extends upward to the navigation edge.
8358
+ * Its 1.375rem inline size preserves the established 38:22 (~1.73) tag ratio; the
7952
8359
  * tag must not stretch to the full occupied navigation row. */
7953
8360
  :where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) {
7954
8361
  min-inline-size: 0;
@@ -8002,13 +8409,11 @@ html.u-baseline-grid::after {
8002
8409
  line-height: var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5));
8003
8410
  overflow: visible;
8004
8411
  overflow-wrap: anywhere;
8005
- /* The first title line and the 16px mark share the mark's fixed centre:
8006
- * tag block-end minus the 6px inset minus half the mark. Symmetric title
8007
- * padding keeps the occupied row stable across all four type-density tiers. */
8412
+ /* The first title line and the 1rem mark share the public brand-line centre.
8413
+ * The derived brand block is twice that fixed centre, so the orange tag can
8414
+ * extend upward without changing the title or adjacent-header baseline. */
8008
8415
  padding-block: calc(
8009
- var(--bf-top-navigation-logo-tag-block-size)
8010
- - var(--bf-top-navigation-logo-icon-bottom-offset)
8011
- - (var(--bf-top-navigation-logo-icon-size) / 2)
8416
+ var(--bf-navigation-brand-line-center-block)
8012
8417
  - (var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5rem)) / 2)
8013
8418
  );
8014
8419
  text-overflow: clip;
@@ -8089,11 +8494,15 @@ html.u-baseline-grid::after {
8089
8494
  :where(.bf-theme) :where(.bf-in-page-navigation) {
8090
8495
  container-name: bf-in-page-navigation;
8091
8496
  container-type: inline-size;
8092
- margin-block: 0 var(--bf-section-space-shallow);
8497
+ margin: 0;
8093
8498
  min-inline-size: 0;
8094
8499
  }
8095
8500
 
8096
8501
  :where(.bf-theme) :where(.bf-in-page-navigation-nav) {
8502
+ --bf-stack-space: var(--bf-space-1);
8503
+ align-content: start;
8504
+ display: grid;
8505
+ gap: var(--bf-stack-space);
8097
8506
  max-block-size: 100dvb;
8098
8507
  min-inline-size: 0;
8099
8508
  overflow: auto;
@@ -8109,12 +8518,17 @@ html.u-baseline-grid::after {
8109
8518
  line-height: var(--bf-h6-line-height, 1.5rem);
8110
8519
  color: var(--bf-color-text-muted);
8111
8520
  display: block;
8112
- margin: 0 0 var(--bf-space-1);
8113
- padding-block: var(--bf-h6-nudge-start) var(--bf-h6-nudge-end);
8521
+ margin-block: 0 var(--bf-h6-margin-bottom);
8522
+ padding-block-end: 0;
8523
+ padding-block-start: var(--bf-h6-nudge-start);
8114
8524
  }
8115
8525
 
8116
8526
  :where(.bf-theme) :where(.bf-in-page-navigation-list) {
8527
+ --bf-stack-space: var(--bf-space-1);
8528
+ align-content: start;
8117
8529
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-color-border-low-contrast);
8530
+ display: grid;
8531
+ gap: var(--bf-stack-space);
8118
8532
  list-style: none;
8119
8533
  margin: 0;
8120
8534
  min-inline-size: 0;
@@ -8122,13 +8536,16 @@ html.u-baseline-grid::after {
8122
8536
  }
8123
8537
 
8124
8538
  :where(.bf-theme) :where(.bf-in-page-navigation-item) {
8539
+ align-content: start;
8540
+ display: grid;
8541
+ gap: var(--bf-stack-space);
8125
8542
  margin: 0;
8126
8543
  min-inline-size: 0;
8127
8544
  padding: 0;
8128
8545
  position: relative;
8129
8546
  }
8130
8547
 
8131
- :where(.bf-theme) :where(.bf-in-page-navigation-link) {
8548
+ :where(.bf-theme) :where(a.bf-in-page-navigation-link) {
8132
8549
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
8133
8550
  font-size: var(--bf-body-font-size, 1rem);
8134
8551
  font-style: var(--bf-body-font-style, normal);
@@ -8141,7 +8558,7 @@ html.u-baseline-grid::after {
8141
8558
  min-inline-size: 0;
8142
8559
  overflow: hidden;
8143
8560
  overflow-wrap: anywhere;
8144
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
8561
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8145
8562
  padding-inline: var(--bf-space-2) 0;
8146
8563
  position: relative;
8147
8564
  text-decoration: none;
@@ -8149,7 +8566,7 @@ html.u-baseline-grid::after {
8149
8566
  -webkit-box-orient: vertical;
8150
8567
  }
8151
8568
 
8152
- :where(.bf-theme) :where(.bf-in-page-navigation-link:hover) {
8569
+ :where(.bf-theme) :where(a.bf-in-page-navigation-link:hover) {
8153
8570
  color: var(--bf-color-text-default);
8154
8571
  text-decoration: none;
8155
8572
  }
@@ -8159,8 +8576,8 @@ html.u-baseline-grid::after {
8159
8576
  }
8160
8577
 
8161
8578
  :where(.bf-theme) :where(.bf-in-page-navigation-link:focus-visible) {
8162
- outline: 2px solid var(--bf-color-focus);
8163
- outline-offset: 2px;
8579
+ outline: 0.125rem solid var(--bf-color-focus);
8580
+ outline-offset: 0.125rem;
8164
8581
  }
8165
8582
 
8166
8583
  :where(.bf-theme) :where(.bf-in-page-navigation-link.is-active, .bf-in-page-navigation-link[aria-current]) {
@@ -8216,8 +8633,8 @@ html.u-baseline-grid::after {
8216
8633
  }
8217
8634
 
8218
8635
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle:focus-visible) {
8219
- outline: 2px solid var(--bf-color-focus);
8220
- outline-offset: -2px;
8636
+ outline: 0.125rem solid var(--bf-color-focus);
8637
+ outline-offset: -0.125rem;
8221
8638
  }
8222
8639
 
8223
8640
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle > .bf-icon) {
@@ -8231,6 +8648,7 @@ html.u-baseline-grid::after {
8231
8648
  border-block-end: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
8232
8649
  display: grid;
8233
8650
  grid-template-columns: minmax(0, 1fr) auto;
8651
+ row-gap: 0;
8234
8652
  max-block-size: none;
8235
8653
  overflow: visible;
8236
8654
  position: static;
@@ -8243,6 +8661,7 @@ html.u-baseline-grid::after {
8243
8661
  :where(.bf-theme) :where(.bf-in-page-navigation-list) {
8244
8662
  border: 0;
8245
8663
  display: flex;
8664
+ gap: 0;
8246
8665
  grid-column: 1;
8247
8666
  grid-row: 1;
8248
8667
  margin: 0;
@@ -8307,7 +8726,8 @@ html.u-baseline-grid::after {
8307
8726
  :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) {
8308
8727
  background: var(--bf-color-background-alt);
8309
8728
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-color-border-low-contrast);
8310
- display: block;
8729
+ display: grid;
8730
+ gap: var(--bf-stack-space);
8311
8731
  grid-column: 1 / -1;
8312
8732
  grid-row: 2;
8313
8733
  /* The mobile nav owns a bottom rule; reserve its thickness within the
@@ -8318,20 +8738,21 @@ html.u-baseline-grid::after {
8318
8738
  }
8319
8739
 
8320
8740
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-item, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-item) {
8321
- display: block;
8741
+ display: grid;
8322
8742
  max-inline-size: none;
8323
8743
  }
8324
8744
 
8325
8745
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-link, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link) {
8326
8746
  display: -webkit-box;
8327
8747
  overflow-wrap: anywhere;
8328
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
8748
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8329
8749
  padding-inline: var(--bf-space-2) 0;
8330
8750
  white-space: normal;
8331
8751
  }
8332
8752
 
8333
8753
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-list .bf-in-page-navigation-list, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-list .bf-in-page-navigation-list) {
8334
- display: block;
8754
+ display: grid;
8755
+ gap: var(--bf-stack-space);
8335
8756
  }
8336
8757
 
8337
8758
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-link.is-active, .bf-in-page-navigation.is-expanded .bf-in-page-navigation-link[aria-current], .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link.is-active, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link[aria-current])::before {
@@ -8414,35 +8835,47 @@ html.u-baseline-grid::after {
8414
8835
  /* ------------------------------------------------------------------ */
8415
8836
 
8416
8837
  :where(.bf-theme) :where(.bf-table-of-contents) {
8838
+ --bf-table-of-contents-section-gap: var(--bf-section-space-shallow);
8839
+ align-content: start;
8417
8840
  container-name: bf-table-of-contents;
8418
8841
  container-type: inline-size;
8419
- margin-block: 0 var(--bf-section-space-shallow);
8842
+ display: grid;
8843
+ gap: var(--bf-table-of-contents-section-gap);
8844
+ margin: 0;
8420
8845
  min-inline-size: 0;
8421
8846
  }
8422
8847
 
8423
8848
  :where(.bf-theme) :where(.bf-table-of-contents-section) {
8849
+ --bf-stack-space: 0rem;
8850
+ align-content: start;
8851
+ display: grid;
8852
+ gap: var(--bf-stack-space);
8424
8853
  margin: 0;
8425
8854
  min-inline-size: 0;
8426
- padding-block-end: var(--bf-space-2);
8855
+ padding: 0;
8856
+ position: relative;
8427
8857
  }
8428
8858
 
8429
- :where(.bf-theme) :where(.bf-table-of-contents-section + .bf-table-of-contents-section) {
8430
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
8431
- padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
8859
+ :where(.bf-theme) :where(.bf-table-of-contents-section + .bf-table-of-contents-section)::before {
8860
+ background: var(--bf-color-border-low-contrast);
8861
+ block-size: var(--bf-border-width);
8862
+ content: "";
8863
+ inset-block-start: 0;
8864
+ inset-inline: 0;
8865
+ position: absolute;
8432
8866
  }
8433
8867
 
8434
8868
  :where(.bf-theme) :where(.bf-table-of-contents-heading) {
8435
- font-family: var(--bf-h6-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
8436
- font-size: var(--bf-h6-font-size, 1rem);
8437
- font-style: var(--bf-h6-font-style, normal);
8438
- font-weight: var(--bf-h6-font-weight, 400);
8439
- line-height: var(--bf-h6-line-height, 1.5rem);
8440
- color: var(--bf-color-text-muted);
8441
- margin: 0 0 var(--bf-space-1);
8442
- padding-block: var(--bf-h6-nudge-start) var(--bf-h6-nudge-end);
8869
+ color: var(--bf-color-text-default);
8870
+ margin: 0;
8871
+ padding-block-end: 0;
8443
8872
  }
8444
8873
 
8445
8874
  :where(.bf-theme) :where(.bf-table-of-contents-list) {
8875
+ --bf-stack-space: 0rem;
8876
+ align-content: start;
8877
+ display: grid;
8878
+ gap: var(--bf-stack-space);
8446
8879
  list-style: none;
8447
8880
  margin: 0;
8448
8881
  min-inline-size: 0;
@@ -8450,26 +8883,30 @@ html.u-baseline-grid::after {
8450
8883
  }
8451
8884
 
8452
8885
  :where(.bf-theme) :where(.bf-table-of-contents-item) {
8886
+ align-content: start;
8887
+ display: grid;
8888
+ gap: var(--bf-stack-space);
8453
8889
  margin: 0;
8454
8890
  min-inline-size: 0;
8455
8891
  padding: 0;
8456
8892
  }
8457
8893
 
8458
- :where(.bf-theme) :where(.bf-table-of-contents-link) {
8894
+ :where(.bf-theme) :where(a.bf-table-of-contents-link) {
8459
8895
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
8460
8896
  font-size: var(--bf-body-font-size, 1rem);
8461
8897
  font-style: var(--bf-body-font-style, normal);
8462
8898
  font-weight: var(--bf-body-font-weight, 400);
8463
8899
  line-height: var(--bf-body-line-height, 1.5rem);
8900
+ border-block: var(--bf-border-width) solid transparent;
8464
8901
  color: var(--bf-color-link-default);
8465
8902
  display: block;
8466
- margin: 0;
8903
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
8467
8904
  overflow-wrap: anywhere;
8468
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
8905
+ padding-block: var(--bf-single-line-row-padding-block);
8469
8906
  text-decoration: none;
8470
8907
  }
8471
8908
 
8472
- :where(.bf-theme) :where(.bf-table-of-contents-link:hover) {
8909
+ :where(.bf-theme) :where(a.bf-table-of-contents-link:hover) {
8473
8910
  color: var(--bf-color-text-default);
8474
8911
  text-decoration: underline;
8475
8912
  }
@@ -8479,8 +8916,8 @@ html.u-baseline-grid::after {
8479
8916
  }
8480
8917
 
8481
8918
  :where(.bf-theme) :where(.bf-table-of-contents-link:focus-visible) {
8482
- outline: 2px solid var(--bf-color-focus);
8483
- outline-offset: 2px;
8919
+ outline: 0.125rem solid var(--bf-color-focus);
8920
+ outline-offset: 0.125rem;
8484
8921
  }
8485
8922
 
8486
8923
  :where(.bf-theme) :where(.bf-table-of-contents-link.is-active, .bf-table-of-contents-link[aria-current]) {
@@ -8560,9 +8997,9 @@ html.u-baseline-grid::after {
8560
8997
  padding: 0;
8561
8998
  }
8562
8999
 
8563
- :where(.bf-theme) :where(.bf-tiered-list-header) > :where(.bf-rule),
8564
- :where(.bf-theme) :where(.bf-tiered-list-item) > :where(.bf-rule),
8565
- :where(.bf-theme) :where(.bf-tiered-list-cta) > :where(.bf-rule) {
9000
+ :where(.bf-theme) :where(.bf-tiered-list-header) > hr,
9001
+ :where(.bf-theme) :where(.bf-tiered-list-item) > hr,
9002
+ :where(.bf-theme) :where(.bf-tiered-list-cta) > hr {
8566
9003
  grid-column: 1 / -1;
8567
9004
  }
8568
9005
 
@@ -8577,8 +9014,8 @@ html.u-baseline-grid::after {
8577
9014
  grid-template-columns: repeat(8, minmax(0, 1fr));
8578
9015
  }
8579
9016
 
8580
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item) > :where(.bf-rule),
8581
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta) > :where(.bf-rule) {
9017
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item) > hr,
9018
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta) > hr {
8582
9019
  grid-column: 3 / span 6;
8583
9020
  }
8584
9021
 
@@ -8593,9 +9030,9 @@ html.u-baseline-grid::after {
8593
9030
  }
8594
9031
 
8595
9032
  /* ------------------------------------------------------------------ */
8596
- /* Header split (≥ 64.75rem): unchanged 50/50 title/description. */
9033
+ /* Header split (≥ 45rem): the shared readable 50/50 title/content split. */
8597
9034
  /* ------------------------------------------------------------------ */
8598
- @container (width >= 64.75rem) {
9035
+ @container (width >= 45rem) {
8599
9036
  :where(.bf-theme) :where(.bf-tiered-list:not(.is-description-full-width)) :where(.bf-tiered-list-header) {
8600
9037
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
8601
9038
  }
@@ -8619,7 +9056,7 @@ html.u-baseline-grid::after {
8619
9056
  queries cannot style their own container, so responsive descendants span
8620
9057
  these tracks instead of relying on an ineligible self-query. */
8621
9058
  grid-template-columns: repeat(8, minmax(0, 1fr));
8622
- margin-block-end: var(--bf-section-space-shallow);
9059
+ margin: 0;
8623
9060
  position: relative;
8624
9061
  }
8625
9062
 
@@ -8636,7 +9073,7 @@ html.u-baseline-grid::after {
8636
9073
  /* Responsive aspect media can make a shared subgrid track land between
8637
9074
  baselines. Snap that media box itself; the surrounding composition still
8638
9075
  does not own or erase any child's semantic margins. */
8639
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
9076
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
8640
9077
  :where(.bf-theme) :where(.bf-equal-height-row-item) > :where(.bf-aspect) {
8641
9078
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
8642
9079
  }
@@ -8715,7 +9152,7 @@ html.u-baseline-grid::after {
8715
9152
  :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
8716
9153
  :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after {
8717
9154
  background-color: var(--bf-color-border-low-contrast);
8718
- block-size: 1px;
9155
+ block-size: 0.0625rem;
8719
9156
  content: "";
8720
9157
  display: none;
8721
9158
  grid-column: 1 / -1;
@@ -8788,8 +9225,8 @@ html.u-baseline-grid::after {
8788
9225
  /* ------------------------------------------------------------------ */
8789
9226
  /* Gutter and margin escalation — viewport-based, all tiers */
8790
9227
  /* Grid spec v0.3 §2.3: gutters set by global viewport breakpoint. */
8791
- /* Baseline Foundry models the spec's 460px x-small row as part of the */
8792
- /* default <620px bracket because the values do not change at 460px. */
9228
+ /* Baseline Foundry models the spec's 28.75rem x-small row as part of the */
9229
+ /* default <38.75rem bracket because the values do not change at 28.75rem. */
8793
9230
  /* ------------------------------------------------------------------ */
8794
9231
 
8795
9232
  :where(.bf-theme) {
@@ -8860,9 +9297,7 @@ html.u-baseline-grid::after {
8860
9297
  margin-inline-start: 0;
8861
9298
  }
8862
9299
 
8863
- :where(.bf-theme.bf-tier-app) :where(.bf-page) {
8864
- max-inline-size: none;
8865
- }
9300
+
8866
9301
 
8867
9302
  :where(.bf-theme) :where(.bf-panel-content, .bf-accordion-panel) :where(.bf-fixed-width) {
8868
9303
  padding-inline: 0;
@@ -8872,6 +9307,13 @@ html.u-baseline-grid::after {
8872
9307
  padding-inline: 0;
8873
9308
  }
8874
9309
 
9310
+ /* A page is the outer grid row and therefore owns its horizontal gutter.
9311
+ * Fixed-width regions nested anywhere inside it retain their cap and
9312
+ * centering behavior without introducing a second page inset. */
9313
+ :where(.bf-theme) :where(.bf-page) :where(.bf-fixed-width) {
9314
+ padding-inline: 0;
9315
+ }
9316
+
8875
9317
  /* ------------------------------------------------------------------ */
8876
9318
  /* Grid base — 4 columns, all tiers */
8877
9319
  /* ------------------------------------------------------------------ */
@@ -8893,7 +9335,7 @@ html.u-baseline-grid::after {
8893
9335
 
8894
9336
  :where(.bf-theme) :where(.bf-grid.is-guide) > * {
8895
9337
  background: color-mix(in srgb, var(--bf-color-accent) 18%, var(--bf-color-background-default));
8896
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--bf-color-accent) 50%, var(--bf-color-rule));
9338
+ box-shadow: inset 0 0 0 0.0625rem color-mix(in srgb, var(--bf-color-accent) 50%, var(--bf-color-rule));
8897
9339
  min-block-size: calc(var(--bf-baseline) * 4);
8898
9340
  }
8899
9341