baseline-foundry 0.1.4 → 0.1.5

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 +10 -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 +24 -9
  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 +85 -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 +4 -4
  35. package/dist/css-components/panel.js +12 -8
  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 -3
  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 +189 -111
  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 +894 -538
  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 +928 -568
  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 +919 -562
  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 +919 -562
  66. package/dist/surfaces.json +17 -17
  67. package/dist/tiers/app/styles.css +928 -568
  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 +920 -563
  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 +919 -562
  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 +925 -568
  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,41 @@ 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-visual-offset: calc(var(--bf-body-nudge-start, 0.375rem) + ((var(--bf-body-line-height, 1.5rem) - var(--bf-control-visual-size)) / 2));
851
928
  --bf-slider-track-size: calc(var(--bf-baseline) * 0.25);
852
929
  --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)));
853
930
  --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
931
  --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));
932
+ --bf-table-row-padding-block-start: var(--bf-body-nudge-start, 0.375rem);
933
+ --bf-table-row-content-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-table-row-padding-block-start) * 2) + var(--bf-table-row-border-size));
857
934
  --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);
935
+ --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)));
936
+ --bf-table-row-line-height: var(--bf-body-line-height, 1.5rem);
937
+ --bf-switch-track-offset: var(--bf-single-line-row-visual-offset);
938
+ --bf-tick-box-offset: var(--bf-single-line-row-visual-offset);
939
+ --bf-leading-mark-size: var(--bf-control-visual-size);
940
+ --bf-leading-mark-gap: var(--bf-component-inline-inset-field);
941
+ --bf-leading-mark-offset: calc(var(--bf-leading-mark-size) + var(--bf-leading-mark-gap));
942
+ --bf-leading-mark-group-inset: calc(var(--bf-component-inline-inset-continuation) - var(--bf-leading-mark-offset));
943
+ --bf-tick-label-offset: var(--bf-leading-mark-offset);
944
+ --bf-radio-dot-size: calc((var(--bf-control-visual-size) * 0.375) + var(--bf-border-width));
945
+ --bf-list-marker-dot-size: calc(var(--bf-border-width) * 4);
865
946
  --bf-app-drawer-width-icon: 2rem;
866
947
  --bf-app-drawer-width-small: 15rem;
867
948
  --bf-app-drawer-width-small-max: 20rem;
@@ -873,7 +954,9 @@ html.u-baseline-grid::after {
873
954
  --bf-app-aside-width-max: var(--bf-app-drawer-width-medium-max);
874
955
  --bf-app-navigation-width: 15rem;
875
956
  --bf-app-navigation-width-collapsed: 3rem;
876
- --bf-side-navigation-icon-optical-offset-block: 0.1875rem;
957
+ --bf-icon-label-optical-offset-block: 0.1875rem;
958
+ --bf-disclosure-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
959
+ --bf-side-navigation-icon-optical-offset-block: var(--bf-icon-label-optical-offset-block);
877
960
  --bf-side-navigation-icon-gap: 0.625rem;
878
961
  --bf-navigation-bar-min-block-size: calc(var(--bf-baseline) * 6);
879
962
  --bf-authoring-accent: #f6b73c;
@@ -886,9 +969,10 @@ html.u-baseline-grid::after {
886
969
  --bf-authoring-accent-focus-ring: rgba(246, 183, 60, 0.55);
887
970
  --bf-application-resize-handle-active: var(--bf-authoring-accent-strong);
888
971
  --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));
972
+ --bf-control-inline-padding-action-bordered: max(0rem, calc(var(--bf-component-inline-inset-action) - var(--bf-border-width)));
973
+ --bf-top-navigation-link-padding-inline: var(--bf-component-inline-inset-action);
974
+ --bf-top-navigation-end-slot-inline-size: calc(1rem + var(--bf-component-inline-inset-field));
975
+ --bf-top-navigation-search-toggle-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
892
976
  --bf-top-navigation-link-padding-block: max(var(--bf-body-nudge-start), calc(var(--bf-baseline) * 1.5));
893
977
  --bf-top-navigation-search-max-inline-size: 20rem;
894
978
  --bf-top-navigation-logo-tag-inline-size: 1.375rem;
@@ -903,12 +987,10 @@ html.u-baseline-grid::after {
903
987
  --bf-icon-size-large: 4rem;
904
988
  --bf-icon-size-x-large: 4.5rem;
905
989
  --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));
990
+ --bf-leading-icon-size: var(--bf-leading-mark-size);
991
+ --bf-leading-icon-gap: var(--bf-leading-mark-gap);
992
+ --bf-leading-icon-offset: var(--bf-single-line-row-visual-offset);
993
+ --bf-ui-chip-padding-inline: var(--bf-component-inline-inset-field);
912
994
  --bf-ui-badge-padding-inline: calc(var(--bf-body-line-height, 1.5rem) * 0.25);
913
995
  --bf-ui-badge-overhang: calc(var(--bf-ui-badge-padding-inline) * -0.75);
914
996
  --bf-grid-max-inline-size: var(--bf-content-max-width);
@@ -971,6 +1053,7 @@ html.u-baseline-grid::after {
971
1053
  --bf-color-focus: var(--vf-color-focus, #2e96ff);
972
1054
 
973
1055
  --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");
1056
+ --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
1057
  --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
1058
  --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
1059
  --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 +1078,9 @@ html.u-baseline-grid::after {
995
1078
  }
996
1079
 
997
1080
  :where(.bf-theme.bf-surface-ubuntu-engine-smoke) {
998
- --bf-control-baseline-reserve: 0rem;
999
1081
  --bf-input-block-padding: 0.41rem;
1000
1082
  --bf-button-block-padding: 0.41rem;
1001
- --bf-table-row-padding: 0.41rem;
1002
- --bf-border-width: 1px;
1083
+ --bf-border-width: 0.0625rem;
1003
1084
  --bf-bar-thickness: 0.1875rem;
1004
1085
  --bf-radius: 0rem;
1005
1086
  --bf-control-block-padding: 0.5rem;
@@ -1018,7 +1099,6 @@ html.u-baseline-grid::after {
1018
1099
  }
1019
1100
 
1020
1101
 
1021
- :where(.bf-theme.is-dark),
1022
1102
  :where(.bf-theme.is-dark) {
1023
1103
  --bf-color-text-default: var(--vf-color-text-default, var(--bf-color-text, #ffffff));
1024
1104
  --bf-color-text-muted: var(--vf-color-text-muted, var(--bf-color-muted, rgba(255, 255, 255, 0.6)));
@@ -1068,6 +1148,7 @@ html.u-baseline-grid::after {
1068
1148
  --bf-color-focus: var(--vf-color-focus, #99ccff);
1069
1149
 
1070
1150
  --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");
1151
+ --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
1152
  --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
1153
  --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
1154
  --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 +1242,10 @@ html.u-baseline-grid::after {
1161
1242
  grid-template-columns: minmax(0, 1fr);
1162
1243
  }
1163
1244
 
1245
+ :where(.bf-theme) :where(.bf-field.is-range.is-stacked) > :where(.bf-control, .bf-form-help) {
1246
+ grid-column: 1;
1247
+ }
1248
+
1164
1249
  :where(.bf-theme) :where(.bf-field.is-range.is-stacked) > :where(.bf-control) {
1165
1250
  min-inline-size: 0;
1166
1251
  }
@@ -1178,7 +1263,7 @@ html.u-baseline-grid::after {
1178
1263
  margin: 0;
1179
1264
  min-inline-size: 0;
1180
1265
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
1181
- padding-inline: var(--bf-panel-padding-inline);
1266
+ padding-inline: var(--bf-component-inline-inset-continuation);
1182
1267
  padding-block-start: var(--bf-panel-padding-block);
1183
1268
  }
1184
1269
 
@@ -1205,7 +1290,7 @@ html.u-baseline-grid::after {
1205
1290
  min-inline-size: 0;
1206
1291
  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
1292
  padding-block: max(0rem, calc(var(--bf-input-block-padding) - var(--bf-border-width)));
1208
- padding-inline: var(--bf-control-inline-padding-field);
1293
+ padding-inline: var(--bf-component-inline-inset-field);
1209
1294
  }
1210
1295
 
1211
1296
  :where(.bf-theme) :where(input[type='color'].bf-color-input) {
@@ -1224,8 +1309,8 @@ html.u-baseline-grid::after {
1224
1309
 
1225
1310
  :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
1311
  background-color: var(--bf-color-background-active);
1227
- outline: 2px solid var(--bf-color-focus);
1228
- outline-offset: 2px;
1312
+ outline: 0.125rem solid var(--bf-color-focus);
1313
+ outline-offset: 0.125rem;
1229
1314
  }
1230
1315
 
1231
1316
  :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 {
@@ -1278,7 +1363,7 @@ html.u-baseline-grid::after {
1278
1363
  margin-inline-end: var(--bf-field-gap);
1279
1364
  min-block-size: var(--bf-control-box-size-compact);
1280
1365
  padding-block: max(0rem, calc(var(--bf-control-block-padding-compact) - var(--bf-border-width)));
1281
- padding-inline: var(--bf-control-inline-padding-action);
1366
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
1282
1367
  }
1283
1368
 
1284
1369
  :where(.bf-theme) :where(input[type='file'])::file-selector-button:hover {
@@ -1287,16 +1372,31 @@ html.u-baseline-grid::after {
1287
1372
 
1288
1373
  :where(.bf-theme) :where(select) {
1289
1374
  background-image: var(--bf-ui-icon-chevron-down);
1290
- background-position: right var(--bf-control-inline-padding-field) center;
1375
+ background-position: right var(--bf-component-inline-inset-field) center;
1291
1376
  background-repeat: no-repeat;
1292
1377
  background-size: 1rem 1rem;
1293
- padding-inline-end: calc(var(--bf-control-inline-padding-field) * 2.5);
1378
+ overflow: hidden;
1379
+ padding-inline-end: calc(var(--bf-component-inline-inset-field) * 2.5);
1380
+ text-overflow: ellipsis;
1381
+ white-space: nowrap;
1294
1382
  }
1295
1383
 
1296
1384
  :where(.bf-theme) :where(input[type='number'], .bf-slider-input) {
1297
1385
  font-variant-numeric: tabular-nums;
1298
1386
  }
1299
1387
 
1388
+ /* Number fields retain their native input semantics and keyboard stepping,
1389
+ while one field-owned background paints the compact pair. Sharing select's
1390
+ 1rem canvas and end position avoids a second browser-reserved spin slot. */
1391
+ :where(.bf-theme) :where(input[type='number']) {
1392
+ appearance: textfield;
1393
+ background-image: var(--bf-ui-icon-number-stepper);
1394
+ background-position: right var(--bf-component-inline-inset-field) center;
1395
+ background-repeat: no-repeat;
1396
+ background-size: 1rem 1rem;
1397
+ padding-inline-end: calc(var(--bf-component-inline-inset-field) * 2.5);
1398
+ }
1399
+
1300
1400
  :where(.bf-theme) :where(.bf-slider-input) {
1301
1401
  flex: 0 1 5rem;
1302
1402
  inline-size: min(100%, 5rem);
@@ -1308,12 +1408,14 @@ html.u-baseline-grid::after {
1308
1408
 
1309
1409
  :where(.bf-theme) :where(input[type='number'])::-webkit-inner-spin-button,
1310
1410
  :where(.bf-theme) :where(input[type='number'])::-webkit-outer-spin-button {
1411
+ appearance: none;
1311
1412
  margin: 0;
1312
1413
  }
1313
1414
 
1314
1415
  :where(.bf-theme) :where(.bf-checkbox, .bf-radio) {
1416
+ display: grid;
1315
1417
  margin: 0;
1316
- min-block-size: var(--bf-tick-row-block-size);
1418
+ padding-inline-start: var(--bf-leading-mark-group-inset);
1317
1419
  position: relative;
1318
1420
  }
1319
1421
 
@@ -1334,12 +1436,11 @@ html.u-baseline-grid::after {
1334
1436
  font-weight: var(--bf-body-font-weight, 400);
1335
1437
  line-height: var(--bf-body-line-height, 1.5rem);
1336
1438
  color: var(--bf-color-text-default);
1439
+ border-block: var(--bf-border-width) solid transparent;
1337
1440
  cursor: pointer;
1338
1441
  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);
1442
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
1443
+ padding-block: var(--bf-single-line-row-padding-block);
1343
1444
  padding-inline-start: var(--bf-tick-label-offset);
1344
1445
  position: relative;
1345
1446
  }
@@ -1370,7 +1471,7 @@ html.u-baseline-grid::after {
1370
1471
  border-left: calc(var(--bf-border-width) * 2) solid var(--bf-color-background-default);
1371
1472
  inline-size: calc(var(--bf-control-visual-size) * 0.6);
1372
1473
  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));
1474
+ inset-block-start: calc(var(--bf-tick-box-offset) + (var(--bf-control-visual-size) * 0.18) + (var(--bf-border-width) * 2));
1374
1475
  opacity: 0;
1375
1476
  transform: rotate(-45deg);
1376
1477
  }
@@ -1408,20 +1509,19 @@ html.u-baseline-grid::after {
1408
1509
  }
1409
1510
 
1410
1511
  :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;
1512
+ outline: 0.125rem solid var(--bf-color-focus);
1513
+ outline-offset: 0.125rem;
1413
1514
  }
1414
1515
 
1415
1516
  :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;
1517
+ outline: 0.125rem solid var(--bf-color-focus);
1518
+ outline-offset: 0.125rem;
1418
1519
  }
1419
1520
 
1420
1521
  :where(.bf-theme) :where(.bf-switch) {
1421
1522
  align-items: flex-start;
1422
1523
  display: inline-flex;
1423
1524
  gap: var(--bf-field-gap);
1424
- min-block-size: var(--bf-switch-row-block-size);
1425
1525
  position: relative;
1426
1526
  }
1427
1527
 
@@ -1470,8 +1570,8 @@ html.u-baseline-grid::after {
1470
1570
  }
1471
1571
 
1472
1572
  :where(.bf-theme) :where(.bf-switch-input:focus-visible + .bf-switch-slider) {
1473
- outline: 2px solid var(--bf-color-focus);
1474
- outline-offset: 2px;
1573
+ outline: 0.125rem solid var(--bf-color-focus);
1574
+ outline-offset: 0.125rem;
1475
1575
  }
1476
1576
 
1477
1577
  :where(.bf-theme) :where(.bf-switch-input:disabled + .bf-switch-slider) {
@@ -1485,11 +1585,11 @@ html.u-baseline-grid::after {
1485
1585
  font-weight: var(--bf-body-font-weight, 400);
1486
1586
  line-height: var(--bf-body-line-height, 1.5rem);
1487
1587
  color: var(--bf-color-text-default);
1588
+ border-block: var(--bf-border-width) solid transparent;
1488
1589
  cursor: pointer;
1489
1590
  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);
1591
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
1592
+ padding-block: var(--bf-single-line-row-padding-block);
1493
1593
  }
1494
1594
 
1495
1595
  :where(.bf-theme) :where(.bf-validation-message) {
@@ -1498,11 +1598,12 @@ html.u-baseline-grid::after {
1498
1598
  font-style: var(--bf-body-font-style, normal);
1499
1599
  font-weight: var(--bf-body-font-weight, 400);
1500
1600
  line-height: var(--bf-body-line-height, 1.5rem);
1601
+ border-block: var(--bf-border-width) solid transparent;
1501
1602
  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));
1603
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
1604
+ margin-inline-start: var(--bf-leading-mark-group-inset);
1605
+ padding-block: var(--bf-single-line-row-padding-block);
1606
+ padding-inline-start: var(--bf-leading-mark-offset);
1506
1607
  position: relative;
1507
1608
  }
1508
1609
 
@@ -1637,7 +1738,7 @@ html.u-baseline-grid::after {
1637
1738
  border: var(--bf-border-width) solid var(--bf-color-border-high-contrast);
1638
1739
  block-size: var(--bf-control-visual-size);
1639
1740
  border-radius: 50%;
1640
- box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 1px rgba(0, 0, 0, 0.2);
1741
+ box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 0.0625rem rgba(0, 0, 0, 0.2);
1641
1742
  inline-size: var(--bf-control-visual-size);
1642
1743
  margin-top: calc((var(--bf-slider-track-size) - var(--bf-control-visual-size)) / 2);
1643
1744
  }
@@ -1663,7 +1764,7 @@ html.u-baseline-grid::after {
1663
1764
  border: var(--bf-border-width) solid var(--bf-color-border-high-contrast);
1664
1765
  block-size: var(--bf-control-visual-size);
1665
1766
  border-radius: 50%;
1666
- box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 1px rgba(0, 0, 0, 0.2);
1767
+ box-shadow: 0 0 calc(var(--bf-control-visual-size) * 0.25) 0.0625rem rgba(0, 0, 0, 0.2);
1667
1768
  inline-size: var(--bf-control-visual-size);
1668
1769
  }
1669
1770
 
@@ -1762,9 +1863,9 @@ html.u-baseline-grid::after {
1762
1863
  color: var(--bf-color-text-default);
1763
1864
  cursor: pointer;
1764
1865
  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);
1866
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
1867
+ padding-block: var(--bf-single-line-row-padding-block);
1868
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
1768
1869
  text-align: center;
1769
1870
  text-decoration: none;
1770
1871
  }
@@ -1782,6 +1883,13 @@ html.u-baseline-grid::after {
1782
1883
  background-color: var(--bf-color-background-hover);
1783
1884
  }
1784
1885
 
1886
+ /* Anchor buttons are controls, not prose links. Qualifying the element and
1887
+ * its interaction states prevents the generic anchor underline from leaking
1888
+ * through while leaving the explicit is-link variant unchanged. */
1889
+ :where(.bf-theme) :where(a.bf-button:not(.is-link):is(:hover, :active)) {
1890
+ text-decoration: none;
1891
+ }
1892
+
1785
1893
  :where(.bf-theme) :where(.bf-button:not(.is-base):is(:active, [aria-pressed='true'])) {
1786
1894
  background-color: var(--bf-color-background-active);
1787
1895
  }
@@ -1791,8 +1899,8 @@ html.u-baseline-grid::after {
1791
1899
  }
1792
1900
 
1793
1901
  :where(.bf-theme) :where(.bf-button, .bf-button.is-base):focus-visible {
1794
- outline: 2px solid var(--bf-color-focus);
1795
- outline-offset: 2px;
1902
+ outline: 0.125rem solid var(--bf-color-focus);
1903
+ outline-offset: 0.125rem;
1796
1904
  }
1797
1905
 
1798
1906
  /* ------------------------------------------------------------------ */
@@ -1864,7 +1972,7 @@ html.u-baseline-grid::after {
1864
1972
  background-color: transparent;
1865
1973
  color: var(--bf-color-link-default);
1866
1974
  text-decoration: underline;
1867
- text-decoration-thickness: 1px;
1975
+ text-decoration-thickness: 0.0625rem;
1868
1976
  text-underline-offset: 0.075em;
1869
1977
  }
1870
1978
 
@@ -1891,6 +1999,19 @@ html.u-baseline-grid::after {
1891
1999
  justify-content: center;
1892
2000
  }
1893
2001
 
2002
+ /* An icon-only flex button has no text line box to preserve the occupied
2003
+ * control rhythm. A zero-width metric strut restores the active body line
2004
+ * without imposing a target block size or changing icon/label spacing. */
2005
+ :where(.bf-theme) :where(.bf-button.is-icon:not(:has(.bf-button-label))) {
2006
+ column-gap: 0;
2007
+ }
2008
+
2009
+ :where(.bf-theme) :where(.bf-button.is-icon:not(:has(.bf-button-label)))::before {
2010
+ block-size: var(--bf-body-line-height);
2011
+ content: "";
2012
+ inline-size: 0;
2013
+ }
2014
+
1894
2015
  :where(.bf-theme) :where(.bf-button-label) {
1895
2016
  min-inline-size: 0;
1896
2017
  }
@@ -2051,7 +2172,7 @@ html.u-baseline-grid::after {
2051
2172
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-notice-border);
2052
2173
  color: var(--bf-color-text-default);
2053
2174
  display: flow-root;
2054
- margin-block: 0 var(--bf-section-space-shallow);
2175
+ margin: 0;
2055
2176
  max-inline-size: 100%;
2056
2177
  padding-block: var(--bf-space-2);
2057
2178
  padding-inline: var(--bf-space-2);
@@ -2097,16 +2218,15 @@ html.u-baseline-grid::after {
2097
2218
  /* ------------------------------------------------------------------ */
2098
2219
  /* Static content ports — Vanilla data spotlight and divided section. */
2099
2220
  /* Their children retain role-owned rhythm; these layout */
2100
- /* wrappers add only structural columns, rules, and explicit section ends. */
2221
+ /* wrappers add only structural columns, rules, and internal gaps. */
2101
2222
  /* ------------------------------------------------------------------ */
2102
2223
 
2103
2224
  /* Data spotlight: Vanilla's equal-height wrap becomes an intrinsic grid.
2104
2225
  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. */
2226
+ thickness. The items container owns every inter-row gap. */
2107
2227
  :where(.bf-theme) :where(.bf-data-spotlight) {
2108
2228
  container-type: inline-size;
2109
- margin-block-end: var(--bf-section-space);
2229
+ margin: 0;
2110
2230
  min-inline-size: 0;
2111
2231
  }
2112
2232
 
@@ -2119,15 +2239,13 @@ html.u-baseline-grid::after {
2119
2239
  display: grid;
2120
2240
  grid-template-columns: minmax(0, 1fr);
2121
2241
  min-inline-size: 0;
2242
+ row-gap: var(--bf-section-space-shallow);
2122
2243
  }
2123
2244
 
2124
2245
  :where(.bf-theme) :where(.bf-data-spotlight-item) {
2125
2246
  min-inline-size: 0;
2126
2247
  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);
2248
+ padding: 0;
2131
2249
  }
2132
2250
 
2133
2251
  :where(.bf-theme) :where(.bf-data-spotlight-stat) {
@@ -2180,6 +2298,14 @@ html.u-baseline-grid::after {
2180
2298
  @container (width >= 38.75rem) {
2181
2299
  :where(.bf-theme) :where(.bf-data-spotlight-items) {
2182
2300
  grid-template-columns: repeat(2, minmax(0, 1fr));
2301
+ row-gap: var(--bf-space-1);
2302
+ }
2303
+
2304
+ :where(.bf-theme) :where(.bf-data-spotlight-items)::after {
2305
+ block-size: calc(var(--bf-section-space-shallow) - (var(--bf-space-1) * 2));
2306
+ content: "";
2307
+ grid-column: 1 / -1;
2308
+ grid-row: 6;
2183
2309
  }
2184
2310
 
2185
2311
  :where(.bf-theme) :where(.bf-data-spotlight-header, .bf-data-spotlight-item) {
@@ -2188,10 +2314,6 @@ html.u-baseline-grid::after {
2188
2314
  grid-template-rows: subgrid;
2189
2315
  }
2190
2316
 
2191
- :where(.bf-theme) :where(.bf-data-spotlight-item) {
2192
- padding-block-end: 0;
2193
- }
2194
-
2195
2317
  :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-header) {
2196
2318
  block-size: 0;
2197
2319
  overflow: visible;
@@ -2199,7 +2321,13 @@ html.u-baseline-grid::after {
2199
2321
 
2200
2322
  :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:first-of-type),
2201
2323
  :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);
2324
+ grid-row: span 5;
2325
+ }
2326
+
2327
+ :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-item:nth-of-type(2)),
2328
+ :where(.bf-theme) :where(.bf-data-spotlight.is-three-blocks) :where(.bf-data-spotlight-item:nth-of-type(n + 2)),
2329
+ :where(.bf-theme) :where(.bf-data-spotlight.is-four-blocks) :where(.bf-data-spotlight-item:nth-of-type(n + 3)) {
2330
+ grid-row: 7 / span 5;
2203
2331
  }
2204
2332
  }
2205
2333
 
@@ -2212,15 +2340,18 @@ html.u-baseline-grid::after {
2212
2340
  grid-template-columns: repeat(4, minmax(0, 1fr));
2213
2341
  }
2214
2342
 
2343
+ :where(.bf-theme) :where(.bf-data-spotlight-items)::after {
2344
+ content: none;
2345
+ }
2346
+
2215
2347
  :where(.bf-theme) :where(.bf-data-spotlight.is-two-blocks) :where(.bf-data-spotlight-header) {
2216
2348
  block-size: 0;
2217
2349
  grid-column: span 2;
2218
2350
  overflow: visible;
2219
2351
  }
2220
2352
 
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;
2353
+ :where(.bf-theme) :where(.bf-data-spotlight-item) {
2354
+ grid-row: span 5;
2224
2355
  }
2225
2356
  }
2226
2357
 
@@ -2229,7 +2360,7 @@ html.u-baseline-grid::after {
2229
2360
  headings, copy, and content items keep their own metric-derived rhythm. */
2230
2361
  :where(.bf-theme) :where(.bf-divided-section) {
2231
2362
  container-type: inline-size;
2232
- margin-block-end: var(--bf-section-space);
2363
+ margin: 0;
2233
2364
  min-inline-size: 0;
2234
2365
  }
2235
2366
 
@@ -2248,37 +2379,41 @@ html.u-baseline-grid::after {
2248
2379
  }
2249
2380
 
2250
2381
  :where(.bf-theme) :where(.bf-divided-section-list) {
2251
- align-content: start;
2252
- display: grid;
2382
+ --bf-divided-section-rule-to-content: calc(0.5rem - var(--bf-border-width));
2383
+ --bf-stack-space: 1.5rem;
2253
2384
  list-style: none;
2254
2385
  margin: 0;
2255
2386
  padding: 0;
2256
2387
  }
2257
2388
 
2389
+ /* Preserve the pre-0.1.5 list markup; canonical composition also carries
2390
+ bf-stack so the container remains the explicit owner of item spacing. */
2391
+ :where(.bf-theme) :where(.bf-divided-section-list:not(.bf-stack)) {
2392
+ align-content: start;
2393
+ display: grid;
2394
+ gap: var(--bf-stack-space);
2395
+ }
2396
+
2258
2397
  :where(.bf-theme) :where(.bf-divided-section-item) {
2259
2398
  align-content: start;
2260
2399
  display: grid;
2400
+ margin: 0;
2261
2401
  min-inline-size: 0;
2262
2402
  overflow-wrap: anywhere;
2403
+ padding: 0;
2404
+ position: relative;
2263
2405
  }
2264
2406
 
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
- }
2407
+ :where(.bf-theme) :where(.bf-divided-section-item + .bf-divided-section-item)::before {
2408
+ background: var(--bf-color-border-low-contrast);
2409
+ block-size: var(--bf-border-width);
2410
+ content: "";
2411
+ inset-block-start: calc((var(--bf-divided-section-rule-to-content) + var(--bf-border-width)) * -1);
2412
+ inset-inline: 0;
2413
+ position: absolute;
2279
2414
  }
2280
2415
 
2281
- @container (width >= 64.75rem) {
2416
+ @container (width >= 45rem) {
2282
2417
  :where(.bf-theme) :where(.bf-divided-section) :where(.bf-divided-section-layout) {
2283
2418
  column-gap: var(--bf-grid-gap-inline);
2284
2419
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -2363,12 +2498,13 @@ html.u-baseline-grid::after {
2363
2498
  border: var(--bf-border-width) solid var(--bf-color-border-default);
2364
2499
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-notification-accent);
2365
2500
  color: var(--bf-color-text-default);
2366
- margin-block: 0 var(--bf-space-3);
2501
+ margin-block: 0;
2367
2502
  max-inline-size: 100%;
2368
2503
  min-inline-size: 0;
2369
2504
  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;
2505
+ padding-block-end: max(0rem, calc(var(--bf-space-half) - var(--bf-border-width)));
2506
+ padding-block-start: 0;
2507
+ padding-inline: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness)) var(--bf-space-1);
2372
2508
  position: relative;
2373
2509
  }
2374
2510
 
@@ -2391,14 +2527,14 @@ html.u-baseline-grid::after {
2391
2527
  :where(.bf-theme) :where(.bf-notification.is-borderless) {
2392
2528
  border: 0;
2393
2529
  padding-block: 0;
2394
- padding-inline: calc(var(--bf-space-2) * 2) 0;
2530
+ padding-inline: calc(var(--bf-icon-size-default) + var(--bf-space-1)) 0;
2395
2531
  }
2396
2532
 
2397
2533
  :where(.bf-theme) :where(.bf-notification-icon) {
2398
2534
  background-color: var(--bf-notification-accent);
2399
2535
  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);
2536
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start) - var(--bf-border-width));
2537
+ inset-inline-start: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness) - var(--bf-icon-size-default) - var(--bf-space-1));
2402
2538
  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
2539
  mask-position: center;
2404
2540
  mask-repeat: no-repeat;
@@ -2419,22 +2555,52 @@ html.u-baseline-grid::after {
2419
2555
  }
2420
2556
 
2421
2557
  :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));
2558
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start));
2423
2559
  inset-inline-start: 0;
2424
2560
  }
2425
2561
 
2562
+ :where(.bf-theme) :where(.bf-notification.is-inline > .bf-notification-icon) {
2563
+ inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start) - var(--bf-border-width));
2564
+ }
2565
+
2426
2566
  :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
2427
2567
  max-inline-size: 100%;
2428
2568
  min-inline-size: 0;
2429
2569
  }
2430
2570
 
2431
2571
  :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);
2572
+ /* Neutralise the shell's top border so the first metric role starts on-grid. */
2573
+ margin-block: calc(var(--bf-border-width) * -1) 0;
2574
+ padding-block-start: 0;
2575
+ padding-inline-end: calc(var(--bf-icon-size-default) + var(--bf-space-1));
2576
+ }
2577
+
2578
+ :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-content) {
2579
+ --bf-stack-space: 0rem;
2580
+ margin-block-start: 0;
2435
2581
  }
2436
2582
 
2437
- :where(.bf-theme) :where(.bf-notification-title, .bf-notification-message, .bf-notification-timestamp) {
2583
+ /* Metadata-bearing notifications use a full baseline between title and copy,
2584
+ and pair it with the full end inset. This keeps both the metadata boundary
2585
+ and the complete shell on-grid; simpler messages retain compact rhythm. */
2586
+ :where(.bf-theme) :where(.bf-notification:has(> .bf-notification-meta)) {
2587
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width));
2588
+ }
2589
+
2590
+ :where(.bf-theme) :where(.bf-notification.is-inline) {
2591
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width));
2592
+ }
2593
+
2594
+ /* Return the cancelled H6/body metric edges to the shell boundary. The
2595
+ * Documentation tier deliberately gives those roles different metrics, so
2596
+ * deriving this inset keeps every bordered notification on-grid without
2597
+ * reopening the visible title/copy gap. Keep this after the shell variants so
2598
+ * the metric relationship owns their final compensation. */
2599
+ :where(.bf-theme) :where(.bf-notification:has(> .bf-notification-content.is-metric-flush):not(.is-borderless)) {
2600
+ 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));
2601
+ }
2602
+
2603
+ :where(.bf-theme) :where(.bf-notification-message, .bf-notification-timestamp) {
2438
2604
  font-family: var(--bf-body-font-family);
2439
2605
  font-size: var(--bf-body-font-size);
2440
2606
  font-style: var(--bf-body-font-style);
@@ -2442,20 +2608,11 @@ html.u-baseline-grid::after {
2442
2608
  max-inline-size: 100%;
2443
2609
  }
2444
2610
 
2445
- :where(.bf-theme) :where(.bf-notification-title) {
2446
- font-weight: 600;
2447
- margin-block: 0;
2448
- padding-block: 0;
2449
- }
2450
-
2451
2611
  :where(.bf-theme) :where(.bf-notification-message) {
2452
2612
  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;
2613
+ margin-block: 0 var(--bf-body-margin-bottom);
2614
+ padding-block-end: 0;
2615
+ padding-block-start: var(--bf-body-nudge-start);
2459
2616
  }
2460
2617
 
2461
2618
  :where(.bf-theme) :where(.bf-notification-close) {
@@ -2465,8 +2622,8 @@ html.u-baseline-grid::after {
2465
2622
  margin-block-end: 0;
2466
2623
  padding: 0;
2467
2624
  position: absolute;
2468
- inset-block-start: var(--bf-space-1);
2469
- inset-inline-end: var(--bf-space-1);
2625
+ inset-block-start: 0;
2626
+ inset-inline-end: 0;
2470
2627
  }
2471
2628
 
2472
2629
  :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-close) {
@@ -2481,7 +2638,7 @@ html.u-baseline-grid::after {
2481
2638
  flex-wrap: wrap;
2482
2639
  gap: var(--bf-space-1) var(--bf-space-2);
2483
2640
  justify-content: space-between;
2484
- margin-block-end: var(--bf-space-1);
2641
+ margin-block-end: 0;
2485
2642
  padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
2486
2643
  padding-inline-end: var(--bf-space-2);
2487
2644
  }
@@ -2494,7 +2651,7 @@ html.u-baseline-grid::after {
2494
2651
  :where(.bf-theme) :where(.bf-notification-timestamp) {
2495
2652
  color: var(--bf-color-text-muted);
2496
2653
  font-weight: var(--bf-body-font-weight);
2497
- margin-block: 0 calc(var(--bf-space-2) - var(--bf-body-nudge-start));
2654
+ margin-block: 0 var(--bf-body-margin-bottom);
2498
2655
  padding-block: var(--bf-body-nudge-start) 0;
2499
2656
  }
2500
2657
 
@@ -2509,7 +2666,7 @@ html.u-baseline-grid::after {
2509
2666
 
2510
2667
  :where(.bf-theme) :where(.bf-notification-actions > .bf-button.is-link) {
2511
2668
  flex: 0 0 auto;
2512
- margin-block-end: calc(var(--bf-space-2) - var(--bf-body-nudge-start));
2669
+ margin-block-end: var(--bf-body-margin-bottom);
2513
2670
  padding-block: var(--bf-body-nudge-start) 0;
2514
2671
  }
2515
2672
 
@@ -2529,10 +2686,10 @@ html.u-baseline-grid::after {
2529
2686
  cursor: inherit;
2530
2687
  display: inline-block;
2531
2688
  font: inherit;
2532
- margin: -2px calc(var(--bf-space-half) * -1);
2689
+ margin: -0.125rem calc(var(--bf-space-half) * -1);
2533
2690
  max-inline-size: 100%;
2534
2691
  overflow: hidden;
2535
- padding: 2px var(--bf-space-half);
2692
+ padding: 0.125rem var(--bf-space-half);
2536
2693
  text-align: inherit;
2537
2694
  text-decoration: inherit;
2538
2695
  text-overflow: inherit;
@@ -2543,7 +2700,7 @@ html.u-baseline-grid::after {
2543
2700
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort]:hover, .bf-table-sort-button:focus-visible) {
2544
2701
  color: var(--bf-color-link-default);
2545
2702
  text-decoration: underline;
2546
- text-decoration-thickness: 1px;
2703
+ text-decoration-thickness: 0.0625rem;
2547
2704
  text-underline-offset: 0.075em;
2548
2705
  }
2549
2706
 
@@ -2552,11 +2709,11 @@ html.u-baseline-grid::after {
2552
2709
  }
2553
2710
 
2554
2711
  :where(.bf-theme) :where(.bf-table-sort-button:focus-visible) {
2555
- outline: 2px solid var(--bf-color-focus);
2556
- outline-offset: -2px;
2712
+ outline: 0.125rem solid var(--bf-color-focus);
2713
+ outline-offset: -0.125rem;
2557
2714
  }
2558
2715
 
2559
- :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
2716
+ :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort])::after {
2560
2717
  background-image: var(--bf-ui-icon-chevron-down);
2561
2718
  background-position: center;
2562
2719
  background-repeat: no-repeat;
@@ -2566,9 +2723,14 @@ html.u-baseline-grid::after {
2566
2723
  display: inline-block;
2567
2724
  inline-size: var(--bf-icon-size-default);
2568
2725
  margin-inline-start: var(--bf-space-half);
2726
+ opacity: 0;
2569
2727
  vertical-align: calc((1cap - var(--bf-icon-size-default)) / 2);
2570
2728
  }
2571
2729
 
2730
+ :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
2731
+ opacity: 1;
2732
+ }
2733
+
2572
2734
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'])::after {
2573
2735
  transform: rotate(180deg);
2574
2736
  }
@@ -2605,9 +2767,9 @@ html.u-baseline-grid::after {
2605
2767
  }
2606
2768
 
2607
2769
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > thead) {
2608
- block-size: 1px;
2770
+ block-size: 0.0625rem;
2609
2771
  clip-path: inset(50%);
2610
- inline-size: 1px;
2772
+ inline-size: 0.0625rem;
2611
2773
  overflow: hidden;
2612
2774
  position: absolute;
2613
2775
  white-space: nowrap;
@@ -2678,7 +2840,7 @@ html.u-baseline-grid::after {
2678
2840
  :where(.bf-theme) :where(.bf-logo-section) {
2679
2841
  container-name: bf-logo-section;
2680
2842
  container-type: inline-size;
2681
- margin-block-end: var(--bf-section-space-shallow);
2843
+ margin: 0;
2682
2844
  min-inline-size: 0;
2683
2845
  }
2684
2846
 
@@ -2712,8 +2874,8 @@ html.u-baseline-grid::after {
2712
2874
  }
2713
2875
 
2714
2876
  :where(.bf-theme) :where(.bf-logo-section-link:focus-visible) {
2715
- outline: 2px solid var(--bf-color-focus);
2716
- outline-offset: 2px;
2877
+ outline: 0.125rem solid var(--bf-color-focus);
2878
+ outline-offset: 0.125rem;
2717
2879
  }
2718
2880
 
2719
2881
  :where(.bf-theme) :where(.bf-logo-section-logo) {
@@ -2740,7 +2902,7 @@ html.u-baseline-grid::after {
2740
2902
  inline-size: 100%;
2741
2903
  }
2742
2904
 
2743
- /* Vanilla's small breakpoint is 620px. The items descendant, rather than the
2905
+ /* Vanilla's small breakpoint is 38.75rem. The items descendant, rather than the
2744
2906
  query container itself, responds when its allocated space reaches it. */
2745
2907
  @container bf-logo-section (width >= 38.75rem) {
2746
2908
  :where(.bf-theme) :where(.bf-logo-section-items) {
@@ -2764,19 +2926,21 @@ html.u-baseline-grid::after {
2764
2926
 
2765
2927
  /* ------------------------------------------------------------------ */
2766
2928
  /* Media object — semantic media/content slots with a container-owned */
2767
- /* structural collapse only. Content roles retain their own spacing. */
2929
+ /* structural collapse. Content roles retain their metric boxes. */
2768
2930
  /* ------------------------------------------------------------------ */
2769
2931
 
2770
2932
  :where(.bf-theme) :where(.bf-media-object) {
2771
- margin-block-end: var(--bf-section-space-shallow);
2933
+ container-name: bf-media-object;
2934
+ container-type: inline-size;
2935
+ margin: 0;
2772
2936
  min-inline-size: 0;
2773
2937
  }
2774
2938
 
2775
2939
  :where(.bf-theme) :where(.bf-media-object-layout) {
2776
- display: grid;
2777
2940
  align-items: start;
2778
- column-gap: var(--bf-space-2);
2779
- grid-template-columns: auto minmax(0, 1fr);
2941
+ column-gap: var(--bf-grid-gap-inline);
2942
+ display: grid;
2943
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2780
2944
  min-inline-size: 0;
2781
2945
  }
2782
2946
 
@@ -2788,6 +2952,10 @@ html.u-baseline-grid::after {
2788
2952
  min-inline-size: 0;
2789
2953
  }
2790
2954
 
2955
+ :where(.bf-theme) :where(.bf-media-object-media) {
2956
+ grid-column: 1 / span 2;
2957
+ }
2958
+
2791
2959
  :where(.bf-theme) :where(.bf-media-object-media > :where(img, picture, svg, video)) {
2792
2960
  block-size: 100%;
2793
2961
  display: block;
@@ -2802,6 +2970,7 @@ html.u-baseline-grid::after {
2802
2970
  }
2803
2971
 
2804
2972
  :where(.bf-theme) :where(.bf-media-object-content) {
2973
+ grid-column: 3 / -1;
2805
2974
  min-inline-size: 0;
2806
2975
  overflow-wrap: anywhere;
2807
2976
  }
@@ -2841,8 +3010,12 @@ html.u-baseline-grid::after {
2841
3010
  }
2842
3011
 
2843
3012
  :where(.bf-theme) :where(.bf-media-object-meta-list) {
3013
+ --bf-stack-space: var(--bf-space-1);
3014
+ align-content: start;
3015
+ display: grid;
3016
+ gap: var(--bf-stack-space);
2844
3017
  list-style: none;
2845
- margin: var(--bf-space-1) 0 0;
3018
+ margin: 0;
2846
3019
  padding: 0;
2847
3020
  }
2848
3021
 
@@ -2855,22 +3028,22 @@ html.u-baseline-grid::after {
2855
3028
  overflow-wrap: anywhere;
2856
3029
  }
2857
3030
 
2858
- :where(.bf-theme) :where(.bf-media-object-meta + .bf-media-object-meta) {
2859
- margin-block-start: var(--bf-space-1);
2860
- }
2861
-
2862
3031
  :where(.bf-theme) :where(.bf-media-object-meta .bf-icon) {
2863
3032
  margin-block-start: var(--bf-body-nudge-start);
2864
3033
  }
2865
3034
 
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
- }
3035
+ @container bf-media-object (width >= 38.75rem) {
3036
+ :where(.bf-theme) :where(.bf-media-object-layout) {
3037
+ grid-template-columns: repeat(8, minmax(0, 1fr));
3038
+ }
2870
3039
 
2871
- :where(.bf-theme) :where(.bf-media-object.is-media-end) :where(.bf-media-object-media) {
2872
- grid-column: 2;
2873
- grid-row: 1;
3040
+ :where(.bf-theme) :where(.bf-media-object-media) {
3041
+ grid-column: 1 / span 2;
3042
+ }
3043
+
3044
+ :where(.bf-theme) :where(.bf-media-object-content) {
3045
+ grid-column: 3 / -1;
3046
+ }
2874
3047
  }
2875
3048
 
2876
3049
 
@@ -2881,20 +3054,13 @@ html.u-baseline-grid::after {
2881
3054
  :where(.bf-theme) :where(.bf-linked-logo-section) {
2882
3055
  container-name: bf-linked-logo-section;
2883
3056
  container-type: inline-size;
2884
- margin-block-end: var(--bf-section-space);
3057
+ margin: 0;
2885
3058
  min-inline-size: 0;
2886
3059
  }
2887
3060
 
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
3061
  :where(.bf-theme) :where(.bf-linked-logo-section-layout) {
2897
3062
  display: grid;
3063
+ gap: var(--bf-section-space-shallow);
2898
3064
  grid-template-columns: minmax(0, 1fr);
2899
3065
  min-inline-size: 0;
2900
3066
  }
@@ -2927,7 +3093,7 @@ html.u-baseline-grid::after {
2927
3093
  max-inline-size: none;
2928
3094
  }
2929
3095
 
2930
- :where(.bf-theme) :where(.bf-linked-logo-section-card) {
3096
+ :where(.bf-theme) :where(a.bf-linked-logo-section-card) {
2931
3097
  align-content: start;
2932
3098
  align-items: stretch;
2933
3099
  color: inherit;
@@ -2939,7 +3105,7 @@ html.u-baseline-grid::after {
2939
3105
  text-decoration: none;
2940
3106
  }
2941
3107
 
2942
- :where(.bf-theme) :where(.bf-linked-logo-section-card:hover) :where(.bf-linked-logo-section-card-copy) {
3108
+ :where(.bf-theme) :where(a.bf-linked-logo-section-card:hover) :where(.bf-linked-logo-section-card-copy) {
2943
3109
  text-decoration: underline;
2944
3110
  }
2945
3111
 
@@ -2958,7 +3124,7 @@ html.u-baseline-grid::after {
2958
3124
  of baselines tall. Keep the visual ratio exact and put only the residual
2959
3125
  rhythm compensation after the mark; the copy keeps its own semantic
2960
3126
  spacing and the occupied card still lands on the tier grid. */
2961
- @supports (margin-block-end: round(up, 1px, 1px)) {
3127
+ @supports (margin-block-end: round(up, 0.0625rem, 0.0625rem)) {
2962
3128
  :where(.bf-theme) :where(.bf-linked-logo-section-mark) {
2963
3129
  margin-block-end: calc(
2964
3130
  round(up, calc(100cqi * 9 / 16), var(--bf-baseline))
@@ -2990,21 +3156,25 @@ html.u-baseline-grid::after {
2990
3156
  overflow-wrap: anywhere;
2991
3157
  }
2992
3158
 
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. */
3159
+ /* The linked-logo block moves from one to two cards per row at the 4-column
3160
+ medium grid. The balanced 50/50 section split uses the shared readable
3161
+ threshold; the 25/75 content rail and four-card density retain their
3162
+ separately measured wide threshold. The root establishes the query context;
3163
+ only descendants change. */
2997
3164
  @container bf-linked-logo-section (width >= 38.75rem) {
2998
3165
  :where(.bf-theme) :where(.bf-linked-logo-section-logos) :where(.bf-logo-section-items) {
2999
3166
  grid-template-columns: repeat(2, minmax(0, 1fr));
3000
3167
  }
3001
3168
  }
3002
3169
 
3003
- @container bf-linked-logo-section (width >= 64.75rem) {
3170
+ @container bf-linked-logo-section (width >= 45rem) {
3004
3171
  :where(.bf-theme) :where(.bf-linked-logo-section.is-50-50) :where(.bf-linked-logo-section-layout) {
3005
3172
  column-gap: var(--bf-grid-gap-inline);
3006
3173
  grid-template-columns: repeat(2, minmax(0, 1fr));
3007
3174
  }
3175
+ }
3176
+
3177
+ @container bf-linked-logo-section (width >= 64.75rem) {
3008
3178
 
3009
3179
  :where(.bf-theme) :where(.bf-linked-logo-section.is-25-75) :where(.bf-linked-logo-section-layout) {
3010
3180
  column-gap: var(--bf-grid-gap-inline);
@@ -3107,35 +3277,27 @@ html.u-baseline-grid::after {
3107
3277
  }
3108
3278
 
3109
3279
  /* 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) {
3280
+ :where(.bf-theme) :where(a.bf-basic-section-title-link, a.bf-basic-section-title-link:visited) {
3111
3281
  color: var(--bf-color-link-default);
3112
3282
  text-decoration: none;
3113
3283
  }
3114
3284
 
3115
- :where(.bf-theme) :where(.bf-basic-section-title-link:hover) {
3285
+ :where(.bf-theme) :where(a.bf-basic-section-title-link:hover) {
3116
3286
  text-decoration: underline;
3117
3287
  text-decoration-thickness: var(--bf-border-width);
3118
3288
  text-underline-offset: 0.12em;
3119
3289
  }
3120
3290
 
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
3291
+ /* A balanced section switches at the shared readable 50/50 threshold. The
3292
+ layout descendant reacts to the root container; the query never tries to
3123
3293
  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) {
3294
+ @container bf-basic-section (width >= 45rem) {
3295
+ :where(.bf-theme) :where(.bf-basic-section-layout) {
3126
3296
  column-gap: var(--bf-grid-gap-inline);
3127
3297
  grid-template-columns: repeat(2, minmax(0, 1fr));
3128
3298
  }
3129
3299
  }
3130
3300
 
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
3301
  /* CTA section: Vanilla's 25/75 variant is an offset content rail. The full
3140
3302
  variant stays naturally full-width. Typography and action presentation are
3141
3303
  supplied by real heading elements and bf-cta-block. */
@@ -3149,19 +3311,23 @@ html.u-baseline-grid::after {
3149
3311
  display: grid;
3150
3312
  grid-template-columns: minmax(0, 1fr);
3151
3313
  min-inline-size: 0;
3152
- padding-block: calc(var(--bf-section-space-deep) / 2);
3153
3314
  }
3154
3315
 
3155
3316
  :where(.bf-theme) :where(.bf-cta-section-content) {
3317
+ --bf-stack-space: var(--bf-section-space-shallow);
3318
+ align-content: start;
3319
+ display: grid;
3320
+ gap: var(--bf-stack-space);
3156
3321
  min-inline-size: 0;
3157
3322
  overflow-wrap: anywhere;
3158
3323
  }
3159
3324
 
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
- }
3325
+ :where(.bf-theme) :where(.bf-cta-section-copy) {
3326
+ min-inline-size: 0;
3327
+ overflow-wrap: anywhere;
3328
+ }
3164
3329
 
3330
+ @container bf-cta-section (width >= 64.75rem) {
3165
3331
  :where(.bf-theme) :where(.bf-cta-section.is-offset) :where(.bf-cta-section-layout) {
3166
3332
  column-gap: var(--bf-grid-gap-inline);
3167
3333
  grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
@@ -3229,15 +3395,15 @@ html.u-baseline-grid::after {
3229
3395
  /* semantic gaps and every text child keeps metric compensation. */
3230
3396
  /* ------------------------------------------------------------------ */
3231
3397
 
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. */
3398
+ /* Hero: the compact arrival space belongs inside its entry rule. The outer
3399
+ stack owns the section exit, and the rule replaces one pixel of padding so
3400
+ it never changes the rhythm. */
3235
3401
  :where(.bf-theme) :where(.bf-hero) {
3236
3402
  border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
3237
3403
  container-name: bf-hero;
3238
3404
  container-type: inline-size;
3239
3405
  min-inline-size: 0;
3240
- padding-block-end: calc(var(--bf-section-space) / 2);
3406
+ padding-block-end: 0;
3241
3407
  padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
3242
3408
  }
3243
3409
 
@@ -3250,6 +3416,7 @@ html.u-baseline-grid::after {
3250
3416
 
3251
3417
  :where(.bf-theme) :where(.bf-hero-layout) {
3252
3418
  display: grid;
3419
+ gap: var(--bf-section-space-shallow);
3253
3420
  grid-template-columns: minmax(0, 1fr);
3254
3421
  min-inline-size: 0;
3255
3422
  }
@@ -3259,9 +3426,9 @@ html.u-baseline-grid::after {
3259
3426
  overflow-wrap: anywhere;
3260
3427
  }
3261
3428
 
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. */
3429
+ /* Legacy copy slots remain valid for signpost variants. The default arrival
3430
+ composition separates a title area from its supporting content area, and
3431
+ the demo composes each area with the public stack density modifiers. */
3265
3432
  :where(.bf-theme) :where(.bf-hero-copy) {
3266
3433
  align-content: start;
3267
3434
  display: grid;
@@ -3288,7 +3455,7 @@ html.u-baseline-grid::after {
3288
3455
  allocated a fluid grid track. Snap only the media block to the active tier
3289
3456
  baseline so the following semantic text remains on-grid; its inline track
3290
3457
  and the surrounding Vanilla proportions remain unchanged. */
3291
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3458
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3292
3459
  :where(.bf-theme) :where(.bf-hero-media > .bf-aspect, .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
3293
3460
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3294
3461
  }
@@ -3311,14 +3478,10 @@ html.u-baseline-grid::after {
3311
3478
  inline-size: 100%;
3312
3479
  }
3313
3480
 
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. */
3481
+ /* The section boundary follows the page-level desktop switch, while the
3482
+ two-column composition uses its measured intrinsic allocation below. */
3319
3483
  @media (width >= 64.75rem) {
3320
3484
  :where(.bf-theme) :where(.bf-hero) {
3321
- padding-block-end: var(--bf-section-space);
3322
3485
  padding-block-start: calc(var(--bf-space-3) - var(--bf-border-width));
3323
3486
  }
3324
3487
 
@@ -3327,7 +3490,7 @@ html.u-baseline-grid::after {
3327
3490
  }
3328
3491
  }
3329
3492
 
3330
- @container bf-hero (width >= 64.75rem) {
3493
+ @container bf-hero (width >= 45rem) {
3331
3494
  :where(.bf-theme) :where(.bf-hero-layout) {
3332
3495
  column-gap: var(--bf-grid-gap-inline);
3333
3496
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3347,9 +3510,10 @@ html.u-baseline-grid::after {
3347
3510
  }
3348
3511
  }
3349
3512
 
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) {
3513
+ /* The named variants retain their proportion but share the readable split
3514
+ threshold with the default hero. The modifier changes only structural
3515
+ tracks; it does not introduce an earlier cramped layout. */
3516
+ @container bf-hero (width >= 45rem) {
3353
3517
  :where(.bf-theme) :where(.bf-hero.is-split-medium) :where(.bf-hero-layout) {
3354
3518
  column-gap: var(--bf-grid-gap-inline);
3355
3519
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3369,14 +3533,10 @@ html.u-baseline-grid::after {
3369
3533
  :where(.bf-theme) :where(.bf-quote-wrapper) {
3370
3534
  container-name: bf-quote-wrapper;
3371
3535
  container-type: inline-size;
3372
- margin-block-end: var(--bf-section-space);
3536
+ margin: 0;
3373
3537
  min-inline-size: 0;
3374
3538
  }
3375
3539
 
3376
- :where(.bf-theme) :where(.bf-quote-wrapper.is-shallow) {
3377
- margin-block-end: var(--bf-section-space-shallow);
3378
- }
3379
-
3380
3540
  :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
3541
  min-inline-size: 0;
3382
3542
  overflow-wrap: anywhere;
@@ -3423,7 +3583,7 @@ html.u-baseline-grid::after {
3423
3583
  /* The quote rail can also be a fractional grid track. Keep its media from
3424
3584
  introducing a sub-baseline row while leaving quotation and citation rhythm
3425
3585
  entirely baseline-compensated while its stack owns semantic gaps. */
3426
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3586
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3427
3587
  :where(.bf-theme) :where(.bf-quote-wrapper-signpost > :where(img, picture, svg), .bf-quote-wrapper-media > .bf-aspect) {
3428
3588
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3429
3589
  }
@@ -3462,8 +3622,47 @@ html.u-baseline-grid::after {
3462
3622
  }
3463
3623
 
3464
3624
  @container bf-quote-wrapper (width >= 64.75rem) {
3625
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) {
3626
+ grid-template-columns: repeat(8, minmax(0, 1fr));
3627
+ }
3628
+
3629
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) > :first-child {
3630
+ grid-column: 1 / span 6;
3631
+ }
3632
+
3633
+ :where(.bf-theme) :where(.bf-quote-wrapper-header-link) {
3634
+ grid-column: 7 / -1;
3635
+ }
3636
+
3637
+ :where(.bf-theme) :where(.bf-quote-wrapper-layout) {
3638
+ grid-template-columns: repeat(8, minmax(0, 1fr));
3639
+ }
3640
+
3641
+ :where(.bf-theme) :where(.bf-quote-wrapper-signpost) {
3642
+ grid-column: 1 / span 2;
3643
+ }
3644
+
3645
+ :where(.bf-theme) :where(.bf-quote-wrapper-content, .bf-quote-wrapper-content:only-child) {
3646
+ display: grid;
3647
+ grid-column: 3 / -1;
3648
+ grid-template-columns: subgrid;
3649
+ }
3650
+
3465
3651
  :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
3466
- grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
3652
+ grid-column: 1 / -1;
3653
+ grid-template-columns: subgrid;
3654
+ }
3655
+
3656
+ :where(.bf-theme) :where(.bf-quote-wrapper-prose) {
3657
+ grid-column: 1 / span 4;
3658
+ }
3659
+
3660
+ :where(.bf-theme) :where(.bf-quote-wrapper-citation) {
3661
+ grid-column: 5 / -1;
3662
+ }
3663
+
3664
+ :where(.bf-theme) :where(.bf-quote-wrapper-content) > :where(.bf-cta-block, .bf-quote-wrapper-media) {
3665
+ grid-column: 1 / -1;
3467
3666
  }
3468
3667
  }
3469
3668
 
@@ -3476,19 +3675,13 @@ html.u-baseline-grid::after {
3476
3675
  container-name: bf-rich-list;
3477
3676
  container-type: inline-size;
3478
3677
  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
3678
  }
3489
3679
 
3490
3680
  :where(.bf-theme) :where(.bf-rich-list-layout) {
3681
+ --bf-stack-space: var(--bf-space-1);
3682
+ align-content: start;
3491
3683
  display: grid;
3684
+ gap: var(--bf-stack-space);
3492
3685
  grid-template-columns: minmax(0, 1fr);
3493
3686
  min-inline-size: 0;
3494
3687
  }
@@ -3503,14 +3696,11 @@ html.u-baseline-grid::after {
3503
3696
  overflow-wrap: anywhere;
3504
3697
  }
3505
3698
 
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
- }
3699
+ :where(.bf-theme) :where(.bf-rich-list-support, .bf-rich-list-content) {
3700
+ --bf-stack-space: var(--bf-space-1);
3701
+ align-content: start;
3702
+ display: grid;
3703
+ gap: var(--bf-stack-space);
3514
3704
  }
3515
3705
 
3516
3706
  /* ------------------------------------------------------------------ */
@@ -3537,7 +3727,7 @@ html.u-baseline-grid::after {
3537
3727
  /* A full-width ratio inside a fluid Sites rail otherwise leaves the next
3538
3728
  heading on a fractional pixel. The visual alone absorbs the trailing
3539
3729
  compensation; semantic children retain their own margins unchanged. */
3540
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3730
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3541
3731
  :where(.bf-theme) :where(.bf-rich-list-visual > .bf-aspect) {
3542
3732
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3543
3733
  }
@@ -3576,8 +3766,12 @@ html.u-baseline-grid::after {
3576
3766
 
3577
3767
  /* Prefixes are logical here even though the shared list predates BF's
3578
3768
  logical-property rule. This keeps ticks, bullets and numbers RTL-safe. */
3769
+ :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) {
3770
+ padding-inline-start: var(--bf-leading-mark-group-inset);
3771
+ }
3772
+
3579
3773
  :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));
3774
+ padding-inline-start: var(--bf-leading-mark-offset);
3581
3775
  }
3582
3776
 
3583
3777
  :where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed)::before {
@@ -3587,7 +3781,7 @@ html.u-baseline-grid::after {
3587
3781
  }
3588
3782
 
3589
3783
  :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));
3784
+ padding-inline-start: var(--bf-leading-mark-offset);
3591
3785
  }
3592
3786
 
3593
3787
  :where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item)::before {
@@ -3606,7 +3800,7 @@ html.u-baseline-grid::after {
3606
3800
 
3607
3801
  :where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item) {
3608
3802
  counter-increment: bf-rich-horizontal-counter;
3609
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
3803
+ padding-inline-start: var(--bf-leading-mark-offset);
3610
3804
  }
3611
3805
 
3612
3806
  :where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item)::before {
@@ -3653,7 +3847,7 @@ html.u-baseline-grid::after {
3653
3847
  }
3654
3848
  }
3655
3849
 
3656
- @container bf-rich-list (width >= 64.75rem) {
3850
+ @container bf-rich-list (width >= 45rem) {
3657
3851
  :where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) {
3658
3852
  column-gap: var(--bf-grid-gap-inline);
3659
3853
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3667,7 +3861,7 @@ html.u-baseline-grid::after {
3667
3861
  grid-column: 2;
3668
3862
  }
3669
3863
 
3670
- :where(.bf-theme) :where(.bf-rich-list.is-horizontal) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
3864
+ :where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
3671
3865
  grid-column: 2;
3672
3866
  }
3673
3867
  }
@@ -3682,7 +3876,6 @@ html.u-baseline-grid::after {
3682
3876
 
3683
3877
  :where(.bf-theme) :where(.bf-rich-list.is-vertical) :where(.bf-rich-list-media) {
3684
3878
  container-type: inline-size;
3685
- padding-block-end: var(--bf-section-space-shallow);
3686
3879
  }
3687
3880
 
3688
3881
  :where(.bf-theme) :where(.bf-rich-list.is-vertical.is-flipped) :where(.bf-rich-list-media) {
@@ -3701,7 +3894,7 @@ html.u-baseline-grid::after {
3701
3894
  /* The media object deliberately stretches across fluid 1/2 and 2/3 ratios.
3702
3895
  Snap that resulting block, rather than resetting content spacing, so each
3703
3896
  tier's baseline survives both portrait and landscape allocations. */
3704
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
3897
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
3705
3898
  :where(.bf-theme) :where(.bf-rich-list-media-frame) {
3706
3899
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
3707
3900
  }
@@ -3744,11 +3937,7 @@ html.u-baseline-grid::after {
3744
3937
  /* Auto height has no shallow media wrapper in Vanilla. At narrow widths it
3745
3938
  remains a normal 3:2 frame; at the wide split it stretches with the content
3746
3939
  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) {
3940
+ @container bf-rich-list (width >= 45rem) {
3752
3941
  :where(.bf-theme) :where(.bf-rich-list.is-vertical) > :where(.bf-rich-list-layout) {
3753
3942
  align-items: stretch;
3754
3943
  column-gap: var(--bf-grid-gap-inline);
@@ -3797,7 +3986,7 @@ html.u-baseline-grid::after {
3797
3986
  min-block-size: 56.25cqi;
3798
3987
  }
3799
3988
 
3800
- @supports (min-block-size: round(up, 1px, 1px)) {
3989
+ @supports (min-block-size: round(up, 0.0625rem, 0.0625rem)) {
3801
3990
  :where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) :where(.bf-rich-list-media-frame) {
3802
3991
  max-block-size: round(down, 150cqi, var(--bf-baseline));
3803
3992
  min-block-size: round(up, 56.25cqi, var(--bf-baseline));
@@ -3815,6 +4004,7 @@ html.u-baseline-grid::after {
3815
4004
 
3816
4005
 
3817
4006
  :where(.bf-theme) :where(.bf-panel) {
4007
+ --bf-panel-content-padding-inline: var(--bf-component-inline-inset-continuation);
3818
4008
  background: var(--bf-color-background-default);
3819
4009
  color: var(--bf-color-text-default);
3820
4010
  display: flex;
@@ -3837,6 +4027,9 @@ html.u-baseline-grid::after {
3837
4027
  overscroll-behavior: contain;
3838
4028
  }
3839
4029
 
4030
+ /* Panel chrome and content consume the live page-grid gutter through a local
4031
+ * derived property, so their internal text rails follow the same
4032
+ * viewport brackets as surrounding page content. */
3840
4033
  :where(.bf-theme) :where(.bf-panel-header) {
3841
4034
  align-items: start;
3842
4035
  display: flex;
@@ -3845,7 +4038,7 @@ html.u-baseline-grid::after {
3845
4038
  justify-content: space-between;
3846
4039
  padding-block-end: var(--bf-panel-padding-block);
3847
4040
  padding-block-start: var(--bf-panel-padding-block);
3848
- padding-inline: var(--bf-panel-padding-inline);
4041
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
3849
4042
  }
3850
4043
 
3851
4044
  /* A navigation brand keeps the Canonical tag attached to the panel's top edge
@@ -3855,7 +4048,7 @@ html.u-baseline-grid::after {
3855
4048
  gap: 0;
3856
4049
  padding-block: 0;
3857
4050
  padding-inline-end: 0;
3858
- padding-inline-start: var(--bf-panel-padding-inline);
4051
+ padding-inline-start: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
3859
4052
  }
3860
4053
 
3861
4054
  :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
@@ -3886,10 +4079,10 @@ html.u-baseline-grid::after {
3886
4079
  flex-wrap: wrap;
3887
4080
  gap: var(--bf-field-gap);
3888
4081
  justify-content: space-between;
3889
- min-block-size: calc(var(--bf-control-box-size-compact) + (var(--bf-panel-padding-block) * 2));
4082
+ min-block-size: calc(var(--bf-control-box-size-compact) + var(--bf-panel-padding-block));
3890
4083
  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);
4084
+ padding-block-start: 0;
4085
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
3893
4086
  }
3894
4087
 
3895
4088
  :where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
@@ -3951,8 +4144,8 @@ html.u-baseline-grid::after {
3951
4144
  }
3952
4145
 
3953
4146
  :where(.bf-theme) :where(.bf-panel-toggle:focus-visible) {
3954
- outline: 2px solid var(--bf-color-focus);
3955
- outline-offset: 2px;
4147
+ outline: 0.125rem solid var(--bf-color-focus);
4148
+ outline-offset: 0.125rem;
3956
4149
  }
3957
4150
 
3958
4151
  :where(.bf-theme) :where(.bf-panel-content) {
@@ -3960,7 +4153,7 @@ html.u-baseline-grid::after {
3960
4153
  min-block-size: 0;
3961
4154
  padding-block-end: var(--bf-panel-padding-block);
3962
4155
  padding-block-start: var(--bf-panel-padding-block);
3963
- padding-inline: var(--bf-panel-padding-inline);
4156
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
3964
4157
  }
3965
4158
 
3966
4159
  :where(.bf-theme) :where(.bf-panel-content.is-flush) {
@@ -3985,7 +4178,7 @@ html.u-baseline-grid::after {
3985
4178
  overflow: auto;
3986
4179
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
3987
4180
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
3988
- padding-inline: var(--bf-panel-padding-inline);
4181
+ padding-inline: var(--bf-component-inline-inset-continuation);
3989
4182
  }
3990
4183
 
3991
4184
  :where(.bf-theme) :where(.bf-card.is-highlighted) {
@@ -4010,7 +4203,7 @@ html.u-baseline-grid::after {
4010
4203
 
4011
4204
  :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
4205
  border-color: var(--bf-color-focus);
4013
- transform: translateY(-1px);
4206
+ transform: translateY(-0.0625rem);
4014
4207
  }
4015
4208
 
4016
4209
  :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 +4211,8 @@ html.u-baseline-grid::after {
4018
4211
  }
4019
4212
 
4020
4213
  :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;
4214
+ outline: 0.125rem solid var(--bf-color-focus);
4215
+ outline-offset: -0.125rem;
4023
4216
  }
4024
4217
 
4025
4218
  :where(.bf-theme) :where(.bf-card.is-preview) {
@@ -4102,7 +4295,7 @@ html.u-baseline-grid::after {
4102
4295
  min-inline-size: 0;
4103
4296
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4104
4297
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4105
- padding-inline: var(--bf-panel-padding-inline);
4298
+ padding-inline: var(--bf-component-inline-inset-continuation);
4106
4299
  text-align: left;
4107
4300
  }
4108
4301
 
@@ -4115,7 +4308,7 @@ html.u-baseline-grid::after {
4115
4308
  :where(.bf-theme) :where(button.bf-option-card:hover:not(:disabled)) {
4116
4309
  background: var(--bf-color-background-hover);
4117
4310
  border-color: var(--bf-color-focus);
4118
- transform: translateY(-1px);
4311
+ transform: translateY(-0.0625rem);
4119
4312
  }
4120
4313
 
4121
4314
  :where(.bf-theme) :where(.bf-option-card.is-active),
@@ -4126,8 +4319,8 @@ html.u-baseline-grid::after {
4126
4319
  }
4127
4320
 
4128
4321
  :where(.bf-theme) :where(button.bf-option-card:focus-visible) {
4129
- outline: 2px solid var(--bf-color-focus);
4130
- outline-offset: -2px;
4322
+ outline: 0.125rem solid var(--bf-color-focus);
4323
+ outline-offset: -0.125rem;
4131
4324
  }
4132
4325
 
4133
4326
  :where(.bf-theme) :where(.bf-option-card-label) {
@@ -4175,7 +4368,7 @@ html.u-baseline-grid::after {
4175
4368
  /* Snap the grid-row wrapper after intrinsic image/copy measurement. Because
4176
4369
  the card flexes inside it, peers retain Vanilla's equal-height row while
4177
4370
  the card edge and the following row both land on BF baselines. */
4178
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
4371
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
4179
4372
  :where(.bf-theme) :where(.bf-content-card-wrapper) {
4180
4373
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
4181
4374
  }
@@ -4352,7 +4545,7 @@ html.u-baseline-grid::after {
4352
4545
  text-transform: var(--bf-h1-text-transform);
4353
4546
  }
4354
4547
 
4355
- :where(.bf-theme) :where(.bf-content-card-main-link) {
4548
+ :where(.bf-theme) :where(a.bf-content-card-main-link) {
4356
4549
  -webkit-box-orient: vertical;
4357
4550
  -webkit-line-clamp: 3;
4358
4551
  color: inherit;
@@ -4372,7 +4565,7 @@ html.u-baseline-grid::after {
4372
4565
  z-index: 1;
4373
4566
  }
4374
4567
 
4375
- :where(.bf-theme) :where(.bf-content-card-main-link:is(:hover, :focus, :active, :visited)) {
4568
+ :where(.bf-theme) :where(a.bf-content-card-main-link:is(:hover, :focus, :active, :visited)) {
4376
4569
  color: inherit;
4377
4570
  text-decoration: none;
4378
4571
  }
@@ -4382,8 +4575,8 @@ html.u-baseline-grid::after {
4382
4575
  }
4383
4576
 
4384
4577
  :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;
4578
+ outline: 0.1875rem solid var(--bf-color-focus);
4579
+ outline-offset: 0.125rem;
4387
4580
  }
4388
4581
 
4389
4582
  /* All nested actions sit above the expanded main-link hit area. This includes
@@ -4459,6 +4652,7 @@ html.u-baseline-grid::after {
4459
4652
  min-inline-size: 0;
4460
4653
  overflow-x: auto;
4461
4654
  padding-block-end: var(--bf-space-1);
4655
+ padding-block-start: calc(0.5rem - var(--bf-border-width));
4462
4656
  padding-inline: var(--bf-space-2);
4463
4657
  position: relative;
4464
4658
  scrollbar-width: none;
@@ -4496,11 +4690,11 @@ html.u-baseline-grid::after {
4496
4690
 
4497
4691
  /* Internal geometry responds to the card's allocated width. The card root is
4498
4692
  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
4693
+ /* Vanilla switches the viewport at 38.75rem/64.75rem. A four-column card is much
4500
4694
  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. */
4695
+ horizontal layout uses Vanilla's 28.75rem minimum viable allocation. The
4696
+ eight-column 50/50 split starts at the roughly 60rem allocation left by the
4697
+ 64.75rem viewport. This preserves the rendered switch in embedded BF grids. */
4504
4698
  @container bf-content-card (width < 28.75rem) {
4505
4699
  :where(.bf-theme) :where(.bf-content-card-frame:not(:has(.bf-content-card-footer))) {
4506
4700
  min-block-size: 0;
@@ -4652,18 +4846,16 @@ html.u-baseline-grid::after {
4652
4846
 
4653
4847
  :where(.bf-theme) :where(.bf-tabs) {
4654
4848
  display: grid;
4849
+ gap: var(--bf-space-2);
4655
4850
  min-inline-size: 0;
4656
4851
  }
4657
4852
 
4658
4853
  :where(.bf-theme) :where(.bf-tabs-list) {
4659
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-default);
4854
+ box-shadow: inset 0 calc(var(--bf-border-width) * -1) 0 var(--bf-color-border-default);
4660
4855
  display: flex;
4661
4856
  gap: 0;
4662
4857
  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));
4858
+ margin: 0;
4667
4859
  min-inline-size: 0;
4668
4860
  overflow-x: auto;
4669
4861
  padding: 0;
@@ -4685,16 +4877,16 @@ html.u-baseline-grid::after {
4685
4877
  align-items: center;
4686
4878
  background: transparent;
4687
4879
  border: 0;
4688
- border-bottom: var(--bf-bar-thickness) solid transparent;
4880
+ border-block: var(--bf-border-width) solid transparent;
4689
4881
  color: var(--bf-color-text-muted);
4690
4882
  cursor: pointer;
4691
- display: inline-flex;
4883
+ display: flex;
4692
4884
  gap: calc(var(--bf-baseline) * 0.5);
4693
4885
  justify-content: center;
4694
4886
  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);
4887
+ padding-block-end: calc(var(--bf-single-line-row-padding-block) + var(--bf-single-line-row-margin-block-end));
4888
+ padding-block-start: var(--bf-single-line-row-padding-block);
4889
+ padding-inline: var(--bf-component-inline-inset-action);
4698
4890
  text-decoration: none;
4699
4891
  }
4700
4892
 
@@ -4703,18 +4895,22 @@ html.u-baseline-grid::after {
4703
4895
  color: var(--bf-color-text-default);
4704
4896
  }
4705
4897
 
4898
+ :where(.bf-theme) :where(a.bf-tabs-link:hover) {
4899
+ text-decoration: none;
4900
+ }
4901
+
4706
4902
  :where(.bf-theme) :where(.bf-tabs-link:focus:not(:focus-visible)) {
4707
4903
  outline: none;
4708
4904
  }
4709
4905
 
4710
4906
  :where(.bf-theme) :where(.bf-tabs-link:focus-visible) {
4711
4907
  color: var(--bf-color-text-default);
4712
- outline: 2px solid var(--bf-color-focus);
4713
- outline-offset: -2px;
4908
+ outline: 0.125rem solid var(--bf-color-focus);
4909
+ outline-offset: -0.125rem;
4714
4910
  }
4715
4911
 
4716
4912
  :where(.bf-theme) :where(.bf-tabs-link.is-active, .bf-tabs-link[aria-selected='true']) {
4717
- border-bottom-color: var(--bf-color-text-default);
4913
+ box-shadow: inset 0 calc(var(--bf-bar-thickness) * -1) 0 var(--bf-color-text-default);
4718
4914
  color: var(--bf-color-text-default);
4719
4915
  }
4720
4916
 
@@ -4764,10 +4960,10 @@ html.u-baseline-grid::after {
4764
4960
  display: grid;
4765
4961
  gap: calc(var(--bf-baseline) * 0.75);
4766
4962
  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)));
4963
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
4768
4964
  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);
4965
+ padding-block: var(--bf-single-line-row-padding-block);
4966
+ padding-inline: var(--bf-component-inline-inset-field);
4771
4967
  }
4772
4968
 
4773
4969
  :where(.bf-theme) :where(.bf-choice-row:hover) {
@@ -4775,8 +4971,8 @@ html.u-baseline-grid::after {
4775
4971
  }
4776
4972
 
4777
4973
  :where(.bf-theme) :where(.bf-choice-row:has(:focus-visible)) {
4778
- outline: 2px solid var(--bf-color-focus);
4779
- outline-offset: -2px;
4974
+ outline: 0.125rem solid var(--bf-color-focus);
4975
+ outline-offset: -0.125rem;
4780
4976
  }
4781
4977
 
4782
4978
  :where(.bf-theme) :where(.bf-choice-row input[type='radio']) {
@@ -4823,7 +5019,7 @@ html.u-baseline-grid::after {
4823
5019
  gap: var(--bf-field-gap);
4824
5020
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
4825
5021
  padding-block-start: var(--bf-panel-padding-block);
4826
- padding-inline: var(--bf-panel-padding-inline);
5022
+ padding-inline: var(--bf-component-inline-inset-continuation);
4827
5023
  }
4828
5024
 
4829
5025
  :where(.bf-theme) :where(.bf-inline-options-heading) {
@@ -4897,11 +5093,11 @@ html.u-baseline-grid::after {
4897
5093
  cursor: pointer;
4898
5094
  display: inline-flex;
4899
5095
  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)));
5096
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
4901
5097
  max-inline-size: 100%;
4902
5098
  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);
5099
+ padding-block: var(--bf-single-line-row-padding-block);
5100
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
4905
5101
  text-align: center;
4906
5102
  text-decoration: none;
4907
5103
  text-overflow: ellipsis;
@@ -4927,8 +5123,8 @@ html.u-baseline-grid::after {
4927
5123
  }
4928
5124
 
4929
5125
  :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;
5126
+ outline: 0.125rem solid var(--bf-color-focus);
5127
+ outline-offset: -0.125rem;
4932
5128
  z-index: 2;
4933
5129
  }
4934
5130
 
@@ -4962,8 +5158,10 @@ html.u-baseline-grid::after {
4962
5158
  font-weight: var(--bf-body-font-weight, 400);
4963
5159
  line-height: var(--bf-body-line-height, 1.5rem);
4964
5160
  color: var(--bf-color-text-muted);
4965
- margin: 0;
5161
+ margin: 0 0 var(--bf-body-margin-bottom);
4966
5162
  min-inline-size: 0;
5163
+ padding-block-end: 0;
5164
+ padding-block-start: var(--bf-body-nudge-start);
4967
5165
  }
4968
5166
 
4969
5167
  :where(.bf-theme) :where(.bf-breadcrumbs-item) + :where(.bf-breadcrumbs-item)::before {
@@ -4994,26 +5192,35 @@ html.u-baseline-grid::after {
4994
5192
  :where(.bf-theme) :where(.bf-tab-section) {
4995
5193
  container-name: bf-tab-section;
4996
5194
  container-type: inline-size;
4997
- margin-block-end: var(--bf-section-space);
5195
+ margin: 0;
4998
5196
  min-inline-size: 0;
4999
5197
  }
5000
5198
 
5001
- :where(.bf-theme) :where(.bf-tab-section.is-shallow) {
5002
- margin-block-end: var(--bf-section-space-shallow);
5199
+ :where(.bf-theme) :where(.bf-tab-section-layout) {
5200
+ display: grid;
5201
+ grid-template-columns: minmax(0, 1fr);
5202
+ min-inline-size: 0;
5003
5203
  }
5004
5204
 
5005
- :where(.bf-theme) :where(.bf-tab-section.is-deep) {
5006
- margin-block-end: var(--bf-section-space-deep);
5205
+ :where(.bf-theme) :where(.bf-tab-section-rule) {
5206
+ grid-column: 1 / -1;
5007
5207
  }
5008
5208
 
5009
- :where(.bf-theme) :where(.bf-tab-section-layout) {
5209
+ :where(.bf-theme) :where(.bf-tab-section-body) {
5210
+ --bf-stack-space: var(--bf-section-space-shallow);
5211
+ align-content: start;
5010
5212
  display: grid;
5213
+ gap: var(--bf-stack-space);
5011
5214
  grid-template-columns: minmax(0, 1fr);
5012
5215
  min-inline-size: 0;
5013
5216
  }
5014
5217
 
5015
- :where(.bf-theme) :where(.bf-tab-section-rule) {
5016
- grid-column: 1 / -1;
5218
+ :where(.bf-theme) :where(.bf-tab-section-copy) {
5219
+ align-content: start;
5220
+ display: grid;
5221
+ grid-template-columns: minmax(0, 1fr);
5222
+ min-inline-size: 0;
5223
+ row-gap: var(--bf-space-1);
5017
5224
  }
5018
5225
 
5019
5226
  :where(.bf-theme) :where(.bf-tab-section-header, .bf-tab-section-intro, .bf-tab-section-tabs) {
@@ -5021,51 +5228,50 @@ html.u-baseline-grid::after {
5021
5228
  overflow-wrap: anywhere;
5022
5229
  }
5023
5230
 
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);
5231
+ :where(.bf-theme) :where(.bf-tab-section-tabs) {
5232
+ align-self: start;
5030
5233
  }
5031
5234
 
5032
- @container bf-tab-section (width >= 64.75rem) {
5033
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) {
5235
+ @container bf-tab-section (width >= 45rem) {
5236
+ :where(.bf-theme) :where(.bf-tab-section-body) {
5034
5237
  column-gap: var(--bf-grid-gap-inline);
5035
5238
  grid-template-columns: repeat(4, minmax(0, 1fr));
5036
5239
  }
5037
5240
 
5038
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-header) {
5241
+ :where(.bf-theme) :where(.bf-tab-section-copy) {
5039
5242
  grid-column: 1 / -1;
5243
+ grid-template-columns: subgrid;
5040
5244
  }
5041
5245
 
5042
5246
  /* With supporting copy or actions, Vanilla's heading row is 50/50 for all
5043
5247
  three section layouts. The following tab rail retains its own requested
5044
5248
  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) {
5249
+ :where(.bf-theme) :where(.bf-tab-section-copy:has(> .bf-tab-section-intro)) > :where(.bf-tab-section-header) {
5046
5250
  grid-column: 1 / 3;
5047
5251
  }
5048
5252
 
5049
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-intro) {
5253
+ :where(.bf-theme) :where(.bf-tab-section-copy) > :where(.bf-tab-section-intro) {
5050
5254
  grid-column: 3 / -1;
5051
5255
  }
5052
5256
 
5053
- :where(.bf-theme) :where(.bf-tab-section) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5257
+ :where(.bf-theme) :where(.bf-tab-section-body) > :where(.bf-tab-section-tabs) {
5054
5258
  grid-column: 1 / -1;
5055
5259
  }
5056
5260
 
5057
5261
  /* An unadorned 50/50 section lets auto-placement put the heading and tabs
5058
5262
  in the same row. If an intro exists, it occupies that right-hand cell and
5059
5263
  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) {
5264
+ :where(.bf-theme) :where(.bf-tab-section.is-50-50) :where(.bf-tab-section-copy:not(:has(> .bf-tab-section-intro))) {
5061
5265
  grid-column: 1 / 3;
5266
+ grid-row: 1;
5062
5267
  }
5063
5268
 
5064
- :where(.bf-theme) :where(.bf-tab-section.is-50-50) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5269
+ :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
5270
  grid-column: 3 / -1;
5271
+ grid-row: 1;
5066
5272
  }
5067
5273
 
5068
- :where(.bf-theme) :where(.bf-tab-section.is-25-75) > :where(.bf-tab-section-layout) > :where(.bf-tab-section-tabs) {
5274
+ :where(.bf-theme) :where(.bf-tab-section.is-25-75) :where(.bf-tab-section-body) > :where(.bf-tab-section-tabs) {
5069
5275
  grid-column: 2 / -1;
5070
5276
  }
5071
5277
  }
@@ -5076,11 +5282,11 @@ html.u-baseline-grid::after {
5076
5282
  container-type: inline-size;
5077
5283
  display: grid;
5078
5284
  grid-template-columns: auto minmax(0, 1fr);
5079
- margin-block-end: var(--bf-section-space-shallow);
5285
+ margin: 0;
5080
5286
  min-inline-size: 0;
5081
5287
  }
5082
5288
 
5083
- :where(.bf-theme) :where(.bf-article-pagination-link) {
5289
+ :where(.bf-theme) :where(a.bf-article-pagination-link) {
5084
5290
  background-color: var(--bf-color-background-default);
5085
5291
  border: var(--bf-border-width) solid transparent;
5086
5292
  box-sizing: border-box;
@@ -5096,8 +5302,9 @@ html.u-baseline-grid::after {
5096
5302
  text-decoration: none;
5097
5303
  }
5098
5304
 
5099
- :where(.bf-theme) :where(.bf-article-pagination-link:hover) {
5305
+ :where(.bf-theme) :where(a.bf-article-pagination-link:hover) {
5100
5306
  background-color: var(--bf-color-background-hover);
5307
+ text-decoration: none;
5101
5308
  }
5102
5309
 
5103
5310
  :where(.bf-theme) :where(.bf-article-pagination-link:focus:not(:focus-visible)) {
@@ -5105,8 +5312,8 @@ html.u-baseline-grid::after {
5105
5312
  }
5106
5313
 
5107
5314
  :where(.bf-theme) :where(.bf-article-pagination-link:focus-visible) {
5108
- outline: 2px solid var(--bf-color-focus);
5109
- outline-offset: 2px;
5315
+ outline: 0.125rem solid var(--bf-color-focus);
5316
+ outline-offset: 0.125rem;
5110
5317
  }
5111
5318
 
5112
5319
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous) {
@@ -5208,12 +5415,12 @@ html.u-baseline-grid::after {
5208
5415
 
5209
5416
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-label),
5210
5417
  :where(.bf-theme) :where(.bf-article-pagination-link.is-previous:not(:only-child) .bf-article-pagination-title) {
5211
- block-size: 1px;
5418
+ block-size: 0.0625rem;
5212
5419
  border: 0;
5213
5420
  clip: rect(0 0 0 0);
5214
5421
  clip-path: inset(50%);
5215
- inline-size: 1px;
5216
- margin: -1px;
5422
+ inline-size: 0.0625rem;
5423
+ margin: -0.0625rem;
5217
5424
  overflow: hidden;
5218
5425
  padding: 0;
5219
5426
  position: absolute;
@@ -5231,6 +5438,10 @@ html.u-baseline-grid::after {
5231
5438
  padding: 0;
5232
5439
  }
5233
5440
 
5441
+ :where(.bf-theme) :where(.bf-list:has(> .bf-list-item:is(.is-ticked, .is-crossed)), ol.bf-list.is-divided) {
5442
+ padding-inline-start: var(--bf-leading-mark-group-inset);
5443
+ }
5444
+
5234
5445
  :where(.bf-theme) :where(.bf-list-item) {
5235
5446
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
5236
5447
  font-size: var(--bf-body-font-size, 1rem);
@@ -5246,8 +5457,10 @@ html.u-baseline-grid::after {
5246
5457
  }
5247
5458
 
5248
5459
  :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);
5460
+ border-block: var(--bf-border-width) solid transparent;
5461
+ box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-low-contrast);
5462
+ margin-block-end: var(--bf-single-line-row-margin-block-end);
5463
+ padding-block: var(--bf-single-line-row-padding-block);
5251
5464
  }
5252
5465
 
5253
5466
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item:first-child) {
@@ -5255,7 +5468,7 @@ html.u-baseline-grid::after {
5255
5468
  }
5256
5469
 
5257
5470
  :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));
5471
+ padding-inline-start: var(--bf-leading-mark-offset);
5259
5472
  position: relative;
5260
5473
  }
5261
5474
 
@@ -5280,10 +5493,6 @@ html.u-baseline-grid::after {
5280
5493
  background-image: var(--bf-ui-icon-error-grey);
5281
5494
  }
5282
5495
 
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
5496
  :where(.bf-theme) :where(ol.bf-list.is-divided) {
5288
5497
  counter-reset: bf-list-counter;
5289
5498
  }
@@ -5365,11 +5574,11 @@ html.u-baseline-grid::after {
5365
5574
  background: var(--bf-color-background-alt);
5366
5575
  color: var(--bf-color-link-default);
5367
5576
  display: block;
5368
- left: -999px;
5577
+ left: -62.4375rem;
5369
5578
  max-inline-size: calc(100vw - var(--bf-baseline));
5370
5579
  position: absolute;
5371
5580
  text-decoration: none;
5372
- top: -999px;
5581
+ top: -62.4375rem;
5373
5582
  }
5374
5583
 
5375
5584
  :where(.bf-theme) :where(.bf-skip-link:hover) {
@@ -5378,7 +5587,7 @@ html.u-baseline-grid::after {
5378
5587
 
5379
5588
  :where(.bf-theme) :where(.bf-skip-link:focus, .bf-skip-link:focus-visible) {
5380
5589
  left: calc(var(--bf-baseline) * 0.5);
5381
- outline: 2px solid var(--bf-color-focus);
5590
+ outline: 0.125rem solid var(--bf-color-focus);
5382
5591
  outline-offset: 0;
5383
5592
  padding-block: calc(var(--bf-baseline) * 1.5);
5384
5593
  padding-inline: calc(var(--bf-baseline) * 1.5);
@@ -5429,15 +5638,16 @@ html.u-baseline-grid::after {
5429
5638
  line-height: var(--bf-table-row-line-height);
5430
5639
  margin: 0;
5431
5640
  overflow: hidden;
5432
- padding-block: var(--bf-table-row-padding);
5433
- padding-inline: calc(var(--bf-baseline) * 0.75);
5641
+ padding-block-end: var(--bf-table-row-padding-block-end);
5642
+ padding-block-start: var(--bf-table-row-padding-block-start);
5643
+ padding-inline: var(--bf-component-inline-inset-field);
5434
5644
  text-align: left;
5435
5645
  text-overflow: ellipsis;
5436
5646
  vertical-align: top;
5437
5647
  }
5438
5648
 
5439
5649
  :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));
5650
+ padding-inline-start: calc(var(--bf-component-inline-inset-field) + var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
5441
5651
  }
5442
5652
 
5443
5653
  :where(.bf-theme) :where(th.is-icon-placeholder, td.is-icon-placeholder, .bf-table-cell.is-icon-placeholder) > :where(.bf-icon:first-child) {
@@ -5495,15 +5705,17 @@ html.u-baseline-grid::after {
5495
5705
  gap: 0;
5496
5706
  inline-size: fit-content;
5497
5707
  justify-self: start;
5498
- margin: 0 var(--bf-ui-chip-padding-inline) var(--bf-field-gap) 0;
5708
+ margin: 0 var(--bf-ui-chip-padding-inline) var(--bf-single-line-row-margin-block-end) 0;
5499
5709
  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);
5710
+ padding-block: var(--bf-single-line-row-padding-block);
5711
+ padding-inline: max(0rem, calc(var(--bf-ui-chip-padding-inline) - var(--bf-border-width)));
5503
5712
  position: relative;
5504
5713
  text-decoration: none;
5505
5714
  user-select: none;
5506
- vertical-align: calc(var(--bf-border-width) - var(--bf-body-nudge-start, 0.375rem));
5715
+ /* Inline-flex exposes the first text child's baseline. The surrounding
5716
+ border-aware row contract now matches buttons instead of inventing a
5717
+ second chip-only occupied height. */
5718
+ vertical-align: baseline;
5507
5719
  white-space: nowrap;
5508
5720
  }
5509
5721
 
@@ -5543,6 +5755,15 @@ html.u-baseline-grid::after {
5543
5755
  --bf-ui-chip-background-active: var(--bf-color-background-information-active);
5544
5756
  }
5545
5757
 
5758
+ :where(.bf-theme) :where(.bf-chip.is-borderless) {
5759
+ --bf-ui-chip-border: transparent;
5760
+ --bf-ui-chip-border-hover: transparent;
5761
+ --bf-ui-chip-border-active: transparent;
5762
+ --bf-ui-chip-background: transparent;
5763
+ --bf-ui-chip-background-hover: transparent;
5764
+ --bf-ui-chip-background-active: transparent;
5765
+ }
5766
+
5546
5767
  :where(.bf-theme) :where(.bf-chip, .bf-chip.is-positive, .bf-chip.is-caution, .bf-chip.is-negative, .bf-chip.is-information):hover {
5547
5768
  background-color: var(--bf-ui-chip-background-hover);
5548
5769
  border-color: var(--bf-ui-chip-border-hover);
@@ -5627,16 +5848,20 @@ html.u-baseline-grid::after {
5627
5848
  --bf-ui-status-background: color-mix(in srgb, var(--bf-color-background-alt) 70%, black);
5628
5849
  --bf-ui-status-color: var(--bf-color-button-positive-text);
5629
5850
  background-color: var(--bf-ui-status-background);
5851
+ border-block: var(--bf-border-width) solid transparent;
5630
5852
  color: var(--bf-ui-status-color);
5631
5853
  display: inline-block;
5854
+ inline-size: fit-content;
5855
+ justify-self: start;
5632
5856
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
5633
5857
  font-size: var(--bf-body-font-size, 1rem);
5634
5858
  font-style: var(--bf-body-font-style, normal);
5635
5859
  font-weight: var(--bf-body-font-weight, 400);
5636
5860
  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);
5861
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
5862
+ /* Status paint is physically symmetric and shares the same occupied block
5863
+ as a button; typography still comes from the body role. */
5864
+ padding-block: var(--bf-single-line-row-padding-block);
5640
5865
  padding-inline: var(--bf-ui-chip-padding-inline);
5641
5866
  text-align: center;
5642
5867
  text-decoration: none;
@@ -5674,7 +5899,7 @@ html.u-baseline-grid::after {
5674
5899
  margin: 0;
5675
5900
  padding: 0;
5676
5901
  position: relative;
5677
- text-indent: -9999px;
5902
+ text-indent: -624.9375rem;
5678
5903
  }
5679
5904
 
5680
5905
  :where(.bf-theme) :where(.bf-chip-dismiss) {
@@ -5686,7 +5911,7 @@ html.u-baseline-grid::after {
5686
5911
  :where(.bf-theme) :where(.bf-chip-dismiss, .bf-search-box-reset, .bf-search-and-filter-clear)::before,
5687
5912
  :where(.bf-theme) :where(.bf-chip-dismiss, .bf-search-box-reset, .bf-search-and-filter-clear)::after {
5688
5913
  background: currentColor;
5689
- block-size: 2px;
5914
+ block-size: 0.125rem;
5690
5915
  content: "";
5691
5916
  inline-size: 0.75rem;
5692
5917
  left: 50%;
@@ -5704,7 +5929,7 @@ html.u-baseline-grid::after {
5704
5929
 
5705
5930
 
5706
5931
  :where(.bf-theme) :where(.bf-search-box) {
5707
- --bf-search-box-action-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
5932
+ --bf-search-box-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
5708
5933
  --bf-search-box-trailing-inline-size: calc((var(--bf-search-box-action-inline-size) * 2) + var(--bf-border-width));
5709
5934
  display: flex;
5710
5935
  inline-size: 100%;
@@ -5721,12 +5946,12 @@ html.u-baseline-grid::after {
5721
5946
 
5722
5947
  :where(.bf-theme) :where(.bf-search-box-reset, .bf-search-box-button) {
5723
5948
  align-items: center;
5724
- block-size: var(--bf-control-box-size);
5949
+ block-size: auto;
5725
5950
  display: inline-flex;
5726
5951
  inline-size: var(--bf-search-box-action-inline-size);
5952
+ inset-block: 0;
5727
5953
  justify-content: center;
5728
5954
  position: absolute;
5729
- top: 0;
5730
5955
  }
5731
5956
 
5732
5957
  :where(.bf-theme) :where(.bf-search-box-reset) {
@@ -5743,7 +5968,7 @@ html.u-baseline-grid::after {
5743
5968
  inset-inline-end: var(--bf-border-width);
5744
5969
  margin: 0;
5745
5970
  padding: 0;
5746
- text-indent: -9999px;
5971
+ text-indent: -624.9375rem;
5747
5972
  }
5748
5973
 
5749
5974
  :where(.bf-theme) :where(.bf-search-box-button)::before {
@@ -5770,8 +5995,8 @@ html.u-baseline-grid::after {
5770
5995
  }
5771
5996
 
5772
5997
  :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;
5998
+ outline: 0.125rem solid var(--bf-color-focus);
5999
+ outline-offset: -0.125rem;
5775
6000
  }
5776
6001
 
5777
6002
  :where(.bf-theme) :where(.bf-search-and-filter) {
@@ -5786,7 +6011,7 @@ html.u-baseline-grid::after {
5786
6011
  :where(.bf-theme) :where(.bf-search-and-filter-search-container) {
5787
6012
  align-items: stretch;
5788
6013
  background: transparent;
5789
- box-shadow: inset 0 -1px 0 var(--bf-color-border-high-contrast);
6014
+ box-shadow: inset 0 -0.0625rem 0 var(--bf-color-border-high-contrast);
5790
6015
  display: flex;
5791
6016
  flex-wrap: wrap;
5792
6017
  gap: var(--bf-field-gap);
@@ -5802,7 +6027,7 @@ html.u-baseline-grid::after {
5802
6027
  }
5803
6028
 
5804
6029
  :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));
6030
+ --bf-search-and-filter-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
5806
6031
  --bf-search-and-filter-trailing-inline-size: calc(var(--bf-search-and-filter-action-inline-size) * 2);
5807
6032
  display: inline-flex;
5808
6033
  flex: 1 1 12rem;
@@ -5819,17 +6044,17 @@ html.u-baseline-grid::after {
5819
6044
  :where(.bf-theme) :where(.bf-search-and-filter-search-button) {
5820
6045
  appearance: none;
5821
6046
  background: transparent;
5822
- block-size: var(--bf-control-box-size);
6047
+ block-size: auto;
5823
6048
  border: 0;
5824
6049
  color: var(--bf-color-text-default);
5825
6050
  cursor: pointer;
5826
6051
  inline-size: var(--bf-search-and-filter-action-inline-size);
6052
+ inset-block: 0;
5827
6053
  inset-inline-end: 0;
5828
6054
  margin: 0;
5829
6055
  padding: 0;
5830
6056
  position: absolute;
5831
- text-indent: -9999px;
5832
- top: 0;
6057
+ text-indent: -624.9375rem;
5833
6058
  }
5834
6059
 
5835
6060
  :where(.bf-theme) :where(.bf-search-and-filter-search-button)::before {
@@ -5856,16 +6081,16 @@ html.u-baseline-grid::after {
5856
6081
  }
5857
6082
 
5858
6083
  :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;
6084
+ outline: 0.125rem solid var(--bf-color-focus);
6085
+ outline-offset: -0.125rem;
5861
6086
  }
5862
6087
 
5863
6088
  :where(.bf-theme) :where(.bf-search-and-filter-clear) {
5864
- block-size: var(--bf-control-box-size);
6089
+ block-size: auto;
5865
6090
  inline-size: var(--bf-search-and-filter-action-inline-size);
6091
+ inset-block: 0;
5866
6092
  inset-inline-end: var(--bf-search-and-filter-action-inline-size);
5867
6093
  position: absolute;
5868
- top: 0;
5869
6094
  }
5870
6095
 
5871
6096
  :where(.bf-theme) :where(.bf-search-and-filter-selected-count) {
@@ -5895,12 +6120,12 @@ html.u-baseline-grid::after {
5895
6120
  background-color: var(--bf-color-background-inputs);
5896
6121
  border: var(--bf-border-width) solid var(--bf-color-border-default);
5897
6122
  border-top: 0;
5898
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
6123
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
5899
6124
  display: grid;
5900
6125
  gap: var(--bf-field-gap);
5901
6126
  opacity: 1;
5902
6127
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
5903
- padding-inline: var(--bf-panel-padding-inline);
6128
+ padding-inline: var(--bf-component-inline-inset-continuation);
5904
6129
  padding-top: var(--bf-panel-padding-block);
5905
6130
  position: absolute;
5906
6131
  top: 100%;
@@ -5945,12 +6170,6 @@ html.u-baseline-grid::after {
5945
6170
  }
5946
6171
 
5947
6172
  :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
6173
  margin: 0;
5955
6174
  padding-block: 0;
5956
6175
  }
@@ -5997,7 +6216,7 @@ html.u-baseline-grid::after {
5997
6216
  :where(.bf-theme) :where(.bf-list-tree) {
5998
6217
  list-style: none;
5999
6218
  margin: 0;
6000
- padding-left: calc(var(--bf-baseline) * 0.5);
6219
+ padding-left: 0;
6001
6220
  }
6002
6221
 
6003
6222
  :where(.bf-theme) :where(.bf-list-tree) :where(.bf-list-tree) {
@@ -6011,27 +6230,29 @@ html.u-baseline-grid::after {
6011
6230
  }
6012
6231
 
6013
6232
  :where(.bf-theme) :where(.bf-list-tree-item) {
6233
+ display: grid;
6014
6234
  margin: 0;
6015
- padding-left: calc(var(--bf-baseline) * 1.5);
6235
+ padding-left: 0;
6016
6236
  position: relative;
6017
6237
  }
6018
6238
 
6019
- :where(.bf-theme) :where(.bf-list-tree-link) {
6239
+ :where(.bf-theme) :where(a.bf-list-tree-link) {
6020
6240
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
6021
6241
  font-size: var(--bf-body-font-size, 1rem);
6022
6242
  font-style: var(--bf-body-font-style, normal);
6023
6243
  font-weight: var(--bf-body-font-weight, 400);
6024
6244
  line-height: var(--bf-body-line-height, 1.5rem);
6025
6245
  color: var(--bf-color-text-default);
6246
+ border-block: var(--bf-border-width) solid transparent;
6026
6247
  cursor: pointer;
6027
6248
  display: block;
6028
- margin: 0;
6029
- min-block-size: var(--bf-control-box-size-compact);
6030
- padding-block: var(--bf-control-block-padding-compact);
6249
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6250
+ padding-block: var(--bf-single-line-row-padding-block);
6251
+ padding-inline: var(--bf-component-inline-inset-continuation) var(--bf-component-inline-inset-action);
6031
6252
  text-decoration: none;
6032
6253
  }
6033
6254
 
6034
- :where(.bf-theme) :where(.bf-list-tree-link):hover {
6255
+ :where(.bf-theme) :where(a.bf-list-tree-link:hover) {
6035
6256
  color: var(--bf-color-link-default);
6036
6257
  text-decoration: underline;
6037
6258
  }
@@ -6045,8 +6266,8 @@ html.u-baseline-grid::after {
6045
6266
  }
6046
6267
 
6047
6268
  :where(.bf-theme) :where(.bf-list-tree-link):focus-visible {
6048
- outline: 2px solid var(--bf-color-focus);
6049
- outline-offset: -2px;
6269
+ outline: 0.125rem solid var(--bf-color-focus);
6270
+ outline-offset: -0.125rem;
6050
6271
  }
6051
6272
 
6052
6273
  :where(.bf-theme) :where(.bf-list-tree-toggle) {
@@ -6058,14 +6279,14 @@ html.u-baseline-grid::after {
6058
6279
  align-items: center;
6059
6280
  background: transparent;
6060
6281
  border: 0;
6282
+ border-block: var(--bf-border-width) solid transparent;
6061
6283
  color: var(--bf-color-text-default);
6062
6284
  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);
6285
+ display: flex;
6286
+ gap: var(--bf-disclosure-gap);
6287
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6288
+ padding-block: var(--bf-single-line-row-padding-block);
6289
+ padding-inline: 0 calc(var(--bf-baseline) * 0.5);
6069
6290
  text-align: left;
6070
6291
  width: 100%;
6071
6292
  }
@@ -6079,8 +6300,8 @@ html.u-baseline-grid::after {
6079
6300
  }
6080
6301
 
6081
6302
  :where(.bf-theme) :where(.bf-list-tree-toggle):focus-visible {
6082
- outline: 2px solid var(--bf-color-focus);
6083
- outline-offset: -2px;
6303
+ outline: 0.125rem solid var(--bf-color-focus);
6304
+ outline-offset: -0.125rem;
6084
6305
  }
6085
6306
 
6086
6307
  :where(.bf-theme) :where(.bf-list-tree-toggle)::before {
@@ -6092,20 +6313,42 @@ html.u-baseline-grid::after {
6092
6313
  content: "";
6093
6314
  flex: 0 0 1rem;
6094
6315
  inline-size: 1rem;
6095
- transform: rotate(-90deg);
6316
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
6096
6317
  }
6097
6318
 
6098
6319
  :where(.bf-theme) :where(.bf-list-tree-toggle[aria-expanded='true'])::before {
6099
- transform: rotate(0deg);
6320
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(0deg);
6100
6321
  }
6101
6322
 
6102
6323
 
6103
6324
  :where(.bf-theme) :where(.bf-side-navigation, .bf-side-navigation.is-icons, .bf-side-navigation.is-accordion, .bf-side-navigation.is-raw-html) {
6325
+ /* Plain navigation commands use the action rail. Icon-led rows move only their mark canvas,
6326
+ so their copy reaches the shared continuation rail without a fourth
6327
+ component inset. Navigation depth is added separately below. */
6328
+ /* Navigation copy uses one continuation rail whether a row has a leading
6329
+ disclosure/icon slot or not. The mark canvas is derived backwards from
6330
+ that rail, so iconless rows never introduce a fourth text start. */
6331
+ --bf-side-navigation-content-inset: var(--bf-component-inline-inset-continuation);
6332
+ --bf-side-navigation-disclosure-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
6333
+ --bf-side-navigation-depth-step: var(--bf-space-2);
6334
+ --bf-side-navigation-group-gap: 1.5rem;
6104
6335
  color: var(--bf-color-text-inactive);
6105
6336
  display: block;
6106
6337
  inline-size: 100%;
6107
6338
  }
6108
6339
 
6340
+ :where(.bf-theme) :where(.bf-side-navigation-groups) {
6341
+ align-content: start;
6342
+ display: grid;
6343
+ gap: var(--bf-side-navigation-group-gap);
6344
+ }
6345
+
6346
+ :where(.bf-theme) :where(.bf-side-navigation-group) {
6347
+ display: grid;
6348
+ gap: 0rem;
6349
+ min-inline-size: 0;
6350
+ }
6351
+
6109
6352
  :where(.bf-theme) :where(.bf-side-navigation-drawer) {
6110
6353
  background: var(--bf-color-background-default);
6111
6354
  bottom: 0;
@@ -6122,7 +6365,7 @@ html.u-baseline-grid::after {
6122
6365
  }
6123
6366
 
6124
6367
  :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);
6368
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
6126
6369
  transform: translateX(0);
6127
6370
  }
6128
6371
 
@@ -6152,7 +6395,7 @@ html.u-baseline-grid::after {
6152
6395
  border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
6153
6396
  margin-bottom: calc(var(--bf-baseline) * 2);
6154
6397
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
6155
- padding-inline: var(--bf-panel-padding-inline);
6398
+ padding-inline: var(--bf-component-inline-inset-continuation);
6156
6399
  padding-top: var(--bf-panel-padding-block);
6157
6400
  position: sticky;
6158
6401
  top: 0;
@@ -6175,9 +6418,9 @@ html.u-baseline-grid::after {
6175
6418
  display: inline-flex;
6176
6419
  gap: calc(var(--bf-baseline) * 0.5);
6177
6420
  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);
6421
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
6422
+ padding-block: var(--bf-single-line-row-padding-block);
6423
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
6181
6424
  text-decoration: none;
6182
6425
  }
6183
6426
 
@@ -6212,8 +6455,8 @@ html.u-baseline-grid::after {
6212
6455
  }
6213
6456
 
6214
6457
  :where(.bf-theme) :where(.bf-side-navigation-toggle:focus-visible) {
6215
- outline: 2px solid var(--bf-color-focus);
6216
- outline-offset: -2px;
6458
+ outline: 0.125rem solid var(--bf-color-focus);
6459
+ outline-offset: -0.125rem;
6217
6460
  }
6218
6461
 
6219
6462
  :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked) {
@@ -6225,22 +6468,22 @@ html.u-baseline-grid::after {
6225
6468
  display: block;
6226
6469
  margin: 0 0 var(--bf-body-margin-bottom);
6227
6470
  padding-block: var(--bf-body-nudge-start) 0;
6471
+ padding-inline: var(--bf-side-navigation-content-inset);
6228
6472
  }
6229
6473
 
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));
6474
+ :where(.bf-theme) :where(.bf-side-navigation-heading.is-linked) {
6475
+ padding-inline: 0;
6235
6476
  }
6236
6477
 
6237
- :where(.bf-theme) :where(.bf-side-navigation-list:last-of-type) {
6238
- border-bottom: 0;
6239
- margin-bottom: 0;
6240
- padding-bottom: 0;
6478
+ :where(.bf-theme) :where(.bf-side-navigation-list) {
6479
+ display: grid;
6480
+ list-style: none;
6481
+ margin: 0;
6482
+ padding: 0;
6241
6483
  }
6242
6484
 
6243
6485
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) {
6486
+ display: grid;
6244
6487
  margin: 0;
6245
6488
  position: relative;
6246
6489
  }
@@ -6254,21 +6497,23 @@ html.u-baseline-grid::after {
6254
6497
  align-items: center;
6255
6498
  background: transparent;
6256
6499
  border: 0;
6500
+ border-block: var(--bf-border-width) solid transparent;
6257
6501
  color: var(--bf-color-text-inactive);
6258
6502
  display: flex;
6259
6503
  gap: calc(var(--bf-baseline) * 0.5);
6260
6504
  inline-size: 100%;
6261
6505
  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);
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-side-navigation-content-inset);
6509
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-content-inset);
6266
6510
  position: relative;
6267
6511
  text-align: left;
6268
6512
  text-decoration: none;
6269
6513
  }
6270
6514
 
6271
6515
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button) {
6516
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-disclosure-inset);
6272
6517
  gap: var(--bf-disclosure-gap);
6273
6518
  }
6274
6519
 
@@ -6277,22 +6522,21 @@ html.u-baseline-grid::after {
6277
6522
  font-weight: 600;
6278
6523
  }
6279
6524
 
6280
- :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked),
6281
6525
  :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);
6526
+ padding-inline-start: var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset));
6283
6527
  }
6284
6528
 
6285
6529
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6286
6530
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6287
6531
  > :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));
6532
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + var(--bf-side-navigation-depth-step));
6289
6533
  }
6290
6534
 
6291
6535
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6292
6536
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6293
6537
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6294
6538
  > :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));
6539
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 2));
6296
6540
  }
6297
6541
 
6298
6542
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
@@ -6300,7 +6544,7 @@ html.u-baseline-grid::after {
6300
6544
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6301
6545
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
6302
6546
  > :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));
6547
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 3));
6304
6548
  }
6305
6549
 
6306
6550
  :where(.bf-theme) :where(.bf-side-navigation-link:hover, .bf-side-navigation-accordion-button:hover) {
@@ -6309,13 +6553,17 @@ html.u-baseline-grid::after {
6309
6553
  text-decoration: none;
6310
6554
  }
6311
6555
 
6556
+ :where(.bf-theme) :where(a.bf-side-navigation-link:is(:hover, :active)) {
6557
+ text-decoration: none;
6558
+ }
6559
+
6312
6560
  :where(.bf-theme) :where(.bf-side-navigation-link:focus:not(:focus-visible), .bf-side-navigation-accordion-button:focus:not(:focus-visible)) {
6313
6561
  outline: none;
6314
6562
  }
6315
6563
 
6316
6564
  :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;
6565
+ outline: 0.125rem solid var(--bf-color-focus);
6566
+ outline-offset: -0.125rem;
6319
6567
  }
6320
6568
 
6321
6569
  :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 +6734,17 @@ html.u-baseline-grid::after {
6486
6734
  text-decoration: none;
6487
6735
  }
6488
6736
 
6737
+ :where(.bf-theme) :where(a.bf-top-navigation-link:is(:hover, :active)) {
6738
+ text-decoration: none;
6739
+ }
6740
+
6489
6741
  :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
6742
  outline: none;
6491
6743
  }
6492
6744
 
6493
6745
  :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;
6746
+ outline: 0.125rem solid var(--bf-color-focus);
6747
+ outline-offset: -0.125rem;
6496
6748
  }
6497
6749
 
6498
6750
  :where(.bf-theme) :where(.bf-top-navigation-item.is-selected) > :where(.bf-top-navigation-link),
@@ -6616,8 +6868,8 @@ html.u-baseline-grid::after {
6616
6868
  }
6617
6869
 
6618
6870
  :where(.bf-theme) :where(.bf-top-navigation-dropdown-item:focus-visible) {
6619
- outline: 2px solid var(--bf-color-focus);
6620
- outline-offset: -2px;
6871
+ outline: 0.125rem solid var(--bf-color-focus);
6872
+ outline-offset: -0.125rem;
6621
6873
  }
6622
6874
 
6623
6875
  :where(.bf-theme) :where(.bf-top-navigation-search-label) {
@@ -6788,11 +7040,12 @@ html.u-baseline-grid::after {
6788
7040
  content: "";
6789
7041
  flex: 0 0 var(--bf-disclosure-icon-inline-size);
6790
7042
  inline-size: var(--bf-disclosure-icon-inline-size);
7043
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block));
6791
7044
  transition: transform 120ms ease;
6792
7045
  }
6793
7046
 
6794
7047
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button[aria-expanded='false'], .bf-side-navigation-expand[aria-expanded='false'])::before {
6795
- transform: rotate(-90deg);
7048
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
6796
7049
  }
6797
7050
 
6798
7051
  :where(.bf-theme) :where(.bf-side-navigation-expand) {
@@ -6857,14 +7110,34 @@ html.u-baseline-grid::after {
6857
7110
  }
6858
7111
 
6859
7112
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
7113
+ --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - 1rem - var(--bf-side-navigation-icon-gap)));
6860
7114
  align-items: baseline;
6861
7115
  column-gap: var(--bf-side-navigation-icon-gap);
6862
7116
  }
6863
7117
 
7118
+ /* Icon navigation keeps one stable label edge. Rows may omit a decorative
7119
+ icon without collapsing the shared icon track and pulling their copy left. */
7120
+ :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 {
7121
+ content: "";
7122
+ flex: 0 0 1rem;
7123
+ inline-size: 1rem;
7124
+ }
7125
+
7126
+ /* A collapsed icon rail cannot communicate an iconless destination. Remove
7127
+ the alignment spacer with the hidden label so it cannot become a blank
7128
+ visual affordance in that state. */
7129
+ :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 {
7130
+ content: none;
7131
+ }
7132
+
6864
7133
  /* Icon-navigation headings share the label edge, not the icon edge. This
6865
7134
  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));
7135
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading:not(.is-linked)) {
7136
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
7137
+ }
7138
+
7139
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading.is-linked) > :where(.bf-side-navigation-link) {
7140
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
6868
7141
  }
6869
7142
 
6870
7143
  :where(.bf-theme) :where(.bf-side-navigation-icon) > svg {
@@ -6908,7 +7181,7 @@ html.u-baseline-grid::after {
6908
7181
  :where(.bf-theme) :where(.bf-contextual-menu-dropdown) {
6909
7182
  background: var(--bf-color-background-default);
6910
7183
  border: var(--bf-border-width) solid var(--bf-color-border-default);
6911
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.28);
7184
+ box-shadow: 0 0.75rem 2rem rgba(0, 0, 0, 0.28);
6912
7185
  display: none;
6913
7186
  list-style: none;
6914
7187
  margin: 0;
@@ -6942,7 +7215,7 @@ html.u-baseline-grid::after {
6942
7215
  }
6943
7216
 
6944
7217
  :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);
7218
+ box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-default);
6946
7219
  }
6947
7220
 
6948
7221
  :where(.bf-theme) :where(.bf-contextual-menu-link) {
@@ -6960,7 +7233,7 @@ html.u-baseline-grid::after {
6960
7233
  margin: 0;
6961
7234
  overflow: hidden;
6962
7235
  padding-block: var(--bf-control-block-padding-compact);
6963
- padding-inline: var(--bf-panel-padding-inline);
7236
+ padding-inline: var(--bf-component-inline-inset-action);
6964
7237
  text-align: left;
6965
7238
  text-decoration: none;
6966
7239
  text-overflow: ellipsis;
@@ -6986,8 +7259,8 @@ html.u-baseline-grid::after {
6986
7259
  }
6987
7260
 
6988
7261
  :where(.bf-theme) :where(.bf-contextual-menu-link):focus-visible {
6989
- outline: 2px solid var(--bf-color-focus);
6990
- outline-offset: -2px;
7262
+ outline: 0.125rem solid var(--bf-color-focus);
7263
+ outline-offset: -0.125rem;
6991
7264
  }
6992
7265
 
6993
7266
  :where(.bf-theme) :where(.bf-contextual-menu-link.is-disabled, .bf-contextual-menu-link[disabled]) {
@@ -7015,7 +7288,7 @@ html.u-baseline-grid::after {
7015
7288
  font-weight: var(--bf-body-font-weight, 400);
7016
7289
  line-height: var(--bf-body-line-height, 1.5rem);
7017
7290
  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);
7291
+ 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
7292
  color: var(--bf-color-text-default);
7020
7293
  inline-size: max-content;
7021
7294
  left: 0;
@@ -7024,7 +7297,7 @@ html.u-baseline-grid::after {
7024
7297
  opacity: 0;
7025
7298
  padding-block-end: var(--bf-body-nudge-end);
7026
7299
  padding-block-start: var(--bf-body-nudge-start, 0.375rem);
7027
- padding-inline: var(--bf-panel-padding-inline);
7300
+ padding-inline: var(--bf-component-inline-inset-continuation);
7028
7301
  pointer-events: none;
7029
7302
  position: absolute;
7030
7303
  top: 100%;
@@ -7168,10 +7441,10 @@ html.u-baseline-grid::after {
7168
7441
  display: inline-flex;
7169
7442
  gap: calc(var(--bf-baseline) * 0.5);
7170
7443
  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)));
7444
+ margin-bottom: var(--bf-single-line-row-margin-block-end);
7172
7445
  min-inline-size: var(--bf-control-box-size);
7173
7446
  padding-block: max(0rem, calc(var(--bf-button-block-padding) - var(--bf-border-width)));
7174
- padding-inline: var(--bf-control-inline-padding-action);
7447
+ padding-inline: var(--bf-control-inline-padding-action-bordered);
7175
7448
  text-align: center;
7176
7449
  text-decoration: none;
7177
7450
  }
@@ -7185,8 +7458,8 @@ html.u-baseline-grid::after {
7185
7458
  }
7186
7459
 
7187
7460
  :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;
7461
+ outline: 0.125rem solid var(--bf-color-focus);
7462
+ outline-offset: 0.125rem;
7190
7463
  }
7191
7464
 
7192
7465
  :where(.bf-theme) :where(.bf-pagination-link.is-active, .bf-pagination-link[aria-current='page'], .bf-pagination-link[aria-current='true']) {
@@ -7265,14 +7538,15 @@ html.u-baseline-grid::after {
7265
7538
  appearance: none;
7266
7539
  background: transparent;
7267
7540
  border: 0;
7541
+ border-block: var(--bf-border-width) solid transparent;
7268
7542
  color: var(--bf-color-text-default);
7269
7543
  cursor: pointer;
7270
7544
  display: flex;
7271
7545
  gap: var(--bf-disclosure-gap);
7272
7546
  inline-size: 100%;
7273
7547
  justify-content: flex-start;
7274
- min-block-size: var(--bf-control-box-size);
7275
- padding-block: var(--bf-control-block-padding);
7548
+ margin-block-end: var(--bf-single-line-row-margin-block-end);
7549
+ padding-block: var(--bf-single-line-row-padding-block);
7276
7550
  padding-inline: 0;
7277
7551
  text-align: left;
7278
7552
  }
@@ -7282,8 +7556,8 @@ html.u-baseline-grid::after {
7282
7556
  }
7283
7557
 
7284
7558
  :where(.bf-theme) :where(.bf-accordion-tab):focus-visible {
7285
- outline: 2px solid var(--bf-color-focus);
7286
- outline-offset: 2px;
7559
+ outline: 0.125rem solid var(--bf-color-focus);
7560
+ outline-offset: 0.125rem;
7287
7561
  }
7288
7562
 
7289
7563
  :where(.bf-theme) :where(.bf-accordion-tab)::before {
@@ -7296,18 +7570,19 @@ html.u-baseline-grid::after {
7296
7570
  display: inline-block;
7297
7571
  flex: none;
7298
7572
  inline-size: var(--bf-disclosure-icon-inline-size);
7573
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block));
7299
7574
  transition: transform 120ms ease;
7300
7575
  }
7301
7576
 
7302
7577
  :where(.bf-theme) :where(.bf-accordion-tab[aria-expanded='false'])::before {
7303
- transform: rotate(-90deg);
7578
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
7304
7579
  }
7305
7580
 
7306
7581
  :where(.bf-theme) :where(.bf-accordion-panel) {
7307
7582
  margin: 0;
7308
7583
  overflow: hidden;
7309
7584
  padding-block-start: var(--bf-baseline);
7310
- padding-inline-start: calc(var(--bf-accordion-indent) + var(--bf-body-font-size, 1rem) + var(--bf-baseline));
7585
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
7311
7586
  }
7312
7587
 
7313
7588
  :where(.bf-theme) :where(.bf-accordion-panel[aria-hidden='true']) {
@@ -7373,7 +7648,7 @@ html.u-baseline-grid::after {
7373
7648
  :where(.bf-theme) :where(.bf-modal-header, .bf-modal-body, .bf-modal-footer) {
7374
7649
  padding-block-end: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
7375
7650
  padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
7376
- padding-inline: var(--bf-panel-padding-inline);
7651
+ padding-inline: var(--bf-component-inline-inset-continuation);
7377
7652
  }
7378
7653
 
7379
7654
  :where(.bf-theme) :where(.bf-modal-header) {
@@ -7447,7 +7722,7 @@ html.u-baseline-grid::after {
7447
7722
  :where(.bf-theme) :where(.bf-code-snippet-header) {
7448
7723
  align-items: start;
7449
7724
  background: var(--bf-color-background-active);
7450
- box-shadow: inset 0 -1px 0 var(--bf-color-border-default);
7725
+ box-shadow: inset 0 -0.0625rem 0 var(--bf-color-border-default);
7451
7726
  display: flex;
7452
7727
  flex-wrap: wrap;
7453
7728
  justify-content: space-between;
@@ -7469,7 +7744,7 @@ html.u-baseline-grid::after {
7469
7744
  margin: 0;
7470
7745
  overflow-wrap: anywhere;
7471
7746
  padding-block: var(--bf-panel-padding-block);
7472
- padding-inline: var(--bf-panel-padding-inline);
7747
+ padding-inline: var(--bf-component-inline-inset-continuation);
7473
7748
  }
7474
7749
 
7475
7750
  :where(.bf-theme) :where(.bf-code-snippet-dropdowns) {
@@ -7484,7 +7759,7 @@ html.u-baseline-grid::after {
7484
7759
  :where(.bf-theme) :where(.bf-code-snippet-header.is-stacked) :where(.bf-code-snippet-dropdowns) {
7485
7760
  justify-content: stretch;
7486
7761
  margin-inline-start: 0;
7487
- box-shadow: inset 0 1px 0 var(--bf-color-border-default);
7762
+ box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-default);
7488
7763
  width: 100%;
7489
7764
  }
7490
7765
 
@@ -7503,12 +7778,12 @@ html.u-baseline-grid::after {
7503
7778
  min-block-size: calc(var(--bf-body-line-height, 1.5rem) + (var(--bf-panel-padding-block) * 2));
7504
7779
  min-inline-size: 0;
7505
7780
  padding-block: var(--bf-panel-padding-block);
7506
- padding-inline: var(--bf-panel-padding-inline);
7781
+ padding-inline: var(--bf-component-inline-inset-action);
7507
7782
  text-align: start;
7508
7783
  }
7509
7784
 
7510
7785
  :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);
7786
+ box-shadow: inset 0.0625rem 0 0 var(--bf-color-border-default);
7512
7787
  }
7513
7788
 
7514
7789
  :where(.bf-theme) :where(.bf-code-snippet-dropdown):focus:not(:focus-visible) {
@@ -7516,8 +7791,8 @@ html.u-baseline-grid::after {
7516
7791
  }
7517
7792
 
7518
7793
  :where(.bf-theme) :where(.bf-code-snippet-dropdown):focus-visible {
7519
- outline: 2px solid var(--bf-color-focus);
7520
- outline-offset: -2px;
7794
+ outline: 0.125rem solid var(--bf-color-focus);
7795
+ outline-offset: -0.125rem;
7521
7796
  }
7522
7797
 
7523
7798
  :where(.bf-theme) :where(.bf-code-snippet-block, .bf-code-snippet-block.is-icon, .bf-code-snippet-block.is-numbered) {
@@ -7532,7 +7807,7 @@ html.u-baseline-grid::after {
7532
7807
  min-inline-size: 0;
7533
7808
  overflow-x: auto;
7534
7809
  padding-block: var(--bf-panel-padding-block);
7535
- padding-inline: var(--bf-panel-padding-inline);
7810
+ padding-inline: var(--bf-component-inline-inset-continuation);
7536
7811
  tab-size: 2;
7537
7812
  white-space: pre;
7538
7813
  }
@@ -7548,7 +7823,7 @@ html.u-baseline-grid::after {
7548
7823
 
7549
7824
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon) {
7550
7825
  cursor: copy;
7551
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 3));
7826
+ padding-inline-start: calc(var(--bf-component-inline-inset-continuation) + (var(--bf-baseline) * 3));
7552
7827
  position: relative;
7553
7828
  }
7554
7829
 
@@ -7560,7 +7835,7 @@ html.u-baseline-grid::after {
7560
7835
  line-height: var(--bf-h6-line-height, 1.5rem);
7561
7836
  color: var(--bf-color-text-muted);
7562
7837
  content: "$";
7563
- inset-inline-start: var(--bf-panel-padding-inline);
7838
+ inset-inline-start: var(--bf-component-inline-inset-continuation);
7564
7839
  inset-block-start: var(--bf-panel-padding-block);
7565
7840
  position: absolute;
7566
7841
  }
@@ -7575,7 +7850,7 @@ html.u-baseline-grid::after {
7575
7850
 
7576
7851
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon.is-copied) {
7577
7852
  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);
7853
+ box-shadow: inset 0 0 0 0.0625rem var(--bf-color-border-information);
7579
7854
  }
7580
7855
 
7581
7856
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon):focus:not(:focus-visible) {
@@ -7583,8 +7858,8 @@ html.u-baseline-grid::after {
7583
7858
  }
7584
7859
 
7585
7860
  :where(.bf-theme) :where(.bf-code-snippet-block.is-icon):focus-visible {
7586
- outline: 2px solid var(--bf-color-focus);
7587
- outline-offset: -2px;
7861
+ outline: 0.125rem solid var(--bf-color-focus);
7862
+ outline-offset: -0.125rem;
7588
7863
  }
7589
7864
 
7590
7865
  :where(.bf-theme) :where(.bf-code-snippet-block.is-numbered) {
@@ -7646,6 +7921,32 @@ html.u-baseline-grid::after {
7646
7921
  z-index: 40;
7647
7922
  }
7648
7923
 
7924
+ /* A responsive application brand occupies the persistent bar only while the
7925
+ * full navigation brand is unavailable. The same public tagged-logo contract
7926
+ * is used in both locations; state CSS guarantees that only one copy is
7927
+ * visible and exposed at a time. */
7928
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) {
7929
+ align-items: start;
7930
+ column-gap: calc(var(--bf-baseline) * 2);
7931
+ padding-inline-end: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
7932
+ }
7933
+
7934
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) {
7935
+ margin-block-end: calc(var(--bf-border-width) * -1);
7936
+ }
7937
+
7938
+ :where(.bf-theme) :where(.bf-navigation-bar.is-responsive) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
7939
+ flex: 1 1 12rem;
7940
+ inline-size: auto;
7941
+ min-inline-size: 0;
7942
+ }
7943
+
7944
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation:not(.is-collapsed)))
7945
+ > :where(.bf-navigation-bar.is-responsive)
7946
+ :where(.bf-top-navigation-logo) {
7947
+ visibility: hidden;
7948
+ }
7949
+
7649
7950
  :where(.bf-theme) :where(.bf-navigation) {
7650
7951
  grid-column: 1 / -1;
7651
7952
  grid-row: 1 / -1;
@@ -7692,7 +7993,7 @@ html.u-baseline-grid::after {
7692
7993
  }
7693
7994
 
7694
7995
  :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);
7996
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
7696
7997
  transform: translateX(0);
7697
7998
  visibility: visible;
7698
7999
  }
@@ -7702,10 +8003,10 @@ html.u-baseline-grid::after {
7702
8003
  }
7703
8004
 
7704
8005
  :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-label) {
7705
- block-size: 1px;
8006
+ block-size: 0.0625rem;
7706
8007
  clip-path: inset(50%);
7707
- inline-size: 1px;
7708
- max-inline-size: 1px;
8008
+ inline-size: 0.0625rem;
8009
+ max-inline-size: 0.0625rem;
7709
8010
  opacity: 0;
7710
8011
  overflow: hidden;
7711
8012
  pointer-events: none;
@@ -7723,8 +8024,8 @@ html.u-baseline-grid::after {
7723
8024
  padding-inline: calc(var(--bf-baseline) * 1.25);
7724
8025
  }
7725
8026
 
7726
- :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-list) {
7727
- border-bottom-color: transparent;
8027
+ :where(.bf-theme) :where(.bf-navigation.is-collapsed) :where(.bf-side-navigation-list)::after {
8028
+ content: none;
7728
8029
  }
7729
8030
 
7730
8031
  :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 +8038,14 @@ html.u-baseline-grid::after {
7737
8038
  grid-template-rows: minmax(0, 1fr);
7738
8039
  }
7739
8040
 
8041
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation)):has(> .bf-aside.is-pinned:not(.is-collapsed)) {
8042
+ grid-template-areas:
8043
+ "navigation-bar navigation-bar"
8044
+ "main aside";
8045
+ grid-template-columns: minmax(0, 1fr) minmax(0, var(--bf-application-aside-width));
8046
+ grid-template-rows: min-content minmax(0, 1fr);
8047
+ }
8048
+
7740
8049
  :where(.bf-theme) :where(.bf-main) {
7741
8050
  grid-area: main;
7742
8051
  min-block-size: 0;
@@ -7775,7 +8084,7 @@ html.u-baseline-grid::after {
7775
8084
  :where(.bf-theme) :where(.bf-aside.is-overlay, .bf-aside.is-drawer) {
7776
8085
  align-self: stretch;
7777
8086
  block-size: auto;
7778
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
8087
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
7779
8088
  bottom: 0;
7780
8089
  grid-column: 1 / -1;
7781
8090
  grid-row: 1 / -1;
@@ -7865,14 +8174,14 @@ html.u-baseline-grid::after {
7865
8174
 
7866
8175
  :where(.bf-theme) :where(.bf-application-aside-resize-handle)::after {
7867
8176
  background: var(--bf-color-border-default);
7868
- border-radius: 999px;
8177
+ border-radius: 62.4375rem;
7869
8178
  content: "";
7870
8179
  inset-block: var(--bf-panel-padding-block);
7871
- inset-inline-start: calc(50% - 1px);
8180
+ inset-inline-start: calc(50% - 0.0625rem);
7872
8181
  opacity: 0.95;
7873
8182
  position: absolute;
7874
8183
  transition: background-color 120ms ease, opacity 120ms ease;
7875
- width: 2px;
8184
+ width: 0.125rem;
7876
8185
  }
7877
8186
 
7878
8187
  :where(.bf-theme) :where(.bf-application-aside-resize-handle):hover::after,
@@ -7882,8 +8191,8 @@ html.u-baseline-grid::after {
7882
8191
  }
7883
8192
 
7884
8193
  :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;
8194
+ outline: 0.125rem solid var(--bf-application-resize-handle-focus-ring);
8195
+ outline-offset: -0.125rem;
7887
8196
  }
7888
8197
 
7889
8198
  @media (min-width: 64.75rem) {
@@ -7902,6 +8211,16 @@ html.u-baseline-grid::after {
7902
8211
  grid-template-columns: minmax(0, var(--bf-application-navigation-width)) minmax(0, 1fr) minmax(0, var(--bf-application-aside-width));
7903
8212
  }
7904
8213
 
8214
+ :where(.bf-theme) :where(.bf-application:has(> .bf-navigation:not(.is-collapsed))) > :where(.bf-navigation-bar.is-responsive) {
8215
+ block-size: 0;
8216
+ border: 0;
8217
+ min-block-size: 0;
8218
+ overflow: hidden;
8219
+ pointer-events: none;
8220
+ position: absolute;
8221
+ visibility: hidden;
8222
+ }
8223
+
7905
8224
  :where(.bf-theme) :where(.bf-application:has(> .bf-navigation.is-collapsed)) {
7906
8225
  --bf-application-navigation-width: var(--bf-application-navigation-width-collapsed);
7907
8226
  }
@@ -7947,8 +8266,8 @@ html.u-baseline-grid::after {
7947
8266
  }
7948
8267
 
7949
8268
  /* 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
8269
+ * first title line, then the 2.375rem tag extends upward to the navigation edge.
8270
+ * Its 1.375rem inline size preserves the established 38:22 (~1.73) tag ratio; the
7952
8271
  * tag must not stretch to the full occupied navigation row. */
7953
8272
  :where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) {
7954
8273
  min-inline-size: 0;
@@ -8002,8 +8321,8 @@ html.u-baseline-grid::after {
8002
8321
  line-height: var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5));
8003
8322
  overflow: visible;
8004
8323
  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
8324
+ /* The first title line and the 1rem mark share the mark's fixed centre:
8325
+ * tag block-end minus the 0.375rem inset minus half the mark. Symmetric title
8007
8326
  * padding keeps the occupied row stable across all four type-density tiers. */
8008
8327
  padding-block: calc(
8009
8328
  var(--bf-top-navigation-logo-tag-block-size)
@@ -8089,11 +8408,15 @@ html.u-baseline-grid::after {
8089
8408
  :where(.bf-theme) :where(.bf-in-page-navigation) {
8090
8409
  container-name: bf-in-page-navigation;
8091
8410
  container-type: inline-size;
8092
- margin-block: 0 var(--bf-section-space-shallow);
8411
+ margin: 0;
8093
8412
  min-inline-size: 0;
8094
8413
  }
8095
8414
 
8096
8415
  :where(.bf-theme) :where(.bf-in-page-navigation-nav) {
8416
+ --bf-stack-space: var(--bf-space-1);
8417
+ align-content: start;
8418
+ display: grid;
8419
+ gap: var(--bf-stack-space);
8097
8420
  max-block-size: 100dvb;
8098
8421
  min-inline-size: 0;
8099
8422
  overflow: auto;
@@ -8109,12 +8432,17 @@ html.u-baseline-grid::after {
8109
8432
  line-height: var(--bf-h6-line-height, 1.5rem);
8110
8433
  color: var(--bf-color-text-muted);
8111
8434
  display: block;
8112
- margin: 0 0 var(--bf-space-1);
8113
- padding-block: var(--bf-h6-nudge-start) var(--bf-h6-nudge-end);
8435
+ margin-block: 0 var(--bf-h6-margin-bottom);
8436
+ padding-block-end: 0;
8437
+ padding-block-start: var(--bf-h6-nudge-start);
8114
8438
  }
8115
8439
 
8116
8440
  :where(.bf-theme) :where(.bf-in-page-navigation-list) {
8441
+ --bf-stack-space: var(--bf-space-1);
8442
+ align-content: start;
8117
8443
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-color-border-low-contrast);
8444
+ display: grid;
8445
+ gap: var(--bf-stack-space);
8118
8446
  list-style: none;
8119
8447
  margin: 0;
8120
8448
  min-inline-size: 0;
@@ -8122,13 +8450,16 @@ html.u-baseline-grid::after {
8122
8450
  }
8123
8451
 
8124
8452
  :where(.bf-theme) :where(.bf-in-page-navigation-item) {
8453
+ align-content: start;
8454
+ display: grid;
8455
+ gap: var(--bf-stack-space);
8125
8456
  margin: 0;
8126
8457
  min-inline-size: 0;
8127
8458
  padding: 0;
8128
8459
  position: relative;
8129
8460
  }
8130
8461
 
8131
- :where(.bf-theme) :where(.bf-in-page-navigation-link) {
8462
+ :where(.bf-theme) :where(a.bf-in-page-navigation-link) {
8132
8463
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
8133
8464
  font-size: var(--bf-body-font-size, 1rem);
8134
8465
  font-style: var(--bf-body-font-style, normal);
@@ -8141,7 +8472,7 @@ html.u-baseline-grid::after {
8141
8472
  min-inline-size: 0;
8142
8473
  overflow: hidden;
8143
8474
  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));
8475
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8145
8476
  padding-inline: var(--bf-space-2) 0;
8146
8477
  position: relative;
8147
8478
  text-decoration: none;
@@ -8149,7 +8480,7 @@ html.u-baseline-grid::after {
8149
8480
  -webkit-box-orient: vertical;
8150
8481
  }
8151
8482
 
8152
- :where(.bf-theme) :where(.bf-in-page-navigation-link:hover) {
8483
+ :where(.bf-theme) :where(a.bf-in-page-navigation-link:hover) {
8153
8484
  color: var(--bf-color-text-default);
8154
8485
  text-decoration: none;
8155
8486
  }
@@ -8159,8 +8490,8 @@ html.u-baseline-grid::after {
8159
8490
  }
8160
8491
 
8161
8492
  :where(.bf-theme) :where(.bf-in-page-navigation-link:focus-visible) {
8162
- outline: 2px solid var(--bf-color-focus);
8163
- outline-offset: 2px;
8493
+ outline: 0.125rem solid var(--bf-color-focus);
8494
+ outline-offset: 0.125rem;
8164
8495
  }
8165
8496
 
8166
8497
  :where(.bf-theme) :where(.bf-in-page-navigation-link.is-active, .bf-in-page-navigation-link[aria-current]) {
@@ -8216,8 +8547,8 @@ html.u-baseline-grid::after {
8216
8547
  }
8217
8548
 
8218
8549
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle:focus-visible) {
8219
- outline: 2px solid var(--bf-color-focus);
8220
- outline-offset: -2px;
8550
+ outline: 0.125rem solid var(--bf-color-focus);
8551
+ outline-offset: -0.125rem;
8221
8552
  }
8222
8553
 
8223
8554
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle > .bf-icon) {
@@ -8231,6 +8562,7 @@ html.u-baseline-grid::after {
8231
8562
  border-block-end: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
8232
8563
  display: grid;
8233
8564
  grid-template-columns: minmax(0, 1fr) auto;
8565
+ row-gap: 0;
8234
8566
  max-block-size: none;
8235
8567
  overflow: visible;
8236
8568
  position: static;
@@ -8243,6 +8575,7 @@ html.u-baseline-grid::after {
8243
8575
  :where(.bf-theme) :where(.bf-in-page-navigation-list) {
8244
8576
  border: 0;
8245
8577
  display: flex;
8578
+ gap: 0;
8246
8579
  grid-column: 1;
8247
8580
  grid-row: 1;
8248
8581
  margin: 0;
@@ -8307,7 +8640,8 @@ html.u-baseline-grid::after {
8307
8640
  :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
8641
  background: var(--bf-color-background-alt);
8309
8642
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-color-border-low-contrast);
8310
- display: block;
8643
+ display: grid;
8644
+ gap: var(--bf-stack-space);
8311
8645
  grid-column: 1 / -1;
8312
8646
  grid-row: 2;
8313
8647
  /* The mobile nav owns a bottom rule; reserve its thickness within the
@@ -8318,20 +8652,21 @@ html.u-baseline-grid::after {
8318
8652
  }
8319
8653
 
8320
8654
  :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;
8655
+ display: grid;
8322
8656
  max-inline-size: none;
8323
8657
  }
8324
8658
 
8325
8659
  :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
8660
  display: -webkit-box;
8327
8661
  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));
8662
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
8329
8663
  padding-inline: var(--bf-space-2) 0;
8330
8664
  white-space: normal;
8331
8665
  }
8332
8666
 
8333
8667
  :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;
8668
+ display: grid;
8669
+ gap: var(--bf-stack-space);
8335
8670
  }
8336
8671
 
8337
8672
  :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 +8749,47 @@ html.u-baseline-grid::after {
8414
8749
  /* ------------------------------------------------------------------ */
8415
8750
 
8416
8751
  :where(.bf-theme) :where(.bf-table-of-contents) {
8752
+ --bf-table-of-contents-section-gap: var(--bf-section-space-shallow);
8753
+ align-content: start;
8417
8754
  container-name: bf-table-of-contents;
8418
8755
  container-type: inline-size;
8419
- margin-block: 0 var(--bf-section-space-shallow);
8756
+ display: grid;
8757
+ gap: var(--bf-table-of-contents-section-gap);
8758
+ margin: 0;
8420
8759
  min-inline-size: 0;
8421
8760
  }
8422
8761
 
8423
8762
  :where(.bf-theme) :where(.bf-table-of-contents-section) {
8763
+ --bf-stack-space: 0rem;
8764
+ align-content: start;
8765
+ display: grid;
8766
+ gap: var(--bf-stack-space);
8424
8767
  margin: 0;
8425
8768
  min-inline-size: 0;
8426
- padding-block-end: var(--bf-space-2);
8769
+ padding: 0;
8770
+ position: relative;
8427
8771
  }
8428
8772
 
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));
8773
+ :where(.bf-theme) :where(.bf-table-of-contents-section + .bf-table-of-contents-section)::before {
8774
+ background: var(--bf-color-border-low-contrast);
8775
+ block-size: var(--bf-border-width);
8776
+ content: "";
8777
+ inset-block-start: 0;
8778
+ inset-inline: 0;
8779
+ position: absolute;
8432
8780
  }
8433
8781
 
8434
8782
  :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);
8783
+ color: var(--bf-color-text-default);
8784
+ margin: 0;
8785
+ padding-block-end: 0;
8443
8786
  }
8444
8787
 
8445
8788
  :where(.bf-theme) :where(.bf-table-of-contents-list) {
8789
+ --bf-stack-space: 0rem;
8790
+ align-content: start;
8791
+ display: grid;
8792
+ gap: var(--bf-stack-space);
8446
8793
  list-style: none;
8447
8794
  margin: 0;
8448
8795
  min-inline-size: 0;
@@ -8450,26 +8797,30 @@ html.u-baseline-grid::after {
8450
8797
  }
8451
8798
 
8452
8799
  :where(.bf-theme) :where(.bf-table-of-contents-item) {
8800
+ align-content: start;
8801
+ display: grid;
8802
+ gap: var(--bf-stack-space);
8453
8803
  margin: 0;
8454
8804
  min-inline-size: 0;
8455
8805
  padding: 0;
8456
8806
  }
8457
8807
 
8458
- :where(.bf-theme) :where(.bf-table-of-contents-link) {
8808
+ :where(.bf-theme) :where(a.bf-table-of-contents-link) {
8459
8809
  font-family: var(--bf-body-font-family, "IBM Plex Sans", "Segoe UI", system-ui, sans-serif);
8460
8810
  font-size: var(--bf-body-font-size, 1rem);
8461
8811
  font-style: var(--bf-body-font-style, normal);
8462
8812
  font-weight: var(--bf-body-font-weight, 400);
8463
8813
  line-height: var(--bf-body-line-height, 1.5rem);
8814
+ border-block: var(--bf-border-width) solid transparent;
8464
8815
  color: var(--bf-color-link-default);
8465
8816
  display: block;
8466
- margin: 0;
8817
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
8467
8818
  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));
8819
+ padding-block: var(--bf-single-line-row-padding-block);
8469
8820
  text-decoration: none;
8470
8821
  }
8471
8822
 
8472
- :where(.bf-theme) :where(.bf-table-of-contents-link:hover) {
8823
+ :where(.bf-theme) :where(a.bf-table-of-contents-link:hover) {
8473
8824
  color: var(--bf-color-text-default);
8474
8825
  text-decoration: underline;
8475
8826
  }
@@ -8479,8 +8830,8 @@ html.u-baseline-grid::after {
8479
8830
  }
8480
8831
 
8481
8832
  :where(.bf-theme) :where(.bf-table-of-contents-link:focus-visible) {
8482
- outline: 2px solid var(--bf-color-focus);
8483
- outline-offset: 2px;
8833
+ outline: 0.125rem solid var(--bf-color-focus);
8834
+ outline-offset: 0.125rem;
8484
8835
  }
8485
8836
 
8486
8837
  :where(.bf-theme) :where(.bf-table-of-contents-link.is-active, .bf-table-of-contents-link[aria-current]) {
@@ -8560,9 +8911,9 @@ html.u-baseline-grid::after {
8560
8911
  padding: 0;
8561
8912
  }
8562
8913
 
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) {
8914
+ :where(.bf-theme) :where(.bf-tiered-list-header) > hr,
8915
+ :where(.bf-theme) :where(.bf-tiered-list-item) > hr,
8916
+ :where(.bf-theme) :where(.bf-tiered-list-cta) > hr {
8566
8917
  grid-column: 1 / -1;
8567
8918
  }
8568
8919
 
@@ -8577,8 +8928,8 @@ html.u-baseline-grid::after {
8577
8928
  grid-template-columns: repeat(8, minmax(0, 1fr));
8578
8929
  }
8579
8930
 
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) {
8931
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item) > hr,
8932
+ :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
8933
  grid-column: 3 / span 6;
8583
8934
  }
8584
8935
 
@@ -8593,9 +8944,9 @@ html.u-baseline-grid::after {
8593
8944
  }
8594
8945
 
8595
8946
  /* ------------------------------------------------------------------ */
8596
- /* Header split (≥ 64.75rem): unchanged 50/50 title/description. */
8947
+ /* Header split (≥ 45rem): the shared readable 50/50 title/content split. */
8597
8948
  /* ------------------------------------------------------------------ */
8598
- @container (width >= 64.75rem) {
8949
+ @container (width >= 45rem) {
8599
8950
  :where(.bf-theme) :where(.bf-tiered-list:not(.is-description-full-width)) :where(.bf-tiered-list-header) {
8600
8951
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
8601
8952
  }
@@ -8619,7 +8970,7 @@ html.u-baseline-grid::after {
8619
8970
  queries cannot style their own container, so responsive descendants span
8620
8971
  these tracks instead of relying on an ineligible self-query. */
8621
8972
  grid-template-columns: repeat(8, minmax(0, 1fr));
8622
- margin-block-end: var(--bf-section-space-shallow);
8973
+ margin: 0;
8623
8974
  position: relative;
8624
8975
  }
8625
8976
 
@@ -8636,7 +8987,7 @@ html.u-baseline-grid::after {
8636
8987
  /* Responsive aspect media can make a shared subgrid track land between
8637
8988
  baselines. Snap that media box itself; the surrounding composition still
8638
8989
  does not own or erase any child's semantic margins. */
8639
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
8990
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
8640
8991
  :where(.bf-theme) :where(.bf-equal-height-row-item) > :where(.bf-aspect) {
8641
8992
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
8642
8993
  }
@@ -8715,7 +9066,7 @@ html.u-baseline-grid::after {
8715
9066
  :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
8716
9067
  :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after {
8717
9068
  background-color: var(--bf-color-border-low-contrast);
8718
- block-size: 1px;
9069
+ block-size: 0.0625rem;
8719
9070
  content: "";
8720
9071
  display: none;
8721
9072
  grid-column: 1 / -1;
@@ -8788,8 +9139,8 @@ html.u-baseline-grid::after {
8788
9139
  /* ------------------------------------------------------------------ */
8789
9140
  /* Gutter and margin escalation — viewport-based, all tiers */
8790
9141
  /* 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. */
9142
+ /* Baseline Foundry models the spec's 28.75rem x-small row as part of the */
9143
+ /* default <38.75rem bracket because the values do not change at 28.75rem. */
8793
9144
  /* ------------------------------------------------------------------ */
8794
9145
 
8795
9146
  :where(.bf-theme) {
@@ -8860,9 +9211,7 @@ html.u-baseline-grid::after {
8860
9211
  margin-inline-start: 0;
8861
9212
  }
8862
9213
 
8863
- :where(.bf-theme.bf-tier-app) :where(.bf-page) {
8864
- max-inline-size: none;
8865
- }
9214
+
8866
9215
 
8867
9216
  :where(.bf-theme) :where(.bf-panel-content, .bf-accordion-panel) :where(.bf-fixed-width) {
8868
9217
  padding-inline: 0;
@@ -8872,6 +9221,13 @@ html.u-baseline-grid::after {
8872
9221
  padding-inline: 0;
8873
9222
  }
8874
9223
 
9224
+ /* A page is the outer grid row and therefore owns its horizontal gutter.
9225
+ * Fixed-width regions nested anywhere inside it retain their cap and
9226
+ * centering behavior without introducing a second page inset. */
9227
+ :where(.bf-theme) :where(.bf-page) :where(.bf-fixed-width) {
9228
+ padding-inline: 0;
9229
+ }
9230
+
8875
9231
  /* ------------------------------------------------------------------ */
8876
9232
  /* Grid base — 4 columns, all tiers */
8877
9233
  /* ------------------------------------------------------------------ */
@@ -8893,7 +9249,7 @@ html.u-baseline-grid::after {
8893
9249
 
8894
9250
  :where(.bf-theme) :where(.bf-grid.is-guide) > * {
8895
9251
  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));
9252
+ box-shadow: inset 0 0 0 0.0625rem color-mix(in srgb, var(--bf-color-accent) 50%, var(--bf-color-rule));
8897
9253
  min-block-size: calc(var(--bf-baseline) * 4);
8898
9254
  }
8899
9255