baseline-foundry 0.1.6 → 0.2.0

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 (80) hide show
  1. package/README.md +22 -7
  2. package/config/canonical-spacing.resolved.json +71 -0
  3. package/config/experiments/ibm-plex-engine-smoke.json +7 -6
  4. package/config/experiments/ubuntu-engine-smoke.json +7 -6
  5. package/config/foundation-theme.json +7 -6
  6. package/config/tiers/app.json +8 -9
  7. package/config/tiers/documentation.json +7 -8
  8. package/config/tiers/editorial.json +7 -8
  9. package/config/tiers/os.json +7 -8
  10. package/dist/application-layout.js +1 -1
  11. package/dist/build.d.ts +1 -0
  12. package/dist/build.js +98 -36
  13. package/dist/css-app-tier.js +4 -46
  14. package/dist/css-component-contracts.d.ts +7 -0
  15. package/dist/css-component-contracts.js +82 -0
  16. package/dist/css-components/application-geometry.d.ts +5 -0
  17. package/dist/css-components/application-geometry.js +31 -0
  18. package/dist/css-components/article-pagination.js +6 -5
  19. package/dist/css-components/button-actions.js +68 -4
  20. package/dist/css-components/cards-options.js +2 -2
  21. package/dist/css-components/chip-badge-status.d.ts +0 -1
  22. package/dist/css-components/chip-badge-status.js +37 -15
  23. package/dist/css-components/content-card.js +11 -10
  24. package/dist/css-components/control-geometry.d.ts +12 -0
  25. package/dist/css-components/control-geometry.js +22 -0
  26. package/dist/css-components/cta-figure-aspect.js +2 -2
  27. package/dist/css-components/document-navigation.js +28 -18
  28. package/dist/css-components/editorial-content.js +1 -1
  29. package/dist/css-components/icon.js +24 -2
  30. package/dist/css-components/interactive-feedback.js +27 -14
  31. package/dist/css-components/interactive-tables.js +9 -6
  32. package/dist/css-components/legacy-navigation.js +32 -25
  33. package/dist/css-components/list-tree.js +5 -5
  34. package/dist/css-components/list.js +17 -12
  35. package/dist/css-components/logo-media.js +2 -2
  36. package/dist/css-components/navigation-geometry.d.ts +5 -0
  37. package/dist/css-components/navigation-geometry.js +30 -0
  38. package/dist/css-components/nested-controls.d.ts +8 -0
  39. package/dist/css-components/nested-controls.js +37 -0
  40. package/dist/css-components/panel.js +12 -13
  41. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  42. package/dist/css-components/search-box-and-filter.js +3 -3
  43. package/dist/css-components/sites-editorial-ports.js +8 -1
  44. package/dist/css-components/sites-foundation.js +2 -2
  45. package/dist/css-components/table.js +9 -1
  46. package/dist/css-components/tabs-choice-breadcrumbs.js +9 -9
  47. package/dist/css-components/tiered-list-equal-height-row.js +2 -2
  48. package/dist/css-components.js +99 -229
  49. package/dist/css.js +44 -1
  50. package/dist/dtcg-spacing.d.ts +40 -0
  51. package/dist/dtcg-spacing.js +163 -0
  52. package/dist/experiments/ibm-plex-engine-smoke/styles.css +557 -360
  53. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +182 -14
  54. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +91 -7
  55. package/dist/index.d.ts +1 -0
  56. package/dist/presets/app-tier/styles.css +700 -494
  57. package/dist/presets/app-tier/surfaces.json +709 -29
  58. package/dist/presets/app-tier/tokens.json +178 -8
  59. package/dist/presets/prose/styles.css +699 -486
  60. package/dist/presets/prose/surfaces.json +709 -29
  61. package/dist/presets/prose/tokens.json +177 -7
  62. package/dist/styles.css +699 -486
  63. package/dist/surfaces.json +709 -29
  64. package/dist/tiers/app/styles.css +700 -494
  65. package/dist/tiers/app/surfaces.json +709 -29
  66. package/dist/tiers/app/tokens.json +178 -8
  67. package/dist/tiers/documentation/styles.css +699 -486
  68. package/dist/tiers/documentation/surfaces.json +709 -29
  69. package/dist/tiers/documentation/tokens.json +177 -7
  70. package/dist/tiers/editorial/styles.css +699 -486
  71. package/dist/tiers/editorial/surfaces.json +709 -29
  72. package/dist/tiers/editorial/tokens.json +177 -7
  73. package/dist/tiers/os/styles.css +699 -486
  74. package/dist/tiers/os/surfaces.json +709 -29
  75. package/dist/tiers/os/tokens.json +177 -7
  76. package/dist/tokens.json +177 -7
  77. package/dist/types.d.ts +13 -13
  78. package/dist/vanilla-theme-colors.js +5 -1
  79. package/docs/publishing.md +7 -1
  80. package/package.json +1 -1
@@ -68,7 +68,7 @@ ${bodyTypeStyles} color: var(--bf-color-text-muted);
68
68
  overflow: hidden;
69
69
  overflow-wrap: anywhere;
70
70
  padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
71
- padding-inline: var(--bf-space-2) 0;
71
+ padding-inline: var(--bf-component-inline-inset-action) 0;
72
72
  position: relative;
73
73
  text-decoration: none;
74
74
  text-overflow: ellipsis;
@@ -111,21 +111,22 @@ ${bodyTypeStyles} color: var(--bf-color-text-muted);
111
111
  }
112
112
 
113
113
  :where(.bf-theme) :where(.bf-in-page-navigation-list .bf-in-page-navigation-list .bf-in-page-navigation-link) {
114
- padding-inline-start: var(--bf-space-4);
114
+ padding-inline-start: calc(var(--bf-component-inline-inset-action) * 2);
115
115
  }
116
116
 
117
117
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle) {
118
118
  ${bodyCaseTypeStyles} align-items: center;
119
119
  background: var(--bf-color-background-default);
120
- border: 0;
120
+ border: 0 solid transparent;
121
+ border-block-width: var(--bf-border-width);
121
122
  color: var(--bf-color-text-default);
122
123
  cursor: pointer;
123
124
  display: none;
124
125
  justify-content: center;
125
126
  margin: 0;
126
- min-block-size: var(--bf-control-box-size-compact);
127
- padding-block: var(--bf-control-block-padding-compact);
128
- padding-inline: var(--bf-space-1);
127
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
128
+ padding-block-start: var(--bf-interface-row-padding-block);
129
+ padding-inline: var(--bf-leading-mark-gap);
129
130
  }
130
131
 
131
132
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle:hover) {
@@ -143,6 +144,7 @@ ${bodyCaseTypeStyles} align-items: center;
143
144
 
144
145
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle > .bf-icon) {
145
146
  --bf-icon-size: var(--bf-icon-size-default);
147
+ margin-block-start: 0;
146
148
  }
147
149
 
148
150
  @container bf-in-page-navigation (width < 40rem) {
@@ -186,10 +188,12 @@ ${bodyCaseTypeStyles} align-items: center;
186
188
  }
187
189
 
188
190
  :where(.bf-theme) :where(.bf-in-page-navigation-link) {
191
+ border-block: var(--bf-border-width) solid transparent;
189
192
  display: block;
190
193
  overflow: hidden;
191
- padding-block: calc(var(--bf-control-block-padding-compact) - var(--bf-border-width));
192
- padding-inline: var(--bf-space-1);
194
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
195
+ padding-block-start: var(--bf-interface-row-padding-block);
196
+ padding-inline: var(--bf-leading-mark-gap);
193
197
  text-overflow: ellipsis;
194
198
  white-space: nowrap;
195
199
  }
@@ -224,7 +228,7 @@ ${bodyCaseTypeStyles} align-items: center;
224
228
  grid-row: 1;
225
229
  margin: 0;
226
230
  padding-block: calc(var(--bf-h6-nudge-start) + var(--bf-space-1)) calc(var(--bf-h6-nudge-end) + var(--bf-space-1));
227
- padding-inline: var(--bf-space-2);
231
+ padding-inline: var(--bf-component-inline-inset-action);
228
232
  }
229
233
 
230
234
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded > .bf-in-page-navigation-nav > .bf-in-page-navigation-list, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) > .bf-in-page-navigation-nav > .bf-in-page-navigation-list) {
@@ -250,7 +254,7 @@ ${bodyCaseTypeStyles} align-items: center;
250
254
  display: -webkit-box;
251
255
  overflow-wrap: anywhere;
252
256
  padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
253
- padding-inline: var(--bf-space-2) 0;
257
+ padding-inline: var(--bf-component-inline-inset-action) 0;
254
258
  white-space: normal;
255
259
  }
256
260
 
@@ -275,7 +279,7 @@ ${bodyCaseTypeStyles} align-items: center;
275
279
  * controller contracts while matching Vanilla's reduced chrome. */
276
280
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) {
277
281
  background: var(--bf-color-background-alt);
278
- --bf-top-navigation-link-padding-block: var(--bf-control-block-padding-compact);
282
+ --bf-top-navigation-reduced-row-block-size: var(--bf-interface-row-occupied-block-size);
279
283
  }
280
284
 
281
285
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo-tag) {
@@ -288,10 +292,13 @@ ${bodyCaseTypeStyles} align-items: center;
288
292
 
289
293
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo) > :where(.bf-top-navigation-link),
290
294
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-link, .bf-top-navigation-menu-toggle, .bf-top-navigation-search-toggle) {
295
+ border: 0 solid transparent;
296
+ border-block-width: var(--bf-border-width);
291
297
  color: var(--bf-color-text-muted);
292
298
  font-size: var(--bf-body-font-size);
293
299
  line-height: var(--bf-body-line-height);
294
- padding-block: var(--bf-top-navigation-link-padding-block);
300
+ padding-block-end: calc(var(--bf-interface-row-padding-block) + var(--bf-interface-row-compensation-block-end));
301
+ padding-block-start: var(--bf-interface-row-padding-block);
295
302
  }
296
303
 
297
304
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-logo.is-canonical-tagged) > :where(.bf-top-navigation-link) {
@@ -316,7 +323,7 @@ ${bodyCaseTypeStyles} align-items: center;
316
323
 
317
324
  @media (min-width: 64.75rem) {
318
325
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-dropdown) {
319
- top: calc((var(--bf-top-navigation-link-padding-block) * 2) + var(--bf-body-line-height));
326
+ top: var(--bf-top-navigation-reduced-row-block-size);
320
327
  }
321
328
 
322
329
  :where(.bf-theme) :where(.bf-top-navigation.is-reduced) :where(.bf-top-navigation-search) {
@@ -325,7 +332,7 @@ ${bodyCaseTypeStyles} align-items: center;
325
332
  box-shadow: 0 calc(var(--bf-baseline) * 0.5) calc(var(--bf-baseline) * 2) rgba(0, 0, 0, 0.16);
326
333
  inset-block-start: 100%;
327
334
  inset-inline-end: 0;
328
- padding: var(--bf-control-block-padding-compact) var(--bf-top-navigation-link-padding-inline);
335
+ padding: var(--bf-panel-padding-block) var(--bf-top-navigation-link-padding-inline);
329
336
  position: absolute;
330
337
  }
331
338
 
@@ -373,6 +380,7 @@ ${bodyCaseTypeStyles} align-items: center;
373
380
  color: var(--bf-color-text-default);
374
381
  margin: 0;
375
382
  padding-block-end: 0;
383
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
376
384
  }
377
385
 
378
386
  :where(.bf-theme) :where(.bf-table-of-contents-list) {
@@ -399,9 +407,11 @@ ${bodyCaseTypeStyles} align-items: center;
399
407
  ${bodyTypeStyles} border-block: var(--bf-border-width) solid transparent;
400
408
  color: var(--bf-color-link-default);
401
409
  display: block;
402
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
410
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
403
411
  overflow-wrap: anywhere;
404
- padding-block: var(--bf-single-line-row-padding-block);
412
+ padding-block: var(--bf-interface-row-padding-block);
413
+ padding-inline-end: var(--bf-component-inline-inset-action);
414
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
405
415
  text-decoration: none;
406
416
  }
407
417
 
@@ -425,12 +435,12 @@ ${bodyTypeStyles} border-block: var(--bf-border-width) solid transparent;
425
435
  }
426
436
 
427
437
  :where(.bf-theme) :where(.bf-table-of-contents-list .bf-table-of-contents-list) {
428
- margin-inline-start: var(--bf-space-2);
438
+ margin-inline-start: var(--bf-component-inline-inset-action);
429
439
  }
430
440
 
431
441
  @container bf-table-of-contents (width < 20rem) {
432
442
  :where(.bf-theme) :where(.bf-table-of-contents-list .bf-table-of-contents-list) {
433
- margin-inline-start: var(--bf-space-1);
443
+ margin-inline-start: var(--bf-leading-mark-gap);
434
444
  }
435
445
  }
436
446
  `;
@@ -15,7 +15,7 @@ export function editorialContentCss(options) {
15
15
  margin: 0;
16
16
  max-inline-size: 100%;
17
17
  padding-block: var(--bf-space-2);
18
- padding-inline: var(--bf-space-2);
18
+ padding-inline: var(--bf-panel-padding-inline);
19
19
  }
20
20
 
21
21
  :where(.bf-theme) :where(.bf-notice.is-information) {
@@ -1,5 +1,22 @@
1
1
  export function iconCss() {
2
- return `:where(.bf-theme) :where(.bf-icon) {
2
+ return `:where(.bf-theme) {
3
+ --bf-icon-size-default: 1rem;
4
+ --bf-icon-size-medium: 2.5rem;
5
+ --bf-icon-size-large: 4rem;
6
+ --bf-icon-size-x-large: 4.5rem;
7
+ --bf-icon-size-xx-large: 6rem;
8
+ /* Vanilla's inline-icon metric aligns icon paint to the cap-height centre.
9
+ Half the scalable border supplies the optical lift. */
10
+ --bf-inline-icon-baseline-shift: calc((var(--bf-border-width) * 0.5) + ((1cap - var(--bf-icon-size-default)) / 2));
11
+ /* The default icon can meet the compact body line at a raster edge. Trim its
12
+ layout margin by one scalable border without moving its cap-centred paint. */
13
+ --bf-inline-icon-line-box-trim: calc(var(--bf-border-width) * -1);
14
+ --bf-leading-icon-size: var(--bf-leading-mark-size);
15
+ --bf-leading-icon-gap: var(--bf-leading-mark-gap);
16
+ --bf-leading-icon-offset: var(--bf-interface-row-visual-offset);
17
+ }
18
+
19
+ :where(.bf-theme) :where(.bf-icon) {
3
20
  --bf-icon-image: none;
4
21
  --bf-icon-size: var(--bf-icon-size-default);
5
22
  --bf-icon-transform: none;
@@ -12,29 +29,34 @@ export function iconCss() {
12
29
  flex: 0 0 auto;
13
30
  inline-size: var(--bf-icon-size);
14
31
  margin: 0;
32
+ margin-block-start: var(--bf-inline-icon-line-box-trim);
15
33
  overflow: hidden;
16
34
  padding: 0;
17
35
  text-indent: 110vw;
18
36
  transform: var(--bf-icon-transform);
19
37
  transform-origin: center;
20
- vertical-align: bottom;
38
+ vertical-align: calc(var(--bf-inline-icon-baseline-shift) + ((var(--bf-icon-size-default) - var(--bf-icon-size)) / 2));
21
39
  white-space: nowrap;
22
40
  }
23
41
 
24
42
  :where(.bf-theme) :where(.bf-icon.is-medium) {
25
43
  --bf-icon-size: var(--bf-icon-size-medium);
44
+ --bf-inline-icon-line-box-trim: 0rem;
26
45
  }
27
46
 
28
47
  :where(.bf-theme) :where(.bf-icon.is-large) {
29
48
  --bf-icon-size: var(--bf-icon-size-large);
49
+ --bf-inline-icon-line-box-trim: 0rem;
30
50
  }
31
51
 
32
52
  :where(.bf-theme) :where(.bf-icon.is-x-large) {
33
53
  --bf-icon-size: var(--bf-icon-size-x-large);
54
+ --bf-inline-icon-line-box-trim: 0rem;
34
55
  }
35
56
 
36
57
  :where(.bf-theme) :where(.bf-icon.is-xx-large) {
37
58
  --bf-icon-size: var(--bf-icon-size-xx-large);
59
+ --bf-inline-icon-line-box-trim: 0rem;
38
60
  }
39
61
 
40
62
  :where(.bf-theme) :where(.bf-icon.is-search) {
@@ -11,7 +11,7 @@ export function interactiveFeedbackCss() {
11
11
  :where(.bf-theme) :where(.bf-credential-header) {
12
12
  align-items: flex-start;
13
13
  display: flex;
14
- gap: var(--bf-space-2);
14
+ gap: var(--bf-component-inline-inset-action);
15
15
  justify-content: space-between;
16
16
  min-inline-size: 0;
17
17
  }
@@ -73,9 +73,10 @@ export function interactiveFeedbackCss() {
73
73
 
74
74
  :where(.bf-theme) :where(.bf-notification, .bf-notification.is-information, .bf-notification.is-positive, .bf-notification.is-caution, .bf-notification.is-negative) {
75
75
  --bf-notification-accent: var(--bf-color-border-information);
76
+ --bf-notification-close-painted-block-size: calc((var(--bf-space-1) * 2) + var(--bf-icon-size-default));
77
+ --bf-notification-rail-shortfall: max(0rem, calc(var(--bf-bar-thickness) + var(--bf-leading-mark-size) + var(--bf-leading-mark-gap) - var(--bf-component-inline-inset-continuation)));
76
78
  background: var(--bf-color-background-default);
77
79
  border: var(--bf-border-width) solid var(--bf-color-border-default);
78
- border-inline-start: var(--bf-bar-thickness) solid var(--bf-notification-accent);
79
80
  color: var(--bf-color-text-default);
80
81
  margin-block: 0;
81
82
  max-inline-size: 100%;
@@ -83,10 +84,20 @@ export function interactiveFeedbackCss() {
83
84
  overflow-wrap: anywhere;
84
85
  padding-block-end: max(0rem, calc(var(--bf-space-half) - var(--bf-border-width)));
85
86
  padding-block-start: 0;
86
- padding-inline: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness)) var(--bf-space-1);
87
+ padding-inline: calc(var(--bf-component-inline-inset-continuation) - var(--bf-border-width)) var(--bf-component-inline-inset-action);
87
88
  position: relative;
88
89
  }
89
90
 
91
+ :where(.bf-theme) :where(.bf-notification:not(.is-borderless))::before {
92
+ background: var(--bf-notification-accent);
93
+ content: "";
94
+ inline-size: var(--bf-bar-thickness);
95
+ inset-block: calc(var(--bf-border-width) * -1);
96
+ inset-inline-start: calc((var(--bf-border-width) + var(--bf-notification-rail-shortfall)) * -1);
97
+ pointer-events: none;
98
+ position: absolute;
99
+ }
100
+
90
101
  :where(.bf-theme) :where(.bf-notification.is-positive) {
91
102
  --bf-notification-accent: var(--bf-color-border-positive);
92
103
  }
@@ -106,14 +117,16 @@ export function interactiveFeedbackCss() {
106
117
  :where(.bf-theme) :where(.bf-notification.is-borderless) {
107
118
  border: 0;
108
119
  padding-block: 0;
109
- padding-inline: calc(var(--bf-icon-size-default) + var(--bf-space-1)) 0;
120
+ padding-inline: calc(var(--bf-leading-mark-size) + var(--bf-leading-mark-gap)) 0;
110
121
  }
111
122
 
112
123
  :where(.bf-theme) :where(.bf-notification-icon) {
124
+ --bf-icon-size: var(--bf-leading-mark-size);
113
125
  background-color: var(--bf-notification-accent);
114
126
  background-image: none;
115
- inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start) - var(--bf-border-width));
116
- inset-inline-start: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness) - var(--bf-icon-size-default) - var(--bf-space-1));
127
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-h6-nudge-start) - var(--bf-border-width));
128
+ inset-inline-start: calc(var(--bf-component-inline-inset-continuation) - var(--bf-border-width) - var(--bf-leading-mark-size) - var(--bf-leading-mark-gap));
129
+ margin-block-start: 0;
117
130
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0zm0 1.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13zm-.75 5.25h1.5v5h-1.5v-5zM8 3.5a1 1 0 1 1 0 2 1 1 0 0 1 0-2z'/%3E%3C/svg%3E");
118
131
  mask-position: center;
119
132
  mask-repeat: no-repeat;
@@ -134,12 +147,12 @@ export function interactiveFeedbackCss() {
134
147
  }
135
148
 
136
149
  :where(.bf-theme) :where(.bf-notification.is-borderless > .bf-notification-icon) {
137
- inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start));
150
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-h6-nudge-start));
138
151
  inset-inline-start: 0;
139
152
  }
140
153
 
141
154
  :where(.bf-theme) :where(.bf-notification.is-inline > .bf-notification-icon) {
142
- inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start) - var(--bf-border-width));
155
+ inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-leading-mark-size)) / 2) + var(--bf-body-nudge-start) - var(--bf-border-width));
143
156
  }
144
157
 
145
158
  :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
@@ -151,7 +164,7 @@ export function interactiveFeedbackCss() {
151
164
  /* Neutralise the shell's top border so the first metric role starts on-grid. */
152
165
  margin-block: calc(var(--bf-border-width) * -1) 0;
153
166
  padding-block-start: 0;
154
- padding-inline-end: calc(var(--bf-icon-size-default) + var(--bf-space-1));
167
+ padding-inline-end: var(--bf-notification-close-painted-block-size);
155
168
  }
156
169
 
157
170
  :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-content) {
@@ -195,9 +208,9 @@ export function interactiveFeedbackCss() {
195
208
  }
196
209
 
197
210
  :where(.bf-theme) :where(.bf-notification-close) {
198
- block-size: calc((var(--bf-space-1) * 2) + var(--bf-icon-size-default));
211
+ block-size: var(--bf-square-block-size);
199
212
  border: 0;
200
- inline-size: var(--bf-icon-size-default);
213
+ inline-size: var(--bf-square-block-size);
201
214
  margin-block-end: 0;
202
215
  padding: 0;
203
216
  position: absolute;
@@ -215,11 +228,11 @@ export function interactiveFeedbackCss() {
215
228
  border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
216
229
  display: flex;
217
230
  flex-wrap: wrap;
218
- gap: var(--bf-space-1) var(--bf-space-2);
231
+ gap: var(--bf-space-1) var(--bf-component-inline-inset-action);
219
232
  justify-content: space-between;
220
233
  margin-block-end: 0;
221
234
  padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
222
- padding-inline-end: var(--bf-space-2);
235
+ padding-inline-end: var(--bf-component-inline-inset-action);
223
236
  }
224
237
 
225
238
  :where(.bf-theme) :where(.bf-notification.is-inline .bf-notification-meta) {
@@ -238,7 +251,7 @@ export function interactiveFeedbackCss() {
238
251
  align-items: flex-start;
239
252
  display: flex;
240
253
  flex-wrap: wrap;
241
- gap: var(--bf-space-1) var(--bf-space-2);
254
+ gap: var(--bf-space-1) var(--bf-component-inline-inset-action);
242
255
  margin-inline-start: auto;
243
256
  min-inline-size: 0;
244
257
  }
@@ -20,10 +20,12 @@ export function interactiveTablesCss() {
20
20
  cursor: inherit;
21
21
  display: inline-block;
22
22
  font: inherit;
23
- margin: -0.125rem calc(var(--bf-space-half) * -1);
23
+ margin-block: -0.125rem;
24
+ margin-inline: calc((var(--bf-component-inline-inset-field) / 2) * -1);
24
25
  max-inline-size: 100%;
25
26
  overflow: hidden;
26
- padding: 0.125rem var(--bf-space-half);
27
+ padding-block: 0.125rem;
28
+ padding-inline: calc(var(--bf-component-inline-inset-field) / 2);
27
29
  text-align: inherit;
28
30
  text-decoration: inherit;
29
31
  text-overflow: inherit;
@@ -56,9 +58,10 @@ export function interactiveTablesCss() {
56
58
  content: "";
57
59
  display: inline-block;
58
60
  inline-size: var(--bf-icon-size-default);
59
- margin-inline-start: var(--bf-space-half);
61
+ margin-block-start: var(--bf-inline-icon-line-box-trim);
62
+ margin-inline-start: calc(var(--bf-leading-mark-gap) / 2);
60
63
  opacity: 0;
61
- vertical-align: calc((1cap - var(--bf-icon-size-default)) / 2);
64
+ vertical-align: var(--bf-inline-icon-baseline-shift);
62
65
  }
63
66
 
64
67
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
@@ -111,7 +114,7 @@ export function interactiveTablesCss() {
111
114
 
112
115
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > tbody) {
113
116
  display: grid;
114
- gap: 0 var(--bf-space-3);
117
+ gap: 0 var(--bf-component-inline-inset-continuation);
115
118
  grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
116
119
  inline-size: 100%;
117
120
  }
@@ -121,7 +124,7 @@ export function interactiveTablesCss() {
121
124
  display: block;
122
125
  margin-block-end: calc(var(--bf-space-3) - (var(--bf-border-width) * 2));
123
126
  min-inline-size: 0;
124
- padding-inline: var(--bf-space-2);
127
+ padding-inline: var(--bf-panel-padding-inline);
125
128
  }
126
129
 
127
130
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > tbody > tr > :where(th, td)) {
@@ -1,20 +1,21 @@
1
1
  export function legacyNavigationCss(options) {
2
2
  const { bodyMediumTypeStyles, bodySemiboldTypeStyles, bodyTypeStyles, buttonMarginBottom, buttonPadding } = options;
3
3
  return `:where(.bf-theme) :where(.bf-side-navigation, .bf-side-navigation.is-icons, .bf-side-navigation.is-accordion, .bf-side-navigation.is-raw-html) {
4
- /* Plain navigation commands use the action rail. Icon-led rows move only their mark canvas,
5
- so their copy reaches the shared continuation rail without a fourth
4
+ /* Plain navigation commands use the action inset. Icon-led rows move only their mark canvas,
5
+ so their copy reaches the shared continuation inset without a fourth
6
6
  component inset. Navigation depth is added separately below. */
7
- /* Navigation copy uses one continuation rail whether a row has a leading
7
+ /* Navigation copy uses one continuation inset whether a row has a leading
8
8
  disclosure/icon slot or not. The mark canvas is derived backwards from
9
- that rail, so iconless rows never introduce a fourth text start. */
9
+ that inset, so iconless rows never introduce a fourth text start. */
10
10
  --bf-side-navigation-content-inset: var(--bf-component-inline-inset-continuation);
11
- --bf-side-navigation-disclosure-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-disclosure-gap)));
12
- --bf-side-navigation-depth-step: var(--bf-space-2);
11
+ --bf-side-navigation-disclosure-inset: var(--bf-disclosure-group-inset);
12
+ --bf-side-navigation-depth-step: var(--bf-component-inline-inset-action);
13
13
  --bf-side-navigation-group-gap: 1.5rem;
14
14
  --bf-side-navigation-heading-list-gap: 0.5rem;
15
15
  color: var(--bf-color-text-inactive);
16
16
  display: block;
17
17
  inline-size: 100%;
18
+ min-inline-size: 0;
18
19
  }
19
20
 
20
21
  :where(.bf-theme) :where(.bf-side-navigation-groups) {
@@ -95,7 +96,7 @@ export function legacyNavigationCss(options) {
95
96
  border-bottom: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
96
97
  margin-bottom: calc(var(--bf-baseline) * 2);
97
98
  padding-bottom: calc(var(--bf-panel-padding-block) - var(--bf-border-width));
98
- padding-inline: var(--bf-component-inline-inset-continuation);
99
+ padding-inline: var(--bf-panel-padding-inline);
99
100
  padding-top: var(--bf-panel-padding-block);
100
101
  position: sticky;
101
102
  top: 0;
@@ -111,10 +112,10 @@ ${bodyTypeStyles} align-items: center;
111
112
  color: var(--bf-color-text-default);
112
113
  cursor: pointer;
113
114
  display: inline-flex;
114
- gap: calc(var(--bf-baseline) * 0.5);
115
+ gap: var(--bf-leading-mark-gap);
115
116
  justify-content: center;
116
117
  margin: 0 0 ${buttonMarginBottom};
117
- ${buttonPadding} padding-inline: var(--bf-control-inline-padding-action-bordered);
118
+ ${buttonPadding} padding-inline: var(--bf-component-inline-inset-action-bordered);
118
119
  text-decoration: none;
119
120
  }
120
121
 
@@ -166,15 +167,17 @@ ${bodySemiboldTypeStyles} display: block;
166
167
 
167
168
  :where(.bf-theme) :where(.bf-side-navigation-list) {
168
169
  display: grid;
169
- grid-auto-rows: var(--bf-single-line-row-block-size);
170
+ grid-auto-rows: minmax(var(--bf-interface-row-occupied-block-size), auto);
170
171
  list-style: none;
171
172
  margin: 0;
173
+ min-inline-size: 0;
172
174
  padding: 0;
173
175
  }
174
176
 
175
177
  :where(.bf-theme) :where(.bf-side-navigation-item, .bf-side-navigation-item.is-title) {
176
178
  display: grid;
177
179
  margin: 0;
180
+ min-inline-size: 0;
178
181
  position: relative;
179
182
  }
180
183
 
@@ -186,11 +189,15 @@ ${bodyTypeStyles} align-items: center;
186
189
  border-block: var(--bf-border-width) solid transparent;
187
190
  color: var(--bf-color-text-inactive);
188
191
  display: flex;
189
- gap: calc(var(--bf-baseline) * 0.5);
192
+ gap: var(--bf-leading-mark-gap);
190
193
  inline-size: 100%;
191
194
  justify-content: flex-start;
192
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
193
- padding-block: var(--bf-single-line-row-padding-block);
195
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
196
+ min-inline-size: 0;
197
+ /* A navigation row is the focus owner. Put nested interactive controls in a
198
+ following panel/list item rather than inside the clipped row itself. */
199
+ overflow: hidden;
200
+ padding-block: var(--bf-interface-row-padding-block);
194
201
  padding-inline: var(--bf-side-navigation-content-inset);
195
202
  --bf-side-navigation-row-inset: var(--bf-side-navigation-content-inset);
196
203
  position: relative;
@@ -305,7 +312,7 @@ ${bodyTypeStyles} align-items: center;
305
312
  :where(.bf-theme) :where(.bf-top-navigation-logo) > :where(.bf-top-navigation-link) {
306
313
  ${bodyMediumTypeStyles} align-items: center;
307
314
  color: var(--bf-color-text-default);
308
- column-gap: calc(var(--bf-baseline) * 1.5);
315
+ column-gap: var(--bf-leading-mark-gap);
309
316
  display: inline-flex;
310
317
  inline-size: auto;
311
318
  justify-content: flex-start;
@@ -392,7 +399,7 @@ ${bodyTypeStyles} align-items: center;
392
399
  color: var(--bf-color-text-default);
393
400
  cursor: pointer;
394
401
  display: inline-flex;
395
- gap: calc(var(--bf-baseline) * 1);
402
+ gap: var(--bf-leading-mark-gap);
396
403
  inline-size: 100%;
397
404
  justify-content: flex-start;
398
405
  margin: 0;
@@ -484,12 +491,12 @@ ${bodyTypeStyles} align-items: center;
484
491
  ${bodyTypeStyles} align-items: center;
485
492
  color: var(--bf-color-text-default);
486
493
  display: flex;
487
- gap: calc(var(--bf-baseline) * 2);
494
+ gap: var(--bf-component-inline-inset-action);
488
495
  inline-size: 100%;
489
496
  justify-content: space-between;
490
497
  min-inline-size: 0;
491
498
  padding-block: var(--bf-top-navigation-link-padding-block);
492
- padding-inline: calc(var(--bf-top-navigation-link-padding-inline) + (var(--bf-baseline) * 2)) var(--bf-top-navigation-link-padding-inline);
499
+ padding-inline: calc(var(--bf-top-navigation-link-padding-inline) + var(--bf-component-inline-inset-action)) var(--bf-top-navigation-link-padding-inline);
493
500
  text-align: left;
494
501
  text-decoration: none;
495
502
  white-space: nowrap;
@@ -594,7 +601,7 @@ ${bodyTypeStyles} align-items: center;
594
601
  :where(.bf-theme) :where(.bf-top-navigation-row) {
595
602
  align-items: stretch;
596
603
  flex-direction: row;
597
- gap: calc(var(--bf-baseline) * 2);
604
+ gap: var(--bf-component-inline-inset-action);
598
605
  }
599
606
 
600
607
  :where(.bf-theme) :where(.bf-top-navigation-banner) {
@@ -726,8 +733,8 @@ ${bodyTypeStyles} background: transparent;
726
733
  cursor: pointer;
727
734
  inset-block-start: 0;
728
735
  margin: 0;
729
- min-block-size: var(--bf-control-box-size-compact);
730
- padding-inline: calc(var(--bf-baseline) * 0.5);
736
+ min-block-size: var(--bf-interface-row-occupied-block-size);
737
+ padding-inline: var(--bf-inline-unit);
731
738
  position: absolute;
732
739
  right: 0;
733
740
  }
@@ -765,8 +772,8 @@ ${bodyTypeStyles} background: transparent;
765
772
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-icon) {
766
773
  align-items: center;
767
774
  display: inline-flex;
768
- flex: 0 0 1rem;
769
- inline-size: 1rem;
775
+ flex: 0 0 var(--bf-disclosure-icon-inline-size);
776
+ inline-size: var(--bf-disclosure-icon-inline-size);
770
777
  justify-content: center;
771
778
  transform: translateY(var(--bf-side-navigation-icon-optical-offset-block));
772
779
  }
@@ -776,7 +783,7 @@ ${bodyTypeStyles} background: transparent;
776
783
  }
777
784
 
778
785
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text, .bf-side-navigation-accordion-button) {
779
- --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - 1rem - var(--bf-side-navigation-icon-gap)));
786
+ --bf-side-navigation-row-inset: max(0rem, calc(var(--bf-component-inline-inset-continuation) - var(--bf-disclosure-icon-inline-size) - var(--bf-side-navigation-icon-gap)));
780
787
  align-items: baseline;
781
788
  column-gap: var(--bf-side-navigation-icon-gap);
782
789
  }
@@ -785,8 +792,8 @@ ${bodyTypeStyles} background: transparent;
785
792
  icon without collapsing the shared icon track and pulling their copy left. */
786
793
  :where(.bf-theme) :where(.bf-side-navigation.is-icons) :where(.bf-side-navigation-link, .bf-side-navigation-text):not(:has(> .bf-side-navigation-icon))::before {
787
794
  content: "";
788
- flex: 0 0 1rem;
789
- inline-size: 1rem;
795
+ flex: 0 0 var(--bf-disclosure-icon-inline-size);
796
+ inline-size: var(--bf-disclosure-icon-inline-size);
790
797
  }
791
798
 
792
799
  /* A collapsed icon rail cannot communicate an iconless destination. Remove
@@ -28,8 +28,8 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
28
28
  border-block: var(--bf-border-width) solid transparent;
29
29
  cursor: pointer;
30
30
  display: block;
31
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
32
- padding-block: var(--bf-single-line-row-padding-block);
31
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
32
+ padding-block: var(--bf-interface-row-padding-block);
33
33
  padding-inline: var(--bf-component-inline-inset-continuation) var(--bf-component-inline-inset-action);
34
34
  text-decoration: none;
35
35
  }
@@ -61,9 +61,9 @@ ${bodyTypeStyles} align-items: center;
61
61
  cursor: pointer;
62
62
  display: flex;
63
63
  gap: var(--bf-disclosure-gap);
64
- margin: 0 0 var(--bf-single-line-row-margin-block-end);
65
- padding-block: var(--bf-single-line-row-padding-block);
66
- padding-inline: 0 calc(var(--bf-baseline) * 0.5);
64
+ margin: 0 0 var(--bf-interface-row-compensation-block-end);
65
+ padding-block: var(--bf-interface-row-padding-block);
66
+ padding-inline: var(--bf-disclosure-group-inset) var(--bf-inline-unit);
67
67
  text-align: left;
68
68
  width: 100%;
69
69
  }
@@ -23,8 +23,8 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
23
23
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item) {
24
24
  border-block: var(--bf-border-width) solid transparent;
25
25
  box-shadow: inset 0 0.0625rem 0 var(--bf-color-border-low-contrast);
26
- margin-block-end: var(--bf-single-line-row-margin-block-end);
27
- padding-block: var(--bf-single-line-row-padding-block);
26
+ margin-block-end: var(--bf-interface-row-compensation-block-end);
27
+ padding-block: var(--bf-interface-row-padding-block);
28
28
  }
29
29
 
30
30
  :where(.bf-theme) :where(.bf-list.is-divided) > :where(.bf-list-item:first-child) {
@@ -64,7 +64,7 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
64
64
  :where(.bf-theme) :where(ol.bf-list.is-divided) > :where(.bf-list-item) {
65
65
  counter-increment: bf-list-counter;
66
66
  list-style: none;
67
- padding-inline-start: calc(var(--bf-baseline) * 4);
67
+ padding-inline-start: var(--bf-component-inline-inset-continuation);
68
68
  position: relative;
69
69
  }
70
70
 
@@ -79,7 +79,7 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
79
79
  }
80
80
 
81
81
  :where(.bf-theme) :where(.bf-list-item) > :where(.bf-list) {
82
- margin-inline-start: calc(var(--bf-baseline) * 3);
82
+ margin-inline-start: var(--bf-component-inline-inset-action);
83
83
  padding-block-start: var(--bf-body-nudge-end);
84
84
  }
85
85
 
@@ -88,6 +88,8 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
88
88
  }
89
89
 
90
90
  :where(.bf-theme) :where(.bf-inline-list) {
91
+ --bf-inline-list-space: 0.5rem;
92
+
91
93
  margin: 0;
92
94
  padding: 0;
93
95
  }
@@ -95,7 +97,7 @@ ${bodyTypeStyles} color: var(--bf-color-text-default);
95
97
  :where(.bf-theme) :where(.bf-inline-list-item) {
96
98
  ${bodyTypeStyles} display: inline-block;
97
99
  list-style: none;
98
- margin-inline-end: calc(var(--bf-baseline) * 1.5);
100
+ margin-inline-end: var(--bf-inline-list-space);
99
101
  padding-block-end: var(--bf-body-nudge-end);
100
102
  padding-block-start: var(--bf-body-nudge-start);
101
103
  }
@@ -105,17 +107,20 @@ ${bodyTypeStyles} display: inline-block;
105
107
  }
106
108
 
107
109
  :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item) {
108
- margin-inline-end: calc(var(--bf-baseline) * 1);
110
+ margin-inline-end: 0;
109
111
  position: relative;
110
112
  }
111
113
 
112
- :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item)::after {
113
- content: "\\2022";
114
- display: inline;
115
- margin-inline-start: calc(var(--bf-baseline) * 0.25);
114
+ :where(.bf-theme) :where(.bf-inline-list.is-middot) {
115
+ align-items: baseline;
116
+ column-gap: var(--bf-inline-list-space);
117
+ display: flex;
118
+ flex-wrap: wrap;
116
119
  }
117
120
 
118
- :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item:last-of-type)::after {
119
- content: "";
121
+ :where(.bf-theme) :where(.bf-inline-list.is-middot) :where(.bf-inline-list-item:not(:last-of-type))::after {
122
+ content: "\\2022";
123
+ display: inline;
124
+ margin-inline-start: var(--bf-inline-list-space);
120
125
  }`;
121
126
  }