@trade-it/react 0.2.0 → 1.0.0

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/index.cjs CHANGED
@@ -26,54 +26,1267 @@ const react = __toESM(require("react"));
26
26
  const react_dom = __toESM(require("react-dom"));
27
27
  const react_jsx_runtime = __toESM(require("react/jsx-runtime"));
28
28
 
29
- //#region src/LoaderCircleSpinner.tsx
30
- const SPINNER_WRAPPER_SIZE = 44;
31
- const SPINNER_ICON_SIZE = 32;
32
- const SPINNER_WRAPPER_STYLE = {
33
- width: SPINNER_WRAPPER_SIZE,
34
- height: SPINNER_WRAPPER_SIZE,
35
- display: "flex",
36
- alignItems: "center",
37
- justifyContent: "center",
38
- animation: "tradeItSdkSpin 0.9s linear infinite",
39
- transformOrigin: "50% 50%"
29
+ //#region src/TradeItLogoLoader.tsx
30
+ function fibDir(i, n) {
31
+ const golden = Math.PI * (3 - Math.sqrt(5));
32
+ const y = 1 - 2 * (i + .5) / n;
33
+ const rad = Math.sqrt(1 - y * y);
34
+ const a = i * golden;
35
+ return [
36
+ rad * Math.cos(a),
37
+ y,
38
+ rad * Math.sin(a)
39
+ ];
40
+ }
41
+ function makeProj(yaw, tilt, cx, cy, scale) {
42
+ const st = Math.sin(tilt);
43
+ const ct = Math.cos(tilt);
44
+ const sy = Math.sin(yaw);
45
+ const cyw = Math.cos(yaw);
46
+ return (x, y, z) => {
47
+ const x1 = x * cyw + z * sy;
48
+ const z1 = -x * sy + z * cyw;
49
+ const y1 = y * ct - z1 * st;
50
+ const z2 = y * st + z1 * ct;
51
+ return [
52
+ cx + x1 * scale,
53
+ cy - y1 * scale,
54
+ z2
55
+ ];
56
+ };
57
+ }
58
+ function paint(ctx, dots) {
59
+ for (const dot of dots) {
60
+ const alpha = dot.a ?? 1;
61
+ ctx.fillStyle = `rgba(240,240,242,${alpha})`;
62
+ ctx.beginPath();
63
+ ctx.arc(dot.x, dot.y, dot.r, 0, Math.PI * 2);
64
+ ctx.fill();
65
+ }
66
+ }
67
+ function paintLines(ctx, lines) {
68
+ for (const line of lines) {
69
+ const alpha = line.a ?? 1;
70
+ ctx.strokeStyle = `rgba(240,240,242,${alpha})`;
71
+ ctx.lineWidth = line.w;
72
+ ctx.beginPath();
73
+ ctx.moveTo(line.x1, line.y1);
74
+ ctx.lineTo(line.x2, line.y2);
75
+ ctx.stroke();
76
+ }
77
+ }
78
+ function finalizeFrame(dots, lines, rMin = .3) {
79
+ const visible = [];
80
+ for (const d of dots) {
81
+ if ((d.a ?? 1) < .02) continue;
82
+ d.r = Math.max(rMin, d.r);
83
+ visible.push(d);
84
+ }
85
+ visible.sort((a, b) => a.z - b.z);
86
+ return {
87
+ dots: visible,
88
+ lines: lines.filter((l) => (l.a ?? 1) >= .02)
89
+ };
90
+ }
91
+ function paintFrame(ctx, frame) {
92
+ if (frame.lines.length) paintLines(ctx, frame.lines);
93
+ paint(ctx, frame.dots);
94
+ }
95
+ function radiusScale(size, pow) {
96
+ return (size / 300) ** pow;
97
+ }
98
+ const TURN = Math.PI * 2;
99
+ function clamp01(x) {
100
+ return x < 0 ? 0 : x > 1 ? 1 : x;
101
+ }
102
+ function empty() {
103
+ return {
104
+ dots: [],
105
+ lines: []
106
+ };
107
+ }
108
+ function inkOf(o, zx, edge) {
109
+ const far = o.inkFar ?? .6;
110
+ const span = o.inkSpan ?? .5;
111
+ const rim = o.inkRim ?? .16;
112
+ return far - span * zx - rim * (1 - edge);
113
+ }
114
+ function expoInOut(x) {
115
+ if (x <= 0) return 0;
116
+ if (x >= 1) return 1;
117
+ return x < .5 ? 2 ** (20 * x - 10) / 2 : (2 - 2 ** (-20 * x + 10)) / 2;
118
+ }
119
+ function morphEase(x, expo) {
120
+ const smooth = x * x * x * (x * (x * 6 - 15) + 10);
121
+ return smooth + (expoInOut(x) - smooth) * expo;
122
+ }
123
+ function cruise(x, edge) {
124
+ const a = Math.min(.49, Math.max(.001, edge));
125
+ const v = 1 / (1 - a);
126
+ if (x <= 0) return 0;
127
+ if (x >= 1) return 1;
128
+ if (x < a) {
129
+ const u = x / a;
130
+ return v * a * (u * u * u - u * u * u * u / 2);
131
+ }
132
+ if (x > 1 - a) {
133
+ const u = (1 - x) / a;
134
+ return 1 - v * a * (u * u * u - u * u * u * u / 2);
135
+ }
136
+ return v * (a * .5 + (x - a));
137
+ }
138
+ function beatAt(t, dwell, morph, turns, settle, expo = .3) {
139
+ const cycle = dwell + morph * 2;
140
+ const local = t % cycle;
141
+ const spinSpan = dwell + morph * settle;
142
+ const spun = turns * cruise(Math.min(1, local / spinSpan), .22);
143
+ if (local < dwell) return {
144
+ m: 0,
145
+ turns: spun,
146
+ workT: local,
147
+ local,
148
+ cycle
149
+ };
150
+ const intoMorph = local - dwell;
151
+ if (intoMorph < morph) return {
152
+ m: morphEase(intoMorph / morph, expo),
153
+ turns: spun,
154
+ workT: -1,
155
+ local,
156
+ cycle
157
+ };
158
+ return {
159
+ m: morphEase(1 - (intoMorph - morph) / morph, expo),
160
+ turns: spun,
161
+ workT: -1,
162
+ local,
163
+ cycle
164
+ };
165
+ }
166
+ const frameLogoWait = (size, t, o, logo) => {
167
+ if (!logo) return empty();
168
+ const { p, e, n } = logo.points;
169
+ const seats = logo.seats;
170
+ const cx = size / 2;
171
+ const R = size / 2 * .82;
172
+ const rs = radiusScale(size, o.rsPow ?? .6);
173
+ const b = beatAt(t, o.dwell ?? 5.5, o.morph ?? 1.9, o.turns ?? 0, o.settle ?? .1, o.expo ?? .3);
174
+ const m = 1 - b.m;
175
+ const c = 1 - m;
176
+ const pt = makeProj((o.yawAmp ?? .22) * Math.sin(t * (o.yawRate ?? .3)) * c, (o.tilt ?? .42) * c, cx, cx, R);
177
+ const rings = Math.max(3, Math.round(o.rings ?? 9));
178
+ const perRing = Math.ceil(n / rings);
179
+ const breath = Math.sin(t * (o.breatheRate ?? .75));
180
+ const amp = o.breatheAmp ?? .2;
181
+ const height = (o.height ?? 1.5) * (1 + amp * breath);
182
+ const wide = (o.wide ?? .82) * (1 - amp * .72 * breath);
183
+ const spin = t * (o.spin ?? .16);
184
+ const dots = [];
185
+ for (let i = 0; i < n; i++) {
186
+ const seat = seats[i];
187
+ const ring = seat % rings;
188
+ const u = rings > 1 ? ring / (rings - 1) - .5 : 0;
189
+ const taper = Math.cos(u * Math.PI * (o.taper ?? .78));
190
+ const rad = wide * taper;
191
+ const ang = Math.floor(seat / rings) / perRing * Math.PI * 2 + spin;
192
+ const bx = Math.cos(ang) * rad;
193
+ const by = u * height;
194
+ const bz = Math.sin(ang) * rad;
195
+ const lx = p[i * 3];
196
+ const ly = p[i * 3 + 1];
197
+ const lz = p[i * 3 + 2];
198
+ const x = lx + (bx - lx) * c;
199
+ const y = ly + (by - ly) * c;
200
+ const z3 = lz + (bz - lz) * c;
201
+ const [px, py, z] = pt(x, y, z3);
202
+ const zx = clamp01((z + 1) / 2);
203
+ const loud = clamp01(taper);
204
+ dots.push({
205
+ x: px,
206
+ y: py,
207
+ z,
208
+ r: ((o.rBase ?? .55) + (o.rDepth ?? 1.4) * zx + (o.loudR ?? .25) * loud * c) * rs,
209
+ white: inkOf(o, zx, e[i] * m + (1 - m)) - (o.loudInk ?? .12) * loud * c
210
+ });
211
+ }
212
+ return finalizeFrame(dots, [], o.rMin);
40
213
  };
41
- const SPINNER_SVG_STYLE = {
42
- display: "block",
43
- width: SPINNER_ICON_SIZE,
44
- height: SPINNER_ICON_SIZE,
45
- color: "#111827"
214
+ const POINTS = {
215
+ n: 239,
216
+ p: Float32Array.from([
217
+ -.012,
218
+ .809,
219
+ .108,
220
+ -.03,
221
+ .718,
222
+ .23,
223
+ -.132,
224
+ .666,
225
+ .237,
226
+ -.095,
227
+ .713,
228
+ .199,
229
+ -.029,
230
+ .651,
231
+ .168,
232
+ -.11,
233
+ .61,
234
+ .163,
235
+ -.147,
236
+ .748,
237
+ .07,
238
+ -.171,
239
+ .567,
240
+ .152,
241
+ .082,
242
+ .724,
243
+ .177,
244
+ -.243,
245
+ .587,
246
+ .226,
247
+ .041,
248
+ .622,
249
+ .135,
250
+ -.307,
251
+ .658,
252
+ .1,
253
+ -.231,
254
+ .689,
255
+ .115,
256
+ .107,
257
+ .6,
258
+ .157,
259
+ -.281,
260
+ .514,
261
+ .152,
262
+ .217,
263
+ .591,
264
+ .226,
265
+ -.349,
266
+ .618,
267
+ .141,
268
+ -.095,
269
+ .778,
270
+ 0,
271
+ .037,
272
+ .77,
273
+ .135,
274
+ .179,
275
+ .673,
276
+ .191,
277
+ -.344,
278
+ .561,
279
+ .226,
280
+ .119,
281
+ .667,
282
+ .237,
283
+ .242,
284
+ .648,
285
+ .172,
286
+ .267,
287
+ .536,
288
+ .182,
289
+ -.186,
290
+ .638,
291
+ .23,
292
+ .174,
293
+ .733,
294
+ 0,
295
+ -.204,
296
+ .519,
297
+ 0,
298
+ -.417,
299
+ .603,
300
+ .1,
301
+ .294,
302
+ .589,
303
+ .223,
304
+ -.407,
305
+ .543,
306
+ .207,
307
+ .154,
308
+ .55,
309
+ .081,
310
+ .343,
311
+ .633,
312
+ .1,
313
+ .347,
314
+ .528,
315
+ .226,
316
+ .379,
317
+ .581,
318
+ .177,
319
+ .447,
320
+ .595,
321
+ .07,
322
+ .315,
323
+ .471,
324
+ .081,
325
+ .452,
326
+ .498,
327
+ .23,
328
+ -.435,
329
+ .456,
330
+ .177,
331
+ -.337,
332
+ .488,
333
+ .141,
334
+ .397,
335
+ .447,
336
+ .135,
337
+ -.519,
338
+ .556,
339
+ .081,
340
+ -.529,
341
+ .414,
342
+ .233,
343
+ .462,
344
+ .399,
345
+ .199,
346
+ -.481,
347
+ .498,
348
+ .215,
349
+ -.569,
350
+ .462,
351
+ .172,
352
+ -.482,
353
+ .377,
354
+ .223,
355
+ -.568,
356
+ .523,
357
+ .1,
358
+ -.57,
359
+ .365,
360
+ .172,
361
+ .565,
362
+ .501,
363
+ .152,
364
+ .559,
365
+ .424,
366
+ .172,
367
+ .494,
368
+ .451,
369
+ .26,
370
+ .559,
371
+ .357,
372
+ .177,
373
+ .443,
374
+ .34,
375
+ .172,
376
+ -.529,
377
+ .303,
378
+ .233,
379
+ .489,
380
+ .299,
381
+ .07,
382
+ .409,
383
+ .293,
384
+ .07,
385
+ .502,
386
+ .542,
387
+ .135,
388
+ -.58,
389
+ .26,
390
+ .157,
391
+ -.461,
392
+ .239,
393
+ .07,
394
+ .404,
395
+ .388,
396
+ .07,
397
+ -.431,
398
+ .305,
399
+ .122,
400
+ -.593,
401
+ .203,
402
+ .122,
403
+ -.612,
404
+ .308,
405
+ .07,
406
+ -.534,
407
+ .204,
408
+ .07,
409
+ -.035,
410
+ .316,
411
+ .108,
412
+ -.02,
413
+ .251,
414
+ .195,
415
+ .023,
416
+ .163,
417
+ .195,
418
+ -.104,
419
+ .232,
420
+ .191,
421
+ -.054,
422
+ .149,
423
+ .29,
424
+ -.133,
425
+ .131,
426
+ .287,
427
+ -.098,
428
+ .289,
429
+ .07,
430
+ -.16,
431
+ .219,
432
+ .163,
433
+ .054,
434
+ .219,
435
+ .07,
436
+ .025,
437
+ .077,
438
+ .244,
439
+ -.001,
440
+ 0,
441
+ .312,
442
+ -.046,
443
+ .089,
444
+ .315,
445
+ -.243,
446
+ .159,
447
+ .195,
448
+ .092,
449
+ .116,
450
+ .108,
451
+ -.05,
452
+ .03,
453
+ .29,
454
+ -.298,
455
+ .06,
456
+ .276,
457
+ -.127,
458
+ .044,
459
+ .279,
460
+ .029,
461
+ -.062,
462
+ .312,
463
+ -.101,
464
+ -.026,
465
+ .195,
466
+ .103,
467
+ .038,
468
+ .191,
469
+ -.061,
470
+ -.124,
471
+ .168,
472
+ .086,
473
+ -.03,
474
+ .29,
475
+ -.182,
476
+ .096,
477
+ .301,
478
+ .199,
479
+ .08,
480
+ .115,
481
+ -.174,
482
+ -.024,
483
+ .186,
484
+ .264,
485
+ .022,
486
+ .244,
487
+ .134,
488
+ -.082,
489
+ .312,
490
+ -.236,
491
+ .056,
492
+ .307,
493
+ -.352,
494
+ .034,
495
+ .279,
496
+ -.045,
497
+ -.045,
498
+ .244,
499
+ .214,
500
+ -.112,
501
+ .251,
502
+ -.183,
503
+ .16,
504
+ .226,
505
+ .223,
506
+ -.026,
507
+ .287,
508
+ .146,
509
+ -.164,
510
+ .223,
511
+ .327,
512
+ -.051,
513
+ .244,
514
+ .129,
515
+ -.225,
516
+ .135,
517
+ -.021,
518
+ -.173,
519
+ .191,
520
+ .16,
521
+ -.021,
522
+ .266,
523
+ .042,
524
+ -.131,
525
+ .287,
526
+ .056,
527
+ -.198,
528
+ .24,
529
+ .244,
530
+ -.184,
531
+ .1,
532
+ .006,
533
+ -.246,
534
+ .177,
535
+ -.282,
536
+ .202,
537
+ 0,
538
+ .286,
539
+ .115,
540
+ .07,
541
+ -.299,
542
+ .121,
543
+ .199,
544
+ .286,
545
+ -.129,
546
+ .163,
547
+ .347,
548
+ .031,
549
+ .263,
550
+ -.316,
551
+ -.018,
552
+ .254,
553
+ -.242,
554
+ -.093,
555
+ .07,
556
+ -.253,
557
+ -.007,
558
+ .24,
559
+ -.366,
560
+ .126,
561
+ .141,
562
+ .352,
563
+ .092,
564
+ .177,
565
+ -.217,
566
+ .227,
567
+ .07,
568
+ -.405,
569
+ .072,
570
+ .199,
571
+ -.113,
572
+ -.086,
573
+ .115,
574
+ .344,
575
+ -.131,
576
+ .108,
577
+ -.307,
578
+ -.077,
579
+ .152,
580
+ -.429,
581
+ .013,
582
+ .254,
583
+ .061,
584
+ -.29,
585
+ .07,
586
+ -.003,
587
+ -.306,
588
+ .108,
589
+ .458,
590
+ .091,
591
+ .223,
592
+ -.484,
593
+ -.028,
594
+ .276,
595
+ .263,
596
+ -.075,
597
+ .254,
598
+ .401,
599
+ .136,
600
+ .122,
601
+ .431,
602
+ -.09,
603
+ .1,
604
+ .413,
605
+ .051,
606
+ .26,
607
+ .421,
608
+ -.023,
609
+ .226,
610
+ .512,
611
+ .027,
612
+ .226,
613
+ -.481,
614
+ .06,
615
+ .152,
616
+ -.054,
617
+ -.22,
618
+ .07,
619
+ .505,
620
+ -.041,
621
+ .135,
622
+ .579,
623
+ .045,
624
+ .215,
625
+ .517,
626
+ .09,
627
+ .247,
628
+ .602,
629
+ .142,
630
+ .219,
631
+ .575,
632
+ -.032,
633
+ .07,
634
+ -.38,
635
+ -.04,
636
+ .251,
637
+ -.471,
638
+ -.091,
639
+ .203,
640
+ -.572,
641
+ .021,
642
+ .141,
643
+ -.549,
644
+ -.038,
645
+ .251,
646
+ -.38,
647
+ -.128,
648
+ .1,
649
+ .479,
650
+ .169,
651
+ .07,
652
+ -.671,
653
+ -.021,
654
+ .135,
655
+ .66,
656
+ .029,
657
+ .129,
658
+ -.433,
659
+ .126,
660
+ .07,
661
+ .692,
662
+ .087,
663
+ .191,
664
+ -.64,
665
+ -.096,
666
+ .257,
667
+ .626,
668
+ .079,
669
+ .226,
670
+ .73,
671
+ .194,
672
+ .172,
673
+ -.711,
674
+ -.176,
675
+ .172,
676
+ -.529,
677
+ -.109,
678
+ .207,
679
+ .742,
680
+ .115,
681
+ .199,
682
+ .664,
683
+ .165,
684
+ .207,
685
+ .587,
686
+ .206,
687
+ .07,
688
+ .801,
689
+ .106,
690
+ .141,
691
+ -.742,
692
+ -.055,
693
+ .129,
694
+ -.563,
695
+ -.165,
696
+ .122,
697
+ -.783,
698
+ -.161,
699
+ .135,
700
+ .54,
701
+ .143,
702
+ .186,
703
+ -.7,
704
+ -.119,
705
+ .251,
706
+ -.613,
707
+ -.039,
708
+ .211,
709
+ .761,
710
+ .059,
711
+ .07,
712
+ -.633,
713
+ -.162,
714
+ .168,
715
+ -.478,
716
+ -.153,
717
+ .07,
718
+ .806,
719
+ .173,
720
+ .081,
721
+ .861,
722
+ .131,
723
+ .07,
724
+ -.827,
725
+ -.099,
726
+ .135,
727
+ .645,
728
+ .223,
729
+ .07,
730
+ .574,
731
+ -.176,
732
+ .081,
733
+ .493,
734
+ -.215,
735
+ .07,
736
+ .565,
737
+ -.281,
738
+ .172,
739
+ .519,
740
+ -.338,
741
+ .244,
742
+ .42,
743
+ -.269,
744
+ .108,
745
+ .442,
746
+ -.356,
747
+ .172,
748
+ .502,
749
+ -.277,
750
+ .195,
751
+ .552,
752
+ -.39,
753
+ .186,
754
+ .495,
755
+ -.416,
756
+ .251,
757
+ .415,
758
+ -.422,
759
+ .135,
760
+ .601,
761
+ -.339,
762
+ .07,
763
+ .395,
764
+ -.493,
765
+ .226,
766
+ .483,
767
+ -.53,
768
+ .157,
769
+ .357,
770
+ -.59,
771
+ .157,
772
+ .531,
773
+ -.486,
774
+ .191,
775
+ .316,
776
+ -.495,
777
+ .163,
778
+ .226,
779
+ -.494,
780
+ .07,
781
+ .415,
782
+ -.55,
783
+ .186,
784
+ .358,
785
+ -.427,
786
+ .07,
787
+ .577,
788
+ -.443,
789
+ .141,
790
+ .272,
791
+ -.554,
792
+ .226,
793
+ .198,
794
+ -.593,
795
+ .23,
796
+ .104,
797
+ -.581,
798
+ .129,
799
+ .184,
800
+ -.703,
801
+ .1,
802
+ .135,
803
+ -.64,
804
+ .244,
805
+ .162,
806
+ -.532,
807
+ .081,
808
+ .119,
809
+ -.726,
810
+ .129,
811
+ .035,
812
+ -.595,
813
+ .07,
814
+ .218,
815
+ -.648,
816
+ .182,
817
+ .585,
818
+ -.519,
819
+ .07,
820
+ .015,
821
+ -.683,
822
+ .23,
823
+ .081,
824
+ -.671,
825
+ .244,
826
+ .33,
827
+ -.648,
828
+ .07,
829
+ .039,
830
+ -.75,
831
+ .157,
832
+ -.089,
833
+ -.662,
834
+ .24,
835
+ -.019,
836
+ -.757,
837
+ .177,
838
+ -.064,
839
+ -.721,
840
+ .199,
841
+ -.133,
842
+ -.701,
843
+ .172,
844
+ -.043,
845
+ -.619,
846
+ .141,
847
+ -.125,
848
+ -.575,
849
+ .141,
850
+ -.148,
851
+ -.644,
852
+ .244,
853
+ -.252,
854
+ -.662,
855
+ .135,
856
+ -.192,
857
+ -.569,
858
+ .191,
859
+ -.189,
860
+ -.715,
861
+ .1,
862
+ -.27,
863
+ -.589,
864
+ .237,
865
+ -.29,
866
+ -.512,
867
+ .177,
868
+ -.211,
869
+ -.504,
870
+ 0,
871
+ -.325,
872
+ -.608,
873
+ .163,
874
+ -.372,
875
+ -.563,
876
+ .199,
877
+ -.365,
878
+ -.491,
879
+ .199,
880
+ -.454,
881
+ -.547,
882
+ .163,
883
+ -.431,
884
+ -.48,
885
+ .223,
886
+ -.489,
887
+ -.484,
888
+ .226,
889
+ -.514,
890
+ -.407,
891
+ .254,
892
+ -.538,
893
+ -.302,
894
+ .1,
895
+ -.378,
896
+ -.429,
897
+ .081,
898
+ -.391,
899
+ -.621,
900
+ .07,
901
+ -.457,
902
+ -.301,
903
+ .141,
904
+ -.321,
905
+ -.451,
906
+ .07,
907
+ -.457,
908
+ -.426,
909
+ .191,
910
+ -.578,
911
+ -.491,
912
+ .152,
913
+ -.582,
914
+ -.37,
915
+ .141,
916
+ -.413,
917
+ -.373,
918
+ .07,
919
+ -.494,
920
+ -.353,
921
+ .219,
922
+ -.598,
923
+ -.427,
924
+ .1,
925
+ -.514,
926
+ -.542,
927
+ .115,
928
+ .27,
929
+ -.621,
930
+ .172,
931
+ -.105,
932
+ -.762,
933
+ .07
934
+ ]),
935
+ e: Float32Array.from([
936
+ .1,
937
+ .457,
938
+ .486,
939
+ .343,
940
+ .243,
941
+ .229,
942
+ .043,
943
+ .2,
944
+ .271,
945
+ .443,
946
+ .157,
947
+ .086,
948
+ .114,
949
+ .214,
950
+ .2,
951
+ .443,
952
+ .171,
953
+ 0,
954
+ .157,
955
+ .314,
956
+ .443,
957
+ .486,
958
+ .257,
959
+ .286,
960
+ .457,
961
+ 0,
962
+ 0,
963
+ .086,
964
+ .429,
965
+ .371,
966
+ .057,
967
+ .086,
968
+ .443,
969
+ .271,
970
+ .043,
971
+ .057,
972
+ .457,
973
+ .271,
974
+ .171,
975
+ .157,
976
+ .057,
977
+ .471,
978
+ .343,
979
+ .4,
980
+ .257,
981
+ .429,
982
+ .086,
983
+ .257,
984
+ .2,
985
+ .257,
986
+ .586,
987
+ .271,
988
+ .257,
989
+ .471,
990
+ .043,
991
+ .043,
992
+ .157,
993
+ .214,
994
+ .043,
995
+ .043,
996
+ .129,
997
+ .129,
998
+ .043,
999
+ .043,
1000
+ .1,
1001
+ .329,
1002
+ .329,
1003
+ .314,
1004
+ .729,
1005
+ .714,
1006
+ .043,
1007
+ .229,
1008
+ .043,
1009
+ .514,
1010
+ .843,
1011
+ .857,
1012
+ .329,
1013
+ .1,
1014
+ .729,
1015
+ .657,
1016
+ .671,
1017
+ .843,
1018
+ .329,
1019
+ .314,
1020
+ .243,
1021
+ .729,
1022
+ .786,
1023
+ .114,
1024
+ .3,
1025
+ .514,
1026
+ .843,
1027
+ .814,
1028
+ .671,
1029
+ .514,
1030
+ .543,
1031
+ .443,
1032
+ .714,
1033
+ .429,
1034
+ .514,
1035
+ .157,
1036
+ .314,
1037
+ .614,
1038
+ .714,
1039
+ .5,
1040
+ .086,
1041
+ .271,
1042
+ 0,
1043
+ .043,
1044
+ .343,
1045
+ .229,
1046
+ .6,
1047
+ .557,
1048
+ .043,
1049
+ .5,
1050
+ .171,
1051
+ .271,
1052
+ .043,
1053
+ .343,
1054
+ .114,
1055
+ .1,
1056
+ .2,
1057
+ .557,
1058
+ .043,
1059
+ .1,
1060
+ .429,
1061
+ .657,
1062
+ .557,
1063
+ .129,
1064
+ .086,
1065
+ .586,
1066
+ .443,
1067
+ .443,
1068
+ .2,
1069
+ .043,
1070
+ .157,
1071
+ .4,
1072
+ .529,
1073
+ .414,
1074
+ .043,
1075
+ .543,
1076
+ .357,
1077
+ .171,
1078
+ .543,
1079
+ .086,
1080
+ .043,
1081
+ .157,
1082
+ .143,
1083
+ .043,
1084
+ .314,
1085
+ .571,
1086
+ .443,
1087
+ .257,
1088
+ .257,
1089
+ .371,
1090
+ .343,
1091
+ .371,
1092
+ .043,
1093
+ .171,
1094
+ .143,
1095
+ .129,
1096
+ .157,
1097
+ .3,
1098
+ .543,
1099
+ .386,
1100
+ .043,
1101
+ .243,
1102
+ .043,
1103
+ .057,
1104
+ .043,
1105
+ .157,
1106
+ .043,
1107
+ .057,
1108
+ .043,
1109
+ .257,
1110
+ .514,
1111
+ .1,
1112
+ .257,
1113
+ .329,
1114
+ .3,
1115
+ .543,
1116
+ .157,
1117
+ .043,
1118
+ .443,
1119
+ .214,
1120
+ .214,
1121
+ .314,
1122
+ .229,
1123
+ .043,
1124
+ .3,
1125
+ .043,
1126
+ .171,
1127
+ .443,
1128
+ .457,
1129
+ .143,
1130
+ .086,
1131
+ .514,
1132
+ .057,
1133
+ .143,
1134
+ .043,
1135
+ .286,
1136
+ .043,
1137
+ .457,
1138
+ .514,
1139
+ .043,
1140
+ .214,
1141
+ .5,
1142
+ .271,
1143
+ .343,
1144
+ .257,
1145
+ .171,
1146
+ .171,
1147
+ .514,
1148
+ .157,
1149
+ .314,
1150
+ .086,
1151
+ .486,
1152
+ .271,
1153
+ 0,
1154
+ .229,
1155
+ .343,
1156
+ .343,
1157
+ .229,
1158
+ .429,
1159
+ .443,
1160
+ .557,
1161
+ .086,
1162
+ .057,
1163
+ .043,
1164
+ .171,
1165
+ .043,
1166
+ .314,
1167
+ .2,
1168
+ .171,
1169
+ .043,
1170
+ .414,
1171
+ .086,
1172
+ .114,
1173
+ .257,
1174
+ .043
1175
+ ])
46
1176
  };
47
- const SPINNER_KEYFRAMES_CSS = `
48
- @keyframes tradeItSdkSpin {
49
- from { transform: rotate(0deg); }
50
- to { transform: rotate(360deg); }
51
- }
52
- @media (prefers-reduced-motion: reduce) {
53
- .tradeit-sdk-spinner {
54
- animation: none !important;
55
- }
1177
+ const OPTS = {
1178
+ dwell: 1,
1179
+ morph: 1.7,
1180
+ expo: .3,
1181
+ settle: .1,
1182
+ turns: 0,
1183
+ yawAmp: .22,
1184
+ yawRate: .3,
1185
+ tilt: .42,
1186
+ rings: 9,
1187
+ height: 1.5,
1188
+ wide: .82,
1189
+ taper: .78,
1190
+ breatheRate: .75,
1191
+ breatheAmp: .2,
1192
+ spin: .16,
1193
+ loudR: .25,
1194
+ loudInk: .12,
1195
+ rBase: .55,
1196
+ rDepth: 1.4,
1197
+ inkFar: .6,
1198
+ inkSpan: .5,
1199
+ inkRim: .16,
1200
+ rsPow: .6,
1201
+ rMin: .3
1202
+ };
1203
+ function seatMap(points) {
1204
+ const n = points.n;
1205
+ const byLogo = new Uint32Array(n);
1206
+ const bySeat = new Uint32Array(n);
1207
+ const logoAng = new Float32Array(n);
1208
+ const seatAng = new Float32Array(n);
1209
+ for (let i = 0; i < n; i++) {
1210
+ byLogo[i] = i;
1211
+ bySeat[i] = i;
1212
+ logoAng[i] = Math.atan2(points.p[i * 3 + 1], points.p[i * 3]);
1213
+ const [sx, sy] = fibDir(i, n);
1214
+ seatAng[i] = Math.atan2(sy, sx);
1215
+ }
1216
+ byLogo.sort((a, b) => logoAng[a] - logoAng[b]);
1217
+ bySeat.sort((a, b) => seatAng[a] - seatAng[b]);
1218
+ const seats = new Uint32Array(n);
1219
+ for (let k = 0; k < n; k++) seats[byLogo[k]] = bySeat[k];
1220
+ return seats;
56
1221
  }
57
- `;
58
- function LoaderCircleSpinner() {
59
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("style", { children: SPINNER_KEYFRAMES_CSS }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
60
- className: "tradeit-sdk-spinner",
61
- style: SPINNER_WRAPPER_STYLE,
1222
+ const BINDING = {
1223
+ points: POINTS,
1224
+ seats: seatMap(POINTS)
1225
+ };
1226
+ function TradeItLogoLoader({ size = 120 }) {
1227
+ const ref = (0, react.useRef)(null);
1228
+ (0, react.useEffect)(() => {
1229
+ const canvas = ref.current;
1230
+ if (!canvas) return;
1231
+ const dpr = Math.min(2, devicePixelRatio || 1);
1232
+ canvas.width = Math.round(size * dpr);
1233
+ canvas.height = Math.round(size * dpr);
1234
+ const ctx = canvas.getContext("2d");
1235
+ if (!ctx) return;
1236
+ const render = (t) => {
1237
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
1238
+ ctx.clearRect(0, 0, size, size);
1239
+ const frame = frameLogoWait(size, t, OPTS, BINDING);
1240
+ paintFrame(ctx, frame);
1241
+ };
1242
+ if (matchMedia("(prefers-reduced-motion: reduce)").matches) {
1243
+ render(0);
1244
+ return;
1245
+ }
1246
+ let raf = 0;
1247
+ let running = false;
1248
+ const startedAt = performance.now();
1249
+ const loop = (now) => {
1250
+ render((now - startedAt) / 1e3);
1251
+ if (running) raf = requestAnimationFrame(loop);
1252
+ };
1253
+ const start = () => {
1254
+ if (running) return;
1255
+ running = true;
1256
+ raf = requestAnimationFrame(loop);
1257
+ };
1258
+ const stop = () => {
1259
+ running = false;
1260
+ cancelAnimationFrame(raf);
1261
+ };
1262
+ render(0);
1263
+ let visible = true;
1264
+ const io = new IntersectionObserver(([entry]) => {
1265
+ visible = entry.isIntersecting;
1266
+ if (visible && document.visibilityState !== "hidden") start();
1267
+ else stop();
1268
+ });
1269
+ io.observe(canvas);
1270
+ const onVis = () => {
1271
+ if (document.visibilityState === "hidden") stop();
1272
+ else if (visible) start();
1273
+ };
1274
+ document.addEventListener("visibilitychange", onVis);
1275
+ return () => {
1276
+ stop();
1277
+ io.disconnect();
1278
+ document.removeEventListener("visibilitychange", onVis);
1279
+ };
1280
+ }, [size]);
1281
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("canvas", {
1282
+ ref,
62
1283
  "aria-hidden": "true",
63
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
64
- xmlns: "http://www.w3.org/2000/svg",
65
- width: SPINNER_ICON_SIZE,
66
- height: SPINNER_ICON_SIZE,
67
- viewBox: "0 0 24 24",
68
- fill: "none",
69
- stroke: "currentColor",
70
- strokeWidth: "2",
71
- strokeLinecap: "round",
72
- strokeLinejoin: "round",
73
- style: SPINNER_SVG_STYLE,
74
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M21 12a9 9 0 1 1-6.219-8.56" })
75
- })
76
- })] });
1284
+ style: {
1285
+ width: size,
1286
+ height: size,
1287
+ display: "block"
1288
+ }
1289
+ });
77
1290
  }
78
1291
 
79
1292
  //#endregion
@@ -81,7 +1294,7 @@ function LoaderCircleSpinner() {
81
1294
  const LOADING_STYLE = {
82
1295
  position: "absolute",
83
1296
  inset: 0,
84
- background: "#ffffff"
1297
+ background: "#0e1011"
85
1298
  };
86
1299
  const LOADING_CONTENT_STYLE = {
87
1300
  position: "relative",
@@ -100,7 +1313,7 @@ function TradeItModalLoader() {
100
1313
  "aria-busy": "true",
101
1314
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
102
1315
  style: LOADING_CONTENT_STYLE,
103
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LoaderCircleSpinner, {})
1316
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TradeItLogoLoader, {})
104
1317
  })
105
1318
  });
106
1319
  }
@@ -121,16 +1334,23 @@ const DIALOG_DESKTOP_STYLE = {
121
1334
  position: "relative",
122
1335
  width: "min(960px, calc(100vw - 24px))",
123
1336
  height: "min(760px, calc(100vh - 24px))",
124
- background: "#fff",
1337
+ boxSizing: "border-box",
1338
+ background: "#0e1011",
1339
+ colorScheme: "dark",
125
1340
  borderRadius: 18,
126
1341
  boxShadow: "0 24px 80px rgba(2, 6, 23, 0.28)",
127
- border: "1px solid rgba(148, 163, 184, 0.35)",
1342
+ border: "1px solid rgba(255, 255, 255, 0.14)",
128
1343
  overflow: "hidden"
129
1344
  };
1345
+ const CONNECT_DIALOG_DESKTOP_STYLE = {
1346
+ ...DIALOG_DESKTOP_STYLE,
1347
+ width: "min(736px, 100%)",
1348
+ height: "min(835px, 100%)"
1349
+ };
130
1350
  const DIALOG_MOBILE_STYLE = {
131
1351
  ...DIALOG_DESKTOP_STYLE,
132
- width: "100vw",
133
- height: "100vh",
1352
+ width: "100%",
1353
+ height: "100%",
134
1354
  borderRadius: 0,
135
1355
  border: 0
136
1356
  };
@@ -142,9 +1362,12 @@ const CLOSE_BUTTON_STYLE = {
142
1362
  width: 34,
143
1363
  height: 34,
144
1364
  borderRadius: 999,
145
- border: "1px solid rgba(148,163,184,0.45)",
146
- background: "rgba(255,255,255,0.92)",
147
- color: "#0f172a",
1365
+ border: "1px solid rgba(255, 255, 255, 0.22)",
1366
+ background: "rgba(9, 11, 12, 0.64)",
1367
+ color: "#f0f0f2",
1368
+ backdropFilter: "blur(16px)",
1369
+ WebkitBackdropFilter: "blur(16px)",
1370
+ boxShadow: "0 8px 24px rgba(0, 0, 0, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.12)",
148
1371
  cursor: "pointer",
149
1372
  fontSize: 18,
150
1373
  lineHeight: "32px",
@@ -155,7 +1378,8 @@ const IFRAME_STYLE = {
155
1378
  width: "100%",
156
1379
  height: "100%",
157
1380
  border: 0,
158
- background: "#fff"
1381
+ background: "#0e1011",
1382
+ colorScheme: "dark"
159
1383
  };
160
1384
  function useIsMobile(maxWidth = 640) {
161
1385
  const [isMobile, setIsMobile] = (0, react.useState)(false);
@@ -164,20 +1388,23 @@ function useIsMobile(maxWidth = 640) {
164
1388
  const mediaQuery = window.matchMedia(`(max-width: ${maxWidth}px)`);
165
1389
  const onChange = () => setIsMobile(mediaQuery.matches);
166
1390
  onChange();
167
- if (typeof mediaQuery.addEventListener === "function") {
168
- mediaQuery.addEventListener("change", onChange);
169
- return () => mediaQuery.removeEventListener("change", onChange);
170
- }
171
- mediaQuery.addListener(onChange);
172
- return () => mediaQuery.removeListener(onChange);
1391
+ mediaQuery.addEventListener("change", onChange);
1392
+ return () => mediaQuery.removeEventListener("change", onChange);
173
1393
  }, [maxWidth]);
174
1394
  return isMobile;
175
1395
  }
176
1396
  function TradeItModal(props) {
177
- const { open, onOpenChange, onEvent, onError, iframeTitle, keepMounted = false, closeOnEscape = true, closeOnOverlayClick = true, closeOnCloseRequestedEvent = true, showCloseButton = true, zIndex = 9999, title, className } = props;
1397
+ const { open, onOpenChange, onEvent, onAuthorization, onError, iframeTitle, keepMounted = false, closeOnEscape = true, closeOnOverlayClick = true, closeOnCloseRequestedEvent = true, showCloseButton = true, zIndex = 9999, title, className } = props;
178
1398
  const isMobile = useIsMobile();
179
1399
  const [isMounted, setIsMounted] = (0, react.useState)(false);
180
1400
  const [iframeLoaded, setIframeLoaded] = (0, react.useState)(false);
1401
+ const iframeRef = (0, react.useRef)(null);
1402
+ const authorizationRef = (0, react.useRef)({
1403
+ code: "",
1404
+ pending: false,
1405
+ failed: false,
1406
+ closeRequested: false
1407
+ });
181
1408
  const resolved = (0, react.useMemo)(() => {
182
1409
  try {
183
1410
  return {
@@ -201,6 +1428,12 @@ function TradeItModal(props) {
201
1428
  (0, react.useEffect)(() => {
202
1429
  if (!open) return;
203
1430
  setIframeLoaded(false);
1431
+ authorizationRef.current = {
1432
+ code: "",
1433
+ pending: false,
1434
+ failed: false,
1435
+ closeRequested: false
1436
+ };
204
1437
  }, [open, resolved.url]);
205
1438
  (0, react.useEffect)(() => {
206
1439
  if (!open || !closeOnEscape) return;
@@ -228,10 +1461,54 @@ function TradeItModal(props) {
228
1461
  if (!expectedOrigin) return;
229
1462
  const handleMessage = (event) => {
230
1463
  if (event.origin !== expectedOrigin) return;
1464
+ if (event.source !== iframeRef.current?.contentWindow) return;
231
1465
  if (!(0, __trade_it_core.isTradeItEvent)(event.data)) return;
1466
+ if (event.data.type === __trade_it_core.EmbedEventType.Authorization) {
1467
+ if (!(0, __trade_it_core.isTradeItAuthorization)(event.data.payload)) return;
1468
+ const authorization = event.data.payload;
1469
+ if (authorizationRef.current.code === authorization.code) return;
1470
+ const delivery = {
1471
+ code: authorization.code,
1472
+ pending: true,
1473
+ failed: false,
1474
+ closeRequested: false
1475
+ };
1476
+ authorizationRef.current = delivery;
1477
+ const frameWindow = iframeRef.current?.contentWindow;
1478
+ const reply = (success) => {
1479
+ if (authorizationRef.current !== delivery || iframeRef.current?.contentWindow !== frameWindow) return;
1480
+ delivery.pending = false;
1481
+ delivery.failed = !success;
1482
+ frameWindow?.postMessage({
1483
+ source: "tradeit",
1484
+ version: 1,
1485
+ type: __trade_it_core.EmbedEventType.AuthorizationResult,
1486
+ payload: {
1487
+ state: authorization.state,
1488
+ success
1489
+ }
1490
+ }, expectedOrigin);
1491
+ if (success && delivery.closeRequested) onOpenChange?.(false);
1492
+ };
1493
+ Promise.resolve().then(() => {
1494
+ if (!onAuthorization) throw new Error("Configure onAuthorization to save the user's OAuth grant.");
1495
+ return onAuthorization(authorization);
1496
+ }).then(() => reply(true), (error) => {
1497
+ reply(false);
1498
+ onError?.(error instanceof Error ? error : new Error("Could not save the OAuth grant."));
1499
+ });
1500
+ return;
1501
+ }
232
1502
  onEvent?.(event.data);
233
- if (event.data.type === "tradeit.error") onError?.(new Error((0, __trade_it_core.getTradeItErrorMessage)(event.data)));
234
- if (event.data.type === "tradeit.close_requested" && closeOnCloseRequestedEvent) onOpenChange?.(false);
1503
+ if (event.data.type === __trade_it_core.EmbedEventType.Error) onError?.(new Error((0, __trade_it_core.getTradeItErrorMessage)(event.data)));
1504
+ if (event.data.type === __trade_it_core.EmbedEventType.CloseRequested && closeOnCloseRequestedEvent) {
1505
+ if (authorizationRef.current.failed) return;
1506
+ if (authorizationRef.current.pending) {
1507
+ authorizationRef.current.closeRequested = true;
1508
+ return;
1509
+ }
1510
+ onOpenChange?.(false);
1511
+ }
235
1512
  };
236
1513
  window.addEventListener("message", handleMessage);
237
1514
  return () => window.removeEventListener("message", handleMessage);
@@ -239,6 +1516,7 @@ function TradeItModal(props) {
239
1516
  open,
240
1517
  resolved.url,
241
1518
  onEvent,
1519
+ onAuthorization,
242
1520
  onError,
243
1521
  closeOnCloseRequestedEvent,
244
1522
  onOpenChange
@@ -246,9 +1524,16 @@ function TradeItModal(props) {
246
1524
  if (!isMounted) return null;
247
1525
  if (!open && !keepMounted) return null;
248
1526
  if (!resolved.url) return null;
249
- const dialogStyle = isMobile ? DIALOG_MOBILE_STYLE : DIALOG_DESKTOP_STYLE;
1527
+ const isConnectFlow = props.launch.mode === "connect";
1528
+ let dialogStyle = DIALOG_DESKTOP_STYLE;
1529
+ if (isMobile) dialogStyle = DIALOG_MOBILE_STYLE;
1530
+ else if (isConnectFlow) dialogStyle = CONNECT_DIALOG_DESKTOP_STYLE;
1531
+ let overlayPadding = 12;
1532
+ if (isMobile) overlayPadding = 0;
1533
+ else if (isConnectFlow) overlayPadding = "0 4px";
250
1534
  const overlayStyle = {
251
1535
  ...OVERLAY_STYLE,
1536
+ padding: overlayPadding,
252
1537
  zIndex
253
1538
  };
254
1539
  const dialogLabel = title ?? iframeTitle ?? "Trade It";
@@ -279,6 +1564,7 @@ function TradeItModal(props) {
279
1564
  }),
280
1565
  !iframeLoaded && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TradeItModalLoader, {}),
281
1566
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("iframe", {
1567
+ ref: iframeRef,
282
1568
  title: dialogLabel,
283
1569
  src: resolved.url,
284
1570
  style: IFRAME_STYLE,
@@ -407,6 +1693,12 @@ let TradeType = /* @__PURE__ */ function(TradeType$1) {
407
1693
  }({});
408
1694
 
409
1695
  //#endregion
1696
+ Object.defineProperty(exports, 'EmbedEventType', {
1697
+ enumerable: true,
1698
+ get: function () {
1699
+ return __trade_it_core.EmbedEventType;
1700
+ }
1701
+ });
410
1702
  exports.LegType = LegType;
411
1703
  exports.OrderDirection = OrderDirection;
412
1704
  exports.OrderType = OrderType;
@@ -435,6 +1727,12 @@ Object.defineProperty(exports, 'getUrlOrigin', {
435
1727
  return __trade_it_core.getUrlOrigin;
436
1728
  }
437
1729
  });
1730
+ Object.defineProperty(exports, 'isTradeItAuthorization', {
1731
+ enumerable: true,
1732
+ get: function () {
1733
+ return __trade_it_core.isTradeItAuthorization;
1734
+ }
1735
+ });
438
1736
  Object.defineProperty(exports, 'isTradeItEvent', {
439
1737
  enumerable: true,
440
1738
  get: function () {