baseline-foundry 0.1.3 → 0.1.4
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/README.md +568 -552
- package/config/experiments/ibm-plex-engine-smoke.json +115 -115
- package/config/experiments/ubuntu-engine-smoke.json +115 -115
- package/config/foundation-theme.json +110 -110
- package/config/tiers/app.json +116 -116
- package/config/tiers/documentation.json +116 -116
- package/config/tiers/editorial.json +116 -116
- package/config/tiers/os.json +116 -116
- package/dist/baseline-grid-overlay.js +43 -43
- package/dist/css-app-tier.js +73 -73
- package/dist/css-components/article-pagination.js +140 -140
- package/dist/css-components/button-actions.js +161 -161
- package/dist/css-components/cards-options.js +176 -176
- package/dist/css-components/chip-badge-status.js +158 -158
- package/dist/css-components/content-card.js +490 -490
- package/dist/css-components/control-row.js +14 -14
- package/dist/css-components/cta-figure-aspect.js +120 -120
- package/dist/css-components/document-navigation.js +390 -390
- package/dist/css-components/editorial-content.js +42 -42
- package/dist/css-components/icon.js +72 -72
- package/dist/css-components/interactive-feedback.js +217 -217
- package/dist/css-components/interactive-tables.js +155 -155
- package/dist/css-components/legacy-navigation.d.ts +9 -0
- package/dist/css-components/legacy-navigation.js +763 -0
- package/dist/css-components/linked-logo-site-layout.js +177 -177
- package/dist/css-components/list-tree.js +94 -94
- package/dist/css-components/logo-media.js +201 -201
- package/dist/css-components/navigation-layout.js +144 -144
- package/dist/css-components/panel.js +144 -144
- package/dist/css-components/search-box-and-filter.js +263 -263
- package/dist/css-components/sites-editorial-ports.js +243 -243
- package/dist/css-components/sites-foundation.js +146 -146
- package/dist/css-components/sites-rich-lists.js +344 -344
- package/dist/css-components/static-content-ports.js +182 -182
- package/dist/css-components/tab-section.js +82 -82
- package/dist/css-components/table.js +75 -75
- package/dist/css-components/tabs-choice-breadcrumbs.js +303 -303
- package/dist/css-components/tiered-list-equal-height-row.js +271 -271
- package/dist/css-components.js +1791 -2542
- package/dist/css-grid.js +172 -172
- package/dist/css.js +240 -240
- package/docs/publishing.md +30 -13
- package/package.json +119 -108
|
@@ -3,149 +3,149 @@
|
|
|
3
3
|
* primitives without changing their interaction ownership.
|
|
4
4
|
*/
|
|
5
5
|
export function navigationLayoutCss() {
|
|
6
|
-
return `/* ------------------------------------------------------------------ */
|
|
7
|
-
/* Navigation layout and page shell */
|
|
8
|
-
/* ------------------------------------------------------------------ */
|
|
9
|
-
|
|
10
|
-
/* The row is only a layout owner. Interactive children own the occupied
|
|
11
|
-
* block; row padding would leave an unpainted strip below their highlights. */
|
|
12
|
-
:where(.bf-theme) :where(.bf-top-navigation-row) {
|
|
13
|
-
padding-block: 0;
|
|
14
|
-
}
|
|
15
|
-
|
|
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
|
|
19
|
-
* tag must not stretch to the full occupied navigation row. */
|
|
20
|
-
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) {
|
|
21
|
-
min-inline-size: 0;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) > :where(.bf-top-navigation-link) {
|
|
25
|
-
align-items: start;
|
|
26
|
-
column-gap: 0;
|
|
27
|
-
display: inline-flex;
|
|
28
|
-
inline-size: 100%;
|
|
29
|
-
justify-content: flex-start;
|
|
30
|
-
padding-block: 0;
|
|
31
|
-
padding-inline: 0;
|
|
32
|
-
padding-inline-start: calc(var(--bf-top-navigation-logo-tag-inline-size) + var(--bf-top-navigation-logo-tag-gap));
|
|
33
|
-
position: relative;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) :where(.bf-top-navigation-logo-tag) {
|
|
37
|
-
align-items: flex-end;
|
|
38
|
-
background: var(--bf-color-brand);
|
|
39
|
-
block-size: var(--bf-top-navigation-logo-tag-block-size);
|
|
40
|
-
box-sizing: border-box;
|
|
41
|
-
display: flex;
|
|
42
|
-
inline-size: var(--bf-top-navigation-logo-tag-inline-size);
|
|
43
|
-
inset-block-start: 0;
|
|
44
|
-
inset-inline-start: 0;
|
|
45
|
-
justify-content: center;
|
|
46
|
-
padding-block: 0 var(--bf-top-navigation-logo-icon-bottom-offset);
|
|
47
|
-
padding-inline: 0;
|
|
48
|
-
position: absolute;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) ~ :where(.bf-top-navigation-list.is-banner-actions) :where(.bf-top-navigation-menu-toggle, .bf-top-navigation-search-toggle),
|
|
52
|
-
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-nav) :where(.bf-top-navigation-link, .bf-top-navigation-search-toggle) {
|
|
53
|
-
block-size: 100%;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) :where(.bf-top-navigation-logo-icon) {
|
|
57
|
-
block-size: var(--bf-top-navigation-logo-icon-size);
|
|
58
|
-
display: block;
|
|
59
|
-
flex: 0 0 auto;
|
|
60
|
-
inline-size: var(--bf-top-navigation-logo-icon-size);
|
|
61
|
-
transform: translateX(var(--bf-top-navigation-logo-icon-optical-offset-inline));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) :where(.bf-top-navigation-logo-title) {
|
|
65
|
-
align-self: start;
|
|
66
|
-
color: var(--bf-color-text-default);
|
|
67
|
-
font-size: var(--bf-top-navigation-logo-title-font-size, var(--bf-body-font-size, 1rem));
|
|
68
|
-
font-weight: 300;
|
|
69
|
-
line-height: var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5));
|
|
70
|
-
overflow: visible;
|
|
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. */
|
|
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)
|
|
79
|
-
- (var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5rem)) / 2)
|
|
80
|
-
);
|
|
81
|
-
text-overflow: clip;
|
|
82
|
-
white-space: normal;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/* A grid-aligned header uses the same eight tracks and gutter as page content.
|
|
86
|
-
* The brand/banner owns columns one and two; primary navigation starts at
|
|
87
|
-
* column three. No independent brand-width token can drift from that grid. */
|
|
88
|
-
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) {
|
|
89
|
-
container-type: inline-size;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
@media (min-width: 64.75rem) {
|
|
93
|
-
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-row) {
|
|
94
|
-
column-gap: var(--bf-grid-gap-inline);
|
|
95
|
-
display: grid;
|
|
96
|
-
grid-template-columns: repeat(8, minmax(0, 1fr));
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-banner) {
|
|
100
|
-
grid-column: 1 / span 2;
|
|
101
|
-
min-inline-size: 0;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-nav) {
|
|
105
|
-
grid-column: 3 / -1;
|
|
106
|
-
min-inline-size: 0;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-dropdown) {
|
|
110
|
-
top: 100%;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/* Documentation composition stays single-column until its own container can
|
|
115
|
-
* support the intentional 2/6 navigation/content split. The optional
|
|
116
|
-
* navigation slot never creates a mobile rail. */
|
|
117
|
-
:where(.bf-theme) :where(.bf-docs-layout) {
|
|
118
|
-
align-items: start;
|
|
119
|
-
column-gap: var(--bf-grid-gap-inline);
|
|
120
|
-
container-type: inline-size;
|
|
121
|
-
display: grid;
|
|
122
|
-
grid-template-columns: repeat(8, minmax(0, 1fr));
|
|
123
|
-
min-inline-size: 0;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
:where(.bf-theme) :where(.bf-docs-layout-navigation, .bf-docs-layout-content) {
|
|
127
|
-
grid-column: 1 / -1;
|
|
128
|
-
min-inline-size: 0;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
@media (min-width: 64.75rem) {
|
|
132
|
-
@container (width >= 38.75rem) {
|
|
133
|
-
:where(.bf-theme) :where(.bf-docs-layout:has(> .bf-docs-layout-navigation)) > :where(.bf-docs-layout-navigation) {
|
|
134
|
-
grid-column: span 2;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
:where(.bf-theme) :where(.bf-docs-layout:has(> .bf-docs-layout-navigation)) > :where(.bf-docs-layout-content) {
|
|
138
|
-
grid-column: span 6;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/* This is deliberately scoped to an explicit page shell. Importing a BF tier
|
|
144
|
-
* alone never changes the consuming document body's user-agent margin. */
|
|
145
|
-
:where(body.bf-theme.bf-page-shell) {
|
|
146
|
-
background: var(--bf-color-background-default);
|
|
147
|
-
margin: 0;
|
|
148
|
-
min-block-size: 100dvb;
|
|
149
|
-
}
|
|
6
|
+
return `/* ------------------------------------------------------------------ */
|
|
7
|
+
/* Navigation layout and page shell */
|
|
8
|
+
/* ------------------------------------------------------------------ */
|
|
9
|
+
|
|
10
|
+
/* The row is only a layout owner. Interactive children own the occupied
|
|
11
|
+
* block; row padding would leave an unpainted strip below their highlights. */
|
|
12
|
+
:where(.bf-theme) :where(.bf-top-navigation-row) {
|
|
13
|
+
padding-block: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
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
|
|
19
|
+
* tag must not stretch to the full occupied navigation row. */
|
|
20
|
+
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) {
|
|
21
|
+
min-inline-size: 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) > :where(.bf-top-navigation-link) {
|
|
25
|
+
align-items: start;
|
|
26
|
+
column-gap: 0;
|
|
27
|
+
display: inline-flex;
|
|
28
|
+
inline-size: 100%;
|
|
29
|
+
justify-content: flex-start;
|
|
30
|
+
padding-block: 0;
|
|
31
|
+
padding-inline: 0;
|
|
32
|
+
padding-inline-start: calc(var(--bf-top-navigation-logo-tag-inline-size) + var(--bf-top-navigation-logo-tag-gap));
|
|
33
|
+
position: relative;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) :where(.bf-top-navigation-logo-tag) {
|
|
37
|
+
align-items: flex-end;
|
|
38
|
+
background: var(--bf-color-brand);
|
|
39
|
+
block-size: var(--bf-top-navigation-logo-tag-block-size);
|
|
40
|
+
box-sizing: border-box;
|
|
41
|
+
display: flex;
|
|
42
|
+
inline-size: var(--bf-top-navigation-logo-tag-inline-size);
|
|
43
|
+
inset-block-start: 0;
|
|
44
|
+
inset-inline-start: 0;
|
|
45
|
+
justify-content: center;
|
|
46
|
+
padding-block: 0 var(--bf-top-navigation-logo-icon-bottom-offset);
|
|
47
|
+
padding-inline: 0;
|
|
48
|
+
position: absolute;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) ~ :where(.bf-top-navigation-list.is-banner-actions) :where(.bf-top-navigation-menu-toggle, .bf-top-navigation-search-toggle),
|
|
52
|
+
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-nav) :where(.bf-top-navigation-link, .bf-top-navigation-search-toggle) {
|
|
53
|
+
block-size: 100%;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) :where(.bf-top-navigation-logo-icon) {
|
|
57
|
+
block-size: var(--bf-top-navigation-logo-icon-size);
|
|
58
|
+
display: block;
|
|
59
|
+
flex: 0 0 auto;
|
|
60
|
+
inline-size: var(--bf-top-navigation-logo-icon-size);
|
|
61
|
+
transform: translateX(var(--bf-top-navigation-logo-icon-optical-offset-inline));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
:where(.bf-theme) :where(.bf-top-navigation-logo.is-canonical-tagged) :where(.bf-top-navigation-logo-title) {
|
|
65
|
+
align-self: start;
|
|
66
|
+
color: var(--bf-color-text-default);
|
|
67
|
+
font-size: var(--bf-top-navigation-logo-title-font-size, var(--bf-body-font-size, 1rem));
|
|
68
|
+
font-weight: 300;
|
|
69
|
+
line-height: var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5));
|
|
70
|
+
overflow: visible;
|
|
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. */
|
|
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)
|
|
79
|
+
- (var(--bf-top-navigation-logo-title-line-height, var(--bf-body-line-height, 1.5rem)) / 2)
|
|
80
|
+
);
|
|
81
|
+
text-overflow: clip;
|
|
82
|
+
white-space: normal;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* A grid-aligned header uses the same eight tracks and gutter as page content.
|
|
86
|
+
* The brand/banner owns columns one and two; primary navigation starts at
|
|
87
|
+
* column three. No independent brand-width token can drift from that grid. */
|
|
88
|
+
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) {
|
|
89
|
+
container-type: inline-size;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@media (min-width: 64.75rem) {
|
|
93
|
+
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-row) {
|
|
94
|
+
column-gap: var(--bf-grid-gap-inline);
|
|
95
|
+
display: grid;
|
|
96
|
+
grid-template-columns: repeat(8, minmax(0, 1fr));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-banner) {
|
|
100
|
+
grid-column: 1 / span 2;
|
|
101
|
+
min-inline-size: 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-nav) {
|
|
105
|
+
grid-column: 3 / -1;
|
|
106
|
+
min-inline-size: 0;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
:where(.bf-theme) :where(.bf-top-navigation.is-grid-aligned) :where(.bf-top-navigation-dropdown) {
|
|
110
|
+
top: 100%;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Documentation composition stays single-column until its own container can
|
|
115
|
+
* support the intentional 2/6 navigation/content split. The optional
|
|
116
|
+
* navigation slot never creates a mobile rail. */
|
|
117
|
+
:where(.bf-theme) :where(.bf-docs-layout) {
|
|
118
|
+
align-items: start;
|
|
119
|
+
column-gap: var(--bf-grid-gap-inline);
|
|
120
|
+
container-type: inline-size;
|
|
121
|
+
display: grid;
|
|
122
|
+
grid-template-columns: repeat(8, minmax(0, 1fr));
|
|
123
|
+
min-inline-size: 0;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
:where(.bf-theme) :where(.bf-docs-layout-navigation, .bf-docs-layout-content) {
|
|
127
|
+
grid-column: 1 / -1;
|
|
128
|
+
min-inline-size: 0;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
@media (min-width: 64.75rem) {
|
|
132
|
+
@container (width >= 38.75rem) {
|
|
133
|
+
:where(.bf-theme) :where(.bf-docs-layout:has(> .bf-docs-layout-navigation)) > :where(.bf-docs-layout-navigation) {
|
|
134
|
+
grid-column: span 2;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
:where(.bf-theme) :where(.bf-docs-layout:has(> .bf-docs-layout-navigation)) > :where(.bf-docs-layout-content) {
|
|
138
|
+
grid-column: span 6;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* This is deliberately scoped to an explicit page shell. Importing a BF tier
|
|
144
|
+
* alone never changes the consuming document body's user-agent margin. */
|
|
145
|
+
:where(body.bf-theme.bf-page-shell) {
|
|
146
|
+
background: var(--bf-color-background-default);
|
|
147
|
+
margin: 0;
|
|
148
|
+
min-block-size: 100dvb;
|
|
149
|
+
}
|
|
150
150
|
`;
|
|
151
151
|
}
|
|
@@ -1,148 +1,148 @@
|
|
|
1
1
|
export function panelCss(options) {
|
|
2
2
|
const { bodyTypeStyles, h4TypeStyles } = options;
|
|
3
|
-
return `:where(.bf-theme) :where(.bf-panel) {
|
|
4
|
-
background: var(--bf-color-background-default);
|
|
5
|
-
color: var(--bf-color-text-default);
|
|
6
|
-
display: flex;
|
|
7
|
-
flex-direction: column;
|
|
8
|
-
inline-size: 100%;
|
|
9
|
-
max-inline-size: 100%;
|
|
10
|
-
min-block-size: 0;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
:where(.bf-theme) :where(.bf-panel.is-fill) {
|
|
14
|
-
block-size: 100%;
|
|
15
|
-
max-inline-size: none;
|
|
16
|
-
min-block-size: 0;
|
|
17
|
-
resize: none;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
:where(.bf-theme) :where(.bf-panel.is-fill) > :where(.bf-panel-content) {
|
|
21
|
-
min-block-size: 0;
|
|
22
|
-
overflow: auto;
|
|
23
|
-
overscroll-behavior: contain;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
:where(.bf-theme) :where(.bf-panel-header) {
|
|
27
|
-
align-items: start;
|
|
28
|
-
display: flex;
|
|
29
|
-
flex-wrap: wrap;
|
|
30
|
-
gap: var(--bf-field-gap);
|
|
31
|
-
justify-content: space-between;
|
|
32
|
-
padding-block-end: var(--bf-panel-padding-block);
|
|
33
|
-
padding-block-start: var(--bf-panel-padding-block);
|
|
34
|
-
padding-inline: var(--bf-panel-padding-inline);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/* A navigation brand keeps the Canonical tag attached to the panel's top edge
|
|
38
|
-
* while sharing the panel-content inline inset used by the opposing main
|
|
39
|
-
* region. Ordinary content-panel headers retain their complete padding. */
|
|
40
|
-
:where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) {
|
|
41
|
-
gap: 0;
|
|
42
|
-
padding-block: 0;
|
|
43
|
-
padding-inline-end: 0;
|
|
44
|
-
padding-inline-start: var(--bf-panel-padding-inline);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
:where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
|
|
48
|
-
inline-size: 100%;
|
|
49
|
-
}
|
|
50
|
-
|
|
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
|
-
:where(.bf-theme) :where(.bf-panel-header) > :where(.bf-panel-title) {
|
|
56
|
-
min-inline-size: 0;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
:where(.bf-theme) :where(.bf-panel-header.is-sticky) {
|
|
60
|
-
background: var(--bf-color-background-default);
|
|
61
|
-
position: sticky;
|
|
62
|
-
top: 0;
|
|
63
|
-
z-index: 5;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/* Panel chrome that remains outside the panel's scrolling content. */
|
|
67
|
-
:where(.bf-theme) :where(.bf-panel-footer) {
|
|
68
|
-
align-items: center;
|
|
69
|
-
border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
|
|
70
|
-
display: flex;
|
|
71
|
-
flex: 0 0 auto;
|
|
72
|
-
flex-wrap: wrap;
|
|
73
|
-
gap: var(--bf-field-gap);
|
|
74
|
-
justify-content: space-between;
|
|
75
|
-
min-block-size: calc(var(--bf-control-box-size-compact) + (var(--bf-panel-padding-block) * 2));
|
|
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);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
:where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
|
|
82
|
-
background: var(--bf-color-background-default);
|
|
83
|
-
bottom: 0;
|
|
84
|
-
position: sticky;
|
|
85
|
-
z-index: 5;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
:where(.bf-theme) :where(.bf-panel-title) {
|
|
89
|
-
${h4TypeStyles} margin: 0 0 var(--bf-h4-margin-bottom);
|
|
90
|
-
min-inline-size: 0;
|
|
91
|
-
padding-block-end: 0;
|
|
92
|
-
padding-block-start: var(--bf-h4-nudge-start);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
:where(.bf-theme) :where(.bf-panel-controls) {
|
|
96
|
-
align-items: start;
|
|
97
|
-
display: flex;
|
|
98
|
-
flex-wrap: wrap;
|
|
99
|
-
gap: var(--bf-field-gap);
|
|
100
|
-
margin-inline-start: auto;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
:where(.bf-theme) :where(.bf-panel-toggle) {
|
|
104
|
-
${bodyTypeStyles} align-items: center;
|
|
105
|
-
appearance: none;
|
|
106
|
-
background: transparent;
|
|
107
|
-
border: 0;
|
|
108
|
-
color: var(--bf-color-text-default);
|
|
109
|
-
cursor: pointer;
|
|
110
|
-
display: inline-flex;
|
|
111
|
-
gap: calc(var(--bf-baseline) * 0.5);
|
|
112
|
-
justify-content: flex-start;
|
|
113
|
-
margin: 0;
|
|
114
|
-
min-block-size: var(--bf-control-box-size-compact);
|
|
115
|
-
min-inline-size: 0;
|
|
116
|
-
padding-block: var(--bf-control-block-padding-compact);
|
|
117
|
-
padding-inline: 0;
|
|
118
|
-
text-align: left;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
:where(.bf-theme) :where(.bf-panel-toggle:hover) {
|
|
122
|
-
color: var(--bf-color-link-default);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
:where(.bf-theme) :where(.bf-panel-toggle:focus:not(:focus-visible)) {
|
|
126
|
-
outline: none;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
:where(.bf-theme) :where(.bf-panel-toggle:focus-visible) {
|
|
130
|
-
outline: 2px solid var(--bf-color-focus);
|
|
131
|
-
outline-offset: 2px;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
:where(.bf-theme) :where(.bf-panel-content) {
|
|
135
|
-
flex: 1 1 auto;
|
|
136
|
-
min-block-size: 0;
|
|
137
|
-
padding-block-end: var(--bf-panel-padding-block);
|
|
138
|
-
padding-block-start: var(--bf-panel-padding-block);
|
|
139
|
-
padding-inline: var(--bf-panel-padding-inline);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
:where(.bf-theme) :where(.bf-panel-content.is-flush) {
|
|
143
|
-
padding-block: 0;
|
|
144
|
-
padding-inline: 0;
|
|
145
|
-
}
|
|
146
|
-
|
|
3
|
+
return `:where(.bf-theme) :where(.bf-panel) {
|
|
4
|
+
background: var(--bf-color-background-default);
|
|
5
|
+
color: var(--bf-color-text-default);
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
inline-size: 100%;
|
|
9
|
+
max-inline-size: 100%;
|
|
10
|
+
min-block-size: 0;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
:where(.bf-theme) :where(.bf-panel.is-fill) {
|
|
14
|
+
block-size: 100%;
|
|
15
|
+
max-inline-size: none;
|
|
16
|
+
min-block-size: 0;
|
|
17
|
+
resize: none;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
:where(.bf-theme) :where(.bf-panel.is-fill) > :where(.bf-panel-content) {
|
|
21
|
+
min-block-size: 0;
|
|
22
|
+
overflow: auto;
|
|
23
|
+
overscroll-behavior: contain;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
:where(.bf-theme) :where(.bf-panel-header) {
|
|
27
|
+
align-items: start;
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-wrap: wrap;
|
|
30
|
+
gap: var(--bf-field-gap);
|
|
31
|
+
justify-content: space-between;
|
|
32
|
+
padding-block-end: var(--bf-panel-padding-block);
|
|
33
|
+
padding-block-start: var(--bf-panel-padding-block);
|
|
34
|
+
padding-inline: var(--bf-panel-padding-inline);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* A navigation brand keeps the Canonical tag attached to the panel's top edge
|
|
38
|
+
* while sharing the panel-content inline inset used by the opposing main
|
|
39
|
+
* region. Ordinary content-panel headers retain their complete padding. */
|
|
40
|
+
:where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) {
|
|
41
|
+
gap: 0;
|
|
42
|
+
padding-block: 0;
|
|
43
|
+
padding-inline-end: 0;
|
|
44
|
+
padding-inline-start: var(--bf-panel-padding-inline);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
:where(.bf-theme) :where(.bf-panel-header.is-navigation-brand) > :where(.bf-top-navigation-logo.is-canonical-tagged) {
|
|
48
|
+
inline-size: 100%;
|
|
49
|
+
}
|
|
50
|
+
|
|
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
|
+
:where(.bf-theme) :where(.bf-panel-header) > :where(.bf-panel-title) {
|
|
56
|
+
min-inline-size: 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:where(.bf-theme) :where(.bf-panel-header.is-sticky) {
|
|
60
|
+
background: var(--bf-color-background-default);
|
|
61
|
+
position: sticky;
|
|
62
|
+
top: 0;
|
|
63
|
+
z-index: 5;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* Panel chrome that remains outside the panel's scrolling content. */
|
|
67
|
+
:where(.bf-theme) :where(.bf-panel-footer) {
|
|
68
|
+
align-items: center;
|
|
69
|
+
border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
|
|
70
|
+
display: flex;
|
|
71
|
+
flex: 0 0 auto;
|
|
72
|
+
flex-wrap: wrap;
|
|
73
|
+
gap: var(--bf-field-gap);
|
|
74
|
+
justify-content: space-between;
|
|
75
|
+
min-block-size: calc(var(--bf-control-box-size-compact) + (var(--bf-panel-padding-block) * 2));
|
|
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);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
:where(.bf-theme) :where(.bf-panel-footer.is-sticky) {
|
|
82
|
+
background: var(--bf-color-background-default);
|
|
83
|
+
bottom: 0;
|
|
84
|
+
position: sticky;
|
|
85
|
+
z-index: 5;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
:where(.bf-theme) :where(.bf-panel-title) {
|
|
89
|
+
${h4TypeStyles} margin: 0 0 var(--bf-h4-margin-bottom);
|
|
90
|
+
min-inline-size: 0;
|
|
91
|
+
padding-block-end: 0;
|
|
92
|
+
padding-block-start: var(--bf-h4-nudge-start);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
:where(.bf-theme) :where(.bf-panel-controls) {
|
|
96
|
+
align-items: start;
|
|
97
|
+
display: flex;
|
|
98
|
+
flex-wrap: wrap;
|
|
99
|
+
gap: var(--bf-field-gap);
|
|
100
|
+
margin-inline-start: auto;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
:where(.bf-theme) :where(.bf-panel-toggle) {
|
|
104
|
+
${bodyTypeStyles} align-items: center;
|
|
105
|
+
appearance: none;
|
|
106
|
+
background: transparent;
|
|
107
|
+
border: 0;
|
|
108
|
+
color: var(--bf-color-text-default);
|
|
109
|
+
cursor: pointer;
|
|
110
|
+
display: inline-flex;
|
|
111
|
+
gap: calc(var(--bf-baseline) * 0.5);
|
|
112
|
+
justify-content: flex-start;
|
|
113
|
+
margin: 0;
|
|
114
|
+
min-block-size: var(--bf-control-box-size-compact);
|
|
115
|
+
min-inline-size: 0;
|
|
116
|
+
padding-block: var(--bf-control-block-padding-compact);
|
|
117
|
+
padding-inline: 0;
|
|
118
|
+
text-align: left;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
:where(.bf-theme) :where(.bf-panel-toggle:hover) {
|
|
122
|
+
color: var(--bf-color-link-default);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
:where(.bf-theme) :where(.bf-panel-toggle:focus:not(:focus-visible)) {
|
|
126
|
+
outline: none;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
:where(.bf-theme) :where(.bf-panel-toggle:focus-visible) {
|
|
130
|
+
outline: 2px solid var(--bf-color-focus);
|
|
131
|
+
outline-offset: 2px;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
:where(.bf-theme) :where(.bf-panel-content) {
|
|
135
|
+
flex: 1 1 auto;
|
|
136
|
+
min-block-size: 0;
|
|
137
|
+
padding-block-end: var(--bf-panel-padding-block);
|
|
138
|
+
padding-block-start: var(--bf-panel-padding-block);
|
|
139
|
+
padding-inline: var(--bf-panel-padding-inline);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
:where(.bf-theme) :where(.bf-panel-content.is-flush) {
|
|
143
|
+
padding-block: 0;
|
|
144
|
+
padding-inline: 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
147
|
`;
|
|
148
148
|
}
|