astralkit 0.3.0 → 0.3.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.
@@ -1,2155 +1,2155 @@
1
-
2
-
3
- /* ============================================================================
4
- AstralKit — Form Primitives (forms.css)
5
- ============================================================================
6
-
7
- Extracted and deduplicated CSS from all 33 AstralKit form HTML components.
8
- All hardcoded values replaced with AstralKit design tokens.
9
-
10
- Covers:
11
- 1. Buttons (.ak-btn and variants)
12
- 2. Inputs (.ak-input and variants)
13
- 3. Labels & Helpers (.ak-label, .ak-helper, .ak-error-msg, .ak-success-msg)
14
- 4. Checkboxes & Radios (.ak-check, .ak-radio, .ak-card-radio)
15
- 5. Toggle Switches (.ak-switch and variants)
16
- 6. Toggle Groups (.ak-toggle-group and variants)
17
- 7. Textareas (.ak-textarea and variants)
18
- 8. Selects & Dropdowns (.ak-select, .ak-listbox, .ak-tag)
19
- 9. Search (.ak-search and variants)
20
- 10. Misc form elements (OTP, file upload, range, rating, quantity, password, strength)
21
- 11. Dividers & Social (.ak-divider, .ak-social-icon, .ak-link)
22
- 12. Spinner (.ak-spinner)
23
-
24
- Token namespaces:
25
- --color-ak-* Colors
26
- --spacing-ak-* Spacing (8px grid)
27
- --text-ak-* Font sizes
28
- --radius-ak-* Border radius
29
- --shadow-ak-* Box shadows
30
- --duration-ak-* Transition durations
31
- --ease-ak-* Easing functions
32
- --height-ak-control-* Control heights
33
- --size-ak-touch-min Minimum touch target
34
-
35
- ============================================================================ */
36
-
37
-
38
- /* ============================================================================
39
- 1. BUTTONS
40
- ============================================================================ */
41
-
42
- /* --- Base Button --- */
43
- .ak-btn {
44
- display: inline-flex;
45
- align-items: center;
46
- justify-content: center;
47
- gap: var(--spacing-ak-1);
48
- font-family: inherit;
49
- font-size: var(--text-ak-base);
50
- font-weight: 500;
51
- line-height: 1;
52
- min-height: var(--height-ak-control-md);
53
- padding: var(--spacing-ak-1_5) var(--spacing-ak-2_5);
54
- border-radius: var(--radius-ak-md);
55
- border: 1px solid transparent;
56
- cursor: pointer;
57
- flex-shrink: 0;
58
- transform: translateZ(0);
59
- will-change: background-color, color;
60
- backface-visibility: hidden;
61
- -webkit-backface-visibility: hidden;
62
- transition: background-color var(--duration-ak-base) var(--ease-ak-default),
63
- color var(--duration-ak-base) var(--ease-ak-default),
64
- border-color var(--duration-ak-base) var(--ease-ak-default);
65
- }
66
- .ak-btn:focus { outline: none; }
67
- .ak-btn:focus-visible {
68
- outline: 2px solid var(--color-ak-border-focus);
69
- outline-offset: 2px;
70
- }
71
- .ak-btn:active:not(:disabled) {
72
- transform: scale(0.97);
73
- }
74
- .ak-btn:disabled {
75
- cursor: not-allowed;
76
- }
77
- .ak-btn i { font-size: 1.375rem; }
78
-
79
- /* --- Button Variants --- */
80
- .ak-btn--primary {
81
- background: var(--ak-btn-bg, var(--color-ak-primary));
82
- color: var(--ak-btn-color, var(--color-ak-on-primary));
83
- }
84
- .ak-btn--primary:hover { background: var(--ak-btn-hover-bg, var(--color-ak-primary-hover)); }
85
-
86
- .ak-btn--outline {
87
- background: var(--color-ak-bg);
88
- border-color: var(--color-ak-border);
89
- color: var(--color-ak-text);
90
- }
91
- .ak-btn--outline:hover { background: var(--color-ak-hover); }
92
- .ak-btn--outline i { color: var(--color-ak-text-secondary); }
93
-
94
- .ak-btn--ghost {
95
- background: transparent;
96
- color: var(--color-ak-text);
97
- }
98
- .ak-btn--ghost:hover { background: var(--color-ak-hover); }
99
- .ak-btn--ghost i { color: var(--color-ak-text-secondary); }
100
-
101
- .ak-btn--success {
102
- background: var(--color-ak-success);
103
- color: var(--color-ak-on-primary);
104
- }
105
- .ak-btn--success:hover { background: var(--color-ak-success-text); }
106
-
107
- .ak-btn--danger {
108
- background: var(--color-ak-danger);
109
- color: var(--color-ak-on-primary);
110
- }
111
- .ak-btn--danger:hover { background: var(--color-ak-danger-text); }
112
-
113
- .ak-btn--disabled {
114
- background: var(--color-ak-surface-2);
115
- color: var(--color-ak-text-disabled);
116
- cursor: not-allowed;
117
- }
118
-
119
- .ak-btn--loading {
120
- background: var(--color-ak-primary);
121
- color: var(--color-ak-on-primary);
122
- opacity: 0.7;
123
- cursor: not-allowed;
124
- }
125
-
126
- /* --- Button Sizes --- */
127
- .ak-btn--xs {
128
- font-size: var(--text-ak-base);
129
- min-height: var(--height-ak-control-md);
130
- padding: var(--spacing-ak-1_5) var(--spacing-ak-2);
131
- border-radius: var(--radius-ak-lg);
132
- }
133
- .ak-btn--xs i { font-size: var(--text-ak-lg); }
134
-
135
- .ak-btn--sm {
136
- font-size: var(--text-ak-base);
137
- min-height: var(--height-ak-control-md);
138
- padding: var(--spacing-ak-1_5) var(--spacing-ak-2_5);
139
- border-radius: var(--radius-ak-lg);
140
- }
141
- .ak-btn--sm i { font-size: var(--text-ak-lg); }
142
-
143
- .ak-btn--lg {
144
- font-size: var(--text-ak-lg);
145
- min-height: var(--height-ak-control-lg);
146
- padding: var(--spacing-ak-2) var(--spacing-ak-4);
147
- gap: var(--spacing-ak-1_5);
148
- }
149
- .ak-btn--lg i { font-size: 1.5rem; }
150
-
151
- .ak-btn--xl {
152
- font-size: var(--text-ak-xl);
153
- font-weight: 600;
154
- min-height: var(--height-ak-control-xl);
155
- padding: var(--spacing-ak-2_5) var(--spacing-ak-5);
156
- border-radius: var(--radius-ak-2xl);
157
- gap: var(--spacing-ak-2);
158
- }
159
- .ak-btn--xl i { font-size: 1.875rem; }
160
-
161
- .ak-btn--full {
162
- width: 100%;
163
- }
164
- .ak-btn--full + .ak-btn--full {
165
- margin-top: var(--spacing-ak-2);
166
- }
167
-
168
- /* --- Icon-Only Button --- */
169
- .ak-btn--icon {
170
- padding: 0;
171
- min-width: var(--height-ak-control-md);
172
- min-height: var(--height-ak-control-md);
173
- width: var(--height-ak-control-md);
174
- height: var(--height-ak-control-md);
175
- }
176
- .ak-btn--icon-circle {
177
- padding: 0;
178
- min-width: var(--height-ak-control-md);
179
- min-height: var(--height-ak-control-md);
180
- width: var(--height-ak-control-md);
181
- height: var(--height-ak-control-md);
182
- border-radius: var(--radius-ak-full);
183
- }
184
-
185
- /* --- Favorite Button --- */
186
- .ak-btn--favorite {
187
- padding: 0;
188
- min-width: var(--height-ak-control-md);
189
- min-height: var(--height-ak-control-md);
190
- width: var(--height-ak-control-md);
191
- height: var(--height-ak-control-md);
192
- border-radius: var(--radius-ak-full);
193
- background: var(--color-ak-elevated);
194
- border-color: var(--color-ak-border);
195
- transition: background-color var(--duration-ak-base) var(--ease-ak-spring),
196
- transform var(--duration-ak-base) var(--ease-ak-spring),
197
- border-color var(--duration-ak-base) var(--ease-ak-default);
198
- -webkit-tap-highlight-color: transparent;
199
- }
200
- .ak-btn--favorite:hover {
201
- background: var(--color-ak-danger);
202
- border-color: var(--color-ak-danger);
203
- }
204
- .ak-btn--favorite:active { transform: scale(0.95); }
205
- .ak-btn--favorite:focus,
206
- .ak-btn--favorite:focus-visible {
207
- outline: none;
208
- box-shadow: none;
209
- }
210
- .ak-btn--favorite.is-active {
211
- background: var(--color-ak-danger);
212
- border-color: var(--color-ak-danger);
213
- box-shadow: 0 0 0 4px rgba(220, 38, 38, 0.1);
214
- }
215
-
216
- /* --- Heart Icon --- */
217
- .ak-heart {
218
- width: 1.25rem;
219
- height: 1.25rem;
220
- color: var(--color-ak-text-secondary);
221
- transition: transform var(--duration-ak-base) var(--ease-ak-spring),
222
- color var(--duration-ak-base) var(--ease-ak-default);
223
- }
224
- .ak-btn--favorite:hover .ak-heart { color: #ffffff; }
225
- .ak-btn--favorite.is-active .ak-heart { color: #ffffff; }
226
-
227
- /* --- Button Group --- */
228
- .ak-btn-group {
229
- display: inline-flex;
230
- border: 1px solid var(--color-ak-border);
231
- border-radius: var(--radius-ak-md);
232
- overflow: hidden;
233
- align-self: flex-start;
234
- }
235
- .ak-btn-group--pill {
236
- border-radius: var(--radius-ak-full);
237
- }
238
- .ak-btn-group--relative {
239
- position: relative;
240
- overflow: visible;
241
- }
242
- .ak-btn-group__row {
243
- display: flex;
244
- gap: var(--spacing-ak-2);
245
- }
246
-
247
- /* --- Group Button (text button inside group) --- */
248
- .ak-group-btn {
249
- display: flex;
250
- align-items: center;
251
- gap: var(--spacing-ak-1_5);
252
- padding: var(--spacing-ak-1_5) var(--spacing-ak-4);
253
- font-family: inherit;
254
- font-size: var(--text-ak-base);
255
- font-weight: 600;
256
- line-height: 1;
257
- min-height: var(--height-ak-control-md);
258
- background: transparent;
259
- border: none;
260
- border-right: 1px solid var(--color-ak-border);
261
- cursor: pointer;
262
- transition: background-color 0.15s ease;
263
- }
264
- .ak-group-btn:last-child { border-right: none; }
265
- .ak-group-btn:hover { background: var(--color-ak-hover); }
266
- .ak-group-btn:focus { outline: none; }
267
- .ak-group-btn:focus-visible {
268
- outline: 2px solid var(--color-ak-border-focus);
269
- outline-offset: -2px;
270
- }
271
- .ak-group-btn i { font-size: 1.25rem; }
272
-
273
- .ak-group-btn.is-active {
274
- background: var(--color-ak-primary);
275
- color: var(--color-ak-on-primary);
276
- }
277
- .ak-group-btn.is-active:hover {
278
- background: var(--color-ak-primary-hover);
279
- }
280
-
281
- /* --- Group Icon Button (48x48) --- */
282
- .ak-group-icon {
283
- display: flex;
284
- align-items: center;
285
- justify-content: center;
286
- width: var(--height-ak-control-md);
287
- height: var(--height-ak-control-md);
288
- background: transparent;
289
- border: none;
290
- border-right: 1px solid var(--color-ak-border);
291
- cursor: pointer;
292
- font-family: inherit;
293
- color: var(--color-ak-text);
294
- transition: background-color 0.15s ease;
295
- }
296
- .ak-group-icon:last-child,
297
- .ak-group-icon:last-of-type { border-right: none; }
298
- .ak-group-icon:hover { background: var(--color-ak-hover); }
299
- .ak-group-icon:focus { outline: none; }
300
- .ak-group-icon:focus-visible {
301
- outline: 2px solid var(--color-ak-border-focus);
302
- outline-offset: -2px;
303
- }
304
- .ak-group-icon i { font-size: 1.25rem; }
305
-
306
- .ak-group-icon.is-active {
307
- background: var(--color-ak-primary);
308
- color: var(--color-ak-on-primary);
309
- }
310
- .ak-group-icon.is-active:hover {
311
- background: var(--color-ak-primary-hover);
312
- }
313
-
314
- /* --- Group Stat (non-interactive count) --- */
315
- .ak-group-stat {
316
- display: flex;
317
- align-items: center;
318
- padding: var(--spacing-ak-1_5) var(--spacing-ak-3);
319
- font-size: var(--text-ak-base);
320
- font-weight: 600;
321
- min-height: var(--height-ak-control-md);
322
- background: var(--color-ak-surface);
323
- }
324
-
325
- /* --- Group Link --- */
326
- .ak-group-link {
327
- display: flex;
328
- align-items: center;
329
- justify-content: center;
330
- width: var(--height-ak-control-md);
331
- min-height: var(--height-ak-control-md);
332
- border-left: 1px solid var(--color-ak-border);
333
- color: var(--color-ak-text);
334
- text-decoration: none;
335
- transition: background-color 0.15s ease;
336
- }
337
- .ak-group-link:hover { background: var(--color-ak-hover); }
338
- .ak-group-link i { font-size: 1.25rem; }
339
-
340
- /* --- Submit Button (login/signup forms) --- */
341
- .ak-submit-btn {
342
- display: flex;
343
- align-items: center;
344
- justify-content: center;
345
- gap: var(--spacing-ak-1);
346
- width: 100%;
347
- min-height: var(--height-ak-control-md);
348
- font-family: inherit;
349
- font-size: var(--text-ak-base);
350
- font-weight: 600;
351
- background: var(--ak-submit-bg, var(--color-ak-primary));
352
- color: var(--ak-submit-color, var(--color-ak-on-primary));
353
- border: none;
354
- border-radius: var(--radius-ak-input);
355
- cursor: pointer;
356
- transition: background-color var(--duration-ak-base) ease;
357
- }
358
- .ak-submit-btn:hover {
359
- background: var(--ak-submit-hover-bg, var(--color-ak-primary-hover));
360
- }
361
- .ak-submit-btn:active:not(:disabled) {
362
- transform: scale(0.98);
363
- }
364
- .ak-submit-btn:disabled {
365
- opacity: 0.6;
366
- cursor: not-allowed;
367
- }
368
-
369
- /* --- Social Login Button --- */
370
- .ak-social-btn {
371
- display: flex;
372
- align-items: center;
373
- justify-content: center;
374
- gap: var(--spacing-ak-1_5);
375
- width: 100%;
376
- min-height: var(--height-ak-control-md);
377
- font-family: inherit;
378
- font-size: var(--text-ak-base);
379
- font-weight: 500;
380
- background: var(--color-ak-bg);
381
- color: var(--color-ak-text);
382
- border: 2px solid var(--color-ak-border-strong);
383
- border-radius: var(--radius-ak-input);
384
- cursor: pointer;
385
- transition: background-color var(--duration-ak-base) ease,
386
- border-color var(--duration-ak-base) ease;
387
- }
388
- .ak-social-btn:hover {
389
- background: var(--color-ak-hover);
390
- }
391
- .ak-social-btn:active {
392
- transform: scale(0.98);
393
- }
394
-
395
- /* --- Button Pill (signup form) --- */
396
- .ak-btn-primary {
397
- display: flex;
398
- align-items: center;
399
- justify-content: center;
400
- gap: var(--spacing-ak-1);
401
- width: 100%;
402
- min-height: var(--height-ak-control-md);
403
- font-family: inherit;
404
- font-size: var(--text-ak-base);
405
- font-weight: 600;
406
- background: var(--color-ak-primary);
407
- color: var(--color-ak-on-primary);
408
- border: none;
409
- border-radius: var(--radius-ak-input);
410
- cursor: pointer;
411
- transition: background-color var(--duration-ak-base) ease;
412
- }
413
- .ak-btn-primary:hover { background: var(--color-ak-primary-hover); }
414
-
415
- .ak-btn-outline {
416
- display: flex;
417
- align-items: center;
418
- justify-content: center;
419
- gap: var(--spacing-ak-1_5);
420
- width: 100%;
421
- min-height: var(--height-ak-control-md);
422
- font-family: inherit;
423
- font-size: var(--text-ak-base);
424
- font-weight: 500;
425
- background: var(--color-ak-bg);
426
- color: var(--color-ak-text);
427
- border: 2px solid var(--color-ak-border-strong);
428
- border-radius: var(--radius-ak-input);
429
- cursor: pointer;
430
- transition: background-color var(--duration-ak-base) ease;
431
- }
432
- .ak-btn-outline:hover { background: var(--color-ak-hover); }
433
-
434
-
435
- /* ============================================================================
436
- 2. INPUTS
437
- ============================================================================ */
438
-
439
- .ak-input {
440
- width: 100%;
441
- min-height: var(--ak-input-height, var(--height-ak-control-md));
442
- font-family: inherit;
443
- font-size: var(--text-ak-base);
444
- color: var(--color-ak-text);
445
- background: var(--ak-input-bg, var(--color-ak-bg));
446
- border: 2px solid var(--ak-input-border, var(--color-ak-border-strong));
447
- border-radius: var(--radius-ak-input);
448
- padding: 0 var(--spacing-ak-2);
449
- outline: none;
450
- transition: border-color var(--duration-ak-base);
451
- }
452
- .ak-input::placeholder {
453
- color: var(--color-ak-text-muted);
454
- }
455
- .ak-input:hover {
456
- border-color: var(--color-ak-border-focus);
457
- }
458
- .ak-input:focus {
459
- border-color: var(--color-ak-border-focus);
460
- }
461
- .ak-input:disabled {
462
- opacity: 0.5;
463
- cursor: not-allowed;
464
- }
465
-
466
- /* Readonly */
467
- .ak-input-readonly {
468
- background: var(--color-ak-surface-2);
469
- cursor: default;
470
- }
471
-
472
- /* Error */
473
- .ak-input-error {
474
- border-color: var(--color-ak-danger) !important;
475
- }
476
- .ak-input-error:focus {
477
- border-color: var(--color-ak-danger);
478
- }
479
- .ak-input-error:focus-visible {
480
- box-shadow: 0 0 0 5px rgba(220, 38, 38, 0.08), 0 0 0 1px rgba(220, 38, 38, 0.2);
481
- }
482
-
483
- /* Success */
484
- .ak-input-success {
485
- border-color: var(--color-ak-success);
486
- }
487
- .ak-input-success:focus {
488
- border-color: var(--color-ak-success);
489
- }
490
-
491
- /* Valid state (contact/newsletter) */
492
- .ak-input-valid {
493
- border-color: var(--color-ak-success) !important;
494
- }
495
- .ak-input-valid:focus-visible {
496
- box-shadow: 0 0 0 5px rgba(22, 163, 74, 0.08), 0 0 0 1px rgba(22, 163, 74, 0.2);
497
- }
498
-
499
- /* Size variants */
500
- .ak-input-sm {
501
- min-height: var(--height-ak-control-sm);
502
- font-size: var(--text-ak-sm);
503
- padding: 0 14px;
504
- }
505
- .ak-input-lg {
506
- min-height: var(--height-ak-control-lg);
507
- font-size: var(--text-ak-lg);
508
- padding: 0 18px;
509
- }
510
-
511
- /* Input group (prefix/suffix) */
512
- .ak-input-group {
513
- display: flex;
514
- align-items: stretch;
515
- }
516
- .ak-input-prefix {
517
- display: flex;
518
- align-items: center;
519
- font-family: inherit;
520
- font-size: var(--text-ak-base);
521
- color: var(--color-ak-text-secondary);
522
- background: var(--color-ak-surface-2);
523
- border: 2px solid var(--color-ak-border-strong);
524
- border-right: none;
525
- border-radius: var(--radius-ak-input) 0 0 var(--radius-ak-input);
526
- padding: 0 var(--spacing-ak-1_5);
527
- white-space: nowrap;
528
- }
529
- .ak-input-suffix {
530
- display: flex;
531
- align-items: center;
532
- font-family: inherit;
533
- font-size: var(--text-ak-base);
534
- color: var(--color-ak-text-secondary);
535
- background: var(--color-ak-surface-2);
536
- border: 2px solid var(--color-ak-border-strong);
537
- border-left: none;
538
- border-radius: 0 var(--radius-ak-input) var(--radius-ak-input) 0;
539
- padding: 0 var(--spacing-ak-1_5);
540
- white-space: nowrap;
541
- }
542
- .ak-input-group .ak-input-has-prefix {
543
- border-radius: 0 var(--radius-ak-input) var(--radius-ak-input) 0;
544
- }
545
- .ak-input-group .ak-input-has-suffix {
546
- border-radius: var(--radius-ak-input) 0 0 var(--radius-ak-input);
547
- }
548
- .ak-input-group .ak-input-prefix.ak-focused {
549
- border-color: var(--color-ak-border-focus);
550
- }
551
- .ak-input-group .ak-input-suffix.ak-focused {
552
- border-color: var(--color-ak-border-focus);
553
- }
554
-
555
- /* Icon input wrapper */
556
- .ak-input-icon-wrap {
557
- position: relative;
558
- }
559
- .ak-input-icon-wrap .ak-input-has-icon-left {
560
- padding-left: 44px;
561
- }
562
- .ak-input-icon-wrap .ak-input-has-icon-right {
563
- padding-right: 44px;
564
- }
565
- .ak-input-icon-left {
566
- position: absolute;
567
- left: 14px;
568
- top: 50%;
569
- transform: translateY(-50%);
570
- font-size: 20px;
571
- color: var(--color-ak-text-muted);
572
- pointer-events: none;
573
- }
574
- .ak-input-icon-right {
575
- position: absolute;
576
- right: 14px;
577
- top: 50%;
578
- transform: translateY(-50%);
579
- font-size: 20px;
580
- color: var(--color-ak-text-muted);
581
- pointer-events: none;
582
- }
583
-
584
- /* Focus glow — use on inputs/textareas for the soft glow effect.
585
- The canonical ak-focus-ring lives in focus.css (outline-based). */
586
- .ak-focus-glow:focus-visible {
587
- outline: none;
588
- box-shadow: var(--shadow-ak-focus, 0 0 0 3px rgba(0, 0, 0, 0.08));
589
- }
590
- .ak-focus-glow-light:focus-visible {
591
- outline: none;
592
- box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.15);
593
- }
594
-
595
- /* Input transition utility */
596
- .ak-input-transition {
597
- transition: box-shadow 0.25s var(--ease-ak-spring), border-color var(--duration-ak-base) ease;
598
- }
599
-
600
-
601
- /* ============================================================================
602
- 3. LABELS & HELPERS
603
- ============================================================================ */
604
-
605
- .ak-label {
606
- display: block;
607
- font-size: var(--text-ak-sm);
608
- font-weight: 600;
609
- color: var(--color-ak-text);
610
- margin-bottom: var(--spacing-ak-0_5);
611
- }
612
- .ak-label-required::after {
613
- content: ' *';
614
- color: var(--color-ak-danger);
615
- }
616
-
617
- .ak-helper {
618
- font-size: var(--text-ak-sm);
619
- color: var(--color-ak-text-muted);
620
- margin-top: var(--spacing-ak-0_5);
621
- }
622
-
623
- .ak-error-msg {
624
- font-size: var(--text-ak-sm);
625
- color: var(--color-ak-danger-text);
626
- margin-top: var(--spacing-ak-0_5);
627
- display: flex;
628
- align-items: center;
629
- gap: 4px;
630
- opacity: 0;
631
- transform: translateY(-4px);
632
- transition: opacity var(--duration-ak-base) ease, transform var(--duration-ak-base) ease;
633
- }
634
- .ak-error-msg.visible {
635
- opacity: 1;
636
- transform: translateY(0);
637
- }
638
- .ak-error-msg-icon {
639
- font-size: 16px;
640
- flex-shrink: 0;
641
- }
642
-
643
- .ak-success-msg {
644
- font-size: var(--text-ak-sm);
645
- color: var(--color-ak-success-text);
646
- margin-top: var(--spacing-ak-0_5);
647
- display: flex;
648
- align-items: center;
649
- gap: 4px;
650
- }
651
- .ak-success-msg-icon {
652
- font-size: 16px;
653
- flex-shrink: 0;
654
- }
655
-
656
-
657
- /* ============================================================================
658
- 4. CHECKBOXES & RADIOS
659
- ============================================================================ */
660
-
661
- /* --- Checkbox ---
662
- 24x24 minimum to meet WCAG 2.5.8 AA target size. */
663
- .ak-check {
664
- appearance: none;
665
- width: 24px;
666
- height: 24px;
667
- border: 2px solid var(--ak-check-border, var(--color-ak-border-strong));
668
- border-radius: 6px;
669
- cursor: pointer;
670
- position: relative;
671
- transition: all var(--duration-ak-base) var(--ease-ak-spring);
672
- flex-shrink: 0;
673
- }
674
- .ak-check:hover {
675
- border-color: var(--color-ak-primary);
676
- }
677
- .ak-check:checked {
678
- background: var(--ak-check-checked-bg, var(--color-ak-primary));
679
- border-color: var(--color-ak-primary);
680
- }
681
- .ak-check:checked::after {
682
- /* Checkmark offsets re-centered for the larger box (was left:6 top:2 in 22px). */
683
- content: '';
684
- position: absolute;
685
- left: 7px;
686
- top: 3px;
687
- width: 6px;
688
- height: 11px;
689
- border: solid var(--color-ak-on-primary);
690
- border-width: 0 2.5px 2.5px 0;
691
- transform: rotate(45deg);
692
- }
693
- .ak-check:focus-visible {
694
- outline: none;
695
- box-shadow: var(--shadow-ak-focus, 0 0 0 3px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.15));
696
- }
697
- .ak-check:disabled {
698
- cursor: not-allowed;
699
- opacity: 0.5;
700
- }
701
-
702
- /* --- Radio ---
703
- 24x24 minimum to meet WCAG 2.5.8 AA target size.
704
- Inner dot auto-centers via translate(-50%,-50%). */
705
- .ak-radio {
706
- appearance: none;
707
- width: 24px;
708
- height: 24px;
709
- border: 2px solid var(--ak-radio-border, var(--color-ak-border-strong));
710
- border-radius: 50%;
711
- cursor: pointer;
712
- position: relative;
713
- transition: all var(--duration-ak-base) var(--ease-ak-spring);
714
- flex-shrink: 0;
715
- background: var(--color-ak-bg);
716
- }
717
- .ak-radio:hover {
718
- border-color: var(--color-ak-primary);
719
- }
720
- .ak-radio:checked {
721
- border-color: var(--color-ak-primary);
722
- background: var(--color-ak-primary);
723
- }
724
- .ak-radio:checked::after {
725
- content: '';
726
- position: absolute;
727
- top: 50%;
728
- left: 50%;
729
- transform: translate(-50%, -50%);
730
- width: 8px;
731
- height: 8px;
732
- border-radius: 50%;
733
- background: var(--color-ak-on-primary);
734
- }
735
- .ak-radio:focus-visible {
736
- outline: none;
737
- box-shadow: var(--shadow-ak-focus, 0 0 0 3px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.15));
738
- }
739
-
740
- /* --- Card Radio --- */
741
- .ak-card-radio {
742
- position: relative;
743
- }
744
- .ak-card-radio:has(:checked) {
745
- border-left: 4px solid var(--color-ak-primary);
746
- padding-left: calc(var(--spacing-ak-3) - 3px);
747
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.04);
748
- background: rgba(0, 0, 0, 0.005);
749
- }
750
-
751
-
752
- /* ============================================================================
753
- 5. TOGGLE SWITCHES
754
- ============================================================================ */
755
-
756
- .ak-switch {
757
- display: inline-flex;
758
- align-items: center;
759
- justify-content: center;
760
- background: none;
761
- border: none;
762
- padding: 8px 0;
763
- cursor: pointer;
764
- border-radius: var(--radius-ak-full);
765
- flex-shrink: 0;
766
- min-height: var(--size-ak-touch-min);
767
- }
768
- .ak-switch:focus-visible { outline: none; }
769
- .ak-switch:focus-visible .ak-switch-track {
770
- outline: 2px solid var(--color-ak-border-focus);
771
- outline-offset: 2px;
772
- }
773
- .ak-switch:disabled {
774
- opacity: 0.5;
775
- cursor: not-allowed;
776
- }
777
-
778
- /* Track (pill) */
779
- .ak-switch-track {
780
- position: relative;
781
- width: 52px;
782
- height: 28px;
783
- background: var(--ak-switch-off, #7b8394);
784
- border-radius: var(--radius-ak-full);
785
- transition: background-color var(--duration-ak-base);
786
- }
787
- .ak-switch[aria-checked="true"] .ak-switch-track {
788
- background: var(--ak-switch-on, var(--color-ak-primary));
789
- }
790
-
791
- /* Knob */
792
- .ak-switch-knob {
793
- position: absolute;
794
- top: 3px;
795
- left: 3px;
796
- width: 22px;
797
- height: 22px;
798
- background: #ffffff;
799
- border-radius: 50%;
800
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
801
- transition: transform var(--duration-ak-base);
802
- }
803
- .ak-switch[aria-checked="true"] .ak-switch-knob {
804
- transform: translateX(24px);
805
- }
806
-
807
- /* Color-coded track variants */
808
- .ak-switch-success[aria-checked="true"] .ak-switch-track {
809
- background: var(--color-ak-success);
810
- }
811
- .ak-switch-danger[aria-checked="true"] .ak-switch-track {
812
- background: var(--color-ak-danger);
813
- }
814
-
815
- /* Size: Small */
816
- .ak-switch-sm .ak-switch-track {
817
- width: 40px;
818
- height: 22px;
819
- }
820
- .ak-switch-sm .ak-switch-knob {
821
- width: 16px;
822
- height: 16px;
823
- }
824
- .ak-switch-sm[aria-checked="true"] .ak-switch-knob {
825
- transform: translateX(18px);
826
- }
827
-
828
- /* Size: Large */
829
- .ak-switch-lg .ak-switch-track {
830
- width: 64px;
831
- height: 34px;
832
- }
833
- .ak-switch-lg .ak-switch-knob {
834
- width: 28px;
835
- height: 28px;
836
- }
837
- .ak-switch-lg[aria-checked="true"] .ak-switch-knob {
838
- transform: translateX(30px);
839
- }
840
-
841
- /* Track icons */
842
- .ak-switch-track-icon {
843
- position: absolute;
844
- top: 50%;
845
- transform: translateY(-50%);
846
- font-size: 14px;
847
- line-height: 1;
848
- color: rgba(255, 255, 255, 0.5);
849
- pointer-events: none;
850
- }
851
- .ak-switch-with-icons .ak-switch-track-icon { right: 8px; }
852
- .ak-switch-with-icons[aria-checked="true"] .ak-switch-track-icon { left: 8px; right: auto; }
853
-
854
- /* Knob icon */
855
- .ak-switch-knob-icon {
856
- position: absolute;
857
- top: 50%;
858
- left: 50%;
859
- transform: translate(-50%, -50%);
860
- font-size: 12px;
861
- color: var(--color-ak-text-muted);
862
- pointer-events: none;
863
- }
864
-
865
- /* With icons track/knob overrides */
866
- .ak-switch-with-icons .ak-switch-track { width: 56px; height: 30px; }
867
- .ak-switch-with-icons .ak-switch-knob { width: 24px; height: 24px; }
868
- .ak-switch-with-icons[aria-checked="true"] .ak-switch-knob { transform: translateX(26px); }
869
-
870
- /* Field layout */
871
- .ak-switch-field {
872
- display: flex;
873
- align-items: center;
874
- justify-content: space-between;
875
- gap: var(--spacing-ak-1_5);
876
- min-height: var(--size-ak-touch-min);
877
- }
878
- .ak-switch-field-reversed {
879
- flex-direction: row-reverse;
880
- justify-content: flex-end;
881
- }
882
-
883
- .ak-switch-label-wrap {
884
- display: flex;
885
- flex-direction: column;
886
- gap: 2px;
887
- cursor: pointer;
888
- }
889
- .ak-switch-field:has(.ak-switch:disabled) .ak-switch-label-wrap {
890
- cursor: default;
891
- }
892
-
893
- .ak-switch-label {
894
- font-size: var(--text-ak-base);
895
- font-weight: 500;
896
- color: var(--color-ak-text);
897
- display: flex;
898
- align-items: center;
899
- gap: var(--spacing-ak-1);
900
- }
901
- .ak-switch-helper {
902
- font-size: var(--text-ak-sm);
903
- color: var(--color-ak-text-muted);
904
- }
905
- .ak-switch-label-icon {
906
- font-size: 20px;
907
- color: var(--color-ak-text-muted);
908
- line-height: 1;
909
- flex-shrink: 0;
910
- }
911
- .ak-switch-status {
912
- font-size: var(--text-ak-sm);
913
- color: var(--color-ak-text-muted);
914
- }
915
-
916
- /* Switch group */
917
- .ak-switch-group {
918
- display: flex;
919
- flex-direction: column;
920
- gap: 0;
921
- }
922
- .ak-switch-group-legend {
923
- font-size: var(--text-ak-base);
924
- font-weight: 600;
925
- color: var(--color-ak-text);
926
- margin-bottom: var(--spacing-ak-1);
927
- }
928
-
929
-
930
- /* ============================================================================
931
- 6. TOGGLE GROUPS
932
- ============================================================================ */
933
-
934
- .ak-toggle-group {
935
- display: inline-flex;
936
- background: var(--ak-toggle-group-bg, var(--color-ak-surface-2));
937
- border-radius: var(--radius-ak-input);
938
- padding: 4px;
939
- gap: 4px;
940
- }
941
-
942
- .ak-toggle-group-item {
943
- display: inline-flex;
944
- align-items: center;
945
- justify-content: center;
946
- gap: 6px;
947
- background: none;
948
- border: none;
949
- padding: 0 var(--spacing-ak-2);
950
- min-height: var(--size-ak-touch-min);
951
- font-family: inherit;
952
- font-size: var(--text-ak-base);
953
- font-weight: 500;
954
- color: var(--color-ak-text-secondary);
955
- border-radius: 8px;
956
- cursor: pointer;
957
- transition: background-color var(--duration-ak-base), color var(--duration-ak-base), box-shadow var(--duration-ak-base);
958
- white-space: nowrap;
959
- line-height: 1;
960
- }
961
-
962
- /* Active state */
963
- .ak-toggle-group-item[aria-checked="true"],
964
- .ak-toggle-group-item[aria-pressed="true"] {
965
- background: var(--color-ak-bg);
966
- color: var(--color-ak-text);
967
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
968
- }
969
-
970
- /* Hover (inactive only) */
971
- .ak-toggle-group-item[aria-checked="false"]:not(:disabled):hover,
972
- .ak-toggle-group-item[aria-pressed="false"]:not(:disabled):hover {
973
- color: var(--color-ak-text);
974
- background: var(--color-ak-hover);
975
- }
976
-
977
- .ak-toggle-group-item:focus { outline: none; }
978
- .ak-toggle-group-item:focus-visible {
979
- outline: 2px solid var(--color-ak-border-focus);
980
- outline-offset: 2px;
981
- }
982
-
983
- .ak-toggle-group-item:disabled {
984
- opacity: 0.4;
985
- cursor: not-allowed;
986
- }
987
-
988
- .ak-toggle-group[aria-disabled="true"] { opacity: 0.5; }
989
- .ak-toggle-group[aria-disabled="true"] .ak-toggle-group-item { cursor: not-allowed; }
990
-
991
- .ak-toggle-group-item i { font-size: 20px; line-height: 1; }
992
- .ak-toggle-group-item-icon { padding: 0 14px; }
993
-
994
- /* Size: Small */
995
- .ak-toggle-group-sm { padding: 3px; gap: 3px; border-radius: 8px; }
996
- .ak-toggle-group-sm .ak-toggle-group-item { min-height: var(--size-ak-touch-min); padding: 0 12px; font-size: var(--text-ak-sm); border-radius: 6px; }
997
- .ak-toggle-group-sm .ak-toggle-group-item i { font-size: 18px; }
998
- .ak-toggle-group-sm .ak-toggle-group-item-icon { padding: 0 12px; }
999
-
1000
- /* Size: Large */
1001
- .ak-toggle-group-lg { padding: 5px; gap: 5px; border-radius: var(--radius-ak-lg); }
1002
- .ak-toggle-group-lg .ak-toggle-group-item { min-height: 52px; padding: 0 24px; font-size: var(--text-ak-lg); border-radius: var(--radius-ak-input); }
1003
- .ak-toggle-group-lg .ak-toggle-group-item i { font-size: 24px; }
1004
- .ak-toggle-group-lg .ak-toggle-group-item-icon { padding: 0 18px; }
1005
-
1006
- /* Outline variant */
1007
- .ak-toggle-group-outline { background: none; padding: 0; gap: 0; border: 2px solid var(--color-ak-border); border-radius: var(--radius-ak-input); overflow: hidden; }
1008
- .ak-toggle-group-outline .ak-toggle-group-item { border-radius: 0; border-right: 1px solid var(--color-ak-border); }
1009
- .ak-toggle-group-outline .ak-toggle-group-item:last-child { border-right: none; }
1010
- .ak-toggle-group-outline .ak-toggle-group-item[aria-checked="true"],
1011
- .ak-toggle-group-outline .ak-toggle-group-item[aria-pressed="true"] { background: var(--color-ak-primary); color: var(--color-ak-on-primary); box-shadow: none; }
1012
- .ak-toggle-group-outline .ak-toggle-group-item[aria-checked="false"]:not(:disabled):hover,
1013
- .ak-toggle-group-outline .ak-toggle-group-item[aria-pressed="false"]:not(:disabled):hover { background: var(--color-ak-hover); }
1014
-
1015
-
1016
- /* ============================================================================
1017
- 7. TEXTAREAS
1018
- ============================================================================ */
1019
-
1020
- .ak-textarea {
1021
- width: 100%;
1022
- min-height: 140px;
1023
- font-family: inherit;
1024
- font-size: var(--text-ak-base);
1025
- line-height: 1.5;
1026
- color: var(--color-ak-text);
1027
- background: var(--ak-textarea-bg, var(--color-ak-bg));
1028
- border: 2px solid var(--ak-textarea-border, var(--color-ak-border-strong));
1029
- border-radius: var(--radius-ak-input);
1030
- padding: 12px var(--spacing-ak-2);
1031
- outline: none;
1032
- resize: vertical;
1033
- transition: border-color var(--duration-ak-base);
1034
- }
1035
- .ak-textarea::placeholder { color: var(--color-ak-text-muted); }
1036
- .ak-textarea:focus { border-color: var(--color-ak-border-focus); }
1037
- .ak-textarea:disabled { opacity: 0.5; cursor: not-allowed; }
1038
-
1039
- .ak-textarea-no-resize { resize: none; }
1040
- .ak-textarea-readonly { background: var(--color-ak-surface-2); cursor: default; }
1041
- .ak-textarea-error { border-color: var(--color-ak-danger); }
1042
- .ak-textarea-error:focus { border-color: var(--color-ak-danger); }
1043
- .ak-textarea-success { border-color: var(--color-ak-success); }
1044
- .ak-textarea-success:focus { border-color: var(--color-ak-success); }
1045
-
1046
- /* Size variants */
1047
- .ak-textarea-sm { min-height: 100px; font-size: var(--text-ak-sm); padding: 10px 14px; }
1048
- .ak-textarea-lg { min-height: 200px; font-size: var(--text-ak-lg); padding: 14px 18px; }
1049
-
1050
- /* Auto-resize wrapper */
1051
- .ak-textarea-auto-wrap { display: grid; }
1052
- .ak-textarea-auto-wrap::after {
1053
- content: attr(data-ak-replicated-value) ' ';
1054
- white-space: pre-wrap;
1055
- visibility: hidden;
1056
- font-family: inherit;
1057
- font-size: var(--text-ak-base);
1058
- line-height: 1.5;
1059
- padding: 12px var(--spacing-ak-2);
1060
- border: 2px solid transparent;
1061
- grid-area: 1 / 1 / 2 / 2;
1062
- }
1063
- .ak-textarea-auto-wrap > .ak-textarea {
1064
- grid-area: 1 / 1 / 2 / 2;
1065
- min-height: var(--height-ak-control-md);
1066
- overflow: hidden;
1067
- }
1068
-
1069
- /* Character count */
1070
- .ak-char-count { font-size: var(--text-ak-sm); color: var(--color-ak-text-muted); margin-top: var(--spacing-ak-0_5); text-align: right; }
1071
- .ak-char-count-warn { color: var(--color-ak-warning-text); }
1072
- .ak-char-count-danger { color: var(--color-ak-danger-text); }
1073
-
1074
- /* Composite textarea wrapper */
1075
- .ak-textarea-composite { border: 2px solid var(--color-ak-border-strong); border-radius: var(--radius-ak-input); overflow: hidden; transition: border-color var(--duration-ak-base); }
1076
- .ak-textarea-composite.ak-focused { border-color: var(--color-ak-border-focus); }
1077
- .ak-textarea-composite .ak-textarea { border: none; border-radius: 0; min-height: 100px; }
1078
- .ak-textarea-composite .ak-textarea:focus { border-color: transparent; }
1079
- .ak-textarea-composite .ak-textarea-auto-wrap::after { border: none; }
1080
-
1081
- /* Composite footer */
1082
- .ak-textarea-footer { display: flex; align-items: center; justify-content: space-between; padding: var(--spacing-ak-1) var(--spacing-ak-1_5); border-top: 1px solid var(--color-ak-border); gap: var(--spacing-ak-1); }
1083
- .ak-textarea-footer .ak-char-count { margin-top: 0; text-align: left; flex-shrink: 0; }
1084
-
1085
- /* Toolbar */
1086
- .ak-textarea-toolbar { display: flex; align-items: center; gap: 2px; }
1087
- .ak-textarea-toolbar-btn {
1088
- width: var(--size-ak-touch-min);
1089
- height: var(--size-ak-touch-min);
1090
- display: flex;
1091
- align-items: center;
1092
- justify-content: center;
1093
- background: none;
1094
- border: none;
1095
- color: var(--color-ak-text-muted);
1096
- cursor: pointer;
1097
- border-radius: 8px;
1098
- transition: color 0.15s, background-color 0.15s;
1099
- font-size: 20px;
1100
- }
1101
- .ak-textarea-toolbar-btn:hover { color: var(--color-ak-text); background: var(--color-ak-active); }
1102
- .ak-textarea-toolbar-btn:focus { outline: 2px solid var(--color-ak-border-focus); outline-offset: -2px; }
1103
-
1104
- /* Send button */
1105
- .ak-textarea-send-btn {
1106
- height: var(--size-ak-touch-min);
1107
- display: flex;
1108
- align-items: center;
1109
- justify-content: center;
1110
- gap: 6px;
1111
- font-family: inherit;
1112
- font-size: var(--text-ak-sm);
1113
- font-weight: 600;
1114
- background: var(--color-ak-primary);
1115
- color: var(--color-ak-on-primary);
1116
- border: none;
1117
- border-radius: 8px;
1118
- padding: 0 var(--spacing-ak-2);
1119
- cursor: pointer;
1120
- transition: background-color var(--duration-ak-base);
1121
- }
1122
- .ak-textarea-send-btn:hover { background: var(--color-ak-primary-hover); }
1123
-
1124
-
1125
- /* ============================================================================
1126
- 8. SELECTS & DROPDOWNS
1127
- ============================================================================ */
1128
-
1129
- /* --- Native Select Wrapper --- */
1130
- .ak-select-wrap { position: relative; }
1131
-
1132
- .ak-select {
1133
- width: 100%;
1134
- min-height: var(--ak-select-height, var(--height-ak-control-md));
1135
- font-family: inherit;
1136
- font-size: var(--text-ak-base);
1137
- color: var(--color-ak-text);
1138
- background: var(--color-ak-bg);
1139
- border: 2px solid var(--ak-select-border, var(--color-ak-border-strong));
1140
- border-radius: var(--radius-ak-input);
1141
- padding: 0 44px 0 var(--spacing-ak-2);
1142
- appearance: none;
1143
- -webkit-appearance: none;
1144
- cursor: pointer;
1145
- outline: none;
1146
- transition: border-color var(--duration-ak-base), box-shadow var(--duration-ak-base);
1147
- }
1148
- .ak-select:focus { border-color: var(--color-ak-border-focus); }
1149
- .ak-select:disabled { opacity: 0.5; cursor: not-allowed; }
1150
-
1151
- .ak-select-chevron {
1152
- position: absolute;
1153
- right: 14px;
1154
- top: 50%;
1155
- transform: translateY(-50%);
1156
- pointer-events: none;
1157
- font-size: 18px;
1158
- color: var(--color-ak-text-muted);
1159
- }
1160
-
1161
- /* Size Variants */
1162
- .ak-select.ak-select-sm { min-height: var(--height-ak-control-sm); font-size: var(--text-ak-sm); padding: 0 40px 0 14px; border-radius: 8px; }
1163
- .ak-select.ak-select-lg { min-height: var(--height-ak-control-lg); font-size: var(--text-ak-lg); padding: 0 48px 0 18px; border-radius: var(--radius-ak-lg); }
1164
-
1165
- /* Error / Success */
1166
- .ak-select.ak-select-error { border-color: var(--color-ak-danger); }
1167
- .ak-select.ak-select-error:focus { border-color: var(--color-ak-danger); }
1168
- .ak-select.ak-select-success { border-color: var(--color-ak-success); }
1169
- .ak-select.ak-select-success:focus { border-color: var(--color-ak-success); }
1170
-
1171
- /* --- Custom Select (Combobox / Listbox) --- */
1172
- .ak-custom-select { position: relative; }
1173
-
1174
- .ak-select-trigger {
1175
- display: flex;
1176
- align-items: center;
1177
- justify-content: space-between;
1178
- width: 100%;
1179
- min-height: var(--height-ak-control-md);
1180
- font-family: inherit;
1181
- font-size: var(--text-ak-base);
1182
- color: var(--color-ak-text);
1183
- background: var(--color-ak-bg);
1184
- border: 2px solid var(--color-ak-border-strong);
1185
- border-radius: var(--radius-ak-input);
1186
- padding: 0 14px;
1187
- cursor: pointer;
1188
- outline: none;
1189
- transition: border-color var(--duration-ak-base);
1190
- text-align: left;
1191
- }
1192
- .ak-select-trigger:focus { border-color: var(--color-ak-border-focus); }
1193
- .ak-select-trigger[aria-expanded="true"] .ak-trigger-chevron { transform: rotate(180deg); }
1194
-
1195
- .ak-trigger-chevron { font-size: 18px; color: var(--color-ak-text-muted); transition: transform var(--duration-ak-base); flex-shrink: 0; }
1196
- .ak-select-placeholder { color: var(--color-ak-text-muted); }
1197
-
1198
- /* --- Listbox Dropdown --- */
1199
- .ak-listbox {
1200
- position: absolute;
1201
- top: calc(100% + 4px);
1202
- left: 0;
1203
- right: 0;
1204
- background: var(--color-ak-elevated);
1205
- border: 2px solid var(--color-ak-border-strong);
1206
- border-radius: var(--radius-ak-input);
1207
- box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08), 0 4px 8px rgba(0, 0, 0, 0.04);
1208
- max-height: 280px;
1209
- overflow-y: auto;
1210
- z-index: var(--z-ak-dropdown, 1000);
1211
- padding: 4px;
1212
- display: none;
1213
- }
1214
- .ak-listbox.ak-open { display: block; }
1215
-
1216
- .ak-listbox-option {
1217
- display: flex;
1218
- align-items: center;
1219
- min-height: var(--size-ak-touch-min);
1220
- padding: 0 12px;
1221
- font-size: var(--text-ak-base);
1222
- color: var(--color-ak-text);
1223
- border-radius: 8px;
1224
- cursor: pointer;
1225
- transition: background-color 0.15s;
1226
- }
1227
- .ak-listbox-option:hover { background: var(--color-ak-hover); }
1228
- .ak-listbox-option.ak-active { background: var(--color-ak-active); }
1229
- .ak-listbox-option[aria-selected="true"] { font-weight: 600; }
1230
- .ak-listbox-option[aria-selected="true"]::after {
1231
- content: '';
1232
- display: inline-block;
1233
- width: 18px;
1234
- height: 18px;
1235
- margin-left: auto;
1236
- background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23171717' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") no-repeat center;
1237
- background-size: contain;
1238
- flex-shrink: 0;
1239
- }
1240
-
1241
- .ak-listbox-group-label {
1242
- padding: 8px 12px 4px;
1243
- font-size: var(--text-ak-xs);
1244
- font-weight: 700;
1245
- color: var(--color-ak-text-muted);
1246
- text-transform: uppercase;
1247
- letter-spacing: 0.05em;
1248
- }
1249
- .ak-listbox-divider { height: 1px; background: var(--color-ak-border); margin: 4px 0; }
1250
- .ak-listbox-no-results { padding: 12px; font-size: var(--text-ak-sm); color: var(--color-ak-text-muted); text-align: center; }
1251
-
1252
- /* --- Multi-Select Tags --- */
1253
- .ak-tag-container {
1254
- display: flex;
1255
- flex-wrap: wrap;
1256
- gap: 6px;
1257
- align-items: center;
1258
- min-height: var(--height-ak-control-md);
1259
- border: 2px solid var(--color-ak-border-strong);
1260
- border-radius: var(--radius-ak-input);
1261
- padding: 6px 12px;
1262
- transition: border-color var(--duration-ak-base);
1263
- cursor: text;
1264
- }
1265
- .ak-tag-container:focus-within { border-color: var(--color-ak-border-focus); }
1266
-
1267
- .ak-tag {
1268
- display: inline-flex;
1269
- align-items: center;
1270
- gap: 4px;
1271
- height: 32px;
1272
- padding: 0 var(--spacing-ak-1) 0 var(--spacing-ak-1_5);
1273
- font-size: var(--text-ak-sm);
1274
- color: var(--color-ak-text-secondary);
1275
- background: var(--color-ak-surface-2);
1276
- border-radius: 6px;
1277
- }
1278
- .ak-tag-remove {
1279
- display: inline-flex;
1280
- align-items: center;
1281
- justify-content: center;
1282
- width: 20px;
1283
- height: 20px;
1284
- border: none;
1285
- background: none;
1286
- color: var(--color-ak-text-muted);
1287
- border-radius: 4px;
1288
- cursor: pointer;
1289
- font-size: 14px;
1290
- transition: color 0.15s, background 0.15s;
1291
- }
1292
- .ak-tag-remove:hover { color: var(--color-ak-text); background: var(--color-ak-active); }
1293
-
1294
- /* --- Dropdown Menu --- */
1295
- .ak-dropdown {
1296
- position: absolute;
1297
- top: 100%;
1298
- right: 0;
1299
- margin-top: 0.25rem;
1300
- background: #ffffff;
1301
- border: 1px solid var(--color-ak-border);
1302
- border-radius: var(--radius-ak-md);
1303
- box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08), 0 4px 8px rgba(0, 0, 0, 0.04);
1304
- min-width: 200px;
1305
- z-index: var(--z-ak-dropdown, 1000);
1306
- overflow: hidden;
1307
- opacity: 0;
1308
- transform: translateY(-8px) scale(0.96);
1309
- transition: opacity 0.15s cubic-bezier(0.16, 1, 0.3, 1),
1310
- transform 0.15s cubic-bezier(0.16, 1, 0.3, 1);
1311
- pointer-events: none;
1312
- }
1313
- .ak-dropdown.is-open { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }
1314
- .ak-dropdown.is-hidden { display: none; }
1315
-
1316
- .ak-dropdown__item {
1317
- display: flex;
1318
- align-items: center;
1319
- gap: var(--spacing-ak-2);
1320
- width: 100%;
1321
- padding: var(--spacing-ak-1_5) var(--spacing-ak-4);
1322
- font-family: inherit;
1323
- font-size: var(--text-ak-base);
1324
- font-weight: 400;
1325
- text-align: left;
1326
- background: transparent;
1327
- border: none;
1328
- cursor: pointer;
1329
- color: var(--color-ak-text);
1330
- transition: background-color 0.1s ease;
1331
- }
1332
- .ak-dropdown__item:hover { background: var(--color-ak-hover); }
1333
- .ak-dropdown__item:focus { outline: none; background: var(--color-ak-hover); }
1334
- .ak-dropdown__item i { font-size: var(--text-ak-lg); }
1335
- .ak-dropdown__item--danger { color: var(--color-ak-danger-text); }
1336
- .ak-dropdown__divider { border-top: 1px solid var(--color-ak-border); margin: 0.25rem 0; }
1337
-
1338
-
1339
- /* ============================================================================
1340
- 9. SEARCH
1341
- ============================================================================ */
1342
-
1343
- .ak-search-input {
1344
- width: 100%;
1345
- min-height: var(--ak-search-height, var(--height-ak-control-md));
1346
- font-size: var(--text-ak-base);
1347
- font-family: inherit;
1348
- color: var(--color-ak-text);
1349
- background: var(--ak-search-bg, var(--color-ak-bg));
1350
- border: 2px solid var(--ak-search-border, var(--color-ak-border));
1351
- border-radius: var(--radius-ak-input);
1352
- padding: 0 48px 0 44px;
1353
- outline: none;
1354
- transition: border-color 0.15s;
1355
- }
1356
- .ak-search-input::placeholder { color: var(--color-ak-text-muted); }
1357
- .ak-search-input::-webkit-search-cancel-button,
1358
- .ak-search-input::-webkit-search-decoration { -webkit-appearance: none; appearance: none; }
1359
- .ak-search-input:focus { border-color: var(--color-ak-border-focus); }
1360
- .ak-search-input:disabled { opacity: 0.5; cursor: not-allowed; }
1361
-
1362
- /* Error */
1363
- .ak-search-input.ak-search-error { border-color: var(--color-ak-danger); }
1364
- .ak-search-input.ak-search-error:focus { border-color: var(--color-ak-danger); }
1365
-
1366
- /* Size: small */
1367
- .ak-search-input.ak-search-sm { min-height: var(--height-ak-control-sm); font-size: var(--text-ak-sm); padding: 0 40px 0 38px; border-radius: 8px; }
1368
-
1369
- /* Size: large */
1370
- .ak-search-input.ak-search-lg { min-height: var(--height-ak-control-lg); font-size: var(--text-ak-lg); padding: 0 56px 0 50px; border-radius: var(--radius-ak-lg); }
1371
-
1372
- /* Search Icon */
1373
- .ak-search-icon {
1374
- position: absolute;
1375
- left: 14px;
1376
- top: 50%;
1377
- transform: translateY(-50%);
1378
- color: var(--color-ak-text-muted);
1379
- pointer-events: none;
1380
- font-size: 20px;
1381
- }
1382
- .ak-search-icon.ak-icon-sm { left: 12px; font-size: 18px; }
1383
- .ak-search-icon.ak-icon-lg { left: 16px; font-size: 22px; }
1384
-
1385
- /* Clear Button */
1386
- .ak-search-clear {
1387
- position: absolute;
1388
- right: 4px;
1389
- top: 50%;
1390
- transform: translateY(-50%);
1391
- display: none;
1392
- align-items: center;
1393
- justify-content: center;
1394
- width: 40px;
1395
- height: 40px;
1396
- border: none;
1397
- background: none;
1398
- border-radius: 8px;
1399
- color: var(--color-ak-text-muted);
1400
- cursor: pointer;
1401
- font-size: 18px;
1402
- transition: color 0.15s, background 0.15s;
1403
- }
1404
- .ak-search-clear:hover { color: var(--color-ak-text); background: var(--color-ak-surface-2); }
1405
- .ak-search-clear:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1406
- .ak-search-clear.ak-visible { display: inline-flex; }
1407
-
1408
- /* Kbd Badge */
1409
- .ak-search-kbd {
1410
- position: absolute;
1411
- right: 12px;
1412
- top: 50%;
1413
- transform: translateY(-50%);
1414
- font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
1415
- font-size: 0.6875rem;
1416
- font-weight: 500;
1417
- color: var(--color-ak-text-muted);
1418
- background: var(--color-ak-surface-2);
1419
- border: 1px solid var(--color-ak-border);
1420
- border-radius: 5px;
1421
- padding: 2px 7px;
1422
- pointer-events: none;
1423
- user-select: none;
1424
- line-height: 1.4;
1425
- }
1426
-
1427
- /* Autocomplete Listbox */
1428
- .ak-search-listbox {
1429
- position: absolute;
1430
- top: calc(100% + 6px);
1431
- left: 0;
1432
- right: 0;
1433
- background: var(--color-ak-bg);
1434
- border: 2px solid var(--color-ak-border);
1435
- border-radius: var(--radius-ak-input);
1436
- box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08), 0 4px 8px rgba(0, 0, 0, 0.04);
1437
- z-index: var(--z-ak-dropdown, 1000);
1438
- max-height: 260px;
1439
- overflow-y: auto;
1440
- padding: 4px;
1441
- list-style: none;
1442
- margin: 0;
1443
- }
1444
- .ak-search-listbox[hidden] { display: none; }
1445
-
1446
- .ak-search-option {
1447
- display: flex;
1448
- align-items: center;
1449
- gap: 10px;
1450
- padding: 10px 12px;
1451
- font-size: 0.9375rem;
1452
- color: var(--color-ak-text);
1453
- border-radius: 7px;
1454
- cursor: pointer;
1455
- transition: background 0.1s;
1456
- }
1457
- .ak-search-option:hover { background: var(--color-ak-hover); }
1458
- .ak-search-option[aria-selected="true"] { background: var(--color-ak-primary-subtle); }
1459
- .ak-search-option-icon { color: var(--color-ak-text-muted); font-size: 18px; flex-shrink: 0; }
1460
-
1461
- /* Filter Chip */
1462
- .ak-filter-chip {
1463
- display: inline-flex;
1464
- align-items: center;
1465
- justify-content: center;
1466
- height: 36px;
1467
- padding: 0 var(--spacing-ak-2);
1468
- font-size: var(--text-ak-sm);
1469
- font-weight: 500;
1470
- color: var(--color-ak-text);
1471
- background: var(--color-ak-bg);
1472
- border: 2px solid var(--color-ak-border);
1473
- border-radius: var(--radius-ak-full);
1474
- cursor: pointer;
1475
- transition: border-color 0.15s, background 0.15s, color 0.15s;
1476
- white-space: nowrap;
1477
- }
1478
- .ak-filter-chip:hover { border-color: var(--color-ak-border-strong); background: var(--color-ak-hover); }
1479
- .ak-filter-chip[aria-pressed="true"] { background: var(--color-ak-primary); border-color: var(--color-ak-primary); color: var(--color-ak-on-primary); }
1480
- .ak-filter-chip:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1481
-
1482
- /* Search Spinner */
1483
- .ak-search-spinner {
1484
- position: absolute;
1485
- right: 14px;
1486
- top: 50%;
1487
- transform: translateY(-50%);
1488
- width: 20px;
1489
- height: 20px;
1490
- border: 2.5px solid var(--color-ak-border);
1491
- border-top-color: var(--color-ak-text);
1492
- border-radius: 50%;
1493
- animation: ak-spin 0.7s linear infinite;
1494
- }
1495
-
1496
- /* Expandable Search */
1497
- .ak-search-expandable { display: inline-flex; align-items: center; position: relative; }
1498
- .ak-search-expand-btn {
1499
- display: inline-flex;
1500
- align-items: center;
1501
- justify-content: center;
1502
- width: var(--height-ak-control-md);
1503
- height: var(--height-ak-control-md);
1504
- border: 2px solid var(--color-ak-border);
1505
- background: var(--color-ak-bg);
1506
- border-radius: var(--radius-ak-input);
1507
- cursor: pointer;
1508
- color: var(--color-ak-text-muted);
1509
- transition: border-color 0.15s;
1510
- }
1511
- .ak-search-expand-btn:hover { border-color: var(--color-ak-border-strong); }
1512
- .ak-search-expand-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1513
-
1514
-
1515
- /* ============================================================================
1516
- 10. MISC FORM ELEMENTS
1517
- ============================================================================ */
1518
-
1519
- /* --- OTP Input --- */
1520
- .ak-otp-input {
1521
- width: 52px;
1522
- min-height: var(--height-ak-control-lg);
1523
- font-family: inherit;
1524
- font-size: var(--text-ak-xl);
1525
- font-weight: 600;
1526
- text-align: center;
1527
- color: var(--color-ak-text);
1528
- background: var(--color-ak-bg);
1529
- border: 2px solid var(--color-ak-border-strong);
1530
- border-radius: var(--radius-ak-input);
1531
- outline: none;
1532
- transition: border-color var(--duration-ak-base);
1533
- caret-color: var(--color-ak-primary);
1534
- }
1535
- .ak-otp-input:focus { border-color: var(--color-ak-border-focus); }
1536
- .ak-otp-input.has-value { border-color: var(--color-ak-primary); }
1537
- .ak-otp-input.ak-otp-error { border-color: var(--color-ak-danger); }
1538
- .ak-otp-input.ak-otp-error:focus { border-color: var(--color-ak-danger); }
1539
-
1540
- /* --- File Upload / Dropzone --- */
1541
- .ak-dropzone {
1542
- display: flex;
1543
- flex-direction: column;
1544
- align-items: center;
1545
- justify-content: center;
1546
- gap: var(--spacing-ak-2);
1547
- min-height: 180px;
1548
- border: 2px dashed var(--color-ak-border-strong);
1549
- border-radius: var(--radius-ak-lg);
1550
- padding: var(--spacing-ak-4);
1551
- cursor: pointer;
1552
- transition: border-color var(--duration-ak-base), background-color var(--duration-ak-base);
1553
- text-align: center;
1554
- }
1555
- .ak-dropzone:hover {
1556
- border-color: var(--color-ak-primary);
1557
- }
1558
- .ak-dropzone:hover .ak-dropzone-icon {
1559
- color: var(--color-ak-primary);
1560
- }
1561
- .ak-dropzone.drag-over {
1562
- border-color: var(--color-ak-primary);
1563
- background: var(--color-ak-primary-subtle);
1564
- }
1565
- .ak-dropzone-icon-bg {
1566
- width: 56px;
1567
- height: 56px;
1568
- border-radius: var(--radius-ak-lg);
1569
- background: var(--color-ak-surface-2);
1570
- display: flex;
1571
- align-items: center;
1572
- justify-content: center;
1573
- transition: background-color var(--duration-ak-base);
1574
- }
1575
- .ak-dropzone-icon {
1576
- font-size: 28px;
1577
- color: var(--color-ak-text-muted);
1578
- transition: color var(--duration-ak-base);
1579
- }
1580
-
1581
- /* File row */
1582
- .ak-file-row {
1583
- display: flex;
1584
- align-items: center;
1585
- gap: var(--spacing-ak-1_5);
1586
- padding: var(--spacing-ak-1_5) var(--spacing-ak-2);
1587
- border: 1px solid var(--color-ak-border);
1588
- border-radius: var(--radius-ak-md);
1589
- transition: background-color 0.15s;
1590
- }
1591
- .ak-file-row:hover { background: var(--color-ak-hover); }
1592
-
1593
- .ak-delete-btn {
1594
- display: flex;
1595
- align-items: center;
1596
- justify-content: center;
1597
- width: 36px;
1598
- height: 36px;
1599
- border: none;
1600
- background: none;
1601
- border-radius: var(--radius-ak-md);
1602
- color: var(--color-ak-text-muted);
1603
- cursor: pointer;
1604
- transition: color 0.15s, background 0.15s;
1605
- }
1606
- .ak-delete-btn:hover { color: var(--color-ak-danger); background: var(--color-ak-danger-subtle); }
1607
-
1608
- /* Progress bar fill */
1609
- .ak-progress-fill {
1610
- height: 4px;
1611
- border-radius: var(--radius-ak-full);
1612
- background: var(--color-ak-primary);
1613
- transition: width 0.3s ease;
1614
- }
1615
-
1616
- /* --- Range Slider --- */
1617
- .ak-range-input {
1618
- width: 100%;
1619
- min-height: var(--height-ak-control-md);
1620
- font-family: inherit;
1621
- font-size: var(--text-ak-base);
1622
- color: var(--color-ak-text);
1623
- background: var(--color-ak-bg);
1624
- border: 2px solid var(--color-ak-border-strong);
1625
- border-radius: var(--radius-ak-input);
1626
- padding: 0 var(--spacing-ak-2);
1627
- outline: none;
1628
- transition: border-color var(--duration-ak-base);
1629
- }
1630
- .ak-range-input:focus { border-color: var(--color-ak-border-focus); }
1631
-
1632
- /* Dual range */
1633
- .ak-dual-range { position: relative; height: 8px; }
1634
- .ak-dual-track {
1635
- position: absolute;
1636
- width: 100%;
1637
- height: 8px;
1638
- background: var(--color-ak-border);
1639
- border-radius: var(--radius-ak-full);
1640
- }
1641
- .ak-dual-fill {
1642
- position: absolute;
1643
- height: 8px;
1644
- background: var(--color-ak-primary);
1645
- border-radius: var(--radius-ak-full);
1646
- }
1647
-
1648
- /* --- Rating --- */
1649
- .ak-star-btn {
1650
- display: inline-flex;
1651
- align-items: center;
1652
- justify-content: center;
1653
- width: var(--size-ak-touch-min);
1654
- height: var(--size-ak-touch-min);
1655
- background: none;
1656
- border: none;
1657
- cursor: pointer;
1658
- border-radius: var(--radius-ak-md);
1659
- color: var(--color-ak-border-strong);
1660
- transition: color var(--duration-ak-base), transform var(--duration-ak-base);
1661
- }
1662
- .ak-star-btn.filled { color: var(--color-ak-warning); }
1663
- .ak-star-btn.hovered { color: var(--color-ak-warning); transform: scale(1.15); }
1664
- .ak-star-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1665
- .ak-star-icon { font-size: 28px; pointer-events: none; }
1666
-
1667
- .ak-star-btn.ak-star-sm { width: 36px; height: 36px; }
1668
- .ak-star-btn.ak-star-sm .ak-star-icon { font-size: 22px; }
1669
- .ak-star-btn.ak-star-lg { width: 56px; height: 56px; }
1670
- .ak-star-btn.ak-star-lg .ak-star-icon { font-size: 36px; }
1671
-
1672
- .ak-rating-disabled { opacity: 0.5; pointer-events: none; }
1673
-
1674
- /* Emoji rating */
1675
- .ak-emoji-btn {
1676
- display: inline-flex;
1677
- align-items: center;
1678
- justify-content: center;
1679
- width: var(--size-ak-touch-min);
1680
- height: var(--size-ak-touch-min);
1681
- background: none;
1682
- border: 2px solid transparent;
1683
- border-radius: var(--radius-ak-md);
1684
- cursor: pointer;
1685
- transition: background var(--duration-ak-base), border-color var(--duration-ak-base);
1686
- }
1687
- .ak-emoji-btn:hover { background: var(--color-ak-hover); }
1688
- .ak-emoji-btn[aria-checked="true"] { border-color: var(--color-ak-primary); background: var(--color-ak-primary-subtle); }
1689
- .ak-emoji-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1690
- .ak-emoji-label { font-size: var(--text-ak-xs); color: var(--color-ak-text-muted); text-align: center; }
1691
-
1692
- /* Thumb rating */
1693
- .ak-thumb-btn {
1694
- display: inline-flex;
1695
- align-items: center;
1696
- justify-content: center;
1697
- width: var(--size-ak-touch-min);
1698
- height: var(--size-ak-touch-min);
1699
- background: none;
1700
- border: 2px solid var(--color-ak-border);
1701
- border-radius: var(--radius-ak-full);
1702
- cursor: pointer;
1703
- transition: background var(--duration-ak-base), border-color var(--duration-ak-base), color var(--duration-ak-base);
1704
- }
1705
- .ak-thumb-btn:hover { background: var(--color-ak-hover); }
1706
- .ak-thumb-btn[aria-pressed="true"] { border-color: var(--color-ak-primary); background: var(--color-ak-primary); color: var(--color-ak-on-primary); }
1707
- .ak-thumb-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1708
-
1709
- /* NPS */
1710
- .ak-nps-btn {
1711
- display: inline-flex;
1712
- align-items: center;
1713
- justify-content: center;
1714
- min-width: var(--size-ak-touch-min);
1715
- min-height: var(--size-ak-touch-min);
1716
- font-size: var(--text-ak-base);
1717
- font-weight: 600;
1718
- background: var(--color-ak-surface-2);
1719
- color: var(--color-ak-text-secondary);
1720
- border: none;
1721
- border-radius: 8px;
1722
- cursor: pointer;
1723
- transition: background var(--duration-ak-base), color var(--duration-ak-base);
1724
- }
1725
- .ak-nps-btn:hover { background: var(--color-ak-hover); }
1726
- .ak-nps-btn[aria-checked="true"] { background: var(--color-ak-primary); color: var(--color-ak-on-primary); }
1727
- .ak-nps-btn[aria-checked="true"][data-nps-zone="detractor"] { background: var(--color-ak-danger); }
1728
- .ak-nps-btn[aria-checked="true"][data-nps-zone="passive"] { background: var(--color-ak-warning); }
1729
- .ak-nps-btn[aria-checked="true"][data-nps-zone="promoter"] { background: var(--color-ak-success); }
1730
- .ak-nps-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1731
-
1732
- /* Likert */
1733
- .ak-likert-btn {
1734
- display: inline-flex;
1735
- align-items: center;
1736
- justify-content: center;
1737
- min-width: var(--size-ak-touch-min);
1738
- min-height: var(--size-ak-touch-min);
1739
- padding: 0 var(--spacing-ak-2);
1740
- font-size: var(--text-ak-sm);
1741
- font-weight: 500;
1742
- background: var(--color-ak-surface-2);
1743
- color: var(--color-ak-text-secondary);
1744
- border: none;
1745
- border-radius: 8px;
1746
- cursor: pointer;
1747
- white-space: nowrap;
1748
- transition: background var(--duration-ak-base), color var(--duration-ak-base);
1749
- }
1750
- .ak-likert-btn:hover { background: var(--color-ak-hover); }
1751
- .ak-likert-btn[aria-checked="true"] { background: var(--color-ak-primary); color: var(--color-ak-on-primary); }
1752
- .ak-likert-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1753
-
1754
- /* Heart button (rating) */
1755
- .ak-heart-btn {
1756
- display: inline-flex;
1757
- align-items: center;
1758
- justify-content: center;
1759
- width: var(--size-ak-touch-min);
1760
- height: var(--size-ak-touch-min);
1761
- background: none;
1762
- border: none;
1763
- border-radius: var(--radius-ak-full);
1764
- cursor: pointer;
1765
- color: var(--color-ak-border-strong);
1766
- transition: color var(--duration-ak-base) var(--ease-ak-spring), transform var(--duration-ak-base) var(--ease-ak-spring);
1767
- }
1768
- .ak-heart-btn:hover { color: var(--color-ak-danger); }
1769
- .ak-heart-btn[aria-pressed="true"] { color: var(--color-ak-danger); }
1770
- .ak-heart-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1771
- .ak-heart-icon { font-size: 28px; pointer-events: none; }
1772
-
1773
- /* --- Quantity Selector --- */
1774
- .ak-qty-btn {
1775
- display: flex;
1776
- align-items: center;
1777
- justify-content: center;
1778
- min-width: var(--size-ak-touch-min);
1779
- min-height: var(--size-ak-touch-min);
1780
- background: none;
1781
- border: none;
1782
- cursor: pointer;
1783
- font-size: 20px;
1784
- color: var(--color-ak-text);
1785
- transition: background var(--duration-ak-base), color var(--duration-ak-base);
1786
- }
1787
- .ak-qty-btn:active { transform: scale(0.92); }
1788
- .ak-qty-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1789
- .ak-qty-btn[disabled] { opacity: 0.3; cursor: not-allowed; }
1790
-
1791
- .ak-qty-input {
1792
- width: 48px;
1793
- min-height: var(--size-ak-touch-min);
1794
- text-align: center;
1795
- font-family: inherit;
1796
- font-size: var(--text-ak-base);
1797
- font-weight: 600;
1798
- color: var(--color-ak-text);
1799
- background: transparent;
1800
- border: none;
1801
- outline: none;
1802
- -moz-appearance: textfield;
1803
- }
1804
- .ak-qty-input::-webkit-outer-spin-button,
1805
- .ak-qty-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
1806
-
1807
- .ak-qty-bordered .ak-qty-btn { border: 1px solid var(--color-ak-border); border-radius: 8px; }
1808
- .ak-qty-bordered .ak-qty-btn:hover:not([disabled]) { background: var(--color-ak-hover); }
1809
- .ak-qty-pill .ak-qty-btn { border: 1px solid var(--color-ak-border); border-radius: var(--radius-ak-full); }
1810
- .ak-qty-pill .ak-qty-btn:hover:not([disabled]) { background: var(--color-ak-hover); }
1811
- .ak-qty-solid .ak-qty-btn { background: var(--color-ak-surface-2); border-radius: 8px; }
1812
- .ak-qty-solid .ak-qty-btn:hover:not([disabled]) { background: var(--color-ak-active); }
1813
- .ak-qty-disabled { opacity: 0.5; pointer-events: none; }
1814
-
1815
- /* --- Number Stepper --- */
1816
- .ak-step-btn {
1817
- display: flex;
1818
- align-items: center;
1819
- justify-content: center;
1820
- min-width: var(--size-ak-touch-min);
1821
- min-height: var(--size-ak-touch-min);
1822
- background: var(--color-ak-surface-2);
1823
- border: none;
1824
- cursor: pointer;
1825
- font-size: 20px;
1826
- color: var(--color-ak-text);
1827
- transition: background var(--duration-ak-base);
1828
- }
1829
- .ak-step-btn:hover { background: var(--color-ak-active); }
1830
- .ak-step-btn:active { transform: scale(0.95); }
1831
- .ak-step-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: -2px; }
1832
- .ak-step-btn[disabled] { opacity: 0.3; cursor: not-allowed; }
1833
-
1834
- .ak-stepper-input {
1835
- width: 64px;
1836
- min-height: var(--size-ak-touch-min);
1837
- text-align: center;
1838
- font-family: inherit;
1839
- font-size: var(--text-ak-base);
1840
- font-weight: 600;
1841
- color: var(--color-ak-text);
1842
- background: transparent;
1843
- border: none;
1844
- outline: none;
1845
- }
1846
-
1847
- /* --- Password --- */
1848
- .ak-password-wrap { position: relative; }
1849
- .ak-password-wrap .ak-input { padding-right: var(--height-ak-control-md); }
1850
-
1851
- .ak-password-toggle {
1852
- position: absolute;
1853
- right: 2px;
1854
- top: 50%;
1855
- transform: translateY(-50%);
1856
- display: flex;
1857
- align-items: center;
1858
- justify-content: center;
1859
- width: var(--size-ak-touch-min);
1860
- height: var(--size-ak-touch-min);
1861
- background: none;
1862
- border: none;
1863
- border-radius: 8px;
1864
- color: var(--color-ak-text-muted);
1865
- cursor: pointer;
1866
- font-size: 20px;
1867
- transition: color 0.15s;
1868
- }
1869
- .ak-password-toggle:hover { color: var(--color-ak-text); }
1870
- .ak-password-toggle:focus { outline: 2px solid var(--color-ak-border-focus); outline-offset: -2px; }
1871
- .ak-password-toggle-icon { pointer-events: none; }
1872
-
1873
- /* Alias from login form */
1874
- .ak-pw-toggle {
1875
- position: absolute;
1876
- right: 2px;
1877
- top: 50%;
1878
- transform: translateY(-50%);
1879
- display: flex;
1880
- align-items: center;
1881
- justify-content: center;
1882
- width: var(--size-ak-touch-min);
1883
- height: var(--size-ak-touch-min);
1884
- background: none;
1885
- border: none;
1886
- border-radius: 8px;
1887
- color: var(--color-ak-text-muted);
1888
- cursor: pointer;
1889
- font-size: 20px;
1890
- transition: color 0.15s;
1891
- }
1892
- .ak-pw-toggle:hover { color: var(--color-ak-text); }
1893
-
1894
- /* --- Password Strength --- */
1895
- .ak-strength-bar { display: flex; gap: 4px; margin-top: var(--spacing-ak-1); }
1896
- .ak-strength-segment {
1897
- flex: 1;
1898
- height: 4px;
1899
- border-radius: var(--radius-ak-full);
1900
- background: var(--color-ak-border);
1901
- transition: background var(--duration-ak-base);
1902
- }
1903
- .ak-strength-segment.ak-filled { background: var(--color-ak-border-strong); }
1904
- .ak-strength-segment.ak-weak { background: var(--color-ak-danger); }
1905
- .ak-strength-segment.ak-fair { background: var(--color-ak-warning); }
1906
- .ak-strength-segment.ak-strong { background: var(--color-ak-success); }
1907
- .ak-strength-hint { font-size: var(--text-ak-sm); color: var(--color-ak-text-muted); margin-top: var(--spacing-ak-0_5); }
1908
-
1909
- /* Requirements list */
1910
- .ak-req-list { list-style: none; padding: 0; margin: var(--spacing-ak-1) 0 0; }
1911
- .ak-req-item {
1912
- display: flex;
1913
- align-items: center;
1914
- gap: var(--spacing-ak-1);
1915
- font-size: var(--text-ak-sm);
1916
- color: var(--color-ak-text-muted);
1917
- padding: 2px 0;
1918
- }
1919
- .ak-req-item.ak-met { color: var(--color-ak-success-text); }
1920
- .ak-req-icon { font-size: 16px; flex-shrink: 0; }
1921
-
1922
- /* --- Badges (form context) --- renamed to ak-form-badge to avoid collision with avatar ak-badge */
1923
- .ak-form-badge {
1924
- display: inline-flex;
1925
- align-items: center;
1926
- padding: 2px 8px;
1927
- font-size: 0.6875rem;
1928
- font-weight: 600;
1929
- line-height: 1.4;
1930
- border-radius: var(--radius-ak-full);
1931
- text-transform: uppercase;
1932
- letter-spacing: 0.02em;
1933
- }
1934
- .ak-form-badge-new { background: var(--color-ak-info-subtle); color: var(--color-ak-info-text); }
1935
- .ak-form-badge-beta { background: var(--color-ak-warning-subtle); color: var(--color-ak-warning-text); }
1936
- .ak-badge-pro { background: var(--color-ak-primary-subtle); color: var(--color-ak-text); }
1937
-
1938
- /* --- Error Summary (signup form) --- */
1939
- .ak-error-summary {
1940
- border: 2px solid var(--color-ak-danger);
1941
- border-radius: var(--radius-ak-input);
1942
- padding: var(--spacing-ak-2);
1943
- background: var(--color-ak-danger-subtle);
1944
- }
1945
- .ak-error-summary-title {
1946
- font-size: var(--text-ak-base);
1947
- font-weight: 600;
1948
- color: var(--color-ak-danger-text);
1949
- margin-bottom: var(--spacing-ak-1);
1950
- }
1951
- .ak-error-summary-list { list-style: none; padding: 0; margin: 0; }
1952
- .ak-error-summary-list a { color: var(--color-ak-danger-text); text-decoration: underline; font-size: var(--text-ak-sm); }
1953
- .ak-error-summary-list a:hover { color: var(--color-ak-danger); }
1954
-
1955
- /* --- Success Card (signup form) --- */
1956
- .ak-success-card {
1957
- text-align: center;
1958
- padding: var(--spacing-ak-6);
1959
- }
1960
- .ak-success-icon {
1961
- font-size: 48px;
1962
- color: var(--color-ak-success);
1963
- margin-bottom: var(--spacing-ak-2);
1964
- }
1965
- .ak-success-title {
1966
- font-size: var(--text-ak-xl);
1967
- font-weight: 600;
1968
- color: var(--color-ak-text);
1969
- margin-bottom: var(--spacing-ak-1);
1970
- }
1971
-
1972
- /* --- Select chevron rotation (contact form) --- */
1973
- .ak-select-wrap svg {
1974
- transition: transform var(--duration-ak-base) ease;
1975
- }
1976
- .ak-select-wrap:focus-within svg {
1977
- transform: translateY(-50%) rotate(180deg);
1978
- }
1979
- .ak-select-wrap svg {
1980
- transform: translateY(-50%);
1981
- }
1982
-
1983
- /* --- Date input filled state --- */
1984
- .ak-date-input.has-value {
1985
- color: var(--color-ak-text);
1986
- }
1987
-
1988
- /* --- Input wrap hover --- */
1989
- .ak-input-wrap:hover .ak-date-input {
1990
- border-color: var(--color-ak-border-strong);
1991
- }
1992
- .ak-input-wrap:hover .ak-input-icon {
1993
- color: var(--color-ak-text-secondary);
1994
- }
1995
- .ak-input-icon {
1996
- transition: color var(--duration-ak-base) ease;
1997
- }
1998
-
1999
-
2000
- /* ============================================================================
2001
- 11. DIVIDERS & SOCIAL
2002
- ============================================================================ */
2003
-
2004
- .ak-divider {
2005
- display: flex;
2006
- align-items: center;
2007
- gap: var(--spacing-ak-2);
2008
- margin: var(--spacing-ak-3) 0;
2009
- }
2010
- .ak-divider-line {
2011
- flex: 1;
2012
- height: 1px;
2013
- background: var(--color-ak-border);
2014
- }
2015
- .ak-divider-text {
2016
- font-size: var(--text-ak-sm);
2017
- color: var(--color-ak-text-muted);
2018
- white-space: nowrap;
2019
- }
2020
-
2021
- .ak-social-icon {
2022
- display: flex;
2023
- align-items: center;
2024
- justify-content: center;
2025
- width: 20px;
2026
- height: 20px;
2027
- flex-shrink: 0;
2028
- }
2029
-
2030
- .ak-link {
2031
- font-size: var(--text-ak-sm);
2032
- font-weight: 500;
2033
- color: var(--color-ak-text-secondary);
2034
- text-decoration: none;
2035
- transition: color var(--duration-ak-base);
2036
- }
2037
- .ak-link:hover { color: var(--color-ak-text); }
2038
-
2039
- /* --- Toast Notification --- */
2040
- .ak-toast {
2041
- position: fixed;
2042
- bottom: 24px;
2043
- right: 24px;
2044
- background: var(--color-ak-elevated);
2045
- border: 1px solid var(--color-ak-border);
2046
- border-radius: var(--radius-ak-md);
2047
- padding: var(--spacing-ak-2) var(--spacing-ak-3);
2048
- box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
2049
- display: flex;
2050
- align-items: center;
2051
- gap: var(--spacing-ak-1_5);
2052
- min-width: 320px;
2053
- opacity: 0;
2054
- transform: translateY(20px);
2055
- transition: opacity var(--duration-ak-base) cubic-bezier(0.16, 1, 0.3, 1),
2056
- transform var(--duration-ak-base) cubic-bezier(0.16, 1, 0.3, 1);
2057
- pointer-events: none;
2058
- z-index: var(--z-ak-toast, 1700);
2059
- }
2060
- .ak-toast.is-visible { opacity: 1; transform: translateY(0); pointer-events: auto; }
2061
- .ak-toast__icon { flex-shrink: 0; font-size: 1.25rem; color: var(--color-ak-success); }
2062
- .ak-toast__message { flex: 1; font-size: var(--text-ak-base); color: var(--color-ak-text); }
2063
-
2064
- /* --- Form section labels --- */
2065
- .ak-section-label {
2066
- font-size: var(--text-ak-base);
2067
- font-weight: 500;
2068
- color: var(--color-ak-text-muted);
2069
- text-transform: uppercase;
2070
- letter-spacing: 0.04em;
2071
- margin-bottom: var(--spacing-ak-1_5);
2072
- }
2073
- .ak-form-section {
2074
- margin-bottom: var(--spacing-ak-3);
2075
- }
2076
-
2077
-
2078
- /* ============================================================================
2079
- 12. SPINNER
2080
- ============================================================================ */
2081
-
2082
- @keyframes ak-spin {
2083
- to { transform: rotate(360deg); }
2084
- }
2085
-
2086
- .ak-spinner {
2087
- width: 1.25rem;
2088
- height: 1.25rem;
2089
- flex-shrink: 0;
2090
- border: 2px solid rgba(255, 255, 255, 0.3);
2091
- border-top-color: #ffffff;
2092
- border-radius: var(--radius-ak-full);
2093
- animation: ak-spin 0.6s linear infinite;
2094
- }
2095
-
2096
- /* --- Checkbox / Radio micro-interaction keyframes --- */
2097
- @keyframes ak-heart-pop {
2098
- 0% { transform: scale(1); }
2099
- 50% { transform: scale(1.3); }
2100
- 100% { transform: scale(1); }
2101
- }
2102
-
2103
- @keyframes ak-checkbox-pop {
2104
- 0% { transform: scale(1); }
2105
- 50% { transform: scale(1.1); }
2106
- 100% { transform: scale(1); }
2107
- }
2108
-
2109
- @keyframes ak-radio-pop {
2110
- 0% { transform: scale(1); }
2111
- 50% { transform: scale(1.1); }
2112
- 100% { transform: scale(1); }
2113
- }
2114
-
2115
- @keyframes ak-checkmark-slide {
2116
- from { transform: rotate(45deg) translateY(-5px); opacity: 0; }
2117
- to { transform: rotate(45deg) translateY(0); opacity: 1; }
2118
- }
2119
-
2120
- /* Lightning pulse (upgrade buttons) */
2121
- @keyframes ak-lightning-pulse {
2122
- 0%, 100% { opacity: 1; transform: scale(1); }
2123
- 50% { opacity: 0.7; transform: scale(1.1); }
2124
- }
2125
-
2126
- /* Success check slide-in */
2127
- @keyframes ak-check-slide-in {
2128
- 0% { transform: scale(0); opacity: 0; }
2129
- 50% { transform: scale(1.1); }
2130
- 100% { transform: scale(1); opacity: 1; }
2131
- }
2132
- .ak-success-icon-anim {
2133
- animation: ak-check-slide-in 0.35s var(--ease-ak-spring);
2134
- }
2135
-
2136
- /* Micro-interactions (motion-safe only) */
2137
- @media (prefers-reduced-motion: no-preference) {
2138
- .ak-check:checked { animation: ak-checkbox-pop 0.25s var(--ease-ak-spring); }
2139
- .ak-check:checked::after { animation: ak-checkmark-slide 0.2s var(--ease-ak-spring); }
2140
- .ak-radio:checked { animation: ak-radio-pop 0.25s var(--ease-ak-spring); }
2141
- }
2142
-
2143
- /* ============================================================================
2144
- Reduced Motion
2145
- ============================================================================ */
2146
-
2147
- @media (prefers-reduced-motion: reduce) {
2148
- *, *::before, *::after {
2149
- animation-duration: 0.01ms !important;
2150
- animation-iteration-count: 1 !important;
2151
- transition-duration: 0.01ms !important;
2152
- scroll-behavior: auto !important;
2153
- }
2154
- }
2155
-
1
+
2
+
3
+ /* ============================================================================
4
+ AstralKit — Form Primitives (forms.css)
5
+ ============================================================================
6
+
7
+ Extracted and deduplicated CSS from all 33 AstralKit form HTML components.
8
+ All hardcoded values replaced with AstralKit design tokens.
9
+
10
+ Covers:
11
+ 1. Buttons (.ak-btn and variants)
12
+ 2. Inputs (.ak-input and variants)
13
+ 3. Labels & Helpers (.ak-label, .ak-helper, .ak-error-msg, .ak-success-msg)
14
+ 4. Checkboxes & Radios (.ak-check, .ak-radio, .ak-card-radio)
15
+ 5. Toggle Switches (.ak-switch and variants)
16
+ 6. Toggle Groups (.ak-toggle-group and variants)
17
+ 7. Textareas (.ak-textarea and variants)
18
+ 8. Selects & Dropdowns (.ak-select, .ak-listbox, .ak-tag)
19
+ 9. Search (.ak-search and variants)
20
+ 10. Misc form elements (OTP, file upload, range, rating, quantity, password, strength)
21
+ 11. Dividers & Social (.ak-divider, .ak-social-icon, .ak-link)
22
+ 12. Spinner (.ak-spinner)
23
+
24
+ Token namespaces:
25
+ --color-ak-* Colors
26
+ --spacing-ak-* Spacing (8px grid)
27
+ --text-ak-* Font sizes
28
+ --radius-ak-* Border radius
29
+ --shadow-ak-* Box shadows
30
+ --duration-ak-* Transition durations
31
+ --ease-ak-* Easing functions
32
+ --height-ak-control-* Control heights
33
+ --size-ak-touch-min Minimum touch target
34
+
35
+ ============================================================================ */
36
+
37
+
38
+ /* ============================================================================
39
+ 1. BUTTONS
40
+ ============================================================================ */
41
+
42
+ /* --- Base Button --- */
43
+ .ak-btn {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ gap: var(--spacing-ak-1);
48
+ font-family: inherit;
49
+ font-size: var(--text-ak-base);
50
+ font-weight: 500;
51
+ line-height: 1;
52
+ min-height: var(--height-ak-control-md);
53
+ padding: var(--spacing-ak-1_5) var(--spacing-ak-2_5);
54
+ border-radius: var(--radius-ak-md);
55
+ border: 1px solid transparent;
56
+ cursor: pointer;
57
+ flex-shrink: 0;
58
+ transform: translateZ(0);
59
+ will-change: background-color, color;
60
+ backface-visibility: hidden;
61
+ -webkit-backface-visibility: hidden;
62
+ transition: background-color var(--duration-ak-base) var(--ease-ak-default),
63
+ color var(--duration-ak-base) var(--ease-ak-default),
64
+ border-color var(--duration-ak-base) var(--ease-ak-default);
65
+ }
66
+ .ak-btn:focus { outline: none; }
67
+ .ak-btn:focus-visible {
68
+ outline: 2px solid var(--color-ak-border-focus);
69
+ outline-offset: 2px;
70
+ }
71
+ .ak-btn:active:not(:disabled) {
72
+ transform: scale(0.97);
73
+ }
74
+ .ak-btn:disabled {
75
+ cursor: not-allowed;
76
+ }
77
+ .ak-btn i { font-size: 1.375rem; }
78
+
79
+ /* --- Button Variants --- */
80
+ .ak-btn--primary {
81
+ background: var(--ak-btn-bg, var(--color-ak-primary));
82
+ color: var(--ak-btn-color, var(--color-ak-on-primary));
83
+ }
84
+ .ak-btn--primary:hover { background: var(--ak-btn-hover-bg, var(--color-ak-primary-hover)); }
85
+
86
+ .ak-btn--outline {
87
+ background: var(--color-ak-bg);
88
+ border-color: var(--color-ak-border);
89
+ color: var(--color-ak-text);
90
+ }
91
+ .ak-btn--outline:hover { background: var(--color-ak-hover); }
92
+ .ak-btn--outline i { color: var(--color-ak-text-secondary); }
93
+
94
+ .ak-btn--ghost {
95
+ background: transparent;
96
+ color: var(--color-ak-text);
97
+ }
98
+ .ak-btn--ghost:hover { background: var(--color-ak-hover); }
99
+ .ak-btn--ghost i { color: var(--color-ak-text-secondary); }
100
+
101
+ .ak-btn--success {
102
+ background: var(--color-ak-success);
103
+ color: var(--color-ak-on-primary);
104
+ }
105
+ .ak-btn--success:hover { background: var(--color-ak-success-text); }
106
+
107
+ .ak-btn--danger {
108
+ background: var(--color-ak-danger);
109
+ color: var(--color-ak-on-primary);
110
+ }
111
+ .ak-btn--danger:hover { background: var(--color-ak-danger-text); }
112
+
113
+ .ak-btn--disabled {
114
+ background: var(--color-ak-surface-2);
115
+ color: var(--color-ak-text-disabled);
116
+ cursor: not-allowed;
117
+ }
118
+
119
+ .ak-btn--loading {
120
+ background: var(--color-ak-primary);
121
+ color: var(--color-ak-on-primary);
122
+ opacity: 0.7;
123
+ cursor: not-allowed;
124
+ }
125
+
126
+ /* --- Button Sizes --- */
127
+ .ak-btn--xs {
128
+ font-size: var(--text-ak-base);
129
+ min-height: var(--height-ak-control-md);
130
+ padding: var(--spacing-ak-1_5) var(--spacing-ak-2);
131
+ border-radius: var(--radius-ak-lg);
132
+ }
133
+ .ak-btn--xs i { font-size: var(--text-ak-lg); }
134
+
135
+ .ak-btn--sm {
136
+ font-size: var(--text-ak-base);
137
+ min-height: var(--height-ak-control-md);
138
+ padding: var(--spacing-ak-1_5) var(--spacing-ak-2_5);
139
+ border-radius: var(--radius-ak-lg);
140
+ }
141
+ .ak-btn--sm i { font-size: var(--text-ak-lg); }
142
+
143
+ .ak-btn--lg {
144
+ font-size: var(--text-ak-lg);
145
+ min-height: var(--height-ak-control-lg);
146
+ padding: var(--spacing-ak-2) var(--spacing-ak-4);
147
+ gap: var(--spacing-ak-1_5);
148
+ }
149
+ .ak-btn--lg i { font-size: 1.5rem; }
150
+
151
+ .ak-btn--xl {
152
+ font-size: var(--text-ak-xl);
153
+ font-weight: 600;
154
+ min-height: var(--height-ak-control-xl);
155
+ padding: var(--spacing-ak-2_5) var(--spacing-ak-5);
156
+ border-radius: var(--radius-ak-2xl);
157
+ gap: var(--spacing-ak-2);
158
+ }
159
+ .ak-btn--xl i { font-size: 1.875rem; }
160
+
161
+ .ak-btn--full {
162
+ width: 100%;
163
+ }
164
+ .ak-btn--full + .ak-btn--full {
165
+ margin-top: var(--spacing-ak-2);
166
+ }
167
+
168
+ /* --- Icon-Only Button --- */
169
+ .ak-btn--icon {
170
+ padding: 0;
171
+ min-width: var(--height-ak-control-md);
172
+ min-height: var(--height-ak-control-md);
173
+ width: var(--height-ak-control-md);
174
+ height: var(--height-ak-control-md);
175
+ }
176
+ .ak-btn--icon-circle {
177
+ padding: 0;
178
+ min-width: var(--height-ak-control-md);
179
+ min-height: var(--height-ak-control-md);
180
+ width: var(--height-ak-control-md);
181
+ height: var(--height-ak-control-md);
182
+ border-radius: var(--radius-ak-full);
183
+ }
184
+
185
+ /* --- Favorite Button --- */
186
+ .ak-btn--favorite {
187
+ padding: 0;
188
+ min-width: var(--height-ak-control-md);
189
+ min-height: var(--height-ak-control-md);
190
+ width: var(--height-ak-control-md);
191
+ height: var(--height-ak-control-md);
192
+ border-radius: var(--radius-ak-full);
193
+ background: var(--color-ak-elevated);
194
+ border-color: var(--color-ak-border);
195
+ transition: background-color var(--duration-ak-base) var(--ease-ak-spring),
196
+ transform var(--duration-ak-base) var(--ease-ak-spring),
197
+ border-color var(--duration-ak-base) var(--ease-ak-default);
198
+ -webkit-tap-highlight-color: transparent;
199
+ }
200
+ .ak-btn--favorite:hover {
201
+ background: var(--color-ak-danger);
202
+ border-color: var(--color-ak-danger);
203
+ }
204
+ .ak-btn--favorite:active { transform: scale(0.95); }
205
+ .ak-btn--favorite:focus,
206
+ .ak-btn--favorite:focus-visible {
207
+ outline: none;
208
+ box-shadow: none;
209
+ }
210
+ .ak-btn--favorite.is-active {
211
+ background: var(--color-ak-danger);
212
+ border-color: var(--color-ak-danger);
213
+ box-shadow: 0 0 0 4px rgba(220, 38, 38, 0.1);
214
+ }
215
+
216
+ /* --- Heart Icon --- */
217
+ .ak-heart {
218
+ width: 1.25rem;
219
+ height: 1.25rem;
220
+ color: var(--color-ak-text-secondary);
221
+ transition: transform var(--duration-ak-base) var(--ease-ak-spring),
222
+ color var(--duration-ak-base) var(--ease-ak-default);
223
+ }
224
+ .ak-btn--favorite:hover .ak-heart { color: #ffffff; }
225
+ .ak-btn--favorite.is-active .ak-heart { color: #ffffff; }
226
+
227
+ /* --- Button Group --- */
228
+ .ak-btn-group {
229
+ display: inline-flex;
230
+ border: 1px solid var(--color-ak-border);
231
+ border-radius: var(--radius-ak-md);
232
+ overflow: hidden;
233
+ align-self: flex-start;
234
+ }
235
+ .ak-btn-group--pill {
236
+ border-radius: var(--radius-ak-full);
237
+ }
238
+ .ak-btn-group--relative {
239
+ position: relative;
240
+ overflow: visible;
241
+ }
242
+ .ak-btn-group__row {
243
+ display: flex;
244
+ gap: var(--spacing-ak-2);
245
+ }
246
+
247
+ /* --- Group Button (text button inside group) --- */
248
+ .ak-group-btn {
249
+ display: flex;
250
+ align-items: center;
251
+ gap: var(--spacing-ak-1_5);
252
+ padding: var(--spacing-ak-1_5) var(--spacing-ak-4);
253
+ font-family: inherit;
254
+ font-size: var(--text-ak-base);
255
+ font-weight: 600;
256
+ line-height: 1;
257
+ min-height: var(--height-ak-control-md);
258
+ background: transparent;
259
+ border: none;
260
+ border-right: 1px solid var(--color-ak-border);
261
+ cursor: pointer;
262
+ transition: background-color 0.15s ease;
263
+ }
264
+ .ak-group-btn:last-child { border-right: none; }
265
+ .ak-group-btn:hover { background: var(--color-ak-hover); }
266
+ .ak-group-btn:focus { outline: none; }
267
+ .ak-group-btn:focus-visible {
268
+ outline: 2px solid var(--color-ak-border-focus);
269
+ outline-offset: -2px;
270
+ }
271
+ .ak-group-btn i { font-size: 1.25rem; }
272
+
273
+ .ak-group-btn.is-active {
274
+ background: var(--color-ak-primary);
275
+ color: var(--color-ak-on-primary);
276
+ }
277
+ .ak-group-btn.is-active:hover {
278
+ background: var(--color-ak-primary-hover);
279
+ }
280
+
281
+ /* --- Group Icon Button (48x48) --- */
282
+ .ak-group-icon {
283
+ display: flex;
284
+ align-items: center;
285
+ justify-content: center;
286
+ width: var(--height-ak-control-md);
287
+ height: var(--height-ak-control-md);
288
+ background: transparent;
289
+ border: none;
290
+ border-right: 1px solid var(--color-ak-border);
291
+ cursor: pointer;
292
+ font-family: inherit;
293
+ color: var(--color-ak-text);
294
+ transition: background-color 0.15s ease;
295
+ }
296
+ .ak-group-icon:last-child,
297
+ .ak-group-icon:last-of-type { border-right: none; }
298
+ .ak-group-icon:hover { background: var(--color-ak-hover); }
299
+ .ak-group-icon:focus { outline: none; }
300
+ .ak-group-icon:focus-visible {
301
+ outline: 2px solid var(--color-ak-border-focus);
302
+ outline-offset: -2px;
303
+ }
304
+ .ak-group-icon i { font-size: 1.25rem; }
305
+
306
+ .ak-group-icon.is-active {
307
+ background: var(--color-ak-primary);
308
+ color: var(--color-ak-on-primary);
309
+ }
310
+ .ak-group-icon.is-active:hover {
311
+ background: var(--color-ak-primary-hover);
312
+ }
313
+
314
+ /* --- Group Stat (non-interactive count) --- */
315
+ .ak-group-stat {
316
+ display: flex;
317
+ align-items: center;
318
+ padding: var(--spacing-ak-1_5) var(--spacing-ak-3);
319
+ font-size: var(--text-ak-base);
320
+ font-weight: 600;
321
+ min-height: var(--height-ak-control-md);
322
+ background: var(--color-ak-surface);
323
+ }
324
+
325
+ /* --- Group Link --- */
326
+ .ak-group-link {
327
+ display: flex;
328
+ align-items: center;
329
+ justify-content: center;
330
+ width: var(--height-ak-control-md);
331
+ min-height: var(--height-ak-control-md);
332
+ border-left: 1px solid var(--color-ak-border);
333
+ color: var(--color-ak-text);
334
+ text-decoration: none;
335
+ transition: background-color 0.15s ease;
336
+ }
337
+ .ak-group-link:hover { background: var(--color-ak-hover); }
338
+ .ak-group-link i { font-size: 1.25rem; }
339
+
340
+ /* --- Submit Button (login/signup forms) --- */
341
+ .ak-submit-btn {
342
+ display: flex;
343
+ align-items: center;
344
+ justify-content: center;
345
+ gap: var(--spacing-ak-1);
346
+ width: 100%;
347
+ min-height: var(--height-ak-control-md);
348
+ font-family: inherit;
349
+ font-size: var(--text-ak-base);
350
+ font-weight: 600;
351
+ background: var(--ak-submit-bg, var(--color-ak-primary));
352
+ color: var(--ak-submit-color, var(--color-ak-on-primary));
353
+ border: none;
354
+ border-radius: var(--radius-ak-input);
355
+ cursor: pointer;
356
+ transition: background-color var(--duration-ak-base) ease;
357
+ }
358
+ .ak-submit-btn:hover {
359
+ background: var(--ak-submit-hover-bg, var(--color-ak-primary-hover));
360
+ }
361
+ .ak-submit-btn:active:not(:disabled) {
362
+ transform: scale(0.98);
363
+ }
364
+ .ak-submit-btn:disabled {
365
+ opacity: 0.6;
366
+ cursor: not-allowed;
367
+ }
368
+
369
+ /* --- Social Login Button --- */
370
+ .ak-social-btn {
371
+ display: flex;
372
+ align-items: center;
373
+ justify-content: center;
374
+ gap: var(--spacing-ak-1_5);
375
+ width: 100%;
376
+ min-height: var(--height-ak-control-md);
377
+ font-family: inherit;
378
+ font-size: var(--text-ak-base);
379
+ font-weight: 500;
380
+ background: var(--color-ak-bg);
381
+ color: var(--color-ak-text);
382
+ border: 2px solid var(--color-ak-border-strong);
383
+ border-radius: var(--radius-ak-input);
384
+ cursor: pointer;
385
+ transition: background-color var(--duration-ak-base) ease,
386
+ border-color var(--duration-ak-base) ease;
387
+ }
388
+ .ak-social-btn:hover {
389
+ background: var(--color-ak-hover);
390
+ }
391
+ .ak-social-btn:active {
392
+ transform: scale(0.98);
393
+ }
394
+
395
+ /* --- Button Pill (signup form) --- */
396
+ .ak-btn-primary {
397
+ display: flex;
398
+ align-items: center;
399
+ justify-content: center;
400
+ gap: var(--spacing-ak-1);
401
+ width: 100%;
402
+ min-height: var(--height-ak-control-md);
403
+ font-family: inherit;
404
+ font-size: var(--text-ak-base);
405
+ font-weight: 600;
406
+ background: var(--color-ak-primary);
407
+ color: var(--color-ak-on-primary);
408
+ border: none;
409
+ border-radius: var(--radius-ak-input);
410
+ cursor: pointer;
411
+ transition: background-color var(--duration-ak-base) ease;
412
+ }
413
+ .ak-btn-primary:hover { background: var(--color-ak-primary-hover); }
414
+
415
+ .ak-btn-outline {
416
+ display: flex;
417
+ align-items: center;
418
+ justify-content: center;
419
+ gap: var(--spacing-ak-1_5);
420
+ width: 100%;
421
+ min-height: var(--height-ak-control-md);
422
+ font-family: inherit;
423
+ font-size: var(--text-ak-base);
424
+ font-weight: 500;
425
+ background: var(--color-ak-bg);
426
+ color: var(--color-ak-text);
427
+ border: 2px solid var(--color-ak-border-strong);
428
+ border-radius: var(--radius-ak-input);
429
+ cursor: pointer;
430
+ transition: background-color var(--duration-ak-base) ease;
431
+ }
432
+ .ak-btn-outline:hover { background: var(--color-ak-hover); }
433
+
434
+
435
+ /* ============================================================================
436
+ 2. INPUTS
437
+ ============================================================================ */
438
+
439
+ .ak-input {
440
+ width: 100%;
441
+ min-height: var(--ak-input-height, var(--height-ak-control-md));
442
+ font-family: inherit;
443
+ font-size: var(--text-ak-base);
444
+ color: var(--color-ak-text);
445
+ background: var(--ak-input-bg, var(--color-ak-bg));
446
+ border: 2px solid var(--ak-input-border, var(--color-ak-border-strong));
447
+ border-radius: var(--radius-ak-input);
448
+ padding: 0 var(--spacing-ak-2);
449
+ outline: none;
450
+ transition: border-color var(--duration-ak-base);
451
+ }
452
+ .ak-input::placeholder {
453
+ color: var(--color-ak-text-muted);
454
+ }
455
+ .ak-input:hover {
456
+ border-color: var(--color-ak-border-focus);
457
+ }
458
+ .ak-input:focus {
459
+ border-color: var(--color-ak-border-focus);
460
+ }
461
+ .ak-input:disabled {
462
+ opacity: 0.5;
463
+ cursor: not-allowed;
464
+ }
465
+
466
+ /* Readonly */
467
+ .ak-input-readonly {
468
+ background: var(--color-ak-surface-2);
469
+ cursor: default;
470
+ }
471
+
472
+ /* Error */
473
+ .ak-input-error {
474
+ border-color: var(--color-ak-danger) !important;
475
+ }
476
+ .ak-input-error:focus {
477
+ border-color: var(--color-ak-danger);
478
+ }
479
+ .ak-input-error:focus-visible {
480
+ box-shadow: 0 0 0 5px rgba(220, 38, 38, 0.08), 0 0 0 1px rgba(220, 38, 38, 0.2);
481
+ }
482
+
483
+ /* Success */
484
+ .ak-input-success {
485
+ border-color: var(--color-ak-success);
486
+ }
487
+ .ak-input-success:focus {
488
+ border-color: var(--color-ak-success);
489
+ }
490
+
491
+ /* Valid state (contact/newsletter) */
492
+ .ak-input-valid {
493
+ border-color: var(--color-ak-success) !important;
494
+ }
495
+ .ak-input-valid:focus-visible {
496
+ box-shadow: 0 0 0 5px rgba(22, 163, 74, 0.08), 0 0 0 1px rgba(22, 163, 74, 0.2);
497
+ }
498
+
499
+ /* Size variants */
500
+ .ak-input-sm {
501
+ min-height: var(--height-ak-control-sm);
502
+ font-size: var(--text-ak-sm);
503
+ padding: 0 14px;
504
+ }
505
+ .ak-input-lg {
506
+ min-height: var(--height-ak-control-lg);
507
+ font-size: var(--text-ak-lg);
508
+ padding: 0 18px;
509
+ }
510
+
511
+ /* Input group (prefix/suffix) */
512
+ .ak-input-group {
513
+ display: flex;
514
+ align-items: stretch;
515
+ }
516
+ .ak-input-prefix {
517
+ display: flex;
518
+ align-items: center;
519
+ font-family: inherit;
520
+ font-size: var(--text-ak-base);
521
+ color: var(--color-ak-text-secondary);
522
+ background: var(--color-ak-surface-2);
523
+ border: 2px solid var(--color-ak-border-strong);
524
+ border-right: none;
525
+ border-radius: var(--radius-ak-input) 0 0 var(--radius-ak-input);
526
+ padding: 0 var(--spacing-ak-1_5);
527
+ white-space: nowrap;
528
+ }
529
+ .ak-input-suffix {
530
+ display: flex;
531
+ align-items: center;
532
+ font-family: inherit;
533
+ font-size: var(--text-ak-base);
534
+ color: var(--color-ak-text-secondary);
535
+ background: var(--color-ak-surface-2);
536
+ border: 2px solid var(--color-ak-border-strong);
537
+ border-left: none;
538
+ border-radius: 0 var(--radius-ak-input) var(--radius-ak-input) 0;
539
+ padding: 0 var(--spacing-ak-1_5);
540
+ white-space: nowrap;
541
+ }
542
+ .ak-input-group .ak-input-has-prefix {
543
+ border-radius: 0 var(--radius-ak-input) var(--radius-ak-input) 0;
544
+ }
545
+ .ak-input-group .ak-input-has-suffix {
546
+ border-radius: var(--radius-ak-input) 0 0 var(--radius-ak-input);
547
+ }
548
+ .ak-input-group .ak-input-prefix.ak-focused {
549
+ border-color: var(--color-ak-border-focus);
550
+ }
551
+ .ak-input-group .ak-input-suffix.ak-focused {
552
+ border-color: var(--color-ak-border-focus);
553
+ }
554
+
555
+ /* Icon input wrapper */
556
+ .ak-input-icon-wrap {
557
+ position: relative;
558
+ }
559
+ .ak-input-icon-wrap .ak-input-has-icon-left {
560
+ padding-left: 44px;
561
+ }
562
+ .ak-input-icon-wrap .ak-input-has-icon-right {
563
+ padding-right: 44px;
564
+ }
565
+ .ak-input-icon-left {
566
+ position: absolute;
567
+ left: 14px;
568
+ top: 50%;
569
+ transform: translateY(-50%);
570
+ font-size: 20px;
571
+ color: var(--color-ak-text-muted);
572
+ pointer-events: none;
573
+ }
574
+ .ak-input-icon-right {
575
+ position: absolute;
576
+ right: 14px;
577
+ top: 50%;
578
+ transform: translateY(-50%);
579
+ font-size: 20px;
580
+ color: var(--color-ak-text-muted);
581
+ pointer-events: none;
582
+ }
583
+
584
+ /* Focus glow — use on inputs/textareas for the soft glow effect.
585
+ The canonical ak-focus-ring lives in focus.css (outline-based). */
586
+ .ak-focus-glow:focus-visible {
587
+ outline: none;
588
+ box-shadow: var(--shadow-ak-focus, 0 0 0 3px rgba(0, 0, 0, 0.08));
589
+ }
590
+ .ak-focus-glow-light:focus-visible {
591
+ outline: none;
592
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.15);
593
+ }
594
+
595
+ /* Input transition utility */
596
+ .ak-input-transition {
597
+ transition: box-shadow 0.25s var(--ease-ak-spring), border-color var(--duration-ak-base) ease;
598
+ }
599
+
600
+
601
+ /* ============================================================================
602
+ 3. LABELS & HELPERS
603
+ ============================================================================ */
604
+
605
+ .ak-label {
606
+ display: block;
607
+ font-size: var(--text-ak-sm);
608
+ font-weight: 600;
609
+ color: var(--color-ak-text);
610
+ margin-bottom: var(--spacing-ak-0_5);
611
+ }
612
+ .ak-label-required::after {
613
+ content: ' *';
614
+ color: var(--color-ak-danger);
615
+ }
616
+
617
+ .ak-helper {
618
+ font-size: var(--text-ak-sm);
619
+ color: var(--color-ak-text-muted);
620
+ margin-top: var(--spacing-ak-0_5);
621
+ }
622
+
623
+ .ak-error-msg {
624
+ font-size: var(--text-ak-sm);
625
+ color: var(--color-ak-danger-text);
626
+ margin-top: var(--spacing-ak-0_5);
627
+ display: flex;
628
+ align-items: center;
629
+ gap: 4px;
630
+ opacity: 0;
631
+ transform: translateY(-4px);
632
+ transition: opacity var(--duration-ak-base) ease, transform var(--duration-ak-base) ease;
633
+ }
634
+ .ak-error-msg.visible {
635
+ opacity: 1;
636
+ transform: translateY(0);
637
+ }
638
+ .ak-error-msg-icon {
639
+ font-size: 16px;
640
+ flex-shrink: 0;
641
+ }
642
+
643
+ .ak-success-msg {
644
+ font-size: var(--text-ak-sm);
645
+ color: var(--color-ak-success-text);
646
+ margin-top: var(--spacing-ak-0_5);
647
+ display: flex;
648
+ align-items: center;
649
+ gap: 4px;
650
+ }
651
+ .ak-success-msg-icon {
652
+ font-size: 16px;
653
+ flex-shrink: 0;
654
+ }
655
+
656
+
657
+ /* ============================================================================
658
+ 4. CHECKBOXES & RADIOS
659
+ ============================================================================ */
660
+
661
+ /* --- Checkbox ---
662
+ 24x24 minimum to meet WCAG 2.5.8 AA target size. */
663
+ .ak-check {
664
+ appearance: none;
665
+ width: 24px;
666
+ height: 24px;
667
+ border: 2px solid var(--ak-check-border, var(--color-ak-border-strong));
668
+ border-radius: 6px;
669
+ cursor: pointer;
670
+ position: relative;
671
+ transition: all var(--duration-ak-base) var(--ease-ak-spring);
672
+ flex-shrink: 0;
673
+ }
674
+ .ak-check:hover {
675
+ border-color: var(--color-ak-primary);
676
+ }
677
+ .ak-check:checked {
678
+ background: var(--ak-check-checked-bg, var(--color-ak-primary));
679
+ border-color: var(--color-ak-primary);
680
+ }
681
+ .ak-check:checked::after {
682
+ /* Checkmark offsets re-centered for the larger box (was left:6 top:2 in 22px). */
683
+ content: '';
684
+ position: absolute;
685
+ left: 7px;
686
+ top: 3px;
687
+ width: 6px;
688
+ height: 11px;
689
+ border: solid var(--color-ak-on-primary);
690
+ border-width: 0 2.5px 2.5px 0;
691
+ transform: rotate(45deg);
692
+ }
693
+ .ak-check:focus-visible {
694
+ outline: none;
695
+ box-shadow: var(--shadow-ak-focus, 0 0 0 3px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.15));
696
+ }
697
+ .ak-check:disabled {
698
+ cursor: not-allowed;
699
+ opacity: 0.5;
700
+ }
701
+
702
+ /* --- Radio ---
703
+ 24x24 minimum to meet WCAG 2.5.8 AA target size.
704
+ Inner dot auto-centers via translate(-50%,-50%). */
705
+ .ak-radio {
706
+ appearance: none;
707
+ width: 24px;
708
+ height: 24px;
709
+ border: 2px solid var(--ak-radio-border, var(--color-ak-border-strong));
710
+ border-radius: 50%;
711
+ cursor: pointer;
712
+ position: relative;
713
+ transition: all var(--duration-ak-base) var(--ease-ak-spring);
714
+ flex-shrink: 0;
715
+ background: var(--color-ak-bg);
716
+ }
717
+ .ak-radio:hover {
718
+ border-color: var(--color-ak-primary);
719
+ }
720
+ .ak-radio:checked {
721
+ border-color: var(--color-ak-primary);
722
+ background: var(--color-ak-primary);
723
+ }
724
+ .ak-radio:checked::after {
725
+ content: '';
726
+ position: absolute;
727
+ top: 50%;
728
+ left: 50%;
729
+ transform: translate(-50%, -50%);
730
+ width: 8px;
731
+ height: 8px;
732
+ border-radius: 50%;
733
+ background: var(--color-ak-on-primary);
734
+ }
735
+ .ak-radio:focus-visible {
736
+ outline: none;
737
+ box-shadow: var(--shadow-ak-focus, 0 0 0 3px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.15));
738
+ }
739
+
740
+ /* --- Card Radio --- */
741
+ .ak-card-radio {
742
+ position: relative;
743
+ }
744
+ .ak-card-radio:has(:checked) {
745
+ border-left: 4px solid var(--color-ak-primary);
746
+ padding-left: calc(var(--spacing-ak-3) - 3px);
747
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.04);
748
+ background: rgba(0, 0, 0, 0.005);
749
+ }
750
+
751
+
752
+ /* ============================================================================
753
+ 5. TOGGLE SWITCHES
754
+ ============================================================================ */
755
+
756
+ .ak-switch {
757
+ display: inline-flex;
758
+ align-items: center;
759
+ justify-content: center;
760
+ background: none;
761
+ border: none;
762
+ padding: 8px 0;
763
+ cursor: pointer;
764
+ border-radius: var(--radius-ak-full);
765
+ flex-shrink: 0;
766
+ min-height: var(--size-ak-touch-min);
767
+ }
768
+ .ak-switch:focus-visible { outline: none; }
769
+ .ak-switch:focus-visible .ak-switch-track {
770
+ outline: 2px solid var(--color-ak-border-focus);
771
+ outline-offset: 2px;
772
+ }
773
+ .ak-switch:disabled {
774
+ opacity: 0.5;
775
+ cursor: not-allowed;
776
+ }
777
+
778
+ /* Track (pill) */
779
+ .ak-switch-track {
780
+ position: relative;
781
+ width: 52px;
782
+ height: 28px;
783
+ background: var(--ak-switch-off, #7b8394);
784
+ border-radius: var(--radius-ak-full);
785
+ transition: background-color var(--duration-ak-base);
786
+ }
787
+ .ak-switch[aria-checked="true"] .ak-switch-track {
788
+ background: var(--ak-switch-on, var(--color-ak-primary));
789
+ }
790
+
791
+ /* Knob */
792
+ .ak-switch-knob {
793
+ position: absolute;
794
+ top: 3px;
795
+ left: 3px;
796
+ width: 22px;
797
+ height: 22px;
798
+ background: #ffffff;
799
+ border-radius: 50%;
800
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
801
+ transition: transform var(--duration-ak-base);
802
+ }
803
+ .ak-switch[aria-checked="true"] .ak-switch-knob {
804
+ transform: translateX(24px);
805
+ }
806
+
807
+ /* Color-coded track variants */
808
+ .ak-switch-success[aria-checked="true"] .ak-switch-track {
809
+ background: var(--color-ak-success);
810
+ }
811
+ .ak-switch-danger[aria-checked="true"] .ak-switch-track {
812
+ background: var(--color-ak-danger);
813
+ }
814
+
815
+ /* Size: Small */
816
+ .ak-switch-sm .ak-switch-track {
817
+ width: 40px;
818
+ height: 22px;
819
+ }
820
+ .ak-switch-sm .ak-switch-knob {
821
+ width: 16px;
822
+ height: 16px;
823
+ }
824
+ .ak-switch-sm[aria-checked="true"] .ak-switch-knob {
825
+ transform: translateX(18px);
826
+ }
827
+
828
+ /* Size: Large */
829
+ .ak-switch-lg .ak-switch-track {
830
+ width: 64px;
831
+ height: 34px;
832
+ }
833
+ .ak-switch-lg .ak-switch-knob {
834
+ width: 28px;
835
+ height: 28px;
836
+ }
837
+ .ak-switch-lg[aria-checked="true"] .ak-switch-knob {
838
+ transform: translateX(30px);
839
+ }
840
+
841
+ /* Track icons */
842
+ .ak-switch-track-icon {
843
+ position: absolute;
844
+ top: 50%;
845
+ transform: translateY(-50%);
846
+ font-size: 14px;
847
+ line-height: 1;
848
+ color: rgba(255, 255, 255, 0.5);
849
+ pointer-events: none;
850
+ }
851
+ .ak-switch-with-icons .ak-switch-track-icon { right: 8px; }
852
+ .ak-switch-with-icons[aria-checked="true"] .ak-switch-track-icon { left: 8px; right: auto; }
853
+
854
+ /* Knob icon */
855
+ .ak-switch-knob-icon {
856
+ position: absolute;
857
+ top: 50%;
858
+ left: 50%;
859
+ transform: translate(-50%, -50%);
860
+ font-size: 12px;
861
+ color: var(--color-ak-text-muted);
862
+ pointer-events: none;
863
+ }
864
+
865
+ /* With icons track/knob overrides */
866
+ .ak-switch-with-icons .ak-switch-track { width: 56px; height: 30px; }
867
+ .ak-switch-with-icons .ak-switch-knob { width: 24px; height: 24px; }
868
+ .ak-switch-with-icons[aria-checked="true"] .ak-switch-knob { transform: translateX(26px); }
869
+
870
+ /* Field layout */
871
+ .ak-switch-field {
872
+ display: flex;
873
+ align-items: center;
874
+ justify-content: space-between;
875
+ gap: var(--spacing-ak-1_5);
876
+ min-height: var(--size-ak-touch-min);
877
+ }
878
+ .ak-switch-field-reversed {
879
+ flex-direction: row-reverse;
880
+ justify-content: flex-end;
881
+ }
882
+
883
+ .ak-switch-label-wrap {
884
+ display: flex;
885
+ flex-direction: column;
886
+ gap: 2px;
887
+ cursor: pointer;
888
+ }
889
+ .ak-switch-field:has(.ak-switch:disabled) .ak-switch-label-wrap {
890
+ cursor: default;
891
+ }
892
+
893
+ .ak-switch-label {
894
+ font-size: var(--text-ak-base);
895
+ font-weight: 500;
896
+ color: var(--color-ak-text);
897
+ display: flex;
898
+ align-items: center;
899
+ gap: var(--spacing-ak-1);
900
+ }
901
+ .ak-switch-helper {
902
+ font-size: var(--text-ak-sm);
903
+ color: var(--color-ak-text-muted);
904
+ }
905
+ .ak-switch-label-icon {
906
+ font-size: 20px;
907
+ color: var(--color-ak-text-muted);
908
+ line-height: 1;
909
+ flex-shrink: 0;
910
+ }
911
+ .ak-switch-status {
912
+ font-size: var(--text-ak-sm);
913
+ color: var(--color-ak-text-muted);
914
+ }
915
+
916
+ /* Switch group */
917
+ .ak-switch-group {
918
+ display: flex;
919
+ flex-direction: column;
920
+ gap: 0;
921
+ }
922
+ .ak-switch-group-legend {
923
+ font-size: var(--text-ak-base);
924
+ font-weight: 600;
925
+ color: var(--color-ak-text);
926
+ margin-bottom: var(--spacing-ak-1);
927
+ }
928
+
929
+
930
+ /* ============================================================================
931
+ 6. TOGGLE GROUPS
932
+ ============================================================================ */
933
+
934
+ .ak-toggle-group {
935
+ display: inline-flex;
936
+ background: var(--ak-toggle-group-bg, var(--color-ak-surface-2));
937
+ border-radius: var(--radius-ak-input);
938
+ padding: 4px;
939
+ gap: 4px;
940
+ }
941
+
942
+ .ak-toggle-group-item {
943
+ display: inline-flex;
944
+ align-items: center;
945
+ justify-content: center;
946
+ gap: 6px;
947
+ background: none;
948
+ border: none;
949
+ padding: 0 var(--spacing-ak-2);
950
+ min-height: var(--size-ak-touch-min);
951
+ font-family: inherit;
952
+ font-size: var(--text-ak-base);
953
+ font-weight: 500;
954
+ color: var(--color-ak-text-secondary);
955
+ border-radius: 8px;
956
+ cursor: pointer;
957
+ transition: background-color var(--duration-ak-base), color var(--duration-ak-base), box-shadow var(--duration-ak-base);
958
+ white-space: nowrap;
959
+ line-height: 1;
960
+ }
961
+
962
+ /* Active state */
963
+ .ak-toggle-group-item[aria-checked="true"],
964
+ .ak-toggle-group-item[aria-pressed="true"] {
965
+ background: var(--color-ak-bg);
966
+ color: var(--color-ak-text);
967
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
968
+ }
969
+
970
+ /* Hover (inactive only) */
971
+ .ak-toggle-group-item[aria-checked="false"]:not(:disabled):hover,
972
+ .ak-toggle-group-item[aria-pressed="false"]:not(:disabled):hover {
973
+ color: var(--color-ak-text);
974
+ background: var(--color-ak-hover);
975
+ }
976
+
977
+ .ak-toggle-group-item:focus { outline: none; }
978
+ .ak-toggle-group-item:focus-visible {
979
+ outline: 2px solid var(--color-ak-border-focus);
980
+ outline-offset: 2px;
981
+ }
982
+
983
+ .ak-toggle-group-item:disabled {
984
+ opacity: 0.4;
985
+ cursor: not-allowed;
986
+ }
987
+
988
+ .ak-toggle-group[aria-disabled="true"] { opacity: 0.5; }
989
+ .ak-toggle-group[aria-disabled="true"] .ak-toggle-group-item { cursor: not-allowed; }
990
+
991
+ .ak-toggle-group-item i { font-size: 20px; line-height: 1; }
992
+ .ak-toggle-group-item-icon { padding: 0 14px; }
993
+
994
+ /* Size: Small */
995
+ .ak-toggle-group-sm { padding: 3px; gap: 3px; border-radius: 8px; }
996
+ .ak-toggle-group-sm .ak-toggle-group-item { min-height: var(--size-ak-touch-min); padding: 0 12px; font-size: var(--text-ak-sm); border-radius: 6px; }
997
+ .ak-toggle-group-sm .ak-toggle-group-item i { font-size: 18px; }
998
+ .ak-toggle-group-sm .ak-toggle-group-item-icon { padding: 0 12px; }
999
+
1000
+ /* Size: Large */
1001
+ .ak-toggle-group-lg { padding: 5px; gap: 5px; border-radius: var(--radius-ak-lg); }
1002
+ .ak-toggle-group-lg .ak-toggle-group-item { min-height: 52px; padding: 0 24px; font-size: var(--text-ak-lg); border-radius: var(--radius-ak-input); }
1003
+ .ak-toggle-group-lg .ak-toggle-group-item i { font-size: 24px; }
1004
+ .ak-toggle-group-lg .ak-toggle-group-item-icon { padding: 0 18px; }
1005
+
1006
+ /* Outline variant */
1007
+ .ak-toggle-group-outline { background: none; padding: 0; gap: 0; border: 2px solid var(--color-ak-border); border-radius: var(--radius-ak-input); overflow: hidden; }
1008
+ .ak-toggle-group-outline .ak-toggle-group-item { border-radius: 0; border-right: 1px solid var(--color-ak-border); }
1009
+ .ak-toggle-group-outline .ak-toggle-group-item:last-child { border-right: none; }
1010
+ .ak-toggle-group-outline .ak-toggle-group-item[aria-checked="true"],
1011
+ .ak-toggle-group-outline .ak-toggle-group-item[aria-pressed="true"] { background: var(--color-ak-primary); color: var(--color-ak-on-primary); box-shadow: none; }
1012
+ .ak-toggle-group-outline .ak-toggle-group-item[aria-checked="false"]:not(:disabled):hover,
1013
+ .ak-toggle-group-outline .ak-toggle-group-item[aria-pressed="false"]:not(:disabled):hover { background: var(--color-ak-hover); }
1014
+
1015
+
1016
+ /* ============================================================================
1017
+ 7. TEXTAREAS
1018
+ ============================================================================ */
1019
+
1020
+ .ak-textarea {
1021
+ width: 100%;
1022
+ min-height: 140px;
1023
+ font-family: inherit;
1024
+ font-size: var(--text-ak-base);
1025
+ line-height: 1.5;
1026
+ color: var(--color-ak-text);
1027
+ background: var(--ak-textarea-bg, var(--color-ak-bg));
1028
+ border: 2px solid var(--ak-textarea-border, var(--color-ak-border-strong));
1029
+ border-radius: var(--radius-ak-input);
1030
+ padding: 12px var(--spacing-ak-2);
1031
+ outline: none;
1032
+ resize: vertical;
1033
+ transition: border-color var(--duration-ak-base);
1034
+ }
1035
+ .ak-textarea::placeholder { color: var(--color-ak-text-muted); }
1036
+ .ak-textarea:focus { border-color: var(--color-ak-border-focus); }
1037
+ .ak-textarea:disabled { opacity: 0.5; cursor: not-allowed; }
1038
+
1039
+ .ak-textarea-no-resize { resize: none; }
1040
+ .ak-textarea-readonly { background: var(--color-ak-surface-2); cursor: default; }
1041
+ .ak-textarea-error { border-color: var(--color-ak-danger); }
1042
+ .ak-textarea-error:focus { border-color: var(--color-ak-danger); }
1043
+ .ak-textarea-success { border-color: var(--color-ak-success); }
1044
+ .ak-textarea-success:focus { border-color: var(--color-ak-success); }
1045
+
1046
+ /* Size variants */
1047
+ .ak-textarea-sm { min-height: 100px; font-size: var(--text-ak-sm); padding: 10px 14px; }
1048
+ .ak-textarea-lg { min-height: 200px; font-size: var(--text-ak-lg); padding: 14px 18px; }
1049
+
1050
+ /* Auto-resize wrapper */
1051
+ .ak-textarea-auto-wrap { display: grid; }
1052
+ .ak-textarea-auto-wrap::after {
1053
+ content: attr(data-ak-replicated-value) ' ';
1054
+ white-space: pre-wrap;
1055
+ visibility: hidden;
1056
+ font-family: inherit;
1057
+ font-size: var(--text-ak-base);
1058
+ line-height: 1.5;
1059
+ padding: 12px var(--spacing-ak-2);
1060
+ border: 2px solid transparent;
1061
+ grid-area: 1 / 1 / 2 / 2;
1062
+ }
1063
+ .ak-textarea-auto-wrap > .ak-textarea {
1064
+ grid-area: 1 / 1 / 2 / 2;
1065
+ min-height: var(--height-ak-control-md);
1066
+ overflow: hidden;
1067
+ }
1068
+
1069
+ /* Character count */
1070
+ .ak-char-count { font-size: var(--text-ak-sm); color: var(--color-ak-text-muted); margin-top: var(--spacing-ak-0_5); text-align: right; }
1071
+ .ak-char-count-warn { color: var(--color-ak-warning-text); }
1072
+ .ak-char-count-danger { color: var(--color-ak-danger-text); }
1073
+
1074
+ /* Composite textarea wrapper */
1075
+ .ak-textarea-composite { border: 2px solid var(--color-ak-border-strong); border-radius: var(--radius-ak-input); overflow: hidden; transition: border-color var(--duration-ak-base); }
1076
+ .ak-textarea-composite.ak-focused { border-color: var(--color-ak-border-focus); }
1077
+ .ak-textarea-composite .ak-textarea { border: none; border-radius: 0; min-height: 100px; }
1078
+ .ak-textarea-composite .ak-textarea:focus { border-color: transparent; }
1079
+ .ak-textarea-composite .ak-textarea-auto-wrap::after { border: none; }
1080
+
1081
+ /* Composite footer */
1082
+ .ak-textarea-footer { display: flex; align-items: center; justify-content: space-between; padding: var(--spacing-ak-1) var(--spacing-ak-1_5); border-top: 1px solid var(--color-ak-border); gap: var(--spacing-ak-1); }
1083
+ .ak-textarea-footer .ak-char-count { margin-top: 0; text-align: left; flex-shrink: 0; }
1084
+
1085
+ /* Toolbar */
1086
+ .ak-textarea-toolbar { display: flex; align-items: center; gap: 2px; }
1087
+ .ak-textarea-toolbar-btn {
1088
+ width: var(--size-ak-touch-min);
1089
+ height: var(--size-ak-touch-min);
1090
+ display: flex;
1091
+ align-items: center;
1092
+ justify-content: center;
1093
+ background: none;
1094
+ border: none;
1095
+ color: var(--color-ak-text-muted);
1096
+ cursor: pointer;
1097
+ border-radius: 8px;
1098
+ transition: color 0.15s, background-color 0.15s;
1099
+ font-size: 20px;
1100
+ }
1101
+ .ak-textarea-toolbar-btn:hover { color: var(--color-ak-text); background: var(--color-ak-active); }
1102
+ .ak-textarea-toolbar-btn:focus { outline: 2px solid var(--color-ak-border-focus); outline-offset: -2px; }
1103
+
1104
+ /* Send button */
1105
+ .ak-textarea-send-btn {
1106
+ height: var(--size-ak-touch-min);
1107
+ display: flex;
1108
+ align-items: center;
1109
+ justify-content: center;
1110
+ gap: 6px;
1111
+ font-family: inherit;
1112
+ font-size: var(--text-ak-sm);
1113
+ font-weight: 600;
1114
+ background: var(--color-ak-primary);
1115
+ color: var(--color-ak-on-primary);
1116
+ border: none;
1117
+ border-radius: 8px;
1118
+ padding: 0 var(--spacing-ak-2);
1119
+ cursor: pointer;
1120
+ transition: background-color var(--duration-ak-base);
1121
+ }
1122
+ .ak-textarea-send-btn:hover { background: var(--color-ak-primary-hover); }
1123
+
1124
+
1125
+ /* ============================================================================
1126
+ 8. SELECTS & DROPDOWNS
1127
+ ============================================================================ */
1128
+
1129
+ /* --- Native Select Wrapper --- */
1130
+ .ak-select-wrap { position: relative; }
1131
+
1132
+ .ak-select {
1133
+ width: 100%;
1134
+ min-height: var(--ak-select-height, var(--height-ak-control-md));
1135
+ font-family: inherit;
1136
+ font-size: var(--text-ak-base);
1137
+ color: var(--color-ak-text);
1138
+ background: var(--color-ak-bg);
1139
+ border: 2px solid var(--ak-select-border, var(--color-ak-border-strong));
1140
+ border-radius: var(--radius-ak-input);
1141
+ padding: 0 44px 0 var(--spacing-ak-2);
1142
+ appearance: none;
1143
+ -webkit-appearance: none;
1144
+ cursor: pointer;
1145
+ outline: none;
1146
+ transition: border-color var(--duration-ak-base), box-shadow var(--duration-ak-base);
1147
+ }
1148
+ .ak-select:focus { border-color: var(--color-ak-border-focus); }
1149
+ .ak-select:disabled { opacity: 0.5; cursor: not-allowed; }
1150
+
1151
+ .ak-select-chevron {
1152
+ position: absolute;
1153
+ right: 14px;
1154
+ top: 50%;
1155
+ transform: translateY(-50%);
1156
+ pointer-events: none;
1157
+ font-size: 18px;
1158
+ color: var(--color-ak-text-muted);
1159
+ }
1160
+
1161
+ /* Size Variants */
1162
+ .ak-select.ak-select-sm { min-height: var(--height-ak-control-sm); font-size: var(--text-ak-sm); padding: 0 40px 0 14px; border-radius: 8px; }
1163
+ .ak-select.ak-select-lg { min-height: var(--height-ak-control-lg); font-size: var(--text-ak-lg); padding: 0 48px 0 18px; border-radius: var(--radius-ak-lg); }
1164
+
1165
+ /* Error / Success */
1166
+ .ak-select.ak-select-error { border-color: var(--color-ak-danger); }
1167
+ .ak-select.ak-select-error:focus { border-color: var(--color-ak-danger); }
1168
+ .ak-select.ak-select-success { border-color: var(--color-ak-success); }
1169
+ .ak-select.ak-select-success:focus { border-color: var(--color-ak-success); }
1170
+
1171
+ /* --- Custom Select (Combobox / Listbox) --- */
1172
+ .ak-custom-select { position: relative; }
1173
+
1174
+ .ak-select-trigger {
1175
+ display: flex;
1176
+ align-items: center;
1177
+ justify-content: space-between;
1178
+ width: 100%;
1179
+ min-height: var(--height-ak-control-md);
1180
+ font-family: inherit;
1181
+ font-size: var(--text-ak-base);
1182
+ color: var(--color-ak-text);
1183
+ background: var(--color-ak-bg);
1184
+ border: 2px solid var(--color-ak-border-strong);
1185
+ border-radius: var(--radius-ak-input);
1186
+ padding: 0 14px;
1187
+ cursor: pointer;
1188
+ outline: none;
1189
+ transition: border-color var(--duration-ak-base);
1190
+ text-align: left;
1191
+ }
1192
+ .ak-select-trigger:focus { border-color: var(--color-ak-border-focus); }
1193
+ .ak-select-trigger[aria-expanded="true"] .ak-trigger-chevron { transform: rotate(180deg); }
1194
+
1195
+ .ak-trigger-chevron { font-size: 18px; color: var(--color-ak-text-muted); transition: transform var(--duration-ak-base); flex-shrink: 0; }
1196
+ .ak-select-placeholder { color: var(--color-ak-text-muted); }
1197
+
1198
+ /* --- Listbox Dropdown --- */
1199
+ .ak-listbox {
1200
+ position: absolute;
1201
+ top: calc(100% + 4px);
1202
+ left: 0;
1203
+ right: 0;
1204
+ background: var(--color-ak-elevated);
1205
+ border: 2px solid var(--color-ak-border-strong);
1206
+ border-radius: var(--radius-ak-input);
1207
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08), 0 4px 8px rgba(0, 0, 0, 0.04);
1208
+ max-height: 280px;
1209
+ overflow-y: auto;
1210
+ z-index: var(--z-ak-dropdown, 1000);
1211
+ padding: 4px;
1212
+ display: none;
1213
+ }
1214
+ .ak-listbox.ak-open { display: block; }
1215
+
1216
+ .ak-listbox-option {
1217
+ display: flex;
1218
+ align-items: center;
1219
+ min-height: var(--size-ak-touch-min);
1220
+ padding: 0 12px;
1221
+ font-size: var(--text-ak-base);
1222
+ color: var(--color-ak-text);
1223
+ border-radius: 8px;
1224
+ cursor: pointer;
1225
+ transition: background-color 0.15s;
1226
+ }
1227
+ .ak-listbox-option:hover { background: var(--color-ak-hover); }
1228
+ .ak-listbox-option.ak-active { background: var(--color-ak-active); }
1229
+ .ak-listbox-option[aria-selected="true"] { font-weight: 600; }
1230
+ .ak-listbox-option[aria-selected="true"]::after {
1231
+ content: '';
1232
+ display: inline-block;
1233
+ width: 18px;
1234
+ height: 18px;
1235
+ margin-left: auto;
1236
+ background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23171717' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E") no-repeat center;
1237
+ background-size: contain;
1238
+ flex-shrink: 0;
1239
+ }
1240
+
1241
+ .ak-listbox-group-label {
1242
+ padding: 8px 12px 4px;
1243
+ font-size: var(--text-ak-xs);
1244
+ font-weight: 700;
1245
+ color: var(--color-ak-text-muted);
1246
+ text-transform: uppercase;
1247
+ letter-spacing: 0.05em;
1248
+ }
1249
+ .ak-listbox-divider { height: 1px; background: var(--color-ak-border); margin: 4px 0; }
1250
+ .ak-listbox-no-results { padding: 12px; font-size: var(--text-ak-sm); color: var(--color-ak-text-muted); text-align: center; }
1251
+
1252
+ /* --- Multi-Select Tags --- */
1253
+ .ak-tag-container {
1254
+ display: flex;
1255
+ flex-wrap: wrap;
1256
+ gap: 6px;
1257
+ align-items: center;
1258
+ min-height: var(--height-ak-control-md);
1259
+ border: 2px solid var(--color-ak-border-strong);
1260
+ border-radius: var(--radius-ak-input);
1261
+ padding: 6px 12px;
1262
+ transition: border-color var(--duration-ak-base);
1263
+ cursor: text;
1264
+ }
1265
+ .ak-tag-container:focus-within { border-color: var(--color-ak-border-focus); }
1266
+
1267
+ .ak-tag {
1268
+ display: inline-flex;
1269
+ align-items: center;
1270
+ gap: 4px;
1271
+ height: 32px;
1272
+ padding: 0 var(--spacing-ak-1) 0 var(--spacing-ak-1_5);
1273
+ font-size: var(--text-ak-sm);
1274
+ color: var(--color-ak-text-secondary);
1275
+ background: var(--color-ak-surface-2);
1276
+ border-radius: 6px;
1277
+ }
1278
+ .ak-tag-remove {
1279
+ display: inline-flex;
1280
+ align-items: center;
1281
+ justify-content: center;
1282
+ width: 20px;
1283
+ height: 20px;
1284
+ border: none;
1285
+ background: none;
1286
+ color: var(--color-ak-text-muted);
1287
+ border-radius: 4px;
1288
+ cursor: pointer;
1289
+ font-size: 14px;
1290
+ transition: color 0.15s, background 0.15s;
1291
+ }
1292
+ .ak-tag-remove:hover { color: var(--color-ak-text); background: var(--color-ak-active); }
1293
+
1294
+ /* --- Dropdown Menu --- */
1295
+ .ak-dropdown {
1296
+ position: absolute;
1297
+ top: 100%;
1298
+ right: 0;
1299
+ margin-top: 0.25rem;
1300
+ background: #ffffff;
1301
+ border: 1px solid var(--color-ak-border);
1302
+ border-radius: var(--radius-ak-md);
1303
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08), 0 4px 8px rgba(0, 0, 0, 0.04);
1304
+ min-width: 200px;
1305
+ z-index: var(--z-ak-dropdown, 1000);
1306
+ overflow: hidden;
1307
+ opacity: 0;
1308
+ transform: translateY(-8px) scale(0.96);
1309
+ transition: opacity 0.15s cubic-bezier(0.16, 1, 0.3, 1),
1310
+ transform 0.15s cubic-bezier(0.16, 1, 0.3, 1);
1311
+ pointer-events: none;
1312
+ }
1313
+ .ak-dropdown.is-open { opacity: 1; transform: translateY(0) scale(1); pointer-events: auto; }
1314
+ .ak-dropdown.is-hidden { display: none; }
1315
+
1316
+ .ak-dropdown__item {
1317
+ display: flex;
1318
+ align-items: center;
1319
+ gap: var(--spacing-ak-2);
1320
+ width: 100%;
1321
+ padding: var(--spacing-ak-1_5) var(--spacing-ak-4);
1322
+ font-family: inherit;
1323
+ font-size: var(--text-ak-base);
1324
+ font-weight: 400;
1325
+ text-align: left;
1326
+ background: transparent;
1327
+ border: none;
1328
+ cursor: pointer;
1329
+ color: var(--color-ak-text);
1330
+ transition: background-color 0.1s ease;
1331
+ }
1332
+ .ak-dropdown__item:hover { background: var(--color-ak-hover); }
1333
+ .ak-dropdown__item:focus { outline: none; background: var(--color-ak-hover); }
1334
+ .ak-dropdown__item i { font-size: var(--text-ak-lg); }
1335
+ .ak-dropdown__item--danger { color: var(--color-ak-danger-text); }
1336
+ .ak-dropdown__divider { border-top: 1px solid var(--color-ak-border); margin: 0.25rem 0; }
1337
+
1338
+
1339
+ /* ============================================================================
1340
+ 9. SEARCH
1341
+ ============================================================================ */
1342
+
1343
+ .ak-search-input {
1344
+ width: 100%;
1345
+ min-height: var(--ak-search-height, var(--height-ak-control-md));
1346
+ font-size: var(--text-ak-base);
1347
+ font-family: inherit;
1348
+ color: var(--color-ak-text);
1349
+ background: var(--ak-search-bg, var(--color-ak-bg));
1350
+ border: 2px solid var(--ak-search-border, var(--color-ak-border));
1351
+ border-radius: var(--radius-ak-input);
1352
+ padding: 0 48px 0 44px;
1353
+ outline: none;
1354
+ transition: border-color 0.15s;
1355
+ }
1356
+ .ak-search-input::placeholder { color: var(--color-ak-text-muted); }
1357
+ .ak-search-input::-webkit-search-cancel-button,
1358
+ .ak-search-input::-webkit-search-decoration { -webkit-appearance: none; appearance: none; }
1359
+ .ak-search-input:focus { border-color: var(--color-ak-border-focus); }
1360
+ .ak-search-input:disabled { opacity: 0.5; cursor: not-allowed; }
1361
+
1362
+ /* Error */
1363
+ .ak-search-input.ak-search-error { border-color: var(--color-ak-danger); }
1364
+ .ak-search-input.ak-search-error:focus { border-color: var(--color-ak-danger); }
1365
+
1366
+ /* Size: small */
1367
+ .ak-search-input.ak-search-sm { min-height: var(--height-ak-control-sm); font-size: var(--text-ak-sm); padding: 0 40px 0 38px; border-radius: 8px; }
1368
+
1369
+ /* Size: large */
1370
+ .ak-search-input.ak-search-lg { min-height: var(--height-ak-control-lg); font-size: var(--text-ak-lg); padding: 0 56px 0 50px; border-radius: var(--radius-ak-lg); }
1371
+
1372
+ /* Search Icon */
1373
+ .ak-search-icon {
1374
+ position: absolute;
1375
+ left: 14px;
1376
+ top: 50%;
1377
+ transform: translateY(-50%);
1378
+ color: var(--color-ak-text-muted);
1379
+ pointer-events: none;
1380
+ font-size: 20px;
1381
+ }
1382
+ .ak-search-icon.ak-icon-sm { left: 12px; font-size: 18px; }
1383
+ .ak-search-icon.ak-icon-lg { left: 16px; font-size: 22px; }
1384
+
1385
+ /* Clear Button */
1386
+ .ak-search-clear {
1387
+ position: absolute;
1388
+ right: 4px;
1389
+ top: 50%;
1390
+ transform: translateY(-50%);
1391
+ display: none;
1392
+ align-items: center;
1393
+ justify-content: center;
1394
+ width: 40px;
1395
+ height: 40px;
1396
+ border: none;
1397
+ background: none;
1398
+ border-radius: 8px;
1399
+ color: var(--color-ak-text-muted);
1400
+ cursor: pointer;
1401
+ font-size: 18px;
1402
+ transition: color 0.15s, background 0.15s;
1403
+ }
1404
+ .ak-search-clear:hover { color: var(--color-ak-text); background: var(--color-ak-surface-2); }
1405
+ .ak-search-clear:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1406
+ .ak-search-clear.ak-visible { display: inline-flex; }
1407
+
1408
+ /* Kbd Badge */
1409
+ .ak-search-kbd {
1410
+ position: absolute;
1411
+ right: 12px;
1412
+ top: 50%;
1413
+ transform: translateY(-50%);
1414
+ font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
1415
+ font-size: 0.6875rem;
1416
+ font-weight: 500;
1417
+ color: var(--color-ak-text-muted);
1418
+ background: var(--color-ak-surface-2);
1419
+ border: 1px solid var(--color-ak-border);
1420
+ border-radius: 5px;
1421
+ padding: 2px 7px;
1422
+ pointer-events: none;
1423
+ user-select: none;
1424
+ line-height: 1.4;
1425
+ }
1426
+
1427
+ /* Autocomplete Listbox */
1428
+ .ak-search-listbox {
1429
+ position: absolute;
1430
+ top: calc(100% + 6px);
1431
+ left: 0;
1432
+ right: 0;
1433
+ background: var(--color-ak-bg);
1434
+ border: 2px solid var(--color-ak-border);
1435
+ border-radius: var(--radius-ak-input);
1436
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.08), 0 4px 8px rgba(0, 0, 0, 0.04);
1437
+ z-index: var(--z-ak-dropdown, 1000);
1438
+ max-height: 260px;
1439
+ overflow-y: auto;
1440
+ padding: 4px;
1441
+ list-style: none;
1442
+ margin: 0;
1443
+ }
1444
+ .ak-search-listbox[hidden] { display: none; }
1445
+
1446
+ .ak-search-option {
1447
+ display: flex;
1448
+ align-items: center;
1449
+ gap: 10px;
1450
+ padding: 10px 12px;
1451
+ font-size: 0.9375rem;
1452
+ color: var(--color-ak-text);
1453
+ border-radius: 7px;
1454
+ cursor: pointer;
1455
+ transition: background 0.1s;
1456
+ }
1457
+ .ak-search-option:hover { background: var(--color-ak-hover); }
1458
+ .ak-search-option[aria-selected="true"] { background: var(--color-ak-primary-subtle); }
1459
+ .ak-search-option-icon { color: var(--color-ak-text-muted); font-size: 18px; flex-shrink: 0; }
1460
+
1461
+ /* Filter Chip */
1462
+ .ak-filter-chip {
1463
+ display: inline-flex;
1464
+ align-items: center;
1465
+ justify-content: center;
1466
+ height: 36px;
1467
+ padding: 0 var(--spacing-ak-2);
1468
+ font-size: var(--text-ak-sm);
1469
+ font-weight: 500;
1470
+ color: var(--color-ak-text);
1471
+ background: var(--color-ak-bg);
1472
+ border: 2px solid var(--color-ak-border);
1473
+ border-radius: var(--radius-ak-full);
1474
+ cursor: pointer;
1475
+ transition: border-color 0.15s, background 0.15s, color 0.15s;
1476
+ white-space: nowrap;
1477
+ }
1478
+ .ak-filter-chip:hover { border-color: var(--color-ak-border-strong); background: var(--color-ak-hover); }
1479
+ .ak-filter-chip[aria-pressed="true"] { background: var(--color-ak-primary); border-color: var(--color-ak-primary); color: var(--color-ak-on-primary); }
1480
+ .ak-filter-chip:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1481
+
1482
+ /* Search Spinner */
1483
+ .ak-search-spinner {
1484
+ position: absolute;
1485
+ right: 14px;
1486
+ top: 50%;
1487
+ transform: translateY(-50%);
1488
+ width: 20px;
1489
+ height: 20px;
1490
+ border: 2.5px solid var(--color-ak-border);
1491
+ border-top-color: var(--color-ak-text);
1492
+ border-radius: 50%;
1493
+ animation: ak-spin 0.7s linear infinite;
1494
+ }
1495
+
1496
+ /* Expandable Search */
1497
+ .ak-search-expandable { display: inline-flex; align-items: center; position: relative; }
1498
+ .ak-search-expand-btn {
1499
+ display: inline-flex;
1500
+ align-items: center;
1501
+ justify-content: center;
1502
+ width: var(--height-ak-control-md);
1503
+ height: var(--height-ak-control-md);
1504
+ border: 2px solid var(--color-ak-border);
1505
+ background: var(--color-ak-bg);
1506
+ border-radius: var(--radius-ak-input);
1507
+ cursor: pointer;
1508
+ color: var(--color-ak-text-muted);
1509
+ transition: border-color 0.15s;
1510
+ }
1511
+ .ak-search-expand-btn:hover { border-color: var(--color-ak-border-strong); }
1512
+ .ak-search-expand-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1513
+
1514
+
1515
+ /* ============================================================================
1516
+ 10. MISC FORM ELEMENTS
1517
+ ============================================================================ */
1518
+
1519
+ /* --- OTP Input --- */
1520
+ .ak-otp-input {
1521
+ width: 52px;
1522
+ min-height: var(--height-ak-control-lg);
1523
+ font-family: inherit;
1524
+ font-size: var(--text-ak-xl);
1525
+ font-weight: 600;
1526
+ text-align: center;
1527
+ color: var(--color-ak-text);
1528
+ background: var(--color-ak-bg);
1529
+ border: 2px solid var(--color-ak-border-strong);
1530
+ border-radius: var(--radius-ak-input);
1531
+ outline: none;
1532
+ transition: border-color var(--duration-ak-base);
1533
+ caret-color: var(--color-ak-primary);
1534
+ }
1535
+ .ak-otp-input:focus { border-color: var(--color-ak-border-focus); }
1536
+ .ak-otp-input.has-value { border-color: var(--color-ak-primary); }
1537
+ .ak-otp-input.ak-otp-error { border-color: var(--color-ak-danger); }
1538
+ .ak-otp-input.ak-otp-error:focus { border-color: var(--color-ak-danger); }
1539
+
1540
+ /* --- File Upload / Dropzone --- */
1541
+ .ak-dropzone {
1542
+ display: flex;
1543
+ flex-direction: column;
1544
+ align-items: center;
1545
+ justify-content: center;
1546
+ gap: var(--spacing-ak-2);
1547
+ min-height: 180px;
1548
+ border: 2px dashed var(--color-ak-border-strong);
1549
+ border-radius: var(--radius-ak-lg);
1550
+ padding: var(--spacing-ak-4);
1551
+ cursor: pointer;
1552
+ transition: border-color var(--duration-ak-base), background-color var(--duration-ak-base);
1553
+ text-align: center;
1554
+ }
1555
+ .ak-dropzone:hover {
1556
+ border-color: var(--color-ak-primary);
1557
+ }
1558
+ .ak-dropzone:hover .ak-dropzone-icon {
1559
+ color: var(--color-ak-primary);
1560
+ }
1561
+ .ak-dropzone.drag-over {
1562
+ border-color: var(--color-ak-primary);
1563
+ background: var(--color-ak-primary-subtle);
1564
+ }
1565
+ .ak-dropzone-icon-bg {
1566
+ width: 56px;
1567
+ height: 56px;
1568
+ border-radius: var(--radius-ak-lg);
1569
+ background: var(--color-ak-surface-2);
1570
+ display: flex;
1571
+ align-items: center;
1572
+ justify-content: center;
1573
+ transition: background-color var(--duration-ak-base);
1574
+ }
1575
+ .ak-dropzone-icon {
1576
+ font-size: 28px;
1577
+ color: var(--color-ak-text-muted);
1578
+ transition: color var(--duration-ak-base);
1579
+ }
1580
+
1581
+ /* File row */
1582
+ .ak-file-row {
1583
+ display: flex;
1584
+ align-items: center;
1585
+ gap: var(--spacing-ak-1_5);
1586
+ padding: var(--spacing-ak-1_5) var(--spacing-ak-2);
1587
+ border: 1px solid var(--color-ak-border);
1588
+ border-radius: var(--radius-ak-md);
1589
+ transition: background-color 0.15s;
1590
+ }
1591
+ .ak-file-row:hover { background: var(--color-ak-hover); }
1592
+
1593
+ .ak-delete-btn {
1594
+ display: flex;
1595
+ align-items: center;
1596
+ justify-content: center;
1597
+ width: 36px;
1598
+ height: 36px;
1599
+ border: none;
1600
+ background: none;
1601
+ border-radius: var(--radius-ak-md);
1602
+ color: var(--color-ak-text-muted);
1603
+ cursor: pointer;
1604
+ transition: color 0.15s, background 0.15s;
1605
+ }
1606
+ .ak-delete-btn:hover { color: var(--color-ak-danger); background: var(--color-ak-danger-subtle); }
1607
+
1608
+ /* Progress bar fill */
1609
+ .ak-progress-fill {
1610
+ height: 4px;
1611
+ border-radius: var(--radius-ak-full);
1612
+ background: var(--color-ak-primary);
1613
+ transition: width 0.3s ease;
1614
+ }
1615
+
1616
+ /* --- Range Slider --- */
1617
+ .ak-range-input {
1618
+ width: 100%;
1619
+ min-height: var(--height-ak-control-md);
1620
+ font-family: inherit;
1621
+ font-size: var(--text-ak-base);
1622
+ color: var(--color-ak-text);
1623
+ background: var(--color-ak-bg);
1624
+ border: 2px solid var(--color-ak-border-strong);
1625
+ border-radius: var(--radius-ak-input);
1626
+ padding: 0 var(--spacing-ak-2);
1627
+ outline: none;
1628
+ transition: border-color var(--duration-ak-base);
1629
+ }
1630
+ .ak-range-input:focus { border-color: var(--color-ak-border-focus); }
1631
+
1632
+ /* Dual range */
1633
+ .ak-dual-range { position: relative; height: 8px; }
1634
+ .ak-dual-track {
1635
+ position: absolute;
1636
+ width: 100%;
1637
+ height: 8px;
1638
+ background: var(--color-ak-border);
1639
+ border-radius: var(--radius-ak-full);
1640
+ }
1641
+ .ak-dual-fill {
1642
+ position: absolute;
1643
+ height: 8px;
1644
+ background: var(--color-ak-primary);
1645
+ border-radius: var(--radius-ak-full);
1646
+ }
1647
+
1648
+ /* --- Rating --- */
1649
+ .ak-star-btn {
1650
+ display: inline-flex;
1651
+ align-items: center;
1652
+ justify-content: center;
1653
+ width: var(--size-ak-touch-min);
1654
+ height: var(--size-ak-touch-min);
1655
+ background: none;
1656
+ border: none;
1657
+ cursor: pointer;
1658
+ border-radius: var(--radius-ak-md);
1659
+ color: var(--color-ak-border-strong);
1660
+ transition: color var(--duration-ak-base), transform var(--duration-ak-base);
1661
+ }
1662
+ .ak-star-btn.filled { color: var(--color-ak-warning); }
1663
+ .ak-star-btn.hovered { color: var(--color-ak-warning); transform: scale(1.15); }
1664
+ .ak-star-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1665
+ .ak-star-icon { font-size: 28px; pointer-events: none; }
1666
+
1667
+ .ak-star-btn.ak-star-sm { width: 36px; height: 36px; }
1668
+ .ak-star-btn.ak-star-sm .ak-star-icon { font-size: 22px; }
1669
+ .ak-star-btn.ak-star-lg { width: 56px; height: 56px; }
1670
+ .ak-star-btn.ak-star-lg .ak-star-icon { font-size: 36px; }
1671
+
1672
+ .ak-rating-disabled { opacity: 0.5; pointer-events: none; }
1673
+
1674
+ /* Emoji rating */
1675
+ .ak-emoji-btn {
1676
+ display: inline-flex;
1677
+ align-items: center;
1678
+ justify-content: center;
1679
+ width: var(--size-ak-touch-min);
1680
+ height: var(--size-ak-touch-min);
1681
+ background: none;
1682
+ border: 2px solid transparent;
1683
+ border-radius: var(--radius-ak-md);
1684
+ cursor: pointer;
1685
+ transition: background var(--duration-ak-base), border-color var(--duration-ak-base);
1686
+ }
1687
+ .ak-emoji-btn:hover { background: var(--color-ak-hover); }
1688
+ .ak-emoji-btn[aria-checked="true"] { border-color: var(--color-ak-primary); background: var(--color-ak-primary-subtle); }
1689
+ .ak-emoji-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1690
+ .ak-emoji-label { font-size: var(--text-ak-xs); color: var(--color-ak-text-muted); text-align: center; }
1691
+
1692
+ /* Thumb rating */
1693
+ .ak-thumb-btn {
1694
+ display: inline-flex;
1695
+ align-items: center;
1696
+ justify-content: center;
1697
+ width: var(--size-ak-touch-min);
1698
+ height: var(--size-ak-touch-min);
1699
+ background: none;
1700
+ border: 2px solid var(--color-ak-border);
1701
+ border-radius: var(--radius-ak-full);
1702
+ cursor: pointer;
1703
+ transition: background var(--duration-ak-base), border-color var(--duration-ak-base), color var(--duration-ak-base);
1704
+ }
1705
+ .ak-thumb-btn:hover { background: var(--color-ak-hover); }
1706
+ .ak-thumb-btn[aria-pressed="true"] { border-color: var(--color-ak-primary); background: var(--color-ak-primary); color: var(--color-ak-on-primary); }
1707
+ .ak-thumb-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1708
+
1709
+ /* NPS */
1710
+ .ak-nps-btn {
1711
+ display: inline-flex;
1712
+ align-items: center;
1713
+ justify-content: center;
1714
+ min-width: var(--size-ak-touch-min);
1715
+ min-height: var(--size-ak-touch-min);
1716
+ font-size: var(--text-ak-base);
1717
+ font-weight: 600;
1718
+ background: var(--color-ak-surface-2);
1719
+ color: var(--color-ak-text-secondary);
1720
+ border: none;
1721
+ border-radius: 8px;
1722
+ cursor: pointer;
1723
+ transition: background var(--duration-ak-base), color var(--duration-ak-base);
1724
+ }
1725
+ .ak-nps-btn:hover { background: var(--color-ak-hover); }
1726
+ .ak-nps-btn[aria-checked="true"] { background: var(--color-ak-primary); color: var(--color-ak-on-primary); }
1727
+ .ak-nps-btn[aria-checked="true"][data-nps-zone="detractor"] { background: var(--color-ak-danger); }
1728
+ .ak-nps-btn[aria-checked="true"][data-nps-zone="passive"] { background: var(--color-ak-warning); }
1729
+ .ak-nps-btn[aria-checked="true"][data-nps-zone="promoter"] { background: var(--color-ak-success); }
1730
+ .ak-nps-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1731
+
1732
+ /* Likert */
1733
+ .ak-likert-btn {
1734
+ display: inline-flex;
1735
+ align-items: center;
1736
+ justify-content: center;
1737
+ min-width: var(--size-ak-touch-min);
1738
+ min-height: var(--size-ak-touch-min);
1739
+ padding: 0 var(--spacing-ak-2);
1740
+ font-size: var(--text-ak-sm);
1741
+ font-weight: 500;
1742
+ background: var(--color-ak-surface-2);
1743
+ color: var(--color-ak-text-secondary);
1744
+ border: none;
1745
+ border-radius: 8px;
1746
+ cursor: pointer;
1747
+ white-space: nowrap;
1748
+ transition: background var(--duration-ak-base), color var(--duration-ak-base);
1749
+ }
1750
+ .ak-likert-btn:hover { background: var(--color-ak-hover); }
1751
+ .ak-likert-btn[aria-checked="true"] { background: var(--color-ak-primary); color: var(--color-ak-on-primary); }
1752
+ .ak-likert-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1753
+
1754
+ /* Heart button (rating) */
1755
+ .ak-heart-btn {
1756
+ display: inline-flex;
1757
+ align-items: center;
1758
+ justify-content: center;
1759
+ width: var(--size-ak-touch-min);
1760
+ height: var(--size-ak-touch-min);
1761
+ background: none;
1762
+ border: none;
1763
+ border-radius: var(--radius-ak-full);
1764
+ cursor: pointer;
1765
+ color: var(--color-ak-border-strong);
1766
+ transition: color var(--duration-ak-base) var(--ease-ak-spring), transform var(--duration-ak-base) var(--ease-ak-spring);
1767
+ }
1768
+ .ak-heart-btn:hover { color: var(--color-ak-danger); }
1769
+ .ak-heart-btn[aria-pressed="true"] { color: var(--color-ak-danger); }
1770
+ .ak-heart-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1771
+ .ak-heart-icon { font-size: 28px; pointer-events: none; }
1772
+
1773
+ /* --- Quantity Selector --- */
1774
+ .ak-qty-btn {
1775
+ display: flex;
1776
+ align-items: center;
1777
+ justify-content: center;
1778
+ min-width: var(--size-ak-touch-min);
1779
+ min-height: var(--size-ak-touch-min);
1780
+ background: none;
1781
+ border: none;
1782
+ cursor: pointer;
1783
+ font-size: 20px;
1784
+ color: var(--color-ak-text);
1785
+ transition: background var(--duration-ak-base), color var(--duration-ak-base);
1786
+ }
1787
+ .ak-qty-btn:active { transform: scale(0.92); }
1788
+ .ak-qty-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: 2px; }
1789
+ .ak-qty-btn[disabled] { opacity: 0.3; cursor: not-allowed; }
1790
+
1791
+ .ak-qty-input {
1792
+ width: 48px;
1793
+ min-height: var(--size-ak-touch-min);
1794
+ text-align: center;
1795
+ font-family: inherit;
1796
+ font-size: var(--text-ak-base);
1797
+ font-weight: 600;
1798
+ color: var(--color-ak-text);
1799
+ background: transparent;
1800
+ border: none;
1801
+ outline: none;
1802
+ -moz-appearance: textfield;
1803
+ }
1804
+ .ak-qty-input::-webkit-outer-spin-button,
1805
+ .ak-qty-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
1806
+
1807
+ .ak-qty-bordered .ak-qty-btn { border: 1px solid var(--color-ak-border); border-radius: 8px; }
1808
+ .ak-qty-bordered .ak-qty-btn:hover:not([disabled]) { background: var(--color-ak-hover); }
1809
+ .ak-qty-pill .ak-qty-btn { border: 1px solid var(--color-ak-border); border-radius: var(--radius-ak-full); }
1810
+ .ak-qty-pill .ak-qty-btn:hover:not([disabled]) { background: var(--color-ak-hover); }
1811
+ .ak-qty-solid .ak-qty-btn { background: var(--color-ak-surface-2); border-radius: 8px; }
1812
+ .ak-qty-solid .ak-qty-btn:hover:not([disabled]) { background: var(--color-ak-active); }
1813
+ .ak-qty-disabled { opacity: 0.5; pointer-events: none; }
1814
+
1815
+ /* --- Number Stepper --- */
1816
+ .ak-step-btn {
1817
+ display: flex;
1818
+ align-items: center;
1819
+ justify-content: center;
1820
+ min-width: var(--size-ak-touch-min);
1821
+ min-height: var(--size-ak-touch-min);
1822
+ background: var(--color-ak-surface-2);
1823
+ border: none;
1824
+ cursor: pointer;
1825
+ font-size: 20px;
1826
+ color: var(--color-ak-text);
1827
+ transition: background var(--duration-ak-base);
1828
+ }
1829
+ .ak-step-btn:hover { background: var(--color-ak-active); }
1830
+ .ak-step-btn:active { transform: scale(0.95); }
1831
+ .ak-step-btn:focus-visible { outline: 2px solid var(--color-ak-border-focus); outline-offset: -2px; }
1832
+ .ak-step-btn[disabled] { opacity: 0.3; cursor: not-allowed; }
1833
+
1834
+ .ak-stepper-input {
1835
+ width: 64px;
1836
+ min-height: var(--size-ak-touch-min);
1837
+ text-align: center;
1838
+ font-family: inherit;
1839
+ font-size: var(--text-ak-base);
1840
+ font-weight: 600;
1841
+ color: var(--color-ak-text);
1842
+ background: transparent;
1843
+ border: none;
1844
+ outline: none;
1845
+ }
1846
+
1847
+ /* --- Password --- */
1848
+ .ak-password-wrap { position: relative; }
1849
+ .ak-password-wrap .ak-input { padding-right: var(--height-ak-control-md); }
1850
+
1851
+ .ak-password-toggle {
1852
+ position: absolute;
1853
+ right: 2px;
1854
+ top: 50%;
1855
+ transform: translateY(-50%);
1856
+ display: flex;
1857
+ align-items: center;
1858
+ justify-content: center;
1859
+ width: var(--size-ak-touch-min);
1860
+ height: var(--size-ak-touch-min);
1861
+ background: none;
1862
+ border: none;
1863
+ border-radius: 8px;
1864
+ color: var(--color-ak-text-muted);
1865
+ cursor: pointer;
1866
+ font-size: 20px;
1867
+ transition: color 0.15s;
1868
+ }
1869
+ .ak-password-toggle:hover { color: var(--color-ak-text); }
1870
+ .ak-password-toggle:focus { outline: 2px solid var(--color-ak-border-focus); outline-offset: -2px; }
1871
+ .ak-password-toggle-icon { pointer-events: none; }
1872
+
1873
+ /* Alias from login form */
1874
+ .ak-pw-toggle {
1875
+ position: absolute;
1876
+ right: 2px;
1877
+ top: 50%;
1878
+ transform: translateY(-50%);
1879
+ display: flex;
1880
+ align-items: center;
1881
+ justify-content: center;
1882
+ width: var(--size-ak-touch-min);
1883
+ height: var(--size-ak-touch-min);
1884
+ background: none;
1885
+ border: none;
1886
+ border-radius: 8px;
1887
+ color: var(--color-ak-text-muted);
1888
+ cursor: pointer;
1889
+ font-size: 20px;
1890
+ transition: color 0.15s;
1891
+ }
1892
+ .ak-pw-toggle:hover { color: var(--color-ak-text); }
1893
+
1894
+ /* --- Password Strength --- */
1895
+ .ak-strength-bar { display: flex; gap: 4px; margin-top: var(--spacing-ak-1); }
1896
+ .ak-strength-segment {
1897
+ flex: 1;
1898
+ height: 4px;
1899
+ border-radius: var(--radius-ak-full);
1900
+ background: var(--color-ak-border);
1901
+ transition: background var(--duration-ak-base);
1902
+ }
1903
+ .ak-strength-segment.ak-filled { background: var(--color-ak-border-strong); }
1904
+ .ak-strength-segment.ak-weak { background: var(--color-ak-danger); }
1905
+ .ak-strength-segment.ak-fair { background: var(--color-ak-warning); }
1906
+ .ak-strength-segment.ak-strong { background: var(--color-ak-success); }
1907
+ .ak-strength-hint { font-size: var(--text-ak-sm); color: var(--color-ak-text-muted); margin-top: var(--spacing-ak-0_5); }
1908
+
1909
+ /* Requirements list */
1910
+ .ak-req-list { list-style: none; padding: 0; margin: var(--spacing-ak-1) 0 0; }
1911
+ .ak-req-item {
1912
+ display: flex;
1913
+ align-items: center;
1914
+ gap: var(--spacing-ak-1);
1915
+ font-size: var(--text-ak-sm);
1916
+ color: var(--color-ak-text-muted);
1917
+ padding: 2px 0;
1918
+ }
1919
+ .ak-req-item.ak-met { color: var(--color-ak-success-text); }
1920
+ .ak-req-icon { font-size: 16px; flex-shrink: 0; }
1921
+
1922
+ /* --- Badges (form context) --- renamed to ak-form-badge to avoid collision with avatar ak-badge */
1923
+ .ak-form-badge {
1924
+ display: inline-flex;
1925
+ align-items: center;
1926
+ padding: 2px 8px;
1927
+ font-size: 0.6875rem;
1928
+ font-weight: 600;
1929
+ line-height: 1.4;
1930
+ border-radius: var(--radius-ak-full);
1931
+ text-transform: uppercase;
1932
+ letter-spacing: 0.02em;
1933
+ }
1934
+ .ak-form-badge-new { background: var(--color-ak-info-subtle); color: var(--color-ak-info-text); }
1935
+ .ak-form-badge-beta { background: var(--color-ak-warning-subtle); color: var(--color-ak-warning-text); }
1936
+ .ak-badge-pro { background: var(--color-ak-primary-subtle); color: var(--color-ak-text); }
1937
+
1938
+ /* --- Error Summary (signup form) --- */
1939
+ .ak-error-summary {
1940
+ border: 2px solid var(--color-ak-danger);
1941
+ border-radius: var(--radius-ak-input);
1942
+ padding: var(--spacing-ak-2);
1943
+ background: var(--color-ak-danger-subtle);
1944
+ }
1945
+ .ak-error-summary-title {
1946
+ font-size: var(--text-ak-base);
1947
+ font-weight: 600;
1948
+ color: var(--color-ak-danger-text);
1949
+ margin-bottom: var(--spacing-ak-1);
1950
+ }
1951
+ .ak-error-summary-list { list-style: none; padding: 0; margin: 0; }
1952
+ .ak-error-summary-list a { color: var(--color-ak-danger-text); text-decoration: underline; font-size: var(--text-ak-sm); }
1953
+ .ak-error-summary-list a:hover { color: var(--color-ak-danger); }
1954
+
1955
+ /* --- Success Card (signup form) --- */
1956
+ .ak-success-card {
1957
+ text-align: center;
1958
+ padding: var(--spacing-ak-6);
1959
+ }
1960
+ .ak-success-icon {
1961
+ font-size: 48px;
1962
+ color: var(--color-ak-success);
1963
+ margin-bottom: var(--spacing-ak-2);
1964
+ }
1965
+ .ak-success-title {
1966
+ font-size: var(--text-ak-xl);
1967
+ font-weight: 600;
1968
+ color: var(--color-ak-text);
1969
+ margin-bottom: var(--spacing-ak-1);
1970
+ }
1971
+
1972
+ /* --- Select chevron rotation (contact form) --- */
1973
+ .ak-select-wrap svg {
1974
+ transition: transform var(--duration-ak-base) ease;
1975
+ }
1976
+ .ak-select-wrap:focus-within svg {
1977
+ transform: translateY(-50%) rotate(180deg);
1978
+ }
1979
+ .ak-select-wrap svg {
1980
+ transform: translateY(-50%);
1981
+ }
1982
+
1983
+ /* --- Date input filled state --- */
1984
+ .ak-date-input.has-value {
1985
+ color: var(--color-ak-text);
1986
+ }
1987
+
1988
+ /* --- Input wrap hover --- */
1989
+ .ak-input-wrap:hover .ak-date-input {
1990
+ border-color: var(--color-ak-border-strong);
1991
+ }
1992
+ .ak-input-wrap:hover .ak-input-icon {
1993
+ color: var(--color-ak-text-secondary);
1994
+ }
1995
+ .ak-input-icon {
1996
+ transition: color var(--duration-ak-base) ease;
1997
+ }
1998
+
1999
+
2000
+ /* ============================================================================
2001
+ 11. DIVIDERS & SOCIAL
2002
+ ============================================================================ */
2003
+
2004
+ .ak-divider {
2005
+ display: flex;
2006
+ align-items: center;
2007
+ gap: var(--spacing-ak-2);
2008
+ margin: var(--spacing-ak-3) 0;
2009
+ }
2010
+ .ak-divider-line {
2011
+ flex: 1;
2012
+ height: 1px;
2013
+ background: var(--color-ak-border);
2014
+ }
2015
+ .ak-divider-text {
2016
+ font-size: var(--text-ak-sm);
2017
+ color: var(--color-ak-text-muted);
2018
+ white-space: nowrap;
2019
+ }
2020
+
2021
+ .ak-social-icon {
2022
+ display: flex;
2023
+ align-items: center;
2024
+ justify-content: center;
2025
+ width: 20px;
2026
+ height: 20px;
2027
+ flex-shrink: 0;
2028
+ }
2029
+
2030
+ .ak-link {
2031
+ font-size: var(--text-ak-sm);
2032
+ font-weight: 500;
2033
+ color: var(--color-ak-text-secondary);
2034
+ text-decoration: none;
2035
+ transition: color var(--duration-ak-base);
2036
+ }
2037
+ .ak-link:hover { color: var(--color-ak-text); }
2038
+
2039
+ /* --- Toast Notification --- */
2040
+ .ak-toast {
2041
+ position: fixed;
2042
+ bottom: 24px;
2043
+ right: 24px;
2044
+ background: var(--color-ak-elevated);
2045
+ border: 1px solid var(--color-ak-border);
2046
+ border-radius: var(--radius-ak-md);
2047
+ padding: var(--spacing-ak-2) var(--spacing-ak-3);
2048
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
2049
+ display: flex;
2050
+ align-items: center;
2051
+ gap: var(--spacing-ak-1_5);
2052
+ min-width: 320px;
2053
+ opacity: 0;
2054
+ transform: translateY(20px);
2055
+ transition: opacity var(--duration-ak-base) cubic-bezier(0.16, 1, 0.3, 1),
2056
+ transform var(--duration-ak-base) cubic-bezier(0.16, 1, 0.3, 1);
2057
+ pointer-events: none;
2058
+ z-index: var(--z-ak-toast, 1700);
2059
+ }
2060
+ .ak-toast.is-visible { opacity: 1; transform: translateY(0); pointer-events: auto; }
2061
+ .ak-toast__icon { flex-shrink: 0; font-size: 1.25rem; color: var(--color-ak-success); }
2062
+ .ak-toast__message { flex: 1; font-size: var(--text-ak-base); color: var(--color-ak-text); }
2063
+
2064
+ /* --- Form section labels --- */
2065
+ .ak-section-label {
2066
+ font-size: var(--text-ak-base);
2067
+ font-weight: 500;
2068
+ color: var(--color-ak-text-muted);
2069
+ text-transform: uppercase;
2070
+ letter-spacing: 0.04em;
2071
+ margin-bottom: var(--spacing-ak-1_5);
2072
+ }
2073
+ .ak-form-section {
2074
+ margin-bottom: var(--spacing-ak-3);
2075
+ }
2076
+
2077
+
2078
+ /* ============================================================================
2079
+ 12. SPINNER
2080
+ ============================================================================ */
2081
+
2082
+ @keyframes ak-spin {
2083
+ to { transform: rotate(360deg); }
2084
+ }
2085
+
2086
+ .ak-spinner {
2087
+ width: 1.25rem;
2088
+ height: 1.25rem;
2089
+ flex-shrink: 0;
2090
+ border: 2px solid rgba(255, 255, 255, 0.3);
2091
+ border-top-color: #ffffff;
2092
+ border-radius: var(--radius-ak-full);
2093
+ animation: ak-spin 0.6s linear infinite;
2094
+ }
2095
+
2096
+ /* --- Checkbox / Radio micro-interaction keyframes --- */
2097
+ @keyframes ak-heart-pop {
2098
+ 0% { transform: scale(1); }
2099
+ 50% { transform: scale(1.3); }
2100
+ 100% { transform: scale(1); }
2101
+ }
2102
+
2103
+ @keyframes ak-checkbox-pop {
2104
+ 0% { transform: scale(1); }
2105
+ 50% { transform: scale(1.1); }
2106
+ 100% { transform: scale(1); }
2107
+ }
2108
+
2109
+ @keyframes ak-radio-pop {
2110
+ 0% { transform: scale(1); }
2111
+ 50% { transform: scale(1.1); }
2112
+ 100% { transform: scale(1); }
2113
+ }
2114
+
2115
+ @keyframes ak-checkmark-slide {
2116
+ from { transform: rotate(45deg) translateY(-5px); opacity: 0; }
2117
+ to { transform: rotate(45deg) translateY(0); opacity: 1; }
2118
+ }
2119
+
2120
+ /* Lightning pulse (upgrade buttons) */
2121
+ @keyframes ak-lightning-pulse {
2122
+ 0%, 100% { opacity: 1; transform: scale(1); }
2123
+ 50% { opacity: 0.7; transform: scale(1.1); }
2124
+ }
2125
+
2126
+ /* Success check slide-in */
2127
+ @keyframes ak-check-slide-in {
2128
+ 0% { transform: scale(0); opacity: 0; }
2129
+ 50% { transform: scale(1.1); }
2130
+ 100% { transform: scale(1); opacity: 1; }
2131
+ }
2132
+ .ak-success-icon-anim {
2133
+ animation: ak-check-slide-in 0.35s var(--ease-ak-spring);
2134
+ }
2135
+
2136
+ /* Micro-interactions (motion-safe only) */
2137
+ @media (prefers-reduced-motion: no-preference) {
2138
+ .ak-check:checked { animation: ak-checkbox-pop 0.25s var(--ease-ak-spring); }
2139
+ .ak-check:checked::after { animation: ak-checkmark-slide 0.2s var(--ease-ak-spring); }
2140
+ .ak-radio:checked { animation: ak-radio-pop 0.25s var(--ease-ak-spring); }
2141
+ }
2142
+
2143
+ /* ============================================================================
2144
+ Reduced Motion
2145
+ ============================================================================ */
2146
+
2147
+ @media (prefers-reduced-motion: reduce) {
2148
+ *, *::before, *::after {
2149
+ animation-duration: 0.01ms !important;
2150
+ animation-iteration-count: 1 !important;
2151
+ transition-duration: 0.01ms !important;
2152
+ scroll-behavior: auto !important;
2153
+ }
2154
+ }
2155
+