@backtest-kit/ui 3.8.0 → 5.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.
Files changed (22) hide show
  1. package/build/index.cjs +383 -6
  2. package/build/index.mjs +384 -7
  3. package/build/modules/frontend/build/assets/Background-hRKtQSrv.js +1 -0
  4. package/build/modules/frontend/build/assets/{IconPhoto-DLj3pG_p.js → IconPhoto-DQlKNGdb.js} +1 -1
  5. package/build/modules/frontend/build/assets/{KeyboardArrowLeft-DLEPx5Pm.js → KeyboardArrowLeft-wYBUTbRV.js} +1 -1
  6. package/build/modules/frontend/build/assets/{Refresh-BDbWoqW-.js → Refresh-_yMWRw_x.js} +1 -1
  7. package/build/modules/frontend/build/assets/{index-zSnwHsC4.js → index-3gnGrSPi.js} +12 -12
  8. package/build/modules/frontend/build/assets/index-BFSXu2bZ.js +1 -0
  9. package/build/modules/frontend/build/assets/index-BPJ87g-R.js +1 -0
  10. package/build/modules/frontend/build/assets/index-BUme2lKb.js +1 -0
  11. package/build/modules/frontend/build/assets/index-Bay1AtTY.js +1 -0
  12. package/build/modules/frontend/build/assets/index-Kwt_oEAl.js +1 -0
  13. package/build/modules/frontend/build/assets/index-TU650r8r.js +1 -0
  14. package/build/modules/frontend/build/assets/markdownit-CZc4lN8k.js +1 -0
  15. package/build/modules/frontend/build/index.html +1 -1
  16. package/package.json +3 -3
  17. package/types.d.ts +65 -0
  18. package/build/modules/frontend/build/assets/index-BWNCsO4C.js +0 -1
  19. package/build/modules/frontend/build/assets/index-D2XsO1HQ.js +0 -1
  20. package/build/modules/frontend/build/assets/index-YO0gE9Ra.js +0 -1
  21. package/build/modules/frontend/build/assets/index-wbcZHlIz.js +0 -1
  22. package/build/modules/frontend/build/assets/markdownit-DzS63FBS.js +0 -1
package/build/index.mjs CHANGED
@@ -6,7 +6,7 @@ import finalhandler from 'finalhandler';
6
6
  import serveHandler from 'serve-handler';
7
7
  import os from 'os';
8
8
  import { createActivator } from 'di-kit';
9
- import { Exchange, Notification, Storage, Log, listenSignal } from 'backtest-kit';
9
+ import { Exchange, Notification, Storage, Log, Live, listenSignal } from 'backtest-kit';
10
10
  import fs, { readdir, readFile } from 'fs/promises';
11
11
  import path, { join, dirname } from 'path';
12
12
  import { createRequire } from 'module';
@@ -65,12 +65,14 @@ const mockServices$1 = {
65
65
  storageMockService: Symbol("storageMockService"),
66
66
  exchangeMockService: Symbol("exchangeMockService"),
67
67
  logMockService: Symbol("logMockService"),
68
+ statusMockService: Symbol("statusMockService"),
68
69
  };
69
70
  const viewServices$1 = {
70
71
  notificationViewService: Symbol("notificationViewService"),
71
72
  storageViewService: Symbol("storageViewService"),
72
73
  exchangeViewService: Symbol("exchangeViewService"),
73
74
  logViewService: Symbol("logViewService"),
75
+ statusViewService: Symbol("statusViewService"),
74
76
  };
75
77
  const TYPES = {
76
78
  ...baseServices$1,
@@ -173,9 +175,9 @@ class LoggerService {
173
175
  }
174
176
  }
175
177
 
176
- const MOCK_PATH$2 = "./mock/notifications.json";
178
+ const MOCK_PATH$3 = "./mock/notifications.json";
177
179
  const READ_NOTIFICATION_LIST_FN = singleshot(async () => {
178
- const data = await fs.readFile(MOCK_PATH$2, "utf-8");
180
+ const data = await fs.readFile(MOCK_PATH$3, "utf-8");
179
181
  return JSON.parse(data);
180
182
  });
181
183
  const DEFAULT_LIMIT$3 = 25;
@@ -235,9 +237,9 @@ class NotificationMockService {
235
237
  }
236
238
  }
237
239
 
238
- const MOCK_PATH$1 = "./mock/db";
240
+ const MOCK_PATH$2 = "./mock/db";
239
241
  const READ_BACKTEST_STORAGE_FN = singleshot(async () => {
240
- const dbPath = join(process.cwd(), MOCK_PATH$1);
242
+ const dbPath = join(process.cwd(), MOCK_PATH$2);
241
243
  const files = await readdir(dbPath);
242
244
  const signals = [];
243
245
  for (const file of files) {
@@ -272,6 +274,7 @@ class StorageMockService {
272
274
  }
273
275
  }
274
276
 
277
+ const MS_PER_MINUTE$1 = 60000;
275
278
  class ExchangeMockService {
276
279
  constructor() {
277
280
  this.loggerService = inject(TYPES.loggerService);
@@ -295,12 +298,31 @@ class ExchangeMockService {
295
298
  interval,
296
299
  });
297
300
  };
301
+ this.getLiveCandles = async (signalId, interval) => {
302
+ this.loggerService.log("exchangeMockService getLiveCandles", {
303
+ signalId,
304
+ interval,
305
+ });
306
+ const signal = await this.storageMockService.findSignalById(signalId);
307
+ if (!signal) {
308
+ throw new Error(`Signal with ID ${signalId} not found`);
309
+ }
310
+ const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
311
+ const eventAt = pendingAt || scheduledAt;
312
+ return await this.exchangeService.getRangeCandles({
313
+ symbol: signal.symbol,
314
+ exchangeName: signal.exchangeName,
315
+ signalStartTime: eventAt,
316
+ signalStopTime: eventAt + minuteEstimatedTime * MS_PER_MINUTE$1,
317
+ interval,
318
+ });
319
+ };
298
320
  }
299
321
  }
300
322
 
301
- const MOCK_PATH = "./mock/logs.json";
323
+ const MOCK_PATH$1 = "./mock/logs.json";
302
324
  const READ_LOG_LIST_FN = singleshot(async () => {
303
- const data = await fs.readFile(MOCK_PATH, "utf-8");
325
+ const data = await fs.readFile(MOCK_PATH$1, "utf-8");
304
326
  return JSON.parse(data);
305
327
  });
306
328
  const DEFAULT_LIMIT$2 = 25;
@@ -348,6 +370,68 @@ class LogMockService {
348
370
  }
349
371
  }
350
372
 
373
+ const MOCK_PATH = "./mock/status.json";
374
+ const READ_STATUS_LIST_FN = singleshot(async () => {
375
+ const data = await fs.readFile(MOCK_PATH, "utf-8");
376
+ return JSON.parse(data);
377
+ });
378
+ class StatusMockService {
379
+ constructor() {
380
+ this.loggerService = inject(TYPES.loggerService);
381
+ this.getStatusList = async () => {
382
+ this.loggerService.log("statusMockService getStatusList");
383
+ const list = await READ_STATUS_LIST_FN();
384
+ return list.map(({ id, symbol, strategyName, exchangeName }) => ({
385
+ id,
386
+ symbol,
387
+ strategyName,
388
+ exchangeName,
389
+ status: "pending",
390
+ }));
391
+ };
392
+ this.getStatusMap = async () => {
393
+ this.loggerService.log("statusMockService getStatusMap");
394
+ const list = await this.getStatusList();
395
+ return list.reduce((acm, cur) => ({ ...acm, [cur.id]: cur }), {});
396
+ };
397
+ this.getStatusOne = async (id) => {
398
+ this.loggerService.log("statusMockService getStatusOne", { id });
399
+ const list = await READ_STATUS_LIST_FN();
400
+ const signal = list.find((s) => s.id === id);
401
+ if (!signal) {
402
+ return null;
403
+ }
404
+ const positionEntries = signal._entry ?? [];
405
+ const positionLevels = positionEntries.map((e) => e.price);
406
+ const positionPartials = signal._partial ?? [];
407
+ return {
408
+ signalId: signal.signalId,
409
+ position: signal.position,
410
+ symbol: signal.symbol,
411
+ exchangeName: signal.exchangeName,
412
+ strategyName: signal.strategyName,
413
+ totalEntries: signal.totalEntries,
414
+ totalPartials: signal.totalPartials,
415
+ originalPriceStopLoss: signal.originalPriceStopLoss,
416
+ originalPriceTakeProfit: signal.originalPriceTakeProfit,
417
+ originalPriceOpen: signal.originalPriceOpen,
418
+ priceOpen: signal.priceOpen,
419
+ priceTakeProfit: signal.priceTakeProfit,
420
+ priceStopLoss: signal.priceStopLoss,
421
+ pnlPercentage: signal.pnl.pnlPercentage,
422
+ pnlCost: signal.pnl.pnlCost,
423
+ pnlEntries: signal.pnl.pnlEntries,
424
+ partialExecuted: signal.partialExecuted,
425
+ minuteEstimatedTime: signal.minuteEstimatedTime,
426
+ pendingAt: signal.pendingAt,
427
+ positionLevels,
428
+ positionEntries,
429
+ positionPartials,
430
+ };
431
+ };
432
+ }
433
+ }
434
+
351
435
  const DEFAULT_LIMIT$1 = 25;
352
436
  const DEFAULT_OFFSET$1 = 0;
353
437
  const CREATE_FILTER_LIST_FN$1 = (filterData) => Object.keys(filterData).map((key) => (row) => new RegExp(filterData[key], "i").test(row[key]));
@@ -492,6 +576,7 @@ class StorageViewService {
492
576
  }
493
577
  }
494
578
 
579
+ const MS_PER_MINUTE = 60000;
495
580
  class ExchangeViewService {
496
581
  constructor() {
497
582
  this.loggerService = inject(TYPES.loggerService);
@@ -519,6 +604,28 @@ class ExchangeViewService {
519
604
  interval,
520
605
  });
521
606
  };
607
+ this.getLiveCandles = async (signalId, interval) => {
608
+ this.loggerService.log("exchangeViewService getLiveCandles", {
609
+ signalId,
610
+ interval,
611
+ });
612
+ if (CC_ENABLE_MOCK) {
613
+ return await this.exchangeMockService.getLiveCandles(signalId, interval);
614
+ }
615
+ const signal = await this.storageViewService.findSignalById(signalId);
616
+ if (!signal) {
617
+ throw new Error(`Signal with ID ${signalId} not found`);
618
+ }
619
+ const { pendingAt, scheduledAt, minuteEstimatedTime, } = signal;
620
+ const eventAt = pendingAt || scheduledAt;
621
+ return await this.exchangeService.getRangeCandles({
622
+ symbol: signal.symbol,
623
+ exchangeName: signal.exchangeName,
624
+ signalStartTime: eventAt,
625
+ signalStopTime: eventAt + minuteEstimatedTime * MS_PER_MINUTE,
626
+ interval,
627
+ });
628
+ };
522
629
  }
523
630
  }
524
631
 
@@ -577,6 +684,100 @@ class LogViewService {
577
684
  }
578
685
  }
579
686
 
687
+ class StatusViewService {
688
+ constructor() {
689
+ this.loggerService = inject(TYPES.loggerService);
690
+ this.statusMockService = inject(TYPES.statusMockService);
691
+ this.getStatusList = async () => {
692
+ this.loggerService.log("statusViewService getStatusList");
693
+ if (CC_ENABLE_MOCK) {
694
+ const liveList = await this.statusMockService.getStatusList();
695
+ return liveList.filter(({ status }) => status === "pending");
696
+ }
697
+ return await Live.list();
698
+ };
699
+ this.getStatusMap = async () => {
700
+ this.loggerService.log("statusViewService getStatusMap");
701
+ if (CC_ENABLE_MOCK) {
702
+ return await this.statusMockService.getStatusMap();
703
+ }
704
+ const liveList = await Live.list();
705
+ return liveList
706
+ .filter(({ status }) => status === "pending")
707
+ .reduce((acm, cur) => ({ ...acm, [cur.id]: cur }), {});
708
+ };
709
+ this.getStatusOne = async (id) => {
710
+ this.loggerService.log("statusViewService getStatusOne", {
711
+ id,
712
+ });
713
+ if (CC_ENABLE_MOCK) {
714
+ return await this.statusMockService.getStatusOne(id);
715
+ }
716
+ const liveList = await Live.list();
717
+ const liveOne = liveList.find((live) => live.id === id);
718
+ if (!liveOne) {
719
+ throw new Error(`Live with id ${id} not found`);
720
+ }
721
+ const { symbol, strategyName, exchangeName } = liveOne;
722
+ const currentPrice = await Exchange.getAveragePrice(symbol, {
723
+ exchangeName,
724
+ });
725
+ const pendingSignal = await Live.getPendingSignal(symbol, currentPrice, {
726
+ strategyName,
727
+ exchangeName,
728
+ });
729
+ if (!pendingSignal) {
730
+ return null;
731
+ }
732
+ const positionLevels = await Live.getPositionLevels(symbol, {
733
+ strategyName,
734
+ exchangeName,
735
+ });
736
+ if (!positionLevels) {
737
+ return null;
738
+ }
739
+ const positionEntries = await Live.getPositionEntries(symbol, {
740
+ strategyName,
741
+ exchangeName,
742
+ });
743
+ if (!positionEntries) {
744
+ return null;
745
+ }
746
+ const positionPartials = await Live.getPositionPartials(symbol, {
747
+ strategyName,
748
+ exchangeName,
749
+ });
750
+ if (!positionPartials) {
751
+ return null;
752
+ }
753
+ return {
754
+ signalId: pendingSignal.id,
755
+ position: pendingSignal.position,
756
+ symbol: pendingSignal.symbol,
757
+ exchangeName: pendingSignal.exchangeName,
758
+ strategyName: pendingSignal.strategyName,
759
+ totalEntries: pendingSignal.totalEntries,
760
+ totalPartials: pendingSignal.totalPartials,
761
+ originalPriceStopLoss: pendingSignal.originalPriceStopLoss,
762
+ originalPriceTakeProfit: pendingSignal.originalPriceTakeProfit,
763
+ originalPriceOpen: pendingSignal.originalPriceOpen,
764
+ priceOpen: pendingSignal.priceOpen,
765
+ priceTakeProfit: pendingSignal.priceTakeProfit,
766
+ priceStopLoss: pendingSignal.priceStopLoss,
767
+ pnlPercentage: pendingSignal.pnl.pnlPercentage,
768
+ pnlCost: pendingSignal.pnl.pnlCost,
769
+ pnlEntries: pendingSignal.pnl.pnlEntries,
770
+ partialExecuted: pendingSignal.partialExecuted,
771
+ pendingAt: pendingSignal.pendingAt,
772
+ minuteEstimatedTime: pendingSignal.minuteEstimatedTime,
773
+ positionEntries,
774
+ positionLevels,
775
+ positionPartials,
776
+ };
777
+ };
778
+ }
779
+ }
780
+
580
781
  const symbol_list = [
581
782
  {
582
783
  icon: "/icon/btc.png",
@@ -761,12 +962,14 @@ class PriceConnectionService {
761
962
  provide(TYPES.storageMockService, () => new StorageMockService());
762
963
  provide(TYPES.exchangeMockService, () => new ExchangeMockService());
763
964
  provide(TYPES.logMockService, () => new LogMockService());
965
+ provide(TYPES.statusMockService, () => new StatusMockService());
764
966
  }
765
967
  {
766
968
  provide(TYPES.notificationViewService, () => new NotificationViewService());
767
969
  provide(TYPES.storageViewService, () => new StorageViewService());
768
970
  provide(TYPES.exchangeViewService, () => new ExchangeViewService());
769
971
  provide(TYPES.logViewService, () => new LogViewService());
972
+ provide(TYPES.statusViewService, () => new StatusViewService());
770
973
  }
771
974
 
772
975
  const baseServices = {
@@ -785,12 +988,14 @@ const mockServices = {
785
988
  storageMockService: inject(TYPES.storageMockService),
786
989
  exchangeMockService: inject(TYPES.exchangeMockService),
787
990
  logMockService: inject(TYPES.logMockService),
991
+ statusMockService: inject(TYPES.statusMockService),
788
992
  };
789
993
  const viewServices = {
790
994
  notificationViewService: inject(TYPES.notificationViewService),
791
995
  storageViewService: inject(TYPES.storageViewService),
792
996
  exchangeViewService: inject(TYPES.exchangeViewService),
793
997
  logViewService: inject(TYPES.logViewService),
998
+ statusViewService: inject(TYPES.statusViewService),
794
999
  };
795
1000
  const ioc = {
796
1001
  ...baseServices,
@@ -1124,6 +1329,92 @@ router$6.post("/api/v1/mock/log_filter", async (req, res) => {
1124
1329
  });
1125
1330
  }
1126
1331
  });
1332
+ router$6.post("/api/v1/mock/candles_live", async (req, res) => {
1333
+ try {
1334
+ const request = await micro.json(req);
1335
+ const { signalId, interval, requestId, serviceName } = request;
1336
+ const data = await ioc.exchangeMockService.getLiveCandles(signalId, interval);
1337
+ const result = {
1338
+ data,
1339
+ status: "ok",
1340
+ error: "",
1341
+ requestId,
1342
+ serviceName,
1343
+ };
1344
+ ioc.loggerService.log("/api/v1/mock/candles_live ok", {
1345
+ request,
1346
+ result: omit(result, "data"),
1347
+ });
1348
+ return await micro.send(res, 200, result);
1349
+ }
1350
+ catch (error) {
1351
+ ioc.loggerService.log("/api/v1/mock/candles_live error", {
1352
+ error: errorData(error),
1353
+ });
1354
+ return await micro.send(res, 200, {
1355
+ status: "error",
1356
+ error: getErrorMessage(error),
1357
+ });
1358
+ }
1359
+ });
1360
+ // StatusMockService endpoints
1361
+ router$6.post("/api/v1/mock/status_list", async (req, res) => {
1362
+ try {
1363
+ const request = await micro.json(req);
1364
+ const { requestId, serviceName } = request;
1365
+ const data = await ioc.statusMockService.getStatusList();
1366
+ const result = {
1367
+ data,
1368
+ status: "ok",
1369
+ error: "",
1370
+ requestId,
1371
+ serviceName,
1372
+ };
1373
+ ioc.loggerService.log("/api/v1/mock/status_list ok", {
1374
+ request,
1375
+ result: omit(result, "data"),
1376
+ });
1377
+ return await micro.send(res, 200, result);
1378
+ }
1379
+ catch (error) {
1380
+ ioc.loggerService.log("/api/v1/mock/status_list error", {
1381
+ error: errorData(error),
1382
+ });
1383
+ return await micro.send(res, 200, {
1384
+ status: "error",
1385
+ error: getErrorMessage(error),
1386
+ });
1387
+ }
1388
+ });
1389
+ router$6.post("/api/v1/mock/status_one/:id", async (req, res) => {
1390
+ try {
1391
+ const request = await micro.json(req);
1392
+ const { requestId, serviceName } = request;
1393
+ const id = req.params.id;
1394
+ const data = await ioc.statusMockService.getStatusOne(id);
1395
+ const result = {
1396
+ data,
1397
+ status: "ok",
1398
+ error: "",
1399
+ requestId,
1400
+ serviceName,
1401
+ };
1402
+ ioc.loggerService.log("/api/v1/mock/status_one/:id ok", {
1403
+ request,
1404
+ result: omit(result, "data"),
1405
+ });
1406
+ return await micro.send(res, 200, result);
1407
+ }
1408
+ catch (error) {
1409
+ ioc.loggerService.log("/api/v1/mock/status_one/:id error", {
1410
+ error: errorData(error),
1411
+ });
1412
+ return await micro.send(res, 200, {
1413
+ status: "error",
1414
+ error: getErrorMessage(error),
1415
+ });
1416
+ }
1417
+ });
1127
1418
 
1128
1419
  const router$5 = Router({
1129
1420
  params: true,
@@ -1190,6 +1481,34 @@ router$5.post("/api/v1/view/candles_point", async (req, res) => {
1190
1481
  });
1191
1482
  }
1192
1483
  });
1484
+ router$5.post("/api/v1/view/candles_live", async (req, res) => {
1485
+ try {
1486
+ const request = await micro.json(req);
1487
+ const { signalId, interval, requestId, serviceName } = request;
1488
+ const data = await ioc.exchangeViewService.getLiveCandles(signalId, interval);
1489
+ const result = {
1490
+ data,
1491
+ status: "ok",
1492
+ error: "",
1493
+ requestId,
1494
+ serviceName,
1495
+ };
1496
+ ioc.loggerService.log("/api/v1/view/candles_live ok", {
1497
+ request,
1498
+ result: omit(result, "data"),
1499
+ });
1500
+ return await micro.send(res, 200, result);
1501
+ }
1502
+ catch (error) {
1503
+ ioc.loggerService.log("/api/v1/view/candles_live error", {
1504
+ error: errorData(error),
1505
+ });
1506
+ return await micro.send(res, 200, {
1507
+ status: "error",
1508
+ error: getErrorMessage(error),
1509
+ });
1510
+ }
1511
+ });
1193
1512
  // NotificationViewService endpoints
1194
1513
  router$5.post("/api/v1/view/notification_list", async (req, res) => {
1195
1514
  try {
@@ -1448,6 +1767,64 @@ router$5.post("/api/v1/view/log_filter", async (req, res) => {
1448
1767
  });
1449
1768
  }
1450
1769
  });
1770
+ // StatusViewService endpoints
1771
+ router$5.post("/api/v1/view/status_list", async (req, res) => {
1772
+ try {
1773
+ const request = await micro.json(req);
1774
+ const { requestId, serviceName } = request;
1775
+ const data = await ioc.statusViewService.getStatusList();
1776
+ const result = {
1777
+ data,
1778
+ status: "ok",
1779
+ error: "",
1780
+ requestId,
1781
+ serviceName,
1782
+ };
1783
+ ioc.loggerService.log("/api/v1/view/status_list ok", {
1784
+ request,
1785
+ result: omit(result, "data"),
1786
+ });
1787
+ return await micro.send(res, 200, result);
1788
+ }
1789
+ catch (error) {
1790
+ ioc.loggerService.log("/api/v1/view/status_list error", {
1791
+ error: errorData(error),
1792
+ });
1793
+ return await micro.send(res, 200, {
1794
+ status: "error",
1795
+ error: getErrorMessage(error),
1796
+ });
1797
+ }
1798
+ });
1799
+ router$5.post("/api/v1/view/status_one/:id", async (req, res) => {
1800
+ try {
1801
+ const request = await micro.json(req);
1802
+ const { requestId, serviceName } = request;
1803
+ const id = req.params.id;
1804
+ const data = await ioc.statusViewService.getStatusOne(id);
1805
+ const result = {
1806
+ data,
1807
+ status: "ok",
1808
+ error: "",
1809
+ requestId,
1810
+ serviceName,
1811
+ };
1812
+ ioc.loggerService.log("/api/v1/view/status_one/:id ok", {
1813
+ request,
1814
+ result: omit(result, "data"),
1815
+ });
1816
+ return await micro.send(res, 200, result);
1817
+ }
1818
+ catch (error) {
1819
+ ioc.loggerService.log("/api/v1/view/status_one/:id error", {
1820
+ error: errorData(error),
1821
+ });
1822
+ return await micro.send(res, 200, {
1823
+ status: "error",
1824
+ error: getErrorMessage(error),
1825
+ });
1826
+ }
1827
+ });
1451
1828
 
1452
1829
  const require$1 = createRequire(import.meta.url);
1453
1830
  function getModulesPath() {
@@ -0,0 +1 @@
1
+ import{f as n,az as o}from"./index-3gnGrSPi.js";const d=()=>n(o,{children:"\n body {\n background-color: #ddd !important;\n }\n "});export{d as B};
@@ -1 +1 @@
1
- import{f as e,i as t,B as r,J as s}from"./index-zSnwHsC4.js";const a=({className:a,symbol:i,style:o,sx:n})=>e(s,{children:async()=>{try{const s=(await t.symbolGlobalService.getSymbolMap())[i],l=null==s?void 0:s.icon,c=(null==s?void 0:s.color)||"#ccc";return e(r,{className:a,sx:{position:"relative",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:l?"transparent":c,...n},style:o,children:l?e("img",{loading:"lazy",crossOrigin:"anonymous",src:l,alt:i,style:{width:"100%",height:"100%",borderRadius:"50%",objectFit:"contain"},onError:e=>{const t=e.target,r=t.parentElement;r&&(r.style.background=c,t.style.display="none")}}):e(r,{sx:{width:"60%",height:"60%",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.2)"}})})}catch(s){return e(r,{className:a,sx:{position:"relative",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#ccc",...n},style:o,children:e(r,{sx:{width:"60%",height:"60%",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.2)"}})})}}});export{a as I};
1
+ import{f as e,i as t,B as r,J as s}from"./index-3gnGrSPi.js";const a=({className:a,symbol:i,style:o,sx:n})=>e(s,{children:async()=>{try{const s=(await t.symbolGlobalService.getSymbolMap())[i],l=null==s?void 0:s.icon,c=(null==s?void 0:s.color)||"#ccc";return e(r,{className:a,sx:{position:"relative",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:l?"transparent":c,...n},style:o,children:l?e("img",{loading:"lazy",crossOrigin:"anonymous",src:l,alt:i,style:{width:"100%",height:"100%",borderRadius:"50%",objectFit:"contain"},onError:e=>{const t=e.target,r=t.parentElement;r&&(r.style.background=c,t.style.display="none")}}):e(r,{sx:{width:"60%",height:"60%",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.2)"}})})}catch(s){return e(r,{className:a,sx:{position:"relative",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#ccc",...n},style:o,children:e(r,{sx:{width:"60%",height:"60%",borderRadius:"50%",backgroundColor:"rgba(255, 255, 255, 0.2)"}})})}}});export{a as I};
@@ -1 +1 @@
1
- import{c as o,f as r}from"./index-zSnwHsC4.js";const a=o(r("path",{d:"M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"}),"KeyboardArrowLeft");export{a as K};
1
+ import{c as o,f as r}from"./index-3gnGrSPi.js";const a=o(r("path",{d:"M15.41 16.59 10.83 12l4.58-4.59L14 6l-6 6 6 6 1.41-1.41z"}),"KeyboardArrowLeft");export{a as K};
@@ -1 +1 @@
1
- import{af as e,ag as t,K as a,ah as s,f as i,ai as n,aj as o,ak as r,al as d,am as m,an as p,ao as u,ap as x,c}from"./index-zSnwHsC4.js";const h=e(),l=["className","component","disableGutters","fixed","maxWidth","classes"],b=m(),f=h("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,t[`maxWidth${o(String(a.maxWidth))}`],a.fixed&&t.fixed,a.disableGutters&&t.disableGutters]}}),g=e=>r({props:e,name:"MuiContainer",defaultTheme:b});const W=function(e={}){const{createStyledComponent:r=f,useThemeProps:m=g,componentName:u="MuiContainer"}=e,x=r(({theme:e,ownerState:a})=>t({width:"100%",marginLeft:"auto",boxSizing:"border-box",marginRight:"auto",display:"block"},!a.disableGutters&&{paddingLeft:e.spacing(2),paddingRight:e.spacing(2),[e.breakpoints.up("sm")]:{paddingLeft:e.spacing(3),paddingRight:e.spacing(3)}}),({theme:e,ownerState:t})=>t.fixed&&Object.keys(e.breakpoints.values).reduce((t,a)=>{const s=a,i=e.breakpoints.values[s];return 0!==i&&(t[e.breakpoints.up(s)]={maxWidth:`${i}${e.breakpoints.unit}`}),t},{}),({theme:e,ownerState:a})=>t({},"xs"===a.maxWidth&&{[e.breakpoints.up("xs")]:{maxWidth:Math.max(e.breakpoints.values.xs,444)}},a.maxWidth&&"xs"!==a.maxWidth&&{[e.breakpoints.up(a.maxWidth)]:{maxWidth:`${e.breakpoints.values[a.maxWidth]}${e.breakpoints.unit}`}}));return a.forwardRef(function(e,a){const r=m(e),{className:c,component:h="div",disableGutters:b=!1,fixed:f=!1,maxWidth:g="lg"}=r,W=s(r,l),k=t({},r,{component:h,disableGutters:b,fixed:f,maxWidth:g}),S=((e,t)=>{const{classes:a,fixed:s,disableGutters:i,maxWidth:n}=e,r={root:["root",n&&`maxWidth${o(String(n))}`,s&&"fixed",i&&"disableGutters"]};return d(r,e=>p(t,e),a)})(k,u);return i(x,t({as:h,ownerState:k,className:n(S.root,c),ref:a},W))})}({createStyledComponent:x("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,t[`maxWidth${o(String(a.maxWidth))}`],a.fixed&&t.fixed,a.disableGutters&&t.disableGutters]}}),useThemeProps:e=>u({props:e,name:"MuiContainer"})}),k=c(i("path",{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"}),"Refresh");export{W as C,k as R};
1
+ import{aA as e,aB as t,r as a,aC as s,f as i,aD as n,aE as o,aF as r,aG as d,aH as m,aI as u,aJ as p,aK as x,c}from"./index-3gnGrSPi.js";const h=e(),l=["className","component","disableGutters","fixed","maxWidth","classes"],b=m(),f=h("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,t[`maxWidth${o(String(a.maxWidth))}`],a.fixed&&t.fixed,a.disableGutters&&t.disableGutters]}}),g=e=>r({props:e,name:"MuiContainer",defaultTheme:b});const W=function(e={}){const{createStyledComponent:r=f,useThemeProps:m=g,componentName:p="MuiContainer"}=e,x=r(({theme:e,ownerState:a})=>t({width:"100%",marginLeft:"auto",boxSizing:"border-box",marginRight:"auto",display:"block"},!a.disableGutters&&{paddingLeft:e.spacing(2),paddingRight:e.spacing(2),[e.breakpoints.up("sm")]:{paddingLeft:e.spacing(3),paddingRight:e.spacing(3)}}),({theme:e,ownerState:t})=>t.fixed&&Object.keys(e.breakpoints.values).reduce((t,a)=>{const s=a,i=e.breakpoints.values[s];return 0!==i&&(t[e.breakpoints.up(s)]={maxWidth:`${i}${e.breakpoints.unit}`}),t},{}),({theme:e,ownerState:a})=>t({},"xs"===a.maxWidth&&{[e.breakpoints.up("xs")]:{maxWidth:Math.max(e.breakpoints.values.xs,444)}},a.maxWidth&&"xs"!==a.maxWidth&&{[e.breakpoints.up(a.maxWidth)]:{maxWidth:`${e.breakpoints.values[a.maxWidth]}${e.breakpoints.unit}`}}));return a.forwardRef(function(e,a){const r=m(e),{className:c,component:h="div",disableGutters:b=!1,fixed:f=!1,maxWidth:g="lg"}=r,W=s(r,l),k=t({},r,{component:h,disableGutters:b,fixed:f,maxWidth:g}),S=((e,t)=>{const{classes:a,fixed:s,disableGutters:i,maxWidth:n}=e,r={root:["root",n&&`maxWidth${o(String(n))}`,s&&"fixed",i&&"disableGutters"]};return d(r,e=>u(t,e),a)})(k,p);return i(x,t({as:h,ownerState:k,className:n(S.root,c),ref:a},W))})}({createStyledComponent:x("div",{name:"MuiContainer",slot:"Root",overridesResolver:(e,t)=>{const{ownerState:a}=e;return[t.root,t[`maxWidth${o(String(a.maxWidth))}`],a.fixed&&t.fixed,a.disableGutters&&t.disableGutters]}}),useThemeProps:e=>p({props:e,name:"MuiContainer"})}),k=c(i("path",{d:"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"}),"Refresh");export{W as C,k as R};