baseline-foundry 0.1.4 → 0.1.6

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 (82) hide show
  1. package/README.md +17 -9
  2. package/config/experiments/ibm-plex-engine-smoke.json +1 -1
  3. package/config/experiments/ubuntu-engine-smoke.json +1 -1
  4. package/config/foundation-theme.json +1 -1
  5. package/config/tiers/app.json +6 -6
  6. package/config/tiers/documentation.json +2 -2
  7. package/config/tiers/editorial.json +1 -1
  8. package/config/tiers/os.json +6 -6
  9. package/dist/baseline-grid-overlay.js +2 -2
  10. package/dist/build.js +4 -4
  11. package/dist/code-snippet.js +1 -1
  12. package/dist/css-app-tier.js +16 -5
  13. package/dist/css-components/article-pagination.js +9 -8
  14. package/dist/css-components/button-actions.js +24 -4
  15. package/dist/css-components/cards-options.js +8 -8
  16. package/dist/css-components/chip-badge-status.d.ts +0 -3
  17. package/dist/css-components/chip-badge-status.js +57 -10
  18. package/dist/css-components/content-card.d.ts +7 -7
  19. package/dist/css-components/content-card.js +17 -16
  20. package/dist/css-components/control-row.d.ts +1 -1
  21. package/dist/css-components/control-row.js +1 -1
  22. package/dist/css-components/document-navigation.js +66 -29
  23. package/dist/css-components/editorial-content.js +1 -1
  24. package/dist/css-components/interactive-feedback.js +50 -28
  25. package/dist/css-components/interactive-tables.js +13 -8
  26. package/dist/css-components/legacy-navigation.d.ts +0 -1
  27. package/dist/css-components/legacy-navigation.js +108 -32
  28. package/dist/css-components/linked-logo-site-layout.d.ts +3 -3
  29. package/dist/css-components/linked-logo-site-layout.js +17 -20
  30. package/dist/css-components/list-tree.js +21 -19
  31. package/dist/css-components/list.js +9 -7
  32. package/dist/css-components/logo-media.d.ts +6 -6
  33. package/dist/css-components/logo-media.js +38 -27
  34. package/dist/css-components/navigation-layout.js +6 -8
  35. package/dist/css-components/panel.js +12 -12
  36. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  37. package/dist/css-components/search-box-and-filter.js +18 -19
  38. package/dist/css-components/sites-editorial-ports.d.ts +3 -4
  39. package/dist/css-components/sites-editorial-ports.js +61 -29
  40. package/dist/css-components/sites-foundation.js +15 -19
  41. package/dist/css-components/sites-rich-lists.d.ts +5 -5
  42. package/dist/css-components/sites-rich-lists.js +26 -36
  43. package/dist/css-components/static-content-ports.d.ts +3 -3
  44. package/dist/css-components/static-content-ports.js +51 -37
  45. package/dist/css-components/tab-section.d.ts +3 -3
  46. package/dist/css-components/tab-section.js +34 -26
  47. package/dist/css-components/table.js +4 -7
  48. package/dist/css-components/tabs-choice-breadcrumbs.js +25 -21
  49. package/dist/css-components/tiered-list-equal-height-row.js +10 -10
  50. package/dist/css-components.js +243 -124
  51. package/dist/css-grid.d.ts +1 -1
  52. package/dist/css-grid.js +18 -8
  53. package/dist/css.js +94 -18
  54. package/dist/experiments/ibm-plex-engine-smoke/styles.css +1005 -563
  55. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +2 -2
  56. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +1 -1
  57. package/dist/in-page-navigation.js +1 -1
  58. package/dist/presets/app-tier/styles.css +1046 -593
  59. package/dist/presets/app-tier/surfaces.json +17 -17
  60. package/dist/presets/app-tier/tokens.json +7 -7
  61. package/dist/presets/prose/styles.css +1036 -587
  62. package/dist/presets/prose/surfaces.json +17 -17
  63. package/dist/presets/prose/tokens.json +1 -1
  64. package/dist/resizable-aside.js +12 -4
  65. package/dist/styles.css +1036 -587
  66. package/dist/surfaces.json +17 -17
  67. package/dist/tiers/app/styles.css +1046 -593
  68. package/dist/tiers/app/surfaces.json +17 -17
  69. package/dist/tiers/app/tokens.json +7 -7
  70. package/dist/tiers/documentation/styles.css +1037 -588
  71. package/dist/tiers/documentation/surfaces.json +17 -17
  72. package/dist/tiers/documentation/tokens.json +2 -2
  73. package/dist/tiers/editorial/styles.css +1036 -587
  74. package/dist/tiers/editorial/surfaces.json +17 -17
  75. package/dist/tiers/editorial/tokens.json +1 -1
  76. package/dist/tiers/os/styles.css +1042 -593
  77. package/dist/tiers/os/surfaces.json +17 -17
  78. package/dist/tiers/os/tokens.json +7 -7
  79. package/dist/tokens.json +1 -1
  80. package/dist/types.d.ts +1 -1
  81. package/docs/publishing.md +1 -1
  82. package/package.json +2 -2
@@ -3,14 +3,14 @@
3
3
  * separate family from the general-purpose `bf-card` primitive.
4
4
  *
5
5
  * Vanilla -> BF rhythm mapping (Vanilla's spacing unit is 0.5rem):
6
- * - 16px content padding/gap -> `--bf-space-2`.
7
- * - 8px footer/image spacing -> `--bf-space-1`.
8
- * - 32px wrapper separation -> `--bf-space-4`.
9
- * - 380px vertical minimum -> 48 BF baselines (384px in editorial), avoiding
6
+ * - 1rem content padding/gap -> `--bf-space-2`.
7
+ * - 0.5rem footer/image spacing -> `--bf-space-1`.
8
+ * - 2rem wrapper separation -> `--bf-space-4`.
9
+ * - 23.75rem vertical minimum -> 48 BF baselines (24rem in editorial), avoiding
10
10
  * Vanilla's half-baseline ending while retaining its occupied silhouette.
11
- * - 192px horizontal/text minimum -> 24 BF baselines.
12
- * - 352px eight-column minimum -> 44 BF baselines.
13
- * - 284px horizontal media width -> 36 BF baselines (288px in editorial).
11
+ * - 12rem horizontal/text minimum -> 24 BF baselines.
12
+ * - 22rem eight-column minimum -> 44 BF baselines.
13
+ * - 17.75rem horizontal media width -> 36 BF baselines (18rem in editorial).
14
14
  *
15
15
  * The root card establishes a named query container. Only descendants change
16
16
  * inside container queries; this avoids the invalid query-the-container-itself
@@ -40,7 +40,7 @@ export function contentCardCss() {
40
40
  /* Snap the grid-row wrapper after intrinsic image/copy measurement. Because
41
41
  the card flexes inside it, peers retain Vanilla's equal-height row while
42
42
  the card edge and the following row both land on BF baselines. */
43
- @supports (block-size: calc-size(auto, round(up, size, 1px))) {
43
+ @supports (block-size: calc-size(auto, round(up, size, 0.0625rem))) {
44
44
  :where(.bf-theme) :where(.bf-content-card-wrapper) {
45
45
  block-size: calc-size(auto, round(up, size, var(--bf-baseline)));
46
46
  }
@@ -217,7 +217,7 @@ export function contentCardCss() {
217
217
  text-transform: var(--bf-h1-text-transform);
218
218
  }
219
219
 
220
- :where(.bf-theme) :where(.bf-content-card-main-link) {
220
+ :where(.bf-theme) :where(a.bf-content-card-main-link) {
221
221
  -webkit-box-orient: vertical;
222
222
  -webkit-line-clamp: 3;
223
223
  color: inherit;
@@ -237,7 +237,7 @@ export function contentCardCss() {
237
237
  z-index: 1;
238
238
  }
239
239
 
240
- :where(.bf-theme) :where(.bf-content-card-main-link:is(:hover, :focus, :active, :visited)) {
240
+ :where(.bf-theme) :where(a.bf-content-card-main-link:is(:hover, :focus, :active, :visited)) {
241
241
  color: inherit;
242
242
  text-decoration: none;
243
243
  }
@@ -247,8 +247,8 @@ export function contentCardCss() {
247
247
  }
248
248
 
249
249
  :where(.bf-theme) :where(.bf-content-card:has(.bf-content-card-main-link:focus-visible)) {
250
- outline: 3px solid var(--bf-color-focus);
251
- outline-offset: 2px;
250
+ outline: 0.1875rem solid var(--bf-color-focus);
251
+ outline-offset: 0.125rem;
252
252
  }
253
253
 
254
254
  /* All nested actions sit above the expanded main-link hit area. This includes
@@ -324,6 +324,7 @@ export function contentCardCss() {
324
324
  min-inline-size: 0;
325
325
  overflow-x: auto;
326
326
  padding-block-end: var(--bf-space-1);
327
+ padding-block-start: calc(0.5rem - var(--bf-border-width));
327
328
  padding-inline: var(--bf-space-2);
328
329
  position: relative;
329
330
  scrollbar-width: none;
@@ -361,11 +362,11 @@ export function contentCardCss() {
361
362
 
362
363
  /* Internal geometry responds to the card's allocated width. The card root is
363
364
  only the container; the frame/media/body descendants own queried styles. */
364
- /* Vanilla switches the viewport at 620px/1036px. A four-column card is much
365
+ /* Vanilla switches the viewport at 38.75rem/64.75rem. A four-column card is much
365
366
  narrower than that viewport after grid margins and gutters, so its internal
366
- horizontal layout uses Vanilla's 460px minimum viable allocation. The
367
- eight-column 50/50 split starts at the roughly 960px allocation left by the
368
- 1036px viewport. This preserves the rendered switch in embedded BF grids. */
367
+ horizontal layout uses Vanilla's 28.75rem minimum viable allocation. The
368
+ eight-column 50/50 split starts at the roughly 60rem allocation left by the
369
+ 64.75rem viewport. This preserves the rendered switch in embedded BF grids. */
369
370
  @container bf-content-card (width < 28.75rem) {
370
371
  :where(.bf-theme) :where(.bf-content-card-frame:not(:has(.bf-content-card-footer))) {
371
372
  min-block-size: 0;
@@ -1,2 +1,2 @@
1
- /** A wrapping form composition whose children retain their owned spacing. */
1
+ /** A wrapping form composition whose children retain their metric geometry. */
2
2
  export declare function controlRowCss(): string;
@@ -1,4 +1,4 @@
1
- /** A wrapping form composition whose children retain their owned spacing. */
1
+ /** A wrapping form composition whose children retain their metric geometry. */
2
2
  export function controlRowCss() {
3
3
  return `:where(.bf-theme) :where(.bf-control-row) {
4
4
  align-items: end;
@@ -13,11 +13,15 @@ export function documentNavigationCss(options) {
13
13
  :where(.bf-theme) :where(.bf-in-page-navigation) {
14
14
  container-name: bf-in-page-navigation;
15
15
  container-type: inline-size;
16
- margin-block: 0 var(--bf-section-space-shallow);
16
+ margin: 0;
17
17
  min-inline-size: 0;
18
18
  }
19
19
 
20
20
  :where(.bf-theme) :where(.bf-in-page-navigation-nav) {
21
+ --bf-stack-space: var(--bf-space-1);
22
+ align-content: start;
23
+ display: grid;
24
+ gap: var(--bf-stack-space);
21
25
  max-block-size: 100dvb;
22
26
  min-inline-size: 0;
23
27
  overflow: auto;
@@ -28,12 +32,17 @@ export function documentNavigationCss(options) {
28
32
  :where(.bf-theme) :where(.bf-in-page-navigation-heading) {
29
33
  ${headingTypeStyles} color: var(--bf-color-text-muted);
30
34
  display: block;
31
- margin: 0 0 var(--bf-space-1);
32
- padding-block: var(--bf-h6-nudge-start) var(--bf-h6-nudge-end);
35
+ margin-block: 0 var(--bf-h6-margin-bottom);
36
+ padding-block-end: 0;
37
+ padding-block-start: var(--bf-h6-nudge-start);
33
38
  }
34
39
 
35
40
  :where(.bf-theme) :where(.bf-in-page-navigation-list) {
41
+ --bf-stack-space: var(--bf-space-1);
42
+ align-content: start;
36
43
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-color-border-low-contrast);
44
+ display: grid;
45
+ gap: var(--bf-stack-space);
37
46
  list-style: none;
38
47
  margin: 0;
39
48
  min-inline-size: 0;
@@ -41,13 +50,16 @@ ${headingTypeStyles} color: var(--bf-color-text-muted);
41
50
  }
42
51
 
43
52
  :where(.bf-theme) :where(.bf-in-page-navigation-item) {
53
+ align-content: start;
54
+ display: grid;
55
+ gap: var(--bf-stack-space);
44
56
  margin: 0;
45
57
  min-inline-size: 0;
46
58
  padding: 0;
47
59
  position: relative;
48
60
  }
49
61
 
50
- :where(.bf-theme) :where(.bf-in-page-navigation-link) {
62
+ :where(.bf-theme) :where(a.bf-in-page-navigation-link) {
51
63
  ${bodyTypeStyles} color: var(--bf-color-text-muted);
52
64
  display: -webkit-box;
53
65
  line-clamp: 2;
@@ -55,7 +67,7 @@ ${bodyTypeStyles} color: var(--bf-color-text-muted);
55
67
  min-inline-size: 0;
56
68
  overflow: hidden;
57
69
  overflow-wrap: anywhere;
58
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
70
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
59
71
  padding-inline: var(--bf-space-2) 0;
60
72
  position: relative;
61
73
  text-decoration: none;
@@ -63,7 +75,7 @@ ${bodyTypeStyles} color: var(--bf-color-text-muted);
63
75
  -webkit-box-orient: vertical;
64
76
  }
65
77
 
66
- :where(.bf-theme) :where(.bf-in-page-navigation-link:hover) {
78
+ :where(.bf-theme) :where(a.bf-in-page-navigation-link:hover) {
67
79
  color: var(--bf-color-text-default);
68
80
  text-decoration: none;
69
81
  }
@@ -73,8 +85,8 @@ ${bodyTypeStyles} color: var(--bf-color-text-muted);
73
85
  }
74
86
 
75
87
  :where(.bf-theme) :where(.bf-in-page-navigation-link:focus-visible) {
76
- outline: 2px solid var(--bf-color-focus);
77
- outline-offset: 2px;
88
+ outline: 0.125rem solid var(--bf-color-focus);
89
+ outline-offset: 0.125rem;
78
90
  }
79
91
 
80
92
  :where(.bf-theme) :where(.bf-in-page-navigation-link.is-active, .bf-in-page-navigation-link[aria-current]) {
@@ -125,8 +137,8 @@ ${bodyCaseTypeStyles} align-items: center;
125
137
  }
126
138
 
127
139
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle:focus-visible) {
128
- outline: 2px solid var(--bf-color-focus);
129
- outline-offset: -2px;
140
+ outline: 0.125rem solid var(--bf-color-focus);
141
+ outline-offset: -0.125rem;
130
142
  }
131
143
 
132
144
  :where(.bf-theme) :where(.bf-in-page-navigation-toggle > .bf-icon) {
@@ -140,6 +152,7 @@ ${bodyCaseTypeStyles} align-items: center;
140
152
  border-block-end: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
141
153
  display: grid;
142
154
  grid-template-columns: minmax(0, 1fr) auto;
155
+ row-gap: 0;
143
156
  max-block-size: none;
144
157
  overflow: visible;
145
158
  position: static;
@@ -152,6 +165,7 @@ ${bodyCaseTypeStyles} align-items: center;
152
165
  :where(.bf-theme) :where(.bf-in-page-navigation-list) {
153
166
  border: 0;
154
167
  display: flex;
168
+ gap: 0;
155
169
  grid-column: 1;
156
170
  grid-row: 1;
157
171
  margin: 0;
@@ -216,7 +230,8 @@ ${bodyCaseTypeStyles} align-items: center;
216
230
  :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) {
217
231
  background: var(--bf-color-background-alt);
218
232
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-color-border-low-contrast);
219
- display: block;
233
+ display: grid;
234
+ gap: var(--bf-stack-space);
220
235
  grid-column: 1 / -1;
221
236
  grid-row: 2;
222
237
  /* The mobile nav owns a bottom rule; reserve its thickness within the
@@ -227,20 +242,21 @@ ${bodyCaseTypeStyles} align-items: center;
227
242
  }
228
243
 
229
244
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-item, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-item) {
230
- display: block;
245
+ display: grid;
231
246
  max-inline-size: none;
232
247
  }
233
248
 
234
249
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-link, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link) {
235
250
  display: -webkit-box;
236
251
  overflow-wrap: anywhere;
237
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
252
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
238
253
  padding-inline: var(--bf-space-2) 0;
239
254
  white-space: normal;
240
255
  }
241
256
 
242
257
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-list .bf-in-page-navigation-list, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-list .bf-in-page-navigation-list) {
243
- display: block;
258
+ display: grid;
259
+ gap: var(--bf-stack-space);
244
260
  }
245
261
 
246
262
  :where(.bf-theme) :where(.bf-in-page-navigation.is-expanded .bf-in-page-navigation-link.is-active, .bf-in-page-navigation.is-expanded .bf-in-page-navigation-link[aria-current], .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link.is-active, .bf-in-page-navigation:has(.bf-in-page-navigation-toggle[aria-expanded='true']) .bf-in-page-navigation-link[aria-current])::before {
@@ -323,30 +339,47 @@ ${bodyCaseTypeStyles} align-items: center;
323
339
  /* ------------------------------------------------------------------ */
324
340
 
325
341
  :where(.bf-theme) :where(.bf-table-of-contents) {
342
+ --bf-table-of-contents-section-gap: var(--bf-section-space-shallow);
343
+ align-content: start;
326
344
  container-name: bf-table-of-contents;
327
345
  container-type: inline-size;
328
- margin-block: 0 var(--bf-section-space-shallow);
346
+ display: grid;
347
+ gap: var(--bf-table-of-contents-section-gap);
348
+ margin: 0;
329
349
  min-inline-size: 0;
330
350
  }
331
351
 
332
352
  :where(.bf-theme) :where(.bf-table-of-contents-section) {
353
+ --bf-stack-space: 0rem;
354
+ align-content: start;
355
+ display: grid;
356
+ gap: var(--bf-stack-space);
333
357
  margin: 0;
334
358
  min-inline-size: 0;
335
- padding-block-end: var(--bf-space-2);
359
+ padding: 0;
360
+ position: relative;
336
361
  }
337
362
 
338
- :where(.bf-theme) :where(.bf-table-of-contents-section + .bf-table-of-contents-section) {
339
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
340
- padding-block-start: calc(var(--bf-space-2) - var(--bf-border-width));
363
+ :where(.bf-theme) :where(.bf-table-of-contents-section + .bf-table-of-contents-section)::before {
364
+ background: var(--bf-color-border-low-contrast);
365
+ block-size: var(--bf-border-width);
366
+ content: "";
367
+ inset-block-start: 0;
368
+ inset-inline: 0;
369
+ position: absolute;
341
370
  }
342
371
 
343
372
  :where(.bf-theme) :where(.bf-table-of-contents-heading) {
344
- ${headingTypeStyles} color: var(--bf-color-text-muted);
345
- margin: 0 0 var(--bf-space-1);
346
- padding-block: var(--bf-h6-nudge-start) var(--bf-h6-nudge-end);
373
+ color: var(--bf-color-text-default);
374
+ margin: 0;
375
+ padding-block-end: 0;
347
376
  }
348
377
 
349
378
  :where(.bf-theme) :where(.bf-table-of-contents-list) {
379
+ --bf-stack-space: 0rem;
380
+ align-content: start;
381
+ display: grid;
382
+ gap: var(--bf-stack-space);
350
383
  list-style: none;
351
384
  margin: 0;
352
385
  min-inline-size: 0;
@@ -354,21 +387,25 @@ ${headingTypeStyles} color: var(--bf-color-text-muted);
354
387
  }
355
388
 
356
389
  :where(.bf-theme) :where(.bf-table-of-contents-item) {
390
+ align-content: start;
391
+ display: grid;
392
+ gap: var(--bf-stack-space);
357
393
  margin: 0;
358
394
  min-inline-size: 0;
359
395
  padding: 0;
360
396
  }
361
397
 
362
- :where(.bf-theme) :where(.bf-table-of-contents-link) {
363
- ${bodyTypeStyles} color: var(--bf-color-link-default);
398
+ :where(.bf-theme) :where(a.bf-table-of-contents-link) {
399
+ ${bodyTypeStyles} border-block: var(--bf-border-width) solid transparent;
400
+ color: var(--bf-color-link-default);
364
401
  display: block;
365
- margin: 0;
402
+ margin: 0 0 var(--bf-single-line-row-margin-block-end);
366
403
  overflow-wrap: anywhere;
367
- padding-block: calc(var(--bf-body-nudge-start) + var(--bf-space-half)) calc(var(--bf-body-nudge-end) + var(--bf-space-half));
404
+ padding-block: var(--bf-single-line-row-padding-block);
368
405
  text-decoration: none;
369
406
  }
370
407
 
371
- :where(.bf-theme) :where(.bf-table-of-contents-link:hover) {
408
+ :where(.bf-theme) :where(a.bf-table-of-contents-link:hover) {
372
409
  color: var(--bf-color-text-default);
373
410
  text-decoration: underline;
374
411
  }
@@ -378,8 +415,8 @@ ${bodyTypeStyles} color: var(--bf-color-link-default);
378
415
  }
379
416
 
380
417
  :where(.bf-theme) :where(.bf-table-of-contents-link:focus-visible) {
381
- outline: 2px solid var(--bf-color-focus);
382
- outline-offset: 2px;
418
+ outline: 0.125rem solid var(--bf-color-focus);
419
+ outline-offset: 0.125rem;
383
420
  }
384
421
 
385
422
  :where(.bf-theme) :where(.bf-table-of-contents-link.is-active, .bf-table-of-contents-link[aria-current]) {
@@ -12,7 +12,7 @@ export function editorialContentCss(options) {
12
12
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-notice-border);
13
13
  color: var(--bf-color-text-default);
14
14
  display: flow-root;
15
- margin-block: 0 var(--bf-section-space-shallow);
15
+ margin: 0;
16
16
  max-inline-size: 100%;
17
17
  padding-block: var(--bf-space-2);
18
18
  padding-inline: var(--bf-space-2);
@@ -77,12 +77,13 @@ export function interactiveFeedbackCss() {
77
77
  border: var(--bf-border-width) solid var(--bf-color-border-default);
78
78
  border-inline-start: var(--bf-bar-thickness) solid var(--bf-notification-accent);
79
79
  color: var(--bf-color-text-default);
80
- margin-block: 0 var(--bf-space-3);
80
+ margin-block: 0;
81
81
  max-inline-size: 100%;
82
82
  min-inline-size: 0;
83
83
  overflow-wrap: anywhere;
84
- padding-block: calc(var(--bf-space-1) - var(--bf-border-width));
85
- padding-inline: calc((var(--bf-space-2) * 2) + var(--bf-icon-size-default)) 0;
84
+ padding-block-end: max(0rem, calc(var(--bf-space-half) - var(--bf-border-width)));
85
+ padding-block-start: 0;
86
+ padding-inline: calc(var(--bf-icon-label-inline-offset) - var(--bf-bar-thickness)) var(--bf-space-1);
86
87
  position: relative;
87
88
  }
88
89
 
@@ -105,14 +106,14 @@ export function interactiveFeedbackCss() {
105
106
  :where(.bf-theme) :where(.bf-notification.is-borderless) {
106
107
  border: 0;
107
108
  padding-block: 0;
108
- padding-inline: calc(var(--bf-space-2) * 2) 0;
109
+ padding-inline: calc(var(--bf-icon-size-default) + var(--bf-space-1)) 0;
109
110
  }
110
111
 
111
112
  :where(.bf-theme) :where(.bf-notification-icon) {
112
113
  background-color: var(--bf-notification-accent);
113
114
  background-image: none;
114
- inset-block-start: calc(var(--bf-space-1) + ((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start));
115
- inset-inline-start: var(--bf-space-2);
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));
116
117
  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");
117
118
  mask-position: center;
118
119
  mask-repeat: no-repeat;
@@ -133,22 +134,52 @@ export function interactiveFeedbackCss() {
133
134
  }
134
135
 
135
136
  :where(.bf-theme) :where(.bf-notification.is-borderless > .bf-notification-icon) {
136
- inset-block-start: calc(((var(--bf-body-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-body-nudge-start));
137
+ inset-block-start: calc(((var(--bf-h6-line-height) - var(--bf-icon-size-default)) / 2) + var(--bf-h6-nudge-start));
137
138
  inset-inline-start: 0;
138
139
  }
139
140
 
141
+ :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));
143
+ }
144
+
140
145
  :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
141
146
  max-inline-size: 100%;
142
147
  min-inline-size: 0;
143
148
  }
144
149
 
145
150
  :where(.bf-theme) :where(.bf-notification-content) {
146
- margin-block-end: calc(var(--bf-space-2) - var(--bf-body-nudge-start));
147
- padding-block-start: var(--bf-body-nudge-start);
148
- padding-inline-end: var(--bf-space-4);
151
+ /* Neutralise the shell's top border so the first metric role starts on-grid. */
152
+ margin-block: calc(var(--bf-border-width) * -1) 0;
153
+ padding-block-start: 0;
154
+ padding-inline-end: calc(var(--bf-icon-size-default) + var(--bf-space-1));
155
+ }
156
+
157
+ :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-content) {
158
+ --bf-stack-space: 0rem;
159
+ margin-block-start: 0;
160
+ }
161
+
162
+ /* Metadata-bearing notifications use a full baseline between title and copy,
163
+ and pair it with the full end inset. This keeps both the metadata boundary
164
+ and the complete shell on-grid; simpler messages retain compact rhythm. */
165
+ :where(.bf-theme) :where(.bf-notification:has(> .bf-notification-meta)) {
166
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width));
167
+ }
168
+
169
+ :where(.bf-theme) :where(.bf-notification.is-inline) {
170
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width));
171
+ }
172
+
173
+ /* Return the cancelled H6/body metric edges to the shell boundary. The
174
+ * Documentation tier deliberately gives those roles different metrics, so
175
+ * deriving this inset keeps every bordered notification on-grid without
176
+ * reopening the visible title/copy gap. Keep this after the shell variants so
177
+ * the metric relationship owns their final compensation. */
178
+ :where(.bf-theme) :where(.bf-notification:has(> .bf-notification-content.is-metric-flush):not(.is-borderless)) {
179
+ padding-block-end: calc(var(--bf-space-1) - var(--bf-border-width) + var(--bf-baseline) - var(--bf-h6-nudge-start) - var(--bf-body-margin-bottom));
149
180
  }
150
181
 
151
- :where(.bf-theme) :where(.bf-notification-title, .bf-notification-message, .bf-notification-timestamp) {
182
+ :where(.bf-theme) :where(.bf-notification-message, .bf-notification-timestamp) {
152
183
  font-family: var(--bf-body-font-family);
153
184
  font-size: var(--bf-body-font-size);
154
185
  font-style: var(--bf-body-font-style);
@@ -156,20 +187,11 @@ export function interactiveFeedbackCss() {
156
187
  max-inline-size: 100%;
157
188
  }
158
189
 
159
- :where(.bf-theme) :where(.bf-notification-title) {
160
- font-weight: 600;
161
- margin-block: 0;
162
- padding-block: 0;
163
- }
164
-
165
190
  :where(.bf-theme) :where(.bf-notification-message) {
166
191
  font-weight: var(--bf-body-font-weight);
167
- margin-block: 0;
168
- padding-block: 0;
169
- }
170
-
171
- :where(.bf-theme) :where(.bf-notification.is-inline .bf-notification-title, .bf-notification.is-inline .bf-notification-message) {
172
- display: inline;
192
+ margin-block: 0 var(--bf-body-margin-bottom);
193
+ padding-block-end: 0;
194
+ padding-block-start: var(--bf-body-nudge-start);
173
195
  }
174
196
 
175
197
  :where(.bf-theme) :where(.bf-notification-close) {
@@ -179,8 +201,8 @@ export function interactiveFeedbackCss() {
179
201
  margin-block-end: 0;
180
202
  padding: 0;
181
203
  position: absolute;
182
- inset-block-start: var(--bf-space-1);
183
- inset-inline-end: var(--bf-space-1);
204
+ inset-block-start: 0;
205
+ inset-inline-end: 0;
184
206
  }
185
207
 
186
208
  :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-close) {
@@ -195,7 +217,7 @@ export function interactiveFeedbackCss() {
195
217
  flex-wrap: wrap;
196
218
  gap: var(--bf-space-1) var(--bf-space-2);
197
219
  justify-content: space-between;
198
- margin-block-end: var(--bf-space-1);
220
+ margin-block-end: 0;
199
221
  padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
200
222
  padding-inline-end: var(--bf-space-2);
201
223
  }
@@ -208,7 +230,7 @@ export function interactiveFeedbackCss() {
208
230
  :where(.bf-theme) :where(.bf-notification-timestamp) {
209
231
  color: var(--bf-color-text-muted);
210
232
  font-weight: var(--bf-body-font-weight);
211
- margin-block: 0 calc(var(--bf-space-2) - var(--bf-body-nudge-start));
233
+ margin-block: 0 var(--bf-body-margin-bottom);
212
234
  padding-block: var(--bf-body-nudge-start) 0;
213
235
  }
214
236
 
@@ -223,7 +245,7 @@ export function interactiveFeedbackCss() {
223
245
 
224
246
  :where(.bf-theme) :where(.bf-notification-actions > .bf-button.is-link) {
225
247
  flex: 0 0 auto;
226
- margin-block-end: calc(var(--bf-space-2) - var(--bf-body-nudge-start));
248
+ margin-block-end: var(--bf-body-margin-bottom);
227
249
  padding-block: var(--bf-body-nudge-start) 0;
228
250
  }
229
251
  `;
@@ -20,10 +20,10 @@ export function interactiveTablesCss() {
20
20
  cursor: inherit;
21
21
  display: inline-block;
22
22
  font: inherit;
23
- margin: -2px calc(var(--bf-space-half) * -1);
23
+ margin: -0.125rem calc(var(--bf-space-half) * -1);
24
24
  max-inline-size: 100%;
25
25
  overflow: hidden;
26
- padding: 2px var(--bf-space-half);
26
+ padding: 0.125rem var(--bf-space-half);
27
27
  text-align: inherit;
28
28
  text-decoration: inherit;
29
29
  text-overflow: inherit;
@@ -34,7 +34,7 @@ export function interactiveTablesCss() {
34
34
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort]:hover, .bf-table-sort-button:focus-visible) {
35
35
  color: var(--bf-color-link-default);
36
36
  text-decoration: underline;
37
- text-decoration-thickness: 1px;
37
+ text-decoration-thickness: 0.0625rem;
38
38
  text-underline-offset: 0.075em;
39
39
  }
40
40
 
@@ -43,11 +43,11 @@ export function interactiveTablesCss() {
43
43
  }
44
44
 
45
45
  :where(.bf-theme) :where(.bf-table-sort-button:focus-visible) {
46
- outline: 2px solid var(--bf-color-focus);
47
- outline-offset: -2px;
46
+ outline: 0.125rem solid var(--bf-color-focus);
47
+ outline-offset: -0.125rem;
48
48
  }
49
49
 
50
- :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
50
+ :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort])::after {
51
51
  background-image: var(--bf-ui-icon-chevron-down);
52
52
  background-position: center;
53
53
  background-repeat: no-repeat;
@@ -57,9 +57,14 @@ export function interactiveTablesCss() {
57
57
  display: inline-block;
58
58
  inline-size: var(--bf-icon-size-default);
59
59
  margin-inline-start: var(--bf-space-half);
60
+ opacity: 0;
60
61
  vertical-align: calc((1cap - var(--bf-icon-size-default)) / 2);
61
62
  }
62
63
 
64
+ :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'], .bf-table.is-sortable th[aria-sort='descending'])::after {
65
+ opacity: 1;
66
+ }
67
+
63
68
  :where(.bf-theme) :where(.bf-table.is-sortable th[aria-sort='ascending'])::after {
64
69
  transform: rotate(180deg);
65
70
  }
@@ -96,9 +101,9 @@ export function interactiveTablesCss() {
96
101
  }
97
102
 
98
103
  :where(.bf-theme) :where(.bf-table-mobile-card-frame > .bf-table.is-mobile-card > thead) {
99
- block-size: 1px;
104
+ block-size: 0.0625rem;
100
105
  clip-path: inset(50%);
101
- inline-size: 1px;
106
+ inline-size: 0.0625rem;
102
107
  overflow: hidden;
103
108
  position: absolute;
104
109
  white-space: nowrap;
@@ -4,6 +4,5 @@ export interface LegacyNavigationCssOptions {
4
4
  bodyTypeStyles: string;
5
5
  buttonMarginBottom: string;
6
6
  buttonPadding: string;
7
- compactButtonPadding: string;
8
7
  }
9
8
  export declare function legacyNavigationCss(options: LegacyNavigationCssOptions): string;