zenkit-css 1.0.8 → 1.2.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.
@@ -0,0 +1,343 @@
1
+ // ========================================
2
+ // ZenKit - Password Input Component
3
+ // ========================================
4
+
5
+ @use '../abstracts/variables' as *;
6
+
7
+ // ----------------------------------------
8
+ // Password Input Container
9
+ // ----------------------------------------
10
+ .password-input {
11
+ position: relative;
12
+ display: flex;
13
+ align-items: center;
14
+ }
15
+
16
+ // ----------------------------------------
17
+ // Password Input Field
18
+ // ----------------------------------------
19
+ .password-input-field {
20
+ width: 100%;
21
+ padding: 0.625rem 2.75rem 0.625rem 0.875rem;
22
+ font-size: var(--text-sm);
23
+ font-family: inherit;
24
+ color: var(--text);
25
+ background-color: var(--bg);
26
+ border: 1px solid var(--border);
27
+ border-radius: $border-radius;
28
+ transition: border-color $transition-fast $transition-timing,
29
+ box-shadow $transition-fast $transition-timing;
30
+
31
+ &:focus {
32
+ outline: none;
33
+ border-color: var(--primary);
34
+ box-shadow: 0 0 0 3px rgba($primary, 0.15);
35
+ }
36
+
37
+ &::placeholder {
38
+ color: var(--text-muted);
39
+ }
40
+
41
+ &:disabled {
42
+ background-color: var(--bg-muted);
43
+ cursor: not-allowed;
44
+ opacity: 0.6;
45
+ }
46
+ }
47
+
48
+ // ----------------------------------------
49
+ // Password Toggle Button
50
+ // ----------------------------------------
51
+ .password-toggle {
52
+ position: absolute;
53
+ right: 0.5rem;
54
+ top: 50%;
55
+ transform: translateY(-50%);
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: center;
59
+ width: 2rem;
60
+ height: 2rem;
61
+ padding: 0;
62
+ color: var(--text-muted);
63
+ background: transparent;
64
+ border: none;
65
+ border-radius: $border-radius;
66
+ cursor: pointer;
67
+ transition: color $transition-fast $transition-timing,
68
+ background-color $transition-fast $transition-timing;
69
+
70
+ &:hover {
71
+ color: var(--text);
72
+ background-color: var(--gray-100);
73
+ }
74
+
75
+ &:focus {
76
+ outline: none;
77
+ color: var(--primary);
78
+ }
79
+
80
+ svg {
81
+ width: 1.125rem;
82
+ height: 1.125rem;
83
+ }
84
+ }
85
+
86
+ // Show/hide icons
87
+ .password-icon-show,
88
+ .password-icon-hide {
89
+ display: none;
90
+ }
91
+
92
+ .password-input-field[type="password"] ~ .password-toggle {
93
+ .password-icon-show {
94
+ display: block;
95
+ }
96
+ .password-icon-hide {
97
+ display: none;
98
+ }
99
+ }
100
+
101
+ .password-input-field[type="text"] ~ .password-toggle {
102
+ .password-icon-show {
103
+ display: none;
104
+ }
105
+ .password-icon-hide {
106
+ display: block;
107
+ }
108
+ }
109
+
110
+ // ----------------------------------------
111
+ // Password Input Sizes
112
+ // ----------------------------------------
113
+ .password-input-sm {
114
+ .password-input-field {
115
+ padding: 0.5rem 2.5rem 0.5rem 0.75rem;
116
+ font-size: var(--text-xs);
117
+ }
118
+
119
+ .password-toggle {
120
+ width: 1.75rem;
121
+ height: 1.75rem;
122
+
123
+ svg {
124
+ width: 1rem;
125
+ height: 1rem;
126
+ }
127
+ }
128
+ }
129
+
130
+ .password-input-lg {
131
+ .password-input-field {
132
+ padding: 0.75rem 3rem 0.75rem 1rem;
133
+ font-size: var(--text-base);
134
+ }
135
+
136
+ .password-toggle {
137
+ width: 2.25rem;
138
+ height: 2.25rem;
139
+ right: 0.625rem;
140
+
141
+ svg {
142
+ width: 1.25rem;
143
+ height: 1.25rem;
144
+ }
145
+ }
146
+ }
147
+
148
+ // ----------------------------------------
149
+ // Password Strength Indicator
150
+ // ----------------------------------------
151
+ .password-strength {
152
+ display: flex;
153
+ gap: 0.25rem;
154
+ margin-top: 0.5rem;
155
+ }
156
+
157
+ .password-strength-bar {
158
+ flex: 1;
159
+ height: 4px;
160
+ background-color: var(--gray-200);
161
+ border-radius: 2px;
162
+ transition: background-color $transition-fast $transition-timing;
163
+ }
164
+
165
+ // Strength levels
166
+ .password-strength-weak .password-strength-bar:nth-child(1) {
167
+ background-color: var(--danger);
168
+ }
169
+
170
+ .password-strength-fair .password-strength-bar:nth-child(-n+2) {
171
+ background-color: var(--warning);
172
+ }
173
+
174
+ .password-strength-good .password-strength-bar:nth-child(-n+3) {
175
+ background-color: var(--info);
176
+ }
177
+
178
+ .password-strength-strong .password-strength-bar {
179
+ background-color: var(--success);
180
+ }
181
+
182
+ // ----------------------------------------
183
+ // Password Strength Text
184
+ // ----------------------------------------
185
+ .password-strength-text {
186
+ font-size: var(--text-xs);
187
+ margin-top: 0.375rem;
188
+ }
189
+
190
+ .password-strength-weak .password-strength-text {
191
+ color: var(--danger);
192
+ }
193
+
194
+ .password-strength-fair .password-strength-text {
195
+ color: var(--warning-700);
196
+ }
197
+
198
+ .password-strength-good .password-strength-text {
199
+ color: var(--info);
200
+ }
201
+
202
+ .password-strength-strong .password-strength-text {
203
+ color: var(--success);
204
+ }
205
+
206
+ // ----------------------------------------
207
+ // Password Requirements
208
+ // ----------------------------------------
209
+ .password-requirements {
210
+ margin-top: 0.75rem;
211
+ font-size: var(--text-xs);
212
+ }
213
+
214
+ .password-requirement {
215
+ display: flex;
216
+ align-items: center;
217
+ gap: 0.375rem;
218
+ margin-bottom: 0.25rem;
219
+ color: var(--text-muted);
220
+
221
+ svg {
222
+ width: 0.875rem;
223
+ height: 0.875rem;
224
+ flex-shrink: 0;
225
+ }
226
+ }
227
+
228
+ .password-requirement-met {
229
+ color: var(--success);
230
+
231
+ svg {
232
+ color: var(--success);
233
+ }
234
+ }
235
+
236
+ .password-requirement-unmet {
237
+ color: var(--text-muted);
238
+
239
+ svg {
240
+ color: var(--gray-400);
241
+ }
242
+ }
243
+
244
+ // ----------------------------------------
245
+ // Password Input States
246
+ // ----------------------------------------
247
+ .password-input-error {
248
+ .password-input-field {
249
+ border-color: var(--danger);
250
+
251
+ &:focus {
252
+ border-color: var(--danger);
253
+ box-shadow: 0 0 0 3px rgba($danger, 0.15);
254
+ }
255
+ }
256
+ }
257
+
258
+ .password-input-success {
259
+ .password-input-field {
260
+ border-color: var(--success);
261
+
262
+ &:focus {
263
+ border-color: var(--success);
264
+ box-shadow: 0 0 0 3px rgba($success, 0.15);
265
+ }
266
+ }
267
+ }
268
+
269
+ // ----------------------------------------
270
+ // Password Input with Icon
271
+ // ----------------------------------------
272
+ .password-input-icon {
273
+ .password-input-field {
274
+ padding-left: 2.5rem;
275
+ }
276
+ }
277
+
278
+ .password-icon-left {
279
+ position: absolute;
280
+ left: 0.75rem;
281
+ top: 50%;
282
+ transform: translateY(-50%);
283
+ color: var(--text-muted);
284
+ pointer-events: none;
285
+
286
+ svg {
287
+ width: 1rem;
288
+ height: 1rem;
289
+ }
290
+ }
291
+
292
+ // ----------------------------------------
293
+ // Password Confirm
294
+ // ----------------------------------------
295
+ .password-confirm-wrapper {
296
+ display: flex;
297
+ flex-direction: column;
298
+ gap: 1rem;
299
+ }
300
+
301
+ .password-match-indicator {
302
+ display: flex;
303
+ align-items: center;
304
+ gap: 0.375rem;
305
+ font-size: var(--text-xs);
306
+ margin-top: 0.25rem;
307
+ }
308
+
309
+ .password-match {
310
+ color: var(--success);
311
+ }
312
+
313
+ .password-mismatch {
314
+ color: var(--danger);
315
+ }
316
+
317
+ // ----------------------------------------
318
+ // Dark Mode
319
+ // ----------------------------------------
320
+ [data-theme="dark"] {
321
+ .password-input-field {
322
+ background-color: var(--gray-900);
323
+ border-color: var(--gray-700);
324
+ color: var(--gray-100);
325
+
326
+ &:focus {
327
+ border-color: var(--primary);
328
+ }
329
+ }
330
+
331
+ .password-toggle {
332
+ color: var(--gray-500);
333
+
334
+ &:hover {
335
+ color: var(--gray-300);
336
+ background-color: var(--gray-800);
337
+ }
338
+ }
339
+
340
+ .password-strength-bar {
341
+ background-color: var(--gray-700);
342
+ }
343
+ }
@@ -0,0 +1,401 @@
1
+ // ========================================
2
+ // ZenKit - Toggle Component
3
+ // ========================================
4
+
5
+ @use '../abstracts/variables' as *;
6
+
7
+ // ----------------------------------------
8
+ // Toggle Base
9
+ // ----------------------------------------
10
+ .toggle {
11
+ display: inline-flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ padding: 0.5rem 0.75rem;
15
+ font-size: var(--text-sm);
16
+ font-weight: $font-weight-medium;
17
+ color: var(--text);
18
+ background-color: transparent;
19
+ border: 1px solid var(--border);
20
+ border-radius: $border-radius;
21
+ cursor: pointer;
22
+ user-select: none;
23
+ transition: all $transition-fast $transition-timing;
24
+ -webkit-tap-highlight-color: transparent;
25
+
26
+ &:hover {
27
+ background-color: var(--gray-100);
28
+ }
29
+
30
+ &:focus {
31
+ outline: none;
32
+ box-shadow: 0 0 0 2px var(--primary-200);
33
+ }
34
+
35
+ &:active {
36
+ transform: scale(0.98);
37
+ }
38
+ }
39
+
40
+ // ----------------------------------------
41
+ // Toggle Pressed State
42
+ // ----------------------------------------
43
+ .toggle-pressed,
44
+ .toggle[aria-pressed="true"],
45
+ .toggle.active {
46
+ background-color: var(--primary);
47
+ border-color: var(--primary);
48
+ color: var(--white);
49
+
50
+ &:hover {
51
+ background-color: var(--primary-600);
52
+ border-color: var(--primary-600);
53
+ }
54
+ }
55
+
56
+ // ----------------------------------------
57
+ // Toggle Disabled
58
+ // ----------------------------------------
59
+ .toggle:disabled,
60
+ .toggle-disabled {
61
+ opacity: 0.5;
62
+ cursor: not-allowed;
63
+ pointer-events: none;
64
+ }
65
+
66
+ // ----------------------------------------
67
+ // Toggle Sizes
68
+ // ----------------------------------------
69
+ .toggle-xs {
70
+ padding: 0.25rem 0.5rem;
71
+ font-size: var(--text-xs);
72
+ }
73
+
74
+ .toggle-sm {
75
+ padding: 0.375rem 0.625rem;
76
+ font-size: var(--text-xs);
77
+ }
78
+
79
+ .toggle-md {
80
+ padding: 0.5rem 0.75rem;
81
+ font-size: var(--text-sm);
82
+ }
83
+
84
+ .toggle-lg {
85
+ padding: 0.625rem 1rem;
86
+ font-size: var(--text-base);
87
+ }
88
+
89
+ // ----------------------------------------
90
+ // Toggle with Icon
91
+ // ----------------------------------------
92
+ .toggle-icon {
93
+ padding: 0.5rem;
94
+
95
+ svg {
96
+ width: 1.25rem;
97
+ height: 1.25rem;
98
+ }
99
+ }
100
+
101
+ .toggle-icon-sm {
102
+ padding: 0.375rem;
103
+
104
+ svg {
105
+ width: 1rem;
106
+ height: 1rem;
107
+ }
108
+ }
109
+
110
+ .toggle-icon-lg {
111
+ padding: 0.625rem;
112
+
113
+ svg {
114
+ width: 1.5rem;
115
+ height: 1.5rem;
116
+ }
117
+ }
118
+
119
+ // Icon with text
120
+ .toggle-icon-text {
121
+ gap: 0.375rem;
122
+
123
+ svg {
124
+ width: 1rem;
125
+ height: 1rem;
126
+ }
127
+ }
128
+
129
+ // ----------------------------------------
130
+ // Toggle Variants
131
+ // ----------------------------------------
132
+
133
+ // Outline (default)
134
+ .toggle-outline {
135
+ background-color: transparent;
136
+
137
+ &.toggle-pressed,
138
+ &[aria-pressed="true"] {
139
+ background-color: var(--primary);
140
+ color: var(--white);
141
+ }
142
+ }
143
+
144
+ // Ghost
145
+ .toggle-ghost {
146
+ border-color: transparent;
147
+
148
+ &:hover {
149
+ background-color: var(--gray-100);
150
+ }
151
+
152
+ &.toggle-pressed,
153
+ &[aria-pressed="true"] {
154
+ background-color: var(--primary-100);
155
+ color: var(--primary);
156
+ border-color: transparent;
157
+ }
158
+ }
159
+
160
+ // Soft
161
+ .toggle-soft {
162
+ background-color: var(--gray-100);
163
+ border-color: transparent;
164
+
165
+ &.toggle-pressed,
166
+ &[aria-pressed="true"] {
167
+ background-color: var(--primary-100);
168
+ color: var(--primary);
169
+ }
170
+ }
171
+
172
+ // ----------------------------------------
173
+ // Toggle Colors
174
+ // ----------------------------------------
175
+ .toggle-primary {
176
+ &.toggle-pressed,
177
+ &[aria-pressed="true"] {
178
+ background-color: var(--primary);
179
+ border-color: var(--primary);
180
+ color: var(--white);
181
+ }
182
+ }
183
+
184
+ .toggle-secondary {
185
+ &.toggle-pressed,
186
+ &[aria-pressed="true"] {
187
+ background-color: var(--gray-600);
188
+ border-color: var(--gray-600);
189
+ color: var(--white);
190
+ }
191
+ }
192
+
193
+ .toggle-success {
194
+ &.toggle-pressed,
195
+ &[aria-pressed="true"] {
196
+ background-color: var(--success);
197
+ border-color: var(--success);
198
+ color: var(--white);
199
+ }
200
+ }
201
+
202
+ .toggle-danger {
203
+ &.toggle-pressed,
204
+ &[aria-pressed="true"] {
205
+ background-color: var(--danger);
206
+ border-color: var(--danger);
207
+ color: var(--white);
208
+ }
209
+ }
210
+
211
+ .toggle-warning {
212
+ &.toggle-pressed,
213
+ &[aria-pressed="true"] {
214
+ background-color: var(--warning);
215
+ border-color: var(--warning);
216
+ color: var(--gray-900);
217
+ }
218
+ }
219
+
220
+ // ----------------------------------------
221
+ // Toggle Group
222
+ // ----------------------------------------
223
+ .toggle-group {
224
+ display: inline-flex;
225
+ border-radius: $border-radius;
226
+ }
227
+
228
+ .toggle-group .toggle {
229
+ border-radius: 0;
230
+
231
+ &:first-child {
232
+ border-top-left-radius: $border-radius;
233
+ border-bottom-left-radius: $border-radius;
234
+ }
235
+
236
+ &:last-child {
237
+ border-top-right-radius: $border-radius;
238
+ border-bottom-right-radius: $border-radius;
239
+ }
240
+
241
+ &:not(:first-child) {
242
+ margin-left: -1px;
243
+ }
244
+
245
+ &:hover,
246
+ &:focus,
247
+ &.toggle-pressed {
248
+ z-index: 1;
249
+ }
250
+ }
251
+
252
+ // ----------------------------------------
253
+ // Toggle Group Vertical
254
+ // ----------------------------------------
255
+ .toggle-group-vertical {
256
+ flex-direction: column;
257
+
258
+ .toggle {
259
+ &:first-child {
260
+ border-top-left-radius: $border-radius;
261
+ border-top-right-radius: $border-radius;
262
+ border-bottom-left-radius: 0;
263
+ }
264
+
265
+ &:last-child {
266
+ border-bottom-left-radius: $border-radius;
267
+ border-bottom-right-radius: $border-radius;
268
+ border-top-right-radius: 0;
269
+ }
270
+
271
+ &:not(:first-child) {
272
+ margin-left: 0;
273
+ margin-top: -1px;
274
+ }
275
+ }
276
+ }
277
+
278
+ // ----------------------------------------
279
+ // Toggle Group Spaced
280
+ // ----------------------------------------
281
+ .toggle-group-spaced {
282
+ gap: 0.375rem;
283
+
284
+ .toggle {
285
+ border-radius: $border-radius;
286
+ margin: 0;
287
+ }
288
+ }
289
+
290
+ // ----------------------------------------
291
+ // Toggle Group Single Select
292
+ // ----------------------------------------
293
+ .toggle-group-single {
294
+ .toggle.toggle-pressed:not(:hover):not(:focus) {
295
+ z-index: 1;
296
+ }
297
+ }
298
+
299
+ // ----------------------------------------
300
+ // Toggle Group Multiple Select
301
+ // ----------------------------------------
302
+ .toggle-group-multiple {
303
+ .toggle.toggle-pressed {
304
+ z-index: 1;
305
+ }
306
+ }
307
+
308
+ // ----------------------------------------
309
+ // Toggle Group Full Width
310
+ // ----------------------------------------
311
+ .toggle-group-full {
312
+ width: 100%;
313
+ display: flex;
314
+
315
+ .toggle {
316
+ flex: 1;
317
+ justify-content: center;
318
+ }
319
+ }
320
+
321
+ // ----------------------------------------
322
+ // Toggle Group Sizes
323
+ // ----------------------------------------
324
+ .toggle-group-sm .toggle {
325
+ padding: 0.375rem 0.625rem;
326
+ font-size: var(--text-xs);
327
+ }
328
+
329
+ .toggle-group-lg .toggle {
330
+ padding: 0.625rem 1rem;
331
+ font-size: var(--text-base);
332
+ }
333
+
334
+ // ----------------------------------------
335
+ // Toggle Group Variants
336
+ // ----------------------------------------
337
+ .toggle-group-outline {
338
+ .toggle {
339
+ background-color: transparent;
340
+ }
341
+ }
342
+
343
+ .toggle-group-soft {
344
+ padding: 0.25rem;
345
+ background-color: var(--gray-100);
346
+ border: none;
347
+ border-radius: $border-radius-lg;
348
+
349
+ .toggle {
350
+ border: none;
351
+ background-color: transparent;
352
+
353
+ &.toggle-pressed {
354
+ background-color: var(--bg);
355
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
356
+ }
357
+ }
358
+ }
359
+
360
+ // ----------------------------------------
361
+ // Dark Mode
362
+ // ----------------------------------------
363
+ [data-theme="dark"] {
364
+ .toggle {
365
+ border-color: var(--gray-600);
366
+ color: var(--gray-300);
367
+
368
+ &:hover {
369
+ background-color: var(--gray-800);
370
+ }
371
+ }
372
+
373
+ .toggle-ghost:hover {
374
+ background-color: var(--gray-800);
375
+ }
376
+
377
+ .toggle-ghost.toggle-pressed,
378
+ .toggle-ghost[aria-pressed="true"] {
379
+ background-color: rgba($primary, 0.2);
380
+ color: var(--primary-300);
381
+ }
382
+
383
+ .toggle-soft {
384
+ background-color: var(--gray-800);
385
+
386
+ &.toggle-pressed,
387
+ &[aria-pressed="true"] {
388
+ background-color: rgba($primary, 0.2);
389
+ color: var(--primary-300);
390
+ }
391
+ }
392
+
393
+ .toggle-group-soft {
394
+ background-color: var(--gray-800);
395
+
396
+ .toggle.toggle-pressed {
397
+ background-color: var(--gray-700);
398
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
399
+ }
400
+ }
401
+ }