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
@@ -7,258 +7,290 @@
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
17
16
  * heading-styled paragraph.
18
17
  */
19
18
  export function sitesEditorialPortsCss() {
20
- return `/* ------------------------------------------------------------------ */
21
- /* Sites editorial compositions — hero and quote wrapper. */
22
- /* Section boundaries and grid tracks are structural; nested stacks own */
23
- /* semantic gaps and every text child keeps metric compensation. */
24
- /* ------------------------------------------------------------------ */
25
-
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. */
29
- :where(.bf-theme) :where(.bf-hero) {
30
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
31
- container-name: bf-hero;
32
- container-type: inline-size;
33
- min-inline-size: 0;
34
- padding-block-end: calc(var(--bf-section-space) / 2);
35
- padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
36
- }
37
-
38
- /* The hero owns its entry rule so consumers do not need a loose sibling.
39
- The established borderless modifier removes only that visual boundary. */
40
- :where(.bf-theme) :where(.bf-hero.is-borderless) {
41
- border-block-start: 0;
42
- padding-block-start: var(--bf-space-2);
43
- }
44
-
45
- :where(.bf-theme) :where(.bf-hero-layout) {
46
- display: grid;
47
- grid-template-columns: minmax(0, 1fr);
48
- min-inline-size: 0;
49
- }
50
-
51
- :where(.bf-theme) :where(.bf-hero-copy, .bf-hero-title, .bf-hero-content, .bf-hero-media, .bf-hero-signpost, .bf-hero-intro, .bf-hero-lead) {
52
- min-inline-size: 0;
53
- overflow-wrap: anywhere;
54
- }
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. */
59
- :where(.bf-theme) :where(.bf-hero-copy) {
60
- align-content: start;
61
- display: grid;
62
- grid-template-columns: minmax(0, 1fr);
63
- }
64
-
65
- :where(.bf-theme) :where(.bf-hero-chip) {
66
- margin-block: 0 var(--bf-body-margin-bottom);
67
- }
68
-
69
- /* Current Vanilla scopes a one-spacing-unit icon/value gap to the hero. */
70
- :where(.bf-theme) :where(.bf-hero-chip.bf-chip) {
71
- column-gap: var(--bf-space-1);
72
- }
73
-
74
- :where(.bf-theme) :where(.bf-hero-media > :where(img, picture, video, canvas, svg), .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
75
- block-size: auto;
76
- display: block;
77
- inline-size: 100%;
78
- max-inline-size: 100%;
79
- }
80
-
81
- /* Intrinsic media ratios commonly resolve to fractional pixels once a hero is
82
- allocated a fluid grid track. Snap only the media block to the active tier
83
- baseline so the following semantic text remains on-grid; its inline track
84
- and the surrounding Vanilla proportions remain unchanged. */
85
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
86
- :where(.bf-theme) :where(.bf-hero-media > .bf-aspect, .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
87
- block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
88
- }
89
- }
90
-
91
- /* A signpost is a compact associated mark, not a decorative background. */
92
- :where(.bf-theme) :where(.bf-hero-signpost) {
93
- align-self: start;
94
- max-inline-size: var(--bf-measure);
95
- }
96
-
97
- /* Full-width media follows the paired title/content tracks. */
98
- :where(.bf-theme) :where(.bf-hero-media.is-full) {
99
- grid-column: 1 / -1;
100
- }
101
-
102
- /* A closing visual remains inside the hero after its lead. The hero's stack
103
- owns their shallow internal separation. */
104
- :where(.bf-theme) :where(.bf-hero) > :where(.bf-hero-media.is-full:last-child) {
105
- inline-size: 100%;
106
- }
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. */
113
- @media (width >= 64.75rem) {
114
- :where(.bf-theme) :where(.bf-hero) {
115
- padding-block-end: var(--bf-section-space);
116
- padding-block-start: calc(var(--bf-space-3) - var(--bf-border-width));
117
- }
118
-
119
- :where(.bf-theme) :where(.bf-hero.is-borderless) {
120
- padding-block-start: var(--bf-space-3);
121
- }
122
- }
123
-
124
- @container bf-hero (width >= 64.75rem) {
125
- :where(.bf-theme) :where(.bf-hero-layout) {
126
- column-gap: var(--bf-grid-gap-inline);
127
- grid-template-columns: repeat(2, minmax(0, 1fr));
128
- }
129
-
130
- :where(.bf-theme) :where(.bf-hero.is-25-75) :where(.bf-hero-layout) {
131
- grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
132
- }
133
-
134
- :where(.bf-theme) :where(.bf-hero.is-75-25) :where(.bf-hero-layout) {
135
- grid-template-columns: minmax(0, 3fr) minmax(0, 1fr);
136
- }
137
-
138
- /* A fallback puts its introduction above the text/media pair. */
139
- :where(.bf-theme) :where(.bf-hero.is-fallback) :where(.bf-hero-intro) {
140
- max-inline-size: calc((100cqi - var(--bf-grid-gap-inline)) / 2);
141
- }
142
- }
143
-
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) {
147
- :where(.bf-theme) :where(.bf-hero.is-split-medium) :where(.bf-hero-layout) {
148
- column-gap: var(--bf-grid-gap-inline);
149
- grid-template-columns: repeat(2, minmax(0, 1fr));
150
- }
151
-
152
- :where(.bf-theme) :where(.bf-hero.is-split-medium.is-25-75) :where(.bf-hero-layout) {
153
- grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
154
- }
155
-
156
- :where(.bf-theme) :where(.bf-hero.is-split-medium.is-75-25) :where(.bf-hero-layout) {
157
- grid-template-columns: minmax(0, 3fr) minmax(0, 1fr);
158
- }
159
- }
160
-
161
- /* Quote wrapper: a heading may introduce a series of quotes. When it does,
162
- its top rule belongs to the wrapper boundary, not to the quote itself. */
163
- :where(.bf-theme) :where(.bf-quote-wrapper) {
164
- container-name: bf-quote-wrapper;
165
- container-type: inline-size;
166
- margin-block-end: var(--bf-section-space);
167
- min-inline-size: 0;
168
- }
169
-
170
- :where(.bf-theme) :where(.bf-quote-wrapper.is-shallow) {
171
- margin-block-end: var(--bf-section-space-shallow);
172
- }
173
-
174
- :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
- min-inline-size: 0;
176
- overflow-wrap: anywhere;
177
- }
178
-
179
- :where(.bf-theme) :where(.bf-quote-wrapper-header) {
180
- display: grid;
181
- grid-template-columns: minmax(0, 1fr);
182
- }
183
-
184
- :where(.bf-theme) :where(.bf-quote-wrapper-layout) {
185
- display: grid;
186
- grid-template-columns: minmax(0, 1fr);
187
- }
188
-
189
- /* This class is a composition rail around the built-in prose blockquote, not
190
- a second quotation type scale. The source may still contain rich semantic
191
- inline markup and retains BF's metric compensation. */
192
- :where(.bf-theme) :where(.bf-quote-wrapper-prose) {
193
- inline-size: min(100%, var(--bf-measure));
194
- }
195
-
196
- :where(.bf-theme) :where(.bf-quote-wrapper-citation) {
197
- color: var(--bf-color-text-muted);
198
- }
199
-
200
- :where(.bf-theme) :where(.bf-quote-wrapper-citation-name) {
201
- color: var(--bf-color-text-default);
202
- font-weight: var(--bf-h6-font-weight);
203
- }
204
-
205
- :where(.bf-theme) :where(.bf-quote-wrapper-signpost) {
206
- align-self: start;
207
- max-inline-size: 100%;
208
- }
209
-
210
- :where(.bf-theme) :where(.bf-quote-wrapper-signpost > :where(img, picture, svg)) {
211
- block-size: auto;
212
- display: block;
213
- inline-size: auto;
214
- max-inline-size: 100%;
215
- }
216
-
217
- /* The quote rail can also be a fractional grid track. Keep its media from
218
- introducing a sub-baseline row while leaving quotation and citation rhythm
219
- entirely baseline-compensated while its stack owns semantic gaps. */
220
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
221
- :where(.bf-theme) :where(.bf-quote-wrapper-signpost > :where(img, picture, svg), .bf-quote-wrapper-media > .bf-aspect) {
222
- block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
223
- }
224
- }
225
-
226
- :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
227
- display: grid;
228
- grid-template-columns: minmax(0, 1fr);
229
- min-inline-size: 0;
230
- }
231
-
232
- @container bf-quote-wrapper (width >= 38.75rem) {
233
- :where(.bf-theme) :where(.bf-quote-wrapper-header) {
234
- column-gap: var(--bf-grid-gap-inline);
235
- grid-template-columns: repeat(4, minmax(0, 1fr));
236
- }
237
-
238
- :where(.bf-theme) :where(.bf-quote-wrapper-header-link) {
239
- grid-column: 4;
240
- }
241
-
242
- :where(.bf-theme) :where(.bf-quote-wrapper-layout) {
243
- column-gap: var(--bf-grid-gap-inline);
244
- grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
245
- }
246
-
247
- /* Vanilla offsets a quote block without a signpost into the content rail. */
248
- :where(.bf-theme) :where(.bf-quote-wrapper-content:only-child) {
249
- grid-column: 2;
250
- }
251
-
252
- :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
253
- column-gap: var(--bf-grid-gap-inline);
254
- grid-template-columns: repeat(2, minmax(0, 1fr));
255
- }
256
- }
257
-
258
- @container bf-quote-wrapper (width >= 64.75rem) {
259
- :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
260
- grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
261
- }
262
- }
19
+ return `/* ------------------------------------------------------------------ */
20
+ /* Sites editorial compositions — hero and quote wrapper. */
21
+ /* Section boundaries and grid tracks are structural; nested stacks own */
22
+ /* semantic gaps and every text child keeps metric compensation. */
23
+ /* ------------------------------------------------------------------ */
24
+
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. */
28
+ :where(.bf-theme) :where(.bf-hero) {
29
+ border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
30
+ container-name: bf-hero;
31
+ container-type: inline-size;
32
+ min-inline-size: 0;
33
+ padding-block-end: 0;
34
+ padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
35
+ }
36
+
37
+ /* The hero owns its entry rule so consumers do not need a loose sibling.
38
+ The established borderless modifier removes only that visual boundary. */
39
+ :where(.bf-theme) :where(.bf-hero.is-borderless) {
40
+ border-block-start: 0;
41
+ padding-block-start: var(--bf-space-2);
42
+ }
43
+
44
+ :where(.bf-theme) :where(.bf-hero-layout) {
45
+ display: grid;
46
+ gap: var(--bf-section-space-shallow);
47
+ grid-template-columns: minmax(0, 1fr);
48
+ min-inline-size: 0;
49
+ }
50
+
51
+ :where(.bf-theme) :where(.bf-hero-copy, .bf-hero-title, .bf-hero-content, .bf-hero-media, .bf-hero-signpost, .bf-hero-intro, .bf-hero-lead) {
52
+ min-inline-size: 0;
53
+ overflow-wrap: anywhere;
54
+ }
55
+
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
+ :where(.bf-theme) :where(.bf-hero-copy) {
60
+ align-content: start;
61
+ display: grid;
62
+ grid-template-columns: minmax(0, 1fr);
63
+ }
64
+
65
+ :where(.bf-theme) :where(.bf-hero-chip) {
66
+ margin-block: 0 var(--bf-body-margin-bottom);
67
+ }
68
+
69
+ /* Current Vanilla scopes a one-spacing-unit icon/value gap to the hero. */
70
+ :where(.bf-theme) :where(.bf-hero-chip.bf-chip) {
71
+ column-gap: var(--bf-space-1);
72
+ }
73
+
74
+ :where(.bf-theme) :where(.bf-hero-media > :where(img, picture, video, canvas, svg), .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
75
+ block-size: auto;
76
+ display: block;
77
+ inline-size: 100%;
78
+ max-inline-size: 100%;
79
+ }
80
+
81
+ /* Intrinsic media ratios commonly resolve to fractional pixels once a hero is
82
+ allocated a fluid grid track. Snap only the media block to the active tier
83
+ baseline so the following semantic text remains on-grid; its inline track
84
+ and the surrounding Vanilla proportions remain unchanged. */
85
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
86
+ :where(.bf-theme) :where(.bf-hero-media > .bf-aspect, .bf-hero-signpost > :where(img, picture, video, canvas, svg)) {
87
+ block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
88
+ }
89
+ }
90
+
91
+ /* A signpost is a compact associated mark, not a decorative background. */
92
+ :where(.bf-theme) :where(.bf-hero-signpost) {
93
+ align-self: start;
94
+ max-inline-size: var(--bf-measure);
95
+ }
96
+
97
+ /* Full-width media follows the paired title/content tracks. */
98
+ :where(.bf-theme) :where(.bf-hero-media.is-full) {
99
+ grid-column: 1 / -1;
100
+ }
101
+
102
+ /* A closing visual remains inside the hero after its lead. The hero's stack
103
+ owns their shallow internal separation. */
104
+ :where(.bf-theme) :where(.bf-hero) > :where(.bf-hero-media.is-full:last-child) {
105
+ inline-size: 100%;
106
+ }
107
+
108
+ /* The section boundary follows the page-level desktop switch, while the
109
+ two-column composition uses its measured intrinsic allocation below. */
110
+ @media (width >= 64.75rem) {
111
+ :where(.bf-theme) :where(.bf-hero) {
112
+ padding-block-start: calc(var(--bf-space-3) - var(--bf-border-width));
113
+ }
114
+
115
+ :where(.bf-theme) :where(.bf-hero.is-borderless) {
116
+ padding-block-start: var(--bf-space-3);
117
+ }
118
+ }
119
+
120
+ @container bf-hero (width >= 45rem) {
121
+ :where(.bf-theme) :where(.bf-hero-layout) {
122
+ column-gap: var(--bf-grid-gap-inline);
123
+ grid-template-columns: repeat(2, minmax(0, 1fr));
124
+ }
125
+
126
+ :where(.bf-theme) :where(.bf-hero.is-25-75) :where(.bf-hero-layout) {
127
+ grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
128
+ }
129
+
130
+ :where(.bf-theme) :where(.bf-hero.is-75-25) :where(.bf-hero-layout) {
131
+ grid-template-columns: minmax(0, 3fr) minmax(0, 1fr);
132
+ }
133
+
134
+ /* A fallback puts its introduction above the text/media pair. */
135
+ :where(.bf-theme) :where(.bf-hero.is-fallback) :where(.bf-hero-intro) {
136
+ max-inline-size: calc((100cqi - var(--bf-grid-gap-inline)) / 2);
137
+ }
138
+ }
139
+
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) {
144
+ :where(.bf-theme) :where(.bf-hero.is-split-medium) :where(.bf-hero-layout) {
145
+ column-gap: var(--bf-grid-gap-inline);
146
+ grid-template-columns: repeat(2, minmax(0, 1fr));
147
+ }
148
+
149
+ :where(.bf-theme) :where(.bf-hero.is-split-medium.is-25-75) :where(.bf-hero-layout) {
150
+ grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
151
+ }
152
+
153
+ :where(.bf-theme) :where(.bf-hero.is-split-medium.is-75-25) :where(.bf-hero-layout) {
154
+ grid-template-columns: minmax(0, 3fr) minmax(0, 1fr);
155
+ }
156
+ }
157
+
158
+ /* Quote wrapper: a heading may introduce a series of quotes. When it does,
159
+ its top rule belongs to the wrapper boundary, not to the quote itself. */
160
+ :where(.bf-theme) :where(.bf-quote-wrapper) {
161
+ container-name: bf-quote-wrapper;
162
+ container-type: inline-size;
163
+ margin: 0;
164
+ min-inline-size: 0;
165
+ }
166
+
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) {
168
+ min-inline-size: 0;
169
+ overflow-wrap: anywhere;
170
+ }
171
+
172
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) {
173
+ display: grid;
174
+ grid-template-columns: minmax(0, 1fr);
175
+ }
176
+
177
+ :where(.bf-theme) :where(.bf-quote-wrapper-layout) {
178
+ display: grid;
179
+ grid-template-columns: minmax(0, 1fr);
180
+ }
181
+
182
+ /* This class is a composition rail around the built-in prose blockquote, not
183
+ a second quotation type scale. The source may still contain rich semantic
184
+ inline markup and retains BF's metric compensation. */
185
+ :where(.bf-theme) :where(.bf-quote-wrapper-prose) {
186
+ inline-size: min(100%, var(--bf-measure));
187
+ }
188
+
189
+ :where(.bf-theme) :where(.bf-quote-wrapper-citation) {
190
+ color: var(--bf-color-text-muted);
191
+ }
192
+
193
+ :where(.bf-theme) :where(.bf-quote-wrapper-citation-name) {
194
+ color: var(--bf-color-text-default);
195
+ font-weight: var(--bf-h6-font-weight);
196
+ }
197
+
198
+ :where(.bf-theme) :where(.bf-quote-wrapper-signpost) {
199
+ align-self: start;
200
+ max-inline-size: 100%;
201
+ }
202
+
203
+ :where(.bf-theme) :where(.bf-quote-wrapper-signpost > :where(img, picture, svg)) {
204
+ block-size: auto;
205
+ display: block;
206
+ inline-size: auto;
207
+ max-inline-size: 100%;
208
+ }
209
+
210
+ /* The quote rail can also be a fractional grid track. Keep its media from
211
+ introducing a sub-baseline row while leaving quotation and citation rhythm
212
+ entirely baseline-compensated while its stack owns semantic gaps. */
213
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
214
+ :where(.bf-theme) :where(.bf-quote-wrapper-signpost > :where(img, picture, svg), .bf-quote-wrapper-media > .bf-aspect) {
215
+ block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
216
+ }
217
+ }
218
+
219
+ :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
220
+ display: grid;
221
+ grid-template-columns: minmax(0, 1fr);
222
+ min-inline-size: 0;
223
+ }
224
+
225
+ @container bf-quote-wrapper (width >= 38.75rem) {
226
+ :where(.bf-theme) :where(.bf-quote-wrapper-header) {
227
+ column-gap: var(--bf-grid-gap-inline);
228
+ grid-template-columns: repeat(4, minmax(0, 1fr));
229
+ }
230
+
231
+ :where(.bf-theme) :where(.bf-quote-wrapper-header-link) {
232
+ grid-column: 4;
233
+ }
234
+
235
+ :where(.bf-theme) :where(.bf-quote-wrapper-layout) {
236
+ column-gap: var(--bf-grid-gap-inline);
237
+ grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
238
+ }
239
+
240
+ /* Vanilla offsets a quote block without a signpost into the content rail. */
241
+ :where(.bf-theme) :where(.bf-quote-wrapper-content:only-child) {
242
+ grid-column: 2;
243
+ }
244
+
245
+ :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
246
+ column-gap: var(--bf-grid-gap-inline);
247
+ grid-template-columns: repeat(2, minmax(0, 1fr));
248
+ }
249
+ }
250
+
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
+
278
+ :where(.bf-theme) :where(.bf-quote-wrapper-quote-row) {
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;
293
+ }
294
+ }
263
295
  `;
264
296
  }