@solvapay/react 1.0.7 → 1.0.8-preview.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.
@@ -0,0 +1,869 @@
1
+ /**
2
+ * @solvapay/react — golden-path default styles.
3
+ *
4
+ * Opt-in via `import '@solvapay/react/styles.css'`. Theme by overriding the
5
+ * CSS custom properties exposed on `:root`. Every rule targets either an
6
+ * opaque `data-solvapay-*` selector (works for consumer compositions of the
7
+ * primitives) or a `.solvapay-*` class seeded by the default-tree shims in
8
+ * `src/components/*`. No element styles; safe to layer.
9
+ */
10
+
11
+ :root {
12
+ --solvapay-accent: hsl(222 47% 11%);
13
+ --solvapay-accent-foreground: hsl(0 0% 98%);
14
+ --solvapay-accent-hover: hsl(222 47% 20%);
15
+ --solvapay-surface: hsl(0 0% 100%);
16
+ --solvapay-muted: hsl(210 40% 96%);
17
+ --solvapay-muted-foreground: hsl(215 16% 47%);
18
+ --solvapay-border: hsl(214 32% 91%);
19
+ --solvapay-destructive: hsl(0 72% 51%);
20
+ --solvapay-warning: hsl(38 92% 50%);
21
+ --solvapay-radius: 0.5rem;
22
+ --solvapay-font: inherit;
23
+ }
24
+
25
+ /* -----------------------------------------------------------------------------
26
+ * Checkout layout shell (drop-in)
27
+ * -------------------------------------------------------------------------- */
28
+
29
+ .solvapay-checkout-layout {
30
+ font-family: var(--solvapay-font);
31
+ color: var(--solvapay-accent);
32
+ display: grid;
33
+ gap: 1rem;
34
+ padding: 1rem;
35
+ font-size: 0.875rem;
36
+ line-height: 1.5;
37
+ }
38
+
39
+ [data-solvapay-checkout-layout='desktop'].solvapay-checkout-layout {
40
+ gap: 1.5rem;
41
+ padding: 1.5rem;
42
+ }
43
+
44
+ [data-solvapay-checkout-layout='desktop'][data-solvapay-step='pay'].solvapay-checkout-layout {
45
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
46
+ }
47
+
48
+ [data-solvapay-checkout-layout='mobile'].solvapay-checkout-layout {
49
+ font-size: 0.9375rem;
50
+ }
51
+
52
+ [data-solvapay-checkout-layout='chat'].solvapay-checkout-layout {
53
+ padding: 0.5rem;
54
+ gap: 0.75rem;
55
+ }
56
+
57
+ .solvapay-back {
58
+ align-self: flex-start;
59
+ background: transparent;
60
+ border: none;
61
+ color: var(--solvapay-muted-foreground);
62
+ cursor: pointer;
63
+ font: inherit;
64
+ padding: 0.25rem 0;
65
+ text-decoration: none;
66
+ transition: color 120ms ease;
67
+ }
68
+
69
+ .solvapay-back:hover {
70
+ color: var(--solvapay-accent);
71
+ }
72
+
73
+ .solvapay-back:focus-visible {
74
+ outline: 2px solid var(--solvapay-accent);
75
+ outline-offset: 2px;
76
+ border-radius: calc(var(--solvapay-radius) / 2);
77
+ }
78
+
79
+ .solvapay-continue {
80
+ align-self: stretch;
81
+ background: var(--solvapay-accent);
82
+ color: var(--solvapay-accent-foreground);
83
+ border: none;
84
+ border-radius: var(--solvapay-radius);
85
+ cursor: pointer;
86
+ font: inherit;
87
+ font-weight: 500;
88
+ padding: 0.75rem 1rem;
89
+ transition:
90
+ background-color 120ms ease,
91
+ opacity 120ms ease;
92
+ }
93
+
94
+ .solvapay-continue:hover:not(:disabled) {
95
+ background: var(--solvapay-accent-hover);
96
+ }
97
+
98
+ .solvapay-continue:disabled,
99
+ .solvapay-continue[data-state='disabled'] {
100
+ opacity: 0.5;
101
+ cursor: not-allowed;
102
+ }
103
+
104
+ .solvapay-continue:focus-visible {
105
+ outline: 2px solid var(--solvapay-accent);
106
+ outline-offset: 2px;
107
+ }
108
+
109
+ /* -----------------------------------------------------------------------------
110
+ * CheckoutSummary
111
+ * -------------------------------------------------------------------------- */
112
+
113
+ [data-solvapay-checkout-summary] {
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: 0.25rem;
117
+ background: var(--solvapay-muted);
118
+ border-radius: var(--solvapay-radius);
119
+ padding: 1rem;
120
+ }
121
+
122
+ [data-solvapay-checkout-summary-product],
123
+ .solvapay-checkout-summary-product {
124
+ font-weight: 600;
125
+ color: var(--solvapay-accent);
126
+ }
127
+
128
+ .solvapay-checkout-summary-row {
129
+ display: flex;
130
+ align-items: baseline;
131
+ justify-content: space-between;
132
+ gap: 0.5rem;
133
+ }
134
+
135
+ [data-solvapay-checkout-summary-plan],
136
+ .solvapay-checkout-summary-plan {
137
+ color: var(--solvapay-muted-foreground);
138
+ }
139
+
140
+ [data-solvapay-checkout-summary-price],
141
+ .solvapay-checkout-summary-price {
142
+ font-weight: 600;
143
+ color: var(--solvapay-accent);
144
+ font-variant-numeric: tabular-nums;
145
+ }
146
+
147
+ [data-solvapay-checkout-summary-trial],
148
+ .solvapay-checkout-summary-trial,
149
+ [data-solvapay-checkout-summary-tax-note],
150
+ .solvapay-checkout-summary-tax-note {
151
+ color: var(--solvapay-muted-foreground);
152
+ font-size: 0.8125rem;
153
+ }
154
+
155
+ /* -----------------------------------------------------------------------------
156
+ * PlanSelector
157
+ * -------------------------------------------------------------------------- */
158
+
159
+ [data-solvapay-plan-selector],
160
+ .solvapay-plan-selector {
161
+ display: flex;
162
+ flex-direction: column;
163
+ gap: 0.75rem;
164
+ }
165
+
166
+ [data-solvapay-plan-selector-heading],
167
+ .solvapay-plan-selector-heading {
168
+ font-size: 1rem;
169
+ font-weight: 600;
170
+ margin: 0;
171
+ color: var(--solvapay-accent);
172
+ }
173
+
174
+ [data-solvapay-plan-selector-grid],
175
+ .solvapay-plan-selector-grid {
176
+ display: grid;
177
+ gap: 0.75rem;
178
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
179
+ }
180
+
181
+ [data-solvapay-plan-selector-card] {
182
+ position: relative;
183
+ display: flex;
184
+ flex-direction: column;
185
+ gap: 0.25rem;
186
+ align-items: flex-start;
187
+ background: var(--solvapay-surface);
188
+ border: 1px solid var(--solvapay-border);
189
+ border-radius: var(--solvapay-radius);
190
+ padding: 1rem;
191
+ text-align: left;
192
+ cursor: pointer;
193
+ font: inherit;
194
+ color: inherit;
195
+ transition:
196
+ border-color 120ms ease,
197
+ box-shadow 120ms ease,
198
+ background-color 120ms ease;
199
+ }
200
+
201
+ [data-solvapay-plan-selector-card]:hover:not([data-state='disabled']) {
202
+ border-color: var(--solvapay-accent);
203
+ }
204
+
205
+ [data-solvapay-plan-selector-card]:focus-visible {
206
+ outline: none;
207
+ border-color: var(--solvapay-accent);
208
+ box-shadow: 0 0 0 2px var(--solvapay-accent);
209
+ }
210
+
211
+ [data-solvapay-plan-selector-card][data-state='selected'] {
212
+ border-color: var(--solvapay-accent);
213
+ box-shadow: 0 0 0 1px var(--solvapay-accent);
214
+ }
215
+
216
+ [data-solvapay-plan-selector-card][data-state='current'] {
217
+ background: var(--solvapay-muted);
218
+ border-color: var(--solvapay-border);
219
+ cursor: default;
220
+ }
221
+
222
+ [data-solvapay-plan-selector-card][data-state='disabled'] {
223
+ opacity: 0.6;
224
+ cursor: not-allowed;
225
+ }
226
+
227
+ [data-solvapay-plan-selector-card][data-popular] {
228
+ border-color: var(--solvapay-accent);
229
+ }
230
+
231
+ [data-solvapay-plan-selector-card-name],
232
+ .solvapay-plan-selector-card-name {
233
+ font-weight: 600;
234
+ color: var(--solvapay-accent);
235
+ }
236
+
237
+ [data-solvapay-plan-selector-card-price],
238
+ .solvapay-plan-selector-card-price {
239
+ font-size: 1.125rem;
240
+ font-weight: 600;
241
+ color: var(--solvapay-accent);
242
+ font-variant-numeric: tabular-nums;
243
+ }
244
+
245
+ [data-solvapay-plan-selector-card-interval],
246
+ .solvapay-plan-selector-card-interval {
247
+ color: var(--solvapay-muted-foreground);
248
+ font-size: 0.8125rem;
249
+ }
250
+
251
+ [data-solvapay-plan-selector-card-badge] {
252
+ position: absolute;
253
+ top: 0.5rem;
254
+ right: 0.5rem;
255
+ background: var(--solvapay-accent);
256
+ color: var(--solvapay-accent-foreground);
257
+ border-radius: 999px;
258
+ font-size: 0.6875rem;
259
+ font-weight: 600;
260
+ letter-spacing: 0.02em;
261
+ padding: 0.125rem 0.5rem;
262
+ text-transform: uppercase;
263
+ }
264
+
265
+ [data-solvapay-plan-selector-card-badge][data-variant='current'] {
266
+ background: var(--solvapay-muted-foreground);
267
+ }
268
+
269
+ [data-solvapay-plan-selector-loading],
270
+ .solvapay-plan-selector-loading {
271
+ color: var(--solvapay-muted-foreground);
272
+ font-size: 0.875rem;
273
+ padding: 1rem 0;
274
+ }
275
+
276
+ [data-solvapay-plan-selector-error],
277
+ .solvapay-plan-selector-error {
278
+ color: var(--solvapay-destructive);
279
+ font-size: 0.875rem;
280
+ padding: 0.75rem 1rem;
281
+ border: 1px solid var(--solvapay-destructive);
282
+ border-radius: var(--solvapay-radius);
283
+ background: color-mix(in srgb, var(--solvapay-destructive) 6%, transparent);
284
+ }
285
+
286
+ /* -----------------------------------------------------------------------------
287
+ * PaymentForm
288
+ * -------------------------------------------------------------------------- */
289
+
290
+ [data-solvapay-payment-form] {
291
+ display: flex;
292
+ flex-direction: column;
293
+ gap: 1rem;
294
+ }
295
+
296
+ [data-solvapay-payment-form-customer-fields] {
297
+ display: flex;
298
+ flex-direction: column;
299
+ gap: 0.5rem;
300
+ }
301
+
302
+ [data-solvapay-payment-form-customer-email] input,
303
+ [data-solvapay-payment-form-customer-name] input {
304
+ width: 100%;
305
+ background: var(--solvapay-surface);
306
+ border: 1px solid var(--solvapay-border);
307
+ border-radius: var(--solvapay-radius);
308
+ font: inherit;
309
+ padding: 0.625rem 0.75rem;
310
+ color: var(--solvapay-accent);
311
+ transition: border-color 120ms ease;
312
+ }
313
+
314
+ [data-solvapay-payment-form-customer-email] input:focus,
315
+ [data-solvapay-payment-form-customer-name] input:focus {
316
+ outline: none;
317
+ border-color: var(--solvapay-accent);
318
+ box-shadow: 0 0 0 1px var(--solvapay-accent);
319
+ }
320
+
321
+ [data-solvapay-payment-form-terms] {
322
+ display: flex;
323
+ align-items: flex-start;
324
+ gap: 0.5rem;
325
+ font-size: 0.8125rem;
326
+ color: var(--solvapay-muted-foreground);
327
+ }
328
+
329
+ [data-solvapay-payment-form-submit] {
330
+ background: var(--solvapay-accent);
331
+ color: var(--solvapay-accent-foreground);
332
+ border: none;
333
+ border-radius: var(--solvapay-radius);
334
+ cursor: pointer;
335
+ font: inherit;
336
+ font-weight: 500;
337
+ padding: 0.75rem 1rem;
338
+ transition:
339
+ background-color 120ms ease,
340
+ opacity 120ms ease;
341
+ }
342
+
343
+ [data-solvapay-payment-form-submit]:hover:not(:disabled) {
344
+ background: var(--solvapay-accent-hover);
345
+ }
346
+
347
+ [data-solvapay-payment-form-submit]:focus-visible {
348
+ outline: 2px solid var(--solvapay-accent);
349
+ outline-offset: 2px;
350
+ }
351
+
352
+ [data-solvapay-payment-form-submit][data-state='processing'] {
353
+ opacity: 0.75;
354
+ cursor: wait;
355
+ }
356
+
357
+ [data-solvapay-payment-form-submit][data-state='disabled'],
358
+ [data-solvapay-payment-form-submit]:disabled {
359
+ opacity: 0.5;
360
+ cursor: not-allowed;
361
+ }
362
+
363
+ [data-solvapay-payment-form-loading] {
364
+ color: var(--solvapay-muted-foreground);
365
+ font-size: 0.875rem;
366
+ padding: 1rem 0;
367
+ }
368
+
369
+ [data-solvapay-payment-form-error] {
370
+ color: var(--solvapay-destructive);
371
+ font-size: 0.875rem;
372
+ padding: 0.75rem 1rem;
373
+ border: 1px solid var(--solvapay-destructive);
374
+ border-radius: var(--solvapay-radius);
375
+ background: color-mix(in srgb, var(--solvapay-destructive) 6%, transparent);
376
+ }
377
+
378
+ /* -----------------------------------------------------------------------------
379
+ * ActivationFlow
380
+ * -------------------------------------------------------------------------- */
381
+
382
+ [data-solvapay-activation-flow] {
383
+ display: flex;
384
+ flex-direction: column;
385
+ gap: 1rem;
386
+ }
387
+
388
+ [data-solvapay-activation-flow-summary],
389
+ .solvapay-activation-flow-summary {
390
+ display: flex;
391
+ flex-direction: column;
392
+ gap: 0.75rem;
393
+ background: var(--solvapay-muted);
394
+ border-radius: var(--solvapay-radius);
395
+ padding: 1rem;
396
+ }
397
+
398
+ .solvapay-activation-flow-heading,
399
+ .solvapay-activation-flow-topup-heading {
400
+ font-size: 1rem;
401
+ font-weight: 600;
402
+ margin: 0;
403
+ color: var(--solvapay-accent);
404
+ }
405
+
406
+ .solvapay-activation-flow-topup-subheading {
407
+ color: var(--solvapay-muted-foreground);
408
+ font-size: 0.875rem;
409
+ margin: 0;
410
+ }
411
+
412
+ [data-solvapay-activation-flow-activate],
413
+ [data-solvapay-activation-flow-continue],
414
+ .solvapay-activation-flow-activate,
415
+ .solvapay-activation-flow-continue {
416
+ align-self: stretch;
417
+ background: var(--solvapay-accent);
418
+ color: var(--solvapay-accent-foreground);
419
+ border: none;
420
+ border-radius: var(--solvapay-radius);
421
+ cursor: pointer;
422
+ font: inherit;
423
+ font-weight: 500;
424
+ padding: 0.75rem 1rem;
425
+ transition:
426
+ background-color 120ms ease,
427
+ opacity 120ms ease;
428
+ }
429
+
430
+ [data-solvapay-activation-flow-activate]:hover:not(:disabled),
431
+ [data-solvapay-activation-flow-continue]:hover:not(:disabled) {
432
+ background: var(--solvapay-accent-hover);
433
+ }
434
+
435
+ [data-solvapay-activation-flow-activate]:disabled,
436
+ [data-solvapay-activation-flow-continue]:disabled {
437
+ opacity: 0.5;
438
+ cursor: not-allowed;
439
+ }
440
+
441
+ [data-solvapay-activation-flow-activate]:focus-visible,
442
+ [data-solvapay-activation-flow-continue]:focus-visible {
443
+ outline: 2px solid var(--solvapay-accent);
444
+ outline-offset: 2px;
445
+ }
446
+
447
+ .solvapay-activation-flow-change-amount,
448
+ .solvapay-activation-flow-try-again,
449
+ .solvapay-activation-flow-back {
450
+ background: transparent;
451
+ border: 1px solid var(--solvapay-border);
452
+ border-radius: var(--solvapay-radius);
453
+ color: var(--solvapay-accent);
454
+ cursor: pointer;
455
+ font: inherit;
456
+ padding: 0.5rem 0.75rem;
457
+ transition:
458
+ background-color 120ms ease,
459
+ border-color 120ms ease;
460
+ }
461
+
462
+ .solvapay-activation-flow-change-amount:hover,
463
+ .solvapay-activation-flow-try-again:hover,
464
+ .solvapay-activation-flow-back:hover {
465
+ background: var(--solvapay-muted);
466
+ border-color: var(--solvapay-accent);
467
+ }
468
+
469
+ [data-solvapay-activation-flow-retrying],
470
+ .solvapay-activation-flow-retrying,
471
+ [data-solvapay-activation-flow-activated],
472
+ .solvapay-activation-flow-activated {
473
+ background: var(--solvapay-muted);
474
+ border-radius: var(--solvapay-radius);
475
+ padding: 1rem;
476
+ }
477
+
478
+ [data-solvapay-activation-flow-loading] {
479
+ color: var(--solvapay-muted-foreground);
480
+ font-size: 0.875rem;
481
+ padding: 1rem 0;
482
+ }
483
+
484
+ [data-solvapay-activation-flow-error],
485
+ .solvapay-activation-flow-error {
486
+ color: var(--solvapay-destructive);
487
+ font-size: 0.875rem;
488
+ padding: 0.75rem 1rem;
489
+ border: 1px solid var(--solvapay-destructive);
490
+ border-radius: var(--solvapay-radius);
491
+ background: color-mix(in srgb, var(--solvapay-destructive) 6%, transparent);
492
+ }
493
+
494
+ /* -----------------------------------------------------------------------------
495
+ * AmountPicker
496
+ * -------------------------------------------------------------------------- */
497
+
498
+ [data-solvapay-amount-picker],
499
+ .solvapay-amount-picker {
500
+ display: flex;
501
+ flex-direction: column;
502
+ gap: 0.75rem;
503
+ }
504
+
505
+ .solvapay-amount-picker-label,
506
+ .solvapay-amount-picker-custom-label {
507
+ font-size: 0.8125rem;
508
+ font-weight: 500;
509
+ color: var(--solvapay-muted-foreground);
510
+ margin: 0;
511
+ }
512
+
513
+ .solvapay-amount-picker-pills {
514
+ display: flex;
515
+ flex-wrap: wrap;
516
+ gap: 0.5rem;
517
+ }
518
+
519
+ [data-solvapay-amount-picker-option],
520
+ .solvapay-amount-picker-pill {
521
+ background: var(--solvapay-surface);
522
+ border: 1px solid var(--solvapay-border);
523
+ border-radius: 999px;
524
+ color: var(--solvapay-accent);
525
+ cursor: pointer;
526
+ font: inherit;
527
+ font-weight: 500;
528
+ padding: 0.375rem 0.875rem;
529
+ transition:
530
+ background-color 120ms ease,
531
+ border-color 120ms ease,
532
+ color 120ms ease;
533
+ }
534
+
535
+ [data-solvapay-amount-picker-option]:hover:not([data-state='disabled']),
536
+ .solvapay-amount-picker-pill:hover {
537
+ border-color: var(--solvapay-accent);
538
+ }
539
+
540
+ [data-solvapay-amount-picker-option][data-state='selected'] {
541
+ background: var(--solvapay-accent);
542
+ border-color: var(--solvapay-accent);
543
+ color: var(--solvapay-accent-foreground);
544
+ }
545
+
546
+ [data-solvapay-amount-picker-option][data-state='disabled'] {
547
+ opacity: 0.5;
548
+ cursor: not-allowed;
549
+ }
550
+
551
+ [data-solvapay-amount-picker-option]:focus-visible,
552
+ .solvapay-amount-picker-pill:focus-visible {
553
+ outline: 2px solid var(--solvapay-accent);
554
+ outline-offset: 2px;
555
+ }
556
+
557
+ .solvapay-amount-picker-custom-wrapper {
558
+ display: flex;
559
+ flex-direction: column;
560
+ gap: 0.25rem;
561
+ }
562
+
563
+ .solvapay-amount-picker-custom-row {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 0.5rem;
567
+ background: var(--solvapay-surface);
568
+ border: 1px solid var(--solvapay-border);
569
+ border-radius: var(--solvapay-radius);
570
+ padding: 0.5rem 0.75rem;
571
+ transition: border-color 120ms ease;
572
+ }
573
+
574
+ .solvapay-amount-picker-custom-row:focus-within {
575
+ border-color: var(--solvapay-accent);
576
+ box-shadow: 0 0 0 1px var(--solvapay-accent);
577
+ }
578
+
579
+ .solvapay-amount-picker-currency-symbol {
580
+ color: var(--solvapay-muted-foreground);
581
+ font-weight: 500;
582
+ }
583
+
584
+ [data-solvapay-amount-picker-custom],
585
+ .solvapay-amount-picker-custom-input {
586
+ background: transparent;
587
+ border: none;
588
+ color: var(--solvapay-accent);
589
+ flex: 1;
590
+ font: inherit;
591
+ min-width: 0;
592
+ outline: none;
593
+ padding: 0;
594
+ }
595
+
596
+ [data-solvapay-amount-picker-custom][data-state='active'] {
597
+ color: var(--solvapay-accent);
598
+ }
599
+
600
+ [data-solvapay-amount-picker-custom][data-state='dormant'] {
601
+ color: var(--solvapay-muted-foreground);
602
+ }
603
+
604
+ .solvapay-amount-picker-credit-estimate {
605
+ color: var(--solvapay-muted-foreground);
606
+ font-size: 0.75rem;
607
+ margin: 0;
608
+ }
609
+
610
+ .solvapay-amount-picker-error {
611
+ color: var(--solvapay-destructive);
612
+ font-size: 0.8125rem;
613
+ margin: 0;
614
+ }
615
+
616
+ /* -----------------------------------------------------------------------------
617
+ * BalanceBadge
618
+ * -------------------------------------------------------------------------- */
619
+
620
+ [data-solvapay-balance-badge] {
621
+ display: inline-flex;
622
+ align-items: baseline;
623
+ gap: 0.25rem;
624
+ font-variant-numeric: tabular-nums;
625
+ font-weight: 600;
626
+ color: var(--solvapay-accent);
627
+ }
628
+
629
+ [data-solvapay-balance-badge][data-state='loading'] {
630
+ color: var(--solvapay-muted-foreground);
631
+ }
632
+
633
+ [data-solvapay-balance-badge][data-state='zero'] {
634
+ color: var(--solvapay-destructive);
635
+ }
636
+
637
+ [data-solvapay-balance-badge][data-state='low'] {
638
+ color: var(--solvapay-warning);
639
+ }
640
+
641
+ /* -----------------------------------------------------------------------------
642
+ * CancelPlanButton
643
+ * -------------------------------------------------------------------------- */
644
+
645
+ [data-solvapay-cancel-plan] {
646
+ background: transparent;
647
+ border: 1px solid var(--solvapay-border);
648
+ border-radius: var(--solvapay-radius);
649
+ color: var(--solvapay-accent);
650
+ cursor: pointer;
651
+ font: inherit;
652
+ font-weight: 500;
653
+ padding: 0.5rem 0.875rem;
654
+ transition:
655
+ background-color 120ms ease,
656
+ border-color 120ms ease,
657
+ opacity 120ms ease;
658
+ }
659
+
660
+ [data-solvapay-cancel-plan]:hover:not(:disabled) {
661
+ background: var(--solvapay-muted);
662
+ border-color: var(--solvapay-destructive);
663
+ color: var(--solvapay-destructive);
664
+ }
665
+
666
+ [data-solvapay-cancel-plan]:focus-visible {
667
+ outline: 2px solid var(--solvapay-destructive);
668
+ outline-offset: 2px;
669
+ }
670
+
671
+ [data-solvapay-cancel-plan][data-state='cancelling'],
672
+ [data-solvapay-cancel-plan]:disabled {
673
+ opacity: 0.6;
674
+ cursor: wait;
675
+ }
676
+
677
+ /* -----------------------------------------------------------------------------
678
+ * CancelledPlanNotice
679
+ * -------------------------------------------------------------------------- */
680
+
681
+ [data-solvapay-cancelled-notice],
682
+ .solvapay-cancelled-notice {
683
+ display: flex;
684
+ flex-direction: column;
685
+ gap: 0.5rem;
686
+ background: var(--solvapay-muted);
687
+ border: 1px solid var(--solvapay-border);
688
+ border-radius: var(--solvapay-radius);
689
+ padding: 1rem;
690
+ }
691
+
692
+ [data-solvapay-cancelled-notice][data-state='expired'] {
693
+ border-color: var(--solvapay-destructive);
694
+ background: color-mix(in srgb, var(--solvapay-destructive) 6%, var(--solvapay-muted));
695
+ }
696
+
697
+ [data-solvapay-cancelled-notice-heading],
698
+ .solvapay-cancelled-notice-heading {
699
+ font-size: 0.9375rem;
700
+ font-weight: 600;
701
+ margin: 0;
702
+ color: var(--solvapay-accent);
703
+ }
704
+
705
+ .solvapay-cancelled-notice-details,
706
+ .solvapay-cancelled-notice-footer {
707
+ display: flex;
708
+ flex-direction: column;
709
+ gap: 0.25rem;
710
+ font-size: 0.8125rem;
711
+ color: var(--solvapay-muted-foreground);
712
+ }
713
+
714
+ [data-solvapay-cancelled-notice-days-remaining],
715
+ .solvapay-cancelled-notice-days-remaining {
716
+ color: var(--solvapay-accent);
717
+ font-weight: 500;
718
+ }
719
+
720
+ [data-solvapay-cancelled-notice-reactivate],
721
+ .solvapay-cancelled-notice-reactivate {
722
+ align-self: flex-start;
723
+ background: var(--solvapay-accent);
724
+ color: var(--solvapay-accent-foreground);
725
+ border: none;
726
+ border-radius: var(--solvapay-radius);
727
+ cursor: pointer;
728
+ font: inherit;
729
+ font-weight: 500;
730
+ padding: 0.5rem 0.875rem;
731
+ transition: background-color 120ms ease;
732
+ }
733
+
734
+ [data-solvapay-cancelled-notice-reactivate]:hover:not(:disabled) {
735
+ background: var(--solvapay-accent-hover);
736
+ }
737
+
738
+ [data-solvapay-cancelled-notice-reactivate]:focus-visible {
739
+ outline: 2px solid var(--solvapay-accent);
740
+ outline-offset: 2px;
741
+ }
742
+
743
+ /* -----------------------------------------------------------------------------
744
+ * CreditGate / PurchaseGate
745
+ * -------------------------------------------------------------------------- */
746
+
747
+ [data-solvapay-credit-gate],
748
+ [data-solvapay-purchase-gate],
749
+ .solvapay-credit-gate {
750
+ display: flex;
751
+ flex-direction: column;
752
+ gap: 0.75rem;
753
+ }
754
+
755
+ [data-solvapay-credit-gate-heading],
756
+ .solvapay-credit-gate-heading {
757
+ font-size: 1rem;
758
+ font-weight: 600;
759
+ margin: 0;
760
+ color: var(--solvapay-accent);
761
+ }
762
+
763
+ [data-solvapay-credit-gate-subheading],
764
+ .solvapay-credit-gate-subheading {
765
+ color: var(--solvapay-muted-foreground);
766
+ font-size: 0.875rem;
767
+ margin: 0;
768
+ }
769
+
770
+ [data-solvapay-credit-gate-loading],
771
+ [data-solvapay-purchase-gate-loading] {
772
+ color: var(--solvapay-muted-foreground);
773
+ font-size: 0.875rem;
774
+ }
775
+
776
+ [data-solvapay-credit-gate-error],
777
+ [data-solvapay-purchase-gate-error] {
778
+ color: var(--solvapay-destructive);
779
+ font-size: 0.875rem;
780
+ padding: 0.75rem 1rem;
781
+ border: 1px solid var(--solvapay-destructive);
782
+ border-radius: var(--solvapay-radius);
783
+ background: color-mix(in srgb, var(--solvapay-destructive) 6%, transparent);
784
+ }
785
+
786
+ /* -----------------------------------------------------------------------------
787
+ * TopupForm
788
+ * -------------------------------------------------------------------------- */
789
+
790
+ [data-solvapay-topup-form],
791
+ .solvapay-topup-form {
792
+ display: flex;
793
+ flex-direction: column;
794
+ gap: 1rem;
795
+ }
796
+
797
+ [data-solvapay-topup-form-submit],
798
+ .solvapay-topup-form-submit {
799
+ align-self: stretch;
800
+ background: var(--solvapay-accent);
801
+ color: var(--solvapay-accent-foreground);
802
+ border: none;
803
+ border-radius: var(--solvapay-radius);
804
+ cursor: pointer;
805
+ font: inherit;
806
+ font-weight: 500;
807
+ padding: 0.75rem 1rem;
808
+ transition:
809
+ background-color 120ms ease,
810
+ opacity 120ms ease;
811
+ }
812
+
813
+ [data-solvapay-topup-form-submit]:hover:not(:disabled) {
814
+ background: var(--solvapay-accent-hover);
815
+ }
816
+
817
+ [data-solvapay-topup-form-submit]:disabled,
818
+ [data-solvapay-topup-form-submit][data-state='disabled'] {
819
+ opacity: 0.5;
820
+ cursor: not-allowed;
821
+ }
822
+
823
+ [data-solvapay-topup-form-submit][data-state='processing'] {
824
+ opacity: 0.75;
825
+ cursor: wait;
826
+ }
827
+
828
+ [data-solvapay-topup-form-submit]:focus-visible {
829
+ outline: 2px solid var(--solvapay-accent);
830
+ outline-offset: 2px;
831
+ }
832
+
833
+ [data-solvapay-topup-form-loading],
834
+ .solvapay-topup-form-loading {
835
+ color: var(--solvapay-muted-foreground);
836
+ font-size: 0.875rem;
837
+ }
838
+
839
+ [data-solvapay-topup-form-error],
840
+ .solvapay-topup-form-error {
841
+ color: var(--solvapay-destructive);
842
+ font-size: 0.875rem;
843
+ padding: 0.75rem 1rem;
844
+ border: 1px solid var(--solvapay-destructive);
845
+ border-radius: var(--solvapay-radius);
846
+ background: color-mix(in srgb, var(--solvapay-destructive) 6%, transparent);
847
+ }
848
+
849
+ /* -----------------------------------------------------------------------------
850
+ * Leaves: MandateText, ProductBadge, PlanBadge
851
+ * -------------------------------------------------------------------------- */
852
+
853
+ [data-solvapay-mandate-text] {
854
+ color: var(--solvapay-muted-foreground);
855
+ font-size: 0.75rem;
856
+ line-height: 1.5;
857
+ }
858
+
859
+ [data-solvapay-product-badge] {
860
+ display: inline-flex;
861
+ align-items: center;
862
+ gap: 0.375rem;
863
+ background: var(--solvapay-muted);
864
+ border-radius: 999px;
865
+ color: var(--solvapay-accent);
866
+ font-size: 0.8125rem;
867
+ font-weight: 500;
868
+ padding: 0.25rem 0.625rem;
869
+ }