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,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.
@@ -21,7 +21,7 @@ export function logoMediaCss() {
21
21
  :where(.bf-theme) :where(.bf-logo-section) {
22
22
  container-name: bf-logo-section;
23
23
  container-type: inline-size;
24
- margin-block-end: var(--bf-section-space-shallow);
24
+ margin: 0;
25
25
  min-inline-size: 0;
26
26
  }
27
27
 
@@ -55,8 +55,8 @@ export function logoMediaCss() {
55
55
  }
56
56
 
57
57
  :where(.bf-theme) :where(.bf-logo-section-link:focus-visible) {
58
- outline: 2px solid var(--bf-color-focus);
59
- outline-offset: 2px;
58
+ outline: 0.125rem solid var(--bf-color-focus);
59
+ outline-offset: 0.125rem;
60
60
  }
61
61
 
62
62
  :where(.bf-theme) :where(.bf-logo-section-logo) {
@@ -83,7 +83,7 @@ export function logoMediaCss() {
83
83
  inline-size: 100%;
84
84
  }
85
85
 
86
- /* Vanilla's small breakpoint is 620px. The items descendant, rather than the
86
+ /* Vanilla's small breakpoint is 38.75rem. The items descendant, rather than the
87
87
  query container itself, responds when its allocated space reaches it. */
88
88
  @container bf-logo-section (width >= 38.75rem) {
89
89
  :where(.bf-theme) :where(.bf-logo-section-items) {
@@ -107,19 +107,21 @@ export function logoMediaCss() {
107
107
 
108
108
  /* ------------------------------------------------------------------ */
109
109
  /* Media object — semantic media/content slots with a container-owned */
110
- /* structural collapse only. Content roles retain their own spacing. */
110
+ /* structural collapse. Content roles retain their metric boxes. */
111
111
  /* ------------------------------------------------------------------ */
112
112
 
113
113
  :where(.bf-theme) :where(.bf-media-object) {
114
- margin-block-end: var(--bf-section-space-shallow);
114
+ container-name: bf-media-object;
115
+ container-type: inline-size;
116
+ margin: 0;
115
117
  min-inline-size: 0;
116
118
  }
117
119
 
118
120
  :where(.bf-theme) :where(.bf-media-object-layout) {
119
- display: grid;
120
121
  align-items: start;
121
- column-gap: var(--bf-space-2);
122
- grid-template-columns: auto minmax(0, 1fr);
122
+ column-gap: var(--bf-grid-gap-inline);
123
+ display: grid;
124
+ grid-template-columns: repeat(4, minmax(0, 1fr));
123
125
  min-inline-size: 0;
124
126
  }
125
127
 
@@ -131,6 +133,10 @@ export function logoMediaCss() {
131
133
  min-inline-size: 0;
132
134
  }
133
135
 
136
+ :where(.bf-theme) :where(.bf-media-object-media) {
137
+ grid-column: 1 / span 2;
138
+ }
139
+
134
140
  :where(.bf-theme) :where(.bf-media-object-media > :where(img, picture, svg, video)) {
135
141
  block-size: 100%;
136
142
  display: block;
@@ -145,6 +151,7 @@ export function logoMediaCss() {
145
151
  }
146
152
 
147
153
  :where(.bf-theme) :where(.bf-media-object-content) {
154
+ grid-column: 3 / -1;
148
155
  min-inline-size: 0;
149
156
  overflow-wrap: anywhere;
150
157
  }
@@ -184,8 +191,12 @@ export function logoMediaCss() {
184
191
  }
185
192
 
186
193
  :where(.bf-theme) :where(.bf-media-object-meta-list) {
194
+ --bf-stack-space: var(--bf-space-1);
195
+ align-content: start;
196
+ display: grid;
197
+ gap: var(--bf-stack-space);
187
198
  list-style: none;
188
- margin: var(--bf-space-1) 0 0;
199
+ margin: 0;
189
200
  padding: 0;
190
201
  }
191
202
 
@@ -198,22 +209,22 @@ export function logoMediaCss() {
198
209
  overflow-wrap: anywhere;
199
210
  }
200
211
 
201
- :where(.bf-theme) :where(.bf-media-object-meta + .bf-media-object-meta) {
202
- margin-block-start: var(--bf-space-1);
203
- }
204
-
205
212
  :where(.bf-theme) :where(.bf-media-object-meta .bf-icon) {
206
213
  margin-block-start: var(--bf-body-nudge-start);
207
214
  }
208
215
 
209
- :where(.bf-theme) :where(.bf-media-object.is-media-end) :where(.bf-media-object-content) {
210
- grid-column: 1;
211
- grid-row: 1;
212
- }
216
+ @container bf-media-object (width >= 38.75rem) {
217
+ :where(.bf-theme) :where(.bf-media-object-layout) {
218
+ grid-template-columns: repeat(8, minmax(0, 1fr));
219
+ }
213
220
 
214
- :where(.bf-theme) :where(.bf-media-object.is-media-end) :where(.bf-media-object-media) {
215
- grid-column: 2;
216
- grid-row: 1;
221
+ :where(.bf-theme) :where(.bf-media-object-media) {
222
+ grid-column: 1 / span 2;
223
+ }
224
+
225
+ :where(.bf-theme) :where(.bf-media-object-content) {
226
+ grid-column: 3 / -1;
227
+ }
217
228
  }
218
229
  `;
219
230
  }
@@ -14,8 +14,8 @@ export function navigationLayoutCss() {
14
14
  }
15
15
 
16
16
  /* The tagged treatment is opt-in. The Circle of Friends is aligned to the
17
- * first title line, then the 38px tag extends upward to the navigation edge.
18
- * Its 22px inline size preserves the established 38:22 (~1.73) tag ratio; the
17
+ * first title line, then the 2.375rem tag extends upward to the navigation edge.
18
+ * Its 1.375rem inline size preserves the established 38:22 (~1.73) tag ratio; the
19
19
  * tag must not stretch to the full occupied navigation row. */
20
20
  :where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) {
21
21
  min-inline-size: 0;
@@ -69,13 +69,11 @@ export function navigationLayoutCss() {
69
69
  line-height: var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5));
70
70
  overflow: visible;
71
71
  overflow-wrap: anywhere;
72
- /* The first title line and the 16px mark share the mark's fixed centre:
73
- * tag block-end minus the 6px inset minus half the mark. Symmetric title
74
- * padding keeps the occupied row stable across all four type-density tiers. */
72
+ /* The first title line and the 1rem mark share the public brand-line centre.
73
+ * The derived brand block is twice that fixed centre, so the orange tag can
74
+ * extend upward without changing the title or adjacent-header baseline. */
75
75
  padding-block: calc(
76
- var(--bf-top-navigation-logo-tag-block-size)
77
- - var(--bf-top-navigation-logo-icon-bottom-offset)
78
- - (var(--bf-top-navigation-logo-icon-size) / 2)
76
+ var(--bf-navigation-brand-line-center-block)
79
77
  - (var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5rem)) / 2)
80
78
  );
81
79
  text-overflow: clip;
@@ -1,6 +1,7 @@
1
1
  export function panelCss(options) {
2
2
  const { bodyTypeStyles, h4TypeStyles } = options;
3
3
  return `:where(.bf-theme) :where(.bf-panel) {
4
+ --bf-panel-content-padding-inline: var(--bf-component-inline-inset-continuation);
4
5
  background: var(--bf-color-background-default);
5
6
  color: var(--bf-color-text-default);
6
7
  display: flex;
@@ -23,6 +24,9 @@ export function panelCss(options) {
23
24
  overscroll-behavior: contain;
24
25
  }
25
26
 
27
+ /* Panel chrome and content consume the live page-grid gutter through a local
28
+ * derived property, so their internal text rails follow the same
29
+ * viewport brackets as surrounding page content. */
26
30
  :where(.bf-theme) :where(.bf-panel-header) {
27
31
  align-items: start;
28
32
  display: flex;
@@ -31,7 +35,7 @@ export function panelCss(options) {
31
35
  justify-content: space-between;
32
36
  padding-block-end: var(--bf-panel-padding-block);
33
37
  padding-block-start: var(--bf-panel-padding-block);
34
- padding-inline: var(--bf-panel-padding-inline);
38
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
35
39
  }
36
40
 
37
41
  /* A navigation brand keeps the Canonical tag attached to the panel's top edge
@@ -41,17 +45,13 @@ export function panelCss(options) {
41
45
  gap: 0;
42
46
  padding-block: 0;
43
47
  padding-inline-end: 0;
44
- padding-inline-start: var(--bf-panel-padding-inline);
48
+ padding-inline-start: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
45
49
  }
46
50
 
47
51
  :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
48
52
  inline-size: 100%;
49
53
  }
50
54
 
51
- :where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) :where(.bf-top-navigation-logo-title) {
52
- transform: translateY(var(--bf-navigation-brand-title-optical-offset-block));
53
- }
54
-
55
55
  :where(.bf-theme) :where(.bf-panel-header) > :where(.bf-panel-title) {
56
56
  min-inline-size: 0;
57
57
  }
@@ -72,10 +72,10 @@ export function panelCss(options) {
72
72
  flex-wrap: wrap;
73
73
  gap: var(--bf-field-gap);
74
74
  justify-content: space-between;
75
- min-block-size: calc(var(--bf-control-box-size-compact) + (var(--bf-panel-padding-block) * 2));
75
+ min-block-size: calc(var(--bf-control-box-size-compact) + var(--bf-panel-padding-block));
76
76
  padding-block-end: var(--bf-panel-padding-block);
77
- padding-block-start: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
78
- padding-inline: var(--bf-panel-padding-inline);
77
+ padding-block-start: 0;
78
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
79
79
  }
80
80
 
81
81
  :where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
@@ -127,8 +127,8 @@ ${bodyTypeStyles} align-items: center;
127
127
  }
128
128
 
129
129
  :where(.bf-theme) :where(.bf-panel-toggle:focus-visible) {
130
- outline: 2px solid var(--bf-color-focus);
131
- outline-offset: 2px;
130
+ outline: 0.125rem solid var(--bf-color-focus);
131
+ outline-offset: 0.125rem;
132
132
  }
133
133
 
134
134
  :where(.bf-theme) :where(.bf-panel-content) {
@@ -136,7 +136,7 @@ ${bodyTypeStyles} align-items: center;
136
136
  min-block-size: 0;
137
137
  padding-block-end: var(--bf-panel-padding-block);
138
138
  padding-block-start: var(--bf-panel-padding-block);
139
- padding-inline: var(--bf-panel-padding-inline);
139
+ padding-inline: var(--bf-panel-content-padding-inline, var(--bf-panel-padding-inline));
140
140
  }
141
141
 
142
142
  :where(.bf-theme) :where(.bf-panel-content.is-flush) {
@@ -2,7 +2,6 @@ type SearchBoxAndFilterCssOptions = {
2
2
  bodySelectedStartNudge: string;
3
3
  bodyTypeStyles: string;
4
4
  buttonBlockPaddingVar: string;
5
- h6TypeStyles: string;
6
5
  inputMarginBottom: string;
7
6
  };
8
7
  export declare function searchBoxAndFilterCss(options: SearchBoxAndFilterCssOptions): string;
@@ -1,7 +1,7 @@
1
1
  export function searchBoxAndFilterCss(options) {
2
- const { bodySelectedStartNudge, bodyTypeStyles, buttonBlockPaddingVar, h6TypeStyles, inputMarginBottom, } = options;
2
+ const { bodySelectedStartNudge, bodyTypeStyles, buttonBlockPaddingVar, inputMarginBottom, } = options;
3
3
  return `:where(.bf-theme) :where(.bf-search-box) {
4
- --bf-search-box-action-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
4
+ --bf-search-box-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
5
5
  --bf-search-box-trailing-inline-size: calc((var(--bf-search-box-action-inline-size) * 2) + var(--bf-border-width));
6
6
  display: flex;
7
7
  inline-size: 100%;
@@ -18,12 +18,12 @@ export function searchBoxAndFilterCss(options) {
18
18
 
19
19
  :where(.bf-theme) :where(.bf-search-box-reset, .bf-search-box-button) {
20
20
  align-items: center;
21
- block-size: var(--bf-control-box-size);
21
+ block-size: auto;
22
22
  display: inline-flex;
23
23
  inline-size: var(--bf-search-box-action-inline-size);
24
+ inset-block: 0;
24
25
  justify-content: center;
25
26
  position: absolute;
26
- top: 0;
27
27
  }
28
28
 
29
29
  :where(.bf-theme) :where(.bf-search-box-reset) {
@@ -40,7 +40,7 @@ export function searchBoxAndFilterCss(options) {
40
40
  inset-inline-end: var(--bf-border-width);
41
41
  margin: 0;
42
42
  padding: 0;
43
- text-indent: -9999px;
43
+ text-indent: -624.9375rem;
44
44
  }
45
45
 
46
46
  :where(.bf-theme) :where(.bf-search-box-button)::before {
@@ -67,8 +67,8 @@ export function searchBoxAndFilterCss(options) {
67
67
  }
68
68
 
69
69
  :where(.bf-theme) :where(.bf-search-box-reset:focus-visible, .bf-search-box-button:focus-visible) {
70
- outline: 2px solid var(--bf-color-focus);
71
- outline-offset: -2px;
70
+ outline: 0.125rem solid var(--bf-color-focus);
71
+ outline-offset: -0.125rem;
72
72
  }
73
73
 
74
74
  :where(.bf-theme) :where(.bf-search-and-filter) {
@@ -83,7 +83,7 @@ export function searchBoxAndFilterCss(options) {
83
83
  :where(.bf-theme) :where(.bf-search-and-filter-search-container) {
84
84
  align-items: stretch;
85
85
  background: transparent;
86
- box-shadow: inset 0 -1px 0 var(--bf-color-border-high-contrast);
86
+ box-shadow: inset 0 -0.0625rem 0 var(--bf-color-border-high-contrast);
87
87
  display: flex;
88
88
  flex-wrap: wrap;
89
89
  gap: var(--bf-field-gap);
@@ -99,7 +99,7 @@ export function searchBoxAndFilterCss(options) {
99
99
  }
100
100
 
101
101
  :where(.bf-theme) :where(.bf-search-and-filter-box) {
102
- --bf-search-and-filter-action-inline-size: calc(1rem + (var(--bf-control-inline-padding-field) * 2));
102
+ --bf-search-and-filter-action-inline-size: calc(1rem + (var(--bf-component-inline-inset-field) * 2));
103
103
  --bf-search-and-filter-trailing-inline-size: calc(var(--bf-search-and-filter-action-inline-size) * 2);
104
104
  display: inline-flex;
105
105
  flex: 1 1 12rem;
@@ -116,17 +116,17 @@ export function searchBoxAndFilterCss(options) {
116
116
  :where(.bf-theme) :where(.bf-search-and-filter-search-button) {
117
117
  appearance: none;
118
118
  background: transparent;
119
- block-size: var(--bf-control-box-size);
119
+ block-size: auto;
120
120
  border: 0;
121
121
  color: var(--bf-color-text-default);
122
122
  cursor: pointer;
123
123
  inline-size: var(--bf-search-and-filter-action-inline-size);
124
+ inset-block: 0;
124
125
  inset-inline-end: 0;
125
126
  margin: 0;
126
127
  padding: 0;
127
128
  position: absolute;
128
- text-indent: -9999px;
129
- top: 0;
129
+ text-indent: -624.9375rem;
130
130
  }
131
131
 
132
132
  :where(.bf-theme) :where(.bf-search-and-filter-search-button)::before {
@@ -153,16 +153,16 @@ export function searchBoxAndFilterCss(options) {
153
153
  }
154
154
 
155
155
  :where(.bf-theme) :where(.bf-search-and-filter-search-button:focus-visible, .bf-search-and-filter-selected-count:focus-visible) {
156
- outline: 2px solid var(--bf-color-focus);
157
- outline-offset: -2px;
156
+ outline: 0.125rem solid var(--bf-color-focus);
157
+ outline-offset: -0.125rem;
158
158
  }
159
159
 
160
160
  :where(.bf-theme) :where(.bf-search-and-filter-clear) {
161
- block-size: var(--bf-control-box-size);
161
+ block-size: auto;
162
162
  inline-size: var(--bf-search-and-filter-action-inline-size);
163
+ inset-block: 0;
163
164
  inset-inline-end: var(--bf-search-and-filter-action-inline-size);
164
165
  position: absolute;
165
- top: 0;
166
166
  }
167
167
 
168
168
  :where(.bf-theme) :where(.bf-search-and-filter-selected-count) {
@@ -187,12 +187,12 @@ ${bodyTypeStyles} appearance: none;
187
187
  background-color: var(--bf-color-background-inputs);
188
188
  border: var(--bf-border-width) solid var(--bf-color-border-default);
189
189
  border-top: 0;
190
- box-shadow: 0 24px 72px rgba(0, 0, 0, 0.38);
190
+ box-shadow: 0 1.5rem 4.5rem rgba(0, 0, 0, 0.38);
191
191
  display: grid;
192
192
  gap: var(--bf-field-gap);
193
193
  opacity: 1;
194
194
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
195
- padding-inline: var(--bf-panel-padding-inline);
195
+ padding-inline: var(--bf-component-inline-inset-continuation);
196
196
  padding-top: var(--bf-panel-padding-block);
197
197
  position: absolute;
198
198
  top: 100%;
@@ -237,7 +237,6 @@ ${bodyTypeStyles} appearance: none;
237
237
  }
238
238
 
239
239
  :where(.bf-theme) :where(.bf-filter-panel-section-heading) {
240
- ${h6TypeStyles} color: var(--bf-color-text-muted);
241
240
  margin: 0;
242
241
  padding-block: 0;
243
242
  }
@@ -7,10 +7,9 @@
7
7
  *
8
8
  * Vanilla → BF spacing mapping:
9
9
  * - Hero's `$spv--large` / `$spv--x-large` top boundary → `space-2` /
10
- * `space-3`; `$spv--strip-regular / 2` / full strip bottom boundary →
11
- * half `section-space` / full `section-space`.
12
- * - The 50/50, 25/75 and 75/25 grid relationships use BF's intrinsic grid
13
- * and gutter token at Vanilla's 620px / 1036px composition thresholds.
10
+ * `space-3`; the surrounding stack owns the section exit.
11
+ * - The default 50/50 relationship remains viable from a measured 45rem
12
+ * allocation; explicit 25/75 and 75/25 variants retain their own thresholds.
14
13
  * - Quote-wrapper's signpost/content and quote/citation relationships use
15
14
  * the same 25/75 and 2/1 proportions. A quotation itself remains the
16
15
  * existing semantic BF prose `blockquote`; it is not recreated as a
@@ -7,10 +7,9 @@
7
7
  *
8
8
  * Vanilla → BF spacing mapping:
9
9
  * - Hero's `$spv--large` / `$spv--x-large` top boundary → `space-2` /
10
- * `space-3`; `$spv--strip-regular / 2` / full strip bottom boundary →
11
- * half `section-space` / full `section-space`.
12
- * - The 50/50, 25/75 and 75/25 grid relationships use BF's intrinsic grid
13
- * and gutter token at Vanilla's 620px / 1036px composition thresholds.
10
+ * `space-3`; the surrounding stack owns the section exit.
11
+ * - The default 50/50 relationship remains viable from a measured 45rem
12
+ * allocation; explicit 25/75 and 75/25 variants retain their own thresholds.
14
13
  * - Quote-wrapper's signpost/content and quote/citation relationships use
15
14
  * the same 25/75 and 2/1 proportions. A quotation itself remains the
16
15
  * existing semantic BF prose `blockquote`; it is not recreated as a
@@ -23,15 +22,15 @@ export function sitesEditorialPortsCss() {
23
22
  /* semantic gaps and every text child keeps metric compensation. */
24
23
  /* ------------------------------------------------------------------ */
25
24
 
26
- /* Hero: its deliberately asymmetric boundary mirrors the current Vanilla
27
- section--hero: a compact arrival space, then the normal section exit. The
28
- entry rule replaces one pixel of padding so it never changes the rhythm. */
25
+ /* Hero: the compact arrival space belongs inside its entry rule. The outer
26
+ stack owns the section exit, and the rule replaces one pixel of padding so
27
+ it never changes the rhythm. */
29
28
  :where(.bf-theme) :where(.bf-hero) {
30
29
  border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
31
30
  container-name: bf-hero;
32
31
  container-type: inline-size;
33
32
  min-inline-size: 0;
34
- padding-block-end: calc(var(--bf-section-space) / 2);
33
+ padding-block-end: 0;
35
34
  padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
36
35
  }
37
36
 
@@ -44,6 +43,7 @@ export function sitesEditorialPortsCss() {
44
43
 
45
44
  :where(.bf-theme) :where(.bf-hero-layout) {
46
45
  display: grid;
46
+ gap: var(--bf-section-space-shallow);
47
47
  grid-template-columns: minmax(0, 1fr);
48
48
  min-inline-size: 0;
49
49
  }
@@ -53,9 +53,9 @@ export function sitesEditorialPortsCss() {
53
53
  overflow-wrap: anywhere;
54
54
  }
55
55
 
56
- /* The normal hero keeps title, supporting heading, chip, prose and CTA in a
57
- semantic copy stack. Hero titles are h1 slots and supporting titles are h2
58
- slots. */
56
+ /* Legacy copy slots remain valid for signpost variants. The default arrival
57
+ composition separates a title area from its supporting content area, and
58
+ the demo composes each area with the public stack density modifiers. */
59
59
  :where(.bf-theme) :where(.bf-hero-copy) {
60
60
  align-content: start;
61
61
  display: grid;
@@ -82,7 +82,7 @@ export function sitesEditorialPortsCss() {
82
82
  allocated a fluid grid track. Snap only the media block to the active tier
83
83
  baseline so the following semantic text remains on-grid; its inline track
84
84
  and the surrounding Vanilla proportions remain unchanged. */
85
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
85
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
86
86
  :where(.bf-theme) :where(.bf-hero-media > .bf-aspect, .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
87
87
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
88
88
  }
@@ -105,14 +105,10 @@ export function sitesEditorialPortsCss() {
105
105
  inline-size: 100%;
106
106
  }
107
107
 
108
- /* Vanilla's desktop hero boundary is 1036px. The layout descendant responds
109
- to the root container so embedding it in a narrower rail still collapses
110
- correctly. */
111
- /* The section boundary itself follows Vanilla's page-level desktop switch;
112
- the composition below continues to react to the allocated container. */
108
+ /* The section boundary follows the page-level desktop switch, while the
109
+ two-column composition uses its measured intrinsic allocation below. */
113
110
  @media (width >= 64.75rem) {
114
111
  :where(.bf-theme) :where(.bf-hero) {
115
- padding-block-end: var(--bf-section-space);
116
112
  padding-block-start: calc(var(--bf-space-3) - var(--bf-border-width));
117
113
  }
118
114
 
@@ -121,7 +117,7 @@ export function sitesEditorialPortsCss() {
121
117
  }
122
118
  }
123
119
 
124
- @container bf-hero (width >= 64.75rem) {
120
+ @container bf-hero (width >= 45rem) {
125
121
  :where(.bf-theme) :where(.bf-hero-layout) {
126
122
  column-gap: var(--bf-grid-gap-inline);
127
123
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -141,9 +137,10 @@ export function sitesEditorialPortsCss() {
141
137
  }
142
138
  }
143
139
 
144
- /* Vanilla can intentionally split the three proportioned layouts at its
145
- medium threshold. The modifier changes only structural tracks. */
146
- @container bf-hero (width >= 38.75rem) {
140
+ /* The named variants retain their proportion but share the readable split
141
+ threshold with the default hero. The modifier changes only structural
142
+ tracks; it does not introduce an earlier cramped layout. */
143
+ @container bf-hero (width >= 45rem) {
147
144
  :where(.bf-theme) :where(.bf-hero.is-split-medium) :where(.bf-hero-layout) {
148
145
  column-gap: var(--bf-grid-gap-inline);
149
146
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -163,14 +160,10 @@ export function sitesEditorialPortsCss() {
163
160
  :where(.bf-theme) :where(.bf-quote-wrapper) {
164
161
  container-name: bf-quote-wrapper;
165
162
  container-type: inline-size;
166
- margin-block-end: var(--bf-section-space);
163
+ margin: 0;
167
164
  min-inline-size: 0;
168
165
  }
169
166
 
170
- :where(.bf-theme) :where(.bf-quote-wrapper.is-shallow) {
171
- margin-block-end: var(--bf-section-space-shallow);
172
- }
173
-
174
167
  :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) {
175
168
  min-inline-size: 0;
176
169
  overflow-wrap: anywhere;
@@ -217,7 +210,7 @@ export function sitesEditorialPortsCss() {
217
210
  /* The quote rail can also be a fractional grid track. Keep its media from
218
211
  introducing a sub-baseline row while leaving quotation and citation rhythm
219
212
  entirely baseline-compensated while its stack owns semantic gaps. */
220
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
213
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
221
214
  :where(.bf-theme) :where(.bf-quote-wrapper-signpost > :where(img, picture, svg), .bf-quote-wrapper-media > .bf-aspect) {
222
215
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
223
216
  }
@@ -256,8 +249,47 @@ export function sitesEditorialPortsCss() {
256
249
  }
257
250
 
258
251
  @container bf-quote-wrapper (width >= 64.75rem) {
252
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) {
253
+ grid-template-columns: repeat(8, minmax(0, 1fr));
254
+ }
255
+
256
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) > :first-child {
257
+ grid-column: 1 / span 6;
258
+ }
259
+
260
+ :where(.bf-theme) :where(.bf-quote-wrapper-header-link) {
261
+ grid-column: 7 / -1;
262
+ }
263
+
264
+ :where(.bf-theme) :where(.bf-quote-wrapper-layout) {
265
+ grid-template-columns: repeat(8, minmax(0, 1fr));
266
+ }
267
+
268
+ :where(.bf-theme) :where(.bf-quote-wrapper-signpost) {
269
+ grid-column: 1 / span 2;
270
+ }
271
+
272
+ :where(.bf-theme) :where(.bf-quote-wrapper-content, .bf-quote-wrapper-content:only-child) {
273
+ display: grid;
274
+ grid-column: 3 / -1;
275
+ grid-template-columns: subgrid;
276
+ }
277
+
259
278
  :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
260
- grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
279
+ grid-column: 1 / -1;
280
+ grid-template-columns: subgrid;
281
+ }
282
+
283
+ :where(.bf-theme) :where(.bf-quote-wrapper-prose) {
284
+ grid-column: 1 / span 4;
285
+ }
286
+
287
+ :where(.bf-theme) :where(.bf-quote-wrapper-citation) {
288
+ grid-column: 5 / -1;
289
+ }
290
+
291
+ :where(.bf-theme) :where(.bf-quote-wrapper-content) > :where(.bf-cta-block, .bf-quote-wrapper-media) {
292
+ grid-column: 1 / -1;
261
293
  }
262
294
  }
263
295
  `;
@@ -55,35 +55,27 @@ export function sitesFoundationCss() {
55
55
  }
56
56
 
57
57
  /* A section title may be the route action without looking like body copy. */
58
- :where(.bf-theme) :where(.bf-basic-section-title-link, .bf-basic-section-title-link:visited) {
58
+ :where(.bf-theme) :where(a.bf-basic-section-title-link, a.bf-basic-section-title-link:visited) {
59
59
  color: var(--bf-color-link-default);
60
60
  text-decoration: none;
61
61
  }
62
62
 
63
- :where(.bf-theme) :where(.bf-basic-section-title-link:hover) {
63
+ :where(.bf-theme) :where(a.bf-basic-section-title-link:hover) {
64
64
  text-decoration: underline;
65
65
  text-decoration-thickness: var(--bf-border-width);
66
66
  text-underline-offset: 0.12em;
67
67
  }
68
68
 
69
- /* Vanilla splits at medium only on request, otherwise at its large breakpoint.
70
- The layout descendant reacts to the root container; the query never tries to
69
+ /* A balanced section switches at the shared readable 50/50 threshold. The
70
+ layout descendant reacts to the root container; the query never tries to
71
71
  restyle the container that established it. */
72
- @container bf-basic-section (width >= 38.75rem) {
73
- :where(.bf-theme) :where(.bf-basic-section.is-split-medium) :where(.bf-basic-section-layout) {
72
+ @container bf-basic-section (width >= 45rem) {
73
+ :where(.bf-theme) :where(.bf-basic-section-layout) {
74
74
  column-gap: var(--bf-grid-gap-inline);
75
75
  grid-template-columns: repeat(2, minmax(0, 1fr));
76
76
  }
77
77
  }
78
78
 
79
- @container bf-basic-section (width >= 64.75rem) {
80
- :where(.bf-theme) :where(.bf-basic-section:not(.is-split-medium)) :where(.bf-basic-section-layout) {
81
- column-gap: var(--bf-grid-gap-inline);
82
- grid-template-columns: repeat(2, minmax(0, 1fr));
83
- }
84
-
85
- }
86
-
87
79
  /* CTA section: Vanilla's 25/75 variant is an offset content rail. The full
88
80
  variant stays naturally full-width. Typography and action presentation are
89
81
  supplied by real heading elements and bf-cta-block. */
@@ -97,19 +89,23 @@ export function sitesFoundationCss() {
97
89
  display: grid;
98
90
  grid-template-columns: minmax(0, 1fr);
99
91
  min-inline-size: 0;
100
- padding-block: calc(var(--bf-section-space-deep) / 2);
101
92
  }
102
93
 
103
94
  :where(.bf-theme) :where(.bf-cta-section-content) {
95
+ --bf-stack-space: var(--bf-section-space-shallow);
96
+ align-content: start;
97
+ display: grid;
98
+ gap: var(--bf-stack-space);
104
99
  min-inline-size: 0;
105
100
  overflow-wrap: anywhere;
106
101
  }
107
102
 
108
- @container bf-cta-section (width >= 64.75rem) {
109
- :where(.bf-theme) :where(.bf-cta-section-layout) {
110
- padding-block: var(--bf-section-space-deep);
111
- }
103
+ :where(.bf-theme) :where(.bf-cta-section-copy) {
104
+ min-inline-size: 0;
105
+ overflow-wrap: anywhere;
106
+ }
112
107
 
108
+ @container bf-cta-section (width >= 64.75rem) {
113
109
  :where(.bf-theme) :where(.bf-cta-section.is-offset) :where(.bf-cta-section-layout) {
114
110
  column-gap: var(--bf-grid-gap-inline);
115
111
  grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
@@ -8,11 +8,11 @@
8
8
  * content paired with one responsive image or video slot.
9
9
  *
10
10
  * Vanilla → BF spacing mapping:
11
- * - horizontal item 8px/16px block padding → `space-1`/`space-2`;
12
- * - 16px grid gutters → `grid-gap-inline`;
13
- * - shallow/default/deep section exitsBF's existing section tokens;
14
- * - the 620px/1036px page breakpoints → 38.75rem/64.75rem container
11
+ * - horizontal item 0.5rem/1rem block padding → `space-1`/`space-2`;
12
+ * - 1rem grid gutters → `grid-gap-inline`;
13
+ * - the 38.75rem/64.75rem page breakpoints38.75rem/64.75rem container
15
14
  * thresholds for descendants. Text roles keep their own metric-derived
16
- * margins and baseline compensation in every tier.
15
+ * margins and baseline compensation in every tier. Parent stacks own every
16
+ * boundary outside the pattern.
17
17
  */
18
18
  export declare function sitesRichListsCss(): string;