@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @db-ux/core-components
2
2
 
3
+ ## 4.2.0
4
+
5
+ _version bump_
6
+
7
+
8
+ ## 4.1.0
9
+
10
+ ### Minor Changes
11
+
12
+ - refactor(notification): update and simplify grid layout for block link variant - [see commit cb83f96](https://github.com/db-ux-design-system/core-web/commit/cb83f966eaf29c85b4cf0079750bdd563f216d6e)
13
+
14
+ - fix(DBCustomSelect): properly announce selected options - [see commit 773edeb](https://github.com/db-ux-design-system/core-web/commit/773edeb943a085eb79e1c8d59059137b2830fbf0):
15
+ - feat(DBCustomSelect): introduce new property `selectedPrefix`
16
+
17
+ ### Patch Changes
18
+
19
+ - fix(DBCustomSelect): automatically handle form reset events - [see commit 6af5246](https://github.com/db-ux-design-system/core-web/commit/6af5246b3b2e6febdc6ff6342ba1a8eb10184d14):
20
+ - An event listener is now added for every form component (input, custom-select, etc.) when a `form` property is passed.
21
+ - This listener detects form resets and updates the component's internal value/checked state accordingly.
22
+ - > **Note**: This does not work for `ngModel` in Angular.
23
+
24
+ - fix(button): Replace fixed height with min-height for buttons to allow dynamic height adjustment when text wraps - [see commit d1fd2c4](https://github.com/db-ux-design-system/core-web/commit/d1fd2c4e58a5ed6f75fab44700cd2d93c7232474)
25
+
26
+ - fix(input): Date or time types – initial value gets displayed as placeholder [see commit e3c7ce7](e3c7ce7718803624557bc8fc66f7b662b42ff0be)
27
+
3
28
  ## 4.0.4
4
29
 
5
30
  ### Patch Changes
@@ -27,7 +27,7 @@ const generateFonts = async () => {
27
27
  try {
28
28
  const files = await glob(`${__dirname}/*.ttf`);
29
29
 
30
- for (const file of files) {
30
+ for (const file of files.map(f=> f.replaceAll('\\', '/'))) {
31
31
  // Security: Validate that the file is within the expected directory
32
32
  // and has the expected extension to prevent path traversal attacks
33
33
  if (!file.startsWith(__dirname) || !file.endsWith('.ttf')) {
@@ -12,3 +12,4 @@ U+010C, U+010D, U+010E, U+010F, U+011A, U+011B, U+0147, U+0148, U+0158, U+0159,
12
12
  U+00E9, U+00E8, U+00EB, U+00E4, U+00FC, U+00F6, U+00EF, U+00C9, U+00C8, U+00CB, U+00C4, U+00DC, U+00D6, U+00CF # Netherlands characters
13
13
  U+0391-03A9, U+03B1-03C9 # Greek characters
14
14
  U+0410-042F, U+0430-044F # Cyrillic characters
15
+ U+0404,U+0406-0407,U+0456-0457,U+0413-0419,U+0433-0439,U+041A-041F,U+043A-043F,U+0420-0429,U+0440-0449,U+0490-0491 # Ukrainian characters
@@ -131,7 +131,8 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
131
131
  /* Use for headline tags like <h1> */
132
132
  .db-badge {
133
133
  font-weight: 700;
134
- white-space: nowrap;
134
+ overflow-wrap: break-word;
135
+ white-space: pre-line;
135
136
  justify-content: center;
136
137
  text-align: center;
137
138
  align-items: center;
@@ -143,7 +143,8 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
143
143
 
144
144
  .db-button {
145
145
  font-weight: 700;
146
- white-space: nowrap;
146
+ overflow-wrap: break-word;
147
+ white-space: pre-line;
147
148
  justify-content: center;
148
149
  text-align: center;
149
150
  align-items: center;
@@ -154,16 +155,19 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
154
155
  }
155
156
 
156
157
  .db-button {
158
+ max-inline-size: 100%;
157
159
  color: var(--db-adaptive-on-bg-basic-emphasis-100-default);
158
- block-size: var(--db-sizing-md);
160
+ min-block-size: var(--db-sizing-md);
161
+ block-size: max-content;
159
162
  inline-size: fit-content;
160
- padding: var(--db-spacing-fixed-xs) var(--db-spacing-fixed-md);
163
+ padding: var(--db-spacing-fixed-2xs) var(--db-spacing-fixed-md);
161
164
  text-decoration: none;
162
165
  }
163
166
  .db-button[data-no-text=true] {
164
167
  font-size: 0 !important;
165
168
  /* stylelint-disable-next-line at-rule-empty-line-before */
166
169
  padding: 0;
170
+ aspect-ratio: 1;
167
171
  inline-size: var(--db-sizing-md);
168
172
  }
169
173
  .db-button[data-no-text=true]::before {
@@ -174,10 +178,10 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
174
178
  }
175
179
  .db-button[data-size=small] {
176
180
  font-weight: 700;
177
- block-size: var(--db-sizing-sm);
181
+ min-block-size: var(--db-sizing-sm);
178
182
  }
179
183
  .db-button[data-size=small]:not([data-no-text=true]) {
180
- padding: var(--db-spacing-fixed-3xs) var(--db-spacing-fixed-sm);
184
+ padding: 1px var(--db-spacing-fixed-sm);
181
185
  }
182
186
  .db-button[data-size=small]:not([data-no-text=true])::before {
183
187
  margin-inline-end: var(--db-spacing-fixed-2xs);
@@ -270,6 +274,7 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
270
274
  .db-button:has(> .db-button) {
271
275
  margin: 0;
272
276
  padding: 0;
277
+ block-size: var(--db-sizing-md);
273
278
  }
274
279
  .db-button:has(> .db-button)::before {
275
280
  content: none;
@@ -7,15 +7,18 @@
7
7
  @use "../../styles/internal/component";
8
8
  @use "../../styles/internal/button-components";
9
9
 
10
+ // generic styles can be found in _button-components.scss
10
11
  .db-button {
11
12
  @extend %default-interactive-component;
12
13
  @extend %default-button;
13
14
  @extend %db-overwrite-font-size-md;
14
15
 
16
+ max-inline-size: 100%;
15
17
  color: colors.$db-adaptive-on-bg-basic-emphasis-100-default;
16
- block-size: variables.$db-sizing-md;
18
+ min-block-size: variables.$db-sizing-md;
19
+ block-size: max-content;
17
20
  inline-size: fit-content;
18
- padding: variables.$db-spacing-fixed-xs variables.$db-spacing-fixed-md;
21
+ padding: variables.$db-spacing-fixed-2xs variables.$db-spacing-fixed-md;
19
22
 
20
23
  // disable text-decoration if someone wants to use the button for an <a> tag
21
24
  text-decoration: none;
@@ -25,6 +28,7 @@
25
28
  @include icons.is-icon-text-replace;
26
29
 
27
30
  padding: 0;
31
+ aspect-ratio: 1;
28
32
  inline-size: variables.$db-sizing-md;
29
33
 
30
34
  &::before {
@@ -36,11 +40,11 @@
36
40
  @extend %db-overwrite-font-size-sm;
37
41
 
38
42
  font-weight: 700;
39
- block-size: variables.$db-sizing-sm;
43
+ min-block-size: variables.$db-sizing-sm;
40
44
 
41
45
  &:not([data-no-text="true"]) {
42
- padding: variables.$db-spacing-fixed-3xs
43
- variables.$db-spacing-fixed-sm;
46
+ // stylelint-disable-next-line db-ux/use-spacings
47
+ padding: 1px variables.$db-spacing-fixed-sm;
44
48
 
45
49
  &::before {
46
50
  margin-inline-end: variables.$db-spacing-fixed-2xs;
@@ -113,6 +117,7 @@
113
117
  &:has(> .db-button) {
114
118
  margin: 0;
115
119
  padding: 0;
120
+ block-size: variables.$db-sizing-md;
116
121
 
117
122
  &::before {
118
123
  content: none;
@@ -869,7 +869,17 @@ dialog:not([data-backdrop=none])[data-backdrop=weak]::backdrop, dialog:not([data
869
869
  [type=datetime-local],
870
870
  [type=month],
871
871
  [type=week],
872
- [type=time]):not(:user-valid)::-webkit-datetime-edit {
872
+ [type=time]):not(:user-valid,
873
+ [value*="1"],
874
+ [value*="2"],
875
+ [value*="3"],
876
+ [value*="4"],
877
+ [value*="5"],
878
+ [value*="6"],
879
+ [value*="7"],
880
+ [value*="8"],
881
+ [value*="9"],
882
+ [value*="0"])::-webkit-datetime-edit {
873
883
  transition: none;
874
884
  opacity: 0;
875
885
  }
@@ -924,7 +934,17 @@ input[type=radio]:checked) summary:is([type=date],
924
934
  [type=datetime-local],
925
935
  [type=month],
926
936
  [type=week],
927
- [type=time]):not(:user-valid)::-webkit-datetime-edit {
937
+ [type=time]):not(:user-valid,
938
+ [value*="1"],
939
+ [value*="2"],
940
+ [value*="3"],
941
+ [value*="4"],
942
+ [value*="5"],
943
+ [value*="6"],
944
+ [value*="7"],
945
+ [value*="8"],
946
+ [value*="9"],
947
+ [value*="0"])::-webkit-datetime-edit {
928
948
  opacity: var(--db-opacity-xl);
929
949
  font-family: var(--db-font-family-sans);
930
950
  font-style: italic;
@@ -940,7 +960,17 @@ input[type=radio]:checked) summary:is([type=date],
940
960
  [type=datetime-local],
941
961
  [type=month],
942
962
  [type=week],
943
- [type=time]):not(:user-valid)::-webkit-datetime-edit {
963
+ [type=time]):not(:user-valid,
964
+ [value*="1"],
965
+ [value*="2"],
966
+ [value*="3"],
967
+ [value*="4"],
968
+ [value*="5"],
969
+ [value*="6"],
970
+ [value*="7"],
971
+ [value*="8"],
972
+ [value*="9"],
973
+ [value*="0"])::-webkit-datetime-edit {
944
974
  transition: opacity var(--db-transition-straight-emotional);
945
975
  }
946
976
  }
@@ -1060,7 +1090,17 @@ input[type=radio]:checked) summary:is([type=date],
1060
1090
  [type=datetime-local],
1061
1091
  [type=month],
1062
1092
  [type=week],
1063
- [type=time]):not(:user-valid)::-webkit-datetime-edit {
1093
+ [type=time]):not(:user-valid,
1094
+ [value*="1"],
1095
+ [value*="2"],
1096
+ [value*="3"],
1097
+ [value*="4"],
1098
+ [value*="5"],
1099
+ [value*="6"],
1100
+ [value*="7"],
1101
+ [value*="8"],
1102
+ [value*="9"],
1103
+ [value*="0"])::-webkit-datetime-edit {
1064
1104
  opacity: var(--db-opacity-xl);
1065
1105
  font-family: var(--db-font-family-sans);
1066
1106
  font-style: italic;
@@ -1202,6 +1242,9 @@ summary[aria-disabled=true]) {
1202
1242
  opacity: var(--db-opacity-lg);
1203
1243
  }
1204
1244
  }
1245
+ .db-custom-select > details[open] > summary > span > span::after {
1246
+ content: ": ";
1247
+ }
1205
1248
  .db-custom-select[data-variant=floating] .db-custom-select-form-field > span {
1206
1249
  /* stylelint-disable-next-line db-ux/use-spacings */
1207
1250
  padding-block-start: calc(var(--db-type-body-font-size-2xs) + var(--db-spacing-fixed-3xs));
@@ -120,6 +120,10 @@
120
120
  opacity: variables.$db-opacity-lg;
121
121
  }
122
122
  }
123
+
124
+ > span > span::after {
125
+ content: ": ";
126
+ }
123
127
  }
124
128
  }
125
129
 
@@ -570,7 +570,8 @@ input[type=radio]:checked) > label {
570
570
 
571
571
  .db-input input::file-selector-button {
572
572
  font-weight: 700;
573
- white-space: nowrap;
573
+ overflow-wrap: break-word;
574
+ white-space: pre-line;
574
575
  justify-content: center;
575
576
  text-align: center;
576
577
  align-items: center;
@@ -642,7 +643,17 @@ input[type=radio]:checked) > label {
642
643
  [type=datetime-local],
643
644
  [type=month],
644
645
  [type=week],
645
- [type=time]):not(:user-valid)::-webkit-datetime-edit {
646
+ [type=time]):not(:user-valid,
647
+ [value*="1"],
648
+ [value*="2"],
649
+ [value*="3"],
650
+ [value*="4"],
651
+ [value*="5"],
652
+ [value*="6"],
653
+ [value*="7"],
654
+ [value*="8"],
655
+ [value*="9"],
656
+ [value*="0"])::-webkit-datetime-edit {
646
657
  transition: none;
647
658
  opacity: 0;
648
659
  }
@@ -695,7 +706,17 @@ input[type=radio]:checked) input:is([type=date],
695
706
  [type=datetime-local],
696
707
  [type=month],
697
708
  [type=week],
698
- [type=time]):not(:user-valid)::-webkit-datetime-edit {
709
+ [type=time]):not(:user-valid,
710
+ [value*="1"],
711
+ [value*="2"],
712
+ [value*="3"],
713
+ [value*="4"],
714
+ [value*="5"],
715
+ [value*="6"],
716
+ [value*="7"],
717
+ [value*="8"],
718
+ [value*="9"],
719
+ [value*="0"])::-webkit-datetime-edit {
699
720
  opacity: var(--db-opacity-xl);
700
721
  font-family: var(--db-font-family-sans);
701
722
  font-style: italic;
@@ -709,7 +730,17 @@ input[type=radio]:checked) input:is([type=date],
709
730
  [type=datetime-local],
710
731
  [type=month],
711
732
  [type=week],
712
- [type=time]):not(:user-valid)::-webkit-datetime-edit {
733
+ [type=time]):not(:user-valid,
734
+ [value*="1"],
735
+ [value*="2"],
736
+ [value*="3"],
737
+ [value*="4"],
738
+ [value*="5"],
739
+ [value*="6"],
740
+ [value*="7"],
741
+ [value*="8"],
742
+ [value*="9"],
743
+ [value*="0"])::-webkit-datetime-edit {
713
744
  transition: opacity var(--db-transition-straight-emotional);
714
745
  }
715
746
  }
@@ -844,7 +875,17 @@ input[type=radio]:checked) input:is([type=date],
844
875
  [type=datetime-local],
845
876
  [type=month],
846
877
  [type=week],
847
- [type=time]):not(:user-valid)::-webkit-datetime-edit {
878
+ [type=time]):not(:user-valid,
879
+ [value*="1"],
880
+ [value*="2"],
881
+ [value*="3"],
882
+ [value*="4"],
883
+ [value*="5"],
884
+ [value*="6"],
885
+ [value*="7"],
886
+ [value*="8"],
887
+ [value*="9"],
888
+ [value*="0"])::-webkit-datetime-edit {
848
889
  opacity: var(--db-opacity-xl);
849
890
  font-family: var(--db-font-family-sans);
850
891
  font-style: italic;
@@ -3,9 +3,21 @@
3
3
  grid-template-areas: "content";
4
4
  grid-template-columns: 1fr;
5
5
 
6
+ // Add a layout for inline links
7
+ &[data-link-variant="inline"] {
8
+ grid-template-columns: 1fr min-content;
9
+ grid-template-areas: "content timestamp";
10
+ }
11
+
6
12
  &:has(.db-button) {
7
13
  grid-template-columns: 1fr min-content;
8
14
  grid-template-areas: "content close";
15
+
16
+ // Inline link + close button
17
+ &[data-link-variant="inline"] {
18
+ grid-template-columns: 1fr min-content min-content;
19
+ grid-template-areas: "content timestamp close";
20
+ }
9
21
  }
10
22
 
11
23
  // 2. headline
@@ -15,11 +27,25 @@
15
27
  "head"
16
28
  "content";
17
29
 
30
+ &[data-link-variant="inline"] {
31
+ grid-template-columns: 1fr min-content;
32
+ grid-template-areas:
33
+ "head timestamp"
34
+ "content content";
35
+ }
36
+
18
37
  &:has(.db-button) {
19
38
  grid-template-columns: 1fr min-content;
20
39
  grid-template-areas:
21
40
  "head close"
22
41
  "content content";
42
+
43
+ &[data-link-variant="inline"] {
44
+ grid-template-columns: 1fr min-content min-content;
45
+ grid-template-areas:
46
+ "head timestamp close"
47
+ "content content ."; // Empty cell aligns content column with head row
48
+ }
23
49
  }
24
50
  }
25
51
 
@@ -30,9 +56,19 @@
30
56
  grid-template-areas: "icon content";
31
57
  grid-template-columns: min-content 1fr;
32
58
 
59
+ &[data-link-variant="inline"] {
60
+ grid-template-columns: min-content 1fr min-content;
61
+ grid-template-areas: "icon content timestamp";
62
+ }
63
+
33
64
  &:has(.db-button) {
34
65
  grid-template-columns: min-content 1fr min-content;
35
66
  grid-template-areas: "icon content close";
67
+
68
+ &[data-link-variant="inline"] {
69
+ grid-template-columns: min-content 1fr min-content min-content;
70
+ grid-template-areas: "icon content timestamp close";
71
+ }
36
72
  }
37
73
 
38
74
  &:has(header) {
@@ -41,11 +77,25 @@
41
77
  "icon head"
42
78
  "icon content";
43
79
 
80
+ &[data-link-variant="inline"] {
81
+ grid-template-columns: min-content 1fr min-content;
82
+ grid-template-areas:
83
+ "icon head timestamp"
84
+ "icon content content";
85
+ }
86
+
44
87
  &:has(.db-button) {
45
88
  grid-template-columns: min-content 1fr min-content;
46
89
  grid-template-areas:
47
90
  "icon head close"
48
91
  "icon content content";
92
+
93
+ &[data-link-variant="inline"] {
94
+ grid-template-columns: min-content 1fr min-content min-content;
95
+ grid-template-areas:
96
+ "icon head timestamp close"
97
+ "icon content content ."; // Empty cell aligns content column with head row
98
+ }
49
99
  }
50
100
  }
51
101
  }
@@ -1,66 +1,80 @@
1
- %grid-layout-variant-not-overlay {
2
- span {
3
- display: none;
4
- }
1
+ @use "notification-grid-shared" as shared;
2
+
3
+
4
+ // Wrapper mixins for non-overlay variants that use shared grid logic
5
+ @mixin non-overlay-base-grid($areas, $columns) {
6
+ @include shared.shared-base-grid($areas, $columns);
7
+ }
8
+
9
+ @mixin non-overlay-with-close($areas, $columns) {
10
+ @include shared.shared-with-close($areas, $columns);
11
+ }
12
+
13
+ @mixin non-overlay-with-header($areas, $columns) {
14
+ @include shared.shared-with-header($areas, $columns);
15
+ }
16
+
17
+ @mixin non-overlay-with-header-close($areas, $columns) {
18
+ @include shared.shared-with-header-close($areas, $columns);
19
+ }
20
+
21
+ @mixin non-overlay-with-icon($areas, $columns) {
22
+ @include shared.shared-with-icon($areas, $columns);
23
+ }
5
24
 
6
- // has link
7
- &:has(a) {
8
- &:not([data-link-variant="inline"]) {
9
- // 1. only content (min. requirement)
10
- grid-template-areas:
11
- "content"
12
- "link";
13
- grid-template-columns: 1fr;
25
+ @mixin non-overlay-with-icon-close($areas, $columns) {
26
+ @include shared.shared-with-icon-close($areas, $columns);
27
+ }
28
+
29
+ @mixin non-overlay-with-icon-header($areas, $columns) {
30
+ @include shared.shared-with-icon-header($areas, $columns);
31
+ }
14
32
 
15
- &:has(.db-button) {
16
- grid-template-columns: 1fr min-content;
17
- grid-template-areas:
18
- "content close"
19
- "link link";
20
- }
33
+ @mixin non-overlay-with-icon-header-close($areas, $columns) {
34
+ @include shared.shared-with-icon-header-close($areas, $columns);
35
+ }
21
36
 
22
- // 2. headline
23
- &:has(header) {
24
- grid-template-columns: 1fr;
25
- grid-template-areas:
26
- "head"
27
- "content"
28
- "link";
37
+ @mixin non-overlay-block-link-layouts() {
38
+ // 1. Base: content + block link (no additional elements)
39
+ @include non-overlay-base-grid("content" "link", 1fr);
40
+ @include non-overlay-with-close(
41
+ "content close" "link link",
42
+ 1fr min-content
43
+ );
29
44
 
30
- &:has(.db-button) {
31
- grid-template-columns: 1fr min-content;
32
- grid-template-areas:
33
- "head close"
34
- "content content"
35
- "link link";
36
- }
37
- }
45
+ // 2. Adds: headline
46
+ @include non-overlay-with-header("head" "content" "link", 1fr);
47
+ @include non-overlay-with-header-close(
48
+ "head close" "content content" "link link",
49
+ 1fr min-content
50
+ );
38
51
 
39
- // 3. icon or img
40
- &[data-icon],
41
- &[data-semantic]:not([data-semantic="adaptive"]),
42
- &:has(img) {
43
- grid-template-areas:
44
- "icon content"
45
- "icon link";
46
- grid-template-columns: min-content 1fr;
52
+ // 3. Adds: icon or image
53
+ @include non-overlay-with-icon("icon content" "icon link", min-content 1fr);
54
+ @include non-overlay-with-icon-close(
55
+ "icon content close" "icon link link",
56
+ min-content 1fr min-content
57
+ );
58
+ @include non-overlay-with-icon-header(
59
+ "icon head" "icon content" "icon link",
60
+ min-content 1fr
61
+ );
62
+ @include non-overlay-with-icon-header-close(
63
+ "icon head close" "icon content content" "icon link link",
64
+ min-content 1fr min-content
65
+ );
66
+ }
47
67
 
48
- &:has(header) {
49
- grid-template-columns: min-content 1fr;
50
- grid-template-areas:
51
- "icon head"
52
- "icon content"
53
- "icon link";
68
+ %grid-layout-variant-not-overlay {
69
+ // Hide timestamp for non-overlay variants only
70
+ span {
71
+ display: none;
72
+ }
54
73
 
55
- &:has(.db-button) {
56
- grid-template-columns: min-content 1fr min-content;
57
- grid-template-areas:
58
- "icon head close"
59
- "icon content content"
60
- "icon link link";
61
- }
62
- }
63
- }
64
- }
74
+ // Apply block link layout when linkVariant is "block" (explicit or default)
75
+ // Only applies to non-overlay variants with block links
76
+ &[data-link-variant="block"],
77
+ &:not([data-link-variant]):has(a) {
78
+ @include non-overlay-block-link-layouts;
65
79
  }
66
80
  }