baseline-foundry 0.1.3 → 0.1.5

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 (84) hide show
  1. package/README.md +577 -553
  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/build.js +4 -4
  11. package/dist/code-snippet.js +1 -1
  12. package/dist/css-app-tier.js +78 -73
  13. package/dist/css-components/article-pagination.js +141 -140
  14. package/dist/css-components/button-actions.js +181 -161
  15. package/dist/css-components/cards-options.js +176 -176
  16. package/dist/css-components/chip-badge-status.d.ts +0 -3
  17. package/dist/css-components/chip-badge-status.js +174 -159
  18. package/dist/css-components/content-card.d.ts +7 -7
  19. package/dist/css-components/content-card.js +498 -497
  20. package/dist/css-components/control-row.d.ts +1 -1
  21. package/dist/css-components/control-row.js +15 -15
  22. package/dist/css-components/cta-figure-aspect.js +120 -120
  23. package/dist/css-components/document-navigation.js +427 -390
  24. package/dist/css-components/editorial-content.js +42 -42
  25. package/dist/css-components/icon.js +72 -72
  26. package/dist/css-components/interactive-feedback.js +239 -217
  27. package/dist/css-components/interactive-tables.js +160 -155
  28. package/dist/css-components/legacy-navigation.d.ts +8 -0
  29. package/dist/css-components/legacy-navigation.js +816 -0
  30. package/dist/css-components/linked-logo-site-layout.d.ts +3 -3
  31. package/dist/css-components/linked-logo-site-layout.js +177 -180
  32. package/dist/css-components/list-tree.js +96 -94
  33. package/dist/css-components/list.js +9 -7
  34. package/dist/css-components/logo-media.d.ts +6 -6
  35. package/dist/css-components/logo-media.js +218 -207
  36. package/dist/css-components/navigation-layout.js +144 -144
  37. package/dist/css-components/panel.js +148 -144
  38. package/dist/css-components/search-box-and-filter.d.ts +0 -1
  39. package/dist/css-components/search-box-and-filter.js +263 -264
  40. package/dist/css-components/sites-editorial-ports.d.ts +3 -4
  41. package/dist/css-components/sites-editorial-ports.js +279 -247
  42. package/dist/css-components/sites-foundation.js +142 -146
  43. package/dist/css-components/sites-rich-lists.d.ts +5 -5
  44. package/dist/css-components/sites-rich-lists.js +339 -349
  45. package/dist/css-components/static-content-ports.d.ts +3 -3
  46. package/dist/css-components/static-content-ports.js +200 -186
  47. package/dist/css-components/tab-section.d.ts +3 -3
  48. package/dist/css-components/tab-section.js +93 -85
  49. package/dist/css-components/table.js +76 -75
  50. package/dist/css-components/tabs-choice-breadcrumbs.js +307 -303
  51. package/dist/css-components/tiered-list-equal-height-row.js +271 -271
  52. package/dist/css-components.js +1881 -2554
  53. package/dist/css-grid.d.ts +1 -1
  54. package/dist/css-grid.js +183 -173
  55. package/dist/css.js +317 -241
  56. package/dist/experiments/ibm-plex-engine-smoke/styles.css +894 -538
  57. package/dist/experiments/ibm-plex-engine-smoke/surfaces.json +2 -2
  58. package/dist/experiments/ibm-plex-engine-smoke/tokens.json +1 -1
  59. package/dist/in-page-navigation.js +1 -1
  60. package/dist/presets/app-tier/styles.css +928 -568
  61. package/dist/presets/app-tier/surfaces.json +17 -17
  62. package/dist/presets/app-tier/tokens.json +7 -7
  63. package/dist/presets/prose/styles.css +919 -562
  64. package/dist/presets/prose/surfaces.json +17 -17
  65. package/dist/presets/prose/tokens.json +1 -1
  66. package/dist/resizable-aside.js +12 -4
  67. package/dist/styles.css +919 -562
  68. package/dist/surfaces.json +17 -17
  69. package/dist/tiers/app/styles.css +928 -568
  70. package/dist/tiers/app/surfaces.json +17 -17
  71. package/dist/tiers/app/tokens.json +7 -7
  72. package/dist/tiers/documentation/styles.css +920 -563
  73. package/dist/tiers/documentation/surfaces.json +17 -17
  74. package/dist/tiers/documentation/tokens.json +2 -2
  75. package/dist/tiers/editorial/styles.css +919 -562
  76. package/dist/tiers/editorial/surfaces.json +17 -17
  77. package/dist/tiers/editorial/tokens.json +1 -1
  78. package/dist/tiers/os/styles.css +925 -568
  79. package/dist/tiers/os/surfaces.json +17 -17
  80. package/dist/tiers/os/tokens.json +7 -7
  81. package/dist/tokens.json +1 -1
  82. package/dist/types.d.ts +1 -1
  83. package/docs/publishing.md +31 -14
  84. package/package.json +119 -108
@@ -1,230 +1,252 @@
1
1
  /** Credential and transient-feedback compositions built on BF controls and type roles. */
2
2
  export function interactiveFeedbackCss() {
3
- return `/* ------------------------------------------------------------------ */
4
- /* Credential reveal and repeated validation */
5
- /* ------------------------------------------------------------------ */
6
-
7
- :where(.bf-theme) :where(.bf-credential) {
8
- min-inline-size: 0;
9
- }
10
-
11
- :where(.bf-theme) :where(.bf-credential-header) {
12
- align-items: flex-start;
13
- display: flex;
14
- gap: var(--bf-space-2);
15
- justify-content: space-between;
16
- min-inline-size: 0;
17
- }
18
-
19
- :where(.bf-theme) :where(.bf-credential-header > .bf-form-label) {
20
- flex: 1 1 auto;
21
- min-inline-size: 0;
22
- }
23
-
24
- /* This button is a control inside the field heading, so the composition
25
- explicitly trims the standalone control's trailing flow compensation. */
26
- :where(.bf-theme) :where(.bf-password-reveal) {
27
- border: 0;
28
- flex: 0 0 auto;
29
- margin-block-end: 0;
30
- /* This attached action shares the label row. Its borderless base uses the
31
- paired body nudges directly, preserving the row's occupied grid block. */
32
- padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
33
- }
34
-
35
- :where(.bf-theme) :where(.bf-password-reveal > .bf-password-reveal-icon) {
36
- background-color: currentColor;
37
- background-image: none;
38
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 3.002c2.946 0 5.612 1.666 8 4.998-2.388 3.332-5.054 4.998-8 4.998C5.054 12.998 2.388 11.332 0 8c2.388-3.332 5.054-4.998 8-4.998zM8 5a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 1.49a1.51 1.51 0 1 1 0 3.02 1.51 1.51 0 0 1 0-3.02z'/%3E%3C/svg%3E");
39
- mask-position: center;
40
- mask-repeat: no-repeat;
41
- mask-size: contain;
42
- }
43
-
44
- :where(.bf-theme) :where(.bf-password-reveal[aria-pressed='true'] > .bf-password-reveal-icon) {
45
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m13.938.624 1.06 1.06-2.653 2.653c1.27.823 2.475 2.026 3.616 3.61v.106l-.193.264C13.44 11.44 10.851 13 8 13a7.654 7.654 0 0 1-3.479-.839l-2.354 2.354-1.06-1.06L13.937.624zm-2.682 4.802L9.714 6.969a2 2 0 0 1-2.745 2.745L5.653 11.03a6.114 6.114 0 0 0 2.098.465L8 11.5c2.076 0 4.03-1.042 5.893-3.233L14.115 8l-.222-.267c-.858-1.01-1.736-1.775-2.637-2.307zM8 3c.608 0 1.203.07 1.787.213L8.482 4.519a6.072 6.072 0 0 0-.233-.014L8 4.5c-2.076 0-4.03 1.042-5.893 3.233L1.884 8l.223.267c.428.503.86.946 1.3 1.33l-1.062 1.061C1.535 9.938.754 9.052 0 8c2.388-3.333 5.054-5 8-5z'/%3E%3C/svg%3E");
46
- }
47
-
48
- /* Revealed readonly credentials stay legible; the generic readonly treatment
49
- remains correct for ordinary text fields outside this explicit composition. */
50
- :where(.bf-theme) :where(.bf-credential input[type='text'][readonly]) {
51
- color: var(--bf-color-text-default);
52
- }
53
-
3
+ return `/* ------------------------------------------------------------------ */
4
+ /* Credential reveal and repeated validation */
5
+ /* ------------------------------------------------------------------ */
6
+
7
+ :where(.bf-theme) :where(.bf-credential) {
8
+ min-inline-size: 0;
9
+ }
10
+
11
+ :where(.bf-theme) :where(.bf-credential-header) {
12
+ align-items: flex-start;
13
+ display: flex;
14
+ gap: var(--bf-space-2);
15
+ justify-content: space-between;
16
+ min-inline-size: 0;
17
+ }
18
+
19
+ :where(.bf-theme) :where(.bf-credential-header > .bf-form-label) {
20
+ flex: 1 1 auto;
21
+ min-inline-size: 0;
22
+ }
23
+
24
+ /* This button is a control inside the field heading, so the composition
25
+ explicitly trims the standalone control's trailing flow compensation. */
26
+ :where(.bf-theme) :where(.bf-password-reveal) {
27
+ border: 0;
28
+ flex: 0 0 auto;
29
+ margin-block-end: 0;
30
+ /* This attached action shares the label row. Its borderless base uses the
31
+ paired body nudges directly, preserving the row's occupied grid block. */
32
+ padding-block: var(--bf-body-nudge-start) var(--bf-body-nudge-end);
33
+ }
34
+
35
+ :where(.bf-theme) :where(.bf-password-reveal > .bf-password-reveal-icon) {
36
+ background-color: currentColor;
37
+ background-image: none;
38
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 3.002c2.946 0 5.612 1.666 8 4.998-2.388 3.332-5.054 4.998-8 4.998C5.054 12.998 2.388 11.332 0 8c2.388-3.332 5.054-4.998 8-4.998zM8 5a3 3 0 1 0 0 6 3 3 0 0 0 0-6zm0 1.49a1.51 1.51 0 1 1 0 3.02 1.51 1.51 0 0 1 0-3.02z'/%3E%3C/svg%3E");
39
+ mask-position: center;
40
+ mask-repeat: no-repeat;
41
+ mask-size: contain;
42
+ }
43
+
44
+ :where(.bf-theme) :where(.bf-password-reveal[aria-pressed='true'] > .bf-password-reveal-icon) {
45
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='m13.938.624 1.06 1.06-2.653 2.653c1.27.823 2.475 2.026 3.616 3.61v.106l-.193.264C13.44 11.44 10.851 13 8 13a7.654 7.654 0 0 1-3.479-.839l-2.354 2.354-1.06-1.06L13.937.624zm-2.682 4.802L9.714 6.969a2 2 0 0 1-2.745 2.745L5.653 11.03a6.114 6.114 0 0 0 2.098.465L8 11.5c2.076 0 4.03-1.042 5.893-3.233L14.115 8l-.222-.267c-.858-1.01-1.736-1.775-2.637-2.307zM8 3c.608 0 1.203.07 1.787.213L8.482 4.519a6.072 6.072 0 0 0-.233-.014L8 4.5c-2.076 0-4.03 1.042-5.893 3.233L1.884 8l.223.267c.428.503.86.946 1.3 1.33l-1.062 1.061C1.535 9.938.754 9.052 0 8c2.388-3.333 5.054-5 8-5z'/%3E%3C/svg%3E");
46
+ }
47
+
48
+ /* Revealed readonly credentials stay legible; the generic readonly treatment
49
+ remains correct for ordinary text fields outside this explicit composition. */
50
+ :where(.bf-theme) :where(.bf-credential input[type='text'][readonly]) {
51
+ color: var(--bf-color-text-default);
52
+ }
53
+
54
54
  :where(.bf-theme) :where(.bf-credential-validation) {
55
55
  align-content: start;
56
56
  display: grid;
57
57
  gap: var(--bf-space-1);
58
58
  list-style: none;
59
- margin-block: 0;
60
- padding-inline-start: 0;
61
- }
62
-
59
+ margin-block: 0;
60
+ padding-inline-start: 0;
61
+ }
62
+
63
63
  :where(.bf-theme) :where(.bf-credential-validation > .bf-validation) {
64
64
  align-content: start;
65
65
  display: grid;
66
66
  margin-block: 0;
67
- min-inline-size: 0;
68
- }
69
-
70
- /* ------------------------------------------------------------------ */
71
- /* Notification — transient status feedback, distinct from bf-notice */
72
- /* ------------------------------------------------------------------ */
73
-
74
- :where(.bf-theme) :where(.bf-notification, .bf-notification.is-information, .bf-notification.is-positive, .bf-notification.is-caution, .bf-notification.is-negative) {
75
- --bf-notification-accent: var(--bf-color-border-information);
76
- background: var(--bf-color-background-default);
77
- 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
- color: var(--bf-color-text-default);
80
- margin-block: 0 var(--bf-space-3);
81
- max-inline-size: 100%;
82
- min-inline-size: 0;
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;
86
- position: relative;
87
- }
88
-
89
- :where(.bf-theme) :where(.bf-notification.is-positive) {
90
- --bf-notification-accent: var(--bf-color-border-positive);
91
- }
92
-
93
- :where(.bf-theme) :where(.bf-notification.is-caution) {
94
- --bf-notification-accent: var(--bf-color-border-caution);
95
- }
96
-
97
- :where(.bf-theme) :where(.bf-notification.is-negative) {
98
- --bf-notification-accent: var(--bf-color-border-negative);
99
- }
100
-
101
- :where(.bf-theme) :where(.bf-notification[hidden]) {
102
- display: none;
103
- }
104
-
105
- :where(.bf-theme) :where(.bf-notification.is-borderless) {
106
- border: 0;
107
- padding-block: 0;
108
- padding-inline: calc(var(--bf-space-2) * 2) 0;
109
- }
110
-
111
- :where(.bf-theme) :where(.bf-notification-icon) {
112
- background-color: var(--bf-notification-accent);
113
- 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);
116
- 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
- mask-position: center;
118
- mask-repeat: no-repeat;
119
- mask-size: contain;
120
- position: absolute;
121
- }
122
-
123
- :where(.bf-theme) :where(.bf-notification.is-positive > .bf-notification-icon) {
124
- 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-13zm2.814 2.45 1.203.897-5.537 7.43-3.485-3.694 1.09-1.03 2.259 2.394 4.47-5.997z'/%3E%3C/svg%3E");
125
- }
126
-
127
- :where(.bf-theme) :where(.bf-notification.is-caution > .bf-notification-icon) {
128
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8.865 1.5 15.77 13.5a1 1 0 0 1-.866 1.5H1.096a1 1 0 0 1-.866-1.5l6.905-12a1 1 0 0 1 1.73 0zM8 3.49 2.392 13.5h11.216L8 3.49zm-.75 3.01h1.5v3.75h-1.5V6.5zM8 11.25a1 1 0 1 1 0 2 1 1 0 0 1 0-2z'/%3E%3C/svg%3E");
129
- }
130
-
131
- :where(.bf-theme) :where(.bf-notification.is-negative > .bf-notification-icon) {
132
- 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-13zm2.282 3.138 1.06 1.061L9.052 7.99l2.291 2.292-1.061 1.06L7.99 9.052l-2.291 2.291-1.061-1.061L6.929 7.99 4.638 5.699l1.061-1.061L7.99 6.929l2.292-2.291z'/%3E%3C/svg%3E");
133
- }
134
-
135
- :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-inline-start: 0;
138
- }
139
-
140
- :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
141
- max-inline-size: 100%;
142
- min-inline-size: 0;
143
- }
144
-
145
- :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);
149
- }
150
-
151
- :where(.bf-theme) :where(.bf-notification-title, .bf-notification-message, .bf-notification-timestamp) {
152
- font-family: var(--bf-body-font-family);
153
- font-size: var(--bf-body-font-size);
154
- font-style: var(--bf-body-font-style);
155
- line-height: var(--bf-body-line-height);
156
- max-inline-size: 100%;
157
- }
158
-
159
- :where(.bf-theme) :where(.bf-notification-title) {
160
- font-weight: 600;
161
- margin-block: 0;
162
- padding-block: 0;
163
- }
164
-
165
- :where(.bf-theme) :where(.bf-notification-message) {
166
- 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;
173
- }
174
-
175
- :where(.bf-theme) :where(.bf-notification-close) {
176
- block-size: calc((var(--bf-space-1) * 2) + var(--bf-icon-size-default));
177
- border: 0;
178
- inline-size: var(--bf-icon-size-default);
179
- margin-block-end: 0;
180
- padding: 0;
181
- position: absolute;
182
- inset-block-start: var(--bf-space-1);
183
- inset-inline-end: var(--bf-space-1);
184
- }
185
-
186
- :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-close) {
187
- inset-block-start: 0;
188
- inset-inline-end: 0;
189
- }
190
-
191
- :where(.bf-theme) :where(.bf-notification-meta) {
192
- align-items: flex-start;
193
- border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
194
- display: flex;
195
- flex-wrap: wrap;
196
- gap: var(--bf-space-1) var(--bf-space-2);
197
- justify-content: space-between;
198
- margin-block-end: var(--bf-space-1);
199
- padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
200
- padding-inline-end: var(--bf-space-2);
201
- }
202
-
203
- :where(.bf-theme) :where(.bf-notification.is-inline .bf-notification-meta) {
204
- border-block-start: 0;
205
- padding-block-start: 0;
206
- }
207
-
208
- :where(.bf-theme) :where(.bf-notification-timestamp) {
209
- color: var(--bf-color-text-muted);
210
- font-weight: var(--bf-body-font-weight);
211
- margin-block: 0 calc(var(--bf-space-2) - var(--bf-body-nudge-start));
212
- padding-block: var(--bf-body-nudge-start) 0;
213
- }
214
-
215
- :where(.bf-theme) :where(.bf-notification-actions) {
216
- align-items: flex-start;
217
- display: flex;
218
- flex-wrap: wrap;
219
- gap: var(--bf-space-1) var(--bf-space-2);
220
- margin-inline-start: auto;
221
- min-inline-size: 0;
222
- }
223
-
224
- :where(.bf-theme) :where(.bf-notification-actions > .bf-button.is-link) {
225
- flex: 0 0 auto;
226
- margin-block-end: calc(var(--bf-space-2) - var(--bf-body-nudge-start));
227
- padding-block: var(--bf-body-nudge-start) 0;
228
- }
67
+ min-inline-size: 0;
68
+ }
69
+
70
+ /* ------------------------------------------------------------------ */
71
+ /* Notification — transient status feedback, distinct from bf-notice */
72
+ /* ------------------------------------------------------------------ */
73
+
74
+ :where(.bf-theme) :where(.bf-notification, .bf-notification.is-information, .bf-notification.is-positive, .bf-notification.is-caution, .bf-notification.is-negative) {
75
+ --bf-notification-accent: var(--bf-color-border-information);
76
+ background: var(--bf-color-background-default);
77
+ 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
+ color: var(--bf-color-text-default);
80
+ margin-block: 0;
81
+ max-inline-size: 100%;
82
+ min-inline-size: 0;
83
+ overflow-wrap: anywhere;
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);
87
+ position: relative;
88
+ }
89
+
90
+ :where(.bf-theme) :where(.bf-notification.is-positive) {
91
+ --bf-notification-accent: var(--bf-color-border-positive);
92
+ }
93
+
94
+ :where(.bf-theme) :where(.bf-notification.is-caution) {
95
+ --bf-notification-accent: var(--bf-color-border-caution);
96
+ }
97
+
98
+ :where(.bf-theme) :where(.bf-notification.is-negative) {
99
+ --bf-notification-accent: var(--bf-color-border-negative);
100
+ }
101
+
102
+ :where(.bf-theme) :where(.bf-notification[hidden]) {
103
+ display: none;
104
+ }
105
+
106
+ :where(.bf-theme) :where(.bf-notification.is-borderless) {
107
+ border: 0;
108
+ padding-block: 0;
109
+ padding-inline: calc(var(--bf-icon-size-default) + var(--bf-space-1)) 0;
110
+ }
111
+
112
+ :where(.bf-theme) :where(.bf-notification-icon) {
113
+ background-color: var(--bf-notification-accent);
114
+ 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));
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");
118
+ mask-position: center;
119
+ mask-repeat: no-repeat;
120
+ mask-size: contain;
121
+ position: absolute;
122
+ }
123
+
124
+ :where(.bf-theme) :where(.bf-notification.is-positive > .bf-notification-icon) {
125
+ 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-13zm2.814 2.45 1.203.897-5.537 7.43-3.485-3.694 1.09-1.03 2.259 2.394 4.47-5.997z'/%3E%3C/svg%3E");
126
+ }
127
+
128
+ :where(.bf-theme) :where(.bf-notification.is-caution > .bf-notification-icon) {
129
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8.865 1.5 15.77 13.5a1 1 0 0 1-.866 1.5H1.096a1 1 0 0 1-.866-1.5l6.905-12a1 1 0 0 1 1.73 0zM8 3.49 2.392 13.5h11.216L8 3.49zm-.75 3.01h1.5v3.75h-1.5V6.5zM8 11.25a1 1 0 1 1 0 2 1 1 0 0 1 0-2z'/%3E%3C/svg%3E");
130
+ }
131
+
132
+ :where(.bf-theme) :where(.bf-notification.is-negative > .bf-notification-icon) {
133
+ 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-13zm2.282 3.138 1.06 1.061L9.052 7.99l2.291 2.292-1.061 1.06L7.99 9.052l-2.291 2.291-1.061-1.061L6.929 7.99 4.638 5.699l1.061-1.061L7.99 6.929l2.292-2.291z'/%3E%3C/svg%3E");
134
+ }
135
+
136
+ :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));
138
+ inset-inline-start: 0;
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
+
145
+ :where(.bf-theme) :where(.bf-notification-content, .bf-notification-meta) {
146
+ max-inline-size: 100%;
147
+ min-inline-size: 0;
148
+ }
149
+
150
+ :where(.bf-theme) :where(.bf-notification-content) {
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));
180
+ }
181
+
182
+ :where(.bf-theme) :where(.bf-notification-message, .bf-notification-timestamp) {
183
+ font-family: var(--bf-body-font-family);
184
+ font-size: var(--bf-body-font-size);
185
+ font-style: var(--bf-body-font-style);
186
+ line-height: var(--bf-body-line-height);
187
+ max-inline-size: 100%;
188
+ }
189
+
190
+ :where(.bf-theme) :where(.bf-notification-message) {
191
+ font-weight: var(--bf-body-font-weight);
192
+ margin-block: 0 var(--bf-body-margin-bottom);
193
+ padding-block-end: 0;
194
+ padding-block-start: var(--bf-body-nudge-start);
195
+ }
196
+
197
+ :where(.bf-theme) :where(.bf-notification-close) {
198
+ block-size: calc((var(--bf-space-1) * 2) + var(--bf-icon-size-default));
199
+ border: 0;
200
+ inline-size: var(--bf-icon-size-default);
201
+ margin-block-end: 0;
202
+ padding: 0;
203
+ position: absolute;
204
+ inset-block-start: 0;
205
+ inset-inline-end: 0;
206
+ }
207
+
208
+ :where(.bf-theme) :where(.bf-notification.is-borderless .bf-notification-close) {
209
+ inset-block-start: 0;
210
+ inset-inline-end: 0;
211
+ }
212
+
213
+ :where(.bf-theme) :where(.bf-notification-meta) {
214
+ align-items: flex-start;
215
+ border-block-start: var(--bf-border-width) solid var(--bf-color-border-low-contrast);
216
+ display: flex;
217
+ flex-wrap: wrap;
218
+ gap: var(--bf-space-1) var(--bf-space-2);
219
+ justify-content: space-between;
220
+ margin-block-end: 0;
221
+ padding-block-start: calc(var(--bf-space-1) - var(--bf-border-width));
222
+ padding-inline-end: var(--bf-space-2);
223
+ }
224
+
225
+ :where(.bf-theme) :where(.bf-notification.is-inline .bf-notification-meta) {
226
+ border-block-start: 0;
227
+ padding-block-start: 0;
228
+ }
229
+
230
+ :where(.bf-theme) :where(.bf-notification-timestamp) {
231
+ color: var(--bf-color-text-muted);
232
+ font-weight: var(--bf-body-font-weight);
233
+ margin-block: 0 var(--bf-body-margin-bottom);
234
+ padding-block: var(--bf-body-nudge-start) 0;
235
+ }
236
+
237
+ :where(.bf-theme) :where(.bf-notification-actions) {
238
+ align-items: flex-start;
239
+ display: flex;
240
+ flex-wrap: wrap;
241
+ gap: var(--bf-space-1) var(--bf-space-2);
242
+ margin-inline-start: auto;
243
+ min-inline-size: 0;
244
+ }
245
+
246
+ :where(.bf-theme) :where(.bf-notification-actions > .bf-button.is-link) {
247
+ flex: 0 0 auto;
248
+ margin-block-end: var(--bf-body-margin-bottom);
249
+ padding-block: var(--bf-body-nudge-start) 0;
250
+ }
229
251
  `;
230
252
  }