@adamarant/designsystem 0.11.2

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 (84) hide show
  1. package/README.md +101 -0
  2. package/dist/designsystem.css +13494 -0
  3. package/dist/designsystem.js +67 -0
  4. package/dist/designsystem.min.css +2 -0
  5. package/package.json +111 -0
  6. package/src/base/index.css +2 -0
  7. package/src/base/reset.css +119 -0
  8. package/src/base/typography.css +172 -0
  9. package/src/components/accordion.css +166 -0
  10. package/src/components/admin-layout.css +371 -0
  11. package/src/components/alert.css +159 -0
  12. package/src/components/avatar.css +109 -0
  13. package/src/components/badge.css +80 -0
  14. package/src/components/bottom-nav.css +125 -0
  15. package/src/components/bottom-sheet.css +146 -0
  16. package/src/components/breadcrumb.css +102 -0
  17. package/src/components/button.css +250 -0
  18. package/src/components/card.css +117 -0
  19. package/src/components/chip.css +79 -0
  20. package/src/components/collapsible.css +112 -0
  21. package/src/components/color-picker.css +82 -0
  22. package/src/components/combobox.css +420 -0
  23. package/src/components/command.css +210 -0
  24. package/src/components/context-menu.css +162 -0
  25. package/src/components/copy-button.css +106 -0
  26. package/src/components/custom-select.css +446 -0
  27. package/src/components/datepicker.css +301 -0
  28. package/src/components/description-list.css +100 -0
  29. package/src/components/divider.css +66 -0
  30. package/src/components/drawer.css +234 -0
  31. package/src/components/drop-zone.css +166 -0
  32. package/src/components/dropdown.css +169 -0
  33. package/src/components/empty-state.css +75 -0
  34. package/src/components/field.css +112 -0
  35. package/src/components/gallery.css +257 -0
  36. package/src/components/hero.css +111 -0
  37. package/src/components/icon-btn.css +103 -0
  38. package/src/components/index.css +74 -0
  39. package/src/components/input.css +311 -0
  40. package/src/components/kbd.css +54 -0
  41. package/src/components/media-library.css +230 -0
  42. package/src/components/modal.css +136 -0
  43. package/src/components/nav.css +198 -0
  44. package/src/components/number-input.css +163 -0
  45. package/src/components/pagination.css +175 -0
  46. package/src/components/pin-input.css +136 -0
  47. package/src/components/popover.css +111 -0
  48. package/src/components/progress.css +217 -0
  49. package/src/components/prose.css +337 -0
  50. package/src/components/result.css +80 -0
  51. package/src/components/scroll-area.css +73 -0
  52. package/src/components/search.css +311 -0
  53. package/src/components/segmented-control.css +94 -0
  54. package/src/components/skeleton.css +100 -0
  55. package/src/components/slider.css +133 -0
  56. package/src/components/sortable.css +70 -0
  57. package/src/components/spinner.css +60 -0
  58. package/src/components/star-rating.css +121 -0
  59. package/src/components/stat-card.css +44 -0
  60. package/src/components/table.css +359 -0
  61. package/src/components/tabs.css +215 -0
  62. package/src/components/tag.css +188 -0
  63. package/src/components/timeline.css +130 -0
  64. package/src/components/toast.css +90 -0
  65. package/src/components/toggle.css +173 -0
  66. package/src/components/toolbar.css +206 -0
  67. package/src/components/tooltip.css +167 -0
  68. package/src/components/truncated-text.css +75 -0
  69. package/src/index.css +21 -0
  70. package/src/js/theme.js +67 -0
  71. package/src/tokens/colors.css +256 -0
  72. package/src/tokens/index.css +11 -0
  73. package/src/tokens/shadows.css +55 -0
  74. package/src/tokens/spacing.css +82 -0
  75. package/src/tokens/tokens.json +413 -0
  76. package/src/tokens/typography.css +90 -0
  77. package/src/utilities/a11y.css +102 -0
  78. package/src/utilities/index.css +7 -0
  79. package/src/utilities/interactive.css +121 -0
  80. package/src/utilities/layout.css +273 -0
  81. package/src/utilities/sizing.css +85 -0
  82. package/src/utilities/spacing.css +204 -0
  83. package/src/utilities/states.css +182 -0
  84. package/src/utilities/text.css +381 -0
@@ -0,0 +1,136 @@
1
+ /* ==========================================================================
2
+ Component: Pin Input
3
+ One-character-per-field input for OTP codes, PINs, and verification.
4
+
5
+ ARIA requirements (consumer responsibility):
6
+ - Each input: inputmode="numeric", pattern="[0-9]", maxlength="1"
7
+ - Group: role="group", aria-label="Verification code"
8
+ - Auto-focus next field on input, previous on backspace
9
+ - Paste: distribute characters across fields
10
+
11
+ Usage:
12
+ <div class="ds-pin-input" role="group" aria-label="Verification code">
13
+ <input class="ds-pin-input__field" inputmode="numeric" maxlength="1" />
14
+ <input class="ds-pin-input__field" inputmode="numeric" maxlength="1" />
15
+ <input class="ds-pin-input__field" inputmode="numeric" maxlength="1" />
16
+ <span class="ds-pin-input__separator">–</span>
17
+ <input class="ds-pin-input__field" inputmode="numeric" maxlength="1" />
18
+ <input class="ds-pin-input__field" inputmode="numeric" maxlength="1" />
19
+ <input class="ds-pin-input__field" inputmode="numeric" maxlength="1" />
20
+ </div>
21
+
22
+ Modifiers:
23
+ .ds-pin-input--sm/--lg — Size variants
24
+ .ds-pin-input--error — Error state (red border)
25
+ .ds-pin-input--success — Success state (green border)
26
+ ========================================================================== */
27
+
28
+ .ds-pin-input {
29
+ display: inline-flex;
30
+ align-items: center;
31
+ gap: var(--ds-space-2);
32
+ }
33
+
34
+ /* --- Individual field --- */
35
+ .ds-pin-input__field {
36
+ width: var(--ds-size-3);
37
+ height: var(--ds-size-3);
38
+ padding: 0;
39
+ border: 1px solid var(--ds-color-border);
40
+ border-radius: var(--ds-radius-lg);
41
+ background-color: var(--ds-color-surface);
42
+ color: var(--ds-color-text);
43
+ font-family: var(--ds-font-mono);
44
+ font-size: var(--ds-text-xl);
45
+ font-weight: var(--ds-weight-semibold);
46
+ text-align: center;
47
+ line-height: 1;
48
+ caret-color: var(--ds-color-interactive);
49
+ transition:
50
+ border-color var(--ds-duration-fast) var(--ds-ease-default),
51
+ box-shadow var(--ds-duration-fast) var(--ds-ease-default);
52
+ -moz-appearance: textfield;
53
+ }
54
+
55
+ .ds-pin-input__field::-webkit-inner-spin-button,
56
+ .ds-pin-input__field::-webkit-outer-spin-button {
57
+ -webkit-appearance: none;
58
+ margin: 0;
59
+ }
60
+
61
+ .ds-pin-input__field::placeholder {
62
+ color: var(--ds-color-text-disabled);
63
+ }
64
+
65
+ .ds-pin-input__field:hover {
66
+ border-color: var(--ds-color-border-hover);
67
+ }
68
+
69
+ .ds-pin-input__field:focus {
70
+ outline: none;
71
+ border-color: var(--ds-color-border-active);
72
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-ring-color);
73
+ }
74
+
75
+ /* --- Separator (dash between groups) --- */
76
+ .ds-pin-input__separator {
77
+ color: var(--ds-color-text-tertiary);
78
+ font-size: var(--ds-text-lg);
79
+ user-select: none;
80
+ padding-inline: var(--ds-space-0-5);
81
+ }
82
+
83
+ /* ==========================================================================
84
+ Size variants
85
+ ========================================================================== */
86
+
87
+ /* SM */
88
+ .ds-pin-input--sm {
89
+ gap: var(--ds-space-1-5);
90
+ }
91
+
92
+ .ds-pin-input--sm .ds-pin-input__field {
93
+ width: var(--ds-size-2);
94
+ height: var(--ds-size-2);
95
+ font-size: var(--ds-text-base);
96
+ border-radius: var(--ds-radius-md);
97
+ }
98
+
99
+ /* LG */
100
+ .ds-pin-input--lg {
101
+ gap: var(--ds-space-3);
102
+ }
103
+
104
+ .ds-pin-input--lg .ds-pin-input__field {
105
+ width: var(--ds-size-4);
106
+ height: var(--ds-size-4);
107
+ font-size: var(--ds-text-2xl);
108
+ }
109
+
110
+ /* ==========================================================================
111
+ State variants
112
+ ========================================================================== */
113
+
114
+ /* Error */
115
+ .ds-pin-input--error .ds-pin-input__field {
116
+ border-color: var(--ds-color-error);
117
+ }
118
+
119
+ .ds-pin-input--error .ds-pin-input__field:focus {
120
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-error);
121
+ }
122
+
123
+ /* Success */
124
+ .ds-pin-input--success .ds-pin-input__field {
125
+ border-color: var(--ds-color-success);
126
+ }
127
+
128
+ .ds-pin-input--success .ds-pin-input__field:focus {
129
+ box-shadow: 0 0 0 var(--ds-ring-width) var(--ds-color-success);
130
+ }
131
+
132
+ /* Disabled */
133
+ .ds-pin-input--disabled .ds-pin-input__field {
134
+ opacity: var(--ds-opacity-disabled);
135
+ pointer-events: none;
136
+ }
@@ -0,0 +1,111 @@
1
+ /* ==========================================================================
2
+ Popover
3
+ ==========================================================================
4
+ Flexible popover component for displaying complex content anchored to a
5
+ trigger element. Supports four placement directions (top, bottom, left,
6
+ right) and multiple size variants. Default placement is bottom.
7
+
8
+ Usage:
9
+ <div class="ds-popover ds-popover--open">
10
+ <button>Trigger</button>
11
+ <div class="ds-popover__content">...</div>
12
+ </div>
13
+
14
+ Modifiers:
15
+ .ds-popover--open — Shows the popover content
16
+ .ds-popover--top — Places content above the trigger
17
+ .ds-popover--bottom — Places content below the trigger (default)
18
+ .ds-popover--left — Places content to the left of the trigger
19
+ .ds-popover--right — Places content to the right of the trigger
20
+ .ds-popover__content--sm — Smaller popover (12rem min-width)
21
+ .ds-popover__content--lg — Larger popover (24rem min-width)
22
+ ========================================================================== */
23
+
24
+ .ds-popover {
25
+ position: relative;
26
+ display: inline-flex;
27
+
28
+ &__content {
29
+ position: absolute;
30
+ z-index: var(--ds-z-dropdown);
31
+ background-color: var(--ds-color-surface-muted);
32
+ border: 1px solid var(--ds-color-border);
33
+ border-radius: var(--ds-radius-xl);
34
+ box-shadow: var(--ds-shadow-lg);
35
+ padding: var(--ds-space-4);
36
+ min-width: 16rem;
37
+ opacity: 0;
38
+ visibility: hidden;
39
+ transform: scale(0.96);
40
+ transition:
41
+ opacity var(--ds-duration-fast) var(--ds-ease-default),
42
+ visibility var(--ds-duration-fast) var(--ds-ease-default),
43
+ transform var(--ds-duration-fast) var(--ds-ease-out-expo);
44
+
45
+ /* Size: small */
46
+ &--sm {
47
+ min-width: 12rem;
48
+ padding: var(--ds-space-3);
49
+ }
50
+
51
+ /* Size: large */
52
+ &--lg {
53
+ min-width: 24rem;
54
+ }
55
+ }
56
+
57
+ /* Open state */
58
+ &--open .ds-popover__content {
59
+ opacity: 1;
60
+ visibility: visible;
61
+ transform: scale(1);
62
+ }
63
+
64
+ /* Placement: bottom (default) */
65
+ & .ds-popover__content,
66
+ &--bottom .ds-popover__content {
67
+ inset-block-start: calc(100% + var(--ds-offset-md));
68
+ inset-inline-start: 50%;
69
+ transform: translateX(-50%) scale(0.96);
70
+ }
71
+
72
+ &--open .ds-popover__content,
73
+ &--bottom&--open .ds-popover__content {
74
+ transform: translateX(-50%) scale(1);
75
+ }
76
+
77
+ /* Placement: top */
78
+ &--top .ds-popover__content {
79
+ inset-block-end: calc(100% + var(--ds-offset-md));
80
+ inset-block-start: auto;
81
+ inset-inline-start: 50%;
82
+ transform: translateX(-50%) scale(0.96);
83
+ }
84
+
85
+ &--top&--open .ds-popover__content {
86
+ transform: translateX(-50%) scale(1);
87
+ }
88
+
89
+ /* Placement: left */
90
+ &--left .ds-popover__content {
91
+ inset-inline-end: calc(100% + var(--ds-offset-md));
92
+ inset-block-start: 50%;
93
+ inset-inline-start: auto;
94
+ transform: translateY(-50%) scale(0.96);
95
+ }
96
+
97
+ &--left&--open .ds-popover__content {
98
+ transform: translateY(-50%) scale(1);
99
+ }
100
+
101
+ /* Placement: right */
102
+ &--right .ds-popover__content {
103
+ inset-inline-start: calc(100% + var(--ds-offset-md));
104
+ inset-block-start: 50%;
105
+ transform: translateY(-50%) scale(0.96);
106
+ }
107
+
108
+ &--right&--open .ds-popover__content {
109
+ transform: translateY(-50%) scale(1);
110
+ }
111
+ }
@@ -0,0 +1,217 @@
1
+ /* ==========================================================================
2
+ Progress Bar & Step Indicator
3
+ ==========================================================================
4
+ Two related components for communicating progress:
5
+
6
+ 1. Progress bar — a horizontal fill bar with optional label row.
7
+ Sizes: --sm, (default), --lg
8
+ Statuses: --success, --warning, --error, --info
9
+
10
+ 2. Step indicator — a numbered sequence of steps with connectors.
11
+ States: --completed, --current, --error
12
+ Layout: horizontal (default), --vertical
13
+
14
+ Progress bar usage:
15
+ <div class="ds-progress__label">
16
+ <span>Uploading…</span><span>64 %</span>
17
+ </div>
18
+ <div class="ds-progress">
19
+ <div class="ds-progress__bar" style="width: 64%"></div>
20
+ </div>
21
+
22
+ Step indicator usage:
23
+ <div class="ds-steps">
24
+ <div class="ds-step ds-step--completed">
25
+ <div class="ds-step__indicator">1</div>
26
+ <div class="ds-step__content">
27
+ <span class="ds-step__title">Account</span>
28
+ <span class="ds-step__description">Create your account</span>
29
+ </div>
30
+ </div>
31
+ <div class="ds-step__connector"></div>
32
+ <div class="ds-step ds-step--current">…</div>
33
+ </div>
34
+ ========================================================================== */
35
+
36
+ /* ==========================================================================
37
+ Progress Bar
38
+ ========================================================================== */
39
+
40
+ /* Label row (sits above the bar) */
41
+ .ds-progress__label {
42
+ display: flex;
43
+ justify-content: space-between;
44
+ font-size: var(--ds-text-xs);
45
+ color: var(--ds-color-text-tertiary);
46
+ margin-block-end: var(--ds-space-1-5);
47
+ }
48
+
49
+ /* Track */
50
+ .ds-progress {
51
+ width: 100%;
52
+ height: 0.5rem;
53
+ background-color: var(--ds-color-surface-muted);
54
+ border-radius: var(--ds-radius-full);
55
+ overflow: hidden;
56
+
57
+ /* Fill */
58
+ &__bar {
59
+ height: 100%;
60
+ min-width: 0.25rem;
61
+ background-color: var(--ds-color-inverted);
62
+ border-radius: var(--ds-radius-full);
63
+ transition: width var(--ds-duration-normal) var(--ds-ease-default);
64
+ }
65
+
66
+ /* ---------------------------------------------------------------------------
67
+ Sizes
68
+ --------------------------------------------------------------------------- */
69
+
70
+ &--sm {
71
+ height: 0.25rem;
72
+ }
73
+
74
+ &--lg {
75
+ height: 0.75rem;
76
+ }
77
+
78
+ /* ---------------------------------------------------------------------------
79
+ Status colours
80
+ --------------------------------------------------------------------------- */
81
+
82
+ &--success .ds-progress__bar {
83
+ background-color: var(--ds-color-success);
84
+ }
85
+
86
+ &--warning .ds-progress__bar {
87
+ background-color: var(--ds-color-warning);
88
+ }
89
+
90
+ &--error .ds-progress__bar {
91
+ background-color: var(--ds-color-error);
92
+ }
93
+
94
+ &--info .ds-progress__bar {
95
+ background-color: var(--ds-color-info);
96
+ }
97
+ }
98
+
99
+ /* ==========================================================================
100
+ Step Indicator
101
+ ========================================================================== */
102
+
103
+ /* Steps container (horizontal by default) */
104
+ .ds-steps {
105
+ display: flex;
106
+ flex-direction: row;
107
+ align-items: center;
108
+ gap: 0;
109
+
110
+ /* Vertical variant */
111
+ &--vertical {
112
+ flex-direction: column;
113
+ align-items: flex-start;
114
+
115
+ & .ds-step__connector {
116
+ flex: none;
117
+ width: 2px;
118
+ height: 2rem;
119
+ min-width: auto;
120
+ margin-inline: 0;
121
+ margin-inline-start: calc(1rem - 1px); /* center under the 2 rem indicator */
122
+ margin-block: var(--ds-space-1);
123
+ background-color: var(--ds-color-border-subtle);
124
+ }
125
+
126
+ & .ds-step--completed + .ds-step__connector {
127
+ background-color: var(--ds-color-inverted);
128
+ }
129
+ }
130
+ }
131
+
132
+ /* ---------------------------------------------------------------------------
133
+ Single step
134
+ --------------------------------------------------------------------------- */
135
+
136
+ .ds-step {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: var(--ds-space-3);
140
+
141
+ /* Circle indicator */
142
+ &__indicator {
143
+ display: flex;
144
+ align-items: center;
145
+ justify-content: center;
146
+ width: 2rem;
147
+ height: 2rem;
148
+ border-radius: var(--ds-radius-full);
149
+ border: 2px solid var(--ds-color-border);
150
+ font-size: var(--ds-text-xs);
151
+ font-weight: var(--ds-weight-medium);
152
+ color: var(--ds-color-text-tertiary);
153
+ background-color: var(--ds-color-surface);
154
+ flex-shrink: 0;
155
+ transition:
156
+ background-color var(--ds-duration-fast) var(--ds-ease-default),
157
+ border-color var(--ds-duration-fast) var(--ds-ease-default),
158
+ color var(--ds-duration-fast) var(--ds-ease-default);
159
+ }
160
+
161
+ /* Completed step */
162
+ &--completed &__indicator {
163
+ background-color: var(--ds-color-inverted);
164
+ border-color: var(--ds-color-inverted);
165
+ color: var(--ds-color-on-inverted);
166
+ }
167
+
168
+ /* Current step */
169
+ &--current &__indicator {
170
+ border-color: var(--ds-color-interactive);
171
+ color: var(--ds-color-text);
172
+ }
173
+
174
+ /* Error step */
175
+ &--error &__indicator {
176
+ border-color: var(--ds-color-error);
177
+ color: var(--ds-color-error);
178
+ }
179
+
180
+ /* ---------------------------------------------------------------------------
181
+ Step content
182
+ --------------------------------------------------------------------------- */
183
+
184
+ &__content {
185
+ display: flex;
186
+ flex-direction: column;
187
+ }
188
+
189
+ &__title {
190
+ font-size: var(--ds-text-sm);
191
+ font-weight: var(--ds-weight-medium);
192
+ color: var(--ds-color-text);
193
+ }
194
+
195
+ &__description {
196
+ font-size: var(--ds-text-xs);
197
+ color: var(--ds-color-text-tertiary);
198
+ }
199
+
200
+ /* ---------------------------------------------------------------------------
201
+ Connector (line between steps)
202
+ --------------------------------------------------------------------------- */
203
+
204
+ /* Horizontal connector */
205
+ &__connector {
206
+ flex: 1;
207
+ height: 2px;
208
+ min-width: var(--ds-space-4);
209
+ background-color: var(--ds-color-border);
210
+ margin-inline: var(--ds-space-2);
211
+ }
212
+
213
+ /* Filled connector after a completed step */
214
+ &--completed + &__connector {
215
+ background-color: var(--ds-color-inverted);
216
+ }
217
+ }