baseline-foundry 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +17 -9
  2. package/config/experiments/ibm-plex-engine-smoke.json +1 -1
  3. package/config/experiments/ubuntu-engine-smoke.json +1 -1
  4. package/config/foundation-theme.json +1 -1
  5. package/config/tiers/app.json +6 -6
  6. package/config/tiers/documentation.json +2 -2
  7. package/config/tiers/editorial.json +1 -1
  8. package/config/tiers/os.json +6 -6
  9. package/dist/baseline-grid-overlay.js +2 -2
  10. package/dist/build.js +4 -4
  11. package/dist/code-snippet.js +1 -1
  12. package/dist/css-app-tier.js +16 -5
  13. package/dist/css-components/article-pagination.js +9 -8
  14. package/dist/css-components/button-actions.js +24 -4
  15. package/dist/css-components/cards-options.js +8 -8
  16. package/dist/css-components/chip-badge-status.d.ts +0 -3
  17. package/dist/css-components/chip-badge-status.js +57 -10
  18. package/dist/css-components/content-card.d.ts +7 -7
  19. package/dist/css-components/content-card.js +17 -16
  20. package/dist/css-components/control-row.d.ts +1 -1
  21. package/dist/css-components/control-row.js +1 -1
  22. package/dist/css-components/document-navigation.js +66 -29
  23. package/dist/css-components/editorial-content.js +1 -1
  24. package/dist/css-components/interactive-feedback.js +50 -28
  25. package/dist/css-components/interactive-tables.js +13 -8
  26. package/dist/css-components/legacy-navigation.d.ts +0 -1
  27. package/dist/css-components/legacy-navigation.js +108 -32
  28. package/dist/css-components/linked-logo-site-layout.d.ts +3 -3
  29. package/dist/css-components/linked-logo-site-layout.js +17 -20
  30. package/dist/css-components/list-tree.js +21 -19
  31. package/dist/css-components/list.js +9 -7
  32. package/dist/css-components/logo-media.d.ts +6 -6
  33. package/dist/css-components/logo-media.js +38 -27
  34. package/dist/css-components/navigation-layout.js +6 -8
  35. package/dist/css-components/panel.js +12 -12
  36. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  37. package/dist/css-components/search-box-and-filter.js +18 -19
  38. package/dist/css-components/sites-editorial-ports.d.ts +3 -4
  39. package/dist/css-components/sites-editorial-ports.js +61 -29
  40. package/dist/css-components/sites-foundation.js +15 -19
  41. package/dist/css-components/sites-rich-lists.d.ts +5 -5
  42. package/dist/css-components/sites-rich-lists.js +26 -36
  43. package/dist/css-components/static-content-ports.d.ts +3 -3
  44. package/dist/css-components/static-content-ports.js +51 -37
  45. package/dist/css-components/tab-section.d.ts +3 -3
  46. package/dist/css-components/tab-section.js +34 -26
  47. package/dist/css-components/table.js +4 -7
  48. package/dist/css-components/tabs-choice-breadcrumbs.js +25 -21
  49. package/dist/css-components/tiered-list-equal-height-row.js +10 -10
  50. package/dist/css-components.js +243 -124
  51. package/dist/css-grid.d.ts +1 -1
  52. package/dist/css-grid.js +18 -8
  53. package/dist/css.js +94 -18
  54. package/dist/experiments/ibm-plex-engine-smoke/styles.css +1005 -563
  55. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +2 -2
  56. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +1 -1
  57. package/dist/in-page-navigation.js +1 -1
  58. package/dist/presets/app-tier/styles.css +1046 -593
  59. package/dist/presets/app-tier/surfaces.json +17 -17
  60. package/dist/presets/app-tier/tokens.json +7 -7
  61. package/dist/presets/prose/styles.css +1036 -587
  62. package/dist/presets/prose/surfaces.json +17 -17
  63. package/dist/presets/prose/tokens.json +1 -1
  64. package/dist/resizable-aside.js +12 -4
  65. package/dist/styles.css +1036 -587
  66. package/dist/surfaces.json +17 -17
  67. package/dist/tiers/app/styles.css +1046 -593
  68. package/dist/tiers/app/surfaces.json +17 -17
  69. package/dist/tiers/app/tokens.json +7 -7
  70. package/dist/tiers/documentation/styles.css +1037 -588
  71. package/dist/tiers/documentation/surfaces.json +17 -17
  72. package/dist/tiers/documentation/tokens.json +2 -2
  73. package/dist/tiers/editorial/styles.css +1036 -587
  74. package/dist/tiers/editorial/surfaces.json +17 -17
  75. package/dist/tiers/editorial/tokens.json +1 -1
  76. package/dist/tiers/os/styles.css +1042 -593
  77. package/dist/tiers/os/surfaces.json +17 -17
  78. package/dist/tiers/os/tokens.json +7 -7
  79. package/dist/tokens.json +1 -1
  80. package/dist/types.d.ts +1 -1
  81. package/docs/publishing.md +1 -1
  82. package/package.json +2 -2
@@ -1,11 +1,54 @@
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;
14
+ --bf-side-navigation-heading-list-gap: 0.5rem;
4
15
  color: var(--bf-color-text-inactive);
5
16
  display: block;
6
17
  inline-size: 100%;
7
18
  }
8
19
 
20
+ :where(.bf-theme) :where(.bf-side-navigation-groups) {
21
+ align-content: start;
22
+ display: grid;
23
+ gap: var(--bf-side-navigation-group-gap);
24
+ }
25
+
26
+ :where(.bf-theme) :where(.bf-side-navigation-group) {
27
+ display: grid;
28
+ gap: var(--bf-side-navigation-heading-list-gap);
29
+ min-inline-size: 0;
30
+ }
31
+
32
+ /* Keep the divider and heading as one tight header. The group owns only the
33
+ larger transition from that header to its list, so the compensated rule
34
+ cannot change the heading/list phase. */
35
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) {
36
+ display: grid;
37
+ gap: 0rem;
38
+ min-inline-size: 0;
39
+ }
40
+
41
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) > hr {
42
+ inline-size: auto;
43
+ margin-inline: var(--bf-side-navigation-content-inset) 0;
44
+ }
45
+
46
+ /* A single-line group heading occupies four baselines. min-block-size keeps
47
+ that phase exact while still allowing a long heading to wrap and grow. */
48
+ :where(.bf-theme) :where(.bf-side-navigation-group-header) > :where(.bf-side-navigation-heading) {
49
+ min-block-size: calc((var(--bf-baseline) * 4) - var(--bf-body-margin-bottom));
50
+ }
51
+
9
52
  :where(.bf-theme) :where(.bf-side-navigation-drawer) {
10
53
  background: var(--bf-color-background-default);
11
54
  bottom: 0;
@@ -22,7 +65,7 @@ export function legacyNavigationCss(options) {
22
65
  }
23
66
 
24
67
  :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);
68
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
26
69
  transform: translateX(0);
27
70
  }
28
71
 
@@ -52,7 +95,7 @@ export function legacyNavigationCss(options) {
52
95
  border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
53
96
  margin-bottom: calc(var(--bf-baseline) * 2);
54
97
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
55
- padding-inline: var(--bf-panel-padding-inline);
98
+ padding-inline: var(--bf-component-inline-inset-continuation);
56
99
  padding-top: var(--bf-panel-padding-block);
57
100
  position: sticky;
58
101
  top: 0;
@@ -71,7 +114,7 @@ ${bodyTypeStyles} align-items: center;
71
114
  gap: calc(var(--bf-baseline) * 0.5);
72
115
  justify-content: center;
73
116
  margin: 0 0 ${buttonMarginBottom};
74
- ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
117
+ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action-bordered);
75
118
  text-decoration: none;
76
119
  }
77
120
 
@@ -106,52 +149,57 @@ ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action);
106
149
  }
107
150
 
108
151
  :where(.bf-theme) :where(.bf-side-navigation-toggle:focus-visible) {
109
- outline: 2px solid var(--bf-color-focus);
110
- outline-offset: -2px;
152
+ outline: 0.125rem solid var(--bf-color-focus);
153
+ outline-offset: -0.125rem;
111
154
  }
112
155
 
113
156
  :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked) {
114
157
  ${bodySemiboldTypeStyles} display: block;
115
158
  margin: 0 0 var(--bf-body-margin-bottom);
116
159
  padding-block: var(--bf-body-nudge-start) 0;
160
+ padding-inline: var(--bf-side-navigation-content-inset);
117
161
  }
118
162
 
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));
163
+ :where(.bf-theme) :where(.bf-side-navigation-heading.is-linked) {
164
+ padding-inline: 0;
124
165
  }
125
166
 
126
- :where(.bf-theme) :where(.bf-side-navigation-list:last-of-type) {
127
- border-bottom: 0;
128
- margin-bottom: 0;
129
- padding-bottom: 0;
167
+ :where(.bf-theme) :where(.bf-side-navigation-list) {
168
+ display: grid;
169
+ grid-auto-rows: var(--bf-single-line-row-block-size);
170
+ list-style: none;
171
+ margin: 0;
172
+ padding: 0;
130
173
  }
131
174
 
132
175
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) {
176
+ display: grid;
133
177
  margin: 0;
134
178
  position: relative;
135
179
  }
136
180
 
137
181
  :where(.bf-theme) :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
138
182
  ${bodyTypeStyles} align-items: center;
183
+ align-self: start;
139
184
  background: transparent;
140
185
  border: 0;
186
+ border-block: var(--bf-border-width) solid transparent;
141
187
  color: var(--bf-color-text-inactive);
142
188
  display: flex;
143
189
  gap: calc(var(--bf-baseline) * 0.5);
144
190
  inline-size: 100%;
145
191
  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);
192
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
193
+ padding-block: var(--bf-single-line-row-padding-block);
194
+ padding-inline: var(--bf-side-navigation-content-inset);
195
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-content-inset);
149
196
  position: relative;
150
197
  text-align: left;
151
198
  text-decoration: none;
152
199
  }
153
200
 
154
201
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button) {
202
+ --bf-side-navigation-row-inset: var(--bf-side-navigation-disclosure-inset);
155
203
  gap: var(--bf-disclosure-gap);
156
204
  }
157
205
 
@@ -160,22 +208,21 @@ ${compactButtonPadding} padding-inline: var(--bf-panel-padding-inline);
160
208
  font-weight: 600;
161
209
  }
162
210
 
163
- :where(.bf-theme) :where(.bf-side-navigation-heading, .bf-side-navigation-heading.is-linked),
164
211
  :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);
212
+ padding-inline-start: var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset));
166
213
  }
167
214
 
168
215
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
169
216
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
170
217
  > :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));
218
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + var(--bf-side-navigation-depth-step));
172
219
  }
173
220
 
174
221
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
175
222
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
176
223
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
177
224
  > :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));
225
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 2));
179
226
  }
180
227
 
181
228
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
@@ -183,7 +230,7 @@ ${compactButtonPadding} padding-inline: var(--bf-panel-padding-inline);
183
230
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
184
231
  :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title)
185
232
  > :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));
233
+ padding-inline-start: calc(var(--bf-side-navigation-row-inset, var(--bf-side-navigation-content-inset)) + (var(--bf-side-navigation-depth-step) * 3));
187
234
  }
188
235
 
189
236
  :where(.bf-theme) :where(.bf-side-navigation-link:hover, .bf-side-navigation-accordion-button:hover) {
@@ -192,13 +239,17 @@ ${compactButtonPadding} padding-inline: var(--bf-panel-padding-inline);
192
239
  text-decoration: none;
193
240
  }
194
241
 
242
+ :where(.bf-theme) :where(a.bf-side-navigation-link:is(:hover, :active)) {
243
+ text-decoration: none;
244
+ }
245
+
195
246
  :where(.bf-theme) :where(.bf-side-navigation-link:focus:not(:focus-visible), .bf-side-navigation-accordion-button:focus:not(:focus-visible)) {
196
247
  outline: none;
197
248
  }
198
249
 
199
250
  :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;
251
+ outline: 0.125rem solid var(--bf-color-focus);
252
+ outline-offset: -0.125rem;
202
253
  }
203
254
 
204
255
  :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 +410,17 @@ ${bodyTypeStyles} align-items: center;
359
410
  text-decoration: none;
360
411
  }
361
412
 
413
+ :where(.bf-theme) :where(a.bf-top-navigation-link:is(:hover, :active)) {
414
+ text-decoration: none;
415
+ }
416
+
362
417
  :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
418
  outline: none;
364
419
  }
365
420
 
366
421
  :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;
422
+ outline: 0.125rem solid var(--bf-color-focus);
423
+ outline-offset: -0.125rem;
369
424
  }
370
425
 
371
426
  :where(.bf-theme) :where(.bf-top-navigation-item.is-selected) > :where(.bf-top-navigation-link),
@@ -484,8 +539,8 @@ ${bodyTypeStyles} align-items: center;
484
539
  }
485
540
 
486
541
  :where(.bf-theme) :where(.bf-top-navigation-dropdown-item:focus-visible) {
487
- outline: 2px solid var(--bf-color-focus);
488
- outline-offset: -2px;
542
+ outline: 0.125rem solid var(--bf-color-focus);
543
+ outline-offset: -0.125rem;
489
544
  }
490
545
 
491
546
  :where(.bf-theme) :where(.bf-top-navigation-search-label) {
@@ -656,11 +711,12 @@ ${bodyTypeStyles} align-items: center;
656
711
  content: "";
657
712
  flex: 0 0 var(--bf-disclosure-icon-inline-size);
658
713
  inline-size: var(--bf-disclosure-icon-inline-size);
714
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block));
659
715
  transition: transform 120ms ease;
660
716
  }
661
717
 
662
718
  :where(.bf-theme) :where(.bf-side-navigation-accordion-button[aria-expanded='false'], .bf-side-navigation-expand[aria-expanded='false'])::before {
663
- transform: rotate(-90deg);
719
+ transform: translateY(var(--bf-disclosure-icon-optical-offset-block)) rotate(-90deg);
664
720
  }
665
721
 
666
722
  :where(.bf-theme) :where(.bf-side-navigation-expand) {
@@ -720,14 +776,34 @@ ${bodyTypeStyles} background: transparent;
720
776
  }
721
777
 
722
778
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
779
+ --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - 1rem - var(--bf-side-navigation-icon-gap)));
723
780
  align-items: baseline;
724
781
  column-gap: var(--bf-side-navigation-icon-gap);
725
782
  }
726
783
 
784
+ /* Icon navigation keeps one stable label edge. Rows may omit a decorative
785
+ icon without collapsing the shared icon track and pulling their copy left. */
786
+ :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 {
787
+ content: "";
788
+ flex: 0 0 1rem;
789
+ inline-size: 1rem;
790
+ }
791
+
792
+ /* A collapsed icon rail cannot communicate an iconless destination. Remove
793
+ the alignment spacer with the hidden label so it cannot become a blank
794
+ visual affordance in that state. */
795
+ :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 {
796
+ content: none;
797
+ }
798
+
727
799
  /* Icon-navigation headings share the label edge, not the icon edge. This
728
800
  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));
801
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading:not(.is-linked)) {
802
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
803
+ }
804
+
805
+ :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-heading.is-linked) > :where(.bf-side-navigation-link) {
806
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
731
807
  }
732
808
 
733
809
  :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.