carom-link 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,756 @@
1
+ /* ─── Design Tokens ─── */
2
+ :root {
3
+ --bg-primary: #0a0e17;
4
+ --bg-secondary: #111827;
5
+ --bg-card: rgba(17, 24, 39, 0.7);
6
+ --bg-card-hover: rgba(30, 41, 59, 0.8);
7
+ --bg-input: rgba(15, 23, 42, 0.8);
8
+ --border: rgba(99, 102, 241, 0.15);
9
+ --border-hover: rgba(99, 102, 241, 0.35);
10
+ --border-focus: rgba(99, 102, 241, 0.6);
11
+ --text-primary: #f1f5f9;
12
+ --text-secondary: #94a3b8;
13
+ --text-muted: #64748b;
14
+ --accent: #6366f1;
15
+ --accent-light: #818cf8;
16
+ --accent-glow: rgba(99, 102, 241, 0.2);
17
+ --green: #22c55e;
18
+ --green-dim: rgba(34, 197, 94, 0.15);
19
+ --red: #ef4444;
20
+ --red-dim: rgba(239, 68, 68, 0.15);
21
+ --yellow: #f59e0b;
22
+ --yellow-dim: rgba(245, 158, 11, 0.15);
23
+ --cyan: #06b6d4;
24
+ --radius-sm: 6px;
25
+ --radius-md: 10px;
26
+ --radius-lg: 16px;
27
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
28
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
29
+ --shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.5);
30
+ --shadow-glow: 0 0 20px var(--accent-glow);
31
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
32
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
33
+ --transition: 200ms cubic-bezier(0.4, 0, 0.2, 1);
34
+ }
35
+
36
+ /* ─── Reset & Base ─── */
37
+ *, *::before, *::after {
38
+ margin: 0; padding: 0; box-sizing: border-box;
39
+ }
40
+
41
+ body {
42
+ font-family: var(--font-sans);
43
+ background: var(--bg-primary);
44
+ color: var(--text-primary);
45
+ line-height: 1.6;
46
+ min-height: 100vh;
47
+ -webkit-font-smoothing: antialiased;
48
+ }
49
+
50
+ /* Subtle grid background */
51
+ body::before {
52
+ content: '';
53
+ position: fixed;
54
+ inset: 0;
55
+ background:
56
+ linear-gradient(rgba(99, 102, 241, 0.03) 1px, transparent 1px),
57
+ linear-gradient(90deg, rgba(99, 102, 241, 0.03) 1px, transparent 1px);
58
+ background-size: 40px 40px;
59
+ pointer-events: none;
60
+ z-index: 0;
61
+ }
62
+
63
+ /* Top glow */
64
+ body::after {
65
+ content: '';
66
+ position: fixed;
67
+ top: -200px;
68
+ left: 50%;
69
+ transform: translateX(-50%);
70
+ width: 800px;
71
+ height: 400px;
72
+ background: radial-gradient(ellipse, var(--accent-glow) 0%, transparent 70%);
73
+ pointer-events: none;
74
+ z-index: 0;
75
+ }
76
+
77
+ .app {
78
+ position: relative;
79
+ z-index: 1;
80
+ max-width: 1200px;
81
+ margin: 0 auto;
82
+ padding: 0 1.5rem;
83
+ }
84
+
85
+ /* ─── Header ─── */
86
+ .header {
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ padding: 1.25rem 0;
91
+ border-bottom: 1px solid var(--border);
92
+ margin-bottom: 1.5rem;
93
+ }
94
+
95
+ .header-left { display: flex; align-items: center; gap: 1rem; }
96
+ .header-right { display: flex; align-items: center; gap: 1rem; }
97
+
98
+ .logo {
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 0.6rem;
102
+ }
103
+
104
+ .logo-icon {
105
+ font-size: 1.5rem;
106
+ filter: drop-shadow(0 0 8px var(--accent-glow));
107
+ }
108
+
109
+ .logo-text {
110
+ font-size: 1.25rem;
111
+ font-weight: 700;
112
+ background: linear-gradient(135deg, var(--accent-light), var(--cyan));
113
+ -webkit-background-clip: text;
114
+ -webkit-text-fill-color: transparent;
115
+ background-clip: text;
116
+ letter-spacing: -0.03em;
117
+ }
118
+
119
+ .api-key-group {
120
+ display: flex;
121
+ align-items: center;
122
+ gap: 0.25rem;
123
+ }
124
+
125
+ .status-badge {
126
+ display: flex;
127
+ align-items: center;
128
+ gap: 0.4rem;
129
+ padding: 0.35rem 0.75rem;
130
+ border-radius: 9999px;
131
+ background: var(--bg-card);
132
+ border: 1px solid var(--border);
133
+ font-size: 0.8rem;
134
+ color: var(--text-secondary);
135
+ }
136
+
137
+ .status-dot {
138
+ width: 8px;
139
+ height: 8px;
140
+ border-radius: 50%;
141
+ background: var(--yellow);
142
+ animation: pulse 2s infinite;
143
+ }
144
+
145
+ .status-badge.connected .status-dot { background: var(--green); animation: none; }
146
+ .status-badge.error .status-dot { background: var(--red); animation: none; }
147
+
148
+ @keyframes pulse {
149
+ 0%, 100% { opacity: 1; }
150
+ 50% { opacity: 0.4; }
151
+ }
152
+
153
+ /* ─── Navigation ─── */
154
+ .nav {
155
+ display: flex;
156
+ gap: 0.25rem;
157
+ margin-bottom: 1.5rem;
158
+ padding: 0.3rem;
159
+ background: var(--bg-card);
160
+ border-radius: var(--radius-md);
161
+ border: 1px solid var(--border);
162
+ backdrop-filter: blur(10px);
163
+ }
164
+
165
+ .nav-btn {
166
+ flex: 1;
167
+ padding: 0.6rem 1rem;
168
+ border: none;
169
+ background: transparent;
170
+ color: var(--text-secondary);
171
+ font-family: var(--font-sans);
172
+ font-size: 0.85rem;
173
+ font-weight: 500;
174
+ border-radius: var(--radius-sm);
175
+ cursor: pointer;
176
+ transition: all var(--transition);
177
+ }
178
+
179
+ .nav-btn:hover {
180
+ color: var(--text-primary);
181
+ background: rgba(99, 102, 241, 0.08);
182
+ }
183
+
184
+ .nav-btn.active {
185
+ color: var(--text-primary);
186
+ background: var(--accent);
187
+ box-shadow: var(--shadow-glow);
188
+ }
189
+
190
+ /* ─── Section Headers ─── */
191
+ .section-header {
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: space-between;
195
+ margin-bottom: 1.25rem;
196
+ }
197
+
198
+ .section-header h1 {
199
+ font-size: 1.4rem;
200
+ font-weight: 600;
201
+ letter-spacing: -0.02em;
202
+ }
203
+
204
+ .section-actions { display: flex; gap: 0.5rem; }
205
+
206
+ /* ─── Tabs ─── */
207
+ .tab-content {
208
+ display: none;
209
+ animation: fadeIn 300ms ease;
210
+ }
211
+
212
+ .tab-content.active { display: block; }
213
+
214
+ @keyframes fadeIn {
215
+ from { opacity: 0; transform: translateY(8px); }
216
+ to { opacity: 1; transform: translateY(0); }
217
+ }
218
+
219
+ /* ─── Tables ─── */
220
+ .table-container {
221
+ background: var(--bg-card);
222
+ border: 1px solid var(--border);
223
+ border-radius: var(--radius-lg);
224
+ overflow: hidden;
225
+ backdrop-filter: blur(10px);
226
+ }
227
+
228
+ .data-table {
229
+ width: 100%;
230
+ border-collapse: collapse;
231
+ }
232
+
233
+ .data-table th {
234
+ text-align: left;
235
+ padding: 0.75rem 1rem;
236
+ font-size: 0.75rem;
237
+ font-weight: 600;
238
+ text-transform: uppercase;
239
+ letter-spacing: 0.06em;
240
+ color: var(--text-muted);
241
+ background: rgba(15, 23, 42, 0.5);
242
+ border-bottom: 1px solid var(--border);
243
+ }
244
+
245
+ .data-table td {
246
+ padding: 0.75rem 1rem;
247
+ font-size: 0.875rem;
248
+ border-bottom: 1px solid rgba(99, 102, 241, 0.06);
249
+ vertical-align: middle;
250
+ }
251
+
252
+ .data-table tbody tr {
253
+ transition: background var(--transition);
254
+ }
255
+
256
+ .data-table tbody tr:hover {
257
+ background: var(--bg-card-hover);
258
+ }
259
+
260
+ .data-table tbody tr:last-child td {
261
+ border-bottom: none;
262
+ }
263
+
264
+ .empty-state {
265
+ text-align: center;
266
+ color: var(--text-muted);
267
+ padding: 2rem !important;
268
+ }
269
+
270
+ /* ─── Cell Styles ─── */
271
+ .cell-slug {
272
+ font-family: var(--font-mono);
273
+ font-size: 0.85rem;
274
+ color: var(--accent-light);
275
+ font-weight: 500;
276
+ }
277
+
278
+ .cell-url {
279
+ color: var(--text-secondary);
280
+ max-width: 300px;
281
+ overflow: hidden;
282
+ text-overflow: ellipsis;
283
+ white-space: nowrap;
284
+ }
285
+
286
+ .cell-count {
287
+ font-family: var(--font-mono);
288
+ font-weight: 500;
289
+ }
290
+
291
+ .cell-count.human { color: var(--green); }
292
+ .cell-count.bot { color: var(--red); }
293
+
294
+ .badge {
295
+ display: inline-flex;
296
+ align-items: center;
297
+ gap: 0.3rem;
298
+ padding: 0.2rem 0.55rem;
299
+ border-radius: 9999px;
300
+ font-size: 0.75rem;
301
+ font-weight: 500;
302
+ }
303
+
304
+ .badge-active {
305
+ background: var(--green-dim);
306
+ color: var(--green);
307
+ }
308
+
309
+ .badge-inactive {
310
+ background: rgba(100, 116, 139, 0.15);
311
+ color: var(--text-muted);
312
+ }
313
+
314
+ /* ─── Buttons ─── */
315
+ .btn-primary {
316
+ padding: 0.65rem 1.5rem;
317
+ background: var(--accent);
318
+ color: #fff;
319
+ border: none;
320
+ border-radius: var(--radius-sm);
321
+ font-family: var(--font-sans);
322
+ font-size: 0.875rem;
323
+ font-weight: 600;
324
+ cursor: pointer;
325
+ transition: all var(--transition);
326
+ box-shadow: var(--shadow-sm);
327
+ }
328
+
329
+ .btn-primary:hover {
330
+ background: var(--accent-light);
331
+ box-shadow: var(--shadow-glow);
332
+ transform: translateY(-1px);
333
+ }
334
+
335
+ .btn-primary:active { transform: translateY(0); }
336
+
337
+ .btn-secondary {
338
+ padding: 0.5rem 1rem;
339
+ background: transparent;
340
+ color: var(--text-secondary);
341
+ border: 1px solid var(--border);
342
+ border-radius: var(--radius-sm);
343
+ font-family: var(--font-sans);
344
+ font-size: 0.8rem;
345
+ font-weight: 500;
346
+ cursor: pointer;
347
+ transition: all var(--transition);
348
+ }
349
+
350
+ .btn-secondary:hover {
351
+ color: var(--text-primary);
352
+ border-color: var(--border-hover);
353
+ background: rgba(99, 102, 241, 0.06);
354
+ }
355
+
356
+ .btn-ghost {
357
+ padding: 0.35rem 0.6rem;
358
+ background: transparent;
359
+ color: var(--text-muted);
360
+ border: none;
361
+ border-radius: var(--radius-sm);
362
+ font-size: 0.8rem;
363
+ cursor: pointer;
364
+ transition: all var(--transition);
365
+ }
366
+
367
+ .btn-ghost:hover { color: var(--text-primary); }
368
+
369
+ .btn-danger {
370
+ padding: 0.3rem 0.6rem;
371
+ background: transparent;
372
+ color: var(--red);
373
+ border: 1px solid var(--red-dim);
374
+ border-radius: var(--radius-sm);
375
+ font-size: 0.75rem;
376
+ font-weight: 500;
377
+ cursor: pointer;
378
+ transition: all var(--transition);
379
+ }
380
+
381
+ .btn-danger:hover {
382
+ background: var(--red-dim);
383
+ }
384
+
385
+ .btn-sm {
386
+ padding: 0.3rem 0.6rem;
387
+ font-size: 0.75rem;
388
+ }
389
+
390
+ /* ─── Inputs ─── */
391
+ .input-sm {
392
+ padding: 0.35rem 0.6rem;
393
+ background: var(--bg-input);
394
+ border: 1px solid var(--border);
395
+ border-radius: var(--radius-sm);
396
+ color: var(--text-primary);
397
+ font-family: var(--font-mono);
398
+ font-size: 0.8rem;
399
+ width: 160px;
400
+ transition: border-color var(--transition);
401
+ }
402
+
403
+ .input-lg {
404
+ width: 100%;
405
+ padding: 0.7rem 1rem;
406
+ background: var(--bg-input);
407
+ border: 1px solid var(--border);
408
+ border-radius: var(--radius-sm);
409
+ color: var(--text-primary);
410
+ font-family: var(--font-sans);
411
+ font-size: 0.9rem;
412
+ transition: all var(--transition);
413
+ }
414
+
415
+ .input-lg.mono { font-family: var(--font-mono); font-size: 0.85rem; }
416
+
417
+ .input-sm:focus, .input-lg:focus {
418
+ outline: none;
419
+ border-color: var(--border-focus);
420
+ box-shadow: 0 0 0 3px var(--accent-glow);
421
+ }
422
+
423
+ .input-lg::placeholder {
424
+ color: var(--text-muted);
425
+ }
426
+
427
+ select.input-lg {
428
+ cursor: pointer;
429
+ appearance: none;
430
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%2364748b' viewBox='0 0 16 16'%3E%3Cpath d='M8 12L2 6h12z'/%3E%3C/svg%3E");
431
+ background-repeat: no-repeat;
432
+ background-position: right 0.75rem center;
433
+ padding-right: 2.5rem;
434
+ }
435
+
436
+ /* ─── Forms ─── */
437
+ .form-card {
438
+ background: var(--bg-card);
439
+ border: 1px solid var(--border);
440
+ border-radius: var(--radius-lg);
441
+ padding: 1.5rem;
442
+ margin-bottom: 1.25rem;
443
+ backdrop-filter: blur(10px);
444
+ }
445
+
446
+ .form-card.compact { padding: 1rem; }
447
+
448
+ .form-group {
449
+ margin-bottom: 1rem;
450
+ }
451
+
452
+ .form-group label {
453
+ display: block;
454
+ font-size: 0.8rem;
455
+ font-weight: 500;
456
+ color: var(--text-secondary);
457
+ margin-bottom: 0.35rem;
458
+ }
459
+
460
+ .optional {
461
+ color: var(--text-muted);
462
+ font-weight: 400;
463
+ }
464
+
465
+ .form-row {
466
+ display: flex;
467
+ gap: 1rem;
468
+ }
469
+
470
+ .form-row .form-group { flex: 1; }
471
+ .form-row .flex-grow { flex: 2; }
472
+
473
+ /* ─── Result Card ─── */
474
+ .result-card {
475
+ margin-top: 1.25rem;
476
+ padding: 1rem 1.25rem;
477
+ background: rgba(99, 102, 241, 0.08);
478
+ border: 1px solid rgba(99, 102, 241, 0.2);
479
+ border-radius: var(--radius-md);
480
+ animation: fadeIn 300ms ease;
481
+ }
482
+
483
+ .result-card.hidden { display: none; }
484
+
485
+ .result-label {
486
+ font-size: 0.8rem;
487
+ color: var(--text-muted);
488
+ margin-bottom: 0.35rem;
489
+ }
490
+
491
+ .result-url {
492
+ font-family: var(--font-mono);
493
+ font-size: 1rem;
494
+ color: var(--accent-light);
495
+ font-weight: 500;
496
+ word-break: break-all;
497
+ margin-bottom: 0.5rem;
498
+ }
499
+
500
+ /* ─── Test Result ─── */
501
+ .test-result-header {
502
+ display: flex;
503
+ align-items: center;
504
+ gap: 1rem;
505
+ margin-bottom: 0.75rem;
506
+ }
507
+
508
+ .test-classification {
509
+ font-size: 1.1rem;
510
+ font-weight: 700;
511
+ }
512
+
513
+ .test-classification.human { color: var(--green); }
514
+ .test-classification.bot { color: var(--red); }
515
+ .test-classification.suspicious { color: var(--yellow); }
516
+
517
+ .test-score {
518
+ font-family: var(--font-mono);
519
+ font-size: 0.85rem;
520
+ color: var(--text-secondary);
521
+ }
522
+
523
+ .test-signals {
524
+ display: flex;
525
+ flex-direction: column;
526
+ gap: 0.35rem;
527
+ }
528
+
529
+ .signal-item {
530
+ display: flex;
531
+ align-items: center;
532
+ gap: 0.5rem;
533
+ font-size: 0.8rem;
534
+ }
535
+
536
+ .signal-weight {
537
+ font-family: var(--font-mono);
538
+ font-weight: 600;
539
+ color: var(--yellow);
540
+ min-width: 30px;
541
+ }
542
+
543
+ .signal-name {
544
+ color: var(--text-secondary);
545
+ font-weight: 500;
546
+ }
547
+
548
+ .signal-detail {
549
+ color: var(--text-muted);
550
+ }
551
+
552
+ /* ─── Modal ─── */
553
+ .modal-overlay {
554
+ position: fixed;
555
+ inset: 0;
556
+ background: rgba(0, 0, 0, 0.6);
557
+ display: flex;
558
+ align-items: center;
559
+ justify-content: center;
560
+ z-index: 1000;
561
+ backdrop-filter: blur(4px);
562
+ animation: fadeIn 200ms ease;
563
+ }
564
+
565
+ .modal-overlay.hidden { display: none; }
566
+
567
+ .modal {
568
+ background: var(--bg-secondary);
569
+ border: 1px solid var(--border);
570
+ border-radius: var(--radius-lg);
571
+ width: 90%;
572
+ max-width: 640px;
573
+ max-height: 80vh;
574
+ overflow-y: auto;
575
+ box-shadow: var(--shadow-lg);
576
+ }
577
+
578
+ .modal-header {
579
+ display: flex;
580
+ align-items: center;
581
+ justify-content: space-between;
582
+ padding: 1.25rem 1.5rem;
583
+ border-bottom: 1px solid var(--border);
584
+ }
585
+
586
+ .modal-header h2 {
587
+ font-size: 1.1rem;
588
+ font-weight: 600;
589
+ }
590
+
591
+ .modal-close {
592
+ font-size: 1.1rem;
593
+ }
594
+
595
+ .modal-body {
596
+ padding: 1.5rem;
597
+ }
598
+
599
+ .stat-grid {
600
+ display: grid;
601
+ grid-template-columns: repeat(4, 1fr);
602
+ gap: 0.75rem;
603
+ margin-bottom: 1.25rem;
604
+ }
605
+
606
+ .stat-card {
607
+ background: var(--bg-card);
608
+ border: 1px solid var(--border);
609
+ border-radius: var(--radius-md);
610
+ padding: 0.75rem;
611
+ text-align: center;
612
+ }
613
+
614
+ .stat-value {
615
+ font-family: var(--font-mono);
616
+ font-size: 1.5rem;
617
+ font-weight: 700;
618
+ }
619
+
620
+ .stat-value.green { color: var(--green); }
621
+ .stat-value.red { color: var(--red); }
622
+ .stat-value.yellow { color: var(--yellow); }
623
+
624
+ .stat-label {
625
+ font-size: 0.7rem;
626
+ color: var(--text-muted);
627
+ text-transform: uppercase;
628
+ letter-spacing: 0.06em;
629
+ margin-top: 0.15rem;
630
+ }
631
+
632
+ /* ─── Bot Page Editor ─── */
633
+ .section-description {
634
+ color: var(--text-secondary);
635
+ font-size: 0.875rem;
636
+ margin-bottom: 1.25rem;
637
+ line-height: 1.5;
638
+ }
639
+
640
+ .botpage-layout {
641
+ display: grid;
642
+ grid-template-columns: 1fr 1fr;
643
+ gap: 1.5rem;
644
+ align-items: start;
645
+ }
646
+
647
+ .input-hint {
648
+ display: block;
649
+ font-size: 0.72rem;
650
+ color: var(--text-muted);
651
+ margin-top: 0.3rem;
652
+ }
653
+
654
+ textarea.input-lg {
655
+ resize: vertical;
656
+ min-height: 70px;
657
+ font-family: var(--font-sans);
658
+ line-height: 1.5;
659
+ }
660
+
661
+ .form-actions {
662
+ display: flex;
663
+ gap: 0.75rem;
664
+ margin-top: 0.5rem;
665
+ }
666
+
667
+ .preview-panel {
668
+ position: sticky;
669
+ top: 1rem;
670
+ }
671
+
672
+ .preview-header {
673
+ margin-bottom: 0.75rem;
674
+ }
675
+
676
+ .preview-badge {
677
+ display: inline-flex;
678
+ align-items: center;
679
+ gap: 0.4rem;
680
+ font-size: 0.78rem;
681
+ font-weight: 500;
682
+ color: var(--text-secondary);
683
+ background: var(--bg-card);
684
+ border: 1px solid var(--border);
685
+ padding: 0.35rem 0.75rem;
686
+ border-radius: 9999px;
687
+ }
688
+
689
+ .preview-frame-wrapper {
690
+ background: var(--bg-card);
691
+ border: 1px solid var(--border);
692
+ border-radius: var(--radius-lg);
693
+ overflow: hidden;
694
+ position: relative;
695
+ }
696
+
697
+ /* Simulated browser chrome */
698
+ .preview-frame-wrapper::before {
699
+ content: '';
700
+ display: block;
701
+ height: 32px;
702
+ background: rgba(15, 23, 42, 0.6);
703
+ border-bottom: 1px solid var(--border);
704
+ background-image:
705
+ radial-gradient(circle 5px at 16px 16px, #ef4444 5px, transparent 0),
706
+ radial-gradient(circle 5px at 34px 16px, #f59e0b 5px, transparent 0),
707
+ radial-gradient(circle 5px at 52px 16px, #22c55e 5px, transparent 0);
708
+ }
709
+
710
+ .preview-frame {
711
+ width: 100%;
712
+ height: 380px;
713
+ border: none;
714
+ background: #f8f9fa;
715
+ }
716
+
717
+ /* ─── Responsive ─── */
718
+ @media (max-width: 768px) {
719
+ .header { flex-direction: column; gap: 1rem; }
720
+ .header-right { width: 100%; justify-content: space-between; }
721
+ .form-row { flex-direction: column; }
722
+ .stat-grid { grid-template-columns: repeat(2, 1fr); }
723
+ .nav { flex-wrap: wrap; }
724
+ .cell-url { max-width: 160px; }
725
+ .botpage-layout { grid-template-columns: 1fr; }
726
+ }
727
+
728
+ /* ─── Scrollbar ─── */
729
+ ::-webkit-scrollbar { width: 6px; }
730
+ ::-webkit-scrollbar-track { background: transparent; }
731
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
732
+ ::-webkit-scrollbar-thumb:hover { background: var(--border-hover); }
733
+
734
+ /* ─── Toast Notification ─── */
735
+ .toast {
736
+ position: fixed;
737
+ bottom: 1.5rem;
738
+ right: 1.5rem;
739
+ padding: 0.75rem 1.25rem;
740
+ background: var(--bg-secondary);
741
+ border: 1px solid var(--border);
742
+ border-radius: var(--radius-md);
743
+ color: var(--text-primary);
744
+ font-size: 0.85rem;
745
+ box-shadow: var(--shadow-lg);
746
+ animation: slideUp 300ms ease;
747
+ z-index: 2000;
748
+ }
749
+
750
+ .toast.success { border-color: var(--green); }
751
+ .toast.error { border-color: var(--red); }
752
+
753
+ @keyframes slideUp {
754
+ from { opacity: 0; transform: translateY(20px); }
755
+ to { opacity: 1; transform: translateY(0); }
756
+ }