@digiko-npm/designsystem 0.7.2 → 0.8.1

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 (58) hide show
  1. package/dist/designsystem.css +8334 -4728
  2. package/dist/designsystem.min.css +2 -2
  3. package/package.json +18 -3
  4. package/src/components/accordion.css +129 -128
  5. package/src/components/alert.css +137 -134
  6. package/src/components/avatar.css +77 -77
  7. package/src/components/badge.css +52 -52
  8. package/src/components/bottom-nav.css +71 -71
  9. package/src/components/bottom-sheet.css +146 -0
  10. package/src/components/breadcrumb.css +61 -61
  11. package/src/components/button.css +162 -154
  12. package/src/components/card.css +94 -72
  13. package/src/components/chip.css +38 -38
  14. package/src/components/collapsible.css +96 -100
  15. package/src/components/color-picker.css +82 -0
  16. package/src/components/combobox.css +418 -0
  17. package/src/components/command.css +141 -140
  18. package/src/components/copy-button.css +106 -0
  19. package/src/components/datepicker.css +257 -251
  20. package/src/components/description-list.css +89 -87
  21. package/src/components/divider.css +45 -45
  22. package/src/components/drawer.css +185 -174
  23. package/src/components/drop-zone.css +85 -84
  24. package/src/components/dropdown.css +148 -140
  25. package/src/components/empty-state.css +50 -50
  26. package/src/components/field.css +35 -0
  27. package/src/components/gallery.css +257 -0
  28. package/src/components/icon-btn.css +2 -1
  29. package/src/components/index.css +14 -3
  30. package/src/components/input.css +205 -146
  31. package/src/components/kbd.css +10 -10
  32. package/src/components/modal.css +92 -90
  33. package/src/components/nav.css +140 -138
  34. package/src/components/number-input.css +163 -0
  35. package/src/components/pagination.css +153 -139
  36. package/src/components/pin-input.css +136 -0
  37. package/src/components/popover.css +72 -72
  38. package/src/components/progress.css +128 -129
  39. package/src/components/result.css +53 -57
  40. package/src/components/scroll-area.css +73 -0
  41. package/src/components/search.css +10 -4
  42. package/src/components/segmented-control.css +93 -0
  43. package/src/components/skeleton.css +58 -58
  44. package/src/components/slider.css +102 -100
  45. package/src/components/sortable.css +44 -45
  46. package/src/components/spinner.css +27 -27
  47. package/src/components/star-rating.css +121 -0
  48. package/src/components/stat-card.css +38 -25
  49. package/src/components/table.css +288 -3
  50. package/src/components/tabs.css +121 -121
  51. package/src/components/tag.css +124 -124
  52. package/src/components/timeline.css +99 -99
  53. package/src/components/toast.css +37 -38
  54. package/src/components/toggle.css +88 -88
  55. package/src/components/toolbar.css +137 -121
  56. package/src/components/tooltip.css +150 -150
  57. package/src/components/truncated-text.css +75 -0
  58. package/src/tokens/tokens.json +413 -0
@@ -19,54 +19,78 @@
19
19
  overflow: hidden;
20
20
  flex-shrink: 0;
21
21
  position: relative;
22
- }
23
-
24
- .ds-avatar img {
25
- width: 100%;
26
- height: 100%;
27
- object-fit: cover;
28
- }
29
-
30
- /* --- Sizes --- */
31
-
32
- .ds-avatar--xs {
33
- width: var(--ds-size-1);
34
- height: var(--ds-size-1);
35
- font-size: var(--ds-text-xs);
36
- }
37
-
38
- .ds-avatar--sm {
39
- width: var(--ds-size-2);
40
- height: var(--ds-size-2);
41
- font-size: var(--ds-text-xs);
42
- }
43
-
44
- .ds-avatar--md {
45
- width: var(--ds-size-3);
46
- height: var(--ds-size-3);
47
- font-size: var(--ds-text-sm);
48
- }
49
-
50
- .ds-avatar--lg {
51
- width: var(--ds-size-4);
52
- height: var(--ds-size-4);
53
- font-size: var(--ds-text-base);
54
- }
55
-
56
- .ds-avatar--xl {
57
- width: var(--ds-space-16);
58
- height: var(--ds-space-16);
59
- font-size: var(--ds-text-lg);
60
- }
61
-
62
- /* --- Shape variants --- */
63
-
64
- .ds-avatar--square {
65
- border-radius: var(--ds-radius-lg);
66
- }
67
22
 
68
- .ds-avatar--bordered {
69
- border: 2px solid var(--ds-color-surface);
23
+ & img {
24
+ width: 100%;
25
+ height: 100%;
26
+ object-fit: cover;
27
+ }
28
+
29
+ /* --- Sizes --- */
30
+
31
+ &--xs {
32
+ width: var(--ds-size-1);
33
+ height: var(--ds-size-1);
34
+ font-size: var(--ds-text-xs);
35
+ }
36
+
37
+ &--sm {
38
+ width: var(--ds-size-2);
39
+ height: var(--ds-size-2);
40
+ font-size: var(--ds-text-xs);
41
+ }
42
+
43
+ &--md {
44
+ width: var(--ds-size-3);
45
+ height: var(--ds-size-3);
46
+ font-size: var(--ds-text-sm);
47
+ }
48
+
49
+ &--lg {
50
+ width: var(--ds-size-4);
51
+ height: var(--ds-size-4);
52
+ font-size: var(--ds-text-base);
53
+ }
54
+
55
+ &--xl {
56
+ width: var(--ds-space-16);
57
+ height: var(--ds-space-16);
58
+ font-size: var(--ds-text-lg);
59
+ }
60
+
61
+ /* --- Shape variants --- */
62
+
63
+ &--square {
64
+ border-radius: var(--ds-radius-lg);
65
+ }
66
+
67
+ &--bordered {
68
+ border: 2px solid var(--ds-color-surface);
69
+ }
70
+
71
+ /* --- Status indicator --- */
72
+
73
+ &__status {
74
+ position: absolute;
75
+ inset-block-end: 0;
76
+ inset-inline-end: 0;
77
+ width: 0.625rem;
78
+ height: 0.625rem;
79
+ border-radius: var(--ds-radius-full);
80
+ border: 2px solid var(--ds-color-surface);
81
+
82
+ &--online {
83
+ background-color: var(--ds-color-success);
84
+ }
85
+
86
+ &--offline {
87
+ background-color: var(--ds-color-text-tertiary);
88
+ }
89
+
90
+ &--busy {
91
+ background-color: var(--ds-color-error);
92
+ }
93
+ }
70
94
  }
71
95
 
72
96
  /* --- Avatar Group --- */
@@ -74,36 +98,12 @@
74
98
  .ds-avatar-group {
75
99
  display: flex;
76
100
  align-items: center;
77
- }
78
-
79
- .ds-avatar-group > .ds-avatar + .ds-avatar {
80
- margin-inline-start: -0.5rem;
81
- }
82
-
83
- .ds-avatar-group--sm > .ds-avatar + .ds-avatar {
84
- margin-inline-start: -0.375rem;
85
- }
86
-
87
- /* --- Status indicator --- */
88
-
89
- .ds-avatar__status {
90
- position: absolute;
91
- inset-block-end: 0;
92
- inset-inline-end: 0;
93
- width: 0.625rem;
94
- height: 0.625rem;
95
- border-radius: var(--ds-radius-full);
96
- border: 2px solid var(--ds-color-surface);
97
- }
98
-
99
- .ds-avatar__status--online {
100
- background-color: var(--ds-color-success);
101
- }
102
101
 
103
- .ds-avatar__status--offline {
104
- background-color: var(--ds-color-text-tertiary);
105
- }
102
+ & > .ds-avatar + .ds-avatar {
103
+ margin-inline-start: -0.5rem;
104
+ }
106
105
 
107
- .ds-avatar__status--busy {
108
- background-color: var(--ds-color-error);
106
+ &--sm > .ds-avatar + .ds-avatar {
107
+ margin-inline-start: -0.375rem;
108
+ }
109
109
  }
@@ -16,65 +16,65 @@
16
16
  border: 1px solid var(--ds-color-border);
17
17
  background-color: var(--ds-color-bg-elevated);
18
18
  color: var(--ds-color-text-secondary);
19
- }
20
19
 
21
- /* Semantic variants — subtle bg + bright text + subtle border */
22
- .ds-badge--primary {
23
- background-color: var(--ds-color-info-subtle);
24
- color: var(--ds-color-info);
25
- border-color: var(--ds-color-info-border);
26
- }
20
+ /* Semantic variants — subtle bg + bright text + subtle border */
21
+ &--primary {
22
+ background-color: var(--ds-color-info-subtle);
23
+ color: var(--ds-color-info);
24
+ border-color: var(--ds-color-info-border);
25
+ }
27
26
 
28
- .ds-badge--success {
29
- background-color: var(--ds-color-success-subtle);
30
- color: var(--ds-color-success);
31
- border-color: var(--ds-color-success-border);
32
- }
27
+ &--success {
28
+ background-color: var(--ds-color-success-subtle);
29
+ color: var(--ds-color-success);
30
+ border-color: var(--ds-color-success-border);
31
+ }
33
32
 
34
- .ds-badge--warning {
35
- background-color: var(--ds-color-warning-subtle);
36
- color: var(--ds-color-warning);
37
- border-color: var(--ds-color-warning-border);
38
- }
33
+ &--warning {
34
+ background-color: var(--ds-color-warning-subtle);
35
+ color: var(--ds-color-warning);
36
+ border-color: var(--ds-color-warning-border);
37
+ }
39
38
 
40
- .ds-badge--error {
41
- background-color: var(--ds-color-error-subtle);
42
- color: var(--ds-color-error);
43
- border-color: var(--ds-color-error-border);
44
- }
39
+ &--error {
40
+ background-color: var(--ds-color-error-subtle);
41
+ color: var(--ds-color-error);
42
+ border-color: var(--ds-color-error-border);
43
+ }
45
44
 
46
- .ds-badge--info {
47
- background-color: var(--ds-color-accent-blue-subtle);
48
- color: var(--ds-color-accent-blue);
49
- border-color: var(--ds-color-accent-blue-border);
50
- }
45
+ &--info {
46
+ background-color: var(--ds-color-accent-blue-subtle);
47
+ color: var(--ds-color-accent-blue);
48
+ border-color: var(--ds-color-accent-blue-border);
49
+ }
51
50
 
52
- .ds-badge--purple {
53
- background-color: var(--ds-color-accent-purple-subtle);
54
- color: var(--ds-color-accent-purple);
55
- border-color: var(--ds-color-accent-purple-border);
56
- }
51
+ &--purple {
52
+ background-color: var(--ds-color-accent-purple-subtle);
53
+ color: var(--ds-color-accent-purple);
54
+ border-color: var(--ds-color-accent-purple-border);
55
+ }
57
56
 
58
- /* Outline (no bg) */
59
- .ds-badge--outline {
60
- background-color: transparent;
61
- border-color: var(--ds-color-border);
62
- color: var(--ds-color-text-secondary);
63
- }
57
+ /* Outline (no bg) */
58
+ &--outline {
59
+ background-color: transparent;
60
+ border-color: var(--ds-color-border);
61
+ color: var(--ds-color-text-secondary);
62
+ }
64
63
 
65
- /* Dot indicator */
66
- .ds-badge--dot::before {
67
- content: '';
68
- width: var(--ds-dot-size);
69
- height: var(--ds-dot-size);
70
- border-radius: var(--ds-radius-full);
71
- background-color: currentColor;
72
- }
64
+ /* Dot indicator */
65
+ &--dot::before {
66
+ content: '';
67
+ width: var(--ds-dot-size);
68
+ height: var(--ds-dot-size);
69
+ border-radius: var(--ds-radius-full);
70
+ background-color: currentColor;
71
+ }
73
72
 
74
- /* Uppercase badge (like "NEW", "BETA") */
75
- .ds-badge--upper {
76
- text-transform: uppercase;
77
- font-size: var(--ds-text-2xs);
78
- font-weight: var(--ds-weight-semibold);
79
- letter-spacing: var(--ds-tracking-wide);
73
+ /* Uppercase badge (like "NEW", "BETA") */
74
+ &--upper {
75
+ text-transform: uppercase;
76
+ font-size: var(--ds-text-2xs);
77
+ font-weight: var(--ds-weight-semibold);
78
+ letter-spacing: var(--ds-tracking-wide);
79
+ }
80
80
  }
@@ -39,87 +39,87 @@
39
39
  background: var(--ds-color-surface);
40
40
  border-block-start: 1px solid var(--ds-color-border);
41
41
  padding-block-end: env(safe-area-inset-bottom, 0px);
42
- }
43
42
 
44
- @media (max-width: 1023px) /* below --ds-breakpoint-lg */ {
45
- .ds-bottom-nav {
43
+ /* Nav item */
44
+ &__item {
46
45
  display: flex;
47
- justify-content: space-around;
48
- align-items: stretch;
49
- }
50
- }
46
+ flex-direction: column;
47
+ align-items: center;
48
+ justify-content: center;
49
+ gap: var(--ds-space-1);
50
+ flex: 1;
51
+ padding: var(--ds-space-2) 0;
52
+ color: var(--ds-color-text-tertiary);
53
+ text-decoration: none;
54
+ border: none;
55
+ background: none;
56
+ cursor: pointer;
57
+ font: inherit;
58
+ transition: color var(--ds-duration-fast) var(--ds-ease-default);
59
+ -webkit-tap-highlight-color: transparent;
51
60
 
52
- @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
53
- .ds-bottom-nav { display: none !important; }
54
- }
61
+ &--active {
62
+ color: var(--ds-color-text);
63
+ }
55
64
 
56
- /* Nav item */
57
- .ds-bottom-nav__item {
58
- display: flex;
59
- flex-direction: column;
60
- align-items: center;
61
- justify-content: center;
62
- gap: var(--ds-space-1);
63
- flex: 1;
64
- padding: var(--ds-space-2) 0;
65
- color: var(--ds-color-text-tertiary);
66
- text-decoration: none;
67
- border: none;
68
- background: none;
69
- cursor: pointer;
70
- font: inherit;
71
- transition: color var(--ds-duration-fast) var(--ds-ease-default);
72
- -webkit-tap-highlight-color: transparent;
73
- }
65
+ &--create {
66
+ color: var(--ds-color-text-tertiary);
67
+ }
68
+ }
74
69
 
75
- .ds-bottom-nav__item--active {
76
- color: var(--ds-color-text);
77
- }
70
+ /* Icon wrapper */
71
+ &__icon {
72
+ position: relative;
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ }
78
77
 
79
- /* Icon wrapper */
80
- .ds-bottom-nav__icon {
81
- position: relative;
82
- display: flex;
83
- align-items: center;
84
- justify-content: center;
85
- }
78
+ /* Notification badge */
79
+ &__badge {
80
+ position: absolute;
81
+ inset-block-start: calc(-1 * var(--ds-space-1));
82
+ inset-inline-end: calc(-1 * var(--ds-space-2));
83
+ min-width: var(--ds-space-4);
84
+ height: var(--ds-space-4);
85
+ padding: 0 var(--ds-space-1);
86
+ border-radius: var(--ds-radius-full);
87
+ background: var(--ds-color-error);
88
+ color: var(--ds-color-on-inverted);
89
+ font-size: var(--ds-text-2xs);
90
+ font-weight: var(--ds-weight-semibold);
91
+ line-height: var(--ds-space-4);
92
+ text-align: center;
93
+ }
86
94
 
87
- /* Notification badge */
88
- .ds-bottom-nav__badge {
89
- position: absolute;
90
- inset-block-start: calc(-1 * var(--ds-space-1));
91
- inset-inline-end: calc(-1 * var(--ds-space-2));
92
- min-width: var(--ds-space-4);
93
- height: var(--ds-space-4);
94
- padding: 0 var(--ds-space-1);
95
- border-radius: var(--ds-radius-full);
96
- background: var(--ds-color-error);
97
- color: var(--ds-color-on-inverted);
98
- font-size: var(--ds-text-2xs);
99
- font-weight: var(--ds-weight-semibold);
100
- line-height: var(--ds-space-4);
101
- text-align: center;
102
- }
95
+ /* Label */
96
+ &__label {
97
+ font-size: var(--ds-text-2xs);
98
+ font-weight: var(--ds-weight-medium);
99
+ letter-spacing: var(--ds-tracking-wide);
100
+ }
103
101
 
104
- /* Label */
105
- .ds-bottom-nav__label {
106
- font-size: var(--ds-text-2xs);
107
- font-weight: var(--ds-weight-medium);
108
- letter-spacing: var(--ds-tracking-wide);
102
+ /* Create button — elevated center icon */
103
+ &__create-icon {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: center;
107
+ width: 2.25rem;
108
+ height: 2.25rem;
109
+ border-radius: var(--ds-radius-full);
110
+ background: var(--ds-color-text);
111
+ color: var(--ds-color-bg-base);
112
+ }
109
113
  }
110
114
 
111
- /* Create button elevated center icon */
112
- .ds-bottom-nav__create-icon {
113
- display: flex;
114
- align-items: center;
115
- justify-content: center;
116
- width: 2.25rem;
117
- height: 2.25rem;
118
- border-radius: var(--ds-radius-full);
119
- background: var(--ds-color-text);
120
- color: var(--ds-color-bg-base);
115
+ @media (max-width: 1023px) /* below --ds-breakpoint-lg */ {
116
+ .ds-bottom-nav {
117
+ display: flex;
118
+ justify-content: space-around;
119
+ align-items: stretch;
120
+ }
121
121
  }
122
122
 
123
- .ds-bottom-nav__item--create {
124
- color: var(--ds-color-text-tertiary);
123
+ @media (min-width: 1024px) /* --ds-breakpoint-lg */ {
124
+ .ds-bottom-nav { display: none !important; }
125
125
  }
@@ -0,0 +1,146 @@
1
+ /* ==========================================================================
2
+ Component: Bottom Sheet
3
+ Mobile overlay sliding up from the bottom. Alternative to dropdown on mobile.
4
+
5
+ ARIA requirements (consumer responsibility):
6
+ - Container: role="dialog", aria-label="[title]", aria-modal="true"
7
+ - Close button: aria-label="Close"
8
+ - Focus trap when open
9
+ - Keyboard: Escape to close
10
+
11
+ Usage:
12
+ <div class="ds-bottom-sheet ds-bottom-sheet--open">
13
+ <div class="ds-bottom-sheet__backdrop"></div>
14
+ <div class="ds-bottom-sheet__panel">
15
+ <div class="ds-bottom-sheet__handle"></div>
16
+ <div class="ds-bottom-sheet__header">
17
+ <h3 class="ds-bottom-sheet__title">Title</h3>
18
+ <button class="ds-bottom-sheet__close" aria-label="Close">&times;</button>
19
+ </div>
20
+ <div class="ds-bottom-sheet__body">
21
+ ...content...
22
+ </div>
23
+ </div>
24
+ </div>
25
+
26
+ Modifiers:
27
+ .ds-bottom-sheet--open — Visible
28
+ .ds-bottom-sheet--full — Full height (90dvh)
29
+ ========================================================================== */
30
+
31
+ .ds-bottom-sheet {
32
+ position: fixed;
33
+ inset: 0;
34
+ z-index: var(--ds-z-modal);
35
+ display: none;
36
+
37
+ &--open {
38
+ display: block;
39
+ }
40
+
41
+ /* --- Backdrop --- */
42
+ &__backdrop {
43
+ position: fixed;
44
+ inset: 0;
45
+ background-color: var(--ds-color-overlay);
46
+ animation: ds-bottom-sheet-backdrop-in var(--ds-duration-normal) var(--ds-ease-default) forwards;
47
+ }
48
+
49
+ /* --- Panel --- */
50
+ &__panel {
51
+ position: fixed;
52
+ inset-inline-start: 0;
53
+ inset-inline-end: 0;
54
+ inset-block-end: 0;
55
+ max-height: 75dvh;
56
+ display: flex;
57
+ flex-direction: column;
58
+ background-color: var(--ds-color-surface);
59
+ border-radius: var(--ds-radius-xl) var(--ds-radius-xl) 0 0;
60
+ box-shadow: var(--ds-shadow-lg);
61
+ overflow: hidden;
62
+ animation: ds-bottom-sheet-slide-up var(--ds-duration-normal) var(--ds-ease-out-expo) forwards;
63
+ }
64
+
65
+ /* --- Drag handle --- */
66
+ &__handle {
67
+ width: 2.5rem;
68
+ height: 4px;
69
+ margin: var(--ds-space-2) auto;
70
+ border-radius: var(--ds-radius-full);
71
+ background-color: var(--ds-color-bg-muted);
72
+ flex-shrink: 0;
73
+ }
74
+
75
+ /* --- Header --- */
76
+ &__header {
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: space-between;
80
+ padding: var(--ds-space-2) var(--ds-space-4) var(--ds-space-3);
81
+ flex-shrink: 0;
82
+ }
83
+
84
+ &__title {
85
+ font-family: var(--ds-font-display);
86
+ font-weight: var(--ds-weight-semibold);
87
+ font-size: var(--ds-text-lg);
88
+ color: var(--ds-color-text);
89
+ }
90
+
91
+ &__close {
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ width: var(--ds-size-2);
96
+ height: var(--ds-size-2);
97
+ border: none;
98
+ border-radius: var(--ds-radius-md);
99
+ background: transparent;
100
+ color: var(--ds-color-text-tertiary);
101
+ cursor: pointer;
102
+ transition: color var(--ds-duration-fast) var(--ds-ease-default);
103
+
104
+ &:hover {
105
+ color: var(--ds-color-text);
106
+ }
107
+
108
+ &:focus-visible {
109
+ outline: none;
110
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
111
+ }
112
+ }
113
+
114
+ /* --- Body --- */
115
+ &__body {
116
+ flex: 1;
117
+ overflow-y: auto;
118
+ overscroll-behavior: contain;
119
+ padding: 0 var(--ds-space-4) var(--ds-space-4);
120
+ }
121
+
122
+ /* --- Full height modifier --- */
123
+ &--full &__panel {
124
+ max-height: 90dvh;
125
+ }
126
+ }
127
+
128
+ @keyframes ds-bottom-sheet-backdrop-in {
129
+ from { opacity: 0; }
130
+ to { opacity: 1; }
131
+ }
132
+
133
+ @keyframes ds-bottom-sheet-slide-up {
134
+ from { transform: translateY(100%); }
135
+ to { transform: translateY(0); }
136
+ }
137
+
138
+ @media (prefers-reduced-motion: reduce) {
139
+ .ds-bottom-sheet__panel {
140
+ animation: none;
141
+ }
142
+ .ds-bottom-sheet__backdrop {
143
+ animation: none;
144
+ opacity: 1;
145
+ }
146
+ }