@solvapay/react 1.0.8-preview.9 → 1.0.9

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,1020 @@
1
+ /**
2
+ * Default styles for `<McpApp>` and the per-view primitives.
3
+ *
4
+ * Opt-in via `import '@solvapay/react/mcp/styles.css'`. Every selector
5
+ * uses CSS variables with concrete fallbacks, so MCP hosts that publish
6
+ * their own tokens (via `applyHostStyleVariables`) override SolvaPay's
7
+ * defaults automatically.
8
+ *
9
+ * All classes start with `solvapay-mcp-` so they don't collide with the
10
+ * core `@solvapay/react` styles or with integrator-supplied classes.
11
+ */
12
+
13
+ *,
14
+ *::before,
15
+ *::after {
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ html,
20
+ body {
21
+ margin: 0;
22
+ padding: 0;
23
+ background: var(--color-background-primary, #ffffff);
24
+ color: var(--color-text-primary, #0f172a);
25
+ font-family: var(
26
+ --font-sans,
27
+ -apple-system,
28
+ BlinkMacSystemFont,
29
+ 'Segoe UI',
30
+ Roboto,
31
+ Oxygen,
32
+ Ubuntu,
33
+ sans-serif
34
+ );
35
+ font-size: 14px;
36
+ line-height: 1.5;
37
+ }
38
+
39
+ #root {
40
+ min-height: 100%;
41
+ padding: 16px;
42
+ }
43
+
44
+ .solvapay-mcp-main {
45
+ display: flex;
46
+ flex-direction: column;
47
+ gap: 16px;
48
+ max-width: 520px;
49
+ margin: 0 auto;
50
+ }
51
+
52
+ /* Widen the container at the sidebar breakpoint so the two-column
53
+ * layout has room to breathe. */
54
+ @media (min-width: 900px) {
55
+ .solvapay-mcp-main {
56
+ max-width: 960px;
57
+ }
58
+ }
59
+
60
+ .solvapay-mcp-header h1 {
61
+ margin: 0;
62
+ font-size: 20px;
63
+ font-weight: 600;
64
+ }
65
+
66
+ .solvapay-mcp-card {
67
+ display: flex;
68
+ flex-direction: column;
69
+ gap: 16px;
70
+ padding: 20px;
71
+ border-radius: var(--border-radius-lg, 12px);
72
+ border: 1px solid var(--color-border-secondary, #e2e8f0);
73
+ background: var(--color-background-primary, #ffffff);
74
+ box-shadow: var(--shadow-sm, 0 1px 2px rgba(15, 23, 42, 0.05));
75
+ transition: opacity 180ms ease;
76
+ }
77
+
78
+ /*
79
+ * Vertical stack utility for grouping a heading, copy, and CTA inside
80
+ * a card cell. The card's own `gap: 16px` only applies between its
81
+ * direct children, so a wrapper `<div>` (account-view empty states,
82
+ * etc.) needs its own rhythm — otherwise `.solvapay-mcp-heading` and
83
+ * `.solvapay-mcp-muted` (both `margin: 0`) collapse onto each other
84
+ * with no air between the title, description, and button.
85
+ */
86
+ .solvapay-mcp-stack {
87
+ display: flex;
88
+ flex-direction: column;
89
+ gap: 12px;
90
+ }
91
+
92
+ /*
93
+ * Subtle feedback while a background `check_purchase` poll is in flight.
94
+ * The card frame stays mounted — we just dim it so the user sees activity
95
+ * without any layout shift or content swap.
96
+ */
97
+ .solvapay-mcp-card[data-refreshing='true'] {
98
+ opacity: 0.88;
99
+ }
100
+
101
+ .solvapay-mcp-heading {
102
+ margin: 0;
103
+ font-size: 16px;
104
+ font-weight: 600;
105
+ }
106
+
107
+ /* Step headings inside a card (PlanStep, AmountStep, PaygPaymentStep,
108
+ * RecurringPaymentStep, SuccessStep) sit under the shell's 20px `h1`,
109
+ * so bump them a touch for a readable hierarchy without jumping into
110
+ * the shell title's territory. */
111
+ .solvapay-mcp-card > .solvapay-mcp-heading,
112
+ .solvapay-mcp-card .solvapay-mcp-balance-row > .solvapay-mcp-heading {
113
+ font-size: 18px;
114
+ letter-spacing: -0.01em;
115
+ }
116
+
117
+ /* Keep BackLinks from sitting flush against the next heading — the
118
+ * old `McpTopupView` breathed thanks to the card's 16px gap, but the
119
+ * BackLink also has its own 8px bottom margin from the primitive; we
120
+ * tighten it slightly so the step headline anchors the card. */
121
+ .solvapay-mcp-card > .solvapay-mcp-back-link {
122
+ margin-bottom: 4px;
123
+ }
124
+
125
+ .solvapay-mcp-muted {
126
+ margin: 0;
127
+ color: var(--color-text-secondary, #475569);
128
+ font-size: 13px;
129
+ }
130
+
131
+ .solvapay-mcp-notice {
132
+ padding: 12px;
133
+ border-radius: 8px;
134
+ background: var(--color-background-warning, #fffbeb);
135
+ color: var(--color-text-warning, #78350f);
136
+ font-size: 13px;
137
+ display: flex;
138
+ flex-direction: column;
139
+ gap: 4px;
140
+ }
141
+
142
+ .solvapay-mcp-notice p {
143
+ margin: 0;
144
+ }
145
+
146
+ .solvapay-mcp-error {
147
+ margin: 0;
148
+ padding: 12px;
149
+ border-radius: 8px;
150
+ background: var(--color-background-danger, #fef2f2);
151
+ color: var(--color-text-danger, #991b1b);
152
+ font-size: 13px;
153
+ }
154
+
155
+ .solvapay-mcp-hosted-link {
156
+ text-decoration: none;
157
+ color: inherit;
158
+ display: block;
159
+ }
160
+
161
+ .solvapay-mcp-button {
162
+ display: inline-flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ gap: 8px;
166
+ width: 100%;
167
+ padding: 10px 16px;
168
+ border-radius: var(--border-radius-md, 8px);
169
+ border: none;
170
+ background: var(--color-background-accent, #0f172a);
171
+ color: var(--color-text-on-accent, #ffffff);
172
+ font-size: 14px;
173
+ font-weight: 500;
174
+ text-decoration: none;
175
+ cursor: pointer;
176
+ transition: opacity 120ms ease;
177
+ }
178
+
179
+ .solvapay-mcp-button:hover:not(:disabled) {
180
+ opacity: 0.9;
181
+ }
182
+
183
+ .solvapay-mcp-button:disabled {
184
+ cursor: not-allowed;
185
+ opacity: 0.6;
186
+ }
187
+
188
+ .solvapay-mcp-link-button {
189
+ align-self: flex-start;
190
+ padding: 0;
191
+ background: none;
192
+ border: none;
193
+ color: var(--color-text-secondary, #475569);
194
+ font-size: 13px;
195
+ cursor: pointer;
196
+ text-decoration: underline;
197
+ }
198
+
199
+ .solvapay-mcp-link-button:hover {
200
+ color: var(--color-text-primary, #0f172a);
201
+ }
202
+
203
+ .solvapay-mcp-awaiting-header {
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 10px;
207
+ }
208
+
209
+ .solvapay-mcp-awaiting-header h2 {
210
+ margin: 0;
211
+ font-size: 16px;
212
+ font-weight: 600;
213
+ }
214
+
215
+ .solvapay-mcp-spinner {
216
+ display: inline-block;
217
+ width: 16px;
218
+ height: 16px;
219
+ border: 2px solid var(--color-border-secondary, #e2e8f0);
220
+ border-top-color: var(--color-background-accent, #0f172a);
221
+ border-radius: 50%;
222
+ animation: solvapay-mcp-spin 0.8s linear infinite;
223
+ }
224
+
225
+ @keyframes solvapay-mcp-spin {
226
+ to {
227
+ transform: rotate(360deg);
228
+ }
229
+ }
230
+
231
+ /* Account view */
232
+
233
+ .solvapay-mcp-balance-row {
234
+ display: flex;
235
+ align-items: center;
236
+ justify-content: space-between;
237
+ gap: 12px;
238
+ }
239
+
240
+ /* Topup view */
241
+
242
+ .solvapay-mcp-amount-picker {
243
+ display: flex;
244
+ flex-direction: column;
245
+ gap: 12px;
246
+ }
247
+
248
+ .solvapay-mcp-amount-options {
249
+ display: grid;
250
+ grid-template-columns: repeat(4, minmax(0, 1fr));
251
+ gap: 8px;
252
+ }
253
+
254
+ .solvapay-mcp-amount-option {
255
+ padding: 10px;
256
+ border-radius: var(--border-radius-md, 8px);
257
+ border: 1px solid var(--color-border-secondary, #e2e8f0);
258
+ background: var(--color-background-primary, #ffffff);
259
+ color: var(--color-text-primary, #0f172a);
260
+ font-size: 13px;
261
+ font-weight: 500;
262
+ cursor: pointer;
263
+ transition:
264
+ background-color 120ms ease,
265
+ border-color 120ms ease;
266
+ }
267
+
268
+ /* Recommended chip: a subtly heavier border on the default state. No
269
+ * color — stays within the pre-refactor black/white/gray palette. The
270
+ * selected state below still wins and fills the chip with the accent. */
271
+ .solvapay-mcp-amount-option[data-popular]:not([data-state='selected']) {
272
+ border-color: var(--color-text-primary, #0f172a);
273
+ }
274
+
275
+ .solvapay-mcp-amount-option:hover:not([data-state='selected']):not(:disabled) {
276
+ background: var(--color-background-subtle, #f9fafb);
277
+ }
278
+
279
+ .solvapay-mcp-amount-option[data-state='selected'] {
280
+ border-color: var(--color-background-accent, #0f172a);
281
+ background: var(--color-background-accent, #0f172a);
282
+ color: var(--color-text-on-accent, #ffffff);
283
+ }
284
+
285
+ .solvapay-mcp-amount-custom {
286
+ width: 100%;
287
+ padding: 10px 12px;
288
+ border-radius: var(--border-radius-md, 8px);
289
+ border: 1px solid var(--color-border-secondary, #e2e8f0);
290
+ background: var(--color-background-primary, #ffffff);
291
+ color: var(--color-text-primary, #0f172a);
292
+ font-size: 14px;
293
+ }
294
+
295
+ .solvapay-mcp-topup-form {
296
+ display: flex;
297
+ flex-direction: column;
298
+ gap: 12px;
299
+ }
300
+
301
+ /* Center the `TopupForm.Loading` / `PaymentForm.Loading` spinner
302
+ * inside MCP checkout surfaces. The primitive-layer styles stay
303
+ * layout-neutral so web integrators can place the spinner wherever
304
+ * they want; the MCP view always wants it centered above the
305
+ * submit button. */
306
+ .solvapay-mcp-topup-form [data-solvapay-topup-form-loading],
307
+ .solvapay-mcp-card [data-solvapay-payment-form-loading] {
308
+ display: flex;
309
+ justify-content: center;
310
+ align-items: center;
311
+ padding: 12px 0;
312
+ }
313
+
314
+ /* Activation view */
315
+
316
+ .solvapay-mcp-activation-flow {
317
+ display: flex;
318
+ flex-direction: column;
319
+ gap: 12px;
320
+ }
321
+
322
+ /* Paywall view (Phase 2.1) */
323
+
324
+ .solvapay-mcp-paywall-plans {
325
+ display: flex;
326
+ flex-direction: column;
327
+ gap: 8px;
328
+ }
329
+
330
+ .solvapay-mcp-paywall-embedded-checkout {
331
+ display: flex;
332
+ flex-direction: column;
333
+ gap: 12px;
334
+ padding-top: 8px;
335
+ border-top: 1px solid var(--color-border-secondary, #e2e8f0);
336
+ }
337
+
338
+ /* Usage view (Phase 2.2)
339
+ *
340
+ * The UsageMeter primitive already ships default styles in
341
+ * @solvapay/react/styles.css — the MCP view only adds view-level spacing. */
342
+
343
+ /* Shell chrome — header, tab nav, footer
344
+ *
345
+ * The in-iframe header (logo + brand name + product heading) is kept
346
+ * as the reliable source of merchant identity. MCP hosts advertise
347
+ * tool-level `icons[]` / `Implementation.name` via the `@solvapay/mcp`
348
+ * server, but some host chromes (e.g. Cursor) only paint the active
349
+ * tool name above the iframe and drop the merchant mark, which leaves
350
+ * the widget reading as anonymous. Painting identity inside guarantees
351
+ * it shows everywhere; hosts that do render the icon just get a second
352
+ * mark, which is an acceptable trade-off versus anonymous widgets.
353
+ */
354
+
355
+ .solvapay-mcp-shell {
356
+ display: flex;
357
+ flex-direction: column;
358
+ gap: 16px;
359
+ }
360
+
361
+ .solvapay-mcp-shell-header {
362
+ display: flex;
363
+ flex-direction: column;
364
+ gap: 12px;
365
+ }
366
+
367
+ .solvapay-mcp-shell-brand {
368
+ display: flex;
369
+ align-items: center;
370
+ gap: 10px;
371
+ }
372
+
373
+ .solvapay-mcp-shell-logo {
374
+ width: 28px;
375
+ height: 28px;
376
+ object-fit: contain;
377
+ border-radius: 6px;
378
+ }
379
+
380
+ .solvapay-mcp-shell-logo-initials {
381
+ display: inline-flex;
382
+ align-items: center;
383
+ justify-content: center;
384
+ width: 28px;
385
+ height: 28px;
386
+ border-radius: 6px;
387
+ background: var(--color-background-secondary, #f1f5f9);
388
+ color: var(--color-text-primary, #0f172a);
389
+ font-size: 12px;
390
+ font-weight: 600;
391
+ }
392
+
393
+ .solvapay-mcp-shell-brand-name {
394
+ font-size: 14px;
395
+ color: var(--color-text-primary, #0f172a);
396
+ font-weight: 500;
397
+ }
398
+
399
+ .solvapay-mcp-shell-title {
400
+ font-size: 20px;
401
+ font-weight: 600;
402
+ }
403
+
404
+ .solvapay-mcp-shell-tagline {
405
+ margin: -6px 0 0;
406
+ font-size: 14px;
407
+ line-height: 1.5;
408
+ color: var(--color-text-secondary, #475569);
409
+ }
410
+
411
+ .solvapay-mcp-tablist {
412
+ display: flex;
413
+ gap: 4px;
414
+ border-bottom: 1px solid var(--color-border-secondary, #e2e8f0);
415
+ overflow-x: auto;
416
+ /* Hide scrollbar on WebKit while still allowing overflow for narrow iframes */
417
+ scrollbar-width: thin;
418
+ }
419
+
420
+ .solvapay-mcp-tab {
421
+ padding: 8px 12px;
422
+ background: transparent;
423
+ border: none;
424
+ border-bottom: 2px solid transparent;
425
+ color: var(--color-text-secondary, #475569);
426
+ font-size: 13px;
427
+ font-weight: 500;
428
+ cursor: pointer;
429
+ white-space: nowrap;
430
+ transition: color 120ms ease, border-color 120ms ease;
431
+ }
432
+
433
+ .solvapay-mcp-tab:hover:not([data-active='true']) {
434
+ color: var(--color-text-primary, #0f172a);
435
+ }
436
+
437
+ .solvapay-mcp-tab[data-active='true'] {
438
+ color: var(--color-text-primary, #0f172a);
439
+ border-bottom-color: var(--color-background-accent, #0f172a);
440
+ }
441
+
442
+ .solvapay-mcp-tab:focus-visible {
443
+ outline: 2px solid var(--color-background-accent, #0f172a);
444
+ outline-offset: -2px;
445
+ border-radius: 6px;
446
+ }
447
+
448
+ .solvapay-mcp-shell-layout {
449
+ display: grid;
450
+ grid-template-columns: minmax(0, 1fr);
451
+ gap: 16px;
452
+ }
453
+
454
+ .solvapay-mcp-shell-body {
455
+ display: flex;
456
+ flex-direction: column;
457
+ gap: 16px;
458
+ min-width: 0;
459
+ }
460
+
461
+ .solvapay-mcp-shell-panel {
462
+ display: flex;
463
+ flex-direction: column;
464
+ gap: 16px;
465
+ }
466
+
467
+ /* Wide-iframe sidebar: visible at >= 900px. Hosts with narrow iframes
468
+ * (ChatGPT ~400px, compact Claude Desktop) fall through to the
469
+ * single-column layout with Account in the tab strip. */
470
+
471
+ .solvapay-mcp-shell-sidebar {
472
+ display: none;
473
+ }
474
+
475
+ @media (min-width: 900px) {
476
+ .solvapay-mcp-shell-layout {
477
+ grid-template-columns: minmax(0, 1fr) 320px;
478
+ }
479
+
480
+ .solvapay-mcp-shell-sidebar {
481
+ display: flex;
482
+ flex-direction: column;
483
+ gap: 12px;
484
+ }
485
+
486
+ /* Account tab is hidden at wide viewports — its content lives in
487
+ * the sidebar. Stays in the DOM so the arrow-key nav is stable;
488
+ * CSS just takes it out of flow. */
489
+ .solvapay-mcp-tab[data-hide-wide='true'] {
490
+ display: none;
491
+ }
492
+ }
493
+
494
+ .solvapay-mcp-shell-footer {
495
+ padding-top: 8px;
496
+ border-top: 1px solid var(--color-border-secondary, #e2e8f0);
497
+ font-size: 12px;
498
+ text-align: center;
499
+ }
500
+
501
+ .solvapay-mcp-shell-footer-link {
502
+ color: inherit;
503
+ text-decoration: none;
504
+ }
505
+
506
+ .solvapay-mcp-shell-footer-link:hover {
507
+ text-decoration: underline;
508
+ }
509
+
510
+ /* Account view — Customer + Seller details cards
511
+ *
512
+ * Kept self-contained so the same markup renders identically inside
513
+ * `<McpAccountView>` and the wide-iframe sidebar in `<McpAppShell>`.
514
+ */
515
+
516
+ .solvapay-mcp-account {
517
+ display: flex;
518
+ flex-direction: column;
519
+ gap: 16px;
520
+ }
521
+
522
+ .solvapay-mcp-detail-grid {
523
+ display: flex;
524
+ flex-direction: column;
525
+ gap: 14px;
526
+ }
527
+
528
+ .solvapay-mcp-detail-row {
529
+ display: flex;
530
+ flex-direction: column;
531
+ gap: 2px;
532
+ }
533
+
534
+ .solvapay-mcp-detail-label {
535
+ font-size: 10px;
536
+ letter-spacing: 0.08em;
537
+ text-transform: uppercase;
538
+ font-weight: 500;
539
+ }
540
+
541
+ .solvapay-mcp-detail-value {
542
+ font-size: 14px;
543
+ color: var(--color-text-primary, #0f172a);
544
+ }
545
+
546
+ .solvapay-mcp-detail-value-mono {
547
+ font-family:
548
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
549
+ monospace;
550
+ font-size: 12px;
551
+ }
552
+
553
+ .solvapay-mcp-detail-link {
554
+ color: var(--color-text-primary, #0f172a);
555
+ font-size: 14px;
556
+ text-decoration: none;
557
+ word-break: break-word;
558
+ }
559
+
560
+ .solvapay-mcp-detail-link:hover {
561
+ text-decoration: underline;
562
+ }
563
+
564
+ .solvapay-mcp-detail-heading-row {
565
+ display: flex;
566
+ align-items: center;
567
+ justify-content: space-between;
568
+ gap: 12px;
569
+ }
570
+
571
+ .solvapay-mcp-detail-balance-head {
572
+ display: flex;
573
+ align-items: baseline;
574
+ justify-content: space-between;
575
+ gap: 8px;
576
+ }
577
+
578
+ .solvapay-mcp-verified-badge {
579
+ display: inline-flex;
580
+ align-items: center;
581
+ gap: 4px;
582
+ padding: 2px 8px;
583
+ border-radius: 999px;
584
+ background: var(--color-background-success-subtle, #ecfdf5);
585
+ color: var(--color-text-success, #065f46);
586
+ font-size: 11px;
587
+ font-weight: 500;
588
+ line-height: 1.4;
589
+ }
590
+
591
+ /* ---- About view ---- */
592
+
593
+ .solvapay-mcp-about {
594
+ display: flex;
595
+ flex-direction: column;
596
+ gap: 16px;
597
+ }
598
+
599
+ .solvapay-mcp-about-product {
600
+ display: flex;
601
+ flex-direction: column;
602
+ gap: 8px;
603
+ }
604
+
605
+ .solvapay-mcp-about-image {
606
+ display: block;
607
+ max-height: 160px;
608
+ width: auto;
609
+ align-self: flex-start;
610
+ border-radius: 6px;
611
+ }
612
+
613
+ .solvapay-mcp-about-description {
614
+ margin: 0;
615
+ white-space: pre-wrap;
616
+ color: var(--color-text-secondary, #475467);
617
+ }
618
+
619
+ .solvapay-mcp-about-ctas {
620
+ display: flex;
621
+ flex-direction: column;
622
+ gap: 12px;
623
+ }
624
+
625
+ .solvapay-mcp-about-cta-grid {
626
+ display: grid;
627
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
628
+ gap: 12px;
629
+ }
630
+
631
+ .solvapay-mcp-about-cta {
632
+ display: flex;
633
+ flex-direction: column;
634
+ gap: 8px;
635
+ }
636
+
637
+ .solvapay-mcp-about-commands {
638
+ padding: 12px 16px;
639
+ border-radius: 8px;
640
+ background: var(--color-background-subtle, #f9fafb);
641
+ }
642
+
643
+ .solvapay-mcp-about-command-list {
644
+ list-style: none;
645
+ padding: 0;
646
+ margin: 0;
647
+ display: flex;
648
+ flex-direction: column;
649
+ gap: 4px;
650
+ }
651
+
652
+ .solvapay-mcp-about-command {
653
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
654
+ font-size: 13px;
655
+ padding: 1px 6px;
656
+ border-radius: 4px;
657
+ background: var(--color-background-raised, #eef2f6);
658
+ }
659
+
660
+ .solvapay-mcp-about-activity {
661
+ border: 1px solid var(--color-border-default, #e4e7ec);
662
+ }
663
+
664
+ /* ---- Back-link primitive ---- */
665
+
666
+ .solvapay-mcp-back-link {
667
+ appearance: none;
668
+ background: none;
669
+ border: none;
670
+ /* Horizontal padding gives hover/tap area around the label; the
671
+ * negative margin keeps the visible arrow flush with the card's
672
+ * content edge so it doesn't look inset. */
673
+ padding: 4px 8px;
674
+ margin: 0 -8px 8px -8px;
675
+ display: inline-flex;
676
+ align-items: center;
677
+ gap: 6px;
678
+ color: var(--color-text-secondary, #475467);
679
+ font-size: 13px;
680
+ cursor: pointer;
681
+ }
682
+
683
+ .solvapay-mcp-back-link:hover {
684
+ color: var(--color-text-primary, #101828);
685
+ text-decoration: underline;
686
+ }
687
+
688
+ .solvapay-mcp-back-link-glyph {
689
+ font-weight: 500;
690
+ }
691
+
692
+ /* ---- External-link glyph ---- */
693
+
694
+ .solvapay-mcp-external-glyph {
695
+ display: inline-block;
696
+ opacity: 0.75;
697
+ font-size: 0.9em;
698
+ letter-spacing: 0.02em;
699
+ vertical-align: -0.1em;
700
+ margin-left: 0.35em;
701
+ }
702
+
703
+ /* ---- Plan actions row ---- */
704
+
705
+ .solvapay-mcp-plan-actions {
706
+ display: flex;
707
+ flex-direction: column;
708
+ gap: 8px;
709
+ margin-top: 12px;
710
+ }
711
+
712
+ .solvapay-mcp-plan-topup-prompt {
713
+ display: flex;
714
+ flex-direction: column;
715
+ gap: 8px;
716
+ margin-top: 12px;
717
+ }
718
+
719
+ /* ---- First-run tour ---- */
720
+
721
+ .solvapay-mcp-tour-overlay {
722
+ position: fixed;
723
+ inset: 0;
724
+ pointer-events: none;
725
+ z-index: 1000;
726
+ }
727
+
728
+ .solvapay-mcp-tour-popover {
729
+ position: fixed;
730
+ max-width: 280px;
731
+ pointer-events: auto;
732
+ padding: 12px 16px;
733
+ border-radius: 8px;
734
+ background: var(--color-background-elevated, #ffffff);
735
+ box-shadow: 0 8px 24px rgba(16, 24, 40, 0.12);
736
+ border: 1px solid var(--color-border-default, #e4e7ec);
737
+ }
738
+
739
+ .solvapay-mcp-tour-title {
740
+ margin: 0 0 4px 0;
741
+ font-size: 14px;
742
+ font-weight: 600;
743
+ }
744
+
745
+ .solvapay-mcp-tour-body {
746
+ margin: 0 0 12px 0;
747
+ font-size: 13px;
748
+ color: var(--color-text-secondary, #475467);
749
+ }
750
+
751
+ .solvapay-mcp-tour-actions {
752
+ display: flex;
753
+ align-items: center;
754
+ justify-content: space-between;
755
+ gap: 8px;
756
+ font-size: 12px;
757
+ }
758
+
759
+ .solvapay-mcp-tour-skip,
760
+ .solvapay-mcp-tour-next {
761
+ appearance: none;
762
+ background: none;
763
+ border: none;
764
+ padding: 4px 8px;
765
+ cursor: pointer;
766
+ border-radius: 4px;
767
+ font-size: 13px;
768
+ }
769
+
770
+ .solvapay-mcp-tour-next {
771
+ background: var(--color-background-primary, #0f172a);
772
+ color: var(--color-text-on-primary, #ffffff);
773
+ }
774
+
775
+ .solvapay-mcp-tour-progress {
776
+ color: var(--color-text-tertiary, #667085);
777
+ }
778
+
779
+ .solvapay-mcp-tour-replay {
780
+ appearance: none;
781
+ background: none;
782
+ border: 1px solid var(--color-border-default, #e4e7ec);
783
+ border-radius: 999px;
784
+ width: 24px;
785
+ height: 24px;
786
+ cursor: pointer;
787
+ font-size: 13px;
788
+ line-height: 1;
789
+ color: var(--color-text-secondary, #475467);
790
+ }
791
+
792
+ .solvapay-mcp-tour-replay:hover {
793
+ color: var(--color-text-primary, #101828);
794
+ }
795
+
796
+ /* --- McpUpsellStrip / McpNudgeView --- */
797
+
798
+ .solvapay-mcp-upsell-strip {
799
+ display: flex;
800
+ align-items: center;
801
+ justify-content: space-between;
802
+ gap: 12px;
803
+ padding: 10px 14px;
804
+ border-radius: 8px;
805
+ border: 1px solid var(--color-border-primary, #e4e7ec);
806
+ background: var(--color-background-secondary, #f9fafb);
807
+ color: var(--color-text-primary, #101828);
808
+ font-size: 13px;
809
+ line-height: 1.5;
810
+ }
811
+
812
+ .solvapay-mcp-upsell-strip--low-balance,
813
+ .solvapay-mcp-upsell-strip--approaching-limit {
814
+ border-color: var(--color-border-warning, #fedf89);
815
+ background: var(--color-background-warning-subtle, #fffaeb);
816
+ }
817
+
818
+ .solvapay-mcp-upsell-strip--cycle-ending {
819
+ border-color: var(--color-border-brand, #d6bbfb);
820
+ background: var(--color-background-brand-subtle, #f9f5ff);
821
+ }
822
+
823
+ .solvapay-mcp-upsell-strip-message {
824
+ flex: 1 1 auto;
825
+ min-width: 0;
826
+ }
827
+
828
+ .solvapay-mcp-upsell-strip-actions {
829
+ display: inline-flex;
830
+ align-items: center;
831
+ gap: 6px;
832
+ flex: 0 0 auto;
833
+ }
834
+
835
+ .solvapay-mcp-upsell-strip-cta {
836
+ background: var(--color-background-primary, #ffffff);
837
+ border: 1px solid var(--color-border-primary, #d0d5dd);
838
+ border-radius: 6px;
839
+ padding: 4px 10px;
840
+ font-size: 12px;
841
+ font-weight: 600;
842
+ cursor: pointer;
843
+ color: inherit;
844
+ }
845
+
846
+ .solvapay-mcp-upsell-strip-cta:hover {
847
+ background: var(--color-background-primary-hover, #f4ebff);
848
+ }
849
+
850
+ .solvapay-mcp-upsell-strip-dismiss {
851
+ background: transparent;
852
+ border: none;
853
+ width: 20px;
854
+ height: 20px;
855
+ font-size: 18px;
856
+ line-height: 1;
857
+ cursor: pointer;
858
+ color: var(--color-text-secondary, #475467);
859
+ }
860
+
861
+ .solvapay-mcp-upsell-strip-dismiss:hover {
862
+ color: var(--color-text-primary, #101828);
863
+ }
864
+
865
+ .solvapay-mcp-nudge-view {
866
+ display: flex;
867
+ flex-direction: column;
868
+ gap: 12px;
869
+ }
870
+
871
+ .solvapay-mcp-nudge-data {
872
+ margin: 0;
873
+ padding: 12px;
874
+ border-radius: 6px;
875
+ background: var(--color-background-secondary, #f9fafb);
876
+ color: var(--color-text-primary, #101828);
877
+ font-size: 12px;
878
+ line-height: 1.5;
879
+ overflow-x: auto;
880
+ white-space: pre-wrap;
881
+ word-break: break-word;
882
+ }
883
+
884
+ /* --- Checkout view (activation state machine) ---
885
+ *
886
+ * Styles for the two-branch <McpCheckoutView>: PlanStep → AmountStep →
887
+ * PaygPaymentStep / RecurringPaymentStep → SuccessStep. Palette is
888
+ * strictly the same monochrome family as the rest of the MCP shell —
889
+ * white surfaces, secondary-border greys, subtle-bg fills, primary
890
+ * slate ink, secondary slate for muted copy. No warning tints, no
891
+ * success halo — `.solvapay-mcp-error` is the only chromatic note and
892
+ * it stays untouched for a11y semantics. */
893
+
894
+ .solvapay-mcp-checkout-banner {
895
+ display: flex;
896
+ flex-direction: column;
897
+ gap: 4px;
898
+ padding: 12px;
899
+ border-radius: var(--border-radius-md, 8px);
900
+ border: 1px solid var(--color-border-secondary, #e2e8f0);
901
+ background: var(--color-background-subtle, #f9fafb);
902
+ }
903
+
904
+ .solvapay-mcp-checkout-banner-title {
905
+ font-size: 13px;
906
+ font-weight: 600;
907
+ color: var(--color-text-primary, #0f172a);
908
+ }
909
+
910
+ .solvapay-mcp-checkout-banner-message {
911
+ font-size: 13px;
912
+ }
913
+
914
+ .solvapay-mcp-checkout-dismiss {
915
+ align-self: center;
916
+ }
917
+
918
+ .solvapay-mcp-checkout-order-summary {
919
+ display: flex;
920
+ flex-direction: column;
921
+ gap: 6px;
922
+ padding: 12px;
923
+ border-radius: var(--border-radius-md, 8px);
924
+ border: 1px solid var(--color-border-secondary, #e2e8f0);
925
+ background: var(--color-background-subtle, #f9fafb);
926
+ }
927
+
928
+ .solvapay-mcp-checkout-order-summary-row {
929
+ display: flex;
930
+ justify-content: space-between;
931
+ align-items: baseline;
932
+ gap: 12px;
933
+ font-size: 13px;
934
+ font-variant-numeric: tabular-nums;
935
+ color: var(--color-text-primary, #0f172a);
936
+ }
937
+
938
+ .solvapay-mcp-checkout-save-card {
939
+ display: flex;
940
+ align-items: center;
941
+ gap: 8px;
942
+ font-size: 13px;
943
+ color: var(--color-text-secondary, #475569);
944
+ cursor: pointer;
945
+ }
946
+
947
+ .solvapay-mcp-checkout-save-card input[type='checkbox'] {
948
+ margin: 0;
949
+ cursor: pointer;
950
+ }
951
+
952
+ .solvapay-mcp-checkout-terms {
953
+ margin: 0;
954
+ font-size: 12px;
955
+ line-height: 1.5;
956
+ }
957
+
958
+ .solvapay-mcp-checkout-receipt {
959
+ display: flex;
960
+ flex-direction: column;
961
+ gap: 8px;
962
+ margin: 0;
963
+ padding: 12px;
964
+ border-radius: var(--border-radius-md, 8px);
965
+ border: 1px solid var(--color-border-secondary, #e2e8f0);
966
+ background: var(--color-background-subtle, #f9fafb);
967
+ }
968
+
969
+ .solvapay-mcp-checkout-receipt-row {
970
+ display: flex;
971
+ justify-content: space-between;
972
+ align-items: baseline;
973
+ gap: 12px;
974
+ font-size: 13px;
975
+ font-variant-numeric: tabular-nums;
976
+ }
977
+
978
+ .solvapay-mcp-checkout-receipt-row dt {
979
+ margin: 0;
980
+ color: var(--color-text-secondary, #475569);
981
+ }
982
+
983
+ .solvapay-mcp-checkout-receipt-row dd {
984
+ margin: 0;
985
+ color: var(--color-text-primary, #0f172a);
986
+ font-weight: 500;
987
+ }
988
+
989
+ /* Flat checkmark — no green halo. The glyph alone signals success,
990
+ * consistent with the monochrome card aesthetic. */
991
+ .solvapay-mcp-checkout-success-check {
992
+ align-self: flex-start;
993
+ display: inline-flex;
994
+ align-items: center;
995
+ justify-content: center;
996
+ width: 32px;
997
+ height: 32px;
998
+ border-radius: 50%;
999
+ border: 1px solid var(--color-border-secondary, #e2e8f0);
1000
+ background: var(--color-background-primary, #ffffff);
1001
+ color: var(--color-text-primary, #0f172a);
1002
+ font-size: 18px;
1003
+ line-height: 1;
1004
+ }
1005
+
1006
+ .solvapay-mcp-checkout-manage-pointer {
1007
+ margin: 0;
1008
+ font-size: 12px;
1009
+ }
1010
+
1011
+ .solvapay-mcp-checkout-manage-pointer code {
1012
+ padding: 1px 6px;
1013
+ border-radius: 4px;
1014
+ background: var(--color-background-subtle, #f9fafb);
1015
+ font-family:
1016
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
1017
+ monospace;
1018
+ font-size: 12px;
1019
+ color: var(--color-text-primary, #0f172a);
1020
+ }