@solvapay/react 2.1.1 → 2.2.0-preview-e3e546693c002c32f128d83bf6c5fe76ac182a79

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,15 +1,56 @@
1
1
  /**
2
2
  * Default styles for `<McpApp>` and the per-view primitives.
3
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.
4
+ * Opt-in via `import '@solvapay/react/mcp/styles.css'`. Host-owned
5
+ * tokens (`--color-*`, `--font-*`, `--border-radius-*`) are defined
6
+ * once on `:root` with `light-dark()` so hosts that publish nothing
7
+ * still get a WCAG-compliant palette, and hosts that publish tokens
8
+ * win. `html`/`body` stay transparent so the host canvas shows
9
+ * through; the card is a hairline frame, not a filled sheet.
8
10
  *
9
11
  * All classes start with `solvapay-mcp-` so they don't collide with the
10
12
  * core `@solvapay/react` styles or with integrator-supplied classes.
11
13
  */
12
14
 
15
+ :root {
16
+ color-scheme: light dark;
17
+
18
+ --color-background-primary: light-dark(#FFFFFF, #171717);
19
+ --color-background-secondary: light-dark(#F4F4F4, #262626);
20
+ --color-text-primary: light-dark(#171717, #FAF9F5);
21
+ --color-text-secondary: light-dark(#6B6A67, #A3A29E);
22
+ --color-border-primary: light-dark(#8A8A8A, #7E7E7E);
23
+ --color-border-secondary: light-dark(#D9D9D9, #3A3A3A);
24
+ --color-background-inverse: light-dark(#171717, #FAF9F5);
25
+ --color-text-inverse: light-dark(#FFFFFF, #171717);
26
+ --color-text-warning: light-dark(#78350F, #FBBF24);
27
+ --color-background-warning: light-dark(#FFFBEB, #3D2E00);
28
+ --color-text-danger: var(--solvapay-danger);
29
+ --color-background-danger: light-dark(#FEF2F2, #3F1D1D);
30
+ --color-ring-primary: var(--solvapay-selection);
31
+
32
+ --solvapay-row-hover: light-dark(#FAFAFA, #1F1F1F);
33
+ --solvapay-control-hover: light-dark(#F5F5F5, #2A2A2A);
34
+ --solvapay-selection: light-dark(#4D89A2, #6B9CAE);
35
+ --solvapay-selection-wash: light-dark(#F2F7F9, #1C2B34);
36
+ --solvapay-danger: light-dark(#C4322A, #F97066);
37
+ --solvapay-identifier: light-dark(#65659B, #9B9BE0);
38
+ --solvapay-accent: light-dark(#000000, #E8E8E8);
39
+ --solvapay-accent-text: light-dark(#FFFFFF, #171717);
40
+
41
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
42
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono',
43
+ 'Courier New', monospace;
44
+
45
+ --border-radius-xs: 4px;
46
+ --border-radius-sm: 4px;
47
+ --border-radius-md: 8px;
48
+ --border-radius-lg: 8px;
49
+ --border-radius-xl: 16px;
50
+ --border-radius-full: 9999px;
51
+ }
52
+
53
+
13
54
  *,
14
55
  *::before,
15
56
  *::after {
@@ -20,18 +61,10 @@ html,
20
61
  body {
21
62
  margin: 0;
22
63
  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
- );
64
+ /* Host canvas shows through. The iframe is a guest, not a sheet. */
65
+ background: transparent;
66
+ color: var(--color-text-primary);
67
+ font-family: var(--font-sans);
35
68
  font-size: 14px;
36
69
  line-height: 1.5;
37
70
  }
@@ -41,85 +74,85 @@ body {
41
74
  padding: 16px;
42
75
  }
43
76
 
44
- /* Outer chrome cap. The AppHeader, body card stack, and LegalFooter
45
- * align as one visually unified block centred in the iframe. The 480
46
- * default matches Stripe Checkout's ~440-480 pay column, Apple Pay
47
- * sheet's ~390 form, Material 3 dialog content max of 560, and
48
- * Refactoring UI's ~30em form-width rule.
49
- *
50
- * Both the sidebar lift (below) and the per-step content (button,
51
- * payment form, plan-selector grid) inherit this cap, so the form
52
- * stays centred in the iframe and `Provided by SolvaPay · Terms ·
53
- * Privacy` aligns to the card's left/right edges rather than the
54
- * iframe's.
55
- *
56
- * SEP-1865 §"Container Dimensions" delegates the size choice to the
57
- * View when the host omits `containerDimensions.width`/`maxWidth`
58
- * (Unbounded mode). Anthropic's PRIMARY use case (Claude Desktop
59
- * ~400-500px) and OpenAI's inline examples (220-360px) are both
60
- * narrower than 480, so the cap is a no-op there and content fills,
61
- * matching Anthropic's "apps fill the container width" guidance.
62
- * Surfaces that need the full host viewport can still request
63
- * `displayMode: "fullscreen"`. */
77
+ /* Fill the host container. Anthropic: "Apps always fill the
78
+ * container width — there are no fixed breakpoints." `main` stays
79
+ * `width: 100%` so `@container mcp (min-width: 760px)` sees the
80
+ * host. The visual widget — chrome, loading card, shell — is one
81
+ * centered 760px block (no-op below that width). Fullscreen lifts
82
+ * the cap and becomes a centered 1000px hosted column. */
64
83
  .solvapay-mcp-main {
84
+ --solvapay-surface: var(--color-background-primary);
85
+ --solvapay-muted: var(--color-background-secondary);
86
+ --solvapay-muted-foreground: var(--color-text-secondary);
87
+ --solvapay-border: var(--color-border-secondary);
88
+ --solvapay-destructive: var(--solvapay-danger);
89
+ --solvapay-accent-foreground: var(--solvapay-accent-text);
90
+ --solvapay-font: var(--font-sans);
91
+ --solvapay-radius: var(--border-radius-md);
92
+ --solvapay-usage-safe: var(--color-text-primary);
93
+ --solvapay-usage-warning: var(--color-text-warning);
94
+ --solvapay-usage-critical: var(--color-text-warning);
95
+ --solvapay-success: var(--color-background-inverse);
96
+
97
+ /* Shared type scale. Ten levels is a product decision — the host
98
+ * publishes three. Narrow (420) is the default; the 760px query
99
+ * lifts the inline density tokens below. */
100
+ --solvapay-type-display: 600 36px/1.22 var(--font-sans);
101
+ --solvapay-type-heading: 600 24px/1.29 var(--font-sans);
102
+ --solvapay-type-price: 500 40px/1 var(--font-sans);
103
+ --solvapay-type-row: 600 18px/1.3 var(--font-sans);
104
+ --solvapay-type-body: 400 15px/1.5 var(--font-sans);
105
+ --solvapay-type-label: 500 14px/1.4 var(--font-sans);
106
+ --solvapay-type-caption: 400 13px/1.5 var(--font-sans);
107
+ --solvapay-type-eyebrow-step: 500 15px/1.87 var(--font-sans);
108
+ --solvapay-type-eyebrow-rail: 400 12px/1.67 var(--font-sans);
109
+ --solvapay-type-balance: 500 30px/1 var(--font-sans);
110
+ --solvapay-type-title: 600 18px/1.3 var(--font-sans);
111
+ --solvapay-type-plan-row: 600 15px/1.3 var(--font-sans);
112
+ --solvapay-type-total: 500 22px/1.2 var(--font-sans);
113
+ --solvapay-type-rail-hero: 500 32px/1 var(--font-sans);
114
+ --solvapay-card-padding: 20px;
115
+ --solvapay-section-gap: 18px;
116
+ --solvapay-control-height: 44px;
117
+ --solvapay-cta-height: 48px;
118
+
119
+ container-type: inline-size;
120
+ container-name: mcp;
65
121
  display: flex;
66
122
  flex-direction: column;
67
123
  gap: 12px;
68
- max-inline-size: 480px;
124
+ width: 100%;
125
+ }
126
+
127
+ .solvapay-mcp-chrome-row,
128
+ .solvapay-mcp-main > .solvapay-mcp-card,
129
+ .solvapay-mcp-shell {
130
+ width: 100%;
131
+ max-inline-size: 760px;
69
132
  margin-inline: auto;
70
133
  }
71
134
 
72
- /* When `bootstrap.customer` is set, `showSidebar` in McpAppShell.tsx
73
- * mounts a `.solvapay-mcp-shell-sidebar` aside (seller + customer
74
- * details cards) on every surface — account, checkout, and topup —
75
- * so the frame does not reshape mid-flow. Lift the cap so the
76
- * 320 sidebar + 16 gap + 480 body grid fits AND the matching
77
- * `@container (min-width: 816px)` query below can fire.
78
- *
79
- * The lift is gated behind `@media (min-width: 816px)` so it only
80
- * fires when the iframe is actually wide enough to render the
81
- * sidebar. Without that gate, on iframes between 480 and 815 the
82
- * cap would lift to 816 but the iframe would shrink the main to
83
- * its own width — the body would sit at 480 anchored to the left
84
- * of a 700px main, and the footer's `space-between` would spread
85
- * `Provided by SolvaPay · Terms · Privacy` to the iframe edges
86
- * instead of the body's edges. With the gate, those iframes treat
87
- * the authed user like the unauthed path: main stays at 480 and
88
- * the inline `<McpCustomerDetailsCard>` carries the account
89
- * context that the sidebar would have shown.
90
- *
91
- * The `:has()` selector is intentionally view-agnostic — the shell
92
- * controls when the aside actually mounts via the customer-present
93
- * gate. Unauthenticated bootstraps never trigger the lift. */
94
- @media (min-width: 816px) {
95
- .solvapay-mcp-main:has(.solvapay-mcp-shell-sidebar) {
96
- max-inline-size: 816px;
97
- }
135
+ .solvapay-mcp-chrome-row {
136
+ display: flex;
137
+ align-items: center;
138
+ justify-content: space-between;
139
+ gap: 8px;
140
+ min-width: 0;
98
141
  }
99
142
 
100
- .solvapay-mcp-header h1 {
101
- margin: 0;
102
- font-size: 20px;
103
- font-weight: 600;
143
+ .solvapay-mcp-chrome-row:empty {
144
+ display: none;
104
145
  }
105
146
 
106
147
  .solvapay-mcp-card {
107
148
  display: flex;
108
149
  flex-direction: column;
109
- gap: 12px;
110
- padding: 16px;
111
- border-radius: var(--border-radius-lg, 12px);
112
- border: 1px solid var(--color-border-secondary, #e2e8f0);
113
- background: var(--color-background-primary, #ffffff);
114
- box-shadow: var(--shadow-sm, 0 1px 2px rgba(15, 23, 42, 0.05));
150
+ gap: var(--solvapay-section-gap);
151
+ padding: var(--solvapay-card-padding);
152
+ /* Hairline frame only — no fill, no shadow. Host tokens win. */
153
+ border-radius: var(--border-radius-xl);
154
+ border: 1px solid var(--color-border-primary);
115
155
  transition: opacity 180ms ease;
116
- /* Dampens iframe shrink → grow round-trips when a brief
117
- * "Loading…" interstitial paints between bootstrap re-fetches
118
- * during `account` ↔ `checkout` ↔ `topup` view swaps. Kept below
119
- * the natural height of the simplest real card (PAYG account
120
- * state) so content drives sizing and we don't trail awkward
121
- * empty space under short cards. */
122
- min-height: 160px;
123
156
  }
124
157
 
125
158
  /*
@@ -143,7 +176,7 @@ body {
143
176
  .solvapay-mcp-app-header-initials {
144
177
  width: 20px;
145
178
  height: 20px;
146
- border-radius: 4px;
179
+ border-radius: var(--border-radius-sm);
147
180
  flex: 0 0 auto;
148
181
  }
149
182
 
@@ -155,8 +188,8 @@ body {
155
188
  display: inline-flex;
156
189
  align-items: center;
157
190
  justify-content: center;
158
- background: var(--color-background-secondary, #f1f5f9);
159
- color: var(--color-text-secondary, #475569);
191
+ background: var(--color-background-secondary);
192
+ color: var(--color-text-secondary);
160
193
  font-size: 10px;
161
194
  font-weight: 600;
162
195
  }
@@ -164,7 +197,7 @@ body {
164
197
  .solvapay-mcp-app-header-name {
165
198
  font-size: 13px;
166
199
  font-weight: 500;
167
- color: var(--color-text-secondary, #475569);
200
+ color: var(--color-text-secondary);
168
201
  white-space: nowrap;
169
202
  overflow: hidden;
170
203
  text-overflow: ellipsis;
@@ -238,10 +271,10 @@ body {
238
271
  .solvapay-mcp-currency-switch {
239
272
  flex: 0 0 auto;
240
273
  padding: 4px 8px;
241
- border: 1px solid var(--color-border, #e2e8f0);
242
- border-radius: 6px;
243
- background: var(--color-background, #ffffff);
244
- color: var(--color-text, #0f172a);
274
+ border: 1px solid var(--color-border-primary);
275
+ border-radius: var(--border-radius-sm);
276
+ background: transparent;
277
+ color: var(--color-text-primary);
245
278
  font-size: 13px;
246
279
  font-weight: 600;
247
280
  cursor: pointer;
@@ -249,15 +282,15 @@ body {
249
282
 
250
283
  .solvapay-mcp-muted {
251
284
  margin: 0;
252
- color: var(--color-text-secondary, #475569);
285
+ color: var(--color-text-secondary);
253
286
  font-size: 13px;
254
287
  }
255
288
 
256
289
  .solvapay-mcp-notice {
257
290
  padding: 12px;
258
- border-radius: 8px;
259
- background: var(--color-background-warning, #fffbeb);
260
- color: var(--color-text-warning, #78350f);
291
+ border-radius: var(--border-radius-md);
292
+ background: var(--color-background-warning);
293
+ color: var(--color-text-warning);
261
294
  font-size: 13px;
262
295
  display: flex;
263
296
  flex-direction: column;
@@ -271,9 +304,9 @@ body {
271
304
  .solvapay-mcp-error {
272
305
  margin: 0;
273
306
  padding: 12px;
274
- border-radius: 8px;
275
- background: var(--color-background-danger, #fef2f2);
276
- color: var(--color-text-danger, #991b1b);
307
+ border-radius: var(--border-radius-md);
308
+ background: var(--color-background-danger);
309
+ color: var(--color-text-danger);
277
310
  font-size: 13px;
278
311
  }
279
312
 
@@ -290,10 +323,10 @@ body {
290
323
  gap: 8px;
291
324
  width: 100%;
292
325
  padding: 10px 16px;
293
- border-radius: var(--border-radius-md, 8px);
326
+ border-radius: var(--border-radius-md);
294
327
  border: none;
295
- background: var(--color-background-accent, #0f172a);
296
- color: var(--color-text-on-accent, #ffffff);
328
+ background: var(--color-background-inverse);
329
+ color: var(--color-text-inverse);
297
330
  font-size: 14px;
298
331
  font-weight: 500;
299
332
  text-decoration: none;
@@ -315,14 +348,14 @@ body {
315
348
  padding: 0;
316
349
  background: none;
317
350
  border: none;
318
- color: var(--color-text-secondary, #475569);
351
+ color: var(--color-text-secondary);
319
352
  font-size: 13px;
320
353
  cursor: pointer;
321
354
  text-decoration: underline;
322
355
  }
323
356
 
324
357
  .solvapay-mcp-link-button:hover {
325
- color: var(--color-text-primary, #0f172a);
358
+ color: var(--color-text-primary);
326
359
  }
327
360
 
328
361
  .solvapay-mcp-awaiting-header {
@@ -341,8 +374,8 @@ body {
341
374
  display: inline-block;
342
375
  width: 16px;
343
376
  height: 16px;
344
- border: 2px solid var(--color-border-secondary, #e2e8f0);
345
- border-top-color: var(--color-background-accent, #0f172a);
377
+ border: 2px solid var(--color-border-secondary);
378
+ border-top-color: var(--color-background-inverse);
346
379
  border-radius: 50%;
347
380
  animation: solvapay-mcp-spin 0.8s linear infinite;
348
381
  }
@@ -355,6 +388,41 @@ body {
355
388
 
356
389
  /* Account view */
357
390
 
391
+ /* `<CurrentPlanCard>` ships its own card frame for standalone web
392
+ * surfaces. Inside the MCP account view the surrounding
393
+ * `.solvapay-mcp-card` already IS the frame, so the default chrome
394
+ * nested a second bordered box and doubled the inset (16px card
395
+ * padding + 16px card padding). Flatten it: the plan facts then align
396
+ * to the same left edge and 16px gutter as the heading, the CTA, and
397
+ * every other MCP surface (checkout, topup, success). */
398
+ .solvapay-mcp-account [data-solvapay-current-plan-card] {
399
+ padding: 0;
400
+ border: 0;
401
+ background: none;
402
+ border-radius: 0;
403
+ gap: 10px;
404
+ }
405
+
406
+ /* Type scale inside the flattened plan card, descending from the
407
+ * surface title so each rank is legible at a glance:
408
+ * 18 title → 16 plan name → 14 captioned value → 13 muted date
409
+ * → 11 field label. Left at the sheet defaults the plan name and the
410
+ * price both land near 18px and compete with the title. */
411
+ .solvapay-mcp-account [data-solvapay-current-plan-name] {
412
+ font-size: 16px;
413
+ line-height: 1.3;
414
+ }
415
+
416
+ .solvapay-mcp-account [data-solvapay-current-plan-price],
417
+ .solvapay-mcp-account [data-solvapay-current-plan-balance-line] {
418
+ font-size: 14px;
419
+ font-weight: 600;
420
+ }
421
+
422
+ .solvapay-mcp-account [data-solvapay-current-plan-field-label] {
423
+ color: var(--color-text-secondary);
424
+ }
425
+
358
426
  .solvapay-mcp-account-credit-stack {
359
427
  flex: 1;
360
428
  }
@@ -406,10 +474,10 @@ body {
406
474
 
407
475
  .solvapay-mcp-amount-option {
408
476
  padding: 6px 14px;
409
- border-radius: 8px;
410
- border: 1px solid var(--color-border-secondary, #e2e8f0);
411
- background: var(--color-background-primary, #ffffff);
412
- color: var(--color-text-primary, #0f172a);
477
+ border-radius: var(--border-radius-md);
478
+ border: 1px solid var(--color-border-primary);
479
+ background: transparent;
480
+ color: var(--color-text-primary);
413
481
  font-size: 13px;
414
482
  font-weight: 500;
415
483
  cursor: pointer;
@@ -422,17 +490,17 @@ body {
422
490
  * color — stays within the pre-refactor black/white/gray palette. The
423
491
  * selected state below still wins and fills the chip with the accent. */
424
492
  .solvapay-mcp-amount-option[data-popular]:not([data-state='selected']) {
425
- border-color: var(--color-text-primary, #0f172a);
493
+ border-color: var(--color-text-primary);
426
494
  }
427
495
 
428
496
  .solvapay-mcp-amount-option:hover:not([data-state='selected']):not(:disabled) {
429
- background: var(--color-background-subtle, #f9fafb);
497
+ background: var(--solvapay-control-hover);
430
498
  }
431
499
 
432
500
  .solvapay-mcp-amount-option[data-state='selected'] {
433
- border-color: var(--color-background-accent, #0f172a);
434
- background: var(--color-background-accent, #0f172a);
435
- color: var(--color-text-on-accent, #ffffff);
501
+ border-color: var(--color-background-inverse);
502
+ background: var(--color-background-inverse);
503
+ color: var(--color-text-inverse);
436
504
  }
437
505
 
438
506
  /* `.solvapay-mcp-amount-custom` now wraps the bordered row — currency
@@ -445,19 +513,19 @@ body {
445
513
  gap: 8px;
446
514
  width: 100%;
447
515
  padding: 10px 12px;
448
- border-radius: var(--border-radius-md, 8px);
449
- border: 1px solid var(--color-border-secondary, #e2e8f0);
450
- background: var(--color-background-primary, #ffffff);
516
+ border-radius: var(--border-radius-md);
517
+ border: 1px solid var(--color-border-primary);
518
+ background: transparent;
451
519
  transition: border-color 120ms ease;
452
520
  }
453
521
 
454
522
  .solvapay-mcp-amount-custom:focus-within {
455
- border-color: var(--color-text-primary, #0f172a);
456
- box-shadow: 0 0 0 1px var(--color-text-primary, #0f172a);
523
+ border-color: var(--color-ring-primary);
524
+ box-shadow: 0 0 0 1px var(--color-ring-primary);
457
525
  }
458
526
 
459
527
  .solvapay-mcp-amount-currency-symbol {
460
- color: var(--color-text-secondary, #475569);
528
+ color: var(--color-text-secondary);
461
529
  font-size: 14px;
462
530
  font-weight: 500;
463
531
  }
@@ -467,7 +535,7 @@ body {
467
535
  background: transparent;
468
536
  border: none;
469
537
  outline: none;
470
- color: var(--color-text-primary, #0f172a);
538
+ color: var(--color-text-primary);
471
539
  font-size: 14px;
472
540
  min-width: 0;
473
541
  padding: 0;
@@ -476,17 +544,18 @@ body {
476
544
  .solvapay-mcp-topup-form {
477
545
  display: flex;
478
546
  flex-direction: column;
479
- gap: 12px;
547
+ gap: 20px;
480
548
  }
481
549
 
482
550
  /* Business purchase / VAT — collapsed by default; fields expand inline on toggle. */
483
551
  .solvapay-mcp-business-details {
484
552
  display: flex;
485
553
  flex-direction: column;
486
- gap: 8px;
487
- padding: 10px 12px;
488
- border: 1px solid var(--color-border-secondary, #e2e8f0);
489
- border-radius: 8px;
554
+ gap: 16px;
555
+ }
556
+
557
+ .solvapay-mcp-business-details input[type='checkbox'] {
558
+ accent-color: var(--color-background-inverse);
490
559
  }
491
560
 
492
561
  .solvapay-mcp-business-toggle {
@@ -494,22 +563,27 @@ body {
494
563
  align-items: center;
495
564
  gap: 8px;
496
565
  font-size: 13px;
497
- color: var(--color-text-secondary, #475569);
566
+ color: var(--color-text-secondary);
498
567
  cursor: pointer;
499
568
  }
500
569
 
501
- .solvapay-mcp-business-details:not(:has([data-solvapay-topup-form-business-details-toggle]:checked)):not(
502
- :has([data-solvapay-payment-form-business-details-toggle]:checked)
503
- )
504
- .solvapay-mcp-business-field {
570
+ .solvapay-mcp-business-details:not(
571
+ :has([data-solvapay-topup-form-business-details-toggle]:checked)
572
+ ):not(:has([data-solvapay-payment-form-business-details-toggle]:checked))
573
+ :is(
574
+ [data-solvapay-topup-form-business-details-name],
575
+ [data-solvapay-topup-form-business-details-tax-id],
576
+ [data-solvapay-payment-form-business-details-name],
577
+ [data-solvapay-payment-form-business-details-tax-id]
578
+ ) {
505
579
  display: none;
506
580
  }
507
581
 
508
582
  .solvapay-mcp-business-field {
509
583
  width: 100%;
510
584
  padding: 8px 10px;
511
- border: 1px solid var(--color-border-secondary, #e2e8f0);
512
- border-radius: 6px;
585
+ border: 1px solid var(--color-border-primary);
586
+ border-radius: var(--border-radius-sm);
513
587
  font-size: 14px;
514
588
  }
515
589
 
@@ -517,9 +591,6 @@ body {
517
591
  display: flex;
518
592
  flex-direction: column;
519
593
  gap: 6px;
520
- padding: 10px 12px;
521
- border: 1px solid var(--color-border-secondary, #e2e8f0);
522
- border-radius: 8px;
523
594
  font-size: 13px;
524
595
  }
525
596
 
@@ -544,14 +615,14 @@ body {
544
615
  .solvapay-mcp-tax-summary .solvapay-tax-summary-row--total {
545
616
  font-weight: 600;
546
617
  padding-top: 6px;
547
- border-top: 1px solid var(--color-border-secondary, #e2e8f0);
618
+ border-top: 1px solid var(--color-border-secondary);
548
619
  }
549
620
 
550
621
  .solvapay-mcp-tax-summary [data-solvapay-topup-form-summary-tax-note],
551
622
  .solvapay-mcp-tax-summary [data-solvapay-payment-form-summary-tax-note] {
552
623
  margin: 0;
553
624
  font-size: 12px;
554
- color: var(--color-text-secondary, #475569);
625
+ color: var(--color-text-secondary);
555
626
  }
556
627
 
557
628
  /* Pay-with-card step header: amount being purchased is the hero, the
@@ -560,15 +631,14 @@ body {
560
631
  * `BalanceBadge` — balance is the right hero on those screens. */
561
632
  .solvapay-mcp-topup-amount-hero {
562
633
  margin: 0;
563
- font-size: 28px;
564
- font-weight: 600;
634
+ font: var(--solvapay-type-rail-hero);
565
635
  letter-spacing: -0.02em;
566
636
  font-variant-numeric: tabular-nums;
567
637
  }
568
638
 
569
639
  .solvapay-mcp-topup-balance-context {
570
640
  margin: 0;
571
- color: var(--color-text-secondary, #475569);
641
+ color: var(--color-text-secondary);
572
642
  font-size: 13px;
573
643
  }
574
644
 
@@ -594,163 +664,146 @@ body {
594
664
  min-height: 280px;
595
665
  }
596
666
 
597
- /* Activation view */
667
+ /* Shell chrome — body, footer
668
+ *
669
+ * Merchant branding lives on `<AppHeader>` in the chrome row.
670
+ * "Paying as {email}" lives inside the payment form, not the shell.
671
+ * There is no sidebar grid.
672
+ */
598
673
 
599
- .solvapay-mcp-activation-flow {
674
+ .solvapay-mcp-shell {
600
675
  display: flex;
601
676
  flex-direction: column;
602
- gap: 12px;
677
+ gap: 16px;
603
678
  }
604
679
 
605
- /* Paywall view (Phase 2.1) */
606
-
607
- .solvapay-mcp-paywall-plans {
680
+ /* Body column carrying every step of every surface (account card,
681
+ * checkout step stack, topup form). The reading-measure cap lives
682
+ * on the shell so card and footer stay one block. */
683
+ .solvapay-mcp-shell-body {
608
684
  display: flex;
609
685
  flex-direction: column;
610
- gap: 8px;
686
+ gap: 16px;
687
+ min-width: 0;
611
688
  }
612
689
 
613
- .solvapay-mcp-paywall-embedded-checkout {
614
- display: flex;
615
- flex-direction: column;
616
- gap: 12px;
617
- padding-top: 8px;
618
- border-top: 1px solid var(--color-border-secondary, #e2e8f0);
690
+ /* Dampens iframe shrink → grow round-trips when a brief "Loading…"
691
+ * interstitial paints between surface swaps. */
692
+ .solvapay-mcp-shell-body .solvapay-mcp-card:first-of-type {
693
+ min-height: 160px;
619
694
  }
620
695
 
621
- /* Usage view (Phase 2.2)
622
- *
623
- * The UsageMeter primitive already ships default styles in
624
- * @solvapay/react/styles.css — the MCP view only adds view-level spacing. */
625
-
626
- /* Shell chrome — layout, sidebar, footer
627
- *
628
- * Merchant branding moved to `<AppHeader>` inside each view (see
629
- * `.solvapay-mcp-app-header-*` above) so hosts that paint their own
630
- * chrome mark (ChatGPT, Claude Desktop) can suppress the strip, while
631
- * MCP Jam / VS Code keep the in-widget mark they need. The shell now
632
- * only lays out the view router + optional sidebar + footer.
633
- */
634
-
635
- .solvapay-mcp-shell {
696
+ /* Fullscreen is the hosted page, not a stretched widget: one scroll
697
+ * owner on `main`, a centered 1000px column, payment rail 340,
698
+ * management one column. Below 1000px of host width the container
699
+ * query falls back to the inline single-column stack. Host chrome
700
+ * (window close) stays outside the iframe. Host `safeAreaInsets`
701
+ * land as extra padding on `.solvapay-mcp-main` from the
702
+ * display-mode hook — not `env(safe-area-inset-*)`, which cannot
703
+ * see the host composer. */
704
+ .solvapay-mcp-main[data-display-mode='fullscreen'] {
705
+ min-block-size: 100%;
706
+ width: 100%;
636
707
  display: flex;
637
708
  flex-direction: column;
638
- gap: 16px;
639
- /* Inline-size container for the sidebar layout below
640
- * (`.solvapay-mcp-shell-sidebar` / `.solvapay-mcp-shell-layout` use
641
- * `@container (min-width: 900px)`). Scoped here rather than on
642
- * `.solvapay-mcp-main` so dormant fixed-positioned overlays
643
- * (`.solvapay-mcp-tour-overlay`, `.solvapay-mcp-tour-popover`) that
644
- * render as siblings of `<McpAppShell>` inside `.solvapay-mcp-main`
645
- * stay anchored to the iframe viewport — `container-type` makes the
646
- * element a containing block for `position: fixed` descendants per
647
- * the CSS containment spec, so we keep that scope tight. */
709
+ align-items: center;
710
+ justify-content: center;
711
+ justify-content: safe center;
712
+ overflow: auto;
648
713
  container-type: inline-size;
714
+ container-name: mcp mcp-hosted;
649
715
  }
650
716
 
651
- .solvapay-mcp-tablist {
652
- display: flex;
653
- gap: 4px;
654
- border-bottom: 1px solid var(--color-border-secondary, #e2e8f0);
655
- overflow-x: auto;
656
- /* Hide scrollbar on WebKit while still allowing overflow for narrow iframes */
657
- scrollbar-width: thin;
717
+ .solvapay-mcp-main[data-display-mode='fullscreen'] .solvapay-mcp-hosted {
718
+ max-width: 1000px;
719
+ width: 100%;
720
+ margin-inline: auto;
658
721
  }
659
722
 
660
- .solvapay-mcp-tab {
661
- padding: 8px 12px;
662
- background: transparent;
663
- border: none;
664
- border-bottom: 2px solid transparent;
665
- color: var(--color-text-secondary, #475569);
666
- font-size: 13px;
667
- font-weight: 500;
668
- cursor: pointer;
669
- white-space: nowrap;
670
- transition:
671
- color 120ms ease,
672
- border-color 120ms ease;
723
+ .solvapay-mcp-main[data-display-mode='fullscreen'] .solvapay-mcp-app-header {
724
+ display: none;
673
725
  }
674
726
 
675
- .solvapay-mcp-tab:hover:not([data-active='true']) {
676
- color: var(--color-text-primary, #0f172a);
727
+ .solvapay-mcp-main[data-display-mode='fullscreen'] .solvapay-mcp-chrome-row {
728
+ display: none;
677
729
  }
678
730
 
679
- .solvapay-mcp-tab[data-active='true'] {
680
- color: var(--color-text-primary, #0f172a);
681
- border-bottom-color: var(--color-background-accent, #0f172a);
731
+ .solvapay-mcp-main[data-display-mode='fullscreen'] > .solvapay-mcp-card {
732
+ max-inline-size: none;
682
733
  }
683
734
 
684
- .solvapay-mcp-tab:focus-visible {
685
- outline: 2px solid var(--color-background-accent, #0f172a);
686
- outline-offset: -2px;
687
- border-radius: 6px;
735
+ .solvapay-mcp-main[data-display-mode='fullscreen']
736
+ .solvapay-mcp-card:has(.solvapay-mcp-hosted-layout) {
737
+ padding: 0;
738
+ border: none;
688
739
  }
689
740
 
690
- .solvapay-mcp-shell-layout {
691
- display: grid;
692
- grid-template-columns: minmax(0, 1fr);
693
- gap: 16px;
741
+ html:has(.solvapay-mcp-main[data-display-mode='fullscreen']),
742
+ html:has(.solvapay-mcp-main[data-display-mode='fullscreen']) body,
743
+ html:has(.solvapay-mcp-main[data-display-mode='fullscreen']) #root {
744
+ width: 100%;
745
+ height: 100%;
694
746
  }
695
747
 
696
- /* Body column carrying every step of every surface (account card,
697
- * checkout step stack, topup form). Width policy is owned by the
698
- * outer `.solvapay-mcp-main` cap (480 default, 816 with sidebar) —
699
- * inside a single-column layout grid the body fills its 480 cell
700
- * exactly; in the two-column sidebar layout the grid's first track
701
- * is `minmax(0, 480px)` (below). No body-level max needed. */
702
- .solvapay-mcp-shell-body {
748
+ html:has(.solvapay-mcp-main[data-display-mode='fullscreen']) #root {
749
+ padding: 0;
750
+ overflow: hidden;
751
+ }
752
+
753
+ .solvapay-mcp-main[data-display-mode='fullscreen'] .solvapay-mcp-shell {
754
+ flex: 0 1 auto;
755
+ min-height: 0;
756
+ width: 100%;
757
+ /* 1000px column + the 72px gutter on each side. */
758
+ max-inline-size: 1144px;
759
+ padding: 56px 72px 40px;
760
+ margin-inline: 0;
761
+ }
762
+
763
+ .solvapay-mcp-hosted-layout {
703
764
  display: flex;
704
765
  flex-direction: column;
705
766
  gap: 16px;
706
767
  min-width: 0;
707
768
  }
708
769
 
709
- .solvapay-mcp-shell-panel {
770
+ .solvapay-mcp-summary-rail {
771
+ min-width: 0;
772
+ border-bottom: 1px solid var(--color-border-secondary);
773
+ padding-bottom: 16px;
774
+ }
775
+
776
+ .solvapay-mcp-hosted-body {
777
+ min-width: 0;
710
778
  display: flex;
711
779
  flex-direction: column;
712
- gap: 16px;
780
+ gap: var(--solvapay-section-gap);
713
781
  }
714
782
 
715
- /* Wide-shell sidebar: visible when the shell's own inline size is
716
- * >=816 (480 body + 16 gap + 320 sidebar). Container query (not
717
- * media query) so the layout fires on the shell's own size, not the
718
- * iframe viewport — the matching media-gated `:has()` lift above
719
- * ensures `.solvapay-mcp-main` only reaches 816 on iframes that can
720
- * actually host the wide layout. Hosts with narrow iframes (ChatGPT
721
- * ~400px, compact Claude Desktop) fall through to the single-column
722
- * layout with the inline detail cards under the active card. */
723
-
724
- .solvapay-mcp-shell-sidebar {
725
- display: none;
783
+ /* The gap is the only spacing; drop the primitive's own margin. */
784
+ .solvapay-mcp-hosted-body > .solvapay-mcp-back-link {
785
+ margin-bottom: 0;
726
786
  }
727
787
 
728
- @container (min-width: 816px) {
729
- /* Sidebar track sits at 320px on the left and the body track is
730
- * `minmax(0, 480px)` on the right. `order: -1` on the sidebar
731
- * bumps it to the front of grid auto-placement so DOM order stays
732
- * body-first (primary action first for screen readers on the
733
- * checkout/topup payment surfaces) while visual order is
734
- * sidebar-left. The outer `.solvapay-mcp-main` is already
735
- * `margin-inline: auto` capped at 816, so the 320+16+480 = 816px
736
- * composition lands centred in the iframe without any extra
737
- * `justify-content` on the grid. */
738
- .solvapay-mcp-shell-layout {
739
- grid-template-columns: 320px minmax(0, 480px);
740
- }
788
+ .solvapay-mcp-hosted[data-mcp-surface='management'] .solvapay-mcp-hosted-layout {
789
+ display: flex;
790
+ flex-direction: column;
791
+ }
741
792
 
742
- .solvapay-mcp-shell-sidebar {
743
- display: flex;
744
- flex-direction: column;
745
- gap: 12px;
746
- order: -1;
793
+ @container mcp-hosted (min-width: 1000px) {
794
+ .solvapay-mcp-hosted-layout[data-rail='hosted']:has(> .solvapay-mcp-summary-rail) {
795
+ display: grid;
796
+ grid-template-columns: 340px minmax(0, 1fr);
797
+ gap: 56px;
798
+ align-items: stretch;
747
799
  }
748
800
 
749
- /* Account tab is hidden in the wide-shell layout — its content
750
- * lives in the sidebar. Stays in the DOM so the arrow-key nav is
751
- * stable; CSS just takes it out of flow. */
752
- .solvapay-mcp-tab[data-hide-wide='true'] {
753
- display: none;
801
+ .solvapay-mcp-hosted-layout[data-rail='hosted'] > .solvapay-mcp-summary-rail {
802
+ border-bottom: none;
803
+ border-right: 1px solid var(--color-border-secondary);
804
+ padding-bottom: 0;
805
+ padding-right: 56px;
806
+ padding-top: 56px;
754
807
  }
755
808
  }
756
809
 
@@ -780,7 +833,7 @@ body {
780
833
  * slate-600 so the footer reads cleanly against white without
781
834
  * fading into the card border. Matches the rest of the MCP
782
835
  * chrome (`AppHeader`, muted body copy). */
783
- color: var(--color-text-secondary, #475569);
836
+ color: var(--color-text-secondary);
784
837
  }
785
838
 
786
839
  /* Match the visual spacing of the inner `Terms · Privacy` separator.
@@ -795,105 +848,12 @@ body {
795
848
  font-weight: 400;
796
849
  }
797
850
 
798
- /* Account view — Customer + Seller details cards
799
- *
800
- * Kept self-contained so the same markup renders identically inside
801
- * `<McpAccountView>` and the wide-iframe sidebar in `<McpAppShell>`.
802
- */
803
-
804
851
  .solvapay-mcp-account {
805
852
  display: flex;
806
853
  flex-direction: column;
807
854
  gap: 16px;
808
855
  }
809
856
 
810
- .solvapay-mcp-detail-grid {
811
- display: flex;
812
- flex-direction: column;
813
- gap: 14px;
814
- }
815
-
816
- .solvapay-mcp-detail-row {
817
- display: flex;
818
- flex-direction: column;
819
- gap: 2px;
820
- }
821
-
822
- .solvapay-mcp-detail-label {
823
- font-size: 12px;
824
- letter-spacing: 0.08em;
825
- text-transform: uppercase;
826
- font-weight: 600;
827
- }
828
-
829
- .solvapay-mcp-detail-value {
830
- font-size: 14px;
831
- color: var(--color-text-primary, #0f172a);
832
- }
833
-
834
- .solvapay-mcp-detail-value-mono {
835
- font-family:
836
- ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
837
- monospace;
838
- font-size: 12px;
839
- }
840
-
841
- .solvapay-mcp-detail-link {
842
- color: var(--color-text-primary, #0f172a);
843
- font-size: 14px;
844
- text-decoration: none;
845
- word-break: break-word;
846
- }
847
-
848
- .solvapay-mcp-detail-link:hover {
849
- text-decoration: underline;
850
- }
851
-
852
- .solvapay-mcp-detail-heading-row {
853
- display: flex;
854
- align-items: center;
855
- justify-content: space-between;
856
- gap: 12px;
857
- }
858
-
859
- .solvapay-mcp-customer-card .solvapay-mcp-detail-grid {
860
- flex: 1;
861
- }
862
-
863
- .solvapay-mcp-detail-balance-row {
864
- display: flex;
865
- flex-direction: row;
866
- align-items: flex-end;
867
- justify-content: space-between;
868
- gap: 12px;
869
- margin-top: auto;
870
- }
871
-
872
- .solvapay-mcp-detail-balance-copy {
873
- display: flex;
874
- flex-direction: column;
875
- gap: 2px;
876
- min-width: 0;
877
- }
878
-
879
- .solvapay-mcp-detail-balance-row .solvapay-mcp-link-button {
880
- align-self: flex-end;
881
- flex: 0 0 auto;
882
- }
883
-
884
- .solvapay-mcp-verified-badge {
885
- display: inline-flex;
886
- align-items: center;
887
- gap: 4px;
888
- padding: 2px 8px;
889
- border-radius: 999px;
890
- background: var(--color-background-success-subtle, #ecfdf5);
891
- color: var(--color-text-success, #065f46);
892
- font-size: 11px;
893
- font-weight: 500;
894
- line-height: 1.4;
895
- }
896
-
897
857
  /* ---- Back-link primitive ---- */
898
858
 
899
859
  .solvapay-mcp-back-link {
@@ -908,14 +868,14 @@ body {
908
868
  display: inline-flex;
909
869
  align-items: center;
910
870
  gap: 6px;
911
- color: var(--color-text-secondary, #475467);
871
+ color: var(--color-text-secondary);
912
872
  font-size: 13px;
913
873
  cursor: pointer;
914
874
  transition: color 120ms ease;
915
875
  }
916
876
 
917
877
  .solvapay-mcp-back-link:hover {
918
- color: var(--color-text-primary, #101828);
878
+ color: var(--color-text-primary);
919
879
  }
920
880
 
921
881
  /* Underline only the label on hover — applying `text-decoration` to
@@ -937,108 +897,56 @@ body {
937
897
  transform: translateX(-2px);
938
898
  }
939
899
 
940
- /* ---- External-link glyph ---- */
941
-
942
- .solvapay-mcp-external-glyph {
943
- display: inline-block;
944
- opacity: 0.75;
945
- font-size: 0.9em;
946
- letter-spacing: 0.02em;
947
- vertical-align: -0.1em;
948
- margin-left: 0.35em;
949
- }
950
-
951
- /* ---- Plan actions row ---- */
952
-
953
- .solvapay-mcp-plan-actions {
954
- display: flex;
955
- flex-direction: column;
956
- gap: 8px;
957
- margin-top: 12px;
958
- }
959
-
960
- .solvapay-mcp-plan-topup-prompt {
900
+ /* Payment-form identity: inline shares a row with the back-link;
901
+ * fullscreen stacks a muted label over the email. */
902
+ .solvapay-mcp-form-identity-row {
961
903
  display: flex;
962
- flex-direction: column;
963
- gap: 8px;
964
- margin-top: 12px;
965
- }
966
-
967
- /* ---- First-run tour ---- */
968
-
969
- .solvapay-mcp-tour-overlay {
970
- position: fixed;
971
- inset: 0;
972
- pointer-events: none;
973
- z-index: 1000;
974
- }
975
-
976
- .solvapay-mcp-tour-popover {
977
- position: fixed;
978
- max-width: 280px;
979
- pointer-events: auto;
980
- padding: 12px 16px;
981
- border-radius: 8px;
982
- background: var(--color-background-elevated, #ffffff);
983
- box-shadow: 0 8px 24px rgba(16, 24, 40, 0.12);
984
- border: 1px solid var(--color-border-default, #e4e7ec);
985
- }
986
-
987
- .solvapay-mcp-tour-title {
988
- margin: 0 0 4px 0;
989
- font-size: 14px;
990
- font-weight: 600;
904
+ align-items: center;
905
+ justify-content: space-between;
906
+ gap: 16px;
991
907
  }
992
908
 
993
- .solvapay-mcp-tour-body {
994
- margin: 0 0 12px 0;
995
- font-size: 13px;
996
- color: var(--color-text-secondary, #475467);
909
+ .solvapay-mcp-form-identity-row .solvapay-mcp-back-link {
910
+ margin-block-end: 0;
997
911
  }
998
912
 
999
- .solvapay-mcp-tour-actions {
1000
- display: flex;
1001
- align-items: center;
1002
- justify-content: space-between;
1003
- gap: 8px;
913
+ .solvapay-mcp-paying-as {
1004
914
  font-size: 12px;
915
+ line-height: 1.4;
916
+ color: var(--color-text-secondary);
1005
917
  }
1006
918
 
1007
- .solvapay-mcp-tour-skip,
1008
- .solvapay-mcp-tour-next {
1009
- appearance: none;
1010
- background: none;
1011
- border: none;
1012
- padding: 4px 8px;
1013
- cursor: pointer;
1014
- border-radius: 4px;
1015
- font-size: 13px;
919
+ .solvapay-mcp-paying-as[data-variant='stacked'] {
920
+ display: flex;
921
+ flex-direction: column;
922
+ gap: 2px;
923
+ margin-top: 16px;
924
+ padding-bottom: 20px;
925
+ border-bottom: 1px solid var(--color-border-secondary);
1016
926
  }
1017
927
 
1018
- .solvapay-mcp-tour-next {
1019
- background: var(--color-background-primary, #0f172a);
1020
- color: var(--color-text-on-primary, #ffffff);
928
+ .solvapay-mcp-paying-as[data-variant='stacked'] .solvapay-mcp-paying-as-label {
929
+ font-size: 12px;
930
+ line-height: 1.4;
931
+ color: var(--color-text-secondary);
1021
932
  }
1022
933
 
1023
- .solvapay-mcp-tour-progress {
1024
- color: var(--color-text-tertiary, #667085);
934
+ .solvapay-mcp-paying-as[data-variant='stacked'] .solvapay-mcp-paying-as-email {
935
+ font-size: 16px;
936
+ font-weight: 500;
937
+ line-height: 1.4;
938
+ color: var(--color-text-primary);
1025
939
  }
1026
940
 
1027
- .solvapay-mcp-tour-replay {
1028
- appearance: none;
1029
- background: none;
1030
- border: 1px solid var(--color-border-default, #e4e7ec);
1031
- border-radius: 999px;
1032
- width: 24px;
1033
- height: 24px;
1034
- cursor: pointer;
1035
- font-size: 13px;
1036
- line-height: 1;
1037
- color: var(--color-text-secondary, #475467);
1038
- }
941
+ /* ---- External-link glyph ---- */
1039
942
 
1040
- .solvapay-mcp-tour-replay:hover {
1041
- color: var(--color-text-primary, #101828);
943
+ .solvapay-mcp-external-glyph {
944
+ display: inline-block;
945
+ opacity: 0.75;
946
+ font-size: 0.9em;
947
+ letter-spacing: 0.02em;
948
+ vertical-align: -0.1em;
949
+ margin-left: 0.35em;
1042
950
  }
1043
951
 
1044
952
  /* McpUpsellStrip / McpNudgeView styles were removed along with the
@@ -1049,26 +957,24 @@ body {
1049
957
  *
1050
958
  * Styles for the two-branch <McpCheckoutView>: PlanStep → AmountStep →
1051
959
  * PaygPaymentStep / RecurringPaymentStep → SuccessStep. Palette is
1052
- * strictly the same monochrome family as the rest of the MCP shell —
1053
- * white surfaces, secondary-border greys, subtle-bg fills, primary
1054
- * slate ink, secondary slate for muted copy. No warning tints, no
1055
- * success halo — `.solvapay-mcp-error` is the only chromatic note and
1056
- * it stays untouched for a11y semantics. */
960
+ * the shared hosted vocabulary — host tokens on `--color-*`, branding
961
+ * extras on `--solvapay-*`. Inner surfaces stay transparent with a
962
+ * hairline; `.solvapay-mcp-error` is the only reserved chromatic note. */
1057
963
 
1058
964
  .solvapay-mcp-checkout-banner {
1059
965
  display: flex;
1060
966
  flex-direction: column;
1061
967
  gap: 4px;
1062
968
  padding: 12px;
1063
- border-radius: var(--border-radius-md, 8px);
1064
- border: 1px solid var(--color-border-secondary, #e2e8f0);
1065
- background: var(--color-background-subtle, #f9fafb);
969
+ border-radius: var(--border-radius-md);
970
+ border: 1px solid var(--color-border-secondary);
971
+ background: var(--color-background-secondary);
1066
972
  }
1067
973
 
1068
974
  .solvapay-mcp-checkout-banner-title {
1069
975
  font-size: 13px;
1070
976
  font-weight: 600;
1071
- color: var(--color-text-primary, #0f172a);
977
+ color: var(--color-text-primary);
1072
978
  }
1073
979
 
1074
980
  .solvapay-mcp-checkout-banner-message {
@@ -1101,69 +1007,34 @@ body {
1101
1007
  flex-direction: column;
1102
1008
  gap: 6px;
1103
1009
  padding: 12px;
1104
- border-radius: var(--border-radius-md, 8px);
1105
- border: 1px solid var(--color-border-secondary, #e2e8f0);
1106
- background: var(--color-background-subtle, #f9fafb);
1010
+ border-radius: var(--border-radius-md);
1011
+ border: 1px solid var(--color-border-primary);
1012
+ background: transparent;
1107
1013
  }
1108
1014
 
1109
- .solvapay-mcp-checkout-order-summary-row {
1110
- display: flex;
1111
- justify-content: space-between;
1112
- align-items: baseline;
1113
- gap: 12px;
1114
- font-size: 13px;
1115
- font-variant-numeric: tabular-nums;
1116
- color: var(--color-text-primary, #0f172a);
1117
- }
1118
-
1119
- .solvapay-mcp-checkout-save-card {
1120
- display: flex;
1121
- align-items: center;
1122
- gap: 8px;
1123
- font-size: 13px;
1124
- color: var(--color-text-secondary, #475569);
1125
- cursor: pointer;
1126
- }
1127
-
1128
- .solvapay-mcp-checkout-save-card input[type='checkbox'] {
1129
- margin: 0;
1130
- cursor: pointer;
1131
- }
1132
-
1133
- .solvapay-mcp-checkout-terms {
1134
- margin: 0;
1135
- font-size: 12px;
1136
- line-height: 1.5;
1137
- }
1138
-
1139
- .solvapay-mcp-checkout-receipt {
1015
+ /* Order-summary rows share `.solvapay-mcp-line-item`. */
1016
+
1017
+ .solvapay-mcp-checkout-receipt {
1140
1018
  display: flex;
1141
1019
  flex-direction: column;
1142
1020
  gap: 8px;
1143
1021
  margin: 0;
1144
1022
  padding: 12px;
1145
- border-radius: var(--border-radius-md, 8px);
1146
- border: 1px solid var(--color-border-secondary, #e2e8f0);
1147
- background: var(--color-background-subtle, #f9fafb);
1023
+ border-radius: var(--border-radius-md);
1024
+ border: 1px solid var(--color-border-primary);
1025
+ background: transparent;
1148
1026
  }
1149
1027
 
1150
- .solvapay-mcp-checkout-receipt-row {
1151
- display: flex;
1152
- justify-content: space-between;
1153
- align-items: baseline;
1154
- gap: 12px;
1155
- font-size: 13px;
1156
- font-variant-numeric: tabular-nums;
1157
- }
1028
+ /* Receipt rows share `.solvapay-mcp-line-item`. */
1158
1029
 
1159
1030
  .solvapay-mcp-checkout-receipt-row dt {
1160
1031
  margin: 0;
1161
- color: var(--color-text-secondary, #475569);
1032
+ color: var(--color-text-secondary);
1162
1033
  }
1163
1034
 
1164
1035
  .solvapay-mcp-checkout-receipt-row dd {
1165
1036
  margin: 0;
1166
- color: var(--color-text-primary, #0f172a);
1037
+ color: var(--color-text-primary);
1167
1038
  font-weight: 500;
1168
1039
  }
1169
1040
 
@@ -1177,9 +1048,9 @@ body {
1177
1048
  width: 32px;
1178
1049
  height: 32px;
1179
1050
  border-radius: 50%;
1180
- border: 1px solid var(--color-border-secondary, #e2e8f0);
1181
- background: var(--color-background-primary, #ffffff);
1182
- color: var(--color-text-primary, #0f172a);
1051
+ border: 1px solid var(--color-border-secondary);
1052
+ background: transparent;
1053
+ color: var(--color-text-primary);
1183
1054
  font-size: 18px;
1184
1055
  line-height: 1;
1185
1056
  }
@@ -1191,11 +1062,1062 @@ body {
1191
1062
 
1192
1063
  .solvapay-mcp-checkout-manage-pointer code {
1193
1064
  padding: 1px 6px;
1194
- border-radius: 4px;
1195
- background: var(--color-background-subtle, #f9fafb);
1196
- font-family:
1197
- ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
1198
- monospace;
1065
+ border-radius: var(--border-radius-sm);
1066
+ background: var(--color-background-secondary);
1067
+ font-family: var(--font-mono);
1199
1068
  font-size: 12px;
1200
- color: var(--color-text-primary, #0f172a);
1069
+ color: var(--color-text-primary);
1070
+ }
1071
+
1072
+ /* ---- v2 primitive vocabulary ----
1073
+ *
1074
+ * Plain CSS translation of the hosted primitives. Inner surfaces stay
1075
+ * transparent + hairline; selected / raised fills use inverse or
1076
+ * `--color-background-secondary`, never `--color-background-primary`.
1077
+ * Focus uses the spec `--color-ring-primary` token. */
1078
+
1079
+ .solvapay-mcp-section {
1080
+ display: flex;
1081
+ flex-direction: column;
1082
+ gap: 16px;
1083
+ }
1084
+
1085
+ .solvapay-mcp-section-title {
1086
+ margin: 0;
1087
+ font: var(--solvapay-type-heading);
1088
+ letter-spacing: -0.5px;
1089
+ color: var(--color-text-primary);
1090
+ }
1091
+
1092
+ .solvapay-mcp-eyebrow {
1093
+ margin: 0;
1094
+ text-transform: uppercase;
1095
+ color: var(--color-text-secondary);
1096
+ }
1097
+
1098
+ .solvapay-mcp-eyebrow[data-variant='step'] {
1099
+ font: var(--solvapay-type-eyebrow-step);
1100
+ letter-spacing: 2px;
1101
+ }
1102
+
1103
+ .solvapay-mcp-eyebrow[data-variant='rail'] {
1104
+ font: var(--solvapay-type-eyebrow-rail);
1105
+ letter-spacing: 1px;
1106
+ }
1107
+
1108
+ .solvapay-mcp-line-item,
1109
+ .solvapay-mcp-checkout-order-summary-row,
1110
+ .solvapay-mcp-checkout-receipt-row {
1111
+ display: flex;
1112
+ justify-content: space-between;
1113
+ align-items: baseline;
1114
+ gap: 12px;
1115
+ font: var(--solvapay-type-body);
1116
+ font-variant-numeric: tabular-nums;
1117
+ color: var(--color-text-primary);
1118
+ }
1119
+
1120
+ .solvapay-mcp-line-item[data-muted='true'],
1121
+ .solvapay-mcp-line-item[data-muted='true'] .solvapay-mcp-line-item-value {
1122
+ color: var(--color-text-secondary);
1123
+ }
1124
+
1125
+ .solvapay-mcp-line-item-value {
1126
+ font-family: var(--font-mono);
1127
+ font-variant-numeric: tabular-nums;
1128
+ }
1129
+
1130
+ .solvapay-mcp-amount-ladder {
1131
+ display: flex;
1132
+ flex-direction: column;
1133
+ gap: 8px;
1134
+ }
1135
+
1136
+ .solvapay-mcp-preset-grid {
1137
+ display: grid;
1138
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1139
+ gap: 12px;
1140
+ }
1141
+
1142
+ .solvapay-mcp-preset-tile {
1143
+ display: flex;
1144
+ flex-direction: column;
1145
+ align-items: center;
1146
+ justify-content: center;
1147
+ gap: 2px;
1148
+ min-height: 60px;
1149
+ padding: 8px 4px;
1150
+ border: 1px solid var(--color-border-primary);
1151
+ border-radius: var(--border-radius-md);
1152
+ background: transparent;
1153
+ color: var(--color-text-primary);
1154
+ cursor: pointer;
1155
+ }
1156
+
1157
+ .solvapay-mcp-preset-tile:hover:not([data-state='selected']):not(:disabled) {
1158
+ background: var(--solvapay-control-hover);
1159
+ }
1160
+
1161
+ .solvapay-mcp-preset-tile[data-state='selected'] {
1162
+ border-color: var(--color-background-inverse);
1163
+ background: var(--color-background-inverse);
1164
+ color: var(--color-text-inverse);
1165
+ }
1166
+
1167
+ .solvapay-mcp-preset-tile:focus-visible,
1168
+ .solvapay-mcp-plan-row:focus-visible,
1169
+ .solvapay-mcp-toggle:focus-visible {
1170
+ outline: none;
1171
+ border-color: var(--color-ring-primary);
1172
+ box-shadow: 0 0 0 1px var(--color-ring-primary);
1173
+ }
1174
+
1175
+ .solvapay-mcp-preset-tile-amount {
1176
+ font: 500 17px/1.2 var(--font-sans);
1177
+ }
1178
+
1179
+ .solvapay-mcp-preset-tile-credits {
1180
+ font: var(--solvapay-type-caption);
1181
+ color: var(--color-text-secondary);
1182
+ }
1183
+
1184
+ .solvapay-mcp-preset-tile[data-state='selected'] .solvapay-mcp-preset-tile-credits {
1185
+ color: var(--color-text-inverse);
1186
+ opacity: 0.75;
1187
+ }
1188
+
1189
+ .solvapay-mcp-main[data-display-mode='fullscreen'] .solvapay-mcp-preset-tile {
1190
+ position: relative;
1191
+ padding: 16px;
1192
+ }
1193
+
1194
+ .solvapay-mcp-main[data-display-mode='fullscreen']
1195
+ .solvapay-mcp-preset-tile[data-state='selected']::after {
1196
+ content: '✓';
1197
+ position: absolute;
1198
+ top: 12px;
1199
+ right: 12px;
1200
+ display: grid;
1201
+ place-items: center;
1202
+ width: 18px;
1203
+ height: 18px;
1204
+ border-radius: var(--border-radius-full);
1205
+ background: var(--color-text-inverse);
1206
+ color: var(--color-background-inverse);
1207
+ font: 600 11px/1 var(--font-sans);
1208
+ }
1209
+
1210
+ .solvapay-mcp-main[data-display-mode='fullscreen'] [data-solvapay-amount-picker-confirm],
1211
+ .solvapay-mcp-main[data-display-mode='fullscreen'] .solvapay-mcp-button {
1212
+ min-height: 56px;
1213
+ }
1214
+
1215
+ .solvapay-mcp-plan-list {
1216
+ display: flex;
1217
+ flex-direction: column;
1218
+ gap: 10px;
1219
+ }
1220
+
1221
+ .solvapay-mcp-plan-action-list {
1222
+ gap: 0;
1223
+ }
1224
+
1225
+ .solvapay-mcp-plan-action-row {
1226
+ display: flex;
1227
+ flex-direction: row;
1228
+ align-items: center;
1229
+ justify-content: space-between;
1230
+ gap: 24px;
1231
+ width: 100%;
1232
+ padding: 14px 0;
1233
+ border-top: 1px solid var(--color-border-secondary);
1234
+ background: transparent;
1235
+ color: var(--color-text-primary);
1236
+ text-align: left;
1237
+ }
1238
+
1239
+ .solvapay-mcp-plan-action-row:first-child {
1240
+ padding-top: 0;
1241
+ border-top: none;
1242
+ }
1243
+
1244
+ .solvapay-mcp-plan-action-row-body {
1245
+ display: flex;
1246
+ flex-direction: column;
1247
+ gap: 3px;
1248
+ flex: 1 1 auto;
1249
+ min-width: 0;
1250
+ }
1251
+
1252
+ .solvapay-mcp-plan-action-row-title {
1253
+ font: var(--solvapay-type-plan-row);
1254
+ letter-spacing: -0.3px;
1255
+ }
1256
+
1257
+ .solvapay-mcp-plan-action-row-description {
1258
+ font: var(--solvapay-type-body);
1259
+ color: var(--color-text-secondary);
1260
+ }
1261
+
1262
+ .solvapay-mcp-plan-action-row button {
1263
+ flex: 0 0 auto;
1264
+ display: inline-flex;
1265
+ align-items: center;
1266
+ justify-content: center;
1267
+ gap: 6px;
1268
+ height: 40px;
1269
+ padding: 0 18px;
1270
+ border-radius: var(--border-radius-md);
1271
+ font: var(--solvapay-type-label);
1272
+ font-weight: 500;
1273
+ cursor: pointer;
1274
+ }
1275
+
1276
+ .solvapay-mcp-plan-action-row button:disabled {
1277
+ cursor: not-allowed;
1278
+ opacity: 0.6;
1279
+ }
1280
+
1281
+ .solvapay-mcp-plan-action-row button[data-emphasis='secondary'] {
1282
+ border: 1px solid var(--color-border-primary);
1283
+ background: transparent;
1284
+ color: var(--color-text-primary);
1285
+ }
1286
+
1287
+ .solvapay-mcp-plan-action-row button[data-emphasis='secondary']:hover:not(:disabled) {
1288
+ background: var(--color-background-secondary);
1289
+ }
1290
+
1291
+ .solvapay-mcp-plan-action-row button[data-emphasis='primary'] {
1292
+ border: 1px solid var(--color-background-inverse);
1293
+ background: var(--color-background-inverse);
1294
+ color: var(--color-text-inverse);
1295
+ }
1296
+
1297
+ .solvapay-mcp-plan-action-row button[data-emphasis='primary']:hover:not(:disabled) {
1298
+ opacity: 0.9;
1299
+ }
1300
+
1301
+ .solvapay-mcp-used-up {
1302
+ display: flex;
1303
+ flex-direction: column;
1304
+ gap: 6px;
1305
+ padding: 20px 0;
1306
+ border-top: 1px solid var(--color-border-secondary);
1307
+ border-bottom: 1px solid var(--color-border-secondary);
1308
+ }
1309
+
1310
+ .solvapay-mcp-used-up-title {
1311
+ margin: 0;
1312
+ font: var(--solvapay-type-title);
1313
+ letter-spacing: -0.5px;
1314
+ color: var(--color-text-primary);
1315
+ }
1316
+
1317
+ .solvapay-mcp-used-up p {
1318
+ margin: 0;
1319
+ }
1320
+
1321
+ .solvapay-mcp-topup-total {
1322
+ font: var(--solvapay-type-total);
1323
+ letter-spacing: -0.6px;
1324
+ }
1325
+
1326
+ .solvapay-mcp-plan-row {
1327
+ display: flex;
1328
+ flex-direction: row;
1329
+ align-items: center;
1330
+ justify-content: space-between;
1331
+ gap: 24px;
1332
+ width: 100%;
1333
+ padding: 16px 20px;
1334
+ border: 1px solid var(--color-border-secondary);
1335
+ border-radius: var(--border-radius-md);
1336
+ background: transparent;
1337
+ color: var(--color-text-primary);
1338
+ text-align: left;
1339
+ box-shadow: none;
1340
+ cursor: pointer;
1341
+ }
1342
+
1343
+ .solvapay-mcp-plan-row[data-state='selected'] {
1344
+ border-color: var(--color-background-inverse);
1345
+ }
1346
+
1347
+ .solvapay-mcp-plan-row-body {
1348
+ display: flex;
1349
+ flex-direction: column;
1350
+ gap: 3px;
1351
+ flex: 1 1 auto;
1352
+ min-width: 0;
1353
+ }
1354
+
1355
+ .solvapay-mcp-plan-row-name {
1356
+ display: inline-flex;
1357
+ align-items: center;
1358
+ gap: 10px;
1359
+ font: var(--solvapay-type-plan-row);
1360
+ letter-spacing: -0.3px;
1361
+ }
1362
+
1363
+ .solvapay-mcp-plan-row-description {
1364
+ font: var(--solvapay-type-body);
1365
+ color: var(--color-text-secondary);
1366
+ }
1367
+
1368
+ .solvapay-mcp-plan-row-meta {
1369
+ display: flex;
1370
+ align-items: center;
1371
+ gap: 14px;
1372
+ flex: 0 0 auto;
1373
+ }
1374
+
1375
+ .solvapay-mcp-plan-row-price {
1376
+ font: var(--solvapay-type-label);
1377
+ }
1378
+
1379
+ .solvapay-mcp-plan-row-check {
1380
+ display: grid;
1381
+ place-items: center;
1382
+ width: 20px;
1383
+ height: 20px;
1384
+ flex: 0 0 20px;
1385
+ border-radius: var(--border-radius-full);
1386
+ border: 1px solid var(--color-border-primary);
1387
+ background: transparent;
1388
+ color: transparent;
1389
+ font: 600 11px/1 var(--font-sans);
1390
+ }
1391
+
1392
+ .solvapay-mcp-plan-row[data-state='selected'] .solvapay-mcp-plan-row-check {
1393
+ border-color: var(--color-background-inverse);
1394
+ background: var(--color-background-inverse);
1395
+ color: var(--color-text-inverse);
1396
+ }
1397
+
1398
+ .solvapay-mcp-status-dot {
1399
+ display: inline-flex;
1400
+ align-items: center;
1401
+ gap: 6px;
1402
+ font: var(--solvapay-type-caption);
1403
+ color: var(--color-text-secondary);
1404
+ }
1405
+
1406
+ .solvapay-mcp-status-dot::before {
1407
+ content: '';
1408
+ width: 6px;
1409
+ height: 6px;
1410
+ border-radius: var(--border-radius-full);
1411
+ background: var(--color-text-primary);
1412
+ flex: 0 0 auto;
1413
+ }
1414
+
1415
+ .solvapay-mcp-status-dot[data-empty]::before {
1416
+ background: transparent;
1417
+ border: 1px solid var(--color-border-primary);
1418
+ }
1419
+
1420
+ .solvapay-mcp-pill {
1421
+ display: inline-flex;
1422
+ align-items: center;
1423
+ padding: 2px 8px;
1424
+ border: 1px solid var(--color-border-secondary);
1425
+ border-radius: var(--border-radius-full);
1426
+ font: var(--solvapay-type-caption);
1427
+ color: var(--color-text-primary);
1428
+ }
1429
+
1430
+ .solvapay-mcp-status-pill {
1431
+ display: inline-flex;
1432
+ align-items: center;
1433
+ padding: 2px 8px;
1434
+ border: 1px solid var(--color-border-secondary);
1435
+ border-radius: var(--border-radius-full);
1436
+ background: transparent;
1437
+ font: 500 11px/1.4 var(--font-sans);
1438
+ color: var(--color-text-primary);
1439
+ white-space: nowrap;
1440
+ }
1441
+
1442
+ .solvapay-mcp-status-pill[data-tone='accent'] {
1443
+ border-color: color-mix(in srgb, var(--color-text-warning) 35%, var(--color-border-secondary));
1444
+ background: var(--color-background-warning);
1445
+ color: var(--color-text-warning);
1446
+ }
1447
+
1448
+ .solvapay-mcp-fact-band {
1449
+ display: flex;
1450
+ flex-direction: column;
1451
+ gap: 10px;
1452
+ margin: 0;
1453
+ }
1454
+
1455
+ .solvapay-mcp-fact-band-item {
1456
+ display: flex;
1457
+ justify-content: space-between;
1458
+ align-items: baseline;
1459
+ gap: 12px;
1460
+ margin: 0;
1461
+ }
1462
+
1463
+ .solvapay-mcp-fact-band-label {
1464
+ margin: 0;
1465
+ font: var(--solvapay-type-body);
1466
+ font-weight: 400;
1467
+ color: var(--color-text-secondary);
1468
+ }
1469
+
1470
+ .solvapay-mcp-fact-band-body {
1471
+ display: flex;
1472
+ flex-direction: column;
1473
+ align-items: flex-end;
1474
+ gap: 0;
1475
+ margin: 0;
1476
+ font: 500 14px/1.5 var(--font-sans);
1477
+ color: var(--color-text-primary);
1478
+ text-align: right;
1479
+ }
1480
+
1481
+ .solvapay-mcp-fact-band-caption {
1482
+ display: none;
1483
+ }
1484
+
1485
+ .solvapay-mcp-fact-band-item:has(.solvapay-mcp-fact-band-compact) .solvapay-mcp-fact-band-value {
1486
+ display: none;
1487
+ }
1488
+
1489
+ .solvapay-mcp-allowance-body {
1490
+ display: flex;
1491
+ flex-direction: column;
1492
+ gap: 16px;
1493
+ padding-top: 14px;
1494
+ border-top: 1px solid var(--color-border-secondary);
1495
+ }
1496
+
1497
+ .solvapay-mcp-usage-meter {
1498
+ display: flex;
1499
+ flex-direction: column;
1500
+ gap: 8px;
1501
+ }
1502
+
1503
+ .solvapay-mcp-usage-meter-caption {
1504
+ margin: 0;
1505
+ font: var(--solvapay-type-caption);
1506
+ color: var(--color-text-secondary);
1507
+ }
1508
+
1509
+ .solvapay-mcp-fact-band-value [data-unknown] {
1510
+ color: var(--color-text-secondary);
1511
+ }
1512
+
1513
+ .solvapay-mcp-usage-meter [data-solvapay-usage-meter-bar] {
1514
+ height: 6px;
1515
+ background: var(--color-border-secondary);
1516
+ }
1517
+
1518
+ .solvapay-mcp-field {
1519
+ display: flex;
1520
+ flex-direction: column;
1521
+ gap: 8px;
1522
+ }
1523
+
1524
+ .solvapay-mcp-field-label {
1525
+ font: var(--solvapay-type-label);
1526
+ color: var(--color-text-primary);
1527
+ }
1528
+
1529
+ .solvapay-mcp-field-control {
1530
+ display: flex;
1531
+ align-items: center;
1532
+ gap: 8px;
1533
+ min-height: var(--solvapay-control-height);
1534
+ padding: 0 14px;
1535
+ border: 1px solid var(--color-border-primary);
1536
+ border-radius: var(--border-radius-md);
1537
+ background: transparent;
1538
+ }
1539
+
1540
+ .solvapay-mcp-field-control:focus-within {
1541
+ border-color: var(--color-ring-primary);
1542
+ box-shadow: 0 0 0 1px var(--color-ring-primary);
1543
+ }
1544
+
1545
+ .solvapay-mcp-field-affix {
1546
+ color: var(--color-text-secondary);
1547
+ font: var(--solvapay-type-body);
1548
+ }
1549
+
1550
+ .solvapay-mcp-field-input {
1551
+ flex: 1;
1552
+ min-width: 0;
1553
+ padding: 0;
1554
+ border: none;
1555
+ outline: none;
1556
+ background: transparent;
1557
+ color: var(--color-text-primary);
1558
+ font: 400 15px/1 var(--font-mono);
1559
+ }
1560
+
1561
+ .solvapay-mcp-toggle {
1562
+ appearance: none;
1563
+ position: relative;
1564
+ display: inline-flex;
1565
+ align-items: center;
1566
+ width: 44px;
1567
+ height: 26px;
1568
+ padding: 3px;
1569
+ border: none;
1570
+ border-radius: var(--border-radius-full);
1571
+ background: var(--color-background-secondary);
1572
+ cursor: pointer;
1573
+ }
1574
+
1575
+ .solvapay-mcp-toggle[data-state='on'] {
1576
+ background: var(--color-background-inverse);
1577
+ justify-content: flex-end;
1578
+ }
1579
+
1580
+ .solvapay-mcp-toggle-knob {
1581
+ width: 20px;
1582
+ height: 20px;
1583
+ border-radius: var(--border-radius-full);
1584
+ background: var(--color-text-primary);
1585
+ box-shadow: 0 1px 2px rgb(0 0 0 / 0.2);
1586
+ }
1587
+
1588
+ .solvapay-mcp-toggle[data-state='on'] .solvapay-mcp-toggle-knob {
1589
+ background: var(--color-text-inverse);
1590
+ }
1591
+
1592
+ .solvapay-mcp-ledger-row {
1593
+ display: grid;
1594
+ grid-template-columns: 1.6fr 0.9fr 0.8fr 0.9fr;
1595
+ gap: 12px;
1596
+ align-items: baseline;
1597
+ padding: 12px 0;
1598
+ border-bottom: 1px solid var(--color-border-secondary);
1599
+ font: var(--solvapay-type-body);
1600
+ color: var(--color-text-primary);
1601
+ }
1602
+
1603
+ .solvapay-mcp-ledger-row:last-child {
1604
+ border-bottom: none;
1605
+ }
1606
+
1607
+ .solvapay-mcp-ledger-row [data-align='right'] {
1608
+ text-align: right;
1609
+ font-family: var(--font-mono);
1610
+ font-variant-numeric: tabular-nums;
1611
+ }
1612
+
1613
+ .solvapay-mcp-history {
1614
+ display: flex;
1615
+ flex-direction: column;
1616
+ gap: 14px;
1617
+ }
1618
+
1619
+ .solvapay-mcp-history-head {
1620
+ display: flex;
1621
+ align-items: baseline;
1622
+ justify-content: space-between;
1623
+ gap: 16px;
1624
+ }
1625
+
1626
+ .solvapay-mcp-history-link {
1627
+ background: none;
1628
+ padding: 0;
1629
+ border-radius: 0;
1630
+ border: none;
1631
+ font: 500 13px/1 var(--font-sans);
1632
+ color: var(--color-text-primary);
1633
+ text-decoration: underline;
1634
+ text-underline-offset: 3px;
1635
+ }
1636
+
1637
+ .solvapay-mcp-history-link[data-state='ready']:hover {
1638
+ background: none;
1639
+ }
1640
+
1641
+ .solvapay-mcp-history-table {
1642
+ width: 100%;
1643
+ border-collapse: collapse;
1644
+ text-align: left;
1645
+ }
1646
+
1647
+ .solvapay-mcp-history-table[data-kind='credits'] {
1648
+ table-layout: fixed;
1649
+ }
1650
+
1651
+ .solvapay-mcp-history-table[data-kind='credits'] th:nth-child(1),
1652
+ .solvapay-mcp-history-table[data-kind='credits'] td:nth-child(1) {
1653
+ width: 43%;
1654
+ }
1655
+
1656
+ .solvapay-mcp-history-table[data-kind='credits'] th:nth-child(2),
1657
+ .solvapay-mcp-history-table[data-kind='credits'] td:nth-child(2) {
1658
+ width: 23%;
1659
+ }
1660
+
1661
+ .solvapay-mcp-history-table th {
1662
+ padding: 0 16px 12px 0;
1663
+ border-bottom: 1px solid var(--color-border-secondary);
1664
+ font: 400 12px/1.67 var(--font-sans);
1665
+ letter-spacing: 1px;
1666
+ text-transform: uppercase;
1667
+ color: var(--color-text-secondary);
1668
+ font-weight: 400;
1669
+ }
1670
+
1671
+ .solvapay-mcp-history-table th:last-child,
1672
+ .solvapay-mcp-history-table td:last-child,
1673
+ .solvapay-mcp-history-table [data-align='right'] {
1674
+ text-align: right;
1675
+ padding-right: 0;
1676
+ }
1677
+
1678
+ .solvapay-mcp-history-table td {
1679
+ padding: 14px 16px 14px 0;
1680
+ border-bottom: 1px solid var(--color-border-secondary);
1681
+ font: 400 14px/1.4 var(--font-sans);
1682
+ color: var(--color-text-secondary);
1683
+ vertical-align: middle;
1684
+ }
1685
+
1686
+ .solvapay-mcp-history-table td:first-child,
1687
+ .solvapay-mcp-history-table td[data-align='right']:nth-last-child(2) {
1688
+ font: 500 15px/1.4 var(--font-sans);
1689
+ color: var(--color-text-primary);
1690
+ }
1691
+
1692
+ .solvapay-mcp-history-table td[data-align='right']:last-child {
1693
+ font-family: var(--font-mono);
1694
+ font-weight: 400;
1695
+ font-variant-numeric: tabular-nums;
1696
+ }
1697
+
1698
+ .solvapay-mcp-history-title,
1699
+ .solvapay-mcp-history-subtitle {
1700
+ display: block;
1701
+ }
1702
+
1703
+ .solvapay-mcp-history-title {
1704
+ font: 500 15px/1.4 var(--font-sans);
1705
+ color: var(--color-text-primary);
1706
+ }
1707
+
1708
+ .solvapay-mcp-history-subtitle {
1709
+ margin-top: 2px;
1710
+ font: 400 13px/1.5 var(--font-mono);
1711
+ color: var(--color-text-secondary);
1712
+ }
1713
+
1714
+ .solvapay-mcp-account-footer {
1715
+ display: flex;
1716
+ align-items: flex-start;
1717
+ justify-content: space-between;
1718
+ gap: 32px;
1719
+ padding-top: 24px;
1720
+ border-top: 1px solid var(--color-border-secondary);
1721
+ }
1722
+
1723
+ .solvapay-mcp-account-footer-merchant,
1724
+ .solvapay-mcp-account-footer-buyer {
1725
+ display: flex;
1726
+ flex-direction: column;
1727
+ gap: 4px;
1728
+ }
1729
+
1730
+ .solvapay-mcp-account-footer-buyer {
1731
+ text-align: right;
1732
+ align-items: flex-end;
1733
+ }
1734
+
1735
+ .solvapay-mcp-attribution {
1736
+ display: flex;
1737
+ align-items: center;
1738
+ gap: 14px;
1739
+ font: 400 12px/1.5 var(--font-sans);
1740
+ color: var(--color-text-secondary);
1741
+ }
1742
+
1743
+ .solvapay-mcp-credit-plan-header {
1744
+ display: flex;
1745
+ align-items: flex-start;
1746
+ justify-content: space-between;
1747
+ gap: 20px;
1748
+ }
1749
+
1750
+ .solvapay-mcp-credit-plan-identity {
1751
+ display: flex;
1752
+ flex-direction: column;
1753
+ gap: 3px;
1754
+ min-width: 0;
1755
+ }
1756
+
1757
+ .solvapay-mcp-auto-recharge-copy {
1758
+ display: flex;
1759
+ flex-direction: column;
1760
+ gap: 2px;
1761
+ min-width: 0;
1762
+ }
1763
+
1764
+ .solvapay-mcp-auto-recharge-copy p {
1765
+ margin: 0;
1766
+ }
1767
+
1768
+ .solvapay-mcp-balance-strip {
1769
+ display: flex;
1770
+ flex-direction: column;
1771
+ gap: 4px;
1772
+ }
1773
+
1774
+ .solvapay-mcp-balance-hero {
1775
+ margin: 0;
1776
+ font: var(--solvapay-type-balance);
1777
+ letter-spacing: -1.2px;
1778
+ color: var(--color-text-primary);
1779
+ }
1780
+
1781
+ .solvapay-mcp-product-row {
1782
+ display: flex;
1783
+ align-items: center;
1784
+ justify-content: space-between;
1785
+ gap: 24px;
1786
+ padding: 12px 0;
1787
+ border-top: 1px solid var(--color-border-secondary);
1788
+ }
1789
+
1790
+ .solvapay-mcp-product-row:first-of-type {
1791
+ border-top: none;
1792
+ padding-top: 0;
1793
+ }
1794
+
1795
+ .solvapay-mcp-product-row-body {
1796
+ display: flex;
1797
+ flex-direction: column;
1798
+ gap: 3px;
1799
+ min-width: 0;
1800
+ }
1801
+
1802
+ .solvapay-mcp-split-row {
1803
+ display: flex;
1804
+ flex-direction: column;
1805
+ gap: 12px;
1806
+ }
1807
+
1808
+ @container mcp (min-width: 760px) {
1809
+ .solvapay-mcp-card,
1810
+ .solvapay-mcp-hosted {
1811
+ --solvapay-type-balance: 500 36px/1 var(--font-sans);
1812
+ --solvapay-type-title: 600 20px/1.3 var(--font-sans);
1813
+ --solvapay-type-plan-row: 600 17px/1.3 var(--font-sans);
1814
+ --solvapay-card-padding: 24px;
1815
+ --solvapay-section-gap: 20px;
1816
+ }
1817
+
1818
+ .solvapay-mcp-split-row {
1819
+ flex-direction: row;
1820
+ align-items: center;
1821
+ justify-content: space-between;
1822
+ gap: 32px;
1823
+ }
1824
+
1825
+ .solvapay-mcp-allowance-body {
1826
+ padding-top: 0;
1827
+ border-top: none;
1828
+ gap: 20px;
1829
+ }
1830
+
1831
+ .solvapay-mcp-fact-band {
1832
+ display: grid;
1833
+ grid-template-columns: repeat(auto-fit, 196px);
1834
+ gap: 18px;
1835
+ padding: 20px 0;
1836
+ border-top: 1px solid var(--color-border-secondary);
1837
+ border-bottom: 1px solid var(--color-border-secondary);
1838
+ }
1839
+
1840
+ .solvapay-mcp-fact-band-item {
1841
+ flex-direction: column;
1842
+ justify-content: flex-start;
1843
+ align-items: stretch;
1844
+ gap: 4px;
1845
+ padding-right: 18px;
1846
+ border-right: 1px solid var(--color-border-secondary);
1847
+ }
1848
+
1849
+ .solvapay-mcp-fact-band-item:last-child {
1850
+ padding-right: 0;
1851
+ border-right: none;
1852
+ }
1853
+
1854
+ .solvapay-mcp-fact-band-label {
1855
+ font: var(--solvapay-type-eyebrow-rail);
1856
+ letter-spacing: 1px;
1857
+ text-transform: uppercase;
1858
+ }
1859
+
1860
+ .solvapay-mcp-fact-band-body {
1861
+ align-items: flex-start;
1862
+ gap: 4px;
1863
+ font: 500 20px/1.3 var(--font-sans);
1864
+ letter-spacing: -0.4px;
1865
+ text-align: left;
1866
+ }
1867
+
1868
+ .solvapay-mcp-fact-band-compact {
1869
+ display: none;
1870
+ }
1871
+
1872
+ .solvapay-mcp-fact-band-item:has(.solvapay-mcp-fact-band-compact) .solvapay-mcp-fact-band-value {
1873
+ display: inline;
1874
+ }
1875
+
1876
+ .solvapay-mcp-fact-band-caption {
1877
+ display: block;
1878
+ font: var(--solvapay-type-caption);
1879
+ letter-spacing: 0;
1880
+ color: var(--color-text-secondary);
1881
+ }
1882
+
1883
+ .solvapay-mcp-plan-row {
1884
+ padding: 16px 20px;
1885
+ }
1886
+
1887
+ .solvapay-mcp-hosted-layout[data-rail='inline']:has(> .solvapay-mcp-summary-rail) {
1888
+ display: grid;
1889
+ grid-template-columns: 260px minmax(0, 1fr);
1890
+ gap: 32px;
1891
+ align-items: stretch;
1892
+ }
1893
+
1894
+ .solvapay-mcp-hosted-layout[data-rail='inline'] > .solvapay-mcp-summary-rail {
1895
+ border-bottom: none;
1896
+ border-right: 1px solid var(--color-border-secondary);
1897
+ padding-bottom: 0;
1898
+ padding-right: 32px;
1899
+ }
1900
+ }
1901
+
1902
+ .solvapay-mcp-skeleton {
1903
+ display: flex;
1904
+ flex-direction: column;
1905
+ gap: 16px;
1906
+ }
1907
+
1908
+ .solvapay-mcp-skeleton-identity {
1909
+ display: flex;
1910
+ flex-direction: column;
1911
+ gap: 8px;
1912
+ }
1913
+
1914
+ .solvapay-mcp-skeleton-row {
1915
+ display: flex;
1916
+ align-items: center;
1917
+ justify-content: space-between;
1918
+ gap: 12px;
1919
+ }
1920
+
1921
+ .solvapay-mcp-skeleton-line {
1922
+ display: block;
1923
+ border-radius: 4px;
1924
+ background: var(--color-background-secondary);
1925
+ }
1926
+
1927
+ .solvapay-mcp-skeleton-name {
1928
+ width: 120px;
1929
+ height: 18px;
1930
+ }
1931
+
1932
+ .solvapay-mcp-skeleton-status {
1933
+ width: 64px;
1934
+ height: 14px;
1935
+ }
1936
+
1937
+ .solvapay-mcp-skeleton-desc {
1938
+ width: 100%;
1939
+ height: 13px;
1940
+ }
1941
+
1942
+ .solvapay-mcp-skeleton-desc-short {
1943
+ width: 60%;
1944
+ height: 13px;
1945
+ }
1946
+
1947
+ .solvapay-mcp-skeleton-facts {
1948
+ display: flex;
1949
+ flex-direction: column;
1950
+ gap: 10px;
1951
+ padding-top: 14px;
1952
+ border-top: 1px solid var(--color-border-secondary);
1953
+ }
1954
+
1955
+ .solvapay-mcp-skeleton-label {
1956
+ width: 80px;
1957
+ height: 14px;
1958
+ }
1959
+
1960
+ .solvapay-mcp-skeleton-value {
1961
+ width: 110px;
1962
+ height: 14px;
1963
+ }
1964
+
1965
+ .solvapay-mcp-skeleton-label-sm {
1966
+ width: 64px;
1967
+ height: 14px;
1968
+ }
1969
+
1970
+ .solvapay-mcp-skeleton-value-sm {
1971
+ width: 96px;
1972
+ height: 14px;
1973
+ }
1974
+
1975
+ .solvapay-mcp-skeleton-meter {
1976
+ width: 100%;
1977
+ height: 6px;
1978
+ }
1979
+
1980
+ .solvapay-mcp-skeleton-cta {
1981
+ width: 100%;
1982
+ height: 44px;
1983
+ }
1984
+
1985
+ .solvapay-mcp-button[data-variant='secondary'] {
1986
+ background: transparent;
1987
+ color: var(--color-text-primary);
1988
+ border: 1px solid var(--color-border-primary);
1989
+ }
1990
+
1991
+ .solvapay-mcp-button[data-variant='secondary']:hover:not(:disabled) {
1992
+ background: var(--color-background-secondary);
1993
+ opacity: 1;
1994
+ }
1995
+
1996
+ .solvapay-mcp-claim-body,
1997
+ .solvapay-mcp-cancelled-body {
1998
+ display: flex;
1999
+ flex-direction: column;
2000
+ gap: 5px;
2001
+ padding-top: 14px;
2002
+ border-top: 1px solid var(--color-border-secondary);
2003
+ }
2004
+
2005
+ .solvapay-mcp-claim-title,
2006
+ .solvapay-mcp-cancelled-title {
2007
+ margin: 0;
2008
+ font: 500 16px/1.4 var(--font-sans);
2009
+ color: var(--color-text-primary);
2010
+ }
2011
+
2012
+ .solvapay-mcp-overage-meter {
2013
+ display: flex;
2014
+ flex-direction: column;
2015
+ gap: 10px;
2016
+ padding-top: 14px;
2017
+ border-top: 1px solid var(--color-border-secondary);
2018
+ }
2019
+
2020
+ .solvapay-mcp-overage-copy {
2021
+ margin: 0;
2022
+ font: 400 13px/1.5 var(--font-sans);
2023
+ color: var(--color-text-primary);
2024
+ }
2025
+
2026
+ .solvapay-mcp-auto-recharge-fields {
2027
+ display: flex;
2028
+ flex-direction: column;
2029
+ gap: 12px;
2030
+ }
2031
+
2032
+ .solvapay-mcp-auto-recharge-fields-explainer,
2033
+ .solvapay-mcp-auto-recharge-fields-error {
2034
+ margin: 0;
2035
+ font: var(--solvapay-type-caption);
2036
+ color: var(--color-text-secondary);
2037
+ }
2038
+
2039
+ .solvapay-mcp-auto-recharge-fields-error {
2040
+ color: var(--color-text-danger);
2041
+ }
2042
+
2043
+ .solvapay-mcp-auto-recharge-inline {
2044
+ display: flex;
2045
+ flex-direction: column;
2046
+ gap: 14px;
2047
+ padding-top: 16px;
2048
+ border-top: 1px solid var(--color-border-secondary);
2049
+ }
2050
+
2051
+ .solvapay-mcp-auto-recharge-inline p {
2052
+ margin: 0;
2053
+ }
2054
+
2055
+ .solvapay-mcp-auto-recharge-view {
2056
+ display: flex;
2057
+ flex-direction: column;
2058
+ gap: var(--solvapay-section-gap);
2059
+ }
2060
+
2061
+ .solvapay-mcp-auto-recharge-heading {
2062
+ display: flex;
2063
+ align-items: center;
2064
+ gap: 8px;
2065
+ }
2066
+
2067
+ .solvapay-mcp-auto-recharge-summary {
2068
+ margin: 0;
2069
+ font: var(--solvapay-type-body);
2070
+ color: var(--color-text-primary);
2071
+ }
2072
+
2073
+ .solvapay-mcp-auto-recharge-footer {
2074
+ display: flex;
2075
+ flex-direction: column;
2076
+ gap: 16px;
2077
+ padding-top: 16px;
2078
+ border-top: 1px solid var(--color-border-secondary);
2079
+ }
2080
+
2081
+ .solvapay-mcp-auto-recharge-actions {
2082
+ display: flex;
2083
+ align-items: center;
2084
+ gap: 10px;
2085
+ flex: none;
2086
+ }
2087
+
2088
+ .solvapay-mcp-auto-recharge-actions .solvapay-mcp-button {
2089
+ width: auto;
2090
+ min-height: var(--solvapay-control-height);
2091
+ padding-inline: 18px;
2092
+ }
2093
+
2094
+ .solvapay-mcp-auto-recharge-actions-stack {
2095
+ display: flex;
2096
+ flex-direction: column;
2097
+ gap: 8px;
2098
+ }
2099
+
2100
+ .solvapay-mcp-auto-recharge-turn-off {
2101
+ align-self: center;
2102
+ padding-top: 6px;
2103
+ }
2104
+
2105
+ @container mcp (min-width: 760px) {
2106
+ .solvapay-mcp-auto-recharge-fields {
2107
+ display: grid;
2108
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2109
+ gap: 12px;
2110
+ }
2111
+
2112
+ .solvapay-mcp-auto-recharge-fields-explainer,
2113
+ .solvapay-mcp-auto-recharge-fields-error {
2114
+ grid-column: 1 / -1;
2115
+ }
2116
+
2117
+ .solvapay-mcp-auto-recharge-footer {
2118
+ flex-direction: row;
2119
+ align-items: center;
2120
+ justify-content: space-between;
2121
+ gap: 16px;
2122
+ }
1201
2123
  }