@db-ux/core-components 4.3.2 → 4.4.0-loading-567cd0c

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 (33) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/components/accordion-item/accordion-item.css +6 -0
  3. package/build/components/button/button.css +43 -0
  4. package/build/components/button/button.scss +4 -0
  5. package/build/components/custom-select/custom-select.css +9 -9
  6. package/build/components/custom-select-dropdown/custom-select-dropdown.css +2 -21
  7. package/build/components/custom-select-dropdown/custom-select-dropdown.scss +2 -10
  8. package/build/components/drawer/drawer.css +6 -0
  9. package/build/components/link/link.css +6 -0
  10. package/build/components/loading-indicator/loading-indicator.css +591 -0
  11. package/build/components/loading-indicator/loading-indicator.scss +515 -0
  12. package/build/components/navigation-item/navigation-item.css +6 -0
  13. package/build/components/notification/notification.css +6 -0
  14. package/build/components/popover/popover.css +6 -0
  15. package/build/components/select/select.css +2 -1
  16. package/build/components/select/select.scss +4 -1
  17. package/build/components/tab-list/tab-list.css +6 -0
  18. package/build/components/tag/tag.css +6 -0
  19. package/build/components/textarea/textarea.css +6 -0
  20. package/build/components/tooltip/tooltip.css +6 -0
  21. package/build/styles/absolute.css +18 -4
  22. package/build/styles/component-animations.css +1 -1
  23. package/build/styles/index.css +17 -3
  24. package/build/styles/index.scss +2 -0
  25. package/build/styles/internal/_custom-elements.scss +2 -0
  26. package/build/styles/internal/_form-components.scss +7 -1
  27. package/build/styles/internal/_loading.scss +76 -0
  28. package/build/styles/relative.css +18 -4
  29. package/build/styles/rollup.css +18 -4
  30. package/build/styles/wc-workarounds.css +1 -1
  31. package/build/styles/wc-workarounds.scss +1 -0
  32. package/build/styles/webpack.css +18 -4
  33. package/package.json +4 -4
@@ -0,0 +1,515 @@
1
+ @use "@db-ux/core-foundations/build/styles/animation";
2
+ @use "@db-ux/core-foundations/build/styles/variables";
3
+ @use "@db-ux/core-foundations/build/styles/colors";
4
+ @use "@db-ux/core-foundations/build/styles/fonts";
5
+ @use "@db-ux/core-foundations/build/styles/icons";
6
+ @use "../../styles/dialog-init";
7
+ @use "../../styles/internal/loading";
8
+
9
+ $stroke-dasharray-inline: calc(var(--circle) * 2 - var(--stroke-width));
10
+ $stroke-dasharray-onsite: calc(
11
+ var(--circle) * 2 + var(--stroke-width) + var(--radius)
12
+ );
13
+ $stroke-segment-length: calc((var(--circle) / 2 - var(--stroke-width)));
14
+ $db-loading-indicator-track-color: color(
15
+ from var(--db-loading-indicator-segment-color) srgb r g b /
16
+ #{variables.$db-opacity-2xs}
17
+ );
18
+
19
+ %text-container {
20
+ div {
21
+ display: flex;
22
+
23
+ > label {
24
+ display: inline-flex;
25
+ align-items: center;
26
+
27
+ > progress {
28
+ display: none;
29
+ }
30
+ }
31
+
32
+ > span,
33
+ > label {
34
+ @extend %db-overwrite-font-size-xs;
35
+
36
+ color: colors.$db-adaptive-on-bg-basic-emphasis-80-default;
37
+ }
38
+ }
39
+
40
+ &:not([data-variant]),
41
+ &[data-variant="inline"] {
42
+ flex-direction: row;
43
+
44
+ div {
45
+ flex-direction: column;
46
+ }
47
+ }
48
+
49
+ &[data-variant="progress-bar"],
50
+ &[data-variant="onsite"] {
51
+ flex-direction: column;
52
+ }
53
+
54
+ &[data-variant="onsite"] {
55
+ div {
56
+ > span {
57
+ position: absolute;
58
+
59
+ // Center the progress text inside the spinner
60
+ inset-block-start: calc(
61
+ var(--db-loading-indicator-spinner-inline-size) / 2
62
+ );
63
+ inset-inline-start: calc(
64
+ var(--db-loading-indicator-spinner-inline-size) / 2
65
+ );
66
+ transform: translate(-50%, -50%);
67
+ }
68
+ }
69
+ }
70
+
71
+ [data-show-label="false"],
72
+ [data-show-progress-text="false"] {
73
+ display: none;
74
+ }
75
+ }
76
+
77
+ %spinner {
78
+ &:not([data-state]),
79
+ &[data-state="active"] {
80
+ &:not([data-indeterminate]),
81
+ &[data-indeterminate="true"] {
82
+ svg {
83
+ animation: rotate 1.5s linear 0s infinite normal none running;
84
+
85
+ @media screen and (prefers-reduced-motion: reduce) {
86
+ animation-duration: 5s;
87
+ }
88
+ }
89
+
90
+ &:not([data-variant]),
91
+ &[data-variant="inline"] {
92
+ .db-loading-indicator-circle-segment {
93
+ stroke-dashoffset: calc(
94
+ #{$stroke-dasharray-inline} - #{$stroke-segment-length}
95
+ );
96
+ }
97
+ }
98
+
99
+ &[data-variant="onsite"] {
100
+ .db-loading-indicator-circle-segment {
101
+ stroke-dashoffset: calc(
102
+ #{$stroke-dasharray-onsite} - #{$stroke-segment-length}
103
+ );
104
+ }
105
+ }
106
+ }
107
+
108
+ &[data-indeterminate="false"] {
109
+ &:not([data-variant]),
110
+ &[data-variant="inline"] {
111
+ .db-loading-indicator-circle-segment {
112
+ stroke-dashoffset: calc(
113
+ (1 - var(--db-loading-indicator-percentage, 0)) *
114
+ #{$stroke-dasharray-inline}
115
+ );
116
+ }
117
+ }
118
+
119
+ &[data-variant="onsite"] {
120
+ .db-loading-indicator-circle-segment {
121
+ stroke-dashoffset: calc(
122
+ (1 - var(--db-loading-indicator-percentage, 0)) *
123
+ #{$stroke-dasharray-onsite}
124
+ );
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ &[data-indeterminate="false"] {
131
+ svg {
132
+ transform: rotate(-90deg);
133
+ }
134
+ }
135
+
136
+ svg {
137
+ aspect-ratio: 1;
138
+ inline-size: var(--db-loading-indicator-spinner-inline-size, 1lh);
139
+ }
140
+
141
+ &:not([data-variant]),
142
+ &[data-variant="inline"] {
143
+ svg {
144
+ --radius: 6px; // This is the size based on the viewBox of the <svg>
145
+ --circle: 20px; // This is the size based on the viewBox of the <svg>
146
+ --stroke-width: 4px;
147
+ }
148
+
149
+ .db-loading-indicator-circle-segment {
150
+ stroke-dasharray: $stroke-dasharray-inline;
151
+ }
152
+
153
+ &[data-size="small"] {
154
+ svg {
155
+ @extend %db-overwrite-font-size-sm;
156
+ }
157
+
158
+ div > label::before {
159
+ @extend %db-overwrite-font-size-xs;
160
+ }
161
+ }
162
+
163
+ &:not([data-size]),
164
+ &[data-size="medium"] {
165
+ svg {
166
+ @extend %db-overwrite-font-size-md;
167
+ }
168
+
169
+ div > label::before {
170
+ @extend %db-overwrite-font-size-sm;
171
+ }
172
+ }
173
+ }
174
+
175
+ &[data-variant="onsite"] {
176
+ .db-loading-indicator-circle-segment {
177
+ stroke-dasharray: $stroke-dasharray-onsite;
178
+ }
179
+
180
+ svg {
181
+ --radius: 27px; // This is the size based on the viewBox of the <svg>
182
+ --circle: 64px; // This is the size based on the viewBox of the <svg>
183
+ --stroke-width: 10px;
184
+ }
185
+
186
+ &[data-size="small"] {
187
+ --db-loading-indicator-spinner-inline-size: #{variables.$db-sizing-md};
188
+
189
+ div {
190
+ > span {
191
+ // Hide progress text for onsite spinner, as it is centered inside the spinner and can overlap with the segment
192
+ display: none;
193
+ }
194
+ }
195
+ }
196
+
197
+ &:not([data-size]),
198
+ &[data-size="medium"] {
199
+ --db-loading-indicator-spinner-inline-size: #{variables.$db-sizing-lg};
200
+ }
201
+ }
202
+
203
+ circle {
204
+ cx: var(--circle);
205
+ cy: var(--circle);
206
+ r: var(--radius);
207
+ stroke-width: var(--stroke-width);
208
+ stroke-linecap: round;
209
+ fill: none;
210
+ }
211
+
212
+ .db-loading-indicator-circle-track {
213
+ stroke: $db-loading-indicator-track-color;
214
+ }
215
+
216
+ .db-loading-indicator-circle-segment {
217
+ stroke: var(--db-loading-indicator-segment-color);
218
+ }
219
+ }
220
+
221
+ $progress-bar-full-segment-inline-size: calc(
222
+ 100% - var(--db-loading-indicator-progress-bar-segment-padding) * 2
223
+ );
224
+
225
+ %progress-bar {
226
+ inline-size: 100%;
227
+
228
+ &[data-size="small"] {
229
+ div {
230
+ &::before,
231
+ &::after {
232
+ --db-loading-indicator-progress-bar-track-block-size: #{variables.$db-sizing-3xs};
233
+ }
234
+ }
235
+ }
236
+
237
+ &:not([data-size]),
238
+ &[data-size="medium"] {
239
+ div {
240
+ &::before,
241
+ &::after {
242
+ --db-loading-indicator-progress-bar-track-block-size: #{variables.$db-sizing-2xs};
243
+ }
244
+ }
245
+ }
246
+
247
+ &:not([data-state]),
248
+ &[data-state="inactive"] {
249
+ div {
250
+ &::after {
251
+ inline-size: 0;
252
+ }
253
+ }
254
+ }
255
+
256
+ &[data-state="active"] {
257
+ &:not([data-indeterminate]),
258
+ &[data-indeterminate="true"] {
259
+ div {
260
+ &::after {
261
+ inline-size: 25%;
262
+ animation: wobbling 2.5s infinite linear;
263
+
264
+ @media screen and (prefers-reduced-motion: reduce) {
265
+ animation-duration: 5s;
266
+ }
267
+ }
268
+ }
269
+ }
270
+
271
+ &[data-indeterminate="false"] {
272
+ div {
273
+ &::after {
274
+ inline-size: calc(
275
+ var(--db-loading-indicator-percentage, 0) *
276
+ #{$progress-bar-full-segment-inline-size}
277
+ );
278
+ }
279
+ }
280
+ }
281
+ }
282
+
283
+ &[data-state="successful"],
284
+ &[data-state="critical"] {
285
+ div {
286
+ &::after {
287
+ inline-size: $progress-bar-full-segment-inline-size;
288
+ }
289
+ }
290
+ }
291
+
292
+ div {
293
+ &::before,
294
+ &::after {
295
+ content: "";
296
+ border-radius: variables.$db-border-radius-sm;
297
+ position: absolute;
298
+ }
299
+
300
+ &::before {
301
+ inline-size: 100%;
302
+ min-inline-size: variables.$db-sizing-md;
303
+ inset-block-start: 0;
304
+ inset-inline-start: 0;
305
+ block-size: var(
306
+ --db-loading-indicator-progress-bar-track-block-size
307
+ );
308
+ background-color: $db-loading-indicator-track-color;
309
+ }
310
+
311
+ &::after {
312
+ --db-loading-indicator-progress-bar-segment-padding: 2px;
313
+
314
+ z-index: 1;
315
+ inset-block-start: var(
316
+ --db-loading-indicator-progress-bar-segment-padding
317
+ );
318
+ inset-inline: var(
319
+ --db-loading-indicator-progress-bar-segment-padding
320
+ );
321
+ block-size: calc(
322
+ var(--db-loading-indicator-progress-bar-track-block-size) - 2 *
323
+ var(--db-loading-indicator-progress-bar-segment-padding)
324
+ );
325
+ background-color: var(--db-loading-indicator-segment-color);
326
+ }
327
+
328
+ // Provide space for the progress bar because it is absolute
329
+ padding-block-start: calc(
330
+ #{variables.$db-sizing-2xs} + var(--db-indicator-gap)
331
+ );
332
+ position: relative;
333
+ flex-direction: row;
334
+ justify-content: space-between;
335
+ gap: variables.$db-spacing-fixed-md;
336
+ inline-size: 100%;
337
+ align-items: center;
338
+
339
+ > label {
340
+ align-self: flex-start;
341
+ }
342
+
343
+ > span {
344
+ align-self: flex-end;
345
+ }
346
+ }
347
+ }
348
+
349
+ @mixin get-state-icon($name) {
350
+ @include icons.to-filled-icon;
351
+ @include icons.set-icon($name);
352
+ @include icons.variant-icons($name);
353
+
354
+ &::before {
355
+ --db-icon-color: var(--db-#{$name}-on-bg-basic-emphasis-70-default);
356
+ }
357
+ }
358
+
359
+ %states {
360
+ &:not([data-state="successful"], [data-state="critical"]) {
361
+ --db-loading-indicator-segment-color: #{colors.$db-adaptive-on-bg-basic-emphasis-70-default};
362
+ --db-loading-indicator-segment-color-overlay: #{colors.$db-adaptive-on-bg-inverted-default};
363
+ }
364
+
365
+ &[data-state="inactive"] {
366
+ &:not([data-variant]),
367
+ &[data-variant="inline"],
368
+ &[data-variant="onsite"] {
369
+ .db-loading-indicator-circle-segment {
370
+ display: none;
371
+ }
372
+ }
373
+ }
374
+
375
+ @each $name in (successful, critical) {
376
+ &[data-state="#{$name}"] {
377
+ --db-loading-indicator-segment-color: var(
378
+ --db-#{$name}-on-bg-basic-emphasis-70-default
379
+ );
380
+
381
+ &:not([data-variant]),
382
+ &[data-variant="inline"] {
383
+ svg {
384
+ display: none;
385
+ }
386
+
387
+ div {
388
+ @include get-state-icon($name);
389
+
390
+ display: grid;
391
+ grid-template-columns: min-content 1fr;
392
+
393
+ &:has(> label) {
394
+ grid-template-areas: "icon label";
395
+ }
396
+
397
+ &:has(> span) {
398
+ grid-template-areas: "icon progress";
399
+
400
+ &:has(> label) {
401
+ grid-template-areas: "icon label" "icon progress";
402
+ }
403
+ }
404
+
405
+ &::before {
406
+ --db-icon-margin-end: var(--db-indicator-gap);
407
+
408
+ grid-area: icon;
409
+ align-self: center;
410
+ }
411
+
412
+ > label {
413
+ grid-area: label;
414
+ }
415
+
416
+ > span {
417
+ grid-area: progress;
418
+ }
419
+ }
420
+ }
421
+
422
+ &[data-variant="progress-bar"],
423
+ &[data-variant="onsite"] {
424
+ div {
425
+ > label {
426
+ @include get-state-icon($name);
427
+
428
+ &::before {
429
+ --db-icon-margin-end: var(--db-indicator-gap);
430
+ }
431
+ }
432
+ }
433
+ }
434
+
435
+ div {
436
+ > label,
437
+ > span {
438
+ color: var(--db-#{$name}-on-bg-basic-emphasis-80-default);
439
+ }
440
+ }
441
+ }
442
+ }
443
+ }
444
+
445
+ %overlay {
446
+ &:not([data-overlay="true"]) {
447
+ position: relative;
448
+ block-size: fit-content;
449
+ }
450
+
451
+ &[data-overlay="true"] {
452
+ // Hide label and progress when overlay
453
+ @extend %hide-label-and-progress-text;
454
+
455
+ position: absolute;
456
+ inset: 0;
457
+ border-radius: inherit;
458
+
459
+ &::before {
460
+ content: "";
461
+ position: absolute;
462
+ inset: 0;
463
+ border-radius: inherit;
464
+ background-color: dialog-init.$backdrop-color-strong;
465
+ }
466
+
467
+ &[data-variant="progress-bar"] {
468
+ div {
469
+ max-inline-size: calc(100% - #{variables.$db-spacing-fixed-md});
470
+ }
471
+ }
472
+ }
473
+ }
474
+
475
+ *:has(
476
+ > .db-loading-indicator[data-overlay="true"],
477
+ > db-loading-indicator > .db-loading-indicator[data-overlay="true"]
478
+ ) {
479
+ position: relative;
480
+
481
+ .db-loading-indicator {
482
+ --db-loading-indicator-segment-color: var(
483
+ --db-loading-indicator-segment-color-overlay
484
+ );
485
+ }
486
+ }
487
+
488
+ .db-loading-indicator {
489
+ --db-indicator-gap: #{variables.$db-spacing-fixed-2xs};
490
+
491
+ @extend %text-container;
492
+ @extend %states;
493
+ @extend %overlay;
494
+
495
+ display: flex;
496
+ /* stylelint-disable-next-line db-ux/use-spacings */
497
+ gap: var(--db-indicator-gap);
498
+ align-items: center;
499
+ justify-content: center;
500
+
501
+ &:not([data-variant]),
502
+ &[data-variant="inline"],
503
+ &[data-variant="onsite"] {
504
+ @extend %spinner;
505
+ }
506
+
507
+ &[data-variant="progress-bar"] {
508
+ @extend %progress-bar;
509
+ }
510
+
511
+ &[data-delay="slow"],
512
+ &[data-delay="fast"] {
513
+ display: none;
514
+ }
515
+ }
@@ -136,6 +136,12 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
136
136
  transform: rotate(1turn);
137
137
  }
138
138
  }
139
+ @keyframes wobbling {
140
+ 50% {
141
+ inset-inline-start: 100%;
142
+ transform: translateX(calc(-100% - var(--db-loading-indicator-progress-bar-segment-padding, 2px)));
143
+ }
144
+ }
139
145
  .db-navigation-item .db-navigation-item-expand-button:is(button):not([data-show-icon-trailing=false])::after,
140
146
  .db-navigation-item .db-navigation-item-expand-button > button:not([data-show-icon-trailing=false])::after {
141
147
  color: var(--db-icon-color, inherit);
@@ -980,6 +980,12 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
980
980
  transform: rotate(1turn);
981
981
  }
982
982
  }
983
+ @keyframes wobbling {
984
+ 50% {
985
+ inset-inline-start: 100%;
986
+ transform: translateX(calc(-100% - var(--db-loading-indicator-progress-bar-segment-padding, 2px)));
987
+ }
988
+ }
983
989
  .db-notification a:not([hidden]) {
984
990
  display: inline-block;
985
991
  }
@@ -58,6 +58,12 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
58
58
  transform: rotate(1turn);
59
59
  }
60
60
  }
61
+ @keyframes wobbling {
62
+ 50% {
63
+ inset-inline-start: 100%;
64
+ transform: translateX(calc(-100% - var(--db-loading-indicator-progress-bar-segment-padding, 2px)));
65
+ }
66
+ }
61
67
  /**
62
68
  * @mixin screen-min-max
63
69
  * @param $data an object like (min:"sm", max:"lg") or (min: "sm")
@@ -950,6 +950,7 @@ select[aria-disabled=true]) {
950
950
  .db-select optgroup {
951
951
  background-color: var(--db-adaptive-bg-basic-level-3-default);
952
952
  }
953
- .db-select:has(> select option:checked:not(.placeholder)) [id$=-placeholder] {
953
+ .db-select:has(> select option:checked:not(.placeholder)) [id$=-placeholder],
954
+ .db-select:has(> select option:checked:not(.placeholder)) option[data-show-empty-option=false] {
954
955
  display: none;
955
956
  }
@@ -45,7 +45,10 @@
45
45
  }
46
46
 
47
47
  &:has(> select option:checked:not(.placeholder)) {
48
- [id$="-placeholder"] {
48
+ [id$="-placeholder"],
49
+ // Hide placeholder option in dropdown for required selects after a selection has been made
50
+ // This prevents users from selecting an invalid empty option when the field is required
51
+ option[data-show-empty-option="false"] {
49
52
  display: none;
50
53
  }
51
54
  }
@@ -81,6 +81,12 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
81
81
  transform: rotate(1turn);
82
82
  }
83
83
  }
84
+ @keyframes wobbling {
85
+ 50% {
86
+ inset-inline-start: 100%;
87
+ transform: translateX(calc(-100% - var(--db-loading-indicator-progress-bar-segment-padding, 2px)));
88
+ }
89
+ }
84
90
  /**
85
91
  Generates 3 types of placeholders, e.g:
86
92
  - %db-component-variables-md
@@ -27,6 +27,12 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
27
27
  transform: rotate(1turn);
28
28
  }
29
29
  }
30
+ @keyframes wobbling {
31
+ 50% {
32
+ inset-inline-start: 100%;
33
+ transform: translateX(calc(-100% - var(--db-loading-indicator-progress-bar-segment-padding, 2px)));
34
+ }
35
+ }
30
36
  /* Variants for adaptive components like input, select, notification, ... */
31
37
  .db-tag:has(label, button:not(.db-tab-remove-button), a)[data-semantic=neutral] {
32
38
  /* stylelint-disable-next-line at-rule-prelude-no-invalid,layer-name-pattern */
@@ -216,6 +216,12 @@ input[type=radio]:checked) > label {
216
216
  transform: rotate(1turn);
217
217
  }
218
218
  }
219
+ @keyframes wobbling {
220
+ 50% {
221
+ inset-inline-start: 100%;
222
+ transform: translateX(calc(-100% - var(--db-loading-indicator-progress-bar-segment-padding, 2px)));
223
+ }
224
+ }
219
225
  .db-textarea textarea {
220
226
  /* Buttons */
221
227
  /* Up */
@@ -130,6 +130,12 @@ paddings/gaps in an application e.g. the <main> should have a responsive padding
130
130
  transform: rotate(1turn);
131
131
  }
132
132
  }
133
+ @keyframes wobbling {
134
+ 50% {
135
+ inset-inline-start: 100%;
136
+ transform: translateX(calc(-100% - var(--db-loading-indicator-progress-bar-segment-padding, 2px)));
137
+ }
138
+ }
133
139
  /**
134
140
  * @mixin screen-min-max
135
141
  * @param $data an object like (min:"sm", max:"lg") or (min: "sm")