@soba-so/react 0.0.17 → 0.0.19

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.
package/dist/styles.css CHANGED
@@ -197,6 +197,10 @@ a.sc-btn {
197
197
  color: var(--sc-muted, #6b6b73);
198
198
  }
199
199
 
200
+ .sc-tone-absent {
201
+ color: var(--sc-faint, #a1a1aa);
202
+ }
203
+
200
204
  .sc-error {
201
205
  color: var(--sc-warn, #b06f14);
202
206
  font-size: var(--sc-fs-body);
@@ -263,6 +267,13 @@ a.sc-btn {
263
267
  padding: 0 2px 3px 12px;
264
268
  }
265
269
 
270
+ .sc-cap-acts {
271
+ flex: none;
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 4px;
275
+ }
276
+
266
277
  .sc-group-title {
267
278
  flex: 1;
268
279
  min-width: 0;
@@ -402,6 +413,77 @@ a.sc-btn {
402
413
  color: var(--sc-line-2, #dcdce0);
403
414
  }
404
415
 
416
+ .sc-mrow-btn {
417
+ width: calc(100% + 4px);
418
+ margin-left: -4px;
419
+ padding-left: 4px;
420
+ border: 0;
421
+ border-radius: 10px;
422
+ background: transparent;
423
+ color: inherit;
424
+ font: inherit;
425
+ text-align: left;
426
+ cursor: pointer;
427
+ transition: background-color 120ms ease;
428
+ }
429
+
430
+ .sc-mrow-btn:hover {
431
+ background: var(--sc-tray-sunk, #f6f6f7);
432
+ }
433
+
434
+ .sc-mrow-btn:hover .sc-mbadge {
435
+ box-shadow: 0 0 0 2.5px var(--sc-tray-sunk, #f6f6f7);
436
+ }
437
+
438
+ .sc-chev {
439
+ flex: none;
440
+ width: 14px;
441
+ height: 14px;
442
+ color: var(--sc-muted, #6b6b73);
443
+ transition: transform 120ms ease;
444
+ }
445
+
446
+ .sc-chev-open {
447
+ transform: rotate(90deg);
448
+ }
449
+
450
+ .sc-rrow {
451
+ display: flex;
452
+ align-items: flex-start;
453
+ gap: 10px;
454
+ padding: 6px 12px 6px 0;
455
+ }
456
+
457
+ .sc-rrow .sc-runtime-tile {
458
+ margin-top: 1px;
459
+ }
460
+
461
+ .sc-rtop {
462
+ display: flex;
463
+ align-items: baseline;
464
+ gap: 8px;
465
+ }
466
+
467
+ .sc-rtop .sc-averdict {
468
+ font-variant-numeric: tabular-nums;
469
+ }
470
+
471
+ .sc-rstop {
472
+ align-self: center;
473
+ width: 24px;
474
+ height: 24px;
475
+ }
476
+
477
+ .sc-rstep {
478
+ display: -webkit-box;
479
+ overflow: hidden;
480
+ -webkit-box-orient: vertical;
481
+ -webkit-line-clamp: 2;
482
+ font-size: var(--sc-fs-label);
483
+ line-height: 1.4;
484
+ color: var(--sc-muted, #6b6b73);
485
+ }
486
+
405
487
  .sc-arow {
406
488
  display: flex;
407
489
  align-items: center;
@@ -436,6 +518,10 @@ a.sc-btn {
436
518
  font-size: var(--sc-fs-small);
437
519
  }
438
520
 
521
+ .sc-aname-absent {
522
+ color: var(--sc-muted, #6b6b73);
523
+ }
524
+
439
525
  .sc-aversion {
440
526
  color: var(--sc-muted, #6b6b73);
441
527
  }
@@ -449,6 +535,18 @@ a.sc-btn {
449
535
  color: var(--sc-muted, #6b6b73);
450
536
  }
451
537
 
538
+ .sc-sglyph {
539
+ flex: none;
540
+ width: 11px;
541
+ height: 11px;
542
+ color: var(--sc-ok, #22a06b);
543
+ }
544
+
545
+ .sc-aserving {
546
+ margin-left: 5px;
547
+ font-variant-numeric: tabular-nums;
548
+ }
549
+
452
550
  .sc-orow {
453
551
  display: flex;
454
552
  align-items: center;
@@ -517,6 +615,11 @@ a.sc-btn {
517
615
  background: var(--sc-tray-sunk, #f6f6f7);
518
616
  }
519
617
 
618
+ .sc-open-app {
619
+ color: inherit;
620
+ text-decoration: none;
621
+ }
622
+
520
623
  .sc-hrow {
521
624
  padding-bottom: 2px;
522
625
  }
@@ -529,6 +632,246 @@ a.sc-btn {
529
632
  color: var(--sc-muted, #6b6b73);
530
633
  }
531
634
 
635
+ .sc-runs-to {
636
+ display: inline-flex;
637
+ flex: none;
638
+ align-items: center;
639
+ gap: 2px;
640
+ min-width: 0;
641
+ max-width: 62%;
642
+ font-size: var(--sc-fs-label);
643
+ color: var(--sc-muted, #6b6b73);
644
+ }
645
+
646
+ .sc-runs-cap {
647
+ flex: none;
648
+ white-space: nowrap;
649
+ }
650
+
651
+ .sc-runs-fixed,
652
+ .sc-runs-btn {
653
+ display: inline-flex;
654
+ align-items: center;
655
+ gap: 5px;
656
+ min-width: 0;
657
+ height: 24px;
658
+ padding: 0 6px;
659
+ font-size: var(--sc-fs-label);
660
+ font-weight: 500;
661
+ color: var(--sc-text-2, #3f3f46);
662
+ }
663
+
664
+ .sc-runs-btn {
665
+ padding-right: 4px;
666
+ border: 0;
667
+ border-radius: var(--sc-r-pill, 999px);
668
+ background: transparent;
669
+ font-family: inherit;
670
+ cursor: pointer;
671
+ transition: background-color 120ms ease, color 120ms ease;
672
+ }
673
+
674
+ .sc-runs-btn:hover:not(:disabled),
675
+ .sc-runs-btn[aria-expanded="true"] {
676
+ background: var(--sc-tray-card, #ffffff);
677
+ color: var(--sc-text, #1a1a1c);
678
+ }
679
+
680
+ .sc-runs-btn:disabled {
681
+ opacity: 0.5;
682
+ cursor: default;
683
+ }
684
+
685
+ .sc-runs-glyph {
686
+ flex: none;
687
+ width: 12px;
688
+ height: 12px;
689
+ }
690
+
691
+ .sc-runs-mark {
692
+ display: inline-grid;
693
+ flex: none;
694
+ place-items: center;
695
+ width: 14px;
696
+ height: 14px;
697
+ }
698
+
699
+ .sc-runs-mark > * {
700
+ max-width: 14px;
701
+ max-height: 14px;
702
+ }
703
+
704
+ .sc-runs-label {
705
+ min-width: 0;
706
+ overflow: hidden;
707
+ text-overflow: ellipsis;
708
+ white-space: nowrap;
709
+ }
710
+
711
+ .sc-runs-btn .sc-chev {
712
+ width: 11px;
713
+ height: 11px;
714
+ color: var(--sc-faint, #a1a1aa);
715
+ }
716
+
717
+ .sc-menu {
718
+ position: fixed;
719
+ inset: auto;
720
+ z-index: 2147483647;
721
+ width: 248px;
722
+ margin: 0;
723
+ padding: 4px;
724
+ border: 1px solid var(--sc-line, #e9e9eb);
725
+ border-radius: 12px;
726
+ background: var(--sc-tray-card, #ffffff);
727
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12), 0 2px 6px rgba(0, 0, 0, 0.06);
728
+ color: var(--sc-text, #1a1a1c);
729
+
730
+ max-height: 60vh;
731
+ overflow-y: auto;
732
+ overscroll-behavior: contain;
733
+ }
734
+
735
+ .sc-menu-item {
736
+ display: flex;
737
+ align-items: center;
738
+ gap: 10px;
739
+ width: 100%;
740
+ min-height: 34px;
741
+ padding: 5px 8px;
742
+ border: 0;
743
+ border-radius: 8px;
744
+ background: transparent;
745
+ font: inherit;
746
+ font-size: var(--sc-fs-small);
747
+ color: inherit;
748
+ text-align: left;
749
+ cursor: pointer;
750
+ }
751
+
752
+ .sc-menu-item:hover,
753
+ .sc-menu-item:focus-visible {
754
+ background: var(--sc-tray-sunk, #f6f6f7);
755
+ outline: none;
756
+ }
757
+
758
+ .sc-menu-text {
759
+ display: flex;
760
+ flex: 1;
761
+ min-width: 0;
762
+ flex-direction: column;
763
+ }
764
+
765
+ .sc-menu-label {
766
+ overflow: hidden;
767
+ text-overflow: ellipsis;
768
+ white-space: nowrap;
769
+ }
770
+
771
+ .sc-menu-note {
772
+ font-size: var(--sc-fs-label);
773
+ line-height: 1.4;
774
+ color: var(--sc-muted, #6b6b73);
775
+ }
776
+
777
+ .sc-menu-check {
778
+ flex: none;
779
+ width: 15px;
780
+ height: 15px;
781
+ color: var(--sc-text-2, #3f3f46);
782
+ }
783
+
784
+ .sc-menu-sep {
785
+ height: 1px;
786
+ margin: 4px 6px;
787
+ background: var(--sc-line, #e9e9eb);
788
+ }
789
+
790
+ .sc-menu-head {
791
+ margin: 6px 6px 2px;
792
+ padding-top: 7px;
793
+ border-top: 1px solid var(--sc-line, #e9e9eb);
794
+ font-size: var(--sc-fs-label);
795
+ font-weight: 500;
796
+ color: var(--sc-muted, #6b6b73);
797
+ }
798
+
799
+ .sc-menu > .sc-menu-head:first-child {
800
+ margin-top: 2px;
801
+ padding-top: 0;
802
+ border-top: 0;
803
+ }
804
+
805
+ .sc-mp {
806
+ display: inline-flex;
807
+ align-items: center;
808
+ gap: 2px;
809
+ max-width: 100%;
810
+ min-width: 0;
811
+ font-size: var(--sc-fs-label);
812
+ color: var(--sc-muted, #6b6b73);
813
+ }
814
+
815
+ .sc-mp-cap {
816
+ flex: none;
817
+ white-space: nowrap;
818
+ }
819
+
820
+ .sc-mp-btn {
821
+ display: inline-flex;
822
+ align-items: center;
823
+ gap: 5px;
824
+ min-width: 0;
825
+ height: 26px;
826
+ padding: 0 5px 0 7px;
827
+ border: 0;
828
+ border-radius: var(--sc-r-pill, 999px);
829
+ background: transparent;
830
+ font: inherit;
831
+ font-size: var(--sc-fs-label);
832
+ font-weight: 500;
833
+ color: var(--sc-text-2, #3f3f46);
834
+ cursor: pointer;
835
+ transition: background-color 120ms ease, color 120ms ease;
836
+ }
837
+
838
+ .sc-mp-btn:hover:not(:disabled),
839
+ .sc-mp-btn[aria-expanded="true"] {
840
+ background: var(--sc-raised, #f6f6f7);
841
+ color: var(--sc-text, #1a1a1c);
842
+ }
843
+
844
+ .sc-mp-btn:disabled {
845
+ opacity: 0.5;
846
+ cursor: default;
847
+ }
848
+
849
+ .sc-mp-mark {
850
+ display: inline-grid;
851
+ flex: none;
852
+ place-items: center;
853
+ width: 13px;
854
+ height: 13px;
855
+ }
856
+
857
+ .sc-mp-glyph {
858
+ max-width: 13px;
859
+ max-height: 13px;
860
+ }
861
+
862
+ .sc-mp-label {
863
+ min-width: 0;
864
+ overflow: hidden;
865
+ text-overflow: ellipsis;
866
+ white-space: nowrap;
867
+ }
868
+
869
+ .sc-mp-btn .sc-chev {
870
+ width: 11px;
871
+ height: 11px;
872
+ color: var(--sc-faint, #a1a1aa);
873
+ }
874
+
532
875
  .sc-row-act {
533
876
  flex: none;
534
877
  padding: 3px 9px;
@@ -605,7 +948,9 @@ a.sc-btn {
605
948
  .sc-spin {
606
949
  animation: none;
607
950
  }
608
- .sc-pair {
951
+ .sc-pair,
952
+ .sc-mrow-btn,
953
+ .sc-chev {
609
954
  transition: none;
610
955
  }
611
956
  }
@@ -680,6 +1025,15 @@ a.sc-btn {
680
1025
  --sc-shadow-2: 0 1px 2px rgb(0 0 0 / 40%), 0 8px 24px -12px rgb(0 0 0 / 64%);
681
1026
  }
682
1027
 
1028
+ .soba-connect.sc-inline {
1029
+ display: inline-flex;
1030
+ width: auto;
1031
+ max-width: 100%;
1032
+ margin-inline: 0;
1033
+
1034
+ line-height: 1;
1035
+ }
1036
+
683
1037
  .soba-connect.sc-fill {
684
1038
  max-width: none;
685
1039
 
@@ -1520,9 +1874,12 @@ a.sc-btn {
1520
1874
  .sc-step-lead:focus-visible,
1521
1875
  .sc-step-links a:focus-visible,
1522
1876
  .sc-alt-link:focus-visible,
1877
+ .sc-runs-btn:focus-visible,
1878
+ .sc-mp-btn:focus-visible,
1523
1879
  .sc-row-act:focus-visible,
1524
1880
  .sc-disc:focus-visible,
1525
1881
  .sc-pair:focus-visible,
1882
+ .sc-mrow-btn:focus-visible,
1526
1883
  .sc-input:focus-visible,
1527
1884
  .sc-modal-close:focus-visible {
1528
1885
  outline: 2px solid var(--sc-accent, #18181b);
package/dist/tier.d.ts ADDED
@@ -0,0 +1,35 @@
1
+ import type { CostClass } from "./types.js";
2
+ /**
3
+ * WHERE THE ANSWER CAME FROM, IN WORDS — a pure function, because there is no
4
+ * state in it.
5
+ *
6
+ * `status` carries the cost class BEFORE any output, which is the whole reason
7
+ * an app renders it: a run that quietly fell back from somebody's laptop to a
8
+ * metered API says so on the screen rather than in a bill. So every surface
9
+ * that shows a run shows this, and every one of them wrote the map itself.
10
+ *
11
+ * THIS SHIPPED BECAUSE THE COPIES DISAGREED. Four of them, across our own
12
+ * examples and the `create-soba` template: `user-hardware` was "your own
13
+ * hardware", "your own computer" and "your own machine" depending on which page
14
+ * you were on. That is a glossary problem, not a styling one — the names of the
15
+ * five economics this product is about should not depend on the file.
16
+ *
17
+ * And three of the copies had the same bug, which is the part worth having a
18
+ * test for: they were written as an if-chain ending in `return "a frontier
19
+ * model we paid for"`, so `user-api-key` — somebody's OWN key, costing the app
20
+ * nothing — was reported to them as the app's most expensive supply.
21
+ *
22
+ * A BARE NOUN PHRASE, so the sentence stays the app's. "running on …" while it
23
+ * is, "ran on …" afterwards, or the words on their own beside an icon; a
24
+ * function that returned a whole sentence would have to pick a tense, and the
25
+ * one surface that shows this both during and after a run needs both.
26
+ *
27
+ * `null` for a run that has not said yet — the value every page holds before
28
+ * the first `status` — so `{tierLabel(tier)}` is a complete integration.
29
+ *
30
+ * Not the same words as a PLAN's compute line, deliberately: `usePlans()`
31
+ * describes supply a plan is allowed to reach ("your own AI subscription", a
32
+ * thing you might go and connect), and this describes where one run actually
33
+ * landed. Same five classes, two different claims.
34
+ */
35
+ export declare function tierLabel(tier: CostClass | string | null | undefined): string | null;
package/dist/types.d.ts CHANGED
@@ -35,6 +35,29 @@ export interface Runtime {
35
35
  quarantined?: boolean;
36
36
  first_seen_at?: string;
37
37
  }
38
+ /**
39
+ * ONE RUN ON ONE OF THIS PERSON'S MACHINES, for this app — a row of "Running
40
+ * now". `label` is the app's own name for it (`metadata.label`), `task` its
41
+ * category; `step` the last thing it said it was doing, `phase` what its latest
42
+ * frame was. `machine_id` is null while it waits for a free slot.
43
+ */
44
+ export interface MachineRun {
45
+ id: string;
46
+ machine_id: string | null;
47
+ status: "queued" | "running";
48
+ label: string | null;
49
+ task: string | null;
50
+ runtime_id: string | null;
51
+ model: string | null;
52
+ cost_class: string | null;
53
+ started_at: string;
54
+ first_output_at: string | null;
55
+ step: string | null;
56
+ phase: {
57
+ kind: "thinking" | "writing" | "tool" | "approval" | "starting";
58
+ tool?: string;
59
+ } | null;
60
+ }
38
61
  export interface Machine {
39
62
  id: string;
40
63
  label: string | null;
@@ -51,6 +74,85 @@ export interface Machine {
51
74
  always_on: boolean;
52
75
  last_seen_at: string | null;
53
76
  runtimes: Runtime[];
77
+ /**
78
+ * WHICH AGENT GETS THIS APP'S RUNS, and whose decision that is.
79
+ *
80
+ * `requested_runtime` is what the app named on its latest run here: set, the
81
+ * app has chosen and the person's pick does not apply. Null, the app does not
82
+ * mind, and `preferred_runtime` is the person's pick — or null for the
83
+ * machine's own first-found default. Both optional: a server older than the
84
+ * fields sends neither, which reads as "nothing picked".
85
+ *
86
+ * MISSING FROM THIS COPY UNTIL `useModel()` NEEDED THEM, and the parity guard
87
+ * could not catch it. `test/types-parity.ts` compares this interface against
88
+ * the panel's both ways, and an interface WITHOUT an optional property still
89
+ * extends one that has it — in both directions. So the two shapes drifted by
90
+ * exactly the amount the guard is blind to, and the fields arrived at the
91
+ * browser on every poll with nothing here to read them. The same note is on
92
+ * `Runtime.quarantined`, which drifted the same way first.
93
+ */
94
+ preferred_runtime?: string | null;
95
+ requested_runtime?: string | null;
96
+ }
97
+ /**
98
+ * WHAT PRESSING "OPEN SOBA" LOOKED LIKE — mirrored from the panel for the
99
+ * reason the shapes above it are, and it is the one that was caught by the
100
+ * published artefact rather than by a review: `useOpenSobaConnect.d.ts` shipped
101
+ * importing this type out of the private panel package, which no customer can
102
+ * install. The build has a check for exactly that, and the name in it was
103
+ * spelled `@soba` rather than `@soba-so`, so it had never once fired.
104
+ *
105
+ * (Written without the specifier spelled out, because the check greps the
106
+ * emitted declarations and prose in them is still text it has to read.)
107
+ *
108
+ * No browser will tell a page whether a scheme handler exists. The only
109
+ * observable consequence of one is that something else takes the foreground.
110
+ */
111
+ export type Launch =
112
+ /** Something took the foreground. Almost certainly the app. */
113
+ "opened"
114
+ /** Nothing did, within the window. Probably not installed. */
115
+ | "absent"
116
+ /** The tab was already in the background, so the signal means nothing. */
117
+ | "unknown";
118
+ /**
119
+ * A MODEL THIS PERSON COULD BE ANSWERED BY — mirrored from the panel, like
120
+ * `Machine` above it, so no published declaration names a private package.
121
+ *
122
+ * Derived from what they have connected rather than configured anywhere: see
123
+ * `useModel()`, and `models.ts` in the panel for the three facts it reconciles.
124
+ */
125
+ export type ModelOptionKind = "auto" | "size" | "named";
126
+ export interface ModelOption {
127
+ /** `auto`, `small`, `large`, or `<runtime>/<model>`. */
128
+ id: string;
129
+ kind: ModelOptionKind;
130
+ /** `Automatic`, `Fast`, `Opus`, `llama3.2:3b`. */
131
+ label: string;
132
+ note?: string;
133
+ /** What goes on the run as `model`. */
134
+ model: string;
135
+ /**
136
+ * What goes on the run as `runtime`, on a named model only.
137
+ *
138
+ * THE TWO TRAVEL TOGETHER OR NOT AT ALL. The broker applies the person's
139
+ * preferred agent only to a run whose model is blank or a size, so `opus`
140
+ * sent on its own is handed to whichever agent the broker finds first — and
141
+ * on somebody running Codex that is a run that dies on a model name Codex
142
+ * has never heard of. `ModelView.run` is the pair; spread it.
143
+ */
144
+ runtime?: string;
145
+ /** The agent's own name, which is the heading this model sits under. */
146
+ runtimeName?: string;
147
+ /** Who pays for a run served here. */
148
+ costClass?: string;
149
+ /** The machine advertising it, when exactly one of theirs does. */
150
+ machine?: string;
151
+ }
152
+ export interface ModelGroup {
153
+ /** Null for the first group — Automatic and the sizes head nothing. */
154
+ heading: string | null;
155
+ options: ModelOption[];
54
156
  }
55
157
  /** A device code someone is being asked to approve. */
56
158
  export interface PendingCode {
@@ -201,6 +303,33 @@ export interface AgentEvent {
201
303
  usage?: RunUsage;
202
304
  /** Which economics is serving this run, announced before any output. */
203
305
  tier?: CostClass;
306
+ /** On a `status` from a terminal run: what the agent said at the end of a turn. */
307
+ turn?: {
308
+ text: string;
309
+ };
310
+ /** On `done` / `error`: the runtime's conversation id, for a follow-up run. */
311
+ session?: string;
312
+ /** On a tool `status`: what the tool was pointed at — a path, a command. */
313
+ toolInput?: string;
314
+ /** On a `status` from a run in a git checkout: where its branch stands. */
315
+ git?: {
316
+ branch: string;
317
+ base: string;
318
+ head: string;
319
+ ahead: number;
320
+ behind: number;
321
+ files: {
322
+ path: string;
323
+ status: "A" | "M" | "D" | "R";
324
+ added: number;
325
+ removed: number;
326
+ }[];
327
+ commits: {
328
+ sha: string;
329
+ subject: string;
330
+ }[];
331
+ dirty: boolean;
332
+ };
204
333
  /** On an `error`: a stable code to branch on, e.g. `run_too_long`. */
205
334
  reason?: string;
206
335
  /** On an `error`: false when starting the same run again will end the same way. */
@@ -0,0 +1,41 @@
1
+ import type { Plan } from "./types.js";
2
+ /**
3
+ * THE BUY BUTTON'S BEHAVIOUR — the headless half of `<SobaCheckout />`.
4
+ *
5
+ * It creates a Checkout Session and navigates. It does not take a card number,
6
+ * it never sees one, and **it grants nothing**: the entitlement is written by
7
+ * Stripe's webhook when the money actually moves. That split is the whole
8
+ * security model, and it is the reason this is worth a hook rather than a
9
+ * snippet — an app that wrote its own and granted the plan on redirect would
10
+ * hand one to anybody who could reach the URL and close the tab.
11
+ *
12
+ * The payment lands on the APP's own Stripe account with Soba's fee taken off
13
+ * the top, so their user sees their name on the statement. Soba is the rail
14
+ * underneath.
15
+ */
16
+ export interface CheckoutView {
17
+ /** "Subscribe for $20/month", or "Opening…" while it is. The default label,
18
+ * because a button that says "Subscribe" makes the reader look back up. */
19
+ label: string;
20
+ /** A session is being created, or the navigation is already under way. */
21
+ busy: boolean;
22
+ /** Why it did not open, or null. Cleared on the next attempt. */
23
+ error: string | null;
24
+ /** Create the session and go. Resolves only when it did NOT navigate. */
25
+ buy: () => Promise<void>;
26
+ /** The URL, for an app that would rather navigate itself — a native wrapper,
27
+ * or a flow that wants to open it in a new tab. `buy()` is the usual one. */
28
+ session: () => Promise<string>;
29
+ }
30
+ export interface UseCheckoutOptions {
31
+ /** The plan to buy. A free one is refused by the endpoint — `usePlans()`
32
+ * routes free and priced plans to the right place on its own. */
33
+ plan: Plan;
34
+ /** Where Stripe returns on success. Defaults to the page they are on, which
35
+ * is right for a settings page and wrong for a landing page. */
36
+ successUrl?: string;
37
+ cancelUrl?: string;
38
+ /** Override the words. */
39
+ label?: string;
40
+ }
41
+ export declare function useCheckout({ plan, successUrl, cancelUrl, label, }: UseCheckoutOptions): CheckoutView;