@db-ux/core-components 4.0.4 → 4.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 (34) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/build/assets/fonts/OpenSans-Bold-EU.woff2 +0 -0
  3. package/build/assets/fonts/OpenSans-ExtraBold-EU.woff2 +0 -0
  4. package/build/assets/fonts/OpenSans-Light-EU.woff2 +0 -0
  5. package/build/assets/fonts/OpenSans-Medium-EU.woff2 +0 -0
  6. package/build/assets/fonts/OpenSans-Regular-EU.woff2 +0 -0
  7. package/build/assets/fonts/OpenSans-SemiBold-EU.woff2 +0 -0
  8. package/build/assets/fonts/generate-eu-fonts.ts +1 -1
  9. package/build/assets/fonts/unicode-eu.txt +1 -0
  10. package/build/components/badge/badge.css +2 -1
  11. package/build/components/button/button.css +10 -5
  12. package/build/components/button/button.scss +10 -5
  13. package/build/components/custom-select/custom-select.css +47 -4
  14. package/build/components/custom-select/custom-select.scss +4 -0
  15. package/build/components/input/input.css +46 -5
  16. package/build/components/notification/notification-grid-default.scss +50 -0
  17. package/build/components/notification/notification-grid-non-overlay.scss +71 -57
  18. package/build/components/notification/notification-grid-overlay.scss +153 -52
  19. package/build/components/notification/notification-grid-shared.css +1 -0
  20. package/build/components/notification/notification-grid-shared.scss +80 -0
  21. package/build/components/notification/notification.css +165 -67
  22. package/build/components/notification/notification.scss +54 -66
  23. package/build/components/select/select.css +44 -4
  24. package/build/components/tag/tag.css +2 -1
  25. package/build/components/textarea/textarea.css +44 -4
  26. package/build/styles/absolute.css +6 -6
  27. package/build/styles/index.css +6 -6
  28. package/build/styles/internal/_button-components.scss +2 -1
  29. package/build/styles/internal/_form-components.scss +14 -1
  30. package/build/styles/relative.css +6 -6
  31. package/build/styles/rollup.css +6 -6
  32. package/build/styles/webpack.css +6 -6
  33. package/package.json +5 -5
  34. package/build/assets/icons/check-circle.svg +0 -1
@@ -1,55 +1,156 @@
1
+ @use "notification-grid-shared" as shared;
2
+
3
+ // Wrapper mixins for overlay variants that use shared grid logic
4
+ @mixin overlay-base-grid($areas, $columns) {
5
+ @include shared.shared-base-grid($areas, $columns);
6
+ }
7
+
8
+ @mixin overlay-with-close($areas, $columns) {
9
+ @include shared.shared-with-close($areas, $columns);
10
+ }
11
+
12
+ @mixin overlay-with-header($areas, $columns) {
13
+ @include shared.shared-with-header($areas, $columns);
14
+ }
15
+
16
+ @mixin overlay-with-header-close($areas, $columns) {
17
+ @include shared.shared-with-header-close($areas, $columns);
18
+ }
19
+
20
+ @mixin overlay-with-icon($areas, $columns) {
21
+ @include shared.shared-with-icon($areas, $columns);
22
+ }
23
+
24
+ @mixin overlay-with-icon-close($areas, $columns) {
25
+ @include shared.shared-with-icon-close($areas, $columns);
26
+ }
27
+
28
+ @mixin overlay-with-icon-header($areas, $columns) {
29
+ @include shared.shared-with-icon-header($areas, $columns);
30
+ }
31
+
32
+ @mixin overlay-with-icon-header-close($areas, $columns) {
33
+ @include shared.shared-with-icon-header-close($areas, $columns);
34
+ }
35
+
36
+ @mixin overlay-timestamp-area-layouts() {
37
+ // 1. Base layout: content + timestamp
38
+ @include overlay-base-grid("content timestamp", 1fr min-content);
39
+ @include overlay-with-close(
40
+ "content timestamp close",
41
+ 1fr min-content min-content
42
+ );
43
+
44
+ // 2. Progressive enhancement: adds headline
45
+ @include overlay-with-header(
46
+ "head timestamp" "content content",
47
+ 1fr min-content
48
+ );
49
+ @include overlay-with-header-close(
50
+ "head timestamp close" "content content content",
51
+ 1fr min-content min-content
52
+ );
53
+
54
+ // 3. Progressive enhancement: adds icon or image
55
+ @include overlay-with-icon(
56
+ "icon content timestamp",
57
+ min-content 1fr min-content
58
+ );
59
+ @include overlay-with-icon-close(
60
+ "icon content timestamp close",
61
+ min-content 1fr min-content min-content
62
+ );
63
+ @include overlay-with-icon-header(
64
+ "icon head timestamp" "icon content content",
65
+ min-content 1fr min-content
66
+ );
67
+ @include overlay-with-icon-header-close(
68
+ "icon head timestamp close" "icon content content content",
69
+ min-content 1fr min-content min-content
70
+ );
71
+ }
72
+
73
+ @mixin overlay-block-layouts-without-timestamp() {
74
+ // 1. Base layout: content + block link (overridden by subsequent mixins when additional elements detected)
75
+ @include overlay-base-grid("content" "link", 1fr);
76
+ @include overlay-with-close("content close" "link link", 1fr min-content);
77
+
78
+ // 2. Progressive enhancement: adds headline
79
+ @include overlay-with-header("head" "content" "link", 1fr);
80
+ @include overlay-with-header-close(
81
+ "head close" "content content" "link link",
82
+ 1fr min-content
83
+ );
84
+
85
+ // 3. Progressive enhancement: adds icon or image
86
+ @include overlay-with-icon("icon content" "icon link", min-content 1fr);
87
+ @include overlay-with-icon-close(
88
+ "icon content close" "icon link link",
89
+ min-content 1fr min-content
90
+ );
91
+ @include overlay-with-icon-header(
92
+ "icon head" "icon content" "icon link",
93
+ min-content 1fr
94
+ );
95
+ @include overlay-with-icon-header-close(
96
+ "icon head close" "icon content content" "icon link link",
97
+ min-content 1fr min-content
98
+ );
99
+ }
100
+
101
+ @mixin overlay-block-layouts() {
102
+ // 1. Base layout when content, timestamp, and block link are present (more specific rules apply when additional elements are detected)
103
+ @include overlay-base-grid(
104
+ "content timestamp" "link link",
105
+ 1fr min-content
106
+ );
107
+ @include overlay-with-close(
108
+ "content timestamp close" "link link link",
109
+ 1fr min-content min-content
110
+ );
111
+
112
+ // 2. Progressive enhancement: adds headline
113
+ @include overlay-with-header(
114
+ "head timestamp" "content content" "link link",
115
+ 1fr min-content
116
+ );
117
+ @include overlay-with-header-close(
118
+ "head timestamp close" "content content content" "link link link",
119
+ 1fr min-content min-content
120
+ );
121
+
122
+ // 3. Progressive enhancement: adds icon or image
123
+ @include overlay-with-icon(
124
+ "icon content timestamp" "icon link link",
125
+ min-content 1fr min-content
126
+ );
127
+ @include overlay-with-icon-close(
128
+ "icon content timestamp close" "icon link link link",
129
+ min-content 1fr min-content min-content
130
+ );
131
+ @include overlay-with-icon-header(
132
+ "icon head timestamp" "icon content content" "icon link link",
133
+ min-content 1fr min-content
134
+ );
135
+ @include overlay-with-icon-header-close(
136
+ "icon head timestamp close" "icon content content content"
137
+ "icon link link link",
138
+ min-content 1fr min-content min-content
139
+ );
140
+ }
141
+
1
142
  %grid-layout-variant-overlay {
2
- // has timestamp
3
- &:has(span) {
4
- // 1. only content (min. requirement)
5
- grid-template-areas: "content timestamp";
6
- grid-template-columns: 1fr min-content;
7
-
8
- &:has(.db-button) {
9
- grid-template-columns: 1fr min-content min-content;
10
- grid-template-areas: "content timestamp close";
11
- }
12
-
13
- // 2. headline
14
- &:has(header) {
15
- grid-template-columns: 1fr min-content;
16
- grid-template-areas:
17
- "head timestamp"
18
- "content content";
19
-
20
- &:has(.db-button) {
21
- grid-template-columns: 1fr min-content min-content;
22
- grid-template-areas:
23
- "head timestamp close"
24
- "content content content";
25
- }
26
- }
27
-
28
- // 3. icon or img
29
- &[data-icon],
30
- &[data-semantic]:not([data-semantic="adaptive"]),
31
- &:has(img) {
32
- grid-template-areas: "icon content timestamp";
33
- grid-template-columns: min-content 1fr min-content;
34
-
35
- &:has(.db-button) {
36
- grid-template-columns: min-content 1fr min-content min-content;
37
- grid-template-areas: "icon content timestamp close";
38
- }
39
-
40
- &:has(header) {
41
- grid-template-columns: min-content 1fr min-content;
42
- grid-template-areas:
43
- "icon head timestamp"
44
- "icon content content";
45
-
46
- &:has(.db-button) {
47
- grid-template-columns: min-content 1fr min-content min-content;
48
- grid-template-areas:
49
- "icon head timestamp close"
50
- "icon content content content";
51
- }
52
- }
53
- }
143
+ // 1. Standard: Layout for inline links AND timestamps
144
+ // Both use the 'timestamp' area, which moves to the header when a header is present.
145
+ @include overlay-timestamp-area-layouts;
146
+
147
+ // 2. Override: When explicitly "block" link variant with timestamp
148
+ &:has(span)[data-link-variant="block"] {
149
+ @include overlay-block-layouts;
150
+ }
151
+
152
+ // 3. Override: When "block" link variant WITHOUT timestamp
153
+ &:not(:has(span))[data-link-variant="block"] {
154
+ @include overlay-block-layouts-without-timestamp;
54
155
  }
55
156
  }
@@ -0,0 +1,80 @@
1
+ // Shared grid mixins for notification layouts
2
+ // These mixins contain the common grid logic used by both overlay and non-overlay variants
3
+
4
+ @mixin shared-base-grid($areas, $columns) {
5
+ grid-template-areas: $areas;
6
+ grid-template-columns: $columns;
7
+ }
8
+
9
+ @mixin shared-with-close($areas, $columns) {
10
+ &:has(.db-button) {
11
+ grid-template-areas: $areas;
12
+ grid-template-columns: $columns;
13
+ }
14
+ }
15
+
16
+ @mixin shared-with-header($areas, $columns) {
17
+ &:has(header) {
18
+ grid-template-areas: $areas;
19
+ grid-template-columns: $columns;
20
+ }
21
+ }
22
+
23
+ @mixin shared-with-header-close($areas, $columns) {
24
+ &:has(header):has(.db-button) {
25
+ grid-template-areas: $areas;
26
+ grid-template-columns: $columns;
27
+ }
28
+ }
29
+
30
+ @mixin shared-with-icon($areas, $columns) {
31
+ // Only treat the element as having an icon when the "data-show-icon"
32
+ // attribute is not explicitly set to "false". This prevents reserving
33
+ // grid space for an icon when the component has an `icon` prop but
34
+ // `showIcon` is false (the common cause for unintended left padding).
35
+ &[data-icon]:not([data-show-icon="false"]),
36
+ &[data-semantic]:not([data-semantic="adaptive"], [data-show-icon="false"]),
37
+ &:has(img) {
38
+ grid-template-areas: $areas;
39
+ grid-template-columns: $columns;
40
+ }
41
+ }
42
+
43
+ @mixin shared-with-icon-close($areas, $columns) {
44
+ // Same as shared-with-icon but for variants that also have a close button
45
+ &[data-icon]:not([data-show-icon="false"]):has(.db-button),
46
+ &[data-semantic]:not(
47
+ [data-semantic="adaptive"],
48
+ [data-show-icon="false"]
49
+ ):has(.db-button),
50
+ &:has(img):has(.db-button) {
51
+ grid-template-areas: $areas;
52
+ grid-template-columns: $columns;
53
+ }
54
+ }
55
+
56
+ @mixin shared-with-icon-header($areas, $columns) {
57
+ // Same as shared-with-icon but for variants that also have a header
58
+ &[data-icon]:not([data-show-icon="false"]):has(header),
59
+ &[data-semantic]:not(
60
+ [data-semantic="adaptive"],
61
+ [data-show-icon="false"]
62
+ ):has(header),
63
+ &:has(img):has(header) {
64
+ grid-template-areas: $areas;
65
+ grid-template-columns: $columns;
66
+ }
67
+ }
68
+
69
+ @mixin shared-with-icon-header-close($areas, $columns) {
70
+ // Same as shared-with-icon but for variants that have a header and close button
71
+ &[data-icon]:not([data-show-icon="false"]):has(header):has(.db-button),
72
+ &[data-semantic]:not(
73
+ [data-semantic="adaptive"],
74
+ [data-show-icon="false"]
75
+ ):has(header):has(.db-button),
76
+ &:has(img):has(header):has(.db-button) {
77
+ grid-template-areas: $areas;
78
+ grid-template-columns: $columns;
79
+ }
80
+ }
@@ -840,12 +840,12 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
840
840
 
841
841
  @layer variables {}
842
842
 
843
- .db-notification a[data-size=small], .db-notification p {
843
+ .db-notification a[data-size=small], .db-notification p, .db-notification[data-link-variant=inline] a {
844
844
  font: var(--db-type-body-md);
845
845
  /* stylelint-disable-next-line at-rule-prelude-no-invalid,layer-name-pattern */
846
846
  }
847
847
  @layer variables {
848
- .db-notification a[data-size=small], .db-notification p {
848
+ .db-notification a[data-size=small], .db-notification p, .db-notification[data-link-variant=inline] a {
849
849
  /* Those variables are only for components to calculate heights and change icons */
850
850
  --db-icon-font-weight: var(--db-base-body-icon-weight-md);
851
851
  --db-icon-font-size: var(--db-base-body-icon-font-size-md);
@@ -1100,98 +1100,213 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
1100
1100
  grid-template-areas: "content";
1101
1101
  grid-template-columns: 1fr;
1102
1102
  }
1103
+ [data-link-variant=inline].db-notification {
1104
+ grid-template-columns: 1fr min-content;
1105
+ grid-template-areas: "content timestamp";
1106
+ }
1103
1107
  .db-notification:has(.db-button) {
1104
1108
  grid-template-columns: 1fr min-content;
1105
1109
  grid-template-areas: "content close";
1106
1110
  }
1111
+ .db-notification:has(.db-button)[data-link-variant=inline] {
1112
+ grid-template-columns: 1fr min-content min-content;
1113
+ grid-template-areas: "content timestamp close";
1114
+ }
1107
1115
  .db-notification:has(header) {
1108
1116
  grid-template-columns: 1fr;
1109
1117
  grid-template-areas: "head" "content";
1110
1118
  }
1119
+ .db-notification:has(header)[data-link-variant=inline] {
1120
+ grid-template-columns: 1fr min-content;
1121
+ grid-template-areas: "head timestamp" "content content";
1122
+ }
1111
1123
  .db-notification:has(header):has(.db-button) {
1112
1124
  grid-template-columns: 1fr min-content;
1113
1125
  grid-template-areas: "head close" "content content";
1114
1126
  }
1127
+ .db-notification:has(header):has(.db-button)[data-link-variant=inline] {
1128
+ grid-template-columns: 1fr min-content min-content;
1129
+ grid-template-areas: "head timestamp close" "content content .";
1130
+ }
1115
1131
  [data-icon].db-notification, [data-semantic].db-notification:not([data-semantic=adaptive]), .db-notification:has(img) {
1116
1132
  grid-template-areas: "icon content";
1117
1133
  grid-template-columns: min-content 1fr;
1118
1134
  }
1135
+ [data-icon][data-link-variant=inline].db-notification, [data-semantic].db-notification:not([data-semantic=adaptive])[data-link-variant=inline], .db-notification:has(img)[data-link-variant=inline] {
1136
+ grid-template-columns: min-content 1fr min-content;
1137
+ grid-template-areas: "icon content timestamp";
1138
+ }
1119
1139
  [data-icon].db-notification:has(.db-button), [data-semantic].db-notification:not([data-semantic=adaptive]):has(.db-button), .db-notification:has(img):has(.db-button) {
1120
1140
  grid-template-columns: min-content 1fr min-content;
1121
1141
  grid-template-areas: "icon content close";
1122
1142
  }
1143
+ [data-icon].db-notification:has(.db-button)[data-link-variant=inline], [data-semantic].db-notification:not([data-semantic=adaptive]):has(.db-button)[data-link-variant=inline], .db-notification:has(img):has(.db-button)[data-link-variant=inline] {
1144
+ grid-template-columns: min-content 1fr min-content min-content;
1145
+ grid-template-areas: "icon content timestamp close";
1146
+ }
1123
1147
  [data-icon].db-notification:has(header), [data-semantic].db-notification:not([data-semantic=adaptive]):has(header), .db-notification:has(img):has(header) {
1124
1148
  grid-template-columns: min-content 1fr;
1125
1149
  grid-template-areas: "icon head" "icon content";
1126
1150
  }
1151
+ [data-icon].db-notification:has(header)[data-link-variant=inline], [data-semantic].db-notification:not([data-semantic=adaptive]):has(header)[data-link-variant=inline], .db-notification:has(img):has(header)[data-link-variant=inline] {
1152
+ grid-template-columns: min-content 1fr min-content;
1153
+ grid-template-areas: "icon head timestamp" "icon content content";
1154
+ }
1127
1155
  [data-icon].db-notification:has(header):has(.db-button), [data-semantic].db-notification:not([data-semantic=adaptive]):has(header):has(.db-button), .db-notification:has(img):has(header):has(.db-button) {
1128
1156
  grid-template-columns: min-content 1fr min-content;
1129
1157
  grid-template-areas: "icon head close" "icon content content";
1130
1158
  }
1159
+ [data-icon].db-notification:has(header):has(.db-button)[data-link-variant=inline], [data-semantic].db-notification:not([data-semantic=adaptive]):has(header):has(.db-button)[data-link-variant=inline], .db-notification:has(img):has(header):has(.db-button)[data-link-variant=inline] {
1160
+ grid-template-columns: min-content 1fr min-content min-content;
1161
+ grid-template-areas: "icon head timestamp close" "icon content content .";
1162
+ }
1131
1163
 
1132
- .db-notification[data-variant=overlay]:has(span) {
1164
+ .db-notification[data-variant=overlay] {
1133
1165
  grid-template-areas: "content timestamp";
1134
1166
  grid-template-columns: 1fr min-content;
1135
1167
  }
1136
- .db-notification[data-variant=overlay]:has(span):has(.db-button) {
1137
- grid-template-columns: 1fr min-content min-content;
1168
+ .db-notification[data-variant=overlay]:has(.db-button) {
1138
1169
  grid-template-areas: "content timestamp close";
1170
+ grid-template-columns: 1fr min-content min-content;
1139
1171
  }
1140
- .db-notification[data-variant=overlay]:has(span):has(header) {
1141
- grid-template-columns: 1fr min-content;
1172
+ .db-notification[data-variant=overlay]:has(header) {
1142
1173
  grid-template-areas: "head timestamp" "content content";
1174
+ grid-template-columns: 1fr min-content;
1143
1175
  }
1144
- .db-notification[data-variant=overlay]:has(span):has(header):has(.db-button) {
1145
- grid-template-columns: 1fr min-content min-content;
1176
+ .db-notification[data-variant=overlay]:has(header):has(.db-button) {
1146
1177
  grid-template-areas: "head timestamp close" "content content content";
1178
+ grid-template-columns: 1fr min-content min-content;
1147
1179
  }
1148
- .db-notification[data-variant=overlay]:has(span)[data-icon], .db-notification[data-variant=overlay]:has(span)[data-semantic]:not([data-semantic=adaptive]), .db-notification[data-variant=overlay]:has(span):has(img) {
1180
+ [data-icon].db-notification[data-variant=overlay]:not([data-show-icon=false]), [data-semantic].db-notification[data-variant=overlay]:not([data-semantic=adaptive], [data-show-icon=false]), .db-notification[data-variant=overlay]:has(img) {
1149
1181
  grid-template-areas: "icon content timestamp";
1150
1182
  grid-template-columns: min-content 1fr min-content;
1151
1183
  }
1152
- .db-notification[data-variant=overlay]:has(span)[data-icon]:has(.db-button), .db-notification[data-variant=overlay]:has(span)[data-semantic]:not([data-semantic=adaptive]):has(.db-button), .db-notification[data-variant=overlay]:has(span):has(img):has(.db-button) {
1153
- grid-template-columns: min-content 1fr min-content min-content;
1184
+ [data-icon].db-notification[data-variant=overlay]:not([data-show-icon=false]):has(.db-button), [data-semantic].db-notification[data-variant=overlay]:not([data-semantic=adaptive],
1185
+ [data-show-icon=false]):has(.db-button), .db-notification[data-variant=overlay]:has(img):has(.db-button) {
1154
1186
  grid-template-areas: "icon content timestamp close";
1187
+ grid-template-columns: min-content 1fr min-content min-content;
1155
1188
  }
1156
- .db-notification[data-variant=overlay]:has(span)[data-icon]:has(header), .db-notification[data-variant=overlay]:has(span)[data-semantic]:not([data-semantic=adaptive]):has(header), .db-notification[data-variant=overlay]:has(span):has(img):has(header) {
1157
- grid-template-columns: min-content 1fr min-content;
1189
+ [data-icon].db-notification[data-variant=overlay]:not([data-show-icon=false]):has(header), [data-semantic].db-notification[data-variant=overlay]:not([data-semantic=adaptive],
1190
+ [data-show-icon=false]):has(header), .db-notification[data-variant=overlay]:has(img):has(header) {
1158
1191
  grid-template-areas: "icon head timestamp" "icon content content";
1192
+ grid-template-columns: min-content 1fr min-content;
1159
1193
  }
1160
- .db-notification[data-variant=overlay]:has(span)[data-icon]:has(header):has(.db-button), .db-notification[data-variant=overlay]:has(span)[data-semantic]:not([data-semantic=adaptive]):has(header):has(.db-button), .db-notification[data-variant=overlay]:has(span):has(img):has(header):has(.db-button) {
1161
- grid-template-columns: min-content 1fr min-content min-content;
1194
+ [data-icon].db-notification[data-variant=overlay]:not([data-show-icon=false]):has(header):has(.db-button), [data-semantic].db-notification[data-variant=overlay]:not([data-semantic=adaptive],
1195
+ [data-show-icon=false]):has(header):has(.db-button), .db-notification[data-variant=overlay]:has(img):has(header):has(.db-button) {
1162
1196
  grid-template-areas: "icon head timestamp close" "icon content content content";
1197
+ grid-template-columns: min-content 1fr min-content min-content;
1198
+ }
1199
+ .db-notification[data-variant=overlay]:has(span)[data-link-variant=block] {
1200
+ grid-template-areas: "content timestamp" "link link";
1201
+ grid-template-columns: 1fr min-content;
1202
+ }
1203
+ .db-notification[data-variant=overlay]:has(span)[data-link-variant=block]:has(.db-button) {
1204
+ grid-template-areas: "content timestamp close" "link link link";
1205
+ grid-template-columns: 1fr min-content min-content;
1206
+ }
1207
+ .db-notification[data-variant=overlay]:has(span)[data-link-variant=block]:has(header) {
1208
+ grid-template-areas: "head timestamp" "content content" "link link";
1209
+ grid-template-columns: 1fr min-content;
1210
+ }
1211
+ .db-notification[data-variant=overlay]:has(span)[data-link-variant=block]:has(header):has(.db-button) {
1212
+ grid-template-areas: "head timestamp close" "content content content" "link link link";
1213
+ grid-template-columns: 1fr min-content min-content;
1214
+ }
1215
+ .db-notification[data-variant=overlay]:has(span)[data-link-variant=block][data-icon]:not([data-show-icon=false]), .db-notification[data-variant=overlay]:has(span)[data-link-variant=block][data-semantic]:not([data-semantic=adaptive], [data-show-icon=false]), .db-notification[data-variant=overlay]:has(span)[data-link-variant=block]:has(img) {
1216
+ grid-template-areas: "icon content timestamp" "icon link link";
1217
+ grid-template-columns: min-content 1fr min-content;
1218
+ }
1219
+ .db-notification[data-variant=overlay]:has(span)[data-link-variant=block][data-icon]:not([data-show-icon=false]):has(.db-button), .db-notification[data-variant=overlay]:has(span)[data-link-variant=block][data-semantic]:not([data-semantic=adaptive],
1220
+ [data-show-icon=false]):has(.db-button), .db-notification[data-variant=overlay]:has(span)[data-link-variant=block]:has(img):has(.db-button) {
1221
+ grid-template-areas: "icon content timestamp close" "icon link link link";
1222
+ grid-template-columns: min-content 1fr min-content min-content;
1223
+ }
1224
+ .db-notification[data-variant=overlay]:has(span)[data-link-variant=block][data-icon]:not([data-show-icon=false]):has(header), .db-notification[data-variant=overlay]:has(span)[data-link-variant=block][data-semantic]:not([data-semantic=adaptive],
1225
+ [data-show-icon=false]):has(header), .db-notification[data-variant=overlay]:has(span)[data-link-variant=block]:has(img):has(header) {
1226
+ grid-template-areas: "icon head timestamp" "icon content content" "icon link link";
1227
+ grid-template-columns: min-content 1fr min-content;
1228
+ }
1229
+ .db-notification[data-variant=overlay]:has(span)[data-link-variant=block][data-icon]:not([data-show-icon=false]):has(header):has(.db-button), .db-notification[data-variant=overlay]:has(span)[data-link-variant=block][data-semantic]:not([data-semantic=adaptive],
1230
+ [data-show-icon=false]):has(header):has(.db-button), .db-notification[data-variant=overlay]:has(span)[data-link-variant=block]:has(img):has(header):has(.db-button) {
1231
+ grid-template-areas: "icon head timestamp close" "icon content content content" "icon link link link";
1232
+ grid-template-columns: min-content 1fr min-content min-content;
1233
+ }
1234
+ .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block] {
1235
+ grid-template-areas: "content" "link";
1236
+ grid-template-columns: 1fr;
1237
+ }
1238
+ .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block]:has(.db-button) {
1239
+ grid-template-areas: "content close" "link link";
1240
+ grid-template-columns: 1fr min-content;
1241
+ }
1242
+ .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block]:has(header) {
1243
+ grid-template-areas: "head" "content" "link";
1244
+ grid-template-columns: 1fr;
1245
+ }
1246
+ .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block]:has(header):has(.db-button) {
1247
+ grid-template-areas: "head close" "content content" "link link";
1248
+ grid-template-columns: 1fr min-content;
1249
+ }
1250
+ .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block][data-icon]:not([data-show-icon=false]), .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block][data-semantic]:not([data-semantic=adaptive], [data-show-icon=false]), .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block]:has(img) {
1251
+ grid-template-areas: "icon content" "icon link";
1252
+ grid-template-columns: min-content 1fr;
1253
+ }
1254
+ .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block][data-icon]:not([data-show-icon=false]):has(.db-button), .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block][data-semantic]:not([data-semantic=adaptive],
1255
+ [data-show-icon=false]):has(.db-button), .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block]:has(img):has(.db-button) {
1256
+ grid-template-areas: "icon content close" "icon link link";
1257
+ grid-template-columns: min-content 1fr min-content;
1258
+ }
1259
+ .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block][data-icon]:not([data-show-icon=false]):has(header), .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block][data-semantic]:not([data-semantic=adaptive],
1260
+ [data-show-icon=false]):has(header), .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block]:has(img):has(header) {
1261
+ grid-template-areas: "icon head" "icon content" "icon link";
1262
+ grid-template-columns: min-content 1fr;
1263
+ }
1264
+ .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block][data-icon]:not([data-show-icon=false]):has(header):has(.db-button), .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block][data-semantic]:not([data-semantic=adaptive],
1265
+ [data-show-icon=false]):has(header):has(.db-button), .db-notification[data-variant=overlay]:not(:has(span))[data-link-variant=block]:has(img):has(header):has(.db-button) {
1266
+ grid-template-areas: "icon head close" "icon content content" "icon link link";
1267
+ grid-template-columns: min-content 1fr min-content;
1163
1268
  }
1164
1269
 
1165
- .db-notification:not([data-variant=overlay]) span {
1270
+ .db-notification:not([data-variant=overlay])[data-link-variant=block] span, .db-notification:not([data-variant=overlay]):not([data-link-variant]):has(a) span {
1166
1271
  display: none;
1167
1272
  }
1168
- .db-notification:has(a):not([data-link-variant=inline]):not([data-variant=overlay]) {
1273
+ [data-link-variant=block].db-notification:not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a):not([data-variant=overlay]) {
1169
1274
  grid-template-areas: "content" "link";
1170
1275
  grid-template-columns: 1fr;
1171
1276
  }
1172
- .db-notification:has(a):not([data-link-variant=inline]):has(.db-button):not([data-variant=overlay]) {
1173
- grid-template-columns: 1fr min-content;
1277
+ [data-link-variant=block].db-notification:has(.db-button):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a):has(.db-button):not([data-variant=overlay]) {
1174
1278
  grid-template-areas: "content close" "link link";
1279
+ grid-template-columns: 1fr min-content;
1175
1280
  }
1176
- .db-notification:has(a):not([data-link-variant=inline]):has(header):not([data-variant=overlay]) {
1177
- grid-template-columns: 1fr;
1281
+ [data-link-variant=block].db-notification:has(header):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a):has(header):not([data-variant=overlay]) {
1178
1282
  grid-template-areas: "head" "content" "link";
1283
+ grid-template-columns: 1fr;
1179
1284
  }
1180
- .db-notification:has(a):not([data-link-variant=inline]):has(header):has(.db-button):not([data-variant=overlay]) {
1181
- grid-template-columns: 1fr min-content;
1285
+ [data-link-variant=block].db-notification:has(header):has(.db-button):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a):has(header):has(.db-button):not([data-variant=overlay]) {
1182
1286
  grid-template-areas: "head close" "content content" "link link";
1287
+ grid-template-columns: 1fr min-content;
1183
1288
  }
1184
- .db-notification:has(a):not([data-link-variant=inline])[data-icon]:not([data-variant=overlay]), .db-notification:has(a):not([data-link-variant=inline])[data-semantic]:not([data-semantic=adaptive]):not([data-variant=overlay]), .db-notification:has(a):not([data-link-variant=inline]):has(img):not([data-variant=overlay]) {
1289
+ [data-link-variant=block][data-icon].db-notification:not([data-show-icon=false]):not([data-variant=overlay]), [data-link-variant=block][data-semantic].db-notification:not([data-semantic=adaptive], [data-show-icon=false]):not([data-variant=overlay]), [data-link-variant=block].db-notification:has(img):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a)[data-icon]:not([data-show-icon=false]):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a)[data-semantic]:not([data-semantic=adaptive], [data-show-icon=false]):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a):has(img):not([data-variant=overlay]) {
1185
1290
  grid-template-areas: "icon content" "icon link";
1186
1291
  grid-template-columns: min-content 1fr;
1187
1292
  }
1188
- .db-notification:has(a):not([data-link-variant=inline])[data-icon]:has(header):not([data-variant=overlay]), .db-notification:has(a):not([data-link-variant=inline])[data-semantic]:not([data-semantic=adaptive]):has(header):not([data-variant=overlay]), .db-notification:has(a):not([data-link-variant=inline]):has(img):has(header):not([data-variant=overlay]) {
1189
- grid-template-columns: min-content 1fr;
1293
+ [data-link-variant=block][data-icon].db-notification:not([data-show-icon=false]):has(.db-button):not([data-variant=overlay]), [data-link-variant=block][data-semantic].db-notification:not([data-semantic=adaptive],
1294
+ [data-show-icon=false]):has(.db-button):not([data-variant=overlay]), [data-link-variant=block].db-notification:has(img):has(.db-button):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a)[data-icon]:not([data-show-icon=false]):has(.db-button):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a)[data-semantic]:not([data-semantic=adaptive],
1295
+ [data-show-icon=false]):has(.db-button):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a):has(img):has(.db-button):not([data-variant=overlay]) {
1296
+ grid-template-areas: "icon content close" "icon link link";
1297
+ grid-template-columns: min-content 1fr min-content;
1298
+ }
1299
+ [data-link-variant=block][data-icon].db-notification:not([data-show-icon=false]):has(header):not([data-variant=overlay]), [data-link-variant=block][data-semantic].db-notification:not([data-semantic=adaptive],
1300
+ [data-show-icon=false]):has(header):not([data-variant=overlay]), [data-link-variant=block].db-notification:has(img):has(header):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a)[data-icon]:not([data-show-icon=false]):has(header):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a)[data-semantic]:not([data-semantic=adaptive],
1301
+ [data-show-icon=false]):has(header):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a):has(img):has(header):not([data-variant=overlay]) {
1190
1302
  grid-template-areas: "icon head" "icon content" "icon link";
1303
+ grid-template-columns: min-content 1fr;
1191
1304
  }
1192
- .db-notification:has(a):not([data-link-variant=inline])[data-icon]:has(header):has(.db-button):not([data-variant=overlay]), .db-notification:has(a):not([data-link-variant=inline])[data-semantic]:not([data-semantic=adaptive]):has(header):has(.db-button):not([data-variant=overlay]), .db-notification:has(a):not([data-link-variant=inline]):has(img):has(header):has(.db-button):not([data-variant=overlay]) {
1193
- grid-template-columns: min-content 1fr min-content;
1305
+ [data-link-variant=block][data-icon].db-notification:not([data-show-icon=false]):has(header):has(.db-button):not([data-variant=overlay]), [data-link-variant=block][data-semantic].db-notification:not([data-semantic=adaptive],
1306
+ [data-show-icon=false]):has(header):has(.db-button):not([data-variant=overlay]), [data-link-variant=block].db-notification:has(img):has(header):has(.db-button):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a)[data-icon]:not([data-show-icon=false]):has(header):has(.db-button):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a)[data-semantic]:not([data-semantic=adaptive],
1307
+ [data-show-icon=false]):has(header):has(.db-button):not([data-variant=overlay]), .db-notification:not([data-link-variant]):has(a):has(img):has(header):has(.db-button):not([data-variant=overlay]) {
1194
1308
  grid-template-areas: "icon head close" "icon content content" "icon link link";
1309
+ grid-template-columns: min-content 1fr min-content;
1195
1310
  }
1196
1311
 
1197
1312
  .db-notification:has(span) header,
@@ -1213,10 +1328,6 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
1213
1328
  .db-notification::before {
1214
1329
  --db-icon-color: var(--db-adaptive-on-bg-basic-emphasis-70-default);
1215
1330
  }
1216
- .db-notification a {
1217
- grid-area: link;
1218
- white-space: nowrap;
1219
- }
1220
1331
  .db-notification a::before, .db-notification a::after {
1221
1332
  content: none !important;
1222
1333
  margin: 0 !important;
@@ -1261,19 +1372,30 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
1261
1372
  max-block-size: var(--db-sizing-md);
1262
1373
  max-inline-size: var(--db-sizing-md);
1263
1374
  border-radius: var(--db-border-radius-xs);
1375
+ object-fit: cover;
1376
+ grid-area: icon;
1264
1377
  }
1265
1378
  .db-notification span {
1266
1379
  grid-area: timestamp;
1267
1380
  white-space: nowrap;
1381
+ justify-self: end;
1268
1382
  }
1269
1383
  .db-notification .db-button {
1270
1384
  grid-area: close;
1271
1385
  }
1272
- .db-notification:has(img) ::before {
1273
- content: none !important;
1386
+ .db-notification[data-link-variant=inline] a {
1387
+ grid-area: timestamp;
1388
+ white-space: nowrap;
1389
+ justify-self: end;
1274
1390
  }
1275
- .db-notification[data-icon]::before, .db-notification::before,
1276
- .db-notification img {
1391
+ .db-notification[data-link-variant=inline]:has(a) > span {
1392
+ display: none;
1393
+ }
1394
+ .db-notification:not([data-link-variant=inline]) a {
1395
+ grid-area: link;
1396
+ white-space: nowrap;
1397
+ }
1398
+ .db-notification[data-icon]::before, .db-notification::before {
1277
1399
  --db-icon-margin-end: 0;
1278
1400
  --db-icon-font-family: var(
1279
1401
  --db-icon-filled-font-family,
@@ -1282,37 +1404,13 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
1282
1404
  );
1283
1405
  grid-area: icon;
1284
1406
  }
1285
- .db-notification:has(a)[data-link-variant=inline], .db-notification:has(a)[data-variant=overlay] {
1286
- grid-template-areas: "content link";
1287
- grid-template-columns: 1fr min-content;
1288
- }
1289
- .db-notification:has(a)[data-link-variant=inline]:has(.db-button), .db-notification:has(a)[data-variant=overlay]:has(.db-button) {
1290
- grid-template-columns: 1fr min-content min-content;
1291
- grid-template-areas: "content link close";
1292
- }
1293
- .db-notification:has(a)[data-link-variant=inline]:has(header), .db-notification:has(a)[data-variant=overlay]:has(header) {
1294
- grid-template-columns: 1fr min-content;
1295
- grid-template-areas: "head link" "content content";
1296
- }
1297
- .db-notification:has(a)[data-link-variant=inline]:has(header):has(.db-button), .db-notification:has(a)[data-variant=overlay]:has(header):has(.db-button) {
1298
- grid-template-columns: 1fr min-content min-content;
1299
- grid-template-areas: "head link close" "content content content";
1300
- }
1301
- .db-notification:has(a)[data-link-variant=inline][data-icon], .db-notification:has(a)[data-link-variant=inline][data-semantic]:not([data-semantic=adaptive]), .db-notification:has(a)[data-link-variant=inline]:has(img), .db-notification:has(a)[data-variant=overlay][data-icon], .db-notification:has(a)[data-variant=overlay][data-semantic]:not([data-semantic=adaptive]), .db-notification:has(a)[data-variant=overlay]:has(img) {
1302
- grid-template-areas: "icon content link";
1303
- grid-template-columns: min-content 1fr min-content;
1304
- }
1305
- .db-notification:has(a)[data-link-variant=inline][data-icon]:has(.db-button), .db-notification:has(a)[data-link-variant=inline][data-semantic]:not([data-semantic=adaptive]):has(.db-button), .db-notification:has(a)[data-link-variant=inline]:has(img):has(.db-button), .db-notification:has(a)[data-variant=overlay][data-icon]:has(.db-button), .db-notification:has(a)[data-variant=overlay][data-semantic]:not([data-semantic=adaptive]):has(.db-button), .db-notification:has(a)[data-variant=overlay]:has(img):has(.db-button) {
1306
- grid-template-columns: min-content 1fr min-content min-content;
1307
- grid-template-areas: "icon content link close";
1308
- }
1309
- .db-notification:has(a)[data-link-variant=inline][data-icon]:has(header), .db-notification:has(a)[data-link-variant=inline][data-semantic]:not([data-semantic=adaptive]):has(header), .db-notification:has(a)[data-link-variant=inline]:has(img):has(header), .db-notification:has(a)[data-variant=overlay][data-icon]:has(header), .db-notification:has(a)[data-variant=overlay][data-semantic]:not([data-semantic=adaptive]):has(header), .db-notification:has(a)[data-variant=overlay]:has(img):has(header) {
1310
- grid-template-columns: min-content 1fr min-content;
1311
- grid-template-areas: "icon head link" "icon content content";
1407
+ .db-notification[data-show-icon=false]::before {
1408
+ /* Hidden when showIcon is explicitly false. Using `display:none`
1409
+ is sufficient; avoid extra properties that don't affect layout. */
1410
+ display: none;
1312
1411
  }
1313
- .db-notification:has(a)[data-link-variant=inline][data-icon]:has(header):has(.db-button), .db-notification:has(a)[data-link-variant=inline][data-semantic]:not([data-semantic=adaptive]):has(header):has(.db-button), .db-notification:has(a)[data-link-variant=inline]:has(img):has(header):has(.db-button), .db-notification:has(a)[data-variant=overlay][data-icon]:has(header):has(.db-button), .db-notification:has(a)[data-variant=overlay][data-semantic]:not([data-semantic=adaptive]):has(header):has(.db-button), .db-notification:has(a)[data-variant=overlay]:has(img):has(header):has(.db-button) {
1314
- grid-template-columns: min-content 1fr min-content min-content;
1315
- grid-template-areas: "icon head link close" "icon content content content";
1412
+ .db-notification:has(img)::before {
1413
+ content: none !important;
1316
1414
  }
1317
1415
  .db-notification[data-variant=overlay] {
1318
1416
  box-shadow: var(--db-elevation-md);