@codenhub/styles 0.0.2 → 0.0.4

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.
@@ -0,0 +1,155 @@
1
+ @import "tailwindcss";
2
+ @import "../theme.css";
3
+
4
+ @utility btn {
5
+ --button-color: var(--color-text);
6
+ --button-contrast: var(--color-text-contrast);
7
+ --button-hover: var(--color-text-hover);
8
+ --button-subtle: var(--color-text-subtle);
9
+ --button-strong: var(--color-text-strong);
10
+ --button-bg: var(--button-color);
11
+ --button-fg: var(--button-contrast);
12
+ --button-border: var(--button-bg);
13
+ --button-hover-bg: var(--button-hover);
14
+ --button-hover-fg: var(--button-fg);
15
+ --button-hover-border: var(--button-hover-bg);
16
+ --button-text: var(--button-strong);
17
+ --button-soft-bg: var(--button-subtle);
18
+ --button-subtle-hover-bg: color-mix(in srgb, var(--button-soft-bg) 80%, transparent);
19
+ --button-soft-hover-bg: color-mix(in srgb, var(--button-soft-bg) 84%, var(--button-text));
20
+ --button-spinner: var(--button-fg);
21
+
22
+ @apply relative inline-flex min-h-(--control-height,2.5rem) w-fit items-center justify-center gap-2 rounded-(--radius-control) bg-(--button-bg) px-4 py-2 font-semibold whitespace-nowrap text-(--button-fg) no-underline transition-[background-color,border-color,color,opacity,transform] duration-(--motion-duration-fast) ease-(--motion-ease) select-none;
23
+ border: var(--border-width) solid var(--button-border);
24
+
25
+ &.primary {
26
+ --button-color: var(--color-primary);
27
+ --button-contrast: var(--color-primary-contrast);
28
+ --button-hover: var(--color-primary-hover);
29
+ --button-subtle: var(--color-primary-subtle);
30
+ --button-strong: var(--color-primary-strong);
31
+ }
32
+
33
+ &.secondary {
34
+ --button-color: var(--color-accent);
35
+ --button-contrast: var(--color-accent-contrast);
36
+ --button-hover: var(--color-accent-hover);
37
+ --button-subtle: var(--color-accent-subtle);
38
+ --button-strong: var(--color-accent-strong);
39
+ }
40
+
41
+ &.success {
42
+ --button-color: var(--color-success);
43
+ --button-contrast: var(--color-success-contrast);
44
+ --button-hover: var(--color-success-hover);
45
+ --button-subtle: var(--color-success-subtle);
46
+ --button-strong: var(--color-success-strong);
47
+ }
48
+
49
+ &.warning {
50
+ --button-color: var(--color-warning);
51
+ --button-contrast: var(--color-warning-contrast);
52
+ --button-hover: var(--color-warning-hover);
53
+ --button-subtle: var(--color-warning-subtle);
54
+ --button-strong: var(--color-warning-strong);
55
+ }
56
+
57
+ &.destructive,
58
+ &.danger,
59
+ &.error {
60
+ --button-color: var(--color-destructive);
61
+ --button-contrast: var(--color-destructive-contrast);
62
+ --button-hover: var(--color-destructive-hover);
63
+ --button-subtle: var(--color-destructive-subtle);
64
+ --button-strong: var(--color-destructive-strong);
65
+ }
66
+
67
+ &.info {
68
+ --button-color: var(--color-info);
69
+ --button-contrast: var(--color-info-contrast);
70
+ --button-hover: var(--color-info-hover);
71
+ --button-subtle: var(--color-info-subtle);
72
+ --button-strong: var(--color-info-strong);
73
+ }
74
+
75
+ &.out {
76
+ --button-spinner: var(--button-text);
77
+
78
+ @apply bg-transparent text-(--button-color);
79
+ border: calc(var(--border-width) * 2) solid var(--button-color);
80
+
81
+ &:not(:disabled, .disabled, [aria-disabled="true"], [data-disabled]):hover {
82
+ @apply border-(--button-color) bg-(--button-subtle) text-(--button-color);
83
+ }
84
+
85
+ &.fill {
86
+ &:not(:disabled, .disabled, [aria-disabled="true"], [data-disabled]):hover {
87
+ @apply border-(--button-color) bg-(--button-color) text-(--button-contrast);
88
+ }
89
+ }
90
+ }
91
+
92
+ &.ghost {
93
+ --button-spinner: var(--button-text);
94
+
95
+ @apply border-transparent bg-transparent text-(--button-text);
96
+
97
+ &:not(:disabled, .disabled, [aria-disabled="true"], [data-disabled]):hover {
98
+ @apply border-transparent bg-(--button-subtle-hover-bg) text-(--button-text);
99
+ }
100
+ }
101
+
102
+ &.soft {
103
+ --button-spinner: var(--button-text);
104
+
105
+ @apply border-transparent bg-(--button-soft-bg) text-(--button-text);
106
+
107
+ &:not(:disabled, .disabled, [aria-disabled="true"], [data-disabled]):hover {
108
+ @apply border-transparent bg-(--button-soft-hover-bg) text-(--button-text);
109
+ }
110
+ }
111
+
112
+ &.sm {
113
+ @apply min-h-8 px-3 py-1 text-sm;
114
+ }
115
+
116
+ &.lg {
117
+ @apply min-h-12 px-5 py-2.5 text-[1.0625rem];
118
+ }
119
+
120
+ &.icon {
121
+ @apply aspect-square min-w-(--control-height,2.5rem) p-2;
122
+ }
123
+
124
+ &.pill {
125
+ @apply rounded-full;
126
+ }
127
+
128
+ &:not(:disabled, .disabled, [aria-disabled="true"], [data-disabled]):hover {
129
+ &:not(.out, .ghost, .soft) {
130
+ @apply border-(--button-hover-border) bg-(--button-hover-bg) text-(--button-hover-fg);
131
+ }
132
+ }
133
+
134
+ &:disabled,
135
+ &.disabled,
136
+ &[aria-disabled="true"],
137
+ &[data-disabled] {
138
+ @apply cursor-not-allowed;
139
+
140
+ opacity: 0.58;
141
+ }
142
+
143
+ &.loading {
144
+ @apply pointer-events-none text-transparent! transition-[opacity,transform];
145
+
146
+ &::after {
147
+ @apply absolute block size-4 -translate-x-1/2 -translate-y-1/2 rounded-full bg-(--button-spinner);
148
+
149
+ top: calc(50% + var(--border-width));
150
+ left: calc(50% + var(--border-width));
151
+ content: "";
152
+ @apply ai;
153
+ }
154
+ }
155
+ }
@@ -0,0 +1,214 @@
1
+ @import "tailwindcss";
2
+ @import "../theme.css";
3
+
4
+ @keyframes anim-skeleton {
5
+ 0% {
6
+ background-position: 200% 0;
7
+ }
8
+
9
+ 100% {
10
+ background-position: -200% 0;
11
+ }
12
+ }
13
+
14
+ @utility alert {
15
+ --feedback-color: var(--color-text);
16
+ --feedback-contrast: var(--color-text-contrast);
17
+ --feedback-surface: color-mix(in srgb, var(--feedback-color) 12%, var(--color-background));
18
+ --feedback-border: color-mix(in srgb, var(--feedback-color) 42%, var(--color-border));
19
+
20
+ @apply flex rounded-(--radius-surface) bg-(--feedback-surface) p-4 leading-5 text-(--feedback-color);
21
+ border: var(--border-width) solid var(--feedback-border);
22
+
23
+ &.primary {
24
+ --feedback-color: var(--color-primary);
25
+ --feedback-contrast: var(--color-primary-contrast);
26
+ }
27
+
28
+ &.secondary {
29
+ --feedback-color: var(--color-accent);
30
+ --feedback-contrast: var(--color-accent-contrast);
31
+ }
32
+
33
+ &.success {
34
+ --feedback-color: var(--color-success);
35
+ --feedback-contrast: var(--color-success-contrast);
36
+ }
37
+
38
+ &.warning {
39
+ --feedback-color: var(--color-warning);
40
+ --feedback-contrast: var(--color-warning-contrast);
41
+ }
42
+
43
+ &.destructive,
44
+ &.danger,
45
+ &.error {
46
+ --feedback-color: var(--color-destructive);
47
+ --feedback-contrast: var(--color-destructive-contrast);
48
+ }
49
+
50
+ &.info {
51
+ --feedback-color: var(--color-info);
52
+ --feedback-contrast: var(--color-info-contrast);
53
+ }
54
+
55
+ &.flat {
56
+ @apply bg-(--feedback-color) text-(--feedback-contrast);
57
+ border-color: var(--feedback-color);
58
+ }
59
+
60
+ &.soft {
61
+ @apply border-transparent bg-(--feedback-surface) text-(--feedback-color);
62
+ }
63
+
64
+ &.left-accent {
65
+ @apply border-y-transparent border-r-transparent bg-(--feedback-surface) text-(--feedback-color);
66
+ border-left-width: 4px;
67
+ border-left-color: var(--feedback-color);
68
+ }
69
+
70
+ &.icon {
71
+ @apply relative pl-11;
72
+
73
+ &::before {
74
+ @apply absolute top-4 left-4 block size-5 bg-current;
75
+
76
+ content: "";
77
+ mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 16v-4'/%3E%3Cpath d='M12 8h.01'/%3E%3C/svg%3E");
78
+ -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 16v-4'/%3E%3Cpath d='M12 8h.01'/%3E%3C/svg%3E");
79
+ mask-size: contain;
80
+ -webkit-mask-size: contain;
81
+ mask-repeat: no-repeat;
82
+ -webkit-mask-repeat: no-repeat;
83
+ mask-position: center;
84
+ -webkit-mask-position: center;
85
+ }
86
+
87
+ &.success::before {
88
+ mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='m9 12 2 2 4-4'/%3E%3C/svg%3E");
89
+ -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='m9 12 2 2 4-4'/%3E%3C/svg%3E");
90
+ }
91
+
92
+ &.warning::before {
93
+ mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z'/%3E%3Cpath d='M12 9v4'/%3E%3Cpath d='M12 17h.01'/%3E%3C/svg%3E");
94
+ -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z'/%3E%3Cpath d='M12 9v4'/%3E%3Cpath d='M12 17h.01'/%3E%3C/svg%3E");
95
+ }
96
+
97
+ &.destructive::before,
98
+ &.danger::before,
99
+ &.error::before {
100
+ mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='m15 9-6 6'/%3E%3Cpath d='m9 9 6 6'/%3E%3C/svg%3E");
101
+ -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='m15 9-6 6'/%3E%3Cpath d='m9 9 6 6'/%3E%3C/svg%3E");
102
+ }
103
+
104
+ &.info::before {
105
+ mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 16v-4'/%3E%3Cpath d='M12 8h.01'/%3E%3C/svg%3E");
106
+ -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 16v-4'/%3E%3Cpath d='M12 8h.01'/%3E%3C/svg%3E");
107
+ }
108
+ }
109
+ }
110
+
111
+ @utility badge {
112
+ --feedback-color: var(--color-text);
113
+ --feedback-contrast: var(--color-text-contrast);
114
+ --feedback-surface: color-mix(in srgb, var(--feedback-color) 12%, var(--color-background));
115
+ --feedback-border: color-mix(in srgb, var(--feedback-color) 42%, var(--color-border));
116
+
117
+ @apply inline-flex min-h-6 w-fit items-center gap-1 rounded-full bg-(--feedback-surface) px-2.5 text-xs font-bold text-(--feedback-color);
118
+ border: var(--border-width) solid var(--feedback-border);
119
+
120
+ &.primary {
121
+ --feedback-color: var(--color-primary);
122
+ --feedback-contrast: var(--color-primary-contrast);
123
+ }
124
+
125
+ &.secondary {
126
+ --feedback-color: var(--color-accent);
127
+ --feedback-contrast: var(--color-accent-contrast);
128
+ }
129
+
130
+ &.success {
131
+ --feedback-color: var(--color-success);
132
+ --feedback-contrast: var(--color-success-contrast);
133
+ }
134
+
135
+ &.warning {
136
+ --feedback-color: var(--color-warning);
137
+ --feedback-contrast: var(--color-warning-contrast);
138
+ }
139
+
140
+ &.destructive,
141
+ &.danger,
142
+ &.error {
143
+ --feedback-color: var(--color-destructive);
144
+ --feedback-contrast: var(--color-destructive-contrast);
145
+ }
146
+
147
+ &.info {
148
+ --feedback-color: var(--color-info);
149
+ --feedback-contrast: var(--color-info-contrast);
150
+ }
151
+
152
+ &.flat {
153
+ @apply bg-(--feedback-color) text-(--feedback-contrast);
154
+ border-color: var(--feedback-color);
155
+ }
156
+
157
+ &.soft {
158
+ @apply border-transparent;
159
+ }
160
+ }
161
+
162
+ @utility skeleton {
163
+ @apply min-h-4 w-full rounded-(--radius-control);
164
+
165
+ animation: anim-skeleton calc(var(--motion-duration-slow) * 4) linear infinite;
166
+ background: linear-gradient(90deg, var(--color-surface), var(--color-foreground), var(--color-surface));
167
+ background-size: 200% 100%;
168
+ }
169
+
170
+ @utility progress {
171
+ --progress-color: var(--color-text);
172
+ --progress-surface: color-mix(in srgb, var(--color-text-subtle) 60%, transparent);
173
+
174
+ @apply h-2.5 w-full overflow-hidden rounded-full bg-(--progress-surface);
175
+
176
+ > * {
177
+ @apply block h-full transition-[width] duration-(--motion-duration-slow) ease-(--motion-ease);
178
+
179
+ background-color: var(--progress-color);
180
+ width: var(--progress-value, 0%);
181
+ }
182
+
183
+ &.primary {
184
+ --progress-color: var(--color-primary);
185
+ --progress-surface: color-mix(in srgb, var(--color-primary-subtle) 60%, transparent);
186
+ }
187
+
188
+ &.secondary {
189
+ --progress-color: var(--color-accent);
190
+ --progress-surface: color-mix(in srgb, var(--color-accent-subtle) 60%, transparent);
191
+ }
192
+
193
+ &.success {
194
+ --progress-color: var(--color-success);
195
+ --progress-surface: color-mix(in srgb, var(--color-success-subtle) 60%, transparent);
196
+ }
197
+
198
+ &.warning {
199
+ --progress-color: var(--color-warning);
200
+ --progress-surface: color-mix(in srgb, var(--color-warning-subtle) 60%, transparent);
201
+ }
202
+
203
+ &.destructive,
204
+ &.danger,
205
+ &.error {
206
+ --progress-color: var(--color-destructive);
207
+ --progress-surface: color-mix(in srgb, var(--color-destructive-subtle) 60%, transparent);
208
+ }
209
+
210
+ &.info {
211
+ --progress-color: var(--color-info);
212
+ --progress-surface: color-mix(in srgb, var(--color-info-subtle) 60%, transparent);
213
+ }
214
+ }
@@ -0,0 +1,303 @@
1
+ @import "tailwindcss";
2
+ @import "../theme.css";
3
+
4
+ @utility field {
5
+ @apply flex w-full flex-col gap-1.5;
6
+
7
+ .label {
8
+ @apply text-text text-sm font-semibold;
9
+ }
10
+
11
+ .hint {
12
+ @apply text-text-secondary text-[0.8125rem];
13
+ }
14
+
15
+ .error:not(.btn) {
16
+ @apply text-destructive text-[0.8125rem] font-medium;
17
+ }
18
+ }
19
+
20
+ @utility ipt {
21
+ --control-bg: transparent;
22
+ --control-border: var(--color-border);
23
+ --control-border-active: var(--color-primary);
24
+ --control-fg: var(--color-text);
25
+ --control-placeholder: var(--color-text-secondary);
26
+
27
+ @apply min-h-(--control-height,2.5rem) w-full rounded-(--radius-control) bg-(--control-bg) px-3 py-2 text-(--control-fg) transition-[border-color,box-shadow,color,opacity] duration-(--motion-duration-fast) ease-(--motion-ease);
28
+ border: var(--border-width) solid var(--control-border);
29
+
30
+ &::placeholder {
31
+ color: var(--control-placeholder);
32
+ }
33
+
34
+ &:focus {
35
+ @apply outline-none;
36
+ }
37
+
38
+ &:focus-visible {
39
+ border-color: var(--control-border-active);
40
+ box-shadow: 0 0 0 var(--focus-ring-width) var(--focus-ring);
41
+ }
42
+
43
+ &[aria-invalid="true"] {
44
+ --control-border: var(--color-destructive);
45
+ --control-border-active: var(--color-destructive);
46
+ }
47
+
48
+ &:disabled,
49
+ &[aria-disabled="true"],
50
+ &[data-disabled] {
51
+ @apply cursor-not-allowed;
52
+
53
+ opacity: 0.58;
54
+ }
55
+ }
56
+
57
+ @utility textarea {
58
+ --control-bg: transparent;
59
+ --control-border: var(--color-border);
60
+ --control-border-active: var(--color-primary);
61
+ --control-fg: var(--color-text);
62
+ --control-placeholder: var(--color-text-secondary);
63
+
64
+ @apply min-h-(--control-height,2.5rem) w-full rounded-(--radius-control) bg-(--control-bg) px-3 py-2 text-(--control-fg) transition-[border-color,box-shadow,color,opacity] duration-(--motion-duration-fast) ease-(--motion-ease);
65
+ border: var(--border-width) solid var(--control-border);
66
+
67
+ &::placeholder {
68
+ color: var(--control-placeholder);
69
+ }
70
+
71
+ &:focus {
72
+ @apply outline-none;
73
+ }
74
+
75
+ &:focus-visible {
76
+ border-color: var(--control-border-active);
77
+ box-shadow: 0 0 0 var(--focus-ring-width) var(--focus-ring);
78
+ }
79
+
80
+ &[aria-invalid="true"] {
81
+ --control-border: var(--color-destructive);
82
+ --control-border-active: var(--color-destructive);
83
+ }
84
+
85
+ &:disabled,
86
+ &[aria-disabled="true"],
87
+ &[data-disabled] {
88
+ @apply cursor-not-allowed;
89
+
90
+ opacity: 0.58;
91
+ }
92
+
93
+ @apply min-h-28 resize-y;
94
+ }
95
+
96
+ @utility select {
97
+ --control-bg: transparent;
98
+ --control-border: var(--color-border);
99
+ --control-border-active: var(--color-primary);
100
+ --control-fg: var(--color-text);
101
+ --control-placeholder: var(--color-text-secondary);
102
+
103
+ @apply min-h-(--control-height,2.5rem) w-full rounded-(--radius-control) bg-(--control-bg) px-3 py-2 text-(--control-fg) transition-[border-color,box-shadow,color,opacity] duration-(--motion-duration-fast) ease-(--motion-ease);
104
+ border: var(--border-width) solid var(--control-border);
105
+
106
+ &::placeholder {
107
+ color: var(--control-placeholder);
108
+ }
109
+
110
+ &:focus {
111
+ @apply outline-none;
112
+ }
113
+
114
+ &:focus-visible {
115
+ border-color: var(--control-border-active);
116
+ box-shadow: 0 0 0 var(--focus-ring-width) var(--focus-ring);
117
+ }
118
+
119
+ &[aria-invalid="true"] {
120
+ --control-border: var(--color-destructive);
121
+ --control-border-active: var(--color-destructive);
122
+ }
123
+
124
+ &:disabled,
125
+ &[aria-disabled="true"],
126
+ &[data-disabled] {
127
+ @apply cursor-not-allowed;
128
+
129
+ opacity: 0.58;
130
+ }
131
+
132
+ appearance: none;
133
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor' stroke-width='2'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19.5 8.25l-7.5 7.5-7.5-7.5'/%3E%3C/svg%3E");
134
+ background-position: right 0.75rem center;
135
+ background-repeat: no-repeat;
136
+ background-size: 1rem;
137
+ padding-right: 2.5rem;
138
+ }
139
+
140
+ @utility checkbox {
141
+ --control-color: var(--color-text);
142
+ --control-contrast: var(--color-text-contrast);
143
+
144
+ @apply inline-grid size-4 cursor-pointer appearance-none place-content-center rounded-sm bg-transparent transition-[background-color,border-color,box-shadow] duration-(--motion-duration-normal) ease-(--motion-ease);
145
+ border: var(--border-width) solid var(--color-border);
146
+
147
+ &:hover:not(:disabled, .disabled, [aria-disabled="true"], [data-disabled]) {
148
+ @apply border-(--color-border-hover);
149
+ }
150
+
151
+ &:focus {
152
+ @apply outline-none;
153
+ }
154
+
155
+ &:focus-visible {
156
+ border-color: var(--control-color);
157
+ box-shadow: 0 0 0 var(--focus-ring-width) var(--focus-ring);
158
+ }
159
+
160
+ &::after {
161
+ @apply block size-3 opacity-0 transition-opacity duration-(--motion-duration-normal) ease-(--motion-ease);
162
+
163
+ background-color: var(--control-contrast);
164
+ content: "";
165
+ mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
166
+ -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
167
+ mask-size: contain;
168
+ -webkit-mask-size: contain;
169
+ }
170
+
171
+ &:checked {
172
+ border-color: var(--control-color);
173
+ background-color: var(--control-color);
174
+
175
+ &::after {
176
+ @apply opacity-100;
177
+ }
178
+ }
179
+
180
+ &.primary {
181
+ --control-color: var(--color-primary);
182
+ --control-contrast: var(--color-primary-contrast);
183
+ }
184
+
185
+ &.secondary {
186
+ --control-color: var(--color-accent);
187
+ --control-contrast: var(--color-accent-contrast);
188
+ }
189
+
190
+ &.success {
191
+ --control-color: var(--color-success);
192
+ --control-contrast: var(--color-success-contrast);
193
+ }
194
+
195
+ &.warning {
196
+ --control-color: var(--color-warning);
197
+ --control-contrast: var(--color-warning-contrast);
198
+ }
199
+
200
+ &.destructive,
201
+ &.danger,
202
+ &.error {
203
+ --control-color: var(--color-destructive);
204
+ --control-contrast: var(--color-destructive-contrast);
205
+ }
206
+
207
+ &.info {
208
+ --control-color: var(--color-info);
209
+ --control-contrast: var(--color-info-contrast);
210
+ }
211
+
212
+ &[aria-invalid="true"] {
213
+ @apply border-(--color-destructive);
214
+ }
215
+
216
+ &:disabled,
217
+ &[aria-disabled="true"],
218
+ &[data-disabled] {
219
+ @apply cursor-not-allowed opacity-[0.58];
220
+ }
221
+ }
222
+
223
+ @utility switch {
224
+ --control-color: var(--color-text);
225
+ --control-contrast: var(--color-text-contrast);
226
+
227
+ @apply relative h-4.5 w-9 cursor-pointer appearance-none rounded-full bg-(--color-surface) transition-[background-color,border-color,box-shadow] duration-(--motion-duration-normal) ease-(--motion-ease);
228
+ border: var(--border-width) solid transparent;
229
+
230
+ &::after {
231
+ @apply absolute size-3.5 rounded-full bg-(--color-text-secondary) transition-[transform,translate,background-color] duration-(--motion-duration-normal) ease-(--motion-ease);
232
+
233
+ content: "";
234
+ top: 1px;
235
+ left: 1px;
236
+ }
237
+
238
+ &:hover:not(:disabled, .disabled, [aria-disabled="true"], [data-disabled]) {
239
+ @apply border-(--color-border-hover);
240
+ }
241
+
242
+ &:focus {
243
+ @apply outline-none;
244
+ }
245
+
246
+ &:focus-visible {
247
+ border-color: var(--control-color);
248
+ box-shadow: 0 0 0 var(--focus-ring-width) var(--focus-ring);
249
+ }
250
+
251
+ &:checked {
252
+ border-color: var(--control-color);
253
+ background-color: var(--control-color);
254
+
255
+ &::after {
256
+ @apply translate-x-4.5;
257
+
258
+ background-color: var(--control-contrast);
259
+ }
260
+ }
261
+
262
+ &.primary {
263
+ --control-color: var(--color-primary);
264
+ --control-contrast: var(--color-primary-contrast);
265
+ }
266
+
267
+ &.secondary {
268
+ --control-color: var(--color-accent);
269
+ --control-contrast: var(--color-accent-contrast);
270
+ }
271
+
272
+ &.success {
273
+ --control-color: var(--color-success);
274
+ --control-contrast: var(--color-success-contrast);
275
+ }
276
+
277
+ &.warning {
278
+ --control-color: var(--color-warning);
279
+ --control-contrast: var(--color-warning-contrast);
280
+ }
281
+
282
+ &.destructive,
283
+ &.danger,
284
+ &.error {
285
+ --control-color: var(--color-destructive);
286
+ --control-contrast: var(--color-destructive-contrast);
287
+ }
288
+
289
+ &.info {
290
+ --control-color: var(--color-info);
291
+ --control-contrast: var(--color-info-contrast);
292
+ }
293
+
294
+ &[aria-invalid="true"] {
295
+ @apply border-(--color-destructive);
296
+ }
297
+
298
+ &:disabled,
299
+ &[aria-disabled="true"],
300
+ &[data-disabled] {
301
+ @apply cursor-not-allowed opacity-[0.58];
302
+ }
303
+ }
@@ -0,0 +1,9 @@
1
+ @import "tailwindcss";
2
+ @import "../theme.css";
3
+ @import "../typography.css";
4
+ @import "./button.css";
5
+ @import "./feedback.css";
6
+ @import "./form.css";
7
+ @import "./loader.css";
8
+ @import "./surface.css";
9
+ @import "./tooltip.css";