@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,109 @@
1
+ /* ==========================================================================
2
+ Component: Avatar
3
+ User photos, token images, initials. Stackable in groups.
4
+ ========================================================================== */
5
+
6
+ .ds-avatar {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ width: 2.5rem;
11
+ height: 2.5rem;
12
+ border-radius: var(--ds-radius-full);
13
+ background-color: var(--ds-color-bg-elevated);
14
+ color: var(--ds-color-text-secondary);
15
+ font-family: var(--ds-font-sans);
16
+ font-size: var(--ds-text-sm);
17
+ font-weight: var(--ds-weight-medium);
18
+ line-height: var(--ds-leading-none);
19
+ overflow: hidden;
20
+ flex-shrink: 0;
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: 1.5rem;
34
+ height: 1.5rem;
35
+ font-size: var(--ds-text-xs);
36
+ }
37
+
38
+ .ds-avatar--sm {
39
+ width: 2rem;
40
+ height: 2rem;
41
+ font-size: var(--ds-text-xs);
42
+ }
43
+
44
+ .ds-avatar--md {
45
+ width: 2.5rem;
46
+ height: 2.5rem;
47
+ font-size: var(--ds-text-sm);
48
+ }
49
+
50
+ .ds-avatar--lg {
51
+ width: 3rem;
52
+ height: 3rem;
53
+ font-size: var(--ds-text-base);
54
+ }
55
+
56
+ .ds-avatar--xl {
57
+ width: 4rem;
58
+ height: 4rem;
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
+
68
+ .ds-avatar--bordered {
69
+ border: 2px solid var(--ds-color-surface);
70
+ }
71
+
72
+ /* --- Avatar Group --- */
73
+
74
+ .ds-avatar-group {
75
+ display: flex;
76
+ align-items: center;
77
+ }
78
+
79
+ .ds-avatar-group > .ds-avatar + .ds-avatar {
80
+ margin-left: -0.5rem;
81
+ }
82
+
83
+ .ds-avatar-group--sm > .ds-avatar + .ds-avatar {
84
+ margin-left: -0.375rem;
85
+ }
86
+
87
+ /* --- Status indicator --- */
88
+
89
+ .ds-avatar__status {
90
+ position: absolute;
91
+ bottom: 0;
92
+ right: 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
+
103
+ .ds-avatar__status--offline {
104
+ background-color: var(--ds-color-text-tertiary);
105
+ }
106
+
107
+ .ds-avatar__status--busy {
108
+ background-color: var(--ds-color-error);
109
+ }
@@ -0,0 +1,80 @@
1
+ /* ==========================================================================
2
+ Component: Badge
3
+ Pill shape, border + subtle bg, clean and refined.
4
+ ========================================================================== */
5
+
6
+ .ds-badge {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: var(--ds-space-1);
10
+ padding: var(--ds-space-0-5) var(--ds-space-2-5);
11
+ font-size: var(--ds-text-xs);
12
+ font-weight: var(--ds-weight-medium);
13
+ line-height: var(--ds-leading-snug);
14
+ border-radius: var(--ds-radius-full);
15
+ white-space: nowrap;
16
+ border: 1px solid var(--ds-color-border);
17
+ background-color: var(--ds-color-bg-elevated);
18
+ color: var(--ds-color-text-secondary);
19
+ }
20
+
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
+ }
27
+
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
+ }
33
+
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
+ }
39
+
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
+ }
45
+
46
+ .ds-badge--info {
47
+ background-color: var(--ds-color-accent-blue-subtle);
48
+ color: var(--ds-color-accent-blue);
49
+ border-color: rgba(37, 99, 235, 0.2);
50
+ }
51
+
52
+ .ds-badge--purple {
53
+ background-color: var(--ds-color-accent-purple-subtle);
54
+ color: var(--ds-color-accent-purple);
55
+ border-color: rgba(124, 58, 237, 0.2);
56
+ }
57
+
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
+ }
64
+
65
+ /* Dot indicator */
66
+ .ds-badge--dot::before {
67
+ content: '';
68
+ width: 6px;
69
+ height: 6px;
70
+ border-radius: var(--ds-radius-full);
71
+ background-color: currentColor;
72
+ }
73
+
74
+ /* Uppercase badge (like "NEW", "BETA") */
75
+ .ds-badge--upper {
76
+ text-transform: uppercase;
77
+ font-size: 10px;
78
+ font-weight: var(--ds-weight-semibold);
79
+ letter-spacing: var(--ds-tracking-wide);
80
+ }
@@ -0,0 +1,95 @@
1
+ /* ==========================================================================
2
+ Breadcrumb Navigation
3
+ ==========================================================================
4
+ A horizontal breadcrumb trail for hierarchical navigation.
5
+
6
+ Usage:
7
+ <nav class="ds-breadcrumb" aria-label="Breadcrumb">
8
+ <span class="ds-breadcrumb__item">
9
+ <a href="/" class="ds-breadcrumb__link">Home</a>
10
+ </span>
11
+ <span class="ds-breadcrumb__item">
12
+ <a href="/products" class="ds-breadcrumb__link">Products</a>
13
+ </span>
14
+ <span class="ds-breadcrumb__item">
15
+ <span class="ds-breadcrumb__current" aria-current="page">Widget</span>
16
+ </span>
17
+ </nav>
18
+ ========================================================================== */
19
+
20
+ /* ---------------------------------------------------------------------------
21
+ Container
22
+ --------------------------------------------------------------------------- */
23
+
24
+ .ds-breadcrumb {
25
+ display: flex;
26
+ flex-direction: row;
27
+ align-items: center;
28
+ gap: var(--ds-space-1);
29
+ font-size: var(--ds-text-sm);
30
+ font-family: var(--ds-font-sans);
31
+ list-style: none;
32
+ margin: 0;
33
+ padding: 0;
34
+ }
35
+
36
+ /* ---------------------------------------------------------------------------
37
+ Item
38
+ --------------------------------------------------------------------------- */
39
+
40
+ .ds-breadcrumb__item {
41
+ display: flex;
42
+ align-items: center;
43
+ gap: var(--ds-space-1);
44
+ }
45
+
46
+ /* Separator — rendered via ::after on every item except the last */
47
+ .ds-breadcrumb__item:not(:last-child)::after {
48
+ content: "/";
49
+ color: var(--ds-color-text-tertiary);
50
+ flex-shrink: 0;
51
+ user-select: none;
52
+ pointer-events: none;
53
+ }
54
+
55
+ /* ---------------------------------------------------------------------------
56
+ Link
57
+ --------------------------------------------------------------------------- */
58
+
59
+ .ds-breadcrumb__link {
60
+ color: var(--ds-color-text-tertiary);
61
+ text-decoration: none;
62
+ transition: color var(--ds-duration-fast) var(--ds-ease-out);
63
+ }
64
+
65
+ .ds-breadcrumb__link:hover {
66
+ color: var(--ds-color-text-secondary);
67
+ }
68
+
69
+ .ds-breadcrumb__link:focus-visible {
70
+ outline: 2px solid var(--ds-color-interactive);
71
+ outline-offset: 2px;
72
+ border-radius: var(--ds-radius-sm);
73
+ }
74
+
75
+ /* ---------------------------------------------------------------------------
76
+ Current page (non-interactive)
77
+ --------------------------------------------------------------------------- */
78
+
79
+ .ds-breadcrumb__current {
80
+ color: var(--ds-color-text);
81
+ font-weight: var(--ds-weight-medium);
82
+ }
83
+
84
+ /* ---------------------------------------------------------------------------
85
+ Modifier: Compact
86
+ --------------------------------------------------------------------------- */
87
+
88
+ .ds-breadcrumb--compact {
89
+ gap: var(--ds-space-0-5, 0.125rem);
90
+ font-size: var(--ds-text-xs);
91
+ }
92
+
93
+ .ds-breadcrumb--compact .ds-breadcrumb__item {
94
+ gap: var(--ds-space-0-5, 0.125rem);
95
+ }
@@ -0,0 +1,168 @@
1
+ /* ==========================================================================
2
+ Component: Button
3
+ Inverted primary, rounded-full CTAs, refined sizing.
4
+ ========================================================================== */
5
+
6
+ .ds-btn {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ gap: var(--ds-space-2);
11
+ padding: var(--ds-space-2) var(--ds-space-4);
12
+ font-family: var(--ds-font-sans);
13
+ font-size: var(--ds-text-sm);
14
+ font-weight: var(--ds-weight-medium);
15
+ line-height: var(--ds-leading-none);
16
+ white-space: nowrap;
17
+ border-radius: var(--ds-radius-lg);
18
+ border: 1px solid transparent;
19
+ cursor: pointer;
20
+ transition: all var(--ds-duration-fast) ease;
21
+
22
+ /* Default: inverted (dark bg in light mode, light bg in dark mode) */
23
+ background-color: var(--ds-color-inverted);
24
+ color: var(--ds-color-on-inverted);
25
+ }
26
+
27
+ .ds-btn:hover {
28
+ opacity: 0.9;
29
+ }
30
+
31
+ .ds-btn:focus-visible {
32
+ outline: var(--ds-ring-width) solid var(--ds-ring-color);
33
+ outline-offset: var(--ds-ring-offset);
34
+ }
35
+
36
+ .ds-btn:disabled,
37
+ .ds-btn[aria-disabled="true"] {
38
+ opacity: var(--ds-opacity-disabled);
39
+ cursor: not-allowed;
40
+ pointer-events: none;
41
+ }
42
+
43
+ /* --- Variants --- */
44
+
45
+ .ds-btn--secondary {
46
+ background-color: var(--ds-color-bg-elevated);
47
+ color: var(--ds-color-text);
48
+ border-color: var(--ds-color-border);
49
+ }
50
+ .ds-btn--secondary:hover {
51
+ border-color: var(--ds-color-border-hover);
52
+ background-color: var(--ds-color-surface);
53
+ opacity: 1;
54
+ }
55
+
56
+ .ds-btn--outline {
57
+ background-color: transparent;
58
+ color: var(--ds-color-text-secondary);
59
+ border-color: var(--ds-color-border);
60
+ }
61
+ .ds-btn--outline:hover {
62
+ color: var(--ds-color-text);
63
+ border-color: var(--ds-color-border-hover);
64
+ opacity: 1;
65
+ }
66
+
67
+ .ds-btn--ghost {
68
+ background-color: transparent;
69
+ color: var(--ds-color-text-secondary);
70
+ }
71
+ .ds-btn--ghost:hover {
72
+ color: var(--ds-color-text);
73
+ background-color: var(--ds-color-bg-elevated);
74
+ opacity: 1;
75
+ }
76
+
77
+ .ds-btn--danger {
78
+ background-color: var(--ds-color-error-subtle);
79
+ color: var(--ds-color-error);
80
+ border-color: var(--ds-color-error-border);
81
+ }
82
+ .ds-btn--danger:hover {
83
+ background-color: var(--ds-color-error);
84
+ color: #fff;
85
+ opacity: 1;
86
+ }
87
+
88
+ .ds-btn--success {
89
+ background-color: var(--ds-color-success-subtle);
90
+ color: var(--ds-color-success);
91
+ border-color: var(--ds-color-success-border);
92
+ }
93
+ .ds-btn--success:hover {
94
+ background-color: var(--ds-color-success);
95
+ color: #fff;
96
+ opacity: 1;
97
+ }
98
+
99
+ /* --- Sizes --- */
100
+
101
+ .ds-btn--sm {
102
+ padding: var(--ds-space-1-5) var(--ds-space-3);
103
+ font-size: var(--ds-text-sm);
104
+ gap: var(--ds-space-1-5);
105
+ border-radius: var(--ds-radius-md);
106
+ }
107
+
108
+ .ds-btn--lg {
109
+ padding: var(--ds-space-3) var(--ds-space-6);
110
+ font-size: var(--ds-text-base);
111
+ border-radius: var(--ds-radius-lg);
112
+ }
113
+
114
+ /* --- Pill (rounded-full, like hero CTAs) --- */
115
+ .ds-btn--pill {
116
+ border-radius: var(--ds-radius-full);
117
+ padding: var(--ds-space-3) var(--ds-space-6);
118
+ }
119
+
120
+ .ds-btn--pill.ds-btn--sm {
121
+ padding: var(--ds-space-2) var(--ds-space-5);
122
+ }
123
+
124
+ /* --- Full Width --- */
125
+ .ds-btn--full { width: 100%; }
126
+
127
+ /* --- Icon Only --- */
128
+ .ds-btn--icon {
129
+ padding: 0;
130
+ width: 2.25rem;
131
+ height: 2.25rem;
132
+ border-radius: var(--ds-radius-md);
133
+ }
134
+
135
+ .ds-btn--icon.ds-btn--sm {
136
+ width: 2rem;
137
+ height: 2rem;
138
+ }
139
+
140
+ /* --- Button Group --- */
141
+ .ds-btn-group {
142
+ display: inline-flex;
143
+ }
144
+ .ds-btn-group .ds-btn { border-radius: 0; }
145
+ .ds-btn-group .ds-btn:first-child { border-radius: var(--ds-radius-lg) 0 0 var(--ds-radius-lg); }
146
+ .ds-btn-group .ds-btn:last-child { border-radius: 0 var(--ds-radius-lg) var(--ds-radius-lg) 0; }
147
+ .ds-btn-group .ds-btn + .ds-btn { margin-left: -1px; }
148
+
149
+ /* --- Loading spinner --- */
150
+ .ds-btn--loading {
151
+ position: relative;
152
+ color: transparent !important;
153
+ pointer-events: none;
154
+ }
155
+ .ds-btn--loading::after {
156
+ content: '';
157
+ position: absolute;
158
+ width: 1em;
159
+ height: 1em;
160
+ border: 2px solid currentColor;
161
+ border-right-color: transparent;
162
+ border-radius: var(--ds-radius-full);
163
+ animation: ds-btn-spin 0.6s linear infinite;
164
+ color: var(--ds-color-on-inverted);
165
+ }
166
+ @keyframes ds-btn-spin {
167
+ to { transform: rotate(360deg); }
168
+ }
@@ -0,0 +1,121 @@
1
+ /* ==========================================================================
2
+ Component: Card
3
+ Surface + border, hover with shadow lift, rounded-xl.
4
+ ========================================================================== */
5
+
6
+ .ds-card {
7
+ background-color: var(--ds-color-surface);
8
+ border: 1px solid var(--ds-color-border);
9
+ border-radius: var(--ds-radius-xl);
10
+ overflow: hidden;
11
+ transition: all var(--ds-duration-normal) var(--ds-ease-default);
12
+ }
13
+
14
+ /* Interactive card — lifts on hover (like ProjectCard) */
15
+ .ds-card--interactive {
16
+ cursor: pointer;
17
+ }
18
+ .ds-card--interactive:hover {
19
+ border-color: var(--ds-color-border-hover);
20
+ box-shadow: var(--ds-shadow-lg);
21
+ transform: translateY(-4px);
22
+ }
23
+
24
+ /* Elevated card — visible shadow */
25
+ .ds-card--elevated {
26
+ background-color: var(--ds-color-bg-elevated);
27
+ box-shadow: var(--ds-shadow-lg);
28
+ }
29
+
30
+ /* Hover card — subtle bg change */
31
+ .ds-card--hover:hover {
32
+ border-color: var(--ds-color-border-hover);
33
+ }
34
+
35
+ .ds-card__header {
36
+ padding: var(--ds-space-5);
37
+ border-bottom: 1px solid var(--ds-color-border);
38
+ }
39
+
40
+ .ds-card__header h3,
41
+ .ds-card__header .ds-card__title {
42
+ font-family: var(--ds-font-display);
43
+ font-weight: var(--ds-font-display-weight);
44
+ font-size: var(--ds-text-lg);
45
+ letter-spacing: var(--ds-tracking-tight);
46
+ color: var(--ds-color-text);
47
+ }
48
+
49
+ .ds-card__description {
50
+ font-size: var(--ds-text-sm);
51
+ color: var(--ds-color-text-tertiary);
52
+ margin-top: var(--ds-space-1);
53
+ }
54
+
55
+ .ds-card__body {
56
+ padding: var(--ds-space-5);
57
+ }
58
+
59
+ .ds-card__footer {
60
+ padding: var(--ds-space-4) var(--ds-space-5);
61
+ border-top: 1px solid var(--ds-color-border);
62
+ display: flex;
63
+ align-items: center;
64
+ gap: var(--ds-space-2);
65
+ }
66
+
67
+ .ds-card__media {
68
+ width: 100%;
69
+ aspect-ratio: 16/10;
70
+ object-fit: cover;
71
+ background-color: var(--ds-color-bg-elevated);
72
+ }
73
+
74
+ /* Compact */
75
+ .ds-card--compact .ds-card__header,
76
+ .ds-card--compact .ds-card__body,
77
+ .ds-card--compact .ds-card__footer {
78
+ padding: var(--ds-space-3) var(--ds-space-4);
79
+ }
80
+
81
+ /* Flush — no internal dividers */
82
+ .ds-card--flush .ds-card__header { border-bottom: none; }
83
+ .ds-card--flush .ds-card__footer { border-top: none; }
84
+
85
+ /* Stat card (like StatCard component) */
86
+ .ds-stat-card {
87
+ background-color: var(--ds-color-surface);
88
+ border: 1px solid var(--ds-color-border);
89
+ border-radius: var(--ds-radius-xl);
90
+ padding: var(--ds-space-5);
91
+ }
92
+
93
+ .ds-stat-card__label {
94
+ font-size: var(--ds-text-sm);
95
+ color: var(--ds-color-text-tertiary);
96
+ }
97
+
98
+ .ds-stat-card__value {
99
+ font-family: var(--ds-font-display);
100
+ font-weight: var(--ds-font-display-weight);
101
+ font-size: var(--ds-text-2xl);
102
+ color: var(--ds-color-text);
103
+ margin-top: var(--ds-space-1);
104
+ }
105
+
106
+ .ds-stat-card__detail {
107
+ font-size: var(--ds-text-xs);
108
+ color: var(--ds-color-text-tertiary);
109
+ margin-top: var(--ds-space-0-5);
110
+ }
111
+
112
+ .ds-stat-card__icon {
113
+ width: 2.5rem;
114
+ height: 2.5rem;
115
+ border-radius: var(--ds-radius-xl);
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ background-color: var(--ds-color-bg-elevated);
120
+ color: var(--ds-color-text-secondary);
121
+ }