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
@@ -1,11 +1,33 @@
1
1
  export function legacyNavigationCss(options) {
2
- const { bodyMediumTypeStyles, bodySemiboldTypeStyles, bodyTypeStyles, buttonMarginBottom, buttonPadding, compactButtonPadding } = options;
2
+ const { bodyMediumTypeStyles, bodySemiboldTypeStyles, bodyTypeStyles, buttonMarginBottom, buttonPadding } = options;
3
3
  return `:where(.bf-theme) :where(.bf-side-navigation, .bf-side-navigation.is-icons, .bf-side-navigation.is-accordion, .bf-side-navigation.is-raw-html) {
4
+ /* Plain navigation commands use the action rail. Icon-led rows move only their mark canvas,
5
+ so their copy reaches the shared continuation rail without a fourth
6
+ component inset. Navigation depth is added separately below. */
7
+ /* Navigation copy uses one continuation rail whether a row has a leading
8
+ disclosure/icon slot or not. The mark canvas is derived backwards from
9
+ that rail, so iconless rows never introduce a fourth text start. */
10
+ --bf-side-navigation-content-inset: var(--bf-component-inline-inset-continuation);
11
+ --bf-side-navigation-disclosure-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
12
+ --bf-side-navigation-depth-step: var(--bf-space-2);
13
+ --bf-side-navigation-group-gap: 1.5rem;
4
14
  color: var(--bf-color-text-inactive);
5
15
  display: block;
6
16
  inline-size: 100%;
7
17
  }
8
18
 
19
+ :where(.bf-theme) :where(.bf-side-navigation-groups) {
20
+ align-content: start;
21
+ display: grid;
22
+ gap: var(--bf-side-navigation-group-gap);
23
+ }
24
+
25
+ :where(.bf-theme) :where(.bf-side-navigation-group) {
26
+ display: grid;
27
+ gap: 0rem;
28
+ min-inline-size: 0;
29
+ }
30
+
9
31
  :where(.bf-theme) :where(.bf-side-navigation-drawer) {
10
32
  background: var(--bf-color-background-default);
11
33
  bottom: 0;
@@ -22,7 +44,7 @@ export function legacyNavigationCss(options) {
22
44
  }
23
45
 
24
46
  :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) {
25
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
47
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
26
48
  transform: translateX(0);
27
49
  }
28
50
 
@@ -52,7 +74,7 @@ export function legacyNavigationCss(options) {
52
74
  border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
53
75
  margin-bottom: calc(var(--bf-baseline) * 2);
54
76
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
55
- padding-inline: var(--bf-panel-padding-inline);
77
+ padding-inline: var(--bf-component-inline-inset-continuation);
56
78
  padding-top: var(--bf-panel-padding-block);
57
79
  position: sticky;
58
80
  top: 0;
@@ -71,7 +93,7 @@ ${bodyTypeStyles} align-items: center;
71
93
  gap: calc(var(--bf-baseline) * 0.5);
72
94
  justify-content: center;
73
95
  margin: 0 0 ${buttonMarginBottom};
74
- ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
96
+ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action-bordered);
75
97
  text-decoration: none;
76
98
  }
77
99
 
@@ -106,30 +128,30 @@ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
106
128
  }
107
129
 
108
130
  :where(.bf-theme) :where(.bf-side-navigation-toggle:focus-visible) {
109
- outline: 2px solid var(--bf-color-focus);
110
- outline-offset: -2px;
131
+ outline: 0.125rem solid var(--bf-color-focus);
132
+ outline-offset: -0.125rem;
111
133
  }
112
134
 
113
135
  :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked) {
114
136
  ${bodySemiboldTypeStyles} display: block;
115
137
  margin: 0 0 var(--bf-body-margin-bottom);
116
138
  padding-block: var(--bf-body-nudge-start) 0;
139
+ padding-inline: var(--bf-side-navigation-content-inset);
117
140
  }
118
141
 
119
- :where(.bf-theme) :where(.bf-side-navigation-list) {
120
- border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
121
- list-style: none;
122
- margin: 0 0 calc(var(--bf-baseline) * 2);
123
- padding: 0 0 calc((var(--bf-baseline) * 2) - var(--bf-border-width));
142
+ :where(.bf-theme) :where(.bf-side-navigation-heading.is-linked) {
143
+ padding-inline: 0;
124
144
  }
125
145
 
126
- :where(.bf-theme) :where(.bf-side-navigation-list:last-of-type) {
127
- border-bottom: 0;
128
- margin-bottom: 0;
129
- padding-bottom: 0;
146
+ :where(.bf-theme) :where(.bf-side-navigation-list) {
147
+ display: grid;
148
+ list-style: none;
149
+ margin: 0;
150
+ padding: 0;
130
151
  }
131
152
 
132
153
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) {
154
+ display: grid;
133
155
  margin: 0;
134
156
  position: relative;
135
157
  }
@@ -138,20 +160,23 @@ ${bodySemiboldTypeStyles} display: block;
138
160
  ${bodyTypeStyles} align-items: center;
139
161
  background: transparent;
140
162
  border: 0;
163
+ border-block: var(--bf-border-width) solid transparent;
141
164
  color: var(--bf-color-text-inactive);
142
165
  display: flex;
143
166
  gap: calc(var(--bf-baseline) * 0.5);
144
167
  inline-size: 100%;
145
168
  justify-content: flex-start;
146
- margin: 0;
147
- min-block-size: var(--bf-control-box-size-compact);
148
- ${compactButtonPadding} padding-inline: var(--bf-panel-padding-inline);
169
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
170
+ padding-block: var(--bf-single-line-row-padding-block);
171
+ padding-inline: var(--bf-side-navigation-content-inset);
172
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-content-inset);
149
173
  position: relative;
150
174
  text-align: left;
151
175
  text-decoration: none;
152
176
  }
153
177
 
154
178
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button) {
179
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-disclosure-inset);
155
180
  gap: var(--bf-disclosure-gap);
156
181
  }
157
182
 
@@ -160,22 +185,21 @@ ${compactButtonPadding} padding-inline: var(--bf-panel-padding-inline);
160
185
  font-weight: 600;
161
186
  }
162
187
 
163
- :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked),
164
188
  :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) {
165
- padding-inline-start: var(--bf-panel-padding-inline);
189
+ padding-inline-start: var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset));
166
190
  }
167
191
 
168
192
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
169
193
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
170
194
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
171
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 2));
195
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + var(--bf-side-navigation-depth-step));
172
196
  }
173
197
 
174
198
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
175
199
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
176
200
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
177
201
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
178
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 4));
202
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 2));
179
203
  }
180
204
 
181
205
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
@@ -183,7 +207,7 @@ ${compactButtonPadding} padding-inline: var(--bf-panel-padding-inline);
183
207
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
184
208
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
185
209
  > :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
186
- padding-inline-start: calc(var(--bf-panel-padding-inline) + (var(--bf-baseline) * 6));
210
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 3));
187
211
  }
188
212
 
189
213
  :where(.bf-theme) :where(.bf-side-navigation-link:hover, .bf-side-navigation-accordion-button:hover) {
@@ -192,13 +216,17 @@ ${compactButtonPadding} padding-inline: var(--bf-panel-padding-inline);
192
216
  text-decoration: none;
193
217
  }
194
218
 
219
+ :where(.bf-theme) :where(a.bf-side-navigation-link:is(:hover, :active)) {
220
+ text-decoration: none;
221
+ }
222
+
195
223
  :where(.bf-theme) :where(.bf-side-navigation-link:focus:not(:focus-visible), .bf-side-navigation-accordion-button:focus:not(:focus-visible)) {
196
224
  outline: none;
197
225
  }
198
226
 
199
227
  :where(.bf-theme) :where(.bf-side-navigation-link:focus-visible, .bf-side-navigation-accordion-button:focus-visible) {
200
- outline: 2px solid var(--bf-color-focus);
201
- outline-offset: -2px;
228
+ outline: 0.125rem solid var(--bf-color-focus);
229
+ outline-offset: -0.125rem;
202
230
  }
203
231
 
204
232
  :where(.bf-theme) :where(.bf-side-navigation-link.is-active, .bf-side-navigation-link[aria-current='page'], .bf-side-navigation-link[aria-current='true']) {
@@ -359,13 +387,17 @@ ${bodyTypeStyles} align-items: center;
359
387
  text-decoration: none;
360
388
  }
361
389
 
390
+ :where(.bf-theme) :where(a.bf-top-navigation-link:is(:hover, :active)) {
391
+ text-decoration: none;
392
+ }
393
+
362
394
  :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)) {
363
395
  outline: none;
364
396
  }
365
397
 
366
398
  :where(.bf-theme) :where(.bf-top-navigation-link:focus-visible, .bf-top-navigation-menu-toggle:focus-visible, .bf-top-navigation-search-toggle:focus-visible) {
367
- outline: 2px solid var(--bf-color-focus);
368
- outline-offset: -2px;
399
+ outline: 0.125rem solid var(--bf-color-focus);
400
+ outline-offset: -0.125rem;
369
401
  }
370
402
 
371
403
  :where(.bf-theme) :where(.bf-top-navigation-item.is-selected) > :where(.bf-top-navigation-link),
@@ -484,8 +516,8 @@ ${bodyTypeStyles} align-items: center;
484
516
  }
485
517
 
486
518
  :where(.bf-theme) :where(.bf-top-navigation-dropdown-item:focus-visible) {
487
- outline: 2px solid var(--bf-color-focus);
488
- outline-offset: -2px;
519
+ outline: 0.125rem solid var(--bf-color-focus);
520
+ outline-offset: -0.125rem;
489
521
  }
490
522
 
491
523
  :where(.bf-theme) :where(.bf-top-navigation-search-label) {
@@ -656,11 +688,12 @@ ${bodyTypeStyles} align-items: center;
656
688
  content: "";
657
689
  flex: 0 0 var(--bf-disclosure-icon-inline-size);
658
690
  inline-size: var(--bf-disclosure-icon-inline-size);
691
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block));
659
692
  transition: transform 120ms ease;
660
693
  }
661
694
 
662
695
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button[aria-expanded='false'], .bf-side-navigation-expand[aria-expanded='false'])::before {
663
- transform: rotate(-90deg);
696
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
664
697
  }
665
698
 
666
699
  :where(.bf-theme) :where(.bf-side-navigation-expand) {
@@ -720,14 +753,34 @@ ${bodyTypeStyles} background: transparent;
720
753
  }
721
754
 
722
755
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
756
+ --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - 1rem - var(--bf-side-navigation-icon-gap)));
723
757
  align-items: baseline;
724
758
  column-gap: var(--bf-side-navigation-icon-gap);
725
759
  }
726
760
 
761
+ /* Icon navigation keeps one stable label edge. Rows may omit a decorative
762
+ icon without collapsing the shared icon track and pulling their copy left. */
763
+ :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 {
764
+ content: "";
765
+ flex: 0 0 1rem;
766
+ inline-size: 1rem;
767
+ }
768
+
769
+ /* A collapsed icon rail cannot communicate an iconless destination. Remove
770
+ the alignment spacer with the hidden label so it cannot become a blank
771
+ visual affordance in that state. */
772
+ :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 {
773
+ content: none;
774
+ }
775
+
727
776
  /* Icon-navigation headings share the label edge, not the icon edge. This
728
777
  keeps section names aligned with both the menu copy and a tagged wordmark. */
729
- :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked) {
730
- padding-inline-start: calc(var(--bf-panel-padding-inline) + 1rem + var(--bf-side-navigation-icon-gap));
778
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading:not(.is-linked)) {
779
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
780
+ }
781
+
782
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading.is-linked) > :where(.bf-side-navigation-link) {
783
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
731
784
  }
732
785
 
733
786
  :where(.bf-theme) :where(.bf-side-navigation-icon) > svg {
@@ -8,10 +8,10 @@
8
8
  * link/mark contract; the additional card slots are semantic link content,
9
9
  * not the deprecated `logo-block` API.
10
10
  *
11
- * Vanilla → BF mapping (Vanilla's 8px spacing unit):
11
+ * Vanilla → BF mapping (Vanilla's 0.5rem spacing unit):
12
12
  * - linked-logo image container: retained 16:9 aspect relationship;
13
- * - muted rule to copy: 8px → `--bf-space-1`, compensating its border;
14
- * - grid gutter: 24px / 32px breakpoint values → existing
13
+ * - muted rule to copy: 0.5rem → `--bf-space-1`, compensating its border;
14
+ * - grid gutter: 1.5rem / 2rem breakpoint values → existing
15
15
  * `--bf-grid-gap-inline` (BF's tier-aware grid geometry);
16
16
  * - macro section boundaries: existing shallow/default/deep section tokens.
17
17
  *
@@ -8,10 +8,10 @@
8
8
  * link/mark contract; the additional card slots are semantic link content,
9
9
  * not the deprecated `logo-block` API.
10
10
  *
11
- * Vanilla → BF mapping (Vanilla's 8px spacing unit):
11
+ * Vanilla → BF mapping (Vanilla's 0.5rem spacing unit):
12
12
  * - linked-logo image container: retained 16:9 aspect relationship;
13
- * - muted rule to copy: 8px → `--bf-space-1`, compensating its border;
14
- * - grid gutter: 24px / 32px breakpoint values → existing
13
+ * - muted rule to copy: 0.5rem → `--bf-space-1`, compensating its border;
14
+ * - grid gutter: 1.5rem / 2rem breakpoint values → existing
15
15
  * `--bf-grid-gap-inline` (BF's tier-aware grid geometry);
16
16
  * - macro section boundaries: existing shallow/default/deep section tokens.
17
17
  *
@@ -26,20 +26,13 @@ export function linkedLogoSiteLayoutCss() {
26
26
  :where(.bf-theme) :where(.bf-linked-logo-section) {
27
27
  container-name: bf-linked-logo-section;
28
28
  container-type: inline-size;
29
- margin-block-end: var(--bf-section-space);
29
+ margin: 0;
30
30
  min-inline-size: 0;
31
31
  }
32
32
 
33
- :where(.bf-theme) :where(.bf-linked-logo-section.is-shallow) {
34
- margin-block-end: var(--bf-section-space-shallow);
35
- }
36
-
37
- :where(.bf-theme) :where(.bf-linked-logo-section.is-deep) {
38
- margin-block-end: var(--bf-section-space-deep);
39
- }
40
-
41
33
  :where(.bf-theme) :where(.bf-linked-logo-section-layout) {
42
34
  display: grid;
35
+ gap: var(--bf-section-space-shallow);
43
36
  grid-template-columns: minmax(0, 1fr);
44
37
  min-inline-size: 0;
45
38
  }
@@ -72,7 +65,7 @@ export function linkedLogoSiteLayoutCss() {
72
65
  max-inline-size: none;
73
66
  }
74
67
 
75
- :where(.bf-theme) :where(.bf-linked-logo-section-card) {
68
+ :where(.bf-theme) :where(a.bf-linked-logo-section-card) {
76
69
  align-content: start;
77
70
  align-items: stretch;
78
71
  color: inherit;
@@ -84,7 +77,7 @@ export function linkedLogoSiteLayoutCss() {
84
77
  text-decoration: none;
85
78
  }
86
79
 
87
- :where(.bf-theme) :where(.bf-linked-logo-section-card:hover) :where(.bf-linked-logo-section-card-copy) {
80
+ :where(.bf-theme) :where(a.bf-linked-logo-section-card:hover) :where(.bf-linked-logo-section-card-copy) {
88
81
  text-decoration: underline;
89
82
  }
90
83
 
@@ -103,7 +96,7 @@ export function linkedLogoSiteLayoutCss() {
103
96
  of baselines tall. Keep the visual ratio exact and put only the residual
104
97
  rhythm compensation after the mark; the copy keeps its own semantic
105
98
  spacing and the occupied card still lands on the tier grid. */
106
- @supports (margin-block-end: round(up, 1px, 1px)) {
99
+ @supports (margin-block-end: round(up, 0.0625rem, 0.0625rem)) {
107
100
  :where(.bf-theme) :where(.bf-linked-logo-section-mark) {
108
101
  margin-block-end: calc(
109
102
  round(up, calc(100cqi * 9 / 16), var(--bf-baseline))
@@ -135,21 +128,25 @@ export function linkedLogoSiteLayoutCss() {
135
128
  overflow-wrap: anywhere;
136
129
  }
137
130
 
138
- /* Vanilla's linked-logo block moves from one to two cards per row at the
139
- 4-column medium grid. The section itself does not split until the 8-column
140
- large grid: its macro uses large-only grid columns for the 50/50 and 25/75
141
- rails. The root establishes the query context; only descendants change. */
131
+ /* The linked-logo block moves from one to two cards per row at the 4-column
132
+ medium grid. The balanced 50/50 section split uses the shared readable
133
+ threshold; the 25/75 content rail and four-card density retain their
134
+ separately measured wide threshold. The root establishes the query context;
135
+ only descendants change. */
142
136
  @container bf-linked-logo-section (width >= 38.75rem) {
143
137
  :where(.bf-theme) :where(.bf-linked-logo-section-logos) :where(.bf-logo-section-items) {
144
138
  grid-template-columns: repeat(2, minmax(0, 1fr));
145
139
  }
146
140
  }
147
141
 
148
- @container bf-linked-logo-section (width >= 64.75rem) {
142
+ @container bf-linked-logo-section (width >= 45rem) {
149
143
  :where(.bf-theme) :where(.bf-linked-logo-section.is-50-50) :where(.bf-linked-logo-section-layout) {
150
144
  column-gap: var(--bf-grid-gap-inline);
151
145
  grid-template-columns: repeat(2, minmax(0, 1fr));
152
146
  }
147
+ }
148
+
149
+ @container bf-linked-logo-section (width >= 64.75rem) {
153
150
 
154
151
  :where(.bf-theme) :where(.bf-linked-logo-section.is-25-75) :where(.bf-linked-logo-section-layout) {
155
152
  column-gap: var(--bf-grid-gap-inline);
@@ -3,7 +3,7 @@ export function listTreeCss(options) {
3
3
  return `:where(.bf-theme) :where(.bf-list-tree) {
4
4
  list-style: none;
5
5
  margin: 0;
6
- padding-left: calc(var(--bf-baseline) * 0.5);
6
+ padding-left: 0;
7
7
  }
8
8
 
9
9
  :where(.bf-theme) :where(.bf-list-tree) :where(.bf-list-tree) {
@@ -17,22 +17,24 @@ export function listTreeCss(options) {
17
17
  }
18
18
 
19
19
  :where(.bf-theme) :where(.bf-list-tree-item) {
20
+ display: grid;
20
21
  margin: 0;
21
- padding-left: calc(var(--bf-baseline) * 1.5);
22
+ padding-left: 0;
22
23
  position: relative;
23
24
  }
24
25
 
25
- :where(.bf-theme) :where(.bf-list-tree-link) {
26
+ :where(.bf-theme) :where(a.bf-list-tree-link) {
26
27
  ${bodyTypeStyles} color: var(--bf-color-text-default);
28
+ border-block: var(--bf-border-width) solid transparent;
27
29
  cursor: pointer;
28
30
  display: block;
29
- margin: 0;
30
- min-block-size: var(--bf-control-box-size-compact);
31
- padding-block: var(--bf-control-block-padding-compact);
31
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
32
+ padding-block: var(--bf-single-line-row-padding-block);
33
+ padding-inline: var(--bf-component-inline-inset-continuation) var(--bf-component-inline-inset-action);
32
34
  text-decoration: none;
33
35
  }
34
36
 
35
- :where(.bf-theme) :where(.bf-list-tree-link):hover {
37
+ :where(.bf-theme) :where(a.bf-list-tree-link:hover) {
36
38
  color: var(--bf-color-link-default);
37
39
  text-decoration: underline;
38
40
  }
@@ -46,22 +48,22 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
46
48
  }
47
49
 
48
50
  :where(.bf-theme) :where(.bf-list-tree-link):focus-visible {
49
- outline: 2px solid var(--bf-color-focus);
50
- outline-offset: -2px;
51
+ outline: 0.125rem solid var(--bf-color-focus);
52
+ outline-offset: -0.125rem;
51
53
  }
52
54
 
53
55
  :where(.bf-theme) :where(.bf-list-tree-toggle) {
54
56
  ${bodyTypeStyles} align-items: center;
55
57
  background: transparent;
56
58
  border: 0;
59
+ border-block: var(--bf-border-width) solid transparent;
57
60
  color: var(--bf-color-text-default);
58
61
  cursor: pointer;
59
- display: inline-flex;
60
- gap: calc(var(--bf-baseline) * 0.5);
61
- margin: 0 0 0 calc(var(--bf-baseline) * -1.5);
62
- min-block-size: var(--bf-control-box-size-compact);
63
- padding-block: var(--bf-control-block-padding-compact);
64
- padding-inline: calc(var(--bf-baseline) * 0.25) calc(var(--bf-baseline) * 0.5);
62
+ display: flex;
63
+ gap: var(--bf-disclosure-gap);
64
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
65
+ padding-block: var(--bf-single-line-row-padding-block);
66
+ padding-inline: 0 calc(var(--bf-baseline) * 0.5);
65
67
  text-align: left;
66
68
  width: 100%;
67
69
  }
@@ -75,8 +77,8 @@ ${bodyTypeStyles} align-items: center;
75
77
  }
76
78
 
77
79
  :where(.bf-theme) :where(.bf-list-tree-toggle):focus-visible {
78
- outline: 2px solid var(--bf-color-focus);
79
- outline-offset: -2px;
80
+ outline: 0.125rem solid var(--bf-color-focus);
81
+ outline-offset: -0.125rem;
80
82
  }
81
83
 
82
84
  :where(.bf-theme) :where(.bf-list-tree-toggle)::before {
@@ -88,11 +90,11 @@ ${bodyTypeStyles} align-items: center;
88
90
  content: "";
89
91
  flex: 0 0 1rem;
90
92
  inline-size: 1rem;
91
- transform: rotate(-90deg);
93
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
92
94
  }
93
95
 
94
96
  :where(.bf-theme) :where(.bf-list-tree-toggle[aria-expanded='true'])::before {
95
- transform: rotate(0deg);
97
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(0deg);
96
98
  }
97
99
  `;
98
100
  }
@@ -7,6 +7,10 @@ export function listCss({ bodyTypeStyles }) {
7
7
  padding: 0;
8
8
  }
9
9
 
10
+ :where(.bf-theme) :where(.bf-list:has(> .bf-list-item:is(.is-ticked, .is-crossed)), ol.bf-list.is-divided) {
11
+ padding-inline-start: var(--bf-leading-mark-group-inset);
12
+ }
13
+
10
14
  :where(.bf-theme) :where(.bf-list-item) {
11
15
  ${bodyTypeStyles} color: var(--bf-color-text-default);
12
16
  margin: 0 0 var(--bf-body-margin-bottom);
@@ -17,8 +21,10 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
17
21
  }
18
22
 
19
23
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item) {
20
- box-shadow: inset 0 1px 0 var(--bf-color-border-low-contrast);
21
- padding-block-end: var(--bf-baseline);
24
+ border-block: var(--bf-border-width) solid transparent;
25
+ box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-low-contrast);
26
+ margin-block-end: var(--bf-single-line-row-margin-block-end);
27
+ padding-block: var(--bf-single-line-row-padding-block);
22
28
  }
23
29
 
24
30
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item:first-child) {
@@ -26,7 +32,7 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
26
32
  }
27
33
 
28
34
  :where(.bf-theme) :where(.bf-list-item.is-ticked, .bf-list-item.is-crossed) {
29
- padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
35
+ padding-inline-start: var(--bf-leading-mark-offset);
30
36
  position: relative;
31
37
  }
32
38
 
@@ -51,10 +57,6 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
51
57
  background-image: var(--bf-ui-icon-error-grey);
52
58
  }
53
59
 
54
- :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item.is-ticked, .bf-list-item.is-crossed)::before {
55
- top: calc(var(--bf-leading-icon-offset) + (var(--bf-baseline) * 0.5));
56
- }
57
-
58
60
  :where(.bf-theme) :where(ol.bf-list.is-divided) {
59
61
  counter-reset: bf-list-counter;
60
62
  }
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * Vanilla parity ports: logo section and media object.
3
3
  *
4
- * Vanilla → BF rhythm mapping (at Vanilla's 8px unit):
5
- * - Logo mark heights 72px / 104px → `space-8 + space-1` / `space-12 +
4
+ * Vanilla → BF rhythm mapping (at Vanilla's 0.5rem unit):
5
+ * - Logo mark heights 4.5rem / 6.5rem → `space-8 + space-1` / `space-12 +
6
6
  * space-1` (nine / thirteen BF baselines).
7
- * - Logo 32px inline gap → `space-4`; Vanilla's 8px / 16px negative row pull
7
+ * - Logo 2rem inline gap → `space-4`; Vanilla's 0.5rem / 1rem negative row pull
8
8
  * and matching wrapper compensation → `space-1` / `space-2`.
9
- * - Media thumbnails 48px / 96px → `space-6` / `space-12`; their 16px
10
- * gap → `space-2`; trailing 24px → `section-space-shallow`; metadata top
11
- * 8px → `space-1`.
9
+ * - Media thumbnails 3rem / 6rem → `space-6` / `space-12`; their 1rem
10
+ * gap → `space-2`; trailing 1.5rem → `section-space-shallow`; metadata top
11
+ * 0.5rem → `space-1`.
12
12
  *
13
13
  * Those are relative values, rather than fixed pixels, so the same semantics
14
14
  * retain the deliberately denser documentation, app, and OS tiers.