[READ-ONLY] Mirror of https://github.com/probablykasper/starchart. GitHub star history graph starchart.kasper.space
chart github github-api github-star graph history star star-history stargazers stars
0

Configure Feed

Select the types of activity you want to include in your feed.

Add align feature

Kasper (Mar 14, 2023, 6:58 AM +0100) 2c842eaf 4c840778

+434 -309
+210 -251
package-lock.json
··· 12 12 "@typescript-eslint/eslint-plugin": "^5.54.1", 13 13 "@typescript-eslint/parser": "^5.54.1", 14 14 "apexcharts": "^3.37.1", 15 - "eslint": "^8.35.0", 15 + "eslint": "^8.36.0", 16 16 "eslint-config-prettier": "^8.7.0", 17 17 "eslint-plugin-svelte3": "^4.0.0", 18 18 "isomorphic-fetch": "^3.0.0", 19 19 "lightweight-charts": "^4.0.0", 20 - "modal-svelte": "^1.0.2", 20 + "modal-svelte": "^1.0.3", 21 21 "prettier": "^2.8.4", 22 22 "prettier-plugin-svelte": "^2.9.0", 23 - "sass": "^1.58.3", 23 + "sass": "^1.59.2", 24 24 "svelte": "^3.55.1", 25 25 "svelte-check": "^3.0.4", 26 - "svelte-lightweight-charts": "^2.0.0", 27 26 "typescript": "^4.9.5", 28 27 "vite": "^4.1.4" 29 28 } 30 29 }, 31 30 "node_modules/@cloudflare/workers-types": { 32 - "version": "4.20230228.0", 33 - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230228.0.tgz", 34 - "integrity": "sha512-tDaqH3DrKmDoe/YrCnzVSqjNH6GnUOOajv2Ztj2h7BPLFyYTb81iCkARgb+G4bpxhn7y4f1KxxDT2+Yp4rt7Hg==", 31 + "version": "4.20230307.0", 32 + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230307.0.tgz", 33 + "integrity": "sha512-Go968aDDcqONHQcUdgIiPRkPdT4QTzD0ecHJsI1u7ZiHPMOoZn+Dy7hYsdUJ5ldX9wTZDrICBM1rDKTRaDUitg==", 35 34 "dev": true 36 35 }, 37 36 "node_modules/@ctrl/tinycolor": { ··· 395 394 "node": ">=12" 396 395 } 397 396 }, 397 + "node_modules/@eslint-community/eslint-utils": { 398 + "version": "4.2.0", 399 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", 400 + "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", 401 + "dev": true, 402 + "dependencies": { 403 + "eslint-visitor-keys": "^3.3.0" 404 + }, 405 + "engines": { 406 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 407 + }, 408 + "peerDependencies": { 409 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 410 + } 411 + }, 412 + "node_modules/@eslint-community/regexpp": { 413 + "version": "4.4.0", 414 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", 415 + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", 416 + "dev": true, 417 + "engines": { 418 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 419 + } 420 + }, 398 421 "node_modules/@eslint/eslintrc": { 399 - "version": "2.0.0", 400 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", 401 - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", 422 + "version": "2.0.1", 423 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", 424 + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", 402 425 "dev": true, 403 426 "dependencies": { 404 427 "ajv": "^6.12.4", 405 428 "debug": "^4.3.2", 406 - "espree": "^9.4.0", 429 + "espree": "^9.5.0", 407 430 "globals": "^13.19.0", 408 431 "ignore": "^5.2.0", 409 432 "import-fresh": "^3.2.1", ··· 419 442 } 420 443 }, 421 444 "node_modules/@eslint/js": { 422 - "version": "8.35.0", 423 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", 424 - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", 445 + "version": "8.36.0", 446 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", 447 + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", 425 448 "dev": true, 426 449 "engines": { 427 450 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ··· 645 668 } 646 669 }, 647 670 "node_modules/@sveltejs/kit": { 648 - "version": "1.10.0", 649 - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.10.0.tgz", 650 - "integrity": "sha512-0P35zHrByfbF3Ym3RdQL+RvzgsCDSyO3imSwuZ67XAD5HoCQFF3a8Mhh0V3sObz3rc5aJd4Qn82UpAihJqZ6gQ==", 671 + "version": "1.11.0", 672 + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.11.0.tgz", 673 + "integrity": "sha512-PwViZcMoLgEU/jhLoSyjf5hSrHS67wvSm0ifBo4prP9irpGa5HuPOZeVDTL5tPDSBoKxtdYi1zlGdoiJfO86jA==", 651 674 "dev": true, 652 675 "hasInstallScript": true, 653 676 "dependencies": { ··· 744 767 "dev": true 745 768 }, 746 769 "node_modules/@typescript-eslint/eslint-plugin": { 747 - "version": "5.54.1", 748 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", 749 - "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", 770 + "version": "5.55.0", 771 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", 772 + "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", 750 773 "dev": true, 751 774 "dependencies": { 752 - "@typescript-eslint/scope-manager": "5.54.1", 753 - "@typescript-eslint/type-utils": "5.54.1", 754 - "@typescript-eslint/utils": "5.54.1", 775 + "@eslint-community/regexpp": "^4.4.0", 776 + "@typescript-eslint/scope-manager": "5.55.0", 777 + "@typescript-eslint/type-utils": "5.55.0", 778 + "@typescript-eslint/utils": "5.55.0", 755 779 "debug": "^4.3.4", 756 780 "grapheme-splitter": "^1.0.4", 757 781 "ignore": "^5.2.0", 758 782 "natural-compare-lite": "^1.4.0", 759 - "regexpp": "^3.2.0", 760 783 "semver": "^7.3.7", 761 784 "tsutils": "^3.21.0" 762 785 }, ··· 778 801 } 779 802 }, 780 803 "node_modules/@typescript-eslint/parser": { 781 - "version": "5.54.1", 782 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", 783 - "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", 804 + "version": "5.55.0", 805 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", 806 + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", 784 807 "dev": true, 785 808 "dependencies": { 786 - "@typescript-eslint/scope-manager": "5.54.1", 787 - "@typescript-eslint/types": "5.54.1", 788 - "@typescript-eslint/typescript-estree": "5.54.1", 809 + "@typescript-eslint/scope-manager": "5.55.0", 810 + "@typescript-eslint/types": "5.55.0", 811 + "@typescript-eslint/typescript-estree": "5.55.0", 789 812 "debug": "^4.3.4" 790 813 }, 791 814 "engines": { ··· 805 828 } 806 829 }, 807 830 "node_modules/@typescript-eslint/scope-manager": { 808 - "version": "5.54.1", 809 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", 810 - "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", 831 + "version": "5.55.0", 832 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", 833 + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", 811 834 "dev": true, 812 835 "dependencies": { 813 - "@typescript-eslint/types": "5.54.1", 814 - "@typescript-eslint/visitor-keys": "5.54.1" 836 + "@typescript-eslint/types": "5.55.0", 837 + "@typescript-eslint/visitor-keys": "5.55.0" 815 838 }, 816 839 "engines": { 817 840 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ··· 822 845 } 823 846 }, 824 847 "node_modules/@typescript-eslint/type-utils": { 825 - "version": "5.54.1", 826 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", 827 - "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", 848 + "version": "5.55.0", 849 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", 850 + "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", 828 851 "dev": true, 829 852 "dependencies": { 830 - "@typescript-eslint/typescript-estree": "5.54.1", 831 - "@typescript-eslint/utils": "5.54.1", 853 + "@typescript-eslint/typescript-estree": "5.55.0", 854 + "@typescript-eslint/utils": "5.55.0", 832 855 "debug": "^4.3.4", 833 856 "tsutils": "^3.21.0" 834 857 }, ··· 849 872 } 850 873 }, 851 874 "node_modules/@typescript-eslint/types": { 852 - "version": "5.54.1", 853 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", 854 - "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", 875 + "version": "5.55.0", 876 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", 877 + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", 855 878 "dev": true, 856 879 "engines": { 857 880 "node": "^12.22.0 || ^14.17.0 || >=16.0.0" ··· 862 885 } 863 886 }, 864 887 "node_modules/@typescript-eslint/typescript-estree": { 865 - "version": "5.54.1", 866 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", 867 - "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", 888 + "version": "5.55.0", 889 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", 890 + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", 868 891 "dev": true, 869 892 "dependencies": { 870 - "@typescript-eslint/types": "5.54.1", 871 - "@typescript-eslint/visitor-keys": "5.54.1", 893 + "@typescript-eslint/types": "5.55.0", 894 + "@typescript-eslint/visitor-keys": "5.55.0", 872 895 "debug": "^4.3.4", 873 896 "globby": "^11.1.0", 874 897 "is-glob": "^4.0.3", ··· 889 912 } 890 913 }, 891 914 "node_modules/@typescript-eslint/utils": { 892 - "version": "5.54.1", 893 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", 894 - "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", 915 + "version": "5.55.0", 916 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", 917 + "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", 895 918 "dev": true, 896 919 "dependencies": { 920 + "@eslint-community/eslint-utils": "^4.2.0", 897 921 "@types/json-schema": "^7.0.9", 898 922 "@types/semver": "^7.3.12", 899 - "@typescript-eslint/scope-manager": "5.54.1", 900 - "@typescript-eslint/types": "5.54.1", 901 - "@typescript-eslint/typescript-estree": "5.54.1", 923 + "@typescript-eslint/scope-manager": "5.55.0", 924 + "@typescript-eslint/types": "5.55.0", 925 + "@typescript-eslint/typescript-estree": "5.55.0", 902 926 "eslint-scope": "^5.1.1", 903 - "eslint-utils": "^3.0.0", 904 927 "semver": "^7.3.7" 905 928 }, 906 929 "engines": { ··· 915 938 } 916 939 }, 917 940 "node_modules/@typescript-eslint/visitor-keys": { 918 - "version": "5.54.1", 919 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", 920 - "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", 941 + "version": "5.55.0", 942 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", 943 + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", 921 944 "dev": true, 922 945 "dependencies": { 923 - "@typescript-eslint/types": "5.54.1", 946 + "@typescript-eslint/types": "5.55.0", 924 947 "eslint-visitor-keys": "^3.3.0" 925 948 }, 926 949 "engines": { ··· 1342 1365 } 1343 1366 }, 1344 1367 "node_modules/eslint": { 1345 - "version": "8.35.0", 1346 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", 1347 - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", 1368 + "version": "8.36.0", 1369 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", 1370 + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", 1348 1371 "dev": true, 1349 1372 "dependencies": { 1350 - "@eslint/eslintrc": "^2.0.0", 1351 - "@eslint/js": "8.35.0", 1373 + "@eslint-community/eslint-utils": "^4.2.0", 1374 + "@eslint-community/regexpp": "^4.4.0", 1375 + "@eslint/eslintrc": "^2.0.1", 1376 + "@eslint/js": "8.36.0", 1352 1377 "@humanwhocodes/config-array": "^0.11.8", 1353 1378 "@humanwhocodes/module-importer": "^1.0.1", 1354 1379 "@nodelib/fs.walk": "^1.2.8", ··· 1359 1384 "doctrine": "^3.0.0", 1360 1385 "escape-string-regexp": "^4.0.0", 1361 1386 "eslint-scope": "^7.1.1", 1362 - "eslint-utils": "^3.0.0", 1363 1387 "eslint-visitor-keys": "^3.3.0", 1364 - "espree": "^9.4.0", 1388 + "espree": "^9.5.0", 1365 1389 "esquery": "^1.4.2", 1366 1390 "esutils": "^2.0.2", 1367 1391 "fast-deep-equal": "^3.1.3", ··· 1383 1407 "minimatch": "^3.1.2", 1384 1408 "natural-compare": "^1.4.0", 1385 1409 "optionator": "^0.9.1", 1386 - "regexpp": "^3.2.0", 1387 1410 "strip-ansi": "^6.0.1", 1388 1411 "strip-json-comments": "^3.1.0", 1389 1412 "text-table": "^0.2.0" ··· 1433 1456 "node": ">=8.0.0" 1434 1457 } 1435 1458 }, 1436 - "node_modules/eslint-utils": { 1437 - "version": "3.0.0", 1438 - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 1439 - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 1440 - "dev": true, 1441 - "dependencies": { 1442 - "eslint-visitor-keys": "^2.0.0" 1443 - }, 1444 - "engines": { 1445 - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" 1446 - }, 1447 - "funding": { 1448 - "url": "https://github.com/sponsors/mysticatea" 1449 - }, 1450 - "peerDependencies": { 1451 - "eslint": ">=5" 1452 - } 1453 - }, 1454 - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { 1455 - "version": "2.1.0", 1456 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 1457 - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 1458 - "dev": true, 1459 - "engines": { 1460 - "node": ">=10" 1461 - } 1462 - }, 1463 1459 "node_modules/eslint-visitor-keys": { 1464 1460 "version": "3.3.0", 1465 1461 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", ··· 1498 1494 "dev": true 1499 1495 }, 1500 1496 "node_modules/espree": { 1501 - "version": "9.4.1", 1502 - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", 1503 - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", 1497 + "version": "9.5.0", 1498 + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", 1499 + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", 1504 1500 "dev": true, 1505 1501 "dependencies": { 1506 1502 "acorn": "^8.8.0", ··· 1842 1838 } 1843 1839 }, 1844 1840 "node_modules/immutable": { 1845 - "version": "4.2.4", 1846 - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", 1847 - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", 1841 + "version": "4.3.0", 1842 + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", 1843 + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", 1848 1844 "dev": true 1849 1845 }, 1850 1846 "node_modules/import-fresh": { ··· 2163 2159 } 2164 2160 }, 2165 2161 "node_modules/modal-svelte": { 2166 - "version": "1.0.2", 2167 - "resolved": "https://registry.npmjs.org/modal-svelte/-/modal-svelte-1.0.2.tgz", 2168 - "integrity": "sha512-w1X4biS9hIngtrGBYSNBkJKiS720HlbLbr1QjFJki7AJme+arYgbNW+KCt2uYvHtRmSl3tV4w+GzrV0AOk8teQ==", 2162 + "version": "1.0.3", 2163 + "resolved": "https://registry.npmjs.org/modal-svelte/-/modal-svelte-1.0.3.tgz", 2164 + "integrity": "sha512-g456NJwnyMfG+aqE1zVM4lqgAyB+bWhpsSnqVlJW9Gt86KiC73X/Vnd6+lGtdlU6G1KExHUjJmi31xn6SUcMwQ==", 2169 2165 "dev": true, 2170 2166 "peerDependencies": { 2171 2167 "svelte": "^3.0.0" ··· 2484 2480 "node": ">=8" 2485 2481 } 2486 2482 }, 2487 - "node_modules/regexpp": { 2488 - "version": "3.2.0", 2489 - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 2490 - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 2491 - "dev": true, 2492 - "engines": { 2493 - "node": ">=8" 2494 - }, 2495 - "funding": { 2496 - "url": "https://github.com/sponsors/mysticatea" 2497 - } 2498 - }, 2499 2483 "node_modules/resolve": { 2500 2484 "version": "1.22.1", 2501 2485 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", ··· 2548 2532 } 2549 2533 }, 2550 2534 "node_modules/rollup": { 2551 - "version": "3.18.0", 2552 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.18.0.tgz", 2553 - "integrity": "sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==", 2535 + "version": "3.19.1", 2536 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.19.1.tgz", 2537 + "integrity": "sha512-lAbrdN7neYCg/8WaoWn/ckzCtz+jr70GFfYdlf50OF7387HTg+wiuiqJRFYawwSPpqfqDNYqK7smY/ks2iAudg==", 2554 2538 "dev": true, 2555 2539 "bin": { 2556 2540 "rollup": "dist/bin/rollup" ··· 2623 2607 } 2624 2608 }, 2625 2609 "node_modules/sass": { 2626 - "version": "1.58.3", 2627 - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", 2628 - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", 2610 + "version": "1.59.2", 2611 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.2.tgz", 2612 + "integrity": "sha512-jJyO6SmbzkJexF8MUorHx5tAilcgabioYxT/BHbY4+OvoqmbHxsYlrjZ8Adhqcgl6Zqwie0TgMXLCAmPFxXOuw==", 2629 2613 "dev": true, 2630 2614 "dependencies": { 2631 2615 "chokidar": ">=3.0.0 <4.0.0", ··· 2798 2782 } 2799 2783 }, 2800 2784 "node_modules/svelte": { 2801 - "version": "3.55.1", 2802 - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz", 2803 - "integrity": "sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==", 2785 + "version": "3.56.0", 2786 + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.56.0.tgz", 2787 + "integrity": "sha512-LvXiJbjdvJKwB/0CQyYpDX0q+hFqCyWmybzC2G6eK1tJJA/RSRCytTfNmjHv+RHlLuA70vWG7nXp6gbeErYvRA==", 2804 2788 "dev": true, 2805 2789 "engines": { 2806 2790 "node": ">= 8" 2807 2791 } 2808 2792 }, 2809 2793 "node_modules/svelte-check": { 2810 - "version": "3.0.4", 2811 - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.0.4.tgz", 2812 - "integrity": "sha512-feIyBAA5cSIxq4vq6mwGvGQTHy/wBVQbs5b+/VvE21WN8X7nonAuSqwvZv0UDBowzRka3Rh4gmLPH8rPePz3/w==", 2794 + "version": "3.1.4", 2795 + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.1.4.tgz", 2796 + "integrity": "sha512-25Lb46ZS4IK/XpBMe4IBMrtYf23V8alqBX+szXoccb7uM0D2Wqq5rMRzYBONZnFVuU1bQG3R50lyIT5eRewv2g==", 2813 2797 "dev": true, 2814 2798 "dependencies": { 2815 2799 "@jridgewell/trace-mapping": "^0.3.17", ··· 2838 2822 }, 2839 2823 "peerDependencies": { 2840 2824 "svelte": ">=3.19.0" 2841 - } 2842 - }, 2843 - "node_modules/svelte-lightweight-charts": { 2844 - "version": "2.0.0", 2845 - "resolved": "https://registry.npmjs.org/svelte-lightweight-charts/-/svelte-lightweight-charts-2.0.0.tgz", 2846 - "integrity": "sha512-dNvdBIiMtefUoysnF/3HbkkNk0iyytbT78gpTQz/y67A65l8eKtJFxAJForWx0kXdAX58RU6Cfp7ZGSq7XxjGg==", 2847 - "dev": true, 2848 - "peerDependencies": { 2849 - "lightweight-charts": ">=4.0.0", 2850 - "svelte": ">=3.44.0" 2851 2825 } 2852 2826 }, 2853 2827 "node_modules/svelte-preprocess": { ··· 3293 3267 }, 3294 3268 "dependencies": { 3295 3269 "@cloudflare/workers-types": { 3296 - "version": "4.20230228.0", 3297 - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230228.0.tgz", 3298 - "integrity": "sha512-tDaqH3DrKmDoe/YrCnzVSqjNH6GnUOOajv2Ztj2h7BPLFyYTb81iCkARgb+G4bpxhn7y4f1KxxDT2+Yp4rt7Hg==", 3270 + "version": "4.20230307.0", 3271 + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20230307.0.tgz", 3272 + "integrity": "sha512-Go968aDDcqONHQcUdgIiPRkPdT4QTzD0ecHJsI1u7ZiHPMOoZn+Dy7hYsdUJ5ldX9wTZDrICBM1rDKTRaDUitg==", 3299 3273 "dev": true 3300 3274 }, 3301 3275 "@ctrl/tinycolor": { ··· 3457 3431 "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", 3458 3432 "dev": true, 3459 3433 "optional": true 3434 + }, 3435 + "@eslint-community/eslint-utils": { 3436 + "version": "4.2.0", 3437 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", 3438 + "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", 3439 + "dev": true, 3440 + "requires": { 3441 + "eslint-visitor-keys": "^3.3.0" 3442 + } 3443 + }, 3444 + "@eslint-community/regexpp": { 3445 + "version": "4.4.0", 3446 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", 3447 + "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", 3448 + "dev": true 3460 3449 }, 3461 3450 "@eslint/eslintrc": { 3462 - "version": "2.0.0", 3463 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", 3464 - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", 3451 + "version": "2.0.1", 3452 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", 3453 + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", 3465 3454 "dev": true, 3466 3455 "requires": { 3467 3456 "ajv": "^6.12.4", 3468 3457 "debug": "^4.3.2", 3469 - "espree": "^9.4.0", 3458 + "espree": "^9.5.0", 3470 3459 "globals": "^13.19.0", 3471 3460 "ignore": "^5.2.0", 3472 3461 "import-fresh": "^3.2.1", ··· 3476 3465 } 3477 3466 }, 3478 3467 "@eslint/js": { 3479 - "version": "8.35.0", 3480 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", 3481 - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", 3468 + "version": "8.36.0", 3469 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", 3470 + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", 3482 3471 "dev": true 3483 3472 }, 3484 3473 "@humanwhocodes/config-array": { ··· 3656 3645 } 3657 3646 }, 3658 3647 "@sveltejs/kit": { 3659 - "version": "1.10.0", 3660 - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.10.0.tgz", 3661 - "integrity": "sha512-0P35zHrByfbF3Ym3RdQL+RvzgsCDSyO3imSwuZ67XAD5HoCQFF3a8Mhh0V3sObz3rc5aJd4Qn82UpAihJqZ6gQ==", 3648 + "version": "1.11.0", 3649 + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.11.0.tgz", 3650 + "integrity": "sha512-PwViZcMoLgEU/jhLoSyjf5hSrHS67wvSm0ifBo4prP9irpGa5HuPOZeVDTL5tPDSBoKxtdYi1zlGdoiJfO86jA==", 3662 3651 "dev": true, 3663 3652 "requires": { 3664 3653 "@sveltejs/vite-plugin-svelte": "^2.0.0", ··· 3735 3724 "dev": true 3736 3725 }, 3737 3726 "@typescript-eslint/eslint-plugin": { 3738 - "version": "5.54.1", 3739 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.1.tgz", 3740 - "integrity": "sha512-a2RQAkosH3d3ZIV08s3DcL/mcGc2M/UC528VkPULFxR9VnVPT8pBu0IyBAJJmVsCmhVfwQX1v6q+QGnmSe1bew==", 3727 + "version": "5.55.0", 3728 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", 3729 + "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", 3741 3730 "dev": true, 3742 3731 "requires": { 3743 - "@typescript-eslint/scope-manager": "5.54.1", 3744 - "@typescript-eslint/type-utils": "5.54.1", 3745 - "@typescript-eslint/utils": "5.54.1", 3732 + "@eslint-community/regexpp": "^4.4.0", 3733 + "@typescript-eslint/scope-manager": "5.55.0", 3734 + "@typescript-eslint/type-utils": "5.55.0", 3735 + "@typescript-eslint/utils": "5.55.0", 3746 3736 "debug": "^4.3.4", 3747 3737 "grapheme-splitter": "^1.0.4", 3748 3738 "ignore": "^5.2.0", 3749 3739 "natural-compare-lite": "^1.4.0", 3750 - "regexpp": "^3.2.0", 3751 3740 "semver": "^7.3.7", 3752 3741 "tsutils": "^3.21.0" 3753 3742 } 3754 3743 }, 3755 3744 "@typescript-eslint/parser": { 3756 - "version": "5.54.1", 3757 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.54.1.tgz", 3758 - "integrity": "sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==", 3745 + "version": "5.55.0", 3746 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", 3747 + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", 3759 3748 "dev": true, 3760 3749 "requires": { 3761 - "@typescript-eslint/scope-manager": "5.54.1", 3762 - "@typescript-eslint/types": "5.54.1", 3763 - "@typescript-eslint/typescript-estree": "5.54.1", 3750 + "@typescript-eslint/scope-manager": "5.55.0", 3751 + "@typescript-eslint/types": "5.55.0", 3752 + "@typescript-eslint/typescript-estree": "5.55.0", 3764 3753 "debug": "^4.3.4" 3765 3754 } 3766 3755 }, 3767 3756 "@typescript-eslint/scope-manager": { 3768 - "version": "5.54.1", 3769 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.1.tgz", 3770 - "integrity": "sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==", 3757 + "version": "5.55.0", 3758 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", 3759 + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", 3771 3760 "dev": true, 3772 3761 "requires": { 3773 - "@typescript-eslint/types": "5.54.1", 3774 - "@typescript-eslint/visitor-keys": "5.54.1" 3762 + "@typescript-eslint/types": "5.55.0", 3763 + "@typescript-eslint/visitor-keys": "5.55.0" 3775 3764 } 3776 3765 }, 3777 3766 "@typescript-eslint/type-utils": { 3778 - "version": "5.54.1", 3779 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.1.tgz", 3780 - "integrity": "sha512-WREHsTz0GqVYLIbzIZYbmUUr95DKEKIXZNH57W3s+4bVnuF1TKe2jH8ZNH8rO1CeMY3U4j4UQeqPNkHMiGem3g==", 3767 + "version": "5.55.0", 3768 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", 3769 + "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", 3781 3770 "dev": true, 3782 3771 "requires": { 3783 - "@typescript-eslint/typescript-estree": "5.54.1", 3784 - "@typescript-eslint/utils": "5.54.1", 3772 + "@typescript-eslint/typescript-estree": "5.55.0", 3773 + "@typescript-eslint/utils": "5.55.0", 3785 3774 "debug": "^4.3.4", 3786 3775 "tsutils": "^3.21.0" 3787 3776 } 3788 3777 }, 3789 3778 "@typescript-eslint/types": { 3790 - "version": "5.54.1", 3791 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.1.tgz", 3792 - "integrity": "sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==", 3779 + "version": "5.55.0", 3780 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", 3781 + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", 3793 3782 "dev": true 3794 3783 }, 3795 3784 "@typescript-eslint/typescript-estree": { 3796 - "version": "5.54.1", 3797 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.1.tgz", 3798 - "integrity": "sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==", 3785 + "version": "5.55.0", 3786 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", 3787 + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", 3799 3788 "dev": true, 3800 3789 "requires": { 3801 - "@typescript-eslint/types": "5.54.1", 3802 - "@typescript-eslint/visitor-keys": "5.54.1", 3790 + "@typescript-eslint/types": "5.55.0", 3791 + "@typescript-eslint/visitor-keys": "5.55.0", 3803 3792 "debug": "^4.3.4", 3804 3793 "globby": "^11.1.0", 3805 3794 "is-glob": "^4.0.3", ··· 3808 3797 } 3809 3798 }, 3810 3799 "@typescript-eslint/utils": { 3811 - "version": "5.54.1", 3812 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.1.tgz", 3813 - "integrity": "sha512-IY5dyQM8XD1zfDe5X8jegX6r2EVU5o/WJnLu/znLPWCBF7KNGC+adacXnt5jEYS9JixDcoccI6CvE4RCjHMzCQ==", 3800 + "version": "5.55.0", 3801 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", 3802 + "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", 3814 3803 "dev": true, 3815 3804 "requires": { 3805 + "@eslint-community/eslint-utils": "^4.2.0", 3816 3806 "@types/json-schema": "^7.0.9", 3817 3807 "@types/semver": "^7.3.12", 3818 - "@typescript-eslint/scope-manager": "5.54.1", 3819 - "@typescript-eslint/types": "5.54.1", 3820 - "@typescript-eslint/typescript-estree": "5.54.1", 3808 + "@typescript-eslint/scope-manager": "5.55.0", 3809 + "@typescript-eslint/types": "5.55.0", 3810 + "@typescript-eslint/typescript-estree": "5.55.0", 3821 3811 "eslint-scope": "^5.1.1", 3822 - "eslint-utils": "^3.0.0", 3823 3812 "semver": "^7.3.7" 3824 3813 } 3825 3814 }, 3826 3815 "@typescript-eslint/visitor-keys": { 3827 - "version": "5.54.1", 3828 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.1.tgz", 3829 - "integrity": "sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==", 3816 + "version": "5.55.0", 3817 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", 3818 + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", 3830 3819 "dev": true, 3831 3820 "requires": { 3832 - "@typescript-eslint/types": "5.54.1", 3821 + "@typescript-eslint/types": "5.55.0", 3833 3822 "eslint-visitor-keys": "^3.3.0" 3834 3823 } 3835 3824 }, ··· 4142 4131 "dev": true 4143 4132 }, 4144 4133 "eslint": { 4145 - "version": "8.35.0", 4146 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", 4147 - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", 4134 + "version": "8.36.0", 4135 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", 4136 + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", 4148 4137 "dev": true, 4149 4138 "requires": { 4150 - "@eslint/eslintrc": "^2.0.0", 4151 - "@eslint/js": "8.35.0", 4139 + "@eslint-community/eslint-utils": "^4.2.0", 4140 + "@eslint-community/regexpp": "^4.4.0", 4141 + "@eslint/eslintrc": "^2.0.1", 4142 + "@eslint/js": "8.36.0", 4152 4143 "@humanwhocodes/config-array": "^0.11.8", 4153 4144 "@humanwhocodes/module-importer": "^1.0.1", 4154 4145 "@nodelib/fs.walk": "^1.2.8", ··· 4159 4150 "doctrine": "^3.0.0", 4160 4151 "escape-string-regexp": "^4.0.0", 4161 4152 "eslint-scope": "^7.1.1", 4162 - "eslint-utils": "^3.0.0", 4163 4153 "eslint-visitor-keys": "^3.3.0", 4164 - "espree": "^9.4.0", 4154 + "espree": "^9.5.0", 4165 4155 "esquery": "^1.4.2", 4166 4156 "esutils": "^2.0.2", 4167 4157 "fast-deep-equal": "^3.1.3", ··· 4183 4173 "minimatch": "^3.1.2", 4184 4174 "natural-compare": "^1.4.0", 4185 4175 "optionator": "^0.9.1", 4186 - "regexpp": "^3.2.0", 4187 4176 "strip-ansi": "^6.0.1", 4188 4177 "strip-json-comments": "^3.1.0", 4189 4178 "text-table": "^0.2.0" ··· 4231 4220 "estraverse": "^4.1.1" 4232 4221 } 4233 4222 }, 4234 - "eslint-utils": { 4235 - "version": "3.0.0", 4236 - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", 4237 - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", 4238 - "dev": true, 4239 - "requires": { 4240 - "eslint-visitor-keys": "^2.0.0" 4241 - }, 4242 - "dependencies": { 4243 - "eslint-visitor-keys": { 4244 - "version": "2.1.0", 4245 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 4246 - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 4247 - "dev": true 4248 - } 4249 - } 4250 - }, 4251 4223 "eslint-visitor-keys": { 4252 4224 "version": "3.3.0", 4253 4225 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", ··· 4261 4233 "dev": true 4262 4234 }, 4263 4235 "espree": { 4264 - "version": "9.4.1", 4265 - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", 4266 - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", 4236 + "version": "9.5.0", 4237 + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", 4238 + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", 4267 4239 "dev": true, 4268 4240 "requires": { 4269 4241 "acorn": "^8.8.0", ··· 4529 4501 "dev": true 4530 4502 }, 4531 4503 "immutable": { 4532 - "version": "4.2.4", 4533 - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", 4534 - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", 4504 + "version": "4.3.0", 4505 + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", 4506 + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", 4535 4507 "dev": true 4536 4508 }, 4537 4509 "import-fresh": { ··· 4771 4743 } 4772 4744 }, 4773 4745 "modal-svelte": { 4774 - "version": "1.0.2", 4775 - "resolved": "https://registry.npmjs.org/modal-svelte/-/modal-svelte-1.0.2.tgz", 4776 - "integrity": "sha512-w1X4biS9hIngtrGBYSNBkJKiS720HlbLbr1QjFJki7AJme+arYgbNW+KCt2uYvHtRmSl3tV4w+GzrV0AOk8teQ==", 4746 + "version": "1.0.3", 4747 + "resolved": "https://registry.npmjs.org/modal-svelte/-/modal-svelte-1.0.3.tgz", 4748 + "integrity": "sha512-g456NJwnyMfG+aqE1zVM4lqgAyB+bWhpsSnqVlJW9Gt86KiC73X/Vnd6+lGtdlU6G1KExHUjJmi31xn6SUcMwQ==", 4777 4749 "dev": true, 4778 4750 "requires": {} 4779 4751 }, ··· 4977 4949 "integrity": "sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==", 4978 4950 "dev": true 4979 4951 }, 4980 - "regexpp": { 4981 - "version": "3.2.0", 4982 - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 4983 - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 4984 - "dev": true 4985 - }, 4986 4952 "resolve": { 4987 4953 "version": "1.22.1", 4988 4954 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", ··· 5016 4982 } 5017 4983 }, 5018 4984 "rollup": { 5019 - "version": "3.18.0", 5020 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.18.0.tgz", 5021 - "integrity": "sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==", 4985 + "version": "3.19.1", 4986 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.19.1.tgz", 4987 + "integrity": "sha512-lAbrdN7neYCg/8WaoWn/ckzCtz+jr70GFfYdlf50OF7387HTg+wiuiqJRFYawwSPpqfqDNYqK7smY/ks2iAudg==", 5022 4988 "dev": true, 5023 4989 "requires": { 5024 4990 "fsevents": "~2.3.2" ··· 5066 5032 } 5067 5033 }, 5068 5034 "sass": { 5069 - "version": "1.58.3", 5070 - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", 5071 - "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", 5035 + "version": "1.59.2", 5036 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.59.2.tgz", 5037 + "integrity": "sha512-jJyO6SmbzkJexF8MUorHx5tAilcgabioYxT/BHbY4+OvoqmbHxsYlrjZ8Adhqcgl6Zqwie0TgMXLCAmPFxXOuw==", 5072 5038 "dev": true, 5073 5039 "requires": { 5074 5040 "chokidar": ">=3.0.0 <4.0.0", ··· 5187 5153 "dev": true 5188 5154 }, 5189 5155 "svelte": { 5190 - "version": "3.55.1", 5191 - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.55.1.tgz", 5192 - "integrity": "sha512-S+87/P0Ve67HxKkEV23iCdAh/SX1xiSfjF1HOglno/YTbSTW7RniICMCofWGdJJbdjw3S+0PfFb1JtGfTXE0oQ==", 5156 + "version": "3.56.0", 5157 + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.56.0.tgz", 5158 + "integrity": "sha512-LvXiJbjdvJKwB/0CQyYpDX0q+hFqCyWmybzC2G6eK1tJJA/RSRCytTfNmjHv+RHlLuA70vWG7nXp6gbeErYvRA==", 5193 5159 "dev": true 5194 5160 }, 5195 5161 "svelte-check": { 5196 - "version": "3.0.4", 5197 - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.0.4.tgz", 5198 - "integrity": "sha512-feIyBAA5cSIxq4vq6mwGvGQTHy/wBVQbs5b+/VvE21WN8X7nonAuSqwvZv0UDBowzRka3Rh4gmLPH8rPePz3/w==", 5162 + "version": "3.1.4", 5163 + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.1.4.tgz", 5164 + "integrity": "sha512-25Lb46ZS4IK/XpBMe4IBMrtYf23V8alqBX+szXoccb7uM0D2Wqq5rMRzYBONZnFVuU1bQG3R50lyIT5eRewv2g==", 5199 5165 "dev": true, 5200 5166 "requires": { 5201 5167 "@jridgewell/trace-mapping": "^0.3.17", ··· 5212 5178 "version": "0.15.1", 5213 5179 "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.1.tgz", 5214 5180 "integrity": "sha512-BiKB4RZ8YSwRKCNVdNxK/GfY+r4Kjgp9jCLEy0DuqAKfmQtpL38cQK3afdpjw4sqSs4PLi3jIPJIFp259NkZtA==", 5215 - "dev": true, 5216 - "requires": {} 5217 - }, 5218 - "svelte-lightweight-charts": { 5219 - "version": "2.0.0", 5220 - "resolved": "https://registry.npmjs.org/svelte-lightweight-charts/-/svelte-lightweight-charts-2.0.0.tgz", 5221 - "integrity": "sha512-dNvdBIiMtefUoysnF/3HbkkNk0iyytbT78gpTQz/y67A65l8eKtJFxAJForWx0kXdAX58RU6Cfp7ZGSq7XxjGg==", 5222 5181 "dev": true, 5223 5182 "requires": {} 5224 5183 },
+8 -9
package.json
··· 12 12 "@ctrl/tinycolor": "^3.6.0", 13 13 "@octokit/core": "^4.2.0", 14 14 "@sveltejs/adapter-cloudflare": "^2.2.0", 15 - "@sveltejs/kit": "^1.10.0", 16 - "@typescript-eslint/eslint-plugin": "^5.54.1", 17 - "@typescript-eslint/parser": "^5.54.1", 15 + "@sveltejs/kit": "^1.11.0", 16 + "@typescript-eslint/eslint-plugin": "^5.55.0", 17 + "@typescript-eslint/parser": "^5.55.0", 18 18 "apexcharts": "^3.37.1", 19 - "eslint": "^8.35.0", 19 + "eslint": "^8.36.0", 20 20 "eslint-config-prettier": "^8.7.0", 21 21 "eslint-plugin-svelte3": "^4.0.0", 22 22 "isomorphic-fetch": "^3.0.0", 23 23 "lightweight-charts": "^4.0.0", 24 - "modal-svelte": "^1.0.2", 24 + "modal-svelte": "^1.0.3", 25 25 "prettier": "^2.8.4", 26 26 "prettier-plugin-svelte": "^2.9.0", 27 - "sass": "^1.58.3", 28 - "svelte": "^3.55.1", 29 - "svelte-check": "^3.0.4", 30 - "svelte-lightweight-charts": "^2.0.0", 27 + "sass": "^1.59.2", 28 + "svelte": "^3.56.0", 29 + "svelte-check": "^3.1.4", 31 30 "typescript": "^4.9.5", 32 31 "vite": "^4.1.4" 33 32 },
+1 -1
src/app.sass
··· 36 36 background-color: transparent 37 37 transition: 120ms ease-out border-color, 80ms ease-out all 38 38 &:focus-visible 39 - outline: none 39 + outline: 1px solid transparent 40 40 border-color: #cbcaf7 41 41 .button 42 42 transition: 120ms ease-out all
+55 -6
src/routes/+page.svelte
··· 11 11 12 12 let [owner, repo] = ['', ''] 13 13 14 - let chart: Chart 14 + let chart: Chart | undefined 15 15 16 16 async function getStargazers(owner: string, repo: string) { 17 + if (!chart || !$chart) { 18 + addError('Chart not initialized') 19 + return 20 + } 17 21 for (const line of $chart.lines) { 18 22 if (line.name === `${owner}/${repo}`) { 19 23 return // already added ··· 116 120 </div> 117 121 {/each} 118 122 119 - {#if $chart?.lines.length > 0} 120 - <ChartComponent {chart} /> 123 + {#if chart && $chart && $chart.lines.length > 0} 124 + <ChartComponent bind:chart /> 121 125 {/if} 122 126 <div class="chart" bind:clientWidth={width}> 123 127 <div bind:this={container} class:hidden={!$chart || $chart.lines.length === 0} /> 124 - {#if $chart?.lines.length > 0} 128 + {#if chart && $chart && $chart.lines.length > 0} 125 129 <Tooltip {chart} /> 126 130 {/if} 127 131 </div> 128 132 133 + <div class="bottom-bar"> 134 + {#if chart && $chart && $chart.lines.length > 0} 135 + <label> 136 + <input 137 + type="checkbox" 138 + checked={$chart.align} 139 + on:input={(e) => { 140 + if (!chart) { 141 + return 142 + } else if (e.currentTarget.checked) { 143 + chart.alignLines() 144 + } else { 145 + chart.unalignLines() 146 + } 147 + }} 148 + /> 149 + Align 150 + </label> 151 + {/if} 152 + </div> 153 + 129 154 <style lang="sass"> 130 155 .error-container 131 156 padding-bottom: 1rem 132 157 .error 133 158 border: 2px solid hsla(0, 100%, 50%, 0.5) 134 159 background-color: hsla(0, 100%, 50%, 0.25) 135 - // color: hsl(0, 100%, 66%) 136 160 border-radius: 8px 137 161 padding: 0.75rem 1rem 138 162 font-weight: 500 ··· 154 178 opacity: 0.7 155 179 .chart 156 180 width: 100% 157 - margin-bottom: 50px 158 181 position: relative // for tooltip 159 182 .hidden 160 183 display: none 184 + .bottom-bar 185 + padding-top: 10px 186 + padding-bottom: 50px 187 + label 188 + padding: 0.5rem 0.375rem 189 + font-size: 0.9375rem 190 + color: #FFFFFF 191 + display: inline-flex 192 + align-items: center 193 + user-select: none 194 + input[type='checkbox'] 195 + appearance: none 196 + margin: 0px 197 + margin-right: 6px 198 + padding: 0px 199 + width: 1rem 200 + height: 1rem 201 + background-color: hsl(224, 9%, 20%) 202 + border-radius: 4px 203 + border: 1px solid hsl(228, 3%, 50%) 204 + &:checked 205 + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e") 206 + &:focus-visible 207 + border-color: #cbcaf7 208 + box-shadow: 0 0 1px #cbcaf7 209 + outline: 1px solid transparent 161 210 </style>
+2 -2
src/routes/AccessToken.svelte
··· 19 19 class:yellow={!$token} 20 20 on:click={() => (editToken = true)} 21 21 > 22 - {$token ? 'Edit' : 'Add'} access token 22 + {$token ? 'Auth token' : 'Set auth token'} 23 23 </button> 24 24 {/if} 25 25 {#if editToken} ··· 64 64 input 65 65 width: 100% 66 66 &:focus-visible 67 - outline: none 67 + outline: 1px solid transparent 68 68 border-color: #cbcaf7 69 69 </style>
+1
src/routes/Chart.svelte
··· 70 70 flex-wrap: wrap 71 71 justify-content: center 72 72 gap: 8px 73 + padding-top: 8px 73 74 padding-bottom: 14px 74 75 </style>
+2 -2
src/routes/Label.svelte
··· 71 71 font-size: 0.9rem 72 72 font-weight: 500 73 73 transition: 100ms ease-out 74 - outline: none 74 + outline: 1px solid transparent 75 75 background-color: var(--color-2) 76 76 border-color: var(--color-1) 77 77 &:focus-visible ··· 87 87 border: none 88 88 color: inherit 89 89 padding: 0.175rem 0.5rem 90 - outline: none 90 + outline: 1px solid transparent 91 91 button.x 92 92 position: relative 93 93 transition: all 100ms ease-out
+5 -20
src/routes/Nav.svelte
··· 42 42 43 43 <style lang="sass"> 44 44 h1 45 - margin: 20px 0px 45 + margin: 0px 46 46 nav 47 47 display: grid 48 + padding-top: 20px 49 + padding-bottom: 14px 48 50 grid-template-areas: "left right" "mid mid" 49 51 grid-template-columns: 1fr 1fr 50 - // width: 100% 51 - // padding-top: 0.25rem 52 - // padding-bottom: 1rem 53 - 54 - // display: flex 55 - // align-items: center 56 - // flex-direction: column 57 - // justify-content: center 58 52 .repo-input.first 59 53 display: none 60 54 .repo-input.second 61 - margin-bottom: 20px 62 - @media (min-width: 768px) 55 + margin-top: 20px 56 + @media (min-width: 896px) 63 57 display: grid 64 58 grid-template-areas: "left mid right" 65 59 grid-template-columns: 192px 1fr 192px ··· 68 62 display: flex 69 63 .repo-input.second 70 64 display: none 71 - // display: flex 72 - // flex-direction: row 73 - // justify-content: space-between 74 - // .left, .right 75 - // width: 192px 76 - // .right 77 - // display: flex 78 - // justify-content: flex-end 79 65 .logo 80 66 display: flex 81 67 grid-area: left ··· 84 70 .menu 85 71 display: flex 86 72 align-items: center 87 - margin: 20px 0px 88 73 grid-area: right 89 74 justify-content: right 90 75 a
+150 -18
src/routes/chart.ts
··· 1 1 import { 2 2 createChart as createChartInstance, 3 + TickMarkType, 4 + type BusinessDay, 3 5 type ChartOptions, 4 6 type DeepPartial, 5 7 type IChartApi, ··· 34 36 } 35 37 36 38 /** Used to invalidate old localStorage */ 37 - const jsonTypeVersion = 2 39 + const jsonTypeVersion = 3 38 40 type Json = { 39 41 lines: LineJson[] 42 + align: boolean 40 43 v: number 41 44 expiry: number 42 45 } ··· 48 51 return value 49 52 } 50 53 51 - function loadJsonLines(): LineBase[] { 54 + function loadJson() { 52 55 try { 53 56 const seriesLocalStorage = JSON.parse(localStorage.getItem('starchart-series') || '{}') 54 57 if (seriesLocalStorage?.v === jsonTypeVersion && seriesLocalStorage?.expiry > Date.now()) { 55 - const lines = (seriesLocalStorage as Json).lines 56 - return lines.map( 58 + const json = seriesLocalStorage as Json 59 + const lineBases = json.lines.map( 57 60 (line): LineBase => ({ 58 61 color: line.color, 59 62 data: line.data.map((utcTimestamp, i): DataPoint => { ··· 66 69 name: line.name, 67 70 }) 68 71 ) 72 + return { 73 + lines: lineBases, 74 + align: json.align, 75 + } 69 76 } else { 70 77 localStorage.removeItem('starchart-series') 71 78 } 72 79 } catch (e) { 73 80 console.log('Could not load lines', e) 74 81 } 75 - return [] 82 + return { 83 + lines: [], 84 + align: false, 85 + } 76 86 } 77 87 78 88 type ChartData = { 79 89 instance: IChartApi 80 90 lines: Line[] 91 + align: boolean 81 92 container: HTMLElement 82 93 } 83 94 export type Chart = ReturnType<typeof newChart> 84 95 96 + const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 97 + 85 98 export function newChart(container: HTMLElement, options: DeepPartial<ChartOptions>) { 86 99 const chart: ChartData = { 87 100 instance: createChartInstance(container, options), 88 101 container, 102 + align: false, 89 103 lines: [], 90 104 } 91 105 const { subscribe, set } = writable(chart) 106 + 107 + const json = loadJson() 108 + chart.align = json.align 109 + 110 + function setDefaultFormatting() { 111 + chart.instance.applyOptions({ 112 + localization: { 113 + timeFormatter: (time: BusinessDay) => { 114 + const date = new Date(time.year, time.month - 1, time.day) 115 + return `${date.getDate()} ${months[date.getMonth()]} ${date.getFullYear()}` 116 + }, 117 + }, 118 + timeScale: { 119 + tickMarkFormatter: () => null, 120 + }, 121 + }) 122 + } 123 + setDefaultFormatting() 92 124 93 125 const fillerLine = chart.instance.addAreaSeries({ 94 126 priceScaleId: '', ··· 96 128 }) 97 129 98 130 function updateFiller(data: Line[]) { 99 - fillerLine.setData(getFiller(data)) 131 + if (chart.align && data.length > 0) { 132 + fillerLine.setData([]) 133 + } else { 134 + fillerLine.setData(getFiller(data, new Date())) 135 + } 100 136 } 101 137 102 138 const store = { ··· 119 155 if (lineJson.data.length >= 1) { 120 156 const start = lineJson.data[0] 121 157 const end = lineJson.final ?? lineJson.data[lineJson.data.length - 1] 122 - const chartData = toChartSeries(lineJson.data, start, end) 123 - series.setData(chartData) 158 + let chartSeries = toChartSeries(lineJson.data, start, end) 159 + console.log('addLine', chart.align) 160 + 161 + if (chart.align) { 162 + chartSeries = alignChartSeries(chartSeries) 163 + } 164 + series.setData(chartSeries) 124 165 } 125 166 const line: Line = { 126 167 ...lineJson, ··· 136 177 return line 137 178 }, 138 179 180 + alignLines() { 181 + chart.align = true 182 + store.save() 183 + for (const line of chart.lines) { 184 + if (line.deleted || line.data.length === 0) { 185 + continue 186 + } 187 + const start = line.data[0] 188 + const end = line.data[line.data.length - 1] 189 + const chartSeries = toChartSeries(line.data, start, end) 190 + const alignedChartSeries = alignChartSeries(chartSeries) 191 + line.instance.setData(alignedChartSeries) 192 + } 193 + const startDate = new Date(2001, 0) 194 + const day = 1000 * 3600 * 24 195 + const startDay = Math.ceil(startDate.getTime() / day) 196 + chart.instance.applyOptions({ 197 + localization: { 198 + timeFormatter: (time: BusinessDay) => { 199 + const date = new Date(time.year, time.month - 1, time.day) 200 + return Math.ceil(date.getTime() / day) - startDay + ' days' 201 + }, 202 + }, 203 + timeScale: { 204 + tickMarkFormatter: (time: BusinessDay, tickMarkType: TickMarkType) => { 205 + const date = new Date(time.year, time.month - 1, time.day) 206 + if (tickMarkType === TickMarkType.DayOfMonth) { 207 + return Math.ceil(date.getTime() / day) - startDay + 'd' 208 + } 209 + const years = date.getFullYear() - startDate.getFullYear() 210 + if (tickMarkType === TickMarkType.Month) { 211 + return date.getMonth() - startDate.getMonth() + 12 * years + 'm' 212 + } else if (tickMarkType === TickMarkType.Year) { 213 + switch (years) { 214 + case 0: 215 + return '0d' 216 + case 1: 217 + return '1y' 218 + default: 219 + return years + 'y' 220 + } 221 + } else { 222 + return null 223 + } 224 + }, 225 + }, 226 + }) 227 + updateFiller(chart.lines) 228 + set(chart) 229 + }, 230 + 231 + unalignLines() { 232 + chart.align = false 233 + store.save() 234 + for (const line of chart.lines) { 235 + if (line.deleted || line.data.length === 0) { 236 + continue 237 + } 238 + const start = line.data[0] 239 + const end = line.data[line.data.length - 1] 240 + const chartSeries = toChartSeries(line.data, start, end) 241 + line.instance.setData(chartSeries) 242 + } 243 + setDefaultFormatting() 244 + set(chart) 245 + }, 246 + 139 247 deleteLine(line: Line) { 140 248 chart.instance.removeSeries(line.instance) 141 249 line.deleted = true ··· 149 257 } 150 258 const start = line.data[line.data.length - 1] ?? data[0] 151 259 const end = line.final ?? data[data.length - 1] 152 - const chartData = toChartSeries(data, start, end) 260 + const chartSeries = toChartSeries(data, start, end) 153 261 const fresh = line.data.length === 0 154 262 155 263 if (fresh) { 156 - line.instance.setData(chartData) 264 + line.instance.setData(chartSeries) 157 265 } else { 158 - for (const dataPoint of chartData) { 266 + for (const dataPoint of chartSeries) { 159 267 line.instance.update(dataPoint) 160 268 } 161 269 } ··· 188 296 }, 189 297 } 190 298 191 - const jsonLines = loadJsonLines() 192 - for (const jsonLine of jsonLines) { 299 + for (const jsonLine of json.lines) { 193 300 store.addLine(jsonLine) 194 301 } 195 - if (jsonLines[jsonLines.length - 1]) { 196 - const lastColor = jsonLines[jsonLines.length - 1].color 302 + if (json.lines[json.lines.length - 1]) { 303 + const lastColor = json.lines[json.lines.length - 1].color 197 304 const lastColorIndex = hexColors.findIndex((color) => color === hexColors[lastColor]) 198 305 nextColorIndex = (lastColorIndex + 1) % hexColors.length 199 306 } ··· 201 308 return store 202 309 } 203 310 204 - function getFiller(data: Line[]) { 311 + /** Used to keep the full chart size even when some lines are hidden */ 312 + function getFiller(data: Line[], now: Date) { 205 313 let lowestDate = (Date.now() / 1000) as UTCTimestamp 206 314 for (const series of data) { 207 315 const dataPoint = series.data[0] ··· 209 317 lowestDate = dataPoint.t 210 318 } 211 319 } 212 - const now = new Date() 213 320 const dt = new Date(lowestDate * 1000) 214 321 const date = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate()) 215 322 ··· 252 359 const json: Json = { 253 360 lines: jsonLines, 254 361 v: jsonTypeVersion, 362 + align: chart.align, 255 363 expiry: Date.now() + day * 1, 256 364 } 257 365 localStorage.setItem('starchart-series', JSON.stringify(json)) 258 366 } 259 367 260 - function toChartSeries(data: DataPoint[], start: DataPoint, final: DataPoint) { 368 + type ChartSeries = { 369 + time: { 370 + year: number 371 + month: number 372 + day: number 373 + } 374 + value: number 375 + } 376 + function toChartSeries(data: DataPoint[], start: DataPoint, final: DataPoint): ChartSeries[] { 261 377 const dataPoints: { date: Date; value: number }[] = [] 262 378 263 379 for (const dataPoint of [start, ...data, final]) { ··· 299 415 } satisfies SingleValueData 300 416 }) 301 417 } 418 + 419 + function alignChartSeries(chartSeries: ChartSeries[]): ChartSeries[] { 420 + const date = new Date(2001, 0) 421 + return chartSeries.map((seriesPoint): ChartSeries => { 422 + const alignedSeriesPoint: ChartSeries = { 423 + time: { 424 + day: date.getDate(), 425 + month: date.getMonth() + 1, 426 + year: date.getFullYear(), 427 + }, 428 + value: seriesPoint.value, 429 + } 430 + date.setDate(date.getDate() + 1) 431 + return alignedSeriesPoint 432 + }) 433 + }