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.
Files changed (43) hide show
  1. package/README.md +568 -552
  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/css-app-tier.js +73 -73
  11. package/dist/css-components/article-pagination.js +140 -140
  12. package/dist/css-components/button-actions.js +161 -161
  13. package/dist/css-components/cards-options.js +176 -176
  14. package/dist/css-components/chip-badge-status.js +158 -158
  15. package/dist/css-components/content-card.js +490 -490
  16. package/dist/css-components/control-row.js +14 -14
  17. package/dist/css-components/cta-figure-aspect.js +120 -120
  18. package/dist/css-components/document-navigation.js +390 -390
  19. package/dist/css-components/editorial-content.js +42 -42
  20. package/dist/css-components/icon.js +72 -72
  21. package/dist/css-components/interactive-feedback.js +217 -217
  22. package/dist/css-components/interactive-tables.js +155 -155
  23. package/dist/css-components/legacy-navigation.d.ts +9 -0
  24. package/dist/css-components/legacy-navigation.js +763 -0
  25. package/dist/css-components/linked-logo-site-layout.js +177 -177
  26. package/dist/css-components/list-tree.js +94 -94
  27. package/dist/css-components/logo-media.js +201 -201
  28. package/dist/css-components/navigation-layout.js +144 -144
  29. package/dist/css-components/panel.js +144 -144
  30. package/dist/css-components/search-box-and-filter.js +263 -263
  31. package/dist/css-components/sites-editorial-ports.js +243 -243
  32. package/dist/css-components/sites-foundation.js +146 -146
  33. package/dist/css-components/sites-rich-lists.js +344 -344
  34. package/dist/css-components/static-content-ports.js +182 -182
  35. package/dist/css-components/tab-section.js +82 -82
  36. package/dist/css-components/table.js +75 -75
  37. package/dist/css-components/tabs-choice-breadcrumbs.js +303 -303
  38. package/dist/css-components/tiered-list-equal-height-row.js +271 -271
  39. package/dist/css-components.js +1791 -2542
  40. package/dist/css-grid.js +172 -172
  41. package/dist/css.js +240 -240
  42. package/docs/publishing.md +30 -13
  43. 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
  }