suioutkit 1.0.1

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,751 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
2
+
3
+ :root {
4
+ /* SPDX-License-Identifier: GPL-3.0
5
+ Copyright (c) 2026 The3rdWebLabs (https://github.com/the3rdweblabs)
6
+ Author: @CYBWithFlourish (https://github.com/CYBWithFlourish)
7
+ */
8
+ --sok-font: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
9
+ --sok-bg: #ffffff;
10
+ --sok-card-bg: rgba(255, 255, 255, 0.9);
11
+ --sok-text: #1a1b1f;
12
+ --sok-text-muted: #64748b;
13
+ --sok-accent: #6366f1;
14
+ --sok-accent-hover: #4f46e5;
15
+ --sok-accent-grad: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
16
+ --sok-border: rgba(0, 0, 0, 0.06);
17
+ --sok-shadow: 0px 8px 32px rgba(0, 0, 0, 0.12), 0px 2px 8px rgba(0, 0, 0, 0.04);
18
+ }
19
+
20
+ @media (prefers-color-scheme: dark) {
21
+ :root {
22
+ --sok-bg: #0d0e12;
23
+ --sok-card-bg: rgba(18, 20, 26, 0.95);
24
+ --sok-text: #f3f4f6;
25
+ --sok-text-muted: #9ca3af;
26
+ --sok-border: rgba(255, 255, 255, 0.08);
27
+ --sok-shadow: 0px 16px 48px rgba(0, 0, 0, 0.4), 0px 2px 12px rgba(0, 0, 0, 0.2);
28
+ }
29
+ }
30
+
31
+ .suioutkit-overlay {
32
+ position: fixed;
33
+ top: 0;
34
+ left: 0;
35
+ width: 100%;
36
+ height: 100%;
37
+ background: rgba(0, 0, 0, 0.4);
38
+ backdrop-filter: blur(8px);
39
+ -webkit-backdrop-filter: blur(8px);
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ padding: 12px;
44
+ overflow-y: auto;
45
+ z-index: 99999;
46
+ opacity: 0;
47
+ transition: opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1);
48
+ font-family: var(--sok-font);
49
+ }
50
+
51
+ .suioutkit-overlay.active {
52
+ opacity: 1;
53
+ }
54
+
55
+ .suioutkit-card {
56
+ background: var(--sok-card-bg);
57
+ border: 1px solid var(--sok-border);
58
+ box-shadow: var(--sok-shadow);
59
+ border-radius: 24px;
60
+ width: 100%;
61
+ max-width: 420px;
62
+ padding: 24px;
63
+ position: relative;
64
+ transform: translateY(20px) scale(0.95);
65
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
66
+ box-sizing: border-box;
67
+ }
68
+
69
+ .suioutkit-overlay.active .suioutkit-card {
70
+ transform: translateY(0) scale(1);
71
+ }
72
+
73
+ .suioutkit-close {
74
+ position: absolute;
75
+ top: 20px;
76
+ right: 20px;
77
+ background: rgba(120, 120, 120, 0.1);
78
+ border: none;
79
+ width: 28px;
80
+ height: 28px;
81
+ border-radius: 50%;
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ cursor: pointer;
86
+ color: var(--sok-text);
87
+ font-size: 16px;
88
+ font-weight: 500;
89
+ transition: background 0.2s ease, transform 0.2s ease;
90
+ }
91
+
92
+ .suioutkit-close:hover {
93
+ background: rgba(120, 120, 120, 0.2);
94
+ transform: rotate(90deg);
95
+ }
96
+
97
+ .suioutkit-header {
98
+ margin-bottom: 24px;
99
+ text-align: center;
100
+ }
101
+
102
+ .suioutkit-title {
103
+ font-size: 20px;
104
+ font-weight: 700;
105
+ color: var(--sok-text);
106
+ margin: 0 0 6px 0;
107
+ letter-spacing: -0.02em;
108
+ }
109
+
110
+ .suioutkit-subtitle {
111
+ font-size: 13px;
112
+ color: var(--sok-text-muted);
113
+ margin: 0;
114
+ }
115
+
116
+ .suioutkit-body {
117
+ display: flex;
118
+ flex-direction: column;
119
+ gap: 12px;
120
+ }
121
+
122
+ .suioutkit-content {
123
+ width: 100%;
124
+ }
125
+
126
+ .suioutkit-summary {
127
+ display: none;
128
+ }
129
+
130
+ /* Option Buttons */
131
+ .suioutkit-option {
132
+ background: transparent;
133
+ border: 1px solid transparent;
134
+ border-radius: 12px;
135
+ padding: 8px 16px;
136
+ display: block;
137
+ width: 100%;
138
+ cursor: pointer;
139
+ transition: all 0.15s ease;
140
+ text-align: left;
141
+ }
142
+
143
+ .suioutkit-option:hover {
144
+ background: rgba(0, 0, 0, 0.04);
145
+ transform: scale(0.98);
146
+ }
147
+
148
+ @media (prefers-color-scheme: dark) {
149
+ .suioutkit-option {
150
+ background: transparent;
151
+ }
152
+
153
+ .suioutkit-option:hover {
154
+ background: rgba(255, 255, 255, 0.05);
155
+ }
156
+ }
157
+
158
+ .suioutkit-option-content {
159
+ display: flex;
160
+ align-items: center;
161
+ gap: 16px;
162
+ }
163
+
164
+ .suioutkit-option-img {
165
+ width: 36px;
166
+ height: 36px;
167
+ border-radius: 8px;
168
+ object-fit: contain;
169
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06);
170
+ background: white;
171
+ /* Ensure white background for logos */
172
+ padding: 2px;
173
+ }
174
+
175
+ .suioutkit-option-name {
176
+ font-size: 16px;
177
+ font-weight: 700;
178
+ color: var(--sok-text);
179
+ }
180
+
181
+ /* Charge & Details Panel */
182
+ .suioutkit-panel {
183
+ display: flex;
184
+ flex-direction: column;
185
+ align-items: center;
186
+ text-align: center;
187
+ padding: 8px 0;
188
+ width: 100%;
189
+ }
190
+
191
+ .suioutkit-back {
192
+ align-self: flex-start;
193
+ background: none;
194
+ border: none;
195
+ color: var(--sok-accent);
196
+ font-size: 13px;
197
+ font-weight: 600;
198
+ cursor: pointer;
199
+ padding: 0 0 16px 0;
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 4px;
203
+ }
204
+
205
+ .suioutkit-back:hover {
206
+ text-decoration: underline;
207
+ }
208
+
209
+ .suioutkit-amount-box {
210
+ margin-bottom: 20px;
211
+ }
212
+
213
+ .sok-fiat-amt {
214
+ font-size: 32px;
215
+ font-weight: 800;
216
+ color: var(--sok-text);
217
+ letter-spacing: -0.03em;
218
+ }
219
+
220
+ /* Virtual Account Info Card */
221
+ .sok-va-card {
222
+ background: rgba(120, 120, 120, 0.05);
223
+ border: 1px solid var(--sok-border);
224
+ border-radius: 20px;
225
+ width: 100%;
226
+ padding: 20px;
227
+ box-sizing: border-box;
228
+ text-align: left;
229
+ margin-bottom: 16px;
230
+ position: relative;
231
+ }
232
+
233
+ .sok-va-row {
234
+ margin-bottom: 12px;
235
+ }
236
+
237
+ .sok-va-row:last-child {
238
+ margin-bottom: 0;
239
+ }
240
+
241
+ .sok-va-lbl {
242
+ font-size: 11px;
243
+ font-weight: 500;
244
+ text-transform: uppercase;
245
+ color: var(--sok-text-muted);
246
+ letter-spacing: 0.05em;
247
+ }
248
+
249
+ .sok-va-val {
250
+ font-size: 18px;
251
+ font-weight: 700;
252
+ color: var(--sok-text);
253
+ margin-top: 4px;
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: space-between;
257
+ }
258
+
259
+ .sok-copy-btn {
260
+ background: var(--sok-accent);
261
+ color: white;
262
+ border: none;
263
+ border-radius: 8px;
264
+ padding: 4px 8px;
265
+ font-size: 11px;
266
+ font-weight: 600;
267
+ cursor: pointer;
268
+ transition: opacity 0.2s ease;
269
+ }
270
+
271
+ .sok-copy-btn:hover {
272
+ opacity: 0.9;
273
+ }
274
+
275
+ .sok-copied-alert {
276
+ position: absolute;
277
+ top: 10px;
278
+ right: 10px;
279
+ background: #10b981;
280
+ color: white;
281
+ font-size: 11px;
282
+ font-weight: 600;
283
+ padding: 4px 8px;
284
+ border-radius: 6px;
285
+ opacity: 0;
286
+ transform: translateY(-5px);
287
+ transition: all 0.2s ease;
288
+ }
289
+
290
+ .sok-copied-alert.show {
291
+ opacity: 1;
292
+ transform: translateY(0);
293
+ }
294
+
295
+ /* Spinner Loader */
296
+ .sok-spinner {
297
+ width: 32px;
298
+ height: 32px;
299
+ border: 3px solid rgba(120, 120, 120, 0.1);
300
+ border-radius: 50%;
301
+ border-top-color: var(--sok-accent);
302
+ animation: sok-spin 0.8s linear infinite;
303
+ margin: 8px auto 12px;
304
+ }
305
+
306
+ .sok-spinner.sok-spinner-compact {
307
+ margin: 0 auto 8px;
308
+ }
309
+
310
+ @keyframes sok-spin {
311
+ to {
312
+ transform: rotate(360deg);
313
+ }
314
+ }
315
+
316
+ .sok-status-text {
317
+ font-size: 13px;
318
+ font-weight: 500;
319
+ color: var(--sok-text-muted);
320
+ margin-top: 0;
321
+ }
322
+
323
+ .payment-status-ui {
324
+ width: 100%;
325
+ }
326
+
327
+ .payment-status-copy {
328
+ margin-top: 8px;
329
+ font-size: 13px;
330
+ font-weight: 600;
331
+ color: var(--sok-text);
332
+ text-align: center;
333
+ }
334
+
335
+ @media (max-width: 560px) {
336
+ .suioutkit-card {
337
+ max-width: none;
338
+ padding: 20px 16px;
339
+ border-radius: 20px;
340
+ }
341
+
342
+ .suioutkit-overlay {
343
+ padding: 8px;
344
+ }
345
+
346
+ .suioutkit-title {
347
+ font-size: 18px;
348
+ }
349
+
350
+ .suioutkit-option-content {
351
+ gap: 12px;
352
+ }
353
+ }
354
+
355
+ /* Successful Settlement View */
356
+ .sok-success-icon {
357
+ font-size: 48px;
358
+ color: #10b981;
359
+ margin-bottom: 12px;
360
+ }
361
+
362
+ .sok-success-title {
363
+ font-size: 20px;
364
+ font-weight: 700;
365
+ color: var(--sok-text);
366
+ margin-bottom: 6px;
367
+ }
368
+
369
+ .sok-success-desc {
370
+ font-size: 13px;
371
+ color: var(--sok-text-muted);
372
+ margin-bottom: 20px;
373
+ }
374
+
375
+ .sok-success-details {
376
+ background: rgba(16, 185, 129, 0.05);
377
+ border: 1px solid rgba(16, 185, 129, 0.2);
378
+ border-radius: 16px;
379
+ padding: 16px;
380
+ width: 100%;
381
+ box-sizing: border-box;
382
+ text-align: left;
383
+ font-size: 12px;
384
+ color: var(--sok-text);
385
+ }
386
+
387
+ .sok-receipt-row {
388
+ display: flex;
389
+ justify-content: space-between;
390
+ margin-bottom: 8px;
391
+ }
392
+
393
+ .sok-receipt-row:last-child {
394
+ margin-bottom: 0;
395
+ }
396
+
397
+ .sok-receipt-lbl {
398
+ color: var(--sok-text-muted);
399
+ font-weight: 500;
400
+ }
401
+
402
+ .sok-receipt-val {
403
+ font-weight: 600;
404
+ max-width: 180px;
405
+ overflow: hidden;
406
+ text-overflow: ellipsis;
407
+ white-space: nowrap;
408
+ }
409
+
410
+ .sok-receipt-val a {
411
+ color: var(--sok-accent);
412
+ text-decoration: none;
413
+ }
414
+
415
+ .sok-receipt-val a:hover {
416
+ text-decoration: underline;
417
+ }
418
+
419
+ /* Form Fields for OPay / Wallet */
420
+ .sok-form {
421
+ width: 100%;
422
+ display: flex;
423
+ flex-direction: column;
424
+ gap: 12px;
425
+ margin-bottom: 16px;
426
+ }
427
+
428
+ .sok-input {
429
+ background: rgba(120, 120, 120, 0.05);
430
+ border: 1px solid var(--sok-border);
431
+ border-radius: 12px;
432
+ padding: 12px 16px;
433
+ font-size: 14px;
434
+ font-weight: 500;
435
+ color: var(--sok-text);
436
+ outline: none;
437
+ box-sizing: border-box;
438
+ width: 100%;
439
+ transition: border-color 0.2s ease;
440
+ }
441
+
442
+ .sok-input:focus {
443
+ border-color: var(--sok-accent);
444
+ }
445
+
446
+ .sok-btn {
447
+ background: var(--sok-accent-grad);
448
+ color: white;
449
+ border: none;
450
+ border-radius: 12px;
451
+ padding: 14px 16px;
452
+ font-size: 14px;
453
+ font-weight: 600;
454
+ cursor: pointer;
455
+ width: 100%;
456
+ box-shadow: 0px 4px 12px rgba(99, 102, 241, 0.2);
457
+ transition: opacity 0.2s ease;
458
+ }
459
+
460
+ .sok-btn:hover {
461
+ opacity: 0.95;
462
+ }
463
+
464
+ .sok-btn:disabled {
465
+ opacity: 0.5;
466
+ cursor: not-allowed;
467
+ box-shadow: none;
468
+ }
469
+
470
+ /* outPay QR Code specifications */
471
+ .sok-qr-card {
472
+ background: var(--sok-bg);
473
+ border: 1px solid var(--sok-border);
474
+ border-radius: 20px;
475
+ padding: 20px;
476
+ display: flex;
477
+ flex-direction: column;
478
+ align-items: center;
479
+ margin-bottom: 16px;
480
+ box-shadow: inset 0px 2px 8px rgba(0, 0, 0, 0.05);
481
+ position: relative;
482
+ box-sizing: border-box;
483
+ width: 100%;
484
+ }
485
+
486
+ .sok-qr-frame {
487
+ background: #ffffff;
488
+ /* Pure white background ensures perfect scanning visibility */
489
+ padding: 12px;
490
+ border-radius: 16px;
491
+ box-shadow: 0px 8px 24px rgba(0, 0, 0, 0.06);
492
+ position: relative;
493
+ overflow: hidden;
494
+ margin-bottom: 12px;
495
+ width: 204px;
496
+ height: 204px;
497
+ box-sizing: border-box;
498
+ }
499
+
500
+ .sok-qr-img {
501
+ width: 180px;
502
+ height: 180px;
503
+ display: block;
504
+ }
505
+
506
+ /* outPay overlay logo badge centered on the QR code */
507
+ .sok-qr-logo-badge {
508
+ position: absolute;
509
+ top: 50%;
510
+ left: 50%;
511
+ transform: translate(-50%, -50%);
512
+ width: 36px;
513
+ height: 36px;
514
+ background: var(--sok-accent-grad);
515
+ border-radius: 10px;
516
+ border: 3px solid #ffffff;
517
+ display: flex;
518
+ align-items: center;
519
+ justify-content: center;
520
+ font-size: 16px;
521
+ color: white;
522
+ font-weight: 800;
523
+ box-shadow: 0px 4px 12px rgba(99, 102, 241, 0.3);
524
+ }
525
+
526
+ .sok-qr-scan-pulse {
527
+ position: absolute;
528
+ top: 0;
529
+ left: 0;
530
+ width: 100%;
531
+ height: 3px;
532
+ background: linear-gradient(90deg, rgba(99, 102, 241, 0) 0%, rgba(99, 102, 241, 1) 50%, rgba(99, 102, 241, 0) 100%);
533
+ animation: sok-qr-scan 2.5s ease-in-out infinite;
534
+ }
535
+
536
+ @keyframes sok-qr-scan {
537
+ 0% {
538
+ top: 0%;
539
+ }
540
+
541
+ 50% {
542
+ top: 100%;
543
+ }
544
+
545
+ 100% {
546
+ top: 0%;
547
+ }
548
+ }
549
+
550
+ /* Wallet List Container */
551
+ .suioutkit-wallet-list {
552
+ display: grid;
553
+ grid-template-columns: 1fr;
554
+ gap: 12px;
555
+ width: 100%;
556
+ max-height: 400px;
557
+ overflow-y: auto;
558
+ padding: 0;
559
+ }
560
+
561
+ /* Wallet Card */
562
+ .sok-wallet-card {
563
+ background: rgba(120, 120, 120, 0.05);
564
+ border: 1px solid var(--sok-border);
565
+ border-radius: 16px;
566
+ padding: 16px;
567
+ display: flex;
568
+ align-items: center;
569
+ gap: 16px;
570
+ cursor: pointer;
571
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
572
+ text-align: left;
573
+ }
574
+
575
+ .sok-wallet-card:hover:not([style*="pointer-events: none"]) {
576
+ background: rgba(120, 120, 120, 0.08);
577
+ border-color: var(--sok-accent);
578
+ transform: translateY(-2px);
579
+ box-shadow: 0px 4px 12px rgba(99, 102, 241, 0.1);
580
+ }
581
+
582
+ .sok-wallet-icon {
583
+ width: 48px;
584
+ height: 48px;
585
+ border-radius: 8px;
586
+ object-fit: contain;
587
+ flex-shrink: 0;
588
+ }
589
+
590
+ .sok-wallet-name {
591
+ font-size: 15px;
592
+ font-weight: 600;
593
+ color: var(--sok-text);
594
+ }
595
+
596
+ /* Horizontal Progress Stepper */
597
+ .stepper {
598
+ display: flex;
599
+ align-items: center;
600
+ justify-content: center;
601
+ gap: 12px;
602
+ margin: 18px 0 12px;
603
+ }
604
+
605
+ .step {
606
+ display: flex;
607
+ flex-direction: column;
608
+ align-items: center;
609
+ position: relative;
610
+ }
611
+
612
+ .circle {
613
+ width: 32px;
614
+ height: 32px;
615
+ border-radius: 50%;
616
+ background: var(--sok-bg);
617
+ border: 2px solid var(--sok-border);
618
+ display: flex;
619
+ align-items: center;
620
+ justify-content: center;
621
+ font-weight: 600;
622
+ color: var(--sok-text);
623
+ }
624
+
625
+ .circle.filled {
626
+ background: var(--sok-accent);
627
+ color: white;
628
+ border-color: var(--sok-accent);
629
+ }
630
+
631
+ .label {
632
+ margin-top: 6px;
633
+ font-size: 13px;
634
+ color: var(--sok-text-muted);
635
+ text-align: center;
636
+ min-width: 60px;
637
+ }
638
+
639
+ .line {
640
+ position: absolute;
641
+ top: 16px;
642
+ /* align with circle center */
643
+ left: 100%;
644
+ width: 40px;
645
+ height: 2px;
646
+ background: var(--sok-border);
647
+ }
648
+
649
+ .step:not(:last-child) .line {
650
+ display: block;
651
+ }
652
+
653
+ .step:last-child .line {
654
+ display: none;
655
+ }
656
+
657
+ @media (max-width: 560px) {
658
+ .suioutkit-overlay {
659
+ align-items: flex-start;
660
+ }
661
+
662
+ .suioutkit-card {
663
+ width: min(100%, calc(100vw - 16px));
664
+ padding: 18px;
665
+ border-radius: 20px;
666
+ max-height: calc(100vh - 16px);
667
+ }
668
+
669
+ .suioutkit-summary,
670
+ .suioutkit-method-grid {
671
+ grid-template-columns: 1fr;
672
+ }
673
+
674
+ .suioutkit-option {
675
+ padding: 12px;
676
+ }
677
+
678
+ .suioutkit-header {
679
+ margin-bottom: 18px;
680
+ }
681
+
682
+ .sok-fiat-amt {
683
+ font-size: 28px;
684
+ }
685
+
686
+ .sok-spinner {
687
+ margin-top: 4px;
688
+ }
689
+
690
+ .sok-va-card,
691
+ .sok-qr-card,
692
+ .sok-success-details {
693
+ padding: 16px;
694
+ }
695
+
696
+ .sok-va-val,
697
+ .sok-receipt-row {
698
+ flex-wrap: wrap;
699
+ gap: 8px;
700
+ }
701
+
702
+ .sok-receipt-val {
703
+ max-width: 100%;
704
+ white-space: normal;
705
+ word-break: break-word;
706
+ }
707
+
708
+ .sok-qr-frame {
709
+ width: min(100%, 204px);
710
+ height: auto;
711
+ aspect-ratio: 1 / 1;
712
+ }
713
+
714
+ .sok-qr-img {
715
+ width: 100%;
716
+ height: 100%;
717
+ }
718
+
719
+ .stepper {
720
+ flex-direction: column;
721
+ align-items: stretch;
722
+ gap: 10px;
723
+ margin: 18px 0 8px;
724
+ }
725
+
726
+ .step {
727
+ flex-direction: row;
728
+ align-items: center;
729
+ gap: 10px;
730
+ width: 100%;
731
+ }
732
+
733
+ .circle {
734
+ flex-shrink: 0;
735
+ }
736
+
737
+ .label {
738
+ margin-top: 0;
739
+ text-align: left;
740
+ min-width: 0;
741
+ flex: 1;
742
+ }
743
+
744
+ .line {
745
+ display: none;
746
+ }
747
+
748
+ .payment-status-copy {
749
+ font-size: 12px;
750
+ }
751
+ }