@db-ux/core-components 4.14.0-shell-52d18db → 5.0.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 (103) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/agent/Best-Practise_Common-AI-Mistakes.md +3 -3
  3. package/build/components/accordion-item/accordion-item.css +0 -1
  4. package/build/components/brand/brand.css +0 -1
  5. package/build/components/brand/brand.scss +0 -1
  6. package/build/components/button/button.css +4 -9
  7. package/build/components/checkbox/checkbox.css +0 -3
  8. package/build/components/checkbox/checkbox.scss +0 -2
  9. package/build/components/custom-button/custom-button.css +8 -13
  10. package/build/components/custom-button/custom-button.scss +2 -3
  11. package/build/components/custom-select/custom-select.css +0 -1
  12. package/build/components/custom-select-list-item/custom-select-list-item.css +6 -2
  13. package/build/components/custom-select-list-item/custom-select-list-item.scss +8 -3
  14. package/build/components/drawer/drawer.css +32 -21
  15. package/build/components/drawer/drawer.scss +50 -26
  16. package/build/components/header/header.css +3 -10
  17. package/build/components/header/header.scss +7 -6
  18. package/build/components/icon/icon.css +0 -6
  19. package/build/components/infotext/infotext.css +0 -4
  20. package/build/components/infotext/infotext.scss +0 -2
  21. package/build/components/input/input.css +0 -5
  22. package/build/components/link/link.css +6 -9
  23. package/build/components/link/link.scss +8 -3
  24. package/build/components/navigation/navigation.css +1 -2
  25. package/build/components/navigation/navigation.scss +2 -2
  26. package/build/components/navigation-item/navigation-item.css +5 -28
  27. package/build/components/navigation-item/navigation-item.scss +5 -24
  28. package/build/components/notification/notification.css +1 -5
  29. package/build/components/notification/notification.scss +0 -2
  30. package/build/components/page/page.css +0 -8
  31. package/build/components/page/page.scss +0 -8
  32. package/build/components/select/select.css +0 -1
  33. package/build/components/stack/stack-web-component.css +0 -1
  34. package/build/components/stack/stack.css +0 -1
  35. package/build/components/switch/switch.css +0 -3
  36. package/build/components/switch/switch.scss +0 -1
  37. package/build/components/tab-item/tab-item.css +120 -98
  38. package/build/components/tab-item/tab-item.scss +89 -90
  39. package/build/components/tab-list/tab-list.css +38 -36
  40. package/build/components/tab-list/tab-list.scss +11 -9
  41. package/build/components/tab-panel/tab-panel.css +30 -4
  42. package/build/components/tab-panel/tab-panel.scss +60 -2
  43. package/build/components/table/table.css +0 -4
  44. package/build/components/table-row/table-row.css +0 -4
  45. package/build/components/table-row/table-row.scss +0 -5
  46. package/build/components/tabs/tabs.css +152 -263
  47. package/build/components/tabs/tabs.scss +243 -198
  48. package/build/components/tag/tag.css +2 -21
  49. package/build/components/tag/tag.scss +5 -7
  50. package/build/styles/absolute.css +12 -12
  51. package/build/styles/bundle.css +12 -12
  52. package/build/styles/index.css +11 -11
  53. package/build/styles/index.scss +3 -17
  54. package/build/styles/internal/_button-components.scss +7 -4
  55. package/build/styles/internal/_custom-elements.scss +8 -32
  56. package/build/styles/internal/_icon-passing.scss +9 -10
  57. package/build/styles/internal/_link-components.scss +1 -3
  58. package/build/styles/relative.css +12 -12
  59. package/build/styles/rollup.css +12 -12
  60. package/build/styles/wc-workarounds.css +1 -1
  61. package/build/styles/wc-workarounds.scss +0 -11
  62. package/build/styles/webpack.css +12 -12
  63. package/package.json +4 -4
  64. package/build/components/control-panel-brand/control-panel-brand.css +0 -53
  65. package/build/components/control-panel-brand/control-panel-brand.scss +0 -48
  66. package/build/components/control-panel-desktop/control-panel-desktop.css +0 -579
  67. package/build/components/control-panel-desktop/control-panel-desktop.scss +0 -30
  68. package/build/components/control-panel-flat-icon/control-panel-flat-icon.css +0 -258
  69. package/build/components/control-panel-flat-icon/control-panel-flat-icon.scss +0 -239
  70. package/build/components/control-panel-meta/control-panel-meta.css +0 -14
  71. package/build/components/control-panel-meta/control-panel-meta.scss +0 -15
  72. package/build/components/control-panel-mobile/control-panel-mobile.css +0 -442
  73. package/build/components/control-panel-mobile/control-panel-mobile.scss +0 -119
  74. package/build/components/control-panel-navigation/control-panel-navigation.css +0 -402
  75. package/build/components/control-panel-navigation/control-panel-navigation.scss +0 -186
  76. package/build/components/control-panel-navigation-item/control-panel-navigation-item.css +0 -87
  77. package/build/components/control-panel-navigation-item/control-panel-navigation-item.scss +0 -39
  78. package/build/components/control-panel-navigation-item-group/control-panel-navigation-item-group-menu-popover.css +0 -21
  79. package/build/components/control-panel-navigation-item-group/control-panel-navigation-item-group-menu-popover.scss +0 -129
  80. package/build/components/control-panel-navigation-item-group/control-panel-navigation-item-group-menu-tree.css +0 -35
  81. package/build/components/control-panel-navigation-item-group/control-panel-navigation-item-group-menu-tree.scss +0 -36
  82. package/build/components/control-panel-navigation-item-group/control-panel-navigation-item-group.css +0 -158
  83. package/build/components/control-panel-navigation-item-group/control-panel-navigation-item-group.scss +0 -80
  84. package/build/components/control-panel-primary-actions/control-panel-primary-actions.css +0 -12
  85. package/build/components/control-panel-primary-actions/control-panel-primary-actions.scss +0 -7
  86. package/build/components/control-panel-secondary-actions/control-panel-secondary-actions.css +0 -12
  87. package/build/components/control-panel-secondary-actions/control-panel-secondary-actions.scss +0 -7
  88. package/build/components/control-panel-skip-navigation/control-panel-skip-navigation.css +0 -23
  89. package/build/components/control-panel-skip-navigation/control-panel-skip-navigation.scss +0 -25
  90. package/build/components/shell/shell-desktop.css +0 -475
  91. package/build/components/shell/shell-desktop.scss +0 -105
  92. package/build/components/shell/shell-mobile.css +0 -441
  93. package/build/components/shell/shell-mobile.scss +0 -148
  94. package/build/components/shell/shell.css +0 -1670
  95. package/build/components/shell/shell.scss +0 -70
  96. package/build/components/shell-content/shell-content.css +0 -34
  97. package/build/components/shell-content/shell-content.scss +0 -53
  98. package/build/components/shell-sub-navigation/shell-sub-navigation.css +0 -51
  99. package/build/components/shell-sub-navigation/shell-sub-navigation.scss +0 -184
  100. package/build/styles/internal/_control-panel-actions.scss +0 -11
  101. package/build/styles/internal/_control-panel-desktop.scss +0 -412
  102. package/build/styles/internal/_control-panel-mobile.scss +0 -107
  103. package/build/styles/internal/_navigation-item.scss +0 -122
package/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # @db-ux/core-components
2
2
 
3
+ ## 5.0.0
4
+
5
+ We're providing a [migration guide for all 4.x to 5.0.0](https://github.com/db-ux-design-system/core-web/blob/main/docs/migration/v4.x.x-to-v5.0.0.md) changes.
6
+
7
+ ### Major Changes
8
+
9
+ - refactor: DBDrawer with breaking changes - [see commit 9189f6c](https://github.com/db-ux-design-system/core-web/commit/9189f6c24cd3a64f072c2f60f8c8127d1ed68c55):
10
+
11
+ - The `DBDrawer` component now requires a `DBDrawerHeader` component to be passed in the `header` slot.
12
+ - The `spacing` property has been removed from `DBDrawer`.
13
+ - The default `direction` has changed from `right` to `to-left`.
14
+ - The `width` property has been renamed to `containerSize`.
15
+ - The `direction` values have been renamed from `right`/`left` to `to-left`/`to-right`.
16
+
17
+ - refactor: remove default `margin-inline` from `[data-icon]` pseudo-elements in favor of `gap` - [see commit 635f4b7](https://github.com/db-ux-design-system/core-web/commit/635f4b7ff6ce2aa9341932cb0b8a9c8657ed1ade)
18
+
19
+ - refactor: rework DBTabs and DBTabItem - [see commit c50e522](https://github.com/db-ux-design-system/core-web/commit/c50e5221a4c6f3357ff52451291bdc5772267178):
20
+
21
+ - **Breaking:** DBTabItem now renders a native `button` (`role="tab"`) instead of a radio `input`.
22
+ - **Breaking:** Removed `checked`, `noText` and `name` from DBTabItem.
23
+ - **Breaking:** Renamed DBTabs props `onTabSelect` → `onIndexChange`, `alignment` → `tabItemAlignment`, `width` → `tabItemWidth`.
24
+ - **Breaking:** Deep linking derives the tab id from the `id` prop instead of `label`.
25
+ - Added truncation tooltip for overflowing tab labels and fixed vertical layout, trailing icon and tooltip placement.
26
+
27
+ ### Patch Changes
28
+
29
+ - fix: remove dead `z-index` and `position: relative` from table-row interactive children - [see commit 7edb77b](https://github.com/db-ux-design-system/core-web/commit/7edb77bb9f90d4a79f238ebab362074d12f02f0f)
30
+
3
31
  ## 4.14.0
4
32
 
5
33
  ### Minor Changes
@@ -69,7 +69,7 @@
69
69
 
70
70
  - always provide `burgerMenuLabel` attribute for accessibility
71
71
 
72
- ## `DBControlPanelNavigationItem` or `db-control-panel-navigation-item`
72
+ ## `DBNavigationItem` or `db-navigation-item`
73
73
 
74
74
  - always provide `backButtonText` attribute for accessibility
75
75
  - must have children content (text or child elements)
@@ -81,7 +81,7 @@
81
81
  ## `DBTooltip` or `db-tooltip`
82
82
 
83
83
  - must not contain interactive elements (buttons, links, inputs, etc.) — use `DBPopover` for interactive content
84
- - must be a child of an interactive element (`button`, `a`, `DBButton`, `DBLink`, `DBControlPanelNavigationItem`, `DBTabItem`, `input`, `select`, `textarea`, etc.) for accessibility
84
+ - must be a child of an interactive element (`button`, `a`, `DBButton`, `DBLink`, `DBNavigationItem`, `DBTabItem`, `input`, `select`, `textarea`, etc.) for accessibility
85
85
 
86
86
  ## `DBIcon` or `db-icon`
87
87
 
@@ -92,6 +92,6 @@
92
92
  - always provide a `label` attribute for accessibility (for `DBCheckbox`, `DBRadio`, `DBSwitch` children text content also counts as label)
93
93
  - when using validation attributes (`required`, `minLength`, `maxLength`, `min`, `max`, `pattern`), always provide an `invalidMessage` attribute for better UX (exception: `DBRadio` with `required` does not need `invalidMessage`)
94
94
 
95
- ## Content components (`DBButton`, `DBLink`, `DBBadge`, `DBIcon`, `DBInfotext`, `DBControlPanelNavigationItem`, `DBNotification`, `DBAccordionItem`)
95
+ ## Content components (`DBButton`, `DBLink`, `DBBadge`, `DBIcon`, `DBInfotext`, `DBNavigationItem`, `DBNotification`, `DBAccordionItem`)
96
96
 
97
97
  - must have either a `text` property or children content — never leave them empty
@@ -84,7 +84,6 @@
84
84
 
85
85
  .db-accordion-item > details > summary:not([data-show-icon-trailing=false])::after {
86
86
  --db-icon-trailing: "chevron_down";
87
- margin-inline-start: var(--db-icon-margin-start, var(--db-spacing-fixed-xs));
88
87
  content: var(--db-icon-trailing, attr(data-icon-trailing));
89
88
  }
90
89
  @supports (content: ""/"") {
@@ -18,7 +18,6 @@
18
18
  }
19
19
  .db-brand::before {
20
20
  --db-icon-font-size: var(--db-sizing-md);
21
- --db-icon-margin-end: 0;
22
21
  --db-icon-color: var(--db-brand-origin-default);
23
22
  }
24
23
  .db-brand img {
@@ -13,7 +13,6 @@
13
13
 
14
14
  &::before {
15
15
  --db-icon-font-size: #{variables.$db-sizing-md};
16
- --db-icon-margin-end: 0;
17
16
  --db-icon-color: #{colors.$db-brand-origin-default};
18
17
  }
19
18
 
@@ -89,15 +89,12 @@
89
89
  block-size: var(--db-sizing-md);
90
90
  font-size: 0 !important;
91
91
  }
92
- .db-button[data-no-text=true]::before {
93
- --db-icon-margin-end: 0;
94
- }
95
- .db-button[data-no-text=true] {
96
- /* stylelint-disable-next-line at-rule-empty-line-before */
97
- }
98
92
  .db-button[data-no-text=true]::before {
99
93
  margin: auto;
100
94
  }
95
+ .db-button:not([data-no-text=true]) {
96
+ gap: var(--db-spacing-fixed-xs);
97
+ }
101
98
  .db-button[data-wrap=false] {
102
99
  white-space: nowrap;
103
100
  }
@@ -107,9 +104,7 @@
107
104
  }
108
105
  .db-button[data-size=small]:not([data-no-text=true]) {
109
106
  padding: 1px var(--db-spacing-fixed-sm);
110
- }
111
- .db-button[data-size=small]:not([data-no-text=true])::before {
112
- margin-inline-end: var(--db-spacing-fixed-2xs);
107
+ gap: var(--db-spacing-fixed-2xs);
113
108
  }
114
109
  .db-button[data-size=small][data-no-text=true] {
115
110
  inline-size: var(--db-sizing-sm);
@@ -82,7 +82,6 @@
82
82
  }
83
83
 
84
84
  .db-checkbox input:not([data-show-icon-leading=false]):indeterminate::before, .db-checkbox input:not([data-show-icon-leading=false]):checked::before {
85
- --db-icon-margin-end: 0;
86
85
  display: inline-flex;
87
86
  align-items: center;
88
87
  justify-content: center;
@@ -394,14 +393,12 @@
394
393
  }
395
394
  .db-checkbox input:checked:not([data-show-icon-leading=false])::before {
396
395
  --db-icon: "check";
397
- margin-inline-end: var(--db-icon-margin-end, var(--db-spacing-fixed-xs));
398
396
  }
399
397
  .db-checkbox input:checked {
400
398
  border-width: 0;
401
399
  }
402
400
  .db-checkbox input:indeterminate:not([data-show-icon-leading=false])::before {
403
401
  --db-icon: "minus";
404
- margin-inline-end: var(--db-icon-margin-end, var(--db-spacing-fixed-xs));
405
402
  }
406
403
  @media (forced-colors: active) {
407
404
  .db-checkbox input:indeterminate, .db-checkbox input:checked {
@@ -9,8 +9,6 @@
9
9
  %center-icon {
10
10
  &:not([data-show-icon-leading="false"]) {
11
11
  &::before {
12
- --db-icon-margin-end: 0;
13
-
14
12
  display: inline-flex;
15
13
  align-items: center;
16
14
  justify-content: center;
@@ -116,15 +116,12 @@
116
116
  block-size: var(--db-sizing-md);
117
117
  font-size: 0 !important;
118
118
  }
119
- .db-custom-button[data-no-text=true] label::before, .db-custom-button[data-no-text=true] button::before, .db-custom-button[data-no-text=true] a::before {
120
- --db-icon-margin-end: 0;
121
- }
122
- .db-custom-button[data-no-text=true] label, .db-custom-button[data-no-text=true] button, .db-custom-button[data-no-text=true] a {
123
- /* stylelint-disable-next-line at-rule-empty-line-before */
124
- }
125
119
  .db-custom-button[data-no-text=true] label::before, .db-custom-button[data-no-text=true] button::before, .db-custom-button[data-no-text=true] a::before {
126
120
  margin: auto;
127
121
  }
122
+ .db-custom-button:not([data-no-text=true]) label, .db-custom-button:not([data-no-text=true]) button, .db-custom-button:not([data-no-text=true]) a {
123
+ gap: var(--db-spacing-fixed-xs);
124
+ }
128
125
  .db-custom-button[data-wrap=false] label, .db-custom-button[data-wrap=false] button, .db-custom-button[data-wrap=false] a {
129
126
  white-space: nowrap;
130
127
  }
@@ -134,9 +131,7 @@
134
131
  }
135
132
  .db-custom-button[data-size=small] label:not([data-no-text=true]), .db-custom-button[data-size=small] button:not([data-no-text=true]), .db-custom-button[data-size=small] a:not([data-no-text=true]) {
136
133
  padding: 1px var(--db-spacing-fixed-sm);
137
- }
138
- .db-custom-button[data-size=small] label:not([data-no-text=true])::before, .db-custom-button[data-size=small] button:not([data-no-text=true])::before, .db-custom-button[data-size=small] a:not([data-no-text=true])::before {
139
- margin-inline-end: var(--db-spacing-fixed-2xs);
134
+ gap: var(--db-spacing-fixed-2xs);
140
135
  }
141
136
  .db-custom-button[data-size=small] label[data-no-text=true], .db-custom-button[data-size=small] button[data-no-text=true], .db-custom-button[data-size=small] a[data-no-text=true] {
142
137
  inline-size: var(--db-sizing-sm);
@@ -170,26 +165,26 @@
170
165
  .db-custom-button[data-icon-leading]:not([data-show-icon-leading=false]) > * > :is(label, button, a), .db-custom-button[data-icon]:not([data-show-icon=false]) > :is(label, button, a),
171
166
  .db-custom-button[data-icon]:not([data-show-icon=false]) > * > :is(label, button, a) {
172
167
  /* stylelint-disable-next-line db-ux/use-spacings */
173
- padding-inline-start: var(--db-icon-passing-padding-inline-start, calc(var(--db-spacing-fixed-sm) + var(--db-icon-margin-end, var(--db-spacing-fixed-xs)) + var(--db-icon-font-size)));
168
+ padding-inline-start: var(--db-icon-passing-padding-inline-start, calc(var(--db-spacing-fixed-sm) + var(--db-spacing-fixed-xs) + var(--db-icon-font-size, 1lh)));
174
169
  }
175
170
  .db-custom-button[data-icon-trailing]:not([data-show-icon-trailing=false])::after {
176
171
  position: absolute;
177
- inset-block-start: calc(50% - 0.5em);
172
+ inset-block-start: var(--db-icon-passing-inset-block-start, calc(50% - 0.5em));
178
173
  inset-inline-end: var(--db-spacing-fixed-sm);
179
174
  pointer-events: none;
180
175
  z-index: 1;
181
176
  }
182
177
  .db-custom-button[data-icon-trailing]:not([data-show-icon-trailing=false]) > :is(label, button, a),
183
178
  .db-custom-button[data-icon-trailing]:not([data-show-icon-trailing=false]) > * > :is(label, button, a) {
184
- padding-inline-end: calc(var(--db-spacing-fixed-sm) + var(--db-icon-margin-end, var(--db-spacing-fixed-xs)) + var(--db-icon-font-size));
179
+ padding-inline-end: calc(var(--db-spacing-fixed-sm) + var(--db-spacing-fixed-xs) + var(--db-icon-font-size, 1lh));
185
180
  }
186
181
  .db-custom-button:has(:is(input, button):disabled,
187
182
  :is(input, button, a)[aria-disabled=true]) {
188
183
  opacity: var(--db-opacity-md);
189
184
  }
190
185
  .db-custom-button[data-no-text=true] {
191
- --db-icon-margin-end: 0;
192
186
  --db-icon-passing-inset-inline-start: calc(50% - 0.5em);
187
+ --db-icon-passing-padding-inline-start: 0;
193
188
  }
194
189
  .db-custom-button label:has(input:checked) {
195
190
  color: var(--db-adaptive-on-bg-inverted-default);
@@ -1,6 +1,5 @@
1
1
  @use "@db-ux/core-foundations/build/styles/variables";
2
2
  @use "@db-ux/core-foundations/build/styles/colors";
3
- @use "@db-ux/core-foundations/build/styles/icons";
4
3
  @use "@db-ux/core-foundations/build/styles/helpers";
5
4
  @use "../../styles/internal/button-components";
6
5
  @use "../../styles/internal/icon-passing";
@@ -14,7 +13,7 @@
14
13
  }
15
14
 
16
15
  $icon-padding-custom-button: calc(
17
- #{variables.$db-spacing-fixed-sm} + #{icons.$default-icon-margin-end} +
16
+ #{variables.$db-spacing-fixed-sm} + #{variables.$db-spacing-fixed-xs} +
18
17
  var(--db-icon-font-size)
19
18
  );
20
19
 
@@ -48,8 +47,8 @@ $icon-padding-custom-button: calc(
48
47
  }
49
48
 
50
49
  &[data-no-text="true"] {
51
- --db-icon-margin-end: 0;
52
50
  --db-icon-passing-inset-inline-start: calc(50% - 0.5em);
51
+ --db-icon-passing-padding-inline-start: 0;
53
52
  }
54
53
 
55
54
  label:has(input:checked) {
@@ -554,7 +554,6 @@ input[type=radio]:checked) > label {
554
554
 
555
555
  .db-custom-select:not([data-show-icon-trailing=false])::after {
556
556
  --db-icon-trailing: "chevron_down";
557
- margin-inline-start: var(--db-icon-margin-start, var(--db-spacing-fixed-xs));
558
557
  content: var(--db-icon-trailing, attr(data-icon-trailing));
559
558
  }
560
559
  @supports (content: ""/"") {
@@ -112,10 +112,15 @@ db-custom-select-list-item:not(:last-of-type) .db-custom-select-list-item[data-d
112
112
  /* jscpd:ignore-end */
113
113
  }
114
114
  .db-custom-select-list-item > label {
115
- --db-icon-margin-start: auto;
116
115
  --db-check-element-label-color: var(--db-adaptive-on-bg-basic-emphasis-100-default);
117
116
  inline-size: 100%;
118
117
  }
118
+ .db-custom-select-list-item > label::before {
119
+ margin-inline-end: var(--db-spacing-fixed-xs);
120
+ }
121
+ .db-custom-select-list-item > label::after {
122
+ margin-inline-start: auto;
123
+ }
119
124
  .db-custom-select-list-item > label .db-custom-select-list-item-label {
120
125
  min-inline-size: 0;
121
126
  overflow-wrap: anywhere;
@@ -126,7 +131,6 @@ db-custom-select-list-item:not(:last-of-type) .db-custom-select-list-item[data-d
126
131
  }
127
132
  .db-custom-select-list-item > label:has(input[type=radio]) {
128
133
  --db-icon-trailing: "none";
129
- gap: 0;
130
134
  }
131
135
  .db-custom-select-list-item > label:has(input[type=radio]:checked) {
132
136
  --db-overwrite-cursor: default;
@@ -47,11 +47,18 @@ db-custom-select-list-item:not(:last-of-type) {
47
47
  }
48
48
 
49
49
  > label {
50
- --db-icon-margin-start: auto;
51
50
  --db-check-element-label-color: #{colors.$db-adaptive-on-bg-basic-emphasis-100-default};
52
51
 
53
52
  inline-size: 100%;
54
53
 
54
+ &::before {
55
+ margin-inline-end: variables.$db-spacing-fixed-xs;
56
+ }
57
+
58
+ &::after {
59
+ margin-inline-start: auto;
60
+ }
61
+
55
62
  .db-custom-select-list-item-label {
56
63
  // Long labels wrap onto new lines by default (fixed/full dropdowns).
57
64
  // The auto-width dropdown overrides this to stay single-line
@@ -69,8 +76,6 @@ db-custom-select-list-item:not(:last-of-type) {
69
76
 
70
77
  &:has(input[type="radio"]) {
71
78
  --db-icon-trailing: "none";
72
-
73
- gap: 0;
74
79
  }
75
80
 
76
81
  &:has(input[type="radio"]:checked) {
@@ -46,7 +46,7 @@ dialog:not([data-backdrop=none])[data-backdrop=weak]::backdrop, dialog:not([data
46
46
  }
47
47
 
48
48
  .db-drawer .db-drawer-container:not([data-direction]), .db-drawer .db-drawer-container[data-direction=to-left], .db-drawer .db-drawer-container[data-direction=to-right] {
49
- inline-size: calc(100lvw - var(--db-drawer-container-backdrop-spacing, 0px));
49
+ inline-size: calc(var(--db-drawer-inline-size) - var(--db-drawer-container-backdrop-spacing, 0px));
50
50
  min-inline-size: var(--db-drawer-min-width, auto);
51
51
  max-inline-size: var(--db-drawer-max-width, var(--db-drawer-max-width-horizontal));
52
52
  }
@@ -61,18 +61,20 @@ dialog:not([data-backdrop=none])[data-backdrop=weak]::backdrop, dialog:not([data
61
61
  }
62
62
 
63
63
  .db-drawer .db-drawer-container[data-direction=down], .db-drawer .db-drawer-container[data-direction=up] {
64
- block-size: calc(100lvh - var(--db-drawer-container-backdrop-spacing, 0px));
64
+ block-size: calc(var(--db-drawer-block-size) - var(--db-drawer-container-backdrop-spacing, 0px));
65
65
  min-block-size: var(--db-drawer-min-height, auto);
66
66
  max-block-size: var(--db-drawer-max-height, var(--db-drawer-max-height-vertical));
67
67
  }
68
68
  .db-drawer [data-container-size=small].db-drawer-container[data-direction=down], .db-drawer [data-container-size=small].db-drawer-container[data-direction=up] {
69
- --db-drawer-max-height-vertical: 33lvh;
69
+ --db-drawer-max-height-vertical: calc(var(--db-drawer-block-size) / 3);
70
70
  }
71
71
  .db-drawer [data-container-size=medium].db-drawer-container[data-direction=down], .db-drawer [data-container-size=medium].db-drawer-container[data-direction=up] {
72
- --db-drawer-max-height-vertical: 50lvh;
72
+ --db-drawer-max-height-vertical: calc(var(--db-drawer-block-size) / 2);
73
73
  }
74
74
  .db-drawer .db-drawer-container[data-direction=down]:not([data-container-size]), .db-drawer .db-drawer-container[data-direction=up]:not([data-container-size]), .db-drawer [data-container-size=large].db-drawer-container[data-direction=down], .db-drawer [data-container-size=large].db-drawer-container[data-direction=up] {
75
- --db-drawer-max-height-vertical: 67lvh;
75
+ --db-drawer-max-height-vertical: calc(
76
+ (var(--db-drawer-block-size) / 3) * 2
77
+ );
76
78
  }
77
79
 
78
80
  .db-drawer .db-drawer-container[data-direction=to-right]:not([data-transition=open]) {
@@ -131,15 +133,15 @@ dialog:not([data-backdrop=none])[data-backdrop=weak]::backdrop, dialog:not([data
131
133
  }
132
134
  @media (prefers-reduced-motion: no-preference) {
133
135
  .db-drawer .db-drawer-container {
134
- --db-drawer-close-delay: var(--db-transition-duration-slow);
136
+ --db-drawer-close-delay: var(--db-transition-duration-extra-slow);
135
137
  }
136
138
  }
137
139
  .db-drawer .db-drawer-container {
138
140
  display: grid;
139
141
  grid-template-rows: [header] auto [main] 1fr [footer] auto;
140
142
  background-color: var(--db-adaptive-bg-basic-level-1-default);
141
- inline-size: 100lvw;
142
- block-size: 100lvh;
143
+ inline-size: var(--db-drawer-inline-size);
144
+ block-size: var(--db-drawer-block-size);
143
145
  position: fixed;
144
146
  box-shadow: var(--db-elevation-md);
145
147
  }
@@ -152,10 +154,10 @@ dialog:not([data-backdrop=none])[data-backdrop=weak]::backdrop, dialog:not([data
152
154
  --db-drawer-container-backdrop-spacing: var(--db-sizing-md);
153
155
  }
154
156
  .db-drawer .db-drawer-container[data-show-spacing=true]:not([data-direction]), .db-drawer .db-drawer-container[data-show-spacing=true][data-direction=to-left] {
155
- border-inline-end: var(--db-border-width-3xs) solid var(--db-adaptive-on-bg-basic-emphasis-60-default);
157
+ border-inline-start: var(--db-border-width-3xs) solid var(--db-adaptive-on-bg-basic-emphasis-60-default);
156
158
  }
157
159
  .db-drawer .db-drawer-container[data-show-spacing=true][data-direction=to-right] {
158
- border-inline-start: var(--db-border-width-3xs) solid var(--db-adaptive-on-bg-basic-emphasis-60-default);
160
+ border-inline-end: var(--db-border-width-3xs) solid var(--db-adaptive-on-bg-basic-emphasis-60-default);
159
161
  }
160
162
  .db-drawer .db-drawer-container[data-show-spacing=true][data-direction=up] {
161
163
  border-block-start: var(--db-border-width-3xs) solid var(--db-adaptive-on-bg-basic-emphasis-60-default);
@@ -171,17 +173,34 @@ dialog:not([data-backdrop=none])[data-backdrop=weak]::backdrop, dialog:not([data
171
173
  transition: transform var(--db-transition-duration-extra-slow) var(--db-transition-timing-emotional);
172
174
  }
173
175
  }
176
+ .db-drawer:not([data-position=absolute]) {
177
+ --db-drawer-inline-size: 100lvw;
178
+ --db-drawer-block-size: 100lvh;
179
+ }
180
+ .db-drawer:not([data-position=absolute])[open] .db-drawer-container[data-transition=open] {
181
+ transform: none;
182
+ }
183
+ @media (prefers-reduced-motion: no-preference) {
184
+ .db-drawer:not([data-position=absolute])[open] .db-drawer-container[data-transition=close] {
185
+ transition: transform var(--db-drawer-close-delay) var(--db-transition-timing-emotional);
186
+ }
187
+ }
174
188
  .db-drawer[data-position=absolute] {
189
+ --db-drawer-inline-size: 100%;
190
+ --db-drawer-block-size: 100%;
175
191
  position: absolute;
176
192
  z-index: 3;
177
193
  inset: 0;
178
- block-size: 100%;
179
- inline-size: 100%;
180
194
  background-color: transparent;
195
+ inline-size: var(--db-drawer-inline-size);
196
+ block-size: var(--db-drawer-block-size);
181
197
  }
182
198
  .db-drawer[data-position=absolute][open] {
183
199
  display: flex;
184
200
  }
201
+ .db-drawer[data-position=absolute][open] .db-drawer-container[data-transition=close] {
202
+ position: relative;
203
+ }
185
204
  .db-drawer[data-position=absolute]:not([data-direction]), .db-drawer[data-position=absolute][data-direction=to-right], .db-drawer[data-position=absolute][data-direction=to-left] {
186
205
  flex-direction: column;
187
206
  }
@@ -191,14 +210,6 @@ dialog:not([data-backdrop=none])[data-backdrop=weak]::backdrop, dialog:not([data
191
210
  .db-drawer[data-position=absolute]:not([data-direction]), .db-drawer[data-position=absolute][data-direction=to-left], .db-drawer[data-position=absolute][data-direction=up] {
192
211
  align-items: flex-end;
193
212
  }
194
- .db-drawer[data-position=absolute] .db-drawer-container {
213
+ .db-drawer[data-position=absolute] .db-drawer-container[data-transition=open] {
195
214
  position: relative;
196
215
  }
197
- .db-drawer[open] .db-drawer-container[data-transition=open] {
198
- transform: none;
199
- }
200
- @media (prefers-reduced-motion: no-preference) {
201
- .db-drawer[open] .db-drawer-container[data-transition=close] {
202
- transition: transform var(--db-drawer-close-delay) var(--db-transition-timing-emotional);
203
- }
204
- }
@@ -8,7 +8,10 @@
8
8
 
9
9
  %container-size-horizontal {
10
10
  inline-size: calc(
11
- 100lvw - var(--db-drawer-container-backdrop-spacing, 0px)
11
+ var(--db-drawer-inline-size) - var(
12
+ --db-drawer-container-backdrop-spacing,
13
+ 0px
14
+ )
12
15
  );
13
16
  min-inline-size: var(--db-drawer-min-width, auto);
14
17
  max-inline-size: var(
@@ -31,7 +34,12 @@
31
34
  }
32
35
 
33
36
  %container-size-vertical {
34
- block-size: calc(100lvh - var(--db-drawer-container-backdrop-spacing, 0px));
37
+ block-size: calc(
38
+ var(--db-drawer-block-size) - var(
39
+ --db-drawer-container-backdrop-spacing,
40
+ 0px
41
+ )
42
+ );
35
43
  min-block-size: var(--db-drawer-min-height, auto);
36
44
  max-block-size: var(
37
45
  --db-drawer-max-height,
@@ -39,16 +47,18 @@
39
47
  );
40
48
 
41
49
  &[data-container-size="small"] {
42
- --db-drawer-max-height-vertical: 33lvh;
50
+ --db-drawer-max-height-vertical: calc(var(--db-drawer-block-size) / 3);
43
51
  }
44
52
 
45
53
  &[data-container-size="medium"] {
46
- --db-drawer-max-height-vertical: 50lvh;
54
+ --db-drawer-max-height-vertical: calc(var(--db-drawer-block-size) / 2);
47
55
  }
48
56
 
49
57
  &:not([data-container-size]),
50
58
  &[data-container-size="large"] {
51
- --db-drawer-max-height-vertical: 67lvh;
59
+ --db-drawer-max-height-vertical: calc(
60
+ (var(--db-drawer-block-size) / 3) * 2
61
+ );
52
62
  }
53
63
  }
54
64
 
@@ -137,7 +147,7 @@
137
147
  --db-drawer-close-delay: 0;
138
148
 
139
149
  @media (prefers-reduced-motion: no-preference) {
140
- --db-drawer-close-delay: #{variables.$db-transition-duration-slow};
150
+ --db-drawer-close-delay: #{variables.$db-transition-duration-extra-slow};
141
151
  }
142
152
 
143
153
  display: grid;
@@ -146,8 +156,8 @@
146
156
  [main] 1fr
147
157
  [footer] auto;
148
158
  background-color: colors.$db-adaptive-bg-basic-level-1-default;
149
- inline-size: 100lvw;
150
- block-size: 100lvh;
159
+ inline-size: var(--db-drawer-inline-size);
160
+ block-size: var(--db-drawer-block-size);
151
161
  position: fixed;
152
162
  box-shadow: variables.$db-elevation-md;
153
163
 
@@ -167,11 +177,11 @@
167
177
 
168
178
  &:not([data-direction]),
169
179
  &[data-direction="to-left"] {
170
- border-inline-end: component.$component-border;
180
+ border-inline-start: component.$component-border;
171
181
  }
172
182
 
173
183
  &[data-direction="to-right"] {
174
- border-inline-start: component.$component-border;
184
+ border-inline-end: component.$component-border;
175
185
  }
176
186
 
177
187
  &[data-direction="up"] {
@@ -211,16 +221,43 @@
211
221
  }
212
222
  }
213
223
 
224
+ &:not([data-position="absolute"]) {
225
+ --db-drawer-inline-size: 100lvw;
226
+ --db-drawer-block-size: 100lvh;
227
+
228
+ &[open] {
229
+ .db-drawer-container {
230
+ &[data-transition="open"] {
231
+ transform: none;
232
+ }
233
+
234
+ &[data-transition="close"] {
235
+ @media (prefers-reduced-motion: no-preference) {
236
+ transition: transform var(--db-drawer-close-delay)
237
+ #{variables.$db-transition-timing-emotional};
238
+ }
239
+ }
240
+ }
241
+ }
242
+ }
243
+
214
244
  &[data-position="absolute"] {
245
+ --db-drawer-inline-size: 100%;
246
+ --db-drawer-block-size: 100%;
247
+
215
248
  position: absolute;
216
249
  z-index: 3;
217
250
  inset: 0;
218
- block-size: 100%;
219
- inline-size: 100%;
220
251
  background-color: transparent;
252
+ inline-size: var(--db-drawer-inline-size);
253
+ block-size: var(--db-drawer-block-size);
221
254
 
222
255
  &[open] {
223
256
  display: flex;
257
+
258
+ .db-drawer-container[data-transition="close"] {
259
+ position: relative;
260
+ }
224
261
  }
225
262
 
226
263
  &:not([data-direction]),
@@ -240,22 +277,9 @@
240
277
  align-items: flex-end;
241
278
  }
242
279
 
243
- .db-drawer-container {
244
- position: relative;
245
- }
246
- }
247
-
248
- &[open] {
249
280
  .db-drawer-container {
250
281
  &[data-transition="open"] {
251
- transform: none;
252
- }
253
-
254
- &[data-transition="close"] {
255
- @media (prefers-reduced-motion: no-preference) {
256
- transition: transform var(--db-drawer-close-delay)
257
- #{variables.$db-transition-timing-emotional};
258
- }
282
+ position: relative;
259
283
  }
260
284
  }
261
285
  }
@@ -320,7 +320,6 @@
320
320
  }
321
321
  .db-header {
322
322
  /* stylelint-disable-next-line at-rule-empty-line-before */
323
- /* jscpd:ignore-start */
324
323
  }
325
324
  .db-header[data-width=small] {
326
325
  margin-inline: auto;
@@ -334,9 +333,6 @@
334
333
  margin-inline: auto;
335
334
  max-inline-size: 90em;
336
335
  }
337
- .db-header {
338
- /* jscpd:ignore-end */
339
- }
340
336
  .db-header .db-link:not([hidden]) {
341
337
  display: inline-block;
342
338
  }
@@ -646,9 +642,6 @@
646
642
  overflow-x: hidden;
647
643
  padding: var(--db-spacing-fixed-xs) max(var(--db-spacing-fixed-sm), max(env(safe-area-inset-left), env(safe-area-inset-right)));
648
644
  }
649
- .db-header-drawer .db-drawer-content {
650
- /* jscpd:ignore-start */
651
- }
652
645
  .db-header-drawer .db-drawer-content .db-header-meta-navigation {
653
646
  /* stylelint-disable-next-line db-ux/use-spacings */
654
647
  padding: var(--db-spacing-fixed-xs) max(var(--db-spacing-fixed-sm), max(env(safe-area-inset-left), env(safe-area-inset-right)));
@@ -680,12 +673,12 @@
680
673
  /* stylelint-disable-next-line at-rule-empty-line-before */
681
674
  /* jscpd:ignore-end */
682
675
  }
683
- .db-header-drawer .db-drawer-content {
684
- /* jscpd:ignore-end */
685
- }
686
676
  .db-header-drawer .db-drawer-footer:has(.db-header-secondary-action:empty) {
687
677
  display: none;
688
678
  }
679
+ .db-header-drawer:has(.db-drawer-footer:has(.db-header-secondary-action:empty)) .db-drawer-content {
680
+ margin-block-end: env(safe-area-inset-bottom);
681
+ }
689
682
 
690
683
  /* Only for Desktop */
691
684
  .db-header-meta-navigation:not([hidden]),
@@ -20,7 +20,6 @@
20
20
  --db-drawer-max-width: #{screen-sizes.$db-breakpoint-sm};
21
21
  }
22
22
 
23
- /* jscpd:ignore-start */
24
23
  &[data-width="small"] {
25
24
  margin-inline: auto;
26
25
  max-inline-size: screen-sizes.$db-breakpoint-sm;
@@ -36,8 +35,6 @@
36
35
  max-inline-size: screen-sizes.$db-breakpoint-lg;
37
36
  }
38
37
 
39
- /* jscpd:ignore-end */
40
-
41
38
  .db-link {
42
39
  @include helpers.display(inline-block);
43
40
  }
@@ -244,7 +241,6 @@
244
241
  component.$drawer-content-padding-inline;
245
242
  }
246
243
 
247
- /* jscpd:ignore-start */
248
244
  .db-header-meta-navigation {
249
245
  /* stylelint-disable-next-line db-ux/use-spacings */
250
246
  padding: variables.$db-spacing-fixed-xs
@@ -254,13 +250,18 @@
254
250
 
255
251
  @include helpers.divider("top");
256
252
  }
257
-
258
- /* jscpd:ignore-end */
259
253
  }
260
254
 
261
255
  .db-drawer-footer:has(.db-header-secondary-action:empty) {
262
256
  display: none;
263
257
  }
258
+
259
+ // When footer is hidden (empty secondaryAction), content needs safe-area spacing
260
+ &:has(.db-drawer-footer:has(.db-header-secondary-action:empty)) {
261
+ .db-drawer-content {
262
+ margin-block-end: env(safe-area-inset-bottom);
263
+ }
264
+ }
264
265
  }
265
266
 
266
267
  /* Only for Desktop */
@@ -3,12 +3,6 @@
3
3
  /* Variants for adaptive components like input, select, notification, ... */
4
4
  .db-icon {
5
5
  font-size: 0 !important;
6
- }
7
- .db-icon::before {
8
- --db-icon-margin-end: 0;
9
- }
10
- .db-icon {
11
- /* stylelint-disable-next-line at-rule-empty-line-before */
12
6
  /* Safari hack */
13
7
  }
14
8
  @supports (-webkit-hyphens: none) {