@digiko-npm/designsystem 0.1.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 (47) hide show
  1. package/README.md +89 -0
  2. package/dist/designsystem.css +4642 -0
  3. package/dist/designsystem.js +67 -0
  4. package/package.json +32 -0
  5. package/src/base/index.css +2 -0
  6. package/src/base/reset.css +120 -0
  7. package/src/base/typography.css +163 -0
  8. package/src/components/accordion.css +150 -0
  9. package/src/components/alert.css +150 -0
  10. package/src/components/avatar.css +109 -0
  11. package/src/components/badge.css +80 -0
  12. package/src/components/breadcrumb.css +95 -0
  13. package/src/components/button.css +168 -0
  14. package/src/components/card.css +121 -0
  15. package/src/components/command.css +185 -0
  16. package/src/components/divider.css +66 -0
  17. package/src/components/drawer.css +209 -0
  18. package/src/components/dropdown.css +139 -0
  19. package/src/components/empty-state.css +69 -0
  20. package/src/components/index.css +35 -0
  21. package/src/components/input.css +116 -0
  22. package/src/components/kbd.css +55 -0
  23. package/src/components/modal.css +103 -0
  24. package/src/components/nav.css +153 -0
  25. package/src/components/pagination.css +166 -0
  26. package/src/components/popover.css +112 -0
  27. package/src/components/progress.css +214 -0
  28. package/src/components/skeleton.css +96 -0
  29. package/src/components/slider.css +125 -0
  30. package/src/components/table.css +48 -0
  31. package/src/components/tabs.css +163 -0
  32. package/src/components/tag.css +159 -0
  33. package/src/components/timeline.css +131 -0
  34. package/src/components/toast.css +70 -0
  35. package/src/components/toggle.css +135 -0
  36. package/src/components/tooltip.css +161 -0
  37. package/src/index.css +19 -0
  38. package/src/js/theme.js +67 -0
  39. package/src/tokens/colors.css +180 -0
  40. package/src/tokens/index.css +11 -0
  41. package/src/tokens/shadows.css +26 -0
  42. package/src/tokens/spacing.css +53 -0
  43. package/src/tokens/typography.css +51 -0
  44. package/src/utilities/index.css +3 -0
  45. package/src/utilities/layout.css +134 -0
  46. package/src/utilities/spacing.css +75 -0
  47. package/src/utilities/text.css +221 -0
@@ -0,0 +1,214 @@
1
+ /* ==========================================================================
2
+ * Progress Bar & Step Indicator
3
+ * ==========================================================================
4
+ *
5
+ * Two related components for communicating progress:
6
+ *
7
+ * 1. **Progress bar** — a horizontal fill bar with optional label row.
8
+ * Sizes: --sm, (default), --lg
9
+ * Statuses: --success, --warning, --error, --info
10
+ *
11
+ * 2. **Step indicator** — a numbered sequence of steps with connectors.
12
+ * States: --completed, --current, --error
13
+ * Layout: horizontal (default), --vertical
14
+ *
15
+ * Progress bar markup:
16
+ * <div class="ds-progress__label">
17
+ * <span>Uploading…</span><span>64 %</span>
18
+ * </div>
19
+ * <div class="ds-progress">
20
+ * <div class="ds-progress__bar" style="width: 64%"></div>
21
+ * </div>
22
+ *
23
+ * Step indicator markup:
24
+ * <div class="ds-steps">
25
+ * <div class="ds-step ds-step--completed">
26
+ * <div class="ds-step__indicator">1</div>
27
+ * <div class="ds-step__content">
28
+ * <span class="ds-step__title">Account</span>
29
+ * <span class="ds-step__description">Create your account</span>
30
+ * </div>
31
+ * </div>
32
+ * <div class="ds-step__connector"></div>
33
+ * <div class="ds-step ds-step--current">…</div>
34
+ * </div>
35
+ * ========================================================================== */
36
+
37
+ /* ==========================================================================
38
+ * Progress Bar
39
+ * ========================================================================== */
40
+
41
+ /* Label row (sits above the bar) */
42
+ .ds-progress__label {
43
+ display: flex;
44
+ justify-content: space-between;
45
+ font-size: var(--ds-text-xs);
46
+ color: var(--ds-color-text-tertiary);
47
+ margin-bottom: var(--ds-space-1-5);
48
+ }
49
+
50
+ /* Track */
51
+ .ds-progress {
52
+ width: 100%;
53
+ height: 0.5rem;
54
+ background-color: var(--ds-color-bg-muted);
55
+ border-radius: var(--ds-radius-full);
56
+ overflow: hidden;
57
+ }
58
+
59
+ /* Fill */
60
+ .ds-progress__bar {
61
+ height: 100%;
62
+ min-width: 0.25rem;
63
+ background-color: var(--ds-color-inverted);
64
+ border-radius: var(--ds-radius-full);
65
+ transition: width var(--ds-duration-normal) var(--ds-ease-default);
66
+ }
67
+
68
+ /* Sizes
69
+ * -------------------------------------------------------------------------- */
70
+
71
+ .ds-progress--sm {
72
+ height: 0.25rem;
73
+ }
74
+
75
+ .ds-progress--lg {
76
+ height: 0.75rem;
77
+ }
78
+
79
+ /* Status colours
80
+ * -------------------------------------------------------------------------- */
81
+
82
+ .ds-progress--success .ds-progress__bar {
83
+ background-color: var(--ds-color-success);
84
+ }
85
+
86
+ .ds-progress--warning .ds-progress__bar {
87
+ background-color: var(--ds-color-warning);
88
+ }
89
+
90
+ .ds-progress--error .ds-progress__bar {
91
+ background-color: var(--ds-color-error);
92
+ }
93
+
94
+ .ds-progress--info .ds-progress__bar {
95
+ background-color: var(--ds-color-info);
96
+ }
97
+
98
+ /* ==========================================================================
99
+ * Step Indicator
100
+ * ========================================================================== */
101
+
102
+ /* Steps container (horizontal by default) */
103
+ .ds-steps {
104
+ display: flex;
105
+ flex-direction: row;
106
+ align-items: center;
107
+ gap: 0;
108
+ }
109
+
110
+ /* Vertical variant */
111
+ .ds-steps--vertical {
112
+ flex-direction: column;
113
+ align-items: flex-start;
114
+ }
115
+
116
+ /* Single step
117
+ * -------------------------------------------------------------------------- */
118
+
119
+ .ds-step {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: var(--ds-space-3);
123
+ }
124
+
125
+ /* Circle indicator */
126
+ .ds-step__indicator {
127
+ display: flex;
128
+ align-items: center;
129
+ justify-content: center;
130
+ width: 2rem;
131
+ height: 2rem;
132
+ border-radius: var(--ds-radius-full);
133
+ border: 2px solid var(--ds-color-border);
134
+ font-size: var(--ds-text-xs);
135
+ font-weight: var(--ds-weight-medium);
136
+ color: var(--ds-color-text-tertiary);
137
+ background-color: var(--ds-color-surface);
138
+ flex-shrink: 0;
139
+ transition:
140
+ background-color var(--ds-duration-fast) var(--ds-ease-default),
141
+ border-color var(--ds-duration-fast) var(--ds-ease-default),
142
+ color var(--ds-duration-fast) var(--ds-ease-default);
143
+ }
144
+
145
+ /* Completed step */
146
+ .ds-step--completed .ds-step__indicator {
147
+ background-color: var(--ds-color-inverted);
148
+ border-color: var(--ds-color-inverted);
149
+ color: var(--ds-color-on-inverted);
150
+ }
151
+
152
+ /* Current step */
153
+ .ds-step--current .ds-step__indicator {
154
+ border-color: var(--ds-color-interactive);
155
+ color: var(--ds-color-text);
156
+ }
157
+
158
+ /* Error step */
159
+ .ds-step--error .ds-step__indicator {
160
+ border-color: var(--ds-color-error);
161
+ color: var(--ds-color-error);
162
+ }
163
+
164
+ /* Step content
165
+ * -------------------------------------------------------------------------- */
166
+
167
+ .ds-step__content {
168
+ display: flex;
169
+ flex-direction: column;
170
+ }
171
+
172
+ .ds-step__title {
173
+ font-size: var(--ds-text-sm);
174
+ font-weight: var(--ds-weight-medium);
175
+ color: var(--ds-color-text);
176
+ }
177
+
178
+ .ds-step__description {
179
+ font-size: var(--ds-text-xs);
180
+ color: var(--ds-color-text-tertiary);
181
+ }
182
+
183
+ /* Connector (line between steps)
184
+ * -------------------------------------------------------------------------- */
185
+
186
+ /* Horizontal connector */
187
+ .ds-step__connector {
188
+ flex: 1;
189
+ height: 2px;
190
+ min-width: var(--ds-space-4);
191
+ background-color: var(--ds-color-border);
192
+ margin-inline: var(--ds-space-2);
193
+ }
194
+
195
+ /* Filled connector after a completed step */
196
+ .ds-step--completed + .ds-step__connector {
197
+ background-color: var(--ds-color-inverted);
198
+ }
199
+
200
+ /* Vertical connector */
201
+ .ds-steps--vertical .ds-step__connector {
202
+ flex: none;
203
+ width: 2px;
204
+ height: 2rem;
205
+ min-width: auto;
206
+ margin-inline: 0;
207
+ margin-left: calc(1rem - 1px); /* center under the 2 rem indicator */
208
+ margin-block: var(--ds-space-1);
209
+ background-color: var(--ds-color-border-subtle);
210
+ }
211
+
212
+ .ds-steps--vertical .ds-step--completed + .ds-step__connector {
213
+ background-color: var(--ds-color-inverted);
214
+ }
@@ -0,0 +1,96 @@
1
+ /* ==========================================================================
2
+ Component: Skeleton
3
+ Loading placeholders with a subtle pulse animation.
4
+ ========================================================================== */
5
+
6
+ .ds-skeleton {
7
+ display: block;
8
+ background-color: var(--ds-color-bg-muted);
9
+ border-radius: var(--ds-radius-md);
10
+ animation: ds-skeleton-pulse var(--ds-duration-slower) var(--ds-ease-default) infinite;
11
+ }
12
+
13
+ /* --- Text variants --- */
14
+
15
+ .ds-skeleton--text {
16
+ height: 1rem;
17
+ width: 100%;
18
+ border-radius: var(--ds-radius-sm);
19
+ margin-bottom: var(--ds-space-2);
20
+ }
21
+
22
+ .ds-skeleton--text-sm {
23
+ height: 0.75rem;
24
+ width: 100%;
25
+ border-radius: var(--ds-radius-sm);
26
+ margin-bottom: var(--ds-space-2);
27
+ }
28
+
29
+ .ds-skeleton--text-lg {
30
+ height: 1.5rem;
31
+ width: 100%;
32
+ border-radius: var(--ds-radius-sm);
33
+ margin-bottom: var(--ds-space-2);
34
+ }
35
+
36
+ .ds-skeleton--heading {
37
+ height: 2rem;
38
+ width: 60%;
39
+ border-radius: var(--ds-radius-md);
40
+ margin-bottom: var(--ds-space-3);
41
+ }
42
+
43
+ /* --- Shape variants --- */
44
+
45
+ .ds-skeleton--circle,
46
+ .ds-skeleton--avatar {
47
+ width: 2.5rem;
48
+ height: 2.5rem;
49
+ border-radius: var(--ds-radius-full);
50
+ }
51
+
52
+ .ds-skeleton--card {
53
+ height: 12rem;
54
+ width: 100%;
55
+ border-radius: var(--ds-radius-xl);
56
+ }
57
+
58
+ /* --- UI element variants --- */
59
+
60
+ .ds-skeleton--btn {
61
+ height: 2.25rem;
62
+ width: 6rem;
63
+ border-radius: var(--ds-radius-lg);
64
+ }
65
+
66
+ .ds-skeleton--input {
67
+ height: 2.5rem;
68
+ width: 100%;
69
+ border-radius: var(--ds-radius-lg);
70
+ }
71
+
72
+ /* --- Width modifiers --- */
73
+
74
+ .ds-skeleton--w-1\/2 {
75
+ width: 50%;
76
+ }
77
+
78
+ .ds-skeleton--w-3\/4 {
79
+ width: 75%;
80
+ }
81
+
82
+ .ds-skeleton--w-1\/3 {
83
+ width: 33%;
84
+ }
85
+
86
+ /* --- Pulse animation --- */
87
+
88
+ @keyframes ds-skeleton-pulse {
89
+ 0%,
90
+ 100% {
91
+ opacity: 1;
92
+ }
93
+ 50% {
94
+ opacity: 0.4;
95
+ }
96
+ }
@@ -0,0 +1,125 @@
1
+ /* ==========================================================================
2
+ * Slider
3
+ * ==========================================================================
4
+ *
5
+ * Range slider input component with customizable thumb and track styling.
6
+ * Supports labels, value display, size variants, and disabled state.
7
+ *
8
+ * Usage:
9
+ * <div class="ds-slider">
10
+ * <input type="range" min="0" max="100" value="50" />
11
+ * <div class="ds-slider__labels">
12
+ * <span>0</span>
13
+ * <span>100</span>
14
+ * </div>
15
+ * </div>
16
+ *
17
+ * Modifiers:
18
+ * .ds-slider--sm — Smaller track and thumb
19
+ * .ds-slider--disabled — Reduced opacity, no interaction
20
+ * ========================================================================== */
21
+
22
+ .ds-slider {
23
+ width: 100%;
24
+ position: relative;
25
+ }
26
+
27
+ .ds-slider input[type="range"] {
28
+ -webkit-appearance: none;
29
+ -moz-appearance: none;
30
+ appearance: none;
31
+ width: 100%;
32
+ height: 0.375rem;
33
+ background-color: var(--ds-color-bg-muted);
34
+ border-radius: var(--ds-radius-full);
35
+ outline: none;
36
+ cursor: pointer;
37
+ }
38
+
39
+ /* Webkit thumb */
40
+ .ds-slider input[type="range"]::-webkit-slider-thumb {
41
+ -webkit-appearance: none;
42
+ appearance: none;
43
+ width: 1.25rem;
44
+ height: 1.25rem;
45
+ border-radius: var(--ds-radius-full);
46
+ background-color: var(--ds-color-inverted);
47
+ border: 2px solid var(--ds-color-surface);
48
+ box-shadow: var(--ds-shadow-sm);
49
+ cursor: pointer;
50
+ transition: transform var(--ds-duration-fast) var(--ds-ease);
51
+ }
52
+
53
+ /* Firefox thumb */
54
+ .ds-slider input[type="range"]::-moz-range-thumb {
55
+ width: 1.25rem;
56
+ height: 1.25rem;
57
+ border-radius: var(--ds-radius-full);
58
+ background-color: var(--ds-color-inverted);
59
+ border: 2px solid var(--ds-color-surface);
60
+ box-shadow: var(--ds-shadow-sm);
61
+ cursor: pointer;
62
+ transition: transform var(--ds-duration-fast) var(--ds-ease);
63
+ }
64
+
65
+ /* Hover: scale up thumb */
66
+ .ds-slider input[type="range"]:hover::-webkit-slider-thumb {
67
+ transform: scale(1.1);
68
+ }
69
+
70
+ .ds-slider input[type="range"]:hover::-moz-range-thumb {
71
+ transform: scale(1.1);
72
+ }
73
+
74
+ /* Focus ring */
75
+ .ds-slider input[type="range"]:focus-visible::-webkit-slider-thumb {
76
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
77
+ outline-offset: var(--ds-ring-offset);
78
+ }
79
+
80
+ .ds-slider input[type="range"]:focus-visible::-moz-range-thumb {
81
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
82
+ outline-offset: var(--ds-ring-offset);
83
+ }
84
+
85
+ /* Labels row */
86
+ .ds-slider__labels {
87
+ display: flex;
88
+ justify-content: space-between;
89
+ font-size: var(--ds-text-xs);
90
+ color: var(--ds-color-text-tertiary);
91
+ margin-top: var(--ds-space-1);
92
+ }
93
+
94
+ /* Current value display */
95
+ .ds-slider__value {
96
+ font-size: var(--ds-text-sm);
97
+ font-weight: var(--ds-weight-medium);
98
+ color: var(--ds-color-text);
99
+ }
100
+
101
+ /* Size: small */
102
+ .ds-slider--sm input[type="range"] {
103
+ height: 0.25rem;
104
+ }
105
+
106
+ .ds-slider--sm input[type="range"]::-webkit-slider-thumb {
107
+ width: 1rem;
108
+ height: 1rem;
109
+ }
110
+
111
+ .ds-slider--sm input[type="range"]::-moz-range-thumb {
112
+ width: 1rem;
113
+ height: 1rem;
114
+ }
115
+
116
+ /* Disabled state */
117
+ .ds-slider--disabled {
118
+ opacity: var(--ds-opacity-disabled);
119
+ cursor: not-allowed;
120
+ }
121
+
122
+ .ds-slider--disabled input[type="range"] {
123
+ cursor: not-allowed;
124
+ pointer-events: none;
125
+ }
@@ -0,0 +1,48 @@
1
+ /* ==========================================================================
2
+ Component: Table
3
+ ========================================================================== */
4
+
5
+ .ds-table {
6
+ width: 100%;
7
+ text-align: left;
8
+ font-size: var(--ds-text-sm);
9
+ }
10
+
11
+ .ds-table th {
12
+ padding: var(--ds-space-3) var(--ds-space-4);
13
+ font-weight: var(--ds-weight-medium);
14
+ font-size: var(--ds-text-sm);
15
+ color: var(--ds-color-text-tertiary);
16
+ text-transform: uppercase;
17
+ letter-spacing: var(--ds-tracking-wide);
18
+ border-bottom: 1px solid var(--ds-color-border);
19
+ }
20
+
21
+ .ds-table td {
22
+ padding: var(--ds-space-3) var(--ds-space-4);
23
+ color: var(--ds-color-text);
24
+ border-bottom: 1px solid var(--ds-color-border-subtle);
25
+ }
26
+
27
+ .ds-table tbody tr {
28
+ transition: background-color var(--ds-duration-normal) var(--ds-ease-default);
29
+ }
30
+
31
+ .ds-table tbody tr:hover {
32
+ background-color: var(--ds-color-overlay-subtle);
33
+ }
34
+
35
+ .ds-table--compact th,
36
+ .ds-table--compact td {
37
+ padding: var(--ds-space-2) var(--ds-space-3);
38
+ font-size: var(--ds-text-xs);
39
+ }
40
+
41
+ .ds-table-wrapper {
42
+ overflow-x: auto;
43
+ border: 1px solid var(--ds-color-border);
44
+ border-radius: var(--ds-radius-xl);
45
+ background-color: var(--ds-color-surface);
46
+ }
47
+
48
+ .ds-table-wrapper .ds-table { margin: 0; }
@@ -0,0 +1,163 @@
1
+ /* ==========================================================================
2
+ Component: Tabs
3
+ Horizontal/vertical tab navigation with pill, small, and full-width variants.
4
+ ========================================================================== */
5
+
6
+ .ds-tabs {
7
+ display: flex;
8
+ flex-direction: row;
9
+ align-items: stretch;
10
+ border-bottom: 1px solid var(--ds-color-border);
11
+ gap: var(--ds-space-0);
12
+ }
13
+
14
+ /* --- Pill variant --- */
15
+
16
+ .ds-tabs--pills {
17
+ border-bottom: none;
18
+ gap: var(--ds-space-1);
19
+ background-color: var(--ds-color-bg-elevated);
20
+ border-radius: var(--ds-radius-lg);
21
+ padding: var(--ds-space-1);
22
+ }
23
+
24
+ .ds-tabs--pills .ds-tab {
25
+ border-bottom: none;
26
+ border-radius: var(--ds-radius-md);
27
+ padding: var(--ds-space-1-5) var(--ds-space-3);
28
+ }
29
+
30
+ .ds-tabs--pills .ds-tab:hover {
31
+ background-color: var(--ds-color-overlay-hover);
32
+ }
33
+
34
+ .ds-tabs--pills .ds-tab--active {
35
+ background-color: var(--ds-color-surface);
36
+ color: var(--ds-color-text);
37
+ box-shadow: var(--ds-shadow-sm);
38
+ border-bottom: none;
39
+ }
40
+
41
+ /* --- Vertical variant --- */
42
+
43
+ .ds-tabs--vertical {
44
+ flex-direction: column;
45
+ border-bottom: none;
46
+ border-right: 1px solid var(--ds-color-border);
47
+ gap: var(--ds-space-0-5);
48
+ }
49
+
50
+ .ds-tabs--vertical .ds-tab {
51
+ border-bottom: none;
52
+ border-right: 2px solid transparent;
53
+ padding: var(--ds-space-2) var(--ds-space-4);
54
+ text-align: left;
55
+ }
56
+
57
+ .ds-tabs--vertical .ds-tab--active {
58
+ border-bottom: none;
59
+ border-right-color: var(--ds-color-interactive);
60
+ color: var(--ds-color-text);
61
+ }
62
+
63
+ /* --- Small variant --- */
64
+
65
+ .ds-tabs--sm .ds-tab {
66
+ padding: var(--ds-space-1-5) var(--ds-space-3);
67
+ font-size: var(--ds-text-xs);
68
+ }
69
+
70
+ /* --- Full width variant --- */
71
+
72
+ .ds-tabs--full {
73
+ width: 100%;
74
+ }
75
+
76
+ .ds-tabs--full .ds-tab {
77
+ flex: 1;
78
+ justify-content: center;
79
+ }
80
+
81
+ /* --- Individual Tab --- */
82
+
83
+ .ds-tab {
84
+ display: inline-flex;
85
+ align-items: center;
86
+ gap: var(--ds-space-2);
87
+ padding: var(--ds-space-2) var(--ds-space-4);
88
+ font-family: var(--ds-font-sans);
89
+ font-size: var(--ds-text-sm);
90
+ font-weight: var(--ds-weight-medium);
91
+ line-height: var(--ds-leading-snug);
92
+ color: var(--ds-color-text-secondary);
93
+ cursor: pointer;
94
+ border-bottom: 2px solid transparent;
95
+ background: none;
96
+ border-top: none;
97
+ border-left: none;
98
+ border-right: none;
99
+ white-space: nowrap;
100
+ transition: all var(--ds-duration-fast) ease;
101
+ margin-bottom: -1px;
102
+ }
103
+
104
+ .ds-tab:hover {
105
+ color: var(--ds-color-text);
106
+ }
107
+
108
+ .ds-tab:focus-visible {
109
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
110
+ outline-offset: var(--ds-ring-offset);
111
+ border-radius: var(--ds-radius-sm);
112
+ }
113
+
114
+ .ds-tab--active {
115
+ color: var(--ds-color-text);
116
+ border-bottom-color: var(--ds-color-interactive);
117
+ }
118
+
119
+ .ds-tab:disabled,
120
+ .ds-tab[aria-disabled="true"] {
121
+ opacity: var(--ds-opacity-disabled);
122
+ cursor: not-allowed;
123
+ pointer-events: none;
124
+ }
125
+
126
+ /* --- Tab Icon --- */
127
+
128
+ .ds-tab__icon {
129
+ display: inline-flex;
130
+ align-items: center;
131
+ justify-content: center;
132
+ width: 1rem;
133
+ height: 1rem;
134
+ flex-shrink: 0;
135
+ color: currentColor;
136
+ }
137
+
138
+ /* --- Tab Count Badge --- */
139
+
140
+ .ds-tab__count {
141
+ display: inline-flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ padding: var(--ds-space-0) var(--ds-space-1-5);
145
+ font-size: var(--ds-text-xs);
146
+ font-weight: var(--ds-weight-medium);
147
+ line-height: var(--ds-leading-snug);
148
+ color: var(--ds-color-text-tertiary);
149
+ background-color: var(--ds-color-bg-elevated);
150
+ border-radius: var(--ds-radius-full);
151
+ min-width: 1.25rem;
152
+ }
153
+
154
+ .ds-tab--active .ds-tab__count {
155
+ color: var(--ds-color-text-secondary);
156
+ background-color: var(--ds-color-overlay-active);
157
+ }
158
+
159
+ /* --- Tab Panel --- */
160
+
161
+ .ds-tab-panel {
162
+ padding-top: var(--ds-space-5);
163
+ }