baseline-foundry 0.1.3 → 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 (84) hide show
  1. package/README.md +577 -553
  2. package/config/experiments/ibm-plex-engine-smoke.json +115 -115
  3. package/config/experiments/ubuntu-engine-smoke.json +115 -115
  4. package/config/foundation-theme.json +110 -110
  5. package/config/tiers/app.json +116 -116
  6. package/config/tiers/documentation.json +116 -116
  7. package/config/tiers/editorial.json +116 -116
  8. package/config/tiers/os.json +116 -116
  9. package/dist/baseline-grid-overlay.js +43 -43
  10. package/dist/build.js +4 -4
  11. package/dist/code-snippet.js +1 -1
  12. package/dist/css-app-tier.js +78 -73
  13. package/dist/css-components/article-pagination.js +141 -140
  14. package/dist/css-components/button-actions.js +181 -161
  15. package/dist/css-components/cards-options.js +176 -176
  16. package/dist/css-components/chip-badge-status.d.ts +0 -3
  17. package/dist/css-components/chip-badge-status.js +174 -159
  18. package/dist/css-components/content-card.d.ts +7 -7
  19. package/dist/css-components/content-card.js +498 -497
  20. package/dist/css-components/control-row.d.ts +1 -1
  21. package/dist/css-components/control-row.js +15 -15
  22. package/dist/css-components/cta-figure-aspect.js +120 -120
  23. package/dist/css-components/document-navigation.js +427 -390
  24. package/dist/css-components/editorial-content.js +42 -42
  25. package/dist/css-components/icon.js +72 -72
  26. package/dist/css-components/interactive-feedback.js +239 -217
  27. package/dist/css-components/interactive-tables.js +160 -155
  28. package/dist/css-components/legacy-navigation.d.ts +8 -0
  29. package/dist/css-components/legacy-navigation.js +816 -0
  30. package/dist/css-components/linked-logo-site-layout.d.ts +3 -3
  31. package/dist/css-components/linked-logo-site-layout.js +177 -180
  32. package/dist/css-components/list-tree.js +96 -94
  33. package/dist/css-components/list.js +9 -7
  34. package/dist/css-components/logo-media.d.ts +6 -6
  35. package/dist/css-components/logo-media.js +218 -207
  36. package/dist/css-components/navigation-layout.js +144 -144
  37. package/dist/css-components/panel.js +148 -144
  38. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  39. package/dist/css-components/search-box-and-filter.js +263 -264
  40. package/dist/css-components/sites-editorial-ports.d.ts +3 -4
  41. package/dist/css-components/sites-editorial-ports.js +279 -247
  42. package/dist/css-components/sites-foundation.js +142 -146
  43. package/dist/css-components/sites-rich-lists.d.ts +5 -5
  44. package/dist/css-components/sites-rich-lists.js +339 -349
  45. package/dist/css-components/static-content-ports.d.ts +3 -3
  46. package/dist/css-components/static-content-ports.js +200 -186
  47. package/dist/css-components/tab-section.d.ts +3 -3
  48. package/dist/css-components/tab-section.js +93 -85
  49. package/dist/css-components/table.js +76 -75
  50. package/dist/css-components/tabs-choice-breadcrumbs.js +307 -303
  51. package/dist/css-components/tiered-list-equal-height-row.js +271 -271
  52. package/dist/css-components.js +1881 -2554
  53. package/dist/css-grid.d.ts +1 -1
  54. package/dist/css-grid.js +183 -173
  55. package/dist/css.js +317 -241
  56. package/dist/experiments/ibm-plex-engine-smoke/styles.css +894 -538
  57. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +2 -2
  58. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +1 -1
  59. package/dist/in-page-navigation.js +1 -1
  60. package/dist/presets/app-tier/styles.css +928 -568
  61. package/dist/presets/app-tier/surfaces.json +17 -17
  62. package/dist/presets/app-tier/tokens.json +7 -7
  63. package/dist/presets/prose/styles.css +919 -562
  64. package/dist/presets/prose/surfaces.json +17 -17
  65. package/dist/presets/prose/tokens.json +1 -1
  66. package/dist/resizable-aside.js +12 -4
  67. package/dist/styles.css +919 -562
  68. package/dist/surfaces.json +17 -17
  69. package/dist/tiers/app/styles.css +928 -568
  70. package/dist/tiers/app/surfaces.json +17 -17
  71. package/dist/tiers/app/tokens.json +7 -7
  72. package/dist/tiers/documentation/styles.css +920 -563
  73. package/dist/tiers/documentation/surfaces.json +17 -17
  74. package/dist/tiers/documentation/tokens.json +2 -2
  75. package/dist/tiers/editorial/styles.css +919 -562
  76. package/dist/tiers/editorial/surfaces.json +17 -17
  77. package/dist/tiers/editorial/tokens.json +1 -1
  78. package/dist/tiers/os/styles.css +925 -568
  79. package/dist/tiers/os/surfaces.json +17 -17
  80. package/dist/tiers/os/tokens.json +7 -7
  81. package/dist/tokens.json +1 -1
  82. package/dist/types.d.ts +1 -1
  83. package/docs/publishing.md +31 -14
  84. package/package.json +119 -108
@@ -1,14 +1,14 @@
1
1
  export function tieredListEqualHeightRowCss() {
2
- return `/* ------------------------------------------------------------------ */
3
- /* Tiered list */
4
- /* Editorial pattern (Vanilla parity): paired list of titles + */
5
- /* descriptions under a top-level title + description, with optional */
6
- /* CTA. Vanilla uses media queries at tablet/desktop; Baseline Foundry */
7
- /* uses container queries on the pattern itself so the layout reacts */
8
- /* to its own width (panels, drawers, narrow main areas) instead of */
9
- /* the viewport. Stack gaps own semantics; text keeps compensation. */
10
- /* ------------------------------------------------------------------ */
11
-
2
+ return `/* ------------------------------------------------------------------ */
3
+ /* Tiered list */
4
+ /* Editorial pattern (Vanilla parity): paired list of titles + */
5
+ /* descriptions under a top-level title + description, with optional */
6
+ /* CTA. Vanilla uses media queries at tablet/desktop; Baseline Foundry */
7
+ /* uses container queries on the pattern itself so the layout reacts */
8
+ /* to its own width (panels, drawers, narrow main areas) instead of */
9
+ /* the viewport. Stack gaps own semantics; text keeps compensation. */
10
+ /* ------------------------------------------------------------------ */
11
+
12
12
  :where(.bf-theme) :where(.bf-tiered-list) {
13
13
  container-type: inline-size;
14
14
  display: grid;
@@ -21,266 +21,266 @@ export function tieredListEqualHeightRowCss() {
21
21
  }
22
22
 
23
23
  :where(.bf-theme) :where(.bf-tiered-list-header),
24
- :where(.bf-theme) :where(.bf-tiered-list-item),
25
- :where(.bf-theme) :where(.bf-tiered-list-cta) {
26
- column-gap: var(--bf-grid-gap-inline);
27
- display: grid;
28
- grid-template-columns: minmax(0, 1fr);
29
- }
30
-
31
- /* Consumer-proven compact rows. These are deliberately independent of the
32
- editorial hanging-indent composition below: flush rows describe a plain
33
- two-slot datum while triple rows add a named intermediate role. */
34
- :where(.bf-theme) :where(.bf-tiered-list.is-flush, .bf-tiered-list.is-triple) :where(.bf-tiered-list-item) {
35
- align-items: start;
36
- grid-template-columns: minmax(0, 1fr);
37
- }
38
-
39
- :where(.bf-theme) :where(.bf-tiered-list-item-label, .bf-tiered-list-item-role, .bf-tiered-list-item-value) {
40
- display: block;
41
- font-family: var(--bf-body-font-family);
42
- font-size: var(--bf-body-font-size);
43
- font-style: var(--bf-body-font-style);
44
- font-weight: var(--bf-body-font-weight);
45
- line-height: var(--bf-body-line-height);
46
- margin-block: 0 var(--bf-body-margin-bottom);
47
- min-inline-size: 0;
48
- overflow-wrap: anywhere;
49
- padding-block-end: 0;
50
- padding-block-start: var(--bf-body-nudge-start);
51
- }
52
-
53
- :where(.bf-theme) :where(.bf-tiered-list-item-role) {
54
- color: var(--bf-color-text-muted);
55
- }
56
-
57
- :where(.bf-theme) :where(ol.bf-tiered-list, ul.bf-tiered-list, ol.bf-tiered-list-items, ul.bf-tiered-list-items) {
58
- list-style: none;
59
- margin: 0;
60
- padding: 0;
61
- }
62
-
63
- :where(.bf-theme) :where(.bf-tiered-list-header) > :where(.bf-rule),
64
- :where(.bf-theme) :where(.bf-tiered-list-item) > :where(.bf-rule),
65
- :where(.bf-theme) :where(.bf-tiered-list-cta) > :where(.bf-rule) {
66
- grid-column: 1 / -1;
67
- }
68
-
69
- /* ------------------------------------------------------------------ */
70
- /* Medium container (≥ 38.75rem): items use BF’s 8-column grid with a */
71
- /* hanging indent. Vanilla: title col 3 / span 2, description col 5 / */
72
- /* span 4. The rule above each item starts at col 3 to match. */
73
- /* ------------------------------------------------------------------ */
74
- @container (width >= 38.75rem) {
75
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item),
76
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta) {
77
- grid-template-columns: repeat(8, minmax(0, 1fr));
78
- }
79
-
80
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item) > :where(.bf-rule),
81
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta) > :where(.bf-rule) {
82
- grid-column: 3 / span 6;
83
- }
84
-
85
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item-title) {
86
- grid-column: 3 / span 2;
87
- }
88
-
89
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item-description),
90
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta-block) {
91
- grid-column: 5 / span 4;
92
- }
93
- }
94
-
95
- /* ------------------------------------------------------------------ */
96
- /* Header split (≥ 64.75rem): unchanged 50/50 title/description. */
97
- /* ------------------------------------------------------------------ */
98
- @container (width >= 64.75rem) {
99
- :where(.bf-theme) :where(.bf-tiered-list:not(.is-description-full-width)) :where(.bf-tiered-list-header) {
100
- grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
101
- }
102
- }
103
-
104
- /* ------------------------------------------------------------------ */
105
- /* Equal-height row (Vanilla parity). */
106
- /* Cross-column row alignment via CSS subgrid: each column is a 4-row */
107
- /* subgrid so items at the same vertical position across columns share */
108
- /* the same baseline (e.g. icon row, title row, description row, */
109
- /* trailing list row). Vanilla uses media queries; BF uses container */
110
- /* queries on the row itself so the layout reacts to its own width. */
111
- /* Optional cross-column dividers via .is-divider-1 / -2 / -3 mirror */
112
- /* Vanilla’s has-divider-N modifiers (renamed for the BF is-* rule). */
113
- /* ------------------------------------------------------------------ */
114
- :where(.bf-theme) :where(.bf-equal-height-row) {
115
- container-type: inline-size;
116
- display: grid;
117
- gap: var(--bf-grid-gap-block) var(--bf-grid-gap-inline);
118
- /* Keep the logical track system on the query container itself. Container
119
- queries cannot style their own container, so responsive descendants span
120
- these tracks instead of relying on an ineligible self-query. */
121
- grid-template-columns: repeat(8, minmax(0, 1fr));
122
- margin-block-end: var(--bf-section-space-shallow);
123
- position: relative;
124
- }
125
-
126
- :where(.bf-theme) :where(.bf-equal-height-row-col) {
127
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
128
- display: grid;
129
- grid-column: 1 / -1;
130
- grid-row: span 4;
131
- grid-template-rows: subgrid;
132
- margin-block-end: var(--bf-space-1);
133
- position: relative;
134
- }
135
-
136
- /* Responsive aspect media can make a shared subgrid track land between
137
- baselines. Snap that media box itself; the surrounding composition still
138
- does not own or erase any child's semantic margins. */
139
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
140
- :where(.bf-theme) :where(.bf-equal-height-row-item) > :where(.bf-aspect) {
141
- block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
142
- }
143
- }
144
-
145
- :where(.bf-theme) :where(.bf-equal-height-row-col.is-borderless) {
146
- border-block-start: 0;
147
- }
148
-
149
- @container (width >= 38.75rem) {
150
- :where(.bf-theme) :where(.bf-equal-height-row-col) {
151
- grid-column: span 8;
152
- grid-template-columns: subgrid;
153
- }
154
-
155
- :where(.bf-theme) :where(.bf-equal-height-row-col) > :where(.bf-equal-height-row-item) {
156
- grid-column: span 4;
157
- }
158
-
159
- :where(.bf-theme) :where(.bf-equal-height-row-col) > :where(.bf-equal-height-row-item):first-child {
160
- grid-row: span 100;
161
- }
162
-
163
- :where(.bf-theme) :where(.bf-equal-height-row.is-wrap) :where(.bf-equal-height-row-col) {
164
- grid-column: span 4;
165
- grid-template-columns: none;
166
- }
167
-
168
- :where(.bf-theme) :where(.bf-equal-height-row.is-wrap) :where(.bf-equal-height-row-col) > :where(.bf-equal-height-row-item) {
169
- grid-column: auto;
170
- }
171
-
172
- :where(.bf-theme) :where(.bf-equal-height-row.is-wrap) :where(.bf-equal-height-row-col) > :where(.bf-equal-height-row-item):first-child {
173
- grid-row: auto;
174
- }
175
- }
176
-
177
- @container (width >= 64.75rem) {
178
- :where(.bf-theme) :where(.bf-equal-height-row-col) {
179
- border-block-start: 0;
180
- grid-column: span 2;
181
- margin-block-end: 0;
182
- }
183
- }
184
-
185
- /* The Sites equal-heights composition constrains two-item groups to the
186
- trailing half of the large grid and three-item groups to its trailing
187
- three quarters. These modifiers preserve those rendered proportions while
188
- keeping the existing equal-height row as the single alignment primitive. */
189
- @media (width >= 64.75rem) {
190
- :where(.bf-theme) :where(.bf-equal-height-row.is-columns-2) {
191
- inline-size: calc(50% - (var(--bf-grid-gap-inline) / 2));
192
- margin-inline-start: auto;
193
- }
194
-
195
- :where(.bf-theme) :where(.bf-equal-height-row.is-columns-2) :where(.bf-equal-height-row-col) {
196
- grid-column: span 4;
197
- }
198
-
199
- :where(.bf-theme) :where(.bf-equal-height-row.is-columns-3) {
200
- grid-template-columns: repeat(6, minmax(0, 1fr));
201
- inline-size: calc(75% - (var(--bf-grid-gap-inline) / 4));
202
- margin-inline-start: auto;
203
- }
204
-
205
- :where(.bf-theme) :where(.bf-equal-height-row.is-columns-3) :where(.bf-equal-height-row-col) {
206
- grid-column: span 2;
207
- }
208
- }
209
-
210
- /* Cross-column dividers — Vanilla pattern uses a single ::before for */
211
- /* divider-1 and a single ::after for divider-2; the third divider */
212
- /* falls back onto whichever pseudo is still available. */
213
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-1)::before,
214
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-2)::after,
215
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
216
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after {
217
- background-color: var(--bf-color-border-low-contrast);
218
- block-size: 1px;
219
- content: "";
220
- display: none;
221
- grid-column: 1 / -1;
222
- inset-inline: 0;
223
- margin: auto;
224
- position: absolute;
225
- }
226
-
227
- @container (width >= 64.75rem) {
228
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-1)::before,
229
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-2)::after,
230
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
231
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after {
232
- display: block;
233
- }
234
- }
235
-
236
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-1)::before {
237
- grid-row: 2;
238
- }
239
-
240
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-2)::after {
241
- grid-row: 3;
242
- }
243
-
244
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
245
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after,
246
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1):not(.is-divider-2))::before {
247
- grid-row: 4;
248
- }
249
-
250
- :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1):not(.is-divider-2))::after {
251
- display: none;
252
- }
253
-
254
- /* Flush and triple rows remain intrinsic at narrow widths, then gain their
255
- aligned slots only when their own container has room. */
256
- @container (width >= 32rem) {
257
- :where(.bf-theme) :where(.bf-tiered-list.is-flush) :where(.bf-tiered-list-item) {
258
- grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
259
- }
260
-
261
- :where(.bf-theme) :where(.bf-tiered-list.is-flush) :where(.bf-tiered-list-item-label, .bf-tiered-list-item-title) {
262
- grid-column: 1;
263
- }
264
-
265
- :where(.bf-theme) :where(.bf-tiered-list.is-flush) :where(.bf-tiered-list-item-value, .bf-tiered-list-item-description) {
266
- grid-column: 2;
267
- }
268
-
269
- :where(.bf-theme) :where(.bf-tiered-list.is-triple) :where(.bf-tiered-list-item) {
270
- grid-template-columns: minmax(0, 2fr) minmax(0, 2fr) minmax(0, 3fr);
271
- }
272
-
273
- :where(.bf-theme) :where(.bf-tiered-list.is-triple) :where(.bf-tiered-list-item-label) {
274
- grid-column: 1;
275
- }
276
-
277
- :where(.bf-theme) :where(.bf-tiered-list.is-triple) :where(.bf-tiered-list-item-role) {
278
- grid-column: 2;
279
- }
280
-
281
- :where(.bf-theme) :where(.bf-tiered-list.is-triple) :where(.bf-tiered-list-item-value) {
282
- grid-column: 3;
283
- }
284
- }
24
+ :where(.bf-theme) :where(.bf-tiered-list-item),
25
+ :where(.bf-theme) :where(.bf-tiered-list-cta) {
26
+ column-gap: var(--bf-grid-gap-inline);
27
+ display: grid;
28
+ grid-template-columns: minmax(0, 1fr);
29
+ }
30
+
31
+ /* Consumer-proven compact rows. These are deliberately independent of the
32
+ editorial hanging-indent composition below: flush rows describe a plain
33
+ two-slot datum while triple rows add a named intermediate role. */
34
+ :where(.bf-theme) :where(.bf-tiered-list.is-flush, .bf-tiered-list.is-triple) :where(.bf-tiered-list-item) {
35
+ align-items: start;
36
+ grid-template-columns: minmax(0, 1fr);
37
+ }
38
+
39
+ :where(.bf-theme) :where(.bf-tiered-list-item-label, .bf-tiered-list-item-role, .bf-tiered-list-item-value) {
40
+ display: block;
41
+ font-family: var(--bf-body-font-family);
42
+ font-size: var(--bf-body-font-size);
43
+ font-style: var(--bf-body-font-style);
44
+ font-weight: var(--bf-body-font-weight);
45
+ line-height: var(--bf-body-line-height);
46
+ margin-block: 0 var(--bf-body-margin-bottom);
47
+ min-inline-size: 0;
48
+ overflow-wrap: anywhere;
49
+ padding-block-end: 0;
50
+ padding-block-start: var(--bf-body-nudge-start);
51
+ }
52
+
53
+ :where(.bf-theme) :where(.bf-tiered-list-item-role) {
54
+ color: var(--bf-color-text-muted);
55
+ }
56
+
57
+ :where(.bf-theme) :where(ol.bf-tiered-list, ul.bf-tiered-list, ol.bf-tiered-list-items, ul.bf-tiered-list-items) {
58
+ list-style: none;
59
+ margin: 0;
60
+ padding: 0;
61
+ }
62
+
63
+ :where(.bf-theme) :where(.bf-tiered-list-header) > hr,
64
+ :where(.bf-theme) :where(.bf-tiered-list-item) > hr,
65
+ :where(.bf-theme) :where(.bf-tiered-list-cta) > hr {
66
+ grid-column: 1 / -1;
67
+ }
68
+
69
+ /* ------------------------------------------------------------------ */
70
+ /* Medium container (≥ 38.75rem): items use BF’s 8-column grid with a */
71
+ /* hanging indent. Vanilla: title col 3 / span 2, description col 5 / */
72
+ /* span 4. The rule above each item starts at col 3 to match. */
73
+ /* ------------------------------------------------------------------ */
74
+ @container (width >= 38.75rem) {
75
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item),
76
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta) {
77
+ grid-template-columns: repeat(8, minmax(0, 1fr));
78
+ }
79
+
80
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item) > hr,
81
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta) > hr {
82
+ grid-column: 3 / span 6;
83
+ }
84
+
85
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item-title) {
86
+ grid-column: 3 / span 2;
87
+ }
88
+
89
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-item-description),
90
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-list-full-width):not(.is-flush):not(.is-triple)) :where(.bf-tiered-list-cta-block) {
91
+ grid-column: 5 / span 4;
92
+ }
93
+ }
94
+
95
+ /* ------------------------------------------------------------------ */
96
+ /* Header split (≥ 45rem): the shared readable 50/50 title/content split. */
97
+ /* ------------------------------------------------------------------ */
98
+ @container (width >= 45rem) {
99
+ :where(.bf-theme) :where(.bf-tiered-list:not(.is-description-full-width)) :where(.bf-tiered-list-header) {
100
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
101
+ }
102
+ }
103
+
104
+ /* ------------------------------------------------------------------ */
105
+ /* Equal-height row (Vanilla parity). */
106
+ /* Cross-column row alignment via CSS subgrid: each column is a 4-row */
107
+ /* subgrid so items at the same vertical position across columns share */
108
+ /* the same baseline (e.g. icon row, title row, description row, */
109
+ /* trailing list row). Vanilla uses media queries; BF uses container */
110
+ /* queries on the row itself so the layout reacts to its own width. */
111
+ /* Optional cross-column dividers via .is-divider-1 / -2 / -3 mirror */
112
+ /* Vanilla’s has-divider-N modifiers (renamed for the BF is-* rule). */
113
+ /* ------------------------------------------------------------------ */
114
+ :where(.bf-theme) :where(.bf-equal-height-row) {
115
+ container-type: inline-size;
116
+ display: grid;
117
+ gap: var(--bf-grid-gap-block) var(--bf-grid-gap-inline);
118
+ /* Keep the logical track system on the query container itself. Container
119
+ queries cannot style their own container, so responsive descendants span
120
+ these tracks instead of relying on an ineligible self-query. */
121
+ grid-template-columns: repeat(8, minmax(0, 1fr));
122
+ margin: 0;
123
+ position: relative;
124
+ }
125
+
126
+ :where(.bf-theme) :where(.bf-equal-height-row-col) {
127
+ border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
128
+ display: grid;
129
+ grid-column: 1 / -1;
130
+ grid-row: span 4;
131
+ grid-template-rows: subgrid;
132
+ margin-block-end: var(--bf-space-1);
133
+ position: relative;
134
+ }
135
+
136
+ /* Responsive aspect media can make a shared subgrid track land between
137
+ baselines. Snap that media box itself; the surrounding composition still
138
+ does not own or erase any child's semantic margins. */
139
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
140
+ :where(.bf-theme) :where(.bf-equal-height-row-item) > :where(.bf-aspect) {
141
+ block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
142
+ }
143
+ }
144
+
145
+ :where(.bf-theme) :where(.bf-equal-height-row-col.is-borderless) {
146
+ border-block-start: 0;
147
+ }
148
+
149
+ @container (width >= 38.75rem) {
150
+ :where(.bf-theme) :where(.bf-equal-height-row-col) {
151
+ grid-column: span 8;
152
+ grid-template-columns: subgrid;
153
+ }
154
+
155
+ :where(.bf-theme) :where(.bf-equal-height-row-col) > :where(.bf-equal-height-row-item) {
156
+ grid-column: span 4;
157
+ }
158
+
159
+ :where(.bf-theme) :where(.bf-equal-height-row-col) > :where(.bf-equal-height-row-item):first-child {
160
+ grid-row: span 100;
161
+ }
162
+
163
+ :where(.bf-theme) :where(.bf-equal-height-row.is-wrap) :where(.bf-equal-height-row-col) {
164
+ grid-column: span 4;
165
+ grid-template-columns: none;
166
+ }
167
+
168
+ :where(.bf-theme) :where(.bf-equal-height-row.is-wrap) :where(.bf-equal-height-row-col) > :where(.bf-equal-height-row-item) {
169
+ grid-column: auto;
170
+ }
171
+
172
+ :where(.bf-theme) :where(.bf-equal-height-row.is-wrap) :where(.bf-equal-height-row-col) > :where(.bf-equal-height-row-item):first-child {
173
+ grid-row: auto;
174
+ }
175
+ }
176
+
177
+ @container (width >= 64.75rem) {
178
+ :where(.bf-theme) :where(.bf-equal-height-row-col) {
179
+ border-block-start: 0;
180
+ grid-column: span 2;
181
+ margin-block-end: 0;
182
+ }
183
+ }
184
+
185
+ /* The Sites equal-heights composition constrains two-item groups to the
186
+ trailing half of the large grid and three-item groups to its trailing
187
+ three quarters. These modifiers preserve those rendered proportions while
188
+ keeping the existing equal-height row as the single alignment primitive. */
189
+ @media (width >= 64.75rem) {
190
+ :where(.bf-theme) :where(.bf-equal-height-row.is-columns-2) {
191
+ inline-size: calc(50% - (var(--bf-grid-gap-inline) / 2));
192
+ margin-inline-start: auto;
193
+ }
194
+
195
+ :where(.bf-theme) :where(.bf-equal-height-row.is-columns-2) :where(.bf-equal-height-row-col) {
196
+ grid-column: span 4;
197
+ }
198
+
199
+ :where(.bf-theme) :where(.bf-equal-height-row.is-columns-3) {
200
+ grid-template-columns: repeat(6, minmax(0, 1fr));
201
+ inline-size: calc(75% - (var(--bf-grid-gap-inline) / 4));
202
+ margin-inline-start: auto;
203
+ }
204
+
205
+ :where(.bf-theme) :where(.bf-equal-height-row.is-columns-3) :where(.bf-equal-height-row-col) {
206
+ grid-column: span 2;
207
+ }
208
+ }
209
+
210
+ /* Cross-column dividers — Vanilla pattern uses a single ::before for */
211
+ /* divider-1 and a single ::after for divider-2; the third divider */
212
+ /* falls back onto whichever pseudo is still available. */
213
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-1)::before,
214
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-2)::after,
215
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
216
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after {
217
+ background-color: var(--bf-color-border-low-contrast);
218
+ block-size: 0.0625rem;
219
+ content: "";
220
+ display: none;
221
+ grid-column: 1 / -1;
222
+ inset-inline: 0;
223
+ margin: auto;
224
+ position: absolute;
225
+ }
226
+
227
+ @container (width >= 64.75rem) {
228
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-1)::before,
229
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-2)::after,
230
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
231
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after {
232
+ display: block;
233
+ }
234
+ }
235
+
236
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-1)::before {
237
+ grid-row: 2;
238
+ }
239
+
240
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-2)::after {
241
+ grid-row: 3;
242
+ }
243
+
244
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1))::before,
245
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-2))::after,
246
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1):not(.is-divider-2))::before {
247
+ grid-row: 4;
248
+ }
249
+
250
+ :where(.bf-theme) :where(.bf-equal-height-row.is-divider-3:not(.is-divider-1):not(.is-divider-2))::after {
251
+ display: none;
252
+ }
253
+
254
+ /* Flush and triple rows remain intrinsic at narrow widths, then gain their
255
+ aligned slots only when their own container has room. */
256
+ @container (width >= 32rem) {
257
+ :where(.bf-theme) :where(.bf-tiered-list.is-flush) :where(.bf-tiered-list-item) {
258
+ grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
259
+ }
260
+
261
+ :where(.bf-theme) :where(.bf-tiered-list.is-flush) :where(.bf-tiered-list-item-label, .bf-tiered-list-item-title) {
262
+ grid-column: 1;
263
+ }
264
+
265
+ :where(.bf-theme) :where(.bf-tiered-list.is-flush) :where(.bf-tiered-list-item-value, .bf-tiered-list-item-description) {
266
+ grid-column: 2;
267
+ }
268
+
269
+ :where(.bf-theme) :where(.bf-tiered-list.is-triple) :where(.bf-tiered-list-item) {
270
+ grid-template-columns: minmax(0, 2fr) minmax(0, 2fr) minmax(0, 3fr);
271
+ }
272
+
273
+ :where(.bf-theme) :where(.bf-tiered-list.is-triple) :where(.bf-tiered-list-item-label) {
274
+ grid-column: 1;
275
+ }
276
+
277
+ :where(.bf-theme) :where(.bf-tiered-list.is-triple) :where(.bf-tiered-list-item-role) {
278
+ grid-column: 2;
279
+ }
280
+
281
+ :where(.bf-theme) :where(.bf-tiered-list.is-triple) :where(.bf-tiered-list-item-value) {
282
+ grid-column: 3;
283
+ }
284
+ }
285
285
  `;
286
286
  }