baseline-foundry 0.1.3
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.
- package/LICENSE +21 -0
- package/README.md +588 -0
- package/config/experiments/ibm-plex-engine-smoke.json +115 -0
- package/config/experiments/ubuntu-engine-smoke.json +115 -0
- package/config/foundation-theme.json +117 -0
- package/config/tiers/app.json +120 -0
- package/config/tiers/documentation.json +120 -0
- package/config/tiers/editorial.json +120 -0
- package/config/tiers/os.json +120 -0
- package/dist/accordion.d.ts +5 -0
- package/dist/accordion.js +32 -0
- package/dist/application-layout.d.ts +4 -0
- package/dist/application-layout.js +181 -0
- package/dist/baseline-grid-overlay.d.ts +5 -0
- package/dist/baseline-grid-overlay.js +50 -0
- package/dist/baseline-grid-theme.d.ts +3 -0
- package/dist/baseline-grid-theme.js +3 -0
- package/dist/baseline-grid.d.ts +7 -0
- package/dist/baseline-grid.js +35 -0
- package/dist/build.d.ts +21 -0
- package/dist/build.js +440 -0
- package/dist/code-snippet.d.ts +6 -0
- package/dist/code-snippet.js +95 -0
- package/dist/contextual-menu.d.ts +4 -0
- package/dist/contextual-menu.js +156 -0
- package/dist/css-app-tier.d.ts +1 -0
- package/dist/css-app-tier.js +77 -0
- package/dist/css-components/article-pagination.d.ts +13 -0
- package/dist/css-components/article-pagination.js +151 -0
- package/dist/css-components/button-actions.d.ts +7 -0
- package/dist/css-components/button-actions.js +165 -0
- package/dist/css-components/cards-options.d.ts +6 -0
- package/dist/css-components/cards-options.js +180 -0
- package/dist/css-components/chip-badge-status.d.ts +10 -0
- package/dist/css-components/chip-badge-status.js +162 -0
- package/dist/css-components/content-card.d.ts +25 -0
- package/dist/css-components/content-card.js +517 -0
- package/dist/css-components/control-row.d.ts +2 -0
- package/dist/css-components/control-row.js +18 -0
- package/dist/css-components/cta-figure-aspect.d.ts +1 -0
- package/dist/css-components/cta-figure-aspect.js +123 -0
- package/dist/css-components/document-navigation.d.ts +13 -0
- package/dist/css-components/document-navigation.js +400 -0
- package/dist/css-components/editorial-content.d.ts +6 -0
- package/dist/css-components/editorial-content.js +52 -0
- package/dist/css-components/icon.d.ts +1 -0
- package/dist/css-components/icon.js +75 -0
- package/dist/css-components/interactive-feedback.d.ts +2 -0
- package/dist/css-components/interactive-feedback.js +230 -0
- package/dist/css-components/interactive-tables.d.ts +7 -0
- package/dist/css-components/interactive-tables.js +164 -0
- package/dist/css-components/linked-logo-site-layout.d.ts +21 -0
- package/dist/css-components/linked-logo-site-layout.js +214 -0
- package/dist/css-components/list-tree.d.ts +5 -0
- package/dist/css-components/list-tree.js +98 -0
- package/dist/css-components/list.d.ts +3 -0
- package/dist/css-components/list.js +119 -0
- package/dist/css-components/logo-media.d.ts +16 -0
- package/dist/css-components/logo-media.js +219 -0
- package/dist/css-components/navigation-layout.d.ts +5 -0
- package/dist/css-components/navigation-layout.js +151 -0
- package/dist/css-components/panel.d.ts +6 -0
- package/dist/css-components/panel.js +148 -0
- package/dist/css-components/search-box-and-filter.d.ts +9 -0
- package/dist/css-components/search-box-and-filter.js +267 -0
- package/dist/css-components/sites-editorial-ports.d.ts +19 -0
- package/dist/css-components/sites-editorial-ports.js +264 -0
- package/dist/css-components/sites-foundation.d.ts +17 -0
- package/dist/css-components/sites-foundation.js +173 -0
- package/dist/css-components/sites-rich-lists.d.ts +18 -0
- package/dist/css-components/sites-rich-lists.js +364 -0
- package/dist/css-components/static-content-ports.d.ts +14 -0
- package/dist/css-components/static-content-ports.js +206 -0
- package/dist/css-components/tab-section.d.ts +19 -0
- package/dist/css-components/tab-section.js +103 -0
- package/dist/css-components/table.d.ts +7 -0
- package/dist/css-components/table.js +79 -0
- package/dist/css-components/tabs-choice-breadcrumbs.d.ts +9 -0
- package/dist/css-components/tabs-choice-breadcrumbs.js +307 -0
- package/dist/css-components/tiered-list-equal-height-row.d.ts +1 -0
- package/dist/css-components/tiered-list-equal-height-row.js +286 -0
- package/dist/css-components.d.ts +2 -0
- package/dist/css-components.js +2701 -0
- package/dist/css-grid.d.ts +1 -0
- package/dist/css-grid.js +179 -0
- package/dist/css.d.ts +6 -0
- package/dist/css.js +431 -0
- package/dist/experiments/ibm-plex-engine-smoke/styles.css +8969 -0
- package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +604 -0
- package/dist/experiments/ibm-plex-engine-smoke/tokens.json +217 -0
- package/dist/in-page-navigation.d.ts +7 -0
- package/dist/in-page-navigation.js +136 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +18 -0
- package/dist/interactive-feedback.d.ts +14 -0
- package/dist/interactive-feedback.js +96 -0
- package/dist/interactive-tables.d.ts +28 -0
- package/dist/interactive-tables.js +184 -0
- package/dist/list-tree.d.ts +4 -0
- package/dist/list-tree.js +44 -0
- package/dist/panel-drawer.d.ts +4 -0
- package/dist/panel-drawer.js +171 -0
- package/dist/presets/app-tier/styles.css +9459 -0
- package/dist/presets/app-tier/surfaces.json +1225 -0
- package/dist/presets/app-tier/tokens.json +221 -0
- package/dist/presets/prose/styles.css +9442 -0
- package/dist/presets/prose/surfaces.json +1225 -0
- package/dist/presets/prose/tokens.json +221 -0
- package/dist/presets.d.ts +6 -0
- package/dist/presets.js +27 -0
- package/dist/range-controls.d.ts +9 -0
- package/dist/range-controls.js +73 -0
- package/dist/resizable-aside.d.ts +4 -0
- package/dist/resizable-aside.js +328 -0
- package/dist/side-navigation.d.ts +4 -0
- package/dist/side-navigation.js +219 -0
- package/dist/styles.css +9442 -0
- package/dist/surfaces.json +1225 -0
- package/dist/tabs.d.ts +4 -0
- package/dist/tabs.js +88 -0
- package/dist/tier-registry.d.ts +10 -0
- package/dist/tier-registry.js +25 -0
- package/dist/tiers/app/styles.css +9459 -0
- package/dist/tiers/app/surfaces.json +1225 -0
- package/dist/tiers/app/tokens.json +221 -0
- package/dist/tiers/documentation/styles.css +9442 -0
- package/dist/tiers/documentation/surfaces.json +1225 -0
- package/dist/tiers/documentation/tokens.json +221 -0
- package/dist/tiers/editorial/styles.css +9442 -0
- package/dist/tiers/editorial/surfaces.json +1225 -0
- package/dist/tiers/editorial/tokens.json +221 -0
- package/dist/tiers/os/styles.css +9442 -0
- package/dist/tiers/os/surfaces.json +1225 -0
- package/dist/tiers/os/tokens.json +221 -0
- package/dist/tokens.json +221 -0
- package/dist/tooltip.d.ts +4 -0
- package/dist/tooltip.js +70 -0
- package/dist/top-navigation.d.ts +4 -0
- package/dist/top-navigation.js +354 -0
- package/dist/types.d.ts +155 -0
- package/dist/types.js +1 -0
- package/dist/vanilla-theme-colors.d.ts +5 -0
- package/dist/vanilla-theme-colors.js +208 -0
- package/docs/publishing.md +66 -0
- package/package.json +108 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small composition contracts for the first Vanilla Sites tranche.
|
|
3
|
+
*
|
|
4
|
+
* Vanilla's basic-section, cta-section and text-spotlight macros mostly
|
|
5
|
+
* compose existing section, rule, heading, copy and CTA primitives. This is
|
|
6
|
+
* intentionally not a macro compatibility layer: the styles below retain
|
|
7
|
+
* only the repeated structural geometry found in their rendered output.
|
|
8
|
+
*
|
|
9
|
+
* Vanilla → BF mapping:
|
|
10
|
+
* - 25/75 and 50/50 layouts use intrinsic one-/two-column grids and BF's
|
|
11
|
+
* existing gutter token instead of legacy span utility classes.
|
|
12
|
+
* - Pattern internals use nested stack gaps; complete patterns use an outer
|
|
13
|
+
* section stack.
|
|
14
|
+
* - Heading, paragraph, list, figure and CTA children retain only metric
|
|
15
|
+
* compensation.
|
|
16
|
+
*/
|
|
17
|
+
export declare function sitesFoundationCss(): string;
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small composition contracts for the first Vanilla Sites tranche.
|
|
3
|
+
*
|
|
4
|
+
* Vanilla's basic-section, cta-section and text-spotlight macros mostly
|
|
5
|
+
* compose existing section, rule, heading, copy and CTA primitives. This is
|
|
6
|
+
* intentionally not a macro compatibility layer: the styles below retain
|
|
7
|
+
* only the repeated structural geometry found in their rendered output.
|
|
8
|
+
*
|
|
9
|
+
* Vanilla → BF mapping:
|
|
10
|
+
* - 25/75 and 50/50 layouts use intrinsic one-/two-column grids and BF's
|
|
11
|
+
* existing gutter token instead of legacy span utility classes.
|
|
12
|
+
* - Pattern internals use nested stack gaps; complete patterns use an outer
|
|
13
|
+
* section stack.
|
|
14
|
+
* - Heading, paragraph, list, figure and CTA children retain only metric
|
|
15
|
+
* compensation.
|
|
16
|
+
*/
|
|
17
|
+
export function sitesFoundationCss() {
|
|
18
|
+
return `/* ------------------------------------------------------------------ */
|
|
19
|
+
/* Sites composition foundation — basic section, CTA and text spotlight. */
|
|
20
|
+
/* ------------------------------------------------------------------ */
|
|
21
|
+
|
|
22
|
+
/* Basic section: the top rule and the named header/content slots make the
|
|
23
|
+
composition legible without recreating the upstream Jinja item API. */
|
|
24
|
+
:where(.bf-theme) :where(.bf-basic-section) {
|
|
25
|
+
container-name: bf-basic-section;
|
|
26
|
+
container-type: inline-size;
|
|
27
|
+
margin-block-end: 0;
|
|
28
|
+
min-inline-size: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
:where(.bf-theme) :where(.bf-basic-section.is-shallow) {
|
|
32
|
+
margin-block-end: 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
:where(.bf-theme) :where(.bf-basic-section.is-deep) {
|
|
36
|
+
margin-block-end: 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
:where(.bf-theme) :where(.bf-basic-section-layout) {
|
|
40
|
+
display: grid;
|
|
41
|
+
grid-template-columns: minmax(0, 1fr);
|
|
42
|
+
min-inline-size: 0;
|
|
43
|
+
/* The rule already owns its half-rem trailing compensation. This structural
|
|
44
|
+
grid must not add the generic pattern-stack gap on top of it. */
|
|
45
|
+
row-gap: 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
:where(.bf-theme) :where(.bf-basic-section-rule) {
|
|
49
|
+
grid-column: 1 / -1;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
:where(.bf-theme) :where(.bf-basic-section-header, .bf-basic-section-content) {
|
|
53
|
+
min-inline-size: 0;
|
|
54
|
+
overflow-wrap: anywhere;
|
|
55
|
+
}
|
|
56
|
+
|
|
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) {
|
|
59
|
+
color: var(--bf-color-link-default);
|
|
60
|
+
text-decoration: none;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
:where(.bf-theme) :where(.bf-basic-section-title-link:hover) {
|
|
64
|
+
text-decoration: underline;
|
|
65
|
+
text-decoration-thickness: var(--bf-border-width);
|
|
66
|
+
text-underline-offset: 0.12em;
|
|
67
|
+
}
|
|
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
|
|
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) {
|
|
74
|
+
column-gap: var(--bf-grid-gap-inline);
|
|
75
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
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
|
+
/* CTA section: Vanilla's 25/75 variant is an offset content rail. The full
|
|
88
|
+
variant stays naturally full-width. Typography and action presentation are
|
|
89
|
+
supplied by real heading elements and bf-cta-block. */
|
|
90
|
+
:where(.bf-theme) :where(.bf-cta-section) {
|
|
91
|
+
container-name: bf-cta-section;
|
|
92
|
+
container-type: inline-size;
|
|
93
|
+
min-inline-size: 0;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
:where(.bf-theme) :where(.bf-cta-section-layout) {
|
|
97
|
+
display: grid;
|
|
98
|
+
grid-template-columns: minmax(0, 1fr);
|
|
99
|
+
min-inline-size: 0;
|
|
100
|
+
padding-block: calc(var(--bf-section-space-deep) / 2);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
:where(.bf-theme) :where(.bf-cta-section-content) {
|
|
104
|
+
min-inline-size: 0;
|
|
105
|
+
overflow-wrap: anywhere;
|
|
106
|
+
}
|
|
107
|
+
|
|
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
|
+
}
|
|
112
|
+
|
|
113
|
+
:where(.bf-theme) :where(.bf-cta-section.is-offset) :where(.bf-cta-section-layout) {
|
|
114
|
+
column-gap: var(--bf-grid-gap-inline);
|
|
115
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
:where(.bf-theme) :where(.bf-cta-section.is-offset) :where(.bf-cta-section-content) {
|
|
119
|
+
grid-column: 2;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* Text spotlight: a ruled title rail and two-to-seven prominent list items.
|
|
124
|
+
The ordered list itself is structural; each item uses a genuine BF heading
|
|
125
|
+
role and therefore keeps the correct tier-specific rhythm. */
|
|
126
|
+
:where(.bf-theme) :where(.bf-text-spotlight) {
|
|
127
|
+
container-name: bf-text-spotlight;
|
|
128
|
+
container-type: inline-size;
|
|
129
|
+
margin-block-end: 0;
|
|
130
|
+
min-inline-size: 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
:where(.bf-theme) :where(.bf-text-spotlight-layout) {
|
|
134
|
+
display: grid;
|
|
135
|
+
grid-template-columns: minmax(0, 1fr);
|
|
136
|
+
min-inline-size: 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
:where(.bf-theme) :where(.bf-text-spotlight-rule) {
|
|
140
|
+
grid-column: 1 / -1;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
:where(.bf-theme) :where(.bf-text-spotlight-header, .bf-text-spotlight-content) {
|
|
144
|
+
min-inline-size: 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
:where(.bf-theme) :where(.bf-text-spotlight-items) {
|
|
148
|
+
align-content: start;
|
|
149
|
+
display: grid;
|
|
150
|
+
list-style: none;
|
|
151
|
+
margin: 0;
|
|
152
|
+
padding: 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
:where(.bf-theme) :where(.bf-text-spotlight-item) {
|
|
156
|
+
align-content: start;
|
|
157
|
+
display: grid;
|
|
158
|
+
min-inline-size: 0;
|
|
159
|
+
overflow-wrap: anywhere;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
:where(.bf-theme) :where(.bf-text-spotlight-item) > :where(a) {
|
|
163
|
+
overflow-wrap: anywhere;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
@container bf-text-spotlight (width >= 64.75rem) {
|
|
167
|
+
:where(.bf-theme) :where(.bf-text-spotlight-layout) {
|
|
168
|
+
column-gap: var(--bf-grid-gap-inline);
|
|
169
|
+
grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
`;
|
|
173
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vanilla Sites parity: rich horizontal and rich vertical lists.
|
|
3
|
+
*
|
|
4
|
+
* These contracts preserve the current macros' rendered compositions without
|
|
5
|
+
* reproducing their Jinja slot API. The horizontal variant combines a title,
|
|
6
|
+
* optional media/description/logos, a responsive ruled list and CTA. The
|
|
7
|
+
* vertical variant is the selected media-object composition: structured BF
|
|
8
|
+
* content paired with one responsive image or video slot.
|
|
9
|
+
*
|
|
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 exits → BF's existing section tokens;
|
|
14
|
+
* - the 620px/1036px page breakpoints → 38.75rem/64.75rem container
|
|
15
|
+
* thresholds for descendants. Text roles keep their own metric-derived
|
|
16
|
+
* margins and baseline compensation in every tier.
|
|
17
|
+
*/
|
|
18
|
+
export declare function sitesRichListsCss(): string;
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vanilla Sites parity: rich horizontal and rich vertical lists.
|
|
3
|
+
*
|
|
4
|
+
* These contracts preserve the current macros' rendered compositions without
|
|
5
|
+
* reproducing their Jinja slot API. The horizontal variant combines a title,
|
|
6
|
+
* optional media/description/logos, a responsive ruled list and CTA. The
|
|
7
|
+
* vertical variant is the selected media-object composition: structured BF
|
|
8
|
+
* content paired with one responsive image or video slot.
|
|
9
|
+
*
|
|
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 exits → BF's existing section tokens;
|
|
14
|
+
* - the 620px/1036px page breakpoints → 38.75rem/64.75rem container
|
|
15
|
+
* thresholds for descendants. Text roles keep their own metric-derived
|
|
16
|
+
* margins and baseline compensation in every tier.
|
|
17
|
+
*/
|
|
18
|
+
export function sitesRichListsCss() {
|
|
19
|
+
return `/* ------------------------------------------------------------------ */
|
|
20
|
+
/* Sites rich lists — structural slots around existing BF primitives. */
|
|
21
|
+
/* ------------------------------------------------------------------ */
|
|
22
|
+
|
|
23
|
+
:where(.bf-theme) :where(.bf-rich-list) {
|
|
24
|
+
container-name: bf-rich-list;
|
|
25
|
+
container-type: inline-size;
|
|
26
|
+
min-inline-size: 0;
|
|
27
|
+
padding-block-end: calc(var(--bf-section-space) / 2);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
:where(.bf-theme) :where(.bf-rich-list.is-shallow) {
|
|
31
|
+
padding-block-end: var(--bf-section-space-shallow);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:where(.bf-theme) :where(.bf-rich-list.is-deep) {
|
|
35
|
+
padding-block-end: calc(var(--bf-section-space-deep) / 2);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
:where(.bf-theme) :where(.bf-rich-list-layout) {
|
|
39
|
+
display: grid;
|
|
40
|
+
grid-template-columns: minmax(0, 1fr);
|
|
41
|
+
min-inline-size: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
:where(.bf-theme) :where(.bf-rich-list-rule) {
|
|
45
|
+
grid-column: 1 / -1;
|
|
46
|
+
order: -2;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
:where(.bf-theme) :where(.bf-rich-list-header, .bf-rich-list-support, .bf-rich-list-content, .bf-rich-list-media, .bf-rich-list-list-slot, .bf-rich-list-cta) {
|
|
50
|
+
min-inline-size: 0;
|
|
51
|
+
overflow-wrap: anywhere;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@media (width >= 64.75rem) {
|
|
55
|
+
:where(.bf-theme) :where(.bf-rich-list:not(.is-shallow)) {
|
|
56
|
+
padding-block-end: var(--bf-section-space);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:where(.bf-theme) :where(.bf-rich-list.is-deep) {
|
|
60
|
+
padding-block-end: var(--bf-section-space-deep);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ------------------------------------------------------------------ */
|
|
65
|
+
/* Horizontal: the full composition remains stacked. The 50/50 variant */
|
|
66
|
+
/* places title and support in equal logical rails at the large split. */
|
|
67
|
+
/* ------------------------------------------------------------------ */
|
|
68
|
+
|
|
69
|
+
:where(.bf-theme) :where(.bf-rich-list.is-horizontal) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-visual, .bf-rich-list-header, .bf-rich-list-support, .bf-rich-list-list-slot, .bf-rich-list-cta-rule) {
|
|
70
|
+
grid-column: 1 / -1;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
:where(.bf-theme) :where(.bf-rich-list-visual) {
|
|
74
|
+
min-inline-size: 0;
|
|
75
|
+
overflow: hidden;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
:where(.bf-theme) :where(.bf-rich-list-visual > :where(img, picture, svg, video, canvas)) {
|
|
79
|
+
block-size: auto;
|
|
80
|
+
display: block;
|
|
81
|
+
inline-size: 100%;
|
|
82
|
+
max-inline-size: 100%;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* A full-width ratio inside a fluid Sites rail otherwise leaves the next
|
|
86
|
+
heading on a fractional pixel. The visual alone absorbs the trailing
|
|
87
|
+
compensation; semantic children retain their own margins unchanged. */
|
|
88
|
+
@supports (block-size: calc-size(auto, round(up, size, 1px))) {
|
|
89
|
+
:where(.bf-theme) :where(.bf-rich-list-visual > .bf-aspect) {
|
|
90
|
+
block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
:where(.bf-theme) :where(.bf-rich-list-list-slot) {
|
|
95
|
+
container-name: bf-rich-horizontal-items;
|
|
96
|
+
container-type: inline-size;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
:where(.bf-theme) :where(.bf-rich-list-list) {
|
|
100
|
+
display: grid;
|
|
101
|
+
grid-template-columns: minmax(0, 1fr);
|
|
102
|
+
list-style: none;
|
|
103
|
+
margin: 0;
|
|
104
|
+
min-inline-size: 0;
|
|
105
|
+
padding: 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* Vanilla gives every horizontal-list row a continuous leading divider. */
|
|
109
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item {
|
|
110
|
+
margin: 0;
|
|
111
|
+
padding-block: var(--bf-space-1) var(--bf-space-2);
|
|
112
|
+
position: relative;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item::after {
|
|
116
|
+
background: var(--bf-color-border-low-contrast);
|
|
117
|
+
block-size: var(--bf-border-width);
|
|
118
|
+
content: "";
|
|
119
|
+
inset-block-start: 0;
|
|
120
|
+
inset-inline-start: 0;
|
|
121
|
+
inline-size: 100%;
|
|
122
|
+
position: absolute;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/* Prefixes are logical here even though the shared list predates BF's
|
|
126
|
+
logical-property rule. This keeps ticks, bullets and numbers RTL-safe. */
|
|
127
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed) {
|
|
128
|
+
padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:is(.is-ticked, .is-crossed)::before {
|
|
132
|
+
inset: auto;
|
|
133
|
+
inset-inline-start: 0;
|
|
134
|
+
inset-block-start: calc(var(--bf-body-nudge-start) + var(--bf-space-1));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
:where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item) {
|
|
138
|
+
padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
:where(.bf-theme) :where(.bf-rich-list-list.is-bulleted) > :where(.bf-list-item)::before {
|
|
142
|
+
color: var(--bf-color-text-default);
|
|
143
|
+
content: "•";
|
|
144
|
+
inline-size: var(--bf-leading-icon-size);
|
|
145
|
+
inset-block-start: var(--bf-space-1);
|
|
146
|
+
inset-inline-start: 0;
|
|
147
|
+
position: absolute;
|
|
148
|
+
text-align: center;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
:where(.bf-theme) :where(ol.bf-rich-list-list) {
|
|
152
|
+
counter-reset: bf-rich-horizontal-counter;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
:where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item) {
|
|
156
|
+
counter-increment: bf-rich-horizontal-counter;
|
|
157
|
+
padding-inline-start: calc(var(--bf-leading-icon-size) + var(--bf-leading-icon-gap));
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
:where(.bf-theme) :where(ol.bf-rich-list-list) > :where(.bf-list-item)::before {
|
|
161
|
+
color: var(--bf-color-text-default);
|
|
162
|
+
content: counter(bf-rich-horizontal-counter) ".";
|
|
163
|
+
inline-size: var(--bf-leading-icon-size);
|
|
164
|
+
inset-block-start: var(--bf-space-1);
|
|
165
|
+
inset-inline-start: 0;
|
|
166
|
+
position: absolute;
|
|
167
|
+
text-align: end;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Vanilla's list measures are content-derived: one column below 66ch, two
|
|
171
|
+
from 66ch, and four from 100ch. Pseudo-rules span the complete row. */
|
|
172
|
+
@container bf-rich-horizontal-items (width >= 66ch) {
|
|
173
|
+
:where(.bf-theme) :where(.bf-rich-list-list) {
|
|
174
|
+
column-gap: var(--bf-grid-gap-inline);
|
|
175
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item::after {
|
|
179
|
+
content: none;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:nth-child(2n + 1)::after {
|
|
183
|
+
content: "";
|
|
184
|
+
inline-size: calc(200% + var(--bf-grid-gap-inline));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
@container bf-rich-horizontal-items (width >= 100ch) {
|
|
189
|
+
:where(.bf-theme) :where(.bf-rich-list-list) {
|
|
190
|
+
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item::after,
|
|
194
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:nth-child(2n + 1)::after {
|
|
195
|
+
content: none;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
:where(.bf-theme) :where(.bf-rich-list-list) > .bf-list-item:nth-child(4n + 1)::after {
|
|
199
|
+
content: "";
|
|
200
|
+
inline-size: calc(400% + (var(--bf-grid-gap-inline) * 3));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
@container bf-rich-list (width >= 64.75rem) {
|
|
205
|
+
:where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) {
|
|
206
|
+
column-gap: var(--bf-grid-gap-inline);
|
|
207
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
:where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-header) {
|
|
211
|
+
grid-column: 1;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
:where(.bf-theme) :where(.bf-rich-list.is-horizontal.is-50-50) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-support) {
|
|
215
|
+
grid-column: 2;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
:where(.bf-theme) :where(.bf-rich-list.is-horizontal) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-cta) {
|
|
219
|
+
grid-column: 2;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/* ------------------------------------------------------------------ */
|
|
224
|
+
/* Vertical: a rich media object, not a Jinja content-block adapter. */
|
|
225
|
+
/* ------------------------------------------------------------------ */
|
|
226
|
+
|
|
227
|
+
:where(.bf-theme) :where(.bf-rich-list.is-vertical) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-rule) {
|
|
228
|
+
grid-column: 1 / -1;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
:where(.bf-theme) :where(.bf-rich-list.is-vertical) :where(.bf-rich-list-media) {
|
|
232
|
+
container-type: inline-size;
|
|
233
|
+
padding-block-end: var(--bf-section-space-shallow);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
:where(.bf-theme) :where(.bf-rich-list.is-vertical.is-flipped) :where(.bf-rich-list-media) {
|
|
237
|
+
order: -1;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
:where(.bf-theme) :where(.bf-rich-list-media-frame) {
|
|
241
|
+
aspect-ratio: 3 / 2;
|
|
242
|
+
display: block;
|
|
243
|
+
inline-size: 100%;
|
|
244
|
+
max-inline-size: 100%;
|
|
245
|
+
overflow: hidden;
|
|
246
|
+
position: relative;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/* The media object deliberately stretches across fluid 1/2 and 2/3 ratios.
|
|
250
|
+
Snap that resulting block, rather than resetting content spacing, so each
|
|
251
|
+
tier's baseline survives both portrait and landscape allocations. */
|
|
252
|
+
@supports (block-size: calc-size(auto, round(up, size, 1px))) {
|
|
253
|
+
:where(.bf-theme) :where(.bf-rich-list-media-frame) {
|
|
254
|
+
block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-narrow-3-2) :where(.bf-rich-list-media-frame) {
|
|
259
|
+
aspect-ratio: 3 / 2;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-narrow-16-9) :where(.bf-rich-list-media-frame),
|
|
263
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-video) :where(.bf-rich-list-media-frame) {
|
|
264
|
+
aspect-ratio: 16 / 9;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-narrow-square) :where(.bf-rich-list-media-frame) {
|
|
268
|
+
aspect-ratio: 1 / 1;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
:where(.bf-theme) :where(.bf-rich-list-media > .bf-rich-list-media-frame > :where(img, picture, svg, video, canvas, iframe)) {
|
|
272
|
+
block-size: 100%;
|
|
273
|
+
border: 0;
|
|
274
|
+
display: block;
|
|
275
|
+
inline-size: 100%;
|
|
276
|
+
max-inline-size: 100%;
|
|
277
|
+
object-fit: cover;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
:where(.bf-theme) :where(.bf-rich-list-media > .bf-rich-list-media-frame > :where(picture) > :where(img)) {
|
|
281
|
+
block-size: 100%;
|
|
282
|
+
display: block;
|
|
283
|
+
inline-size: 100%;
|
|
284
|
+
object-fit: cover;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-contain > .bf-rich-list-media-frame > :where(img, svg, video, canvas)),
|
|
288
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-contain > .bf-rich-list-media-frame > :where(picture) > :where(img)) {
|
|
289
|
+
object-fit: contain;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/* Auto height has no shallow media wrapper in Vanilla. At narrow widths it
|
|
293
|
+
remains a normal 3:2 frame; at the wide split it stretches with the content
|
|
294
|
+
rail, clamped between the equivalent 16:9 and 2:3 heights. */
|
|
295
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) {
|
|
296
|
+
padding-block-end: 0;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
@container bf-rich-list (width >= 64.75rem) {
|
|
300
|
+
:where(.bf-theme) :where(.bf-rich-list.is-vertical) > :where(.bf-rich-list-layout) {
|
|
301
|
+
align-items: stretch;
|
|
302
|
+
column-gap: var(--bf-grid-gap-inline);
|
|
303
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
:where(.bf-theme) :where(.bf-rich-list.is-vertical) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-content) {
|
|
307
|
+
grid-column: 1;
|
|
308
|
+
grid-row: 2;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
:where(.bf-theme) :where(.bf-rich-list.is-vertical) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-media) {
|
|
312
|
+
grid-column: 2;
|
|
313
|
+
grid-row: 2;
|
|
314
|
+
order: 0;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
:where(.bf-theme) :where(.bf-rich-list.is-vertical.is-flipped) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-content) {
|
|
318
|
+
grid-column: 2;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
:where(.bf-theme) :where(.bf-rich-list.is-vertical.is-flipped) > :where(.bf-rich-list-layout) > :where(.bf-rich-list-media) {
|
|
322
|
+
grid-column: 1;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-wide-16-9) :where(.bf-rich-list-media-frame) {
|
|
326
|
+
aspect-ratio: 16 / 9;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-wide-3-2) :where(.bf-rich-list-media-frame) {
|
|
330
|
+
aspect-ratio: 3 / 2;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-wide-square) :where(.bf-rich-list-media-frame) {
|
|
334
|
+
aspect-ratio: 1 / 1;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-wide-2-3) :where(.bf-rich-list-media-frame) {
|
|
338
|
+
aspect-ratio: 2 / 3;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) :where(.bf-rich-list-media-frame) {
|
|
342
|
+
aspect-ratio: auto;
|
|
343
|
+
block-size: 100%;
|
|
344
|
+
max-block-size: 150cqi;
|
|
345
|
+
min-block-size: 56.25cqi;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
@supports (min-block-size: round(up, 1px, 1px)) {
|
|
349
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-auto-height) :where(.bf-rich-list-media-frame) {
|
|
350
|
+
max-block-size: round(down, 150cqi, var(--bf-baseline));
|
|
351
|
+
min-block-size: round(up, 56.25cqi, var(--bf-baseline));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/* Vanilla's auto-height image is absolutely positioned inside the clamped
|
|
356
|
+
frame. Removing intrinsic media from track sizing lets the content rail
|
|
357
|
+
determine the shared row before the 16:9/2:3 clamps are applied. */
|
|
358
|
+
:where(.bf-theme) :where(.bf-rich-list-media.is-auto-height > .bf-rich-list-media-frame > :where(img, picture, svg, video, canvas, iframe)) {
|
|
359
|
+
inset: 0;
|
|
360
|
+
position: absolute;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
`;
|
|
364
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static Vanilla parity ports: data spotlight and divided section. The
|
|
3
|
+
* 38.75rem and 64.75rem container thresholds preserve Vanilla's 620px and
|
|
4
|
+
* 1036px composition changes while allowing the patterns to respond to their
|
|
5
|
+
* allocated inline size.
|
|
6
|
+
*
|
|
7
|
+
* Vanilla → BF token mapping:
|
|
8
|
+
* - `$spv--strip-shallow` (1.5rem) → `--bf-section-space-shallow`.
|
|
9
|
+
* - Vanilla grid gutters → `--bf-grid-gap-inline`.
|
|
10
|
+
* - Data-spotlight statistics and headlines → the public `h1` and `h3` roles.
|
|
11
|
+
* The slots own that mapping so consumers do not need companion utility
|
|
12
|
+
* classes to receive correct four-tier typography.
|
|
13
|
+
*/
|
|
14
|
+
export declare function staticContentPortsCss(): string;
|