A simple SEO inspecter Tool, to get social media card previews

updated readme and fixed slow loading times

+74 -223
+5 -72
README.md
··· 1 - # Welcome to your Lovable project 2 - 3 - ## Project info 4 - 5 - **URL**: https://lovable.dev/projects/5473c358-3819-4116-b096-ac81f5835bea 6 - 7 - ## How can I edit this code? 8 - 9 - There are several ways of editing your application. 10 - 11 - **Use Lovable** 12 - 13 - Simply visit the [Lovable Project](https://lovable.dev/projects/5473c358-3819-4116-b096-ac81f5835bea) and start prompting. 14 - 15 - Changes made via Lovable will be committed automatically to this repo. 1 + # @madebydanny / seo-tester 16 2 17 - **Use your preferred IDE** 18 - 19 - If you want to work locally using your own IDE, you can clone this repo and push changes. Pushed changes will also be reflected in Lovable. 20 - 21 - The only requirement is having Node.js & npm installed - [install with nvm](https://github.com/nvm-sh/nvm#installing-and-updating) 22 - 23 - Follow these steps: 24 - 25 - ```sh 26 - # Step 1: Clone the repository using the project's Git URL. 27 - git clone <YOUR_GIT_URL> 28 - 29 - # Step 2: Navigate to the project directory. 30 - cd <YOUR_PROJECT_NAME> 31 - 32 - # Step 3: Install the necessary dependencies. 33 - npm i 34 - 35 - # Step 4: Start the development server with auto-reloading and an instant preview. 36 - npm run dev 37 - ``` 38 - 39 - **Edit a file directly in GitHub** 40 - 41 - - Navigate to the desired file(s). 42 - - Click the "Edit" button (pencil icon) at the top right of the file view. 43 - - Make your changes and commit the changes. 44 - 45 - **Use GitHub Codespaces** 46 - 47 - - Navigate to the main page of your repository. 48 - - Click on the "Code" button (green button) near the top right. 49 - - Select the "Codespaces" tab. 50 - - Click on "New codespace" to launch a new Codespace environment. 51 - - Edit files directly within the Codespace and commit and push your changes once you're done. 52 - 53 - ## What technologies are used for this project? 54 - 55 - This project is built with: 56 - 57 - - Vite 58 - - TypeScript 59 - - React 60 - - shadcn-ui 61 - - Tailwind CSS 62 - 63 - ## How can I deploy this project? 64 - 65 - Simply open [Lovable](https://lovable.dev/projects/5473c358-3819-4116-b096-ac81f5835bea) and click on Share -> Publish. 66 - 67 - ## Can I connect a custom domain to my Lovable project? 68 - 69 - Yes, you can! 70 - 71 - To connect a domain, navigate to Project > Settings > Domains and click Connect Domain. 72 - 73 - Read more here: [Setting up a custom domain](https://docs.lovable.dev/tips-tricks/custom-domain#step-by-step-guide) 3 + **Site Preview** 4 + ![img](https://altq.net/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreiceafmigyon4mg7dg4vgmur2doxppdgiouoxj7wxpnrbncohk7d3u) 5 + ![img](https://altq.net/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreief5clpgayifmwibr5tpb4wcx6u64g4fwgrm6eaukcqveaoucgp64) 6 + ![img](https://altq.net/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreifnlouxx5dmtznslfosspzd6kir2v7k5tz2kggymhxbpymtplg7ge)
+3 -115
package-lock.json
··· 84 84 "version": "5.2.0", 85 85 "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 86 86 "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 87 - "dev": true, 88 87 "license": "MIT", 89 88 "engines": { 90 89 "node": ">=10" ··· 848 847 "version": "8.0.2", 849 848 "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 850 849 "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 851 - "dev": true, 852 850 "license": "ISC", 853 851 "dependencies": { 854 852 "string-width": "^5.1.2", ··· 866 864 "version": "0.3.5", 867 865 "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 868 866 "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 869 - "dev": true, 870 867 "license": "MIT", 871 868 "dependencies": { 872 869 "@jridgewell/set-array": "^1.2.1", ··· 881 878 "version": "3.1.2", 882 879 "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 883 880 "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 884 - "dev": true, 885 881 "license": "MIT", 886 882 "engines": { 887 883 "node": ">=6.0.0" ··· 891 887 "version": "1.2.1", 892 888 "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 893 889 "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 894 - "dev": true, 895 890 "license": "MIT", 896 891 "engines": { 897 892 "node": ">=6.0.0" ··· 901 896 "version": "1.5.0", 902 897 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 903 898 "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 904 - "dev": true, 905 899 "license": "MIT" 906 900 }, 907 901 "node_modules/@jridgewell/trace-mapping": { 908 902 "version": "0.3.25", 909 903 "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 910 904 "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 911 - "dev": true, 912 905 "license": "MIT", 913 906 "dependencies": { 914 907 "@jridgewell/resolve-uri": "^3.1.0", ··· 919 912 "version": "2.1.5", 920 913 "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 921 914 "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 922 - "dev": true, 923 915 "license": "MIT", 924 916 "dependencies": { 925 917 "@nodelib/fs.stat": "2.0.5", ··· 933 925 "version": "2.0.5", 934 926 "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 935 927 "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 936 - "dev": true, 937 928 "license": "MIT", 938 929 "engines": { 939 930 "node": ">= 8" ··· 943 934 "version": "1.2.8", 944 935 "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 945 936 "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 946 - "dev": true, 947 937 "license": "MIT", 948 938 "dependencies": { 949 939 "@nodelib/fs.scandir": "2.1.5", ··· 957 947 "version": "0.11.0", 958 948 "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 959 949 "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 960 - "dev": true, 961 950 "license": "MIT", 962 951 "optional": true, 963 952 "engines": { ··· 3009 2998 "version": "15.7.13", 3010 2999 "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", 3011 3000 "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", 3012 - "dev": true, 3001 + "devOptional": true, 3013 3002 "license": "MIT" 3014 3003 }, 3015 3004 "node_modules/@types/react": { 3016 3005 "version": "18.3.23", 3017 3006 "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", 3018 3007 "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", 3019 - "dev": true, 3008 + "devOptional": true, 3020 3009 "license": "MIT", 3021 3010 "dependencies": { 3022 3011 "@types/prop-types": "*", ··· 3027 3016 "version": "18.3.7", 3028 3017 "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", 3029 3018 "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", 3030 - "dev": true, 3019 + "devOptional": true, 3031 3020 "license": "MIT", 3032 3021 "peerDependencies": { 3033 3022 "@types/react": "^18.0.0" ··· 3358 3347 "version": "6.1.0", 3359 3348 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 3360 3349 "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 3361 - "dev": true, 3362 3350 "license": "MIT", 3363 3351 "engines": { 3364 3352 "node": ">=12" ··· 3371 3359 "version": "4.3.0", 3372 3360 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3373 3361 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3374 - "dev": true, 3375 3362 "license": "MIT", 3376 3363 "dependencies": { 3377 3364 "color-convert": "^2.0.1" ··· 3387 3374 "version": "1.3.0", 3388 3375 "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 3389 3376 "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 3390 - "dev": true, 3391 3377 "license": "MIT" 3392 3378 }, 3393 3379 "node_modules/anymatch": { 3394 3380 "version": "3.1.3", 3395 3381 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 3396 3382 "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 3397 - "dev": true, 3398 3383 "license": "ISC", 3399 3384 "dependencies": { 3400 3385 "normalize-path": "^3.0.0", ··· 3408 3393 "version": "5.0.2", 3409 3394 "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 3410 3395 "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 3411 - "dev": true, 3412 3396 "license": "MIT" 3413 3397 }, 3414 3398 "node_modules/argparse": { ··· 3472 3456 "version": "1.0.2", 3473 3457 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 3474 3458 "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 3475 - "dev": true, 3476 3459 "license": "MIT" 3477 3460 }, 3478 3461 "node_modules/binary-extensions": { 3479 3462 "version": "2.3.0", 3480 3463 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 3481 3464 "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 3482 - "dev": true, 3483 3465 "license": "MIT", 3484 3466 "engines": { 3485 3467 "node": ">=8" ··· 3503 3485 "version": "3.0.3", 3504 3486 "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 3505 3487 "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 3506 - "dev": true, 3507 3488 "license": "MIT", 3508 3489 "dependencies": { 3509 3490 "fill-range": "^7.1.1" ··· 3559 3540 "version": "2.0.1", 3560 3541 "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 3561 3542 "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 3562 - "dev": true, 3563 3543 "license": "MIT", 3564 3544 "engines": { 3565 3545 "node": ">= 6" ··· 3607 3587 "version": "3.6.0", 3608 3588 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 3609 3589 "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 3610 - "dev": true, 3611 3590 "license": "MIT", 3612 3591 "dependencies": { 3613 3592 "anymatch": "~3.1.2", ··· 3632 3611 "version": "5.1.2", 3633 3612 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 3634 3613 "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 3635 - "dev": true, 3636 3614 "license": "ISC", 3637 3615 "dependencies": { 3638 3616 "is-glob": "^4.0.1" ··· 3681 3659 "version": "2.0.1", 3682 3660 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 3683 3661 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 3684 - "dev": true, 3685 3662 "license": "MIT", 3686 3663 "dependencies": { 3687 3664 "color-name": "~1.1.4" ··· 3694 3671 "version": "1.1.4", 3695 3672 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3696 3673 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3697 - "dev": true, 3698 3674 "license": "MIT" 3699 3675 }, 3700 3676 "node_modules/commander": { 3701 3677 "version": "4.1.1", 3702 3678 "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 3703 3679 "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 3704 - "dev": true, 3705 3680 "license": "MIT", 3706 3681 "engines": { 3707 3682 "node": ">= 6" ··· 3718 3693 "version": "7.0.6", 3719 3694 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 3720 3695 "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 3721 - "dev": true, 3722 3696 "dependencies": { 3723 3697 "path-key": "^3.1.0", 3724 3698 "shebang-command": "^2.0.0", ··· 3732 3706 "version": "3.0.0", 3733 3707 "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 3734 3708 "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 3735 - "dev": true, 3736 3709 "license": "MIT", 3737 3710 "bin": { 3738 3711 "cssesc": "bin/cssesc" ··· 3919 3892 "version": "1.2.2", 3920 3893 "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 3921 3894 "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 3922 - "dev": true, 3923 3895 "license": "Apache-2.0" 3924 3896 }, 3925 3897 "node_modules/dlv": { 3926 3898 "version": "1.1.3", 3927 3899 "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 3928 3900 "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 3929 - "dev": true, 3930 3901 "license": "MIT" 3931 3902 }, 3932 3903 "node_modules/dom-helpers": { ··· 3943 3914 "version": "0.2.0", 3944 3915 "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 3945 3916 "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 3946 - "dev": true, 3947 3917 "license": "MIT" 3948 3918 }, 3949 3919 "node_modules/electron-to-chromium": { ··· 3985 3955 "version": "9.2.2", 3986 3956 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 3987 3957 "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 3988 - "dev": true, 3989 3958 "license": "MIT" 3990 3959 }, 3991 3960 "node_modules/esbuild": { ··· 4264 4233 "version": "3.3.2", 4265 4234 "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 4266 4235 "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 4267 - "dev": true, 4268 4236 "license": "MIT", 4269 4237 "dependencies": { 4270 4238 "@nodelib/fs.stat": "^2.0.2", ··· 4281 4249 "version": "5.1.2", 4282 4250 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 4283 4251 "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 4284 - "dev": true, 4285 4252 "license": "ISC", 4286 4253 "dependencies": { 4287 4254 "is-glob": "^4.0.1" ··· 4308 4275 "version": "1.17.1", 4309 4276 "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 4310 4277 "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 4311 - "dev": true, 4312 4278 "license": "ISC", 4313 4279 "dependencies": { 4314 4280 "reusify": "^1.0.4" ··· 4331 4297 "version": "7.1.1", 4332 4298 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 4333 4299 "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 4334 - "dev": true, 4335 4300 "license": "MIT", 4336 4301 "dependencies": { 4337 4302 "to-regex-range": "^5.0.1" ··· 4382 4347 "version": "3.3.0", 4383 4348 "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 4384 4349 "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 4385 - "dev": true, 4386 4350 "license": "ISC", 4387 4351 "dependencies": { 4388 4352 "cross-spawn": "^7.0.0", ··· 4413 4377 "version": "2.3.3", 4414 4378 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 4415 4379 "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 4416 - "dev": true, 4417 4380 "hasInstallScript": true, 4418 4381 "license": "MIT", 4419 4382 "optional": true, ··· 4428 4391 "version": "1.1.2", 4429 4392 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 4430 4393 "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 4431 - "dev": true, 4432 4394 "license": "MIT", 4433 4395 "funding": { 4434 4396 "url": "https://github.com/sponsors/ljharb" ··· 4447 4409 "version": "10.4.5", 4448 4410 "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 4449 4411 "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 4450 - "dev": true, 4451 4412 "license": "ISC", 4452 4413 "dependencies": { 4453 4414 "foreground-child": "^3.1.0", ··· 4468 4429 "version": "6.0.2", 4469 4430 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 4470 4431 "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 4471 - "dev": true, 4472 4432 "license": "ISC", 4473 4433 "dependencies": { 4474 4434 "is-glob": "^4.0.3" ··· 4481 4441 "version": "2.0.2", 4482 4442 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 4483 4443 "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 4484 - "dev": true, 4485 4444 "license": "MIT", 4486 4445 "dependencies": { 4487 4446 "balanced-match": "^1.0.0" ··· 4491 4450 "version": "9.0.5", 4492 4451 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 4493 4452 "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 4494 - "dev": true, 4495 4453 "license": "ISC", 4496 4454 "dependencies": { 4497 4455 "brace-expansion": "^2.0.1" ··· 4537 4495 "version": "2.0.2", 4538 4496 "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 4539 4497 "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 4540 - "dev": true, 4541 4498 "license": "MIT", 4542 4499 "dependencies": { 4543 4500 "function-bind": "^1.1.2" ··· 4615 4572 "version": "2.1.0", 4616 4573 "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 4617 4574 "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 4618 - "dev": true, 4619 4575 "license": "MIT", 4620 4576 "dependencies": { 4621 4577 "binary-extensions": "^2.0.0" ··· 4628 4584 "version": "2.15.1", 4629 4585 "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", 4630 4586 "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", 4631 - "dev": true, 4632 4587 "license": "MIT", 4633 4588 "dependencies": { 4634 4589 "hasown": "^2.0.2" ··· 4644 4599 "version": "2.1.1", 4645 4600 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 4646 4601 "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 4647 - "dev": true, 4648 4602 "license": "MIT", 4649 4603 "engines": { 4650 4604 "node": ">=0.10.0" ··· 4654 4608 "version": "3.0.0", 4655 4609 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 4656 4610 "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 4657 - "dev": true, 4658 4611 "license": "MIT", 4659 4612 "engines": { 4660 4613 "node": ">=8" ··· 4664 4617 "version": "4.0.3", 4665 4618 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 4666 4619 "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 4667 - "dev": true, 4668 4620 "license": "MIT", 4669 4621 "dependencies": { 4670 4622 "is-extglob": "^2.1.1" ··· 4677 4629 "version": "7.0.0", 4678 4630 "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 4679 4631 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 4680 - "dev": true, 4681 4632 "license": "MIT", 4682 4633 "engines": { 4683 4634 "node": ">=0.12.0" ··· 4687 4638 "version": "2.0.0", 4688 4639 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 4689 4640 "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 4690 - "dev": true, 4691 4641 "license": "ISC" 4692 4642 }, 4693 4643 "node_modules/jackspeak": { 4694 4644 "version": "3.4.3", 4695 4645 "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 4696 4646 "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 4697 - "dev": true, 4698 4647 "license": "BlueOak-1.0.0", 4699 4648 "dependencies": { 4700 4649 "@isaacs/cliui": "^8.0.2" ··· 4710 4659 "version": "1.21.6", 4711 4660 "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", 4712 4661 "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", 4713 - "dev": true, 4714 4662 "license": "MIT", 4715 4663 "bin": { 4716 4664 "jiti": "bin/jiti.js" ··· 4784 4732 "version": "3.1.3", 4785 4733 "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 4786 4734 "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 4787 - "dev": true, 4788 4735 "license": "MIT", 4789 4736 "engines": { 4790 4737 "node": ">=14" ··· 4797 4744 "version": "1.2.4", 4798 4745 "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 4799 4746 "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 4800 - "dev": true, 4801 4747 "license": "MIT" 4802 4748 }, 4803 4749 "node_modules/locate-path": { ··· 5307 5253 "version": "10.4.3", 5308 5254 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 5309 5255 "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 5310 - "dev": true, 5311 5256 "license": "ISC" 5312 5257 }, 5313 5258 "node_modules/lucide-react": { ··· 5332 5277 "version": "1.4.1", 5333 5278 "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 5334 5279 "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 5335 - "dev": true, 5336 5280 "license": "MIT", 5337 5281 "engines": { 5338 5282 "node": ">= 8" ··· 5342 5286 "version": "4.0.8", 5343 5287 "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 5344 5288 "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 5345 - "dev": true, 5346 5289 "license": "MIT", 5347 5290 "dependencies": { 5348 5291 "braces": "^3.0.3", ··· 5369 5312 "version": "7.1.2", 5370 5313 "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 5371 5314 "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 5372 - "dev": true, 5373 5315 "license": "ISC", 5374 5316 "engines": { 5375 5317 "node": ">=16 || 14 >=14.17" ··· 5386 5328 "version": "2.7.0", 5387 5329 "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 5388 5330 "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 5389 - "dev": true, 5390 5331 "license": "MIT", 5391 5332 "dependencies": { 5392 5333 "any-promise": "^1.0.0", ··· 5398 5339 "version": "3.3.11", 5399 5340 "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 5400 5341 "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 5401 - "dev": true, 5402 5342 "funding": [ 5403 5343 { 5404 5344 "type": "github", ··· 5441 5381 "version": "3.0.0", 5442 5382 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 5443 5383 "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 5444 - "dev": true, 5445 5384 "license": "MIT", 5446 5385 "engines": { 5447 5386 "node": ">=0.10.0" ··· 5470 5409 "version": "3.0.0", 5471 5410 "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 5472 5411 "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 5473 - "dev": true, 5474 5412 "license": "MIT", 5475 5413 "engines": { 5476 5414 "node": ">= 6" ··· 5530 5468 "version": "1.0.1", 5531 5469 "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 5532 5470 "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 5533 - "dev": true, 5534 5471 "license": "BlueOak-1.0.0" 5535 5472 }, 5536 5473 "node_modules/parent-module": { ··· 5560 5497 "version": "3.1.1", 5561 5498 "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 5562 5499 "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 5563 - "dev": true, 5564 5500 "license": "MIT", 5565 5501 "engines": { 5566 5502 "node": ">=8" ··· 5570 5506 "version": "1.0.7", 5571 5507 "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 5572 5508 "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 5573 - "dev": true, 5574 5509 "license": "MIT" 5575 5510 }, 5576 5511 "node_modules/path-scurry": { 5577 5512 "version": "1.11.1", 5578 5513 "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 5579 5514 "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 5580 - "dev": true, 5581 5515 "license": "BlueOak-1.0.0", 5582 5516 "dependencies": { 5583 5517 "lru-cache": "^10.2.0", ··· 5594 5528 "version": "1.1.1", 5595 5529 "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 5596 5530 "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 5597 - "dev": true, 5598 5531 "license": "ISC" 5599 5532 }, 5600 5533 "node_modules/picomatch": { 5601 5534 "version": "2.3.1", 5602 5535 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 5603 5536 "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 5604 - "dev": true, 5605 5537 "license": "MIT", 5606 5538 "engines": { 5607 5539 "node": ">=8.6" ··· 5614 5546 "version": "2.3.0", 5615 5547 "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 5616 5548 "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 5617 - "dev": true, 5618 5549 "license": "MIT", 5619 5550 "engines": { 5620 5551 "node": ">=0.10.0" ··· 5624 5555 "version": "4.0.6", 5625 5556 "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 5626 5557 "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 5627 - "dev": true, 5628 5558 "license": "MIT", 5629 5559 "engines": { 5630 5560 "node": ">= 6" ··· 5634 5564 "version": "8.5.6", 5635 5565 "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 5636 5566 "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 5637 - "dev": true, 5638 5567 "funding": [ 5639 5568 { 5640 5569 "type": "opencollective", ··· 5663 5592 "version": "15.1.0", 5664 5593 "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 5665 5594 "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 5666 - "dev": true, 5667 5595 "license": "MIT", 5668 5596 "dependencies": { 5669 5597 "postcss-value-parser": "^4.0.0", ··· 5681 5609 "version": "4.0.1", 5682 5610 "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 5683 5611 "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 5684 - "dev": true, 5685 5612 "license": "MIT", 5686 5613 "dependencies": { 5687 5614 "camelcase-css": "^2.0.1" ··· 5701 5628 "version": "4.0.2", 5702 5629 "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 5703 5630 "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 5704 - "dev": true, 5705 5631 "funding": [ 5706 5632 { 5707 5633 "type": "opencollective", ··· 5737 5663 "version": "6.2.0", 5738 5664 "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", 5739 5665 "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", 5740 - "dev": true, 5741 5666 "funding": [ 5742 5667 { 5743 5668 "type": "opencollective", ··· 5763 5688 "version": "6.1.2", 5764 5689 "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 5765 5690 "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 5766 - "dev": true, 5767 5691 "license": "MIT", 5768 5692 "dependencies": { 5769 5693 "cssesc": "^3.0.0", ··· 5777 5701 "version": "4.2.0", 5778 5702 "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 5779 5703 "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 5780 - "dev": true, 5781 5704 "license": "MIT" 5782 5705 }, 5783 5706 "node_modules/prelude-ls": { ··· 5821 5744 "version": "1.2.3", 5822 5745 "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 5823 5746 "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 5824 - "dev": true, 5825 5747 "funding": [ 5826 5748 { 5827 5749 "type": "github", ··· 6065 5987 "version": "1.0.0", 6066 5988 "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 6067 5989 "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 6068 - "dev": true, 6069 5990 "license": "MIT", 6070 5991 "dependencies": { 6071 5992 "pify": "^2.3.0" ··· 6075 5996 "version": "3.6.0", 6076 5997 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 6077 5998 "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 6078 - "dev": true, 6079 5999 "license": "MIT", 6080 6000 "dependencies": { 6081 6001 "picomatch": "^2.2.1" ··· 6120 6040 "version": "1.22.8", 6121 6041 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 6122 6042 "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 6123 - "dev": true, 6124 6043 "license": "MIT", 6125 6044 "dependencies": { 6126 6045 "is-core-module": "^2.13.0", ··· 6148 6067 "version": "1.0.4", 6149 6068 "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 6150 6069 "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 6151 - "dev": true, 6152 6070 "license": "MIT", 6153 6071 "engines": { 6154 6072 "iojs": ">=1.0.0", ··· 6195 6113 "version": "1.2.0", 6196 6114 "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 6197 6115 "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 6198 - "dev": true, 6199 6116 "funding": [ 6200 6117 { 6201 6118 "type": "github", ··· 6247 6164 "version": "2.0.0", 6248 6165 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 6249 6166 "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 6250 - "dev": true, 6251 6167 "license": "MIT", 6252 6168 "dependencies": { 6253 6169 "shebang-regex": "^3.0.0" ··· 6260 6176 "version": "3.0.0", 6261 6177 "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 6262 6178 "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 6263 - "dev": true, 6264 6179 "license": "MIT", 6265 6180 "engines": { 6266 6181 "node": ">=8" ··· 6270 6185 "version": "4.1.0", 6271 6186 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 6272 6187 "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 6273 - "dev": true, 6274 6188 "license": "ISC", 6275 6189 "engines": { 6276 6190 "node": ">=14" ··· 6293 6207 "version": "1.2.1", 6294 6208 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 6295 6209 "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 6296 - "dev": true, 6297 6210 "license": "BSD-3-Clause", 6298 6211 "engines": { 6299 6212 "node": ">=0.10.0" ··· 6303 6216 "version": "5.1.2", 6304 6217 "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 6305 6218 "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 6306 - "dev": true, 6307 6219 "license": "MIT", 6308 6220 "dependencies": { 6309 6221 "eastasianwidth": "^0.2.0", ··· 6322 6234 "version": "4.2.3", 6323 6235 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 6324 6236 "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 6325 - "dev": true, 6326 6237 "license": "MIT", 6327 6238 "dependencies": { 6328 6239 "emoji-regex": "^8.0.0", ··· 6337 6248 "version": "5.0.1", 6338 6249 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 6339 6250 "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 6340 - "dev": true, 6341 6251 "license": "MIT", 6342 6252 "engines": { 6343 6253 "node": ">=8" ··· 6347 6257 "version": "8.0.0", 6348 6258 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 6349 6259 "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 6350 - "dev": true, 6351 6260 "license": "MIT" 6352 6261 }, 6353 6262 "node_modules/string-width-cjs/node_modules/strip-ansi": { 6354 6263 "version": "6.0.1", 6355 6264 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 6356 6265 "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 6357 - "dev": true, 6358 6266 "license": "MIT", 6359 6267 "dependencies": { 6360 6268 "ansi-regex": "^5.0.1" ··· 6367 6275 "version": "7.1.0", 6368 6276 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 6369 6277 "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 6370 - "dev": true, 6371 6278 "license": "MIT", 6372 6279 "dependencies": { 6373 6280 "ansi-regex": "^6.0.1" ··· 6384 6291 "version": "6.0.1", 6385 6292 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 6386 6293 "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 6387 - "dev": true, 6388 6294 "license": "MIT", 6389 6295 "dependencies": { 6390 6296 "ansi-regex": "^5.0.1" ··· 6397 6303 "version": "5.0.1", 6398 6304 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 6399 6305 "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 6400 - "dev": true, 6401 6306 "license": "MIT", 6402 6307 "engines": { 6403 6308 "node": ">=8" ··· 6420 6325 "version": "3.35.0", 6421 6326 "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 6422 6327 "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 6423 - "dev": true, 6424 6328 "license": "MIT", 6425 6329 "dependencies": { 6426 6330 "@jridgewell/gen-mapping": "^0.3.2", ··· 6456 6360 "version": "1.0.0", 6457 6361 "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 6458 6362 "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 6459 - "dev": true, 6460 6363 "license": "MIT", 6461 6364 "engines": { 6462 6365 "node": ">= 0.4" ··· 6479 6382 "version": "3.4.17", 6480 6383 "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", 6481 6384 "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", 6482 - "dev": true, 6483 6385 "license": "MIT", 6484 6386 "dependencies": { 6485 6387 "@alloc/quick-lru": "^5.2.0", ··· 6526 6428 "version": "3.3.1", 6527 6429 "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 6528 6430 "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 6529 - "dev": true, 6530 6431 "license": "MIT", 6531 6432 "dependencies": { 6532 6433 "any-promise": "^1.0.0" ··· 6536 6437 "version": "1.6.0", 6537 6438 "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 6538 6439 "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 6539 - "dev": true, 6540 6440 "license": "MIT", 6541 6441 "dependencies": { 6542 6442 "thenify": ">= 3.1.0 < 4" ··· 6555 6455 "version": "5.0.1", 6556 6456 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 6557 6457 "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 6558 - "dev": true, 6559 6458 "license": "MIT", 6560 6459 "dependencies": { 6561 6460 "is-number": "^7.0.0" ··· 6587 6486 "version": "0.1.13", 6588 6487 "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 6589 6488 "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 6590 - "dev": true, 6591 6489 "license": "Apache-2.0" 6592 6490 }, 6593 6491 "node_modules/tslib": { ··· 6750 6648 "version": "1.0.2", 6751 6649 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 6752 6650 "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 6753 - "dev": true, 6754 6651 "license": "MIT" 6755 6652 }, 6756 6653 "node_modules/vaul": { ··· 6868 6765 "version": "2.0.2", 6869 6766 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 6870 6767 "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 6871 - "dev": true, 6872 6768 "license": "ISC", 6873 6769 "dependencies": { 6874 6770 "isexe": "^2.0.0" ··· 6894 6790 "version": "8.1.0", 6895 6791 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 6896 6792 "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 6897 - "dev": true, 6898 6793 "license": "MIT", 6899 6794 "dependencies": { 6900 6795 "ansi-styles": "^6.1.0", ··· 6913 6808 "version": "7.0.0", 6914 6809 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 6915 6810 "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 6916 - "dev": true, 6917 6811 "license": "MIT", 6918 6812 "dependencies": { 6919 6813 "ansi-styles": "^4.0.0", ··· 6931 6825 "version": "5.0.1", 6932 6826 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 6933 6827 "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 6934 - "dev": true, 6935 6828 "license": "MIT", 6936 6829 "engines": { 6937 6830 "node": ">=8" ··· 6941 6834 "version": "8.0.0", 6942 6835 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 6943 6836 "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 6944 - "dev": true, 6945 6837 "license": "MIT" 6946 6838 }, 6947 6839 "node_modules/wrap-ansi-cjs/node_modules/string-width": { 6948 6840 "version": "4.2.3", 6949 6841 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 6950 6842 "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 6951 - "dev": true, 6952 6843 "license": "MIT", 6953 6844 "dependencies": { 6954 6845 "emoji-regex": "^8.0.0", ··· 6963 6854 "version": "6.0.1", 6964 6855 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 6965 6856 "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 6966 - "dev": true, 6967 6857 "license": "MIT", 6968 6858 "dependencies": { 6969 6859 "ansi-regex": "^5.0.1" ··· 6976 6866 "version": "6.2.1", 6977 6867 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 6978 6868 "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 6979 - "dev": true, 6980 6869 "license": "MIT", 6981 6870 "engines": { 6982 6871 "node": ">=12" ··· 7010 6899 "version": "2.6.0", 7011 6900 "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", 7012 6901 "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", 7013 - "dev": true, 7014 6902 "license": "ISC", 7015 6903 "bin": { 7016 6904 "yaml": "bin.mjs"
+66 -36
src/components/SEOTester.tsx
··· 146 146 return; 147 147 } 148 148 149 - // Add to history 149 + // Add to history quickly 150 150 if (!urlHistory.includes(url)) { 151 151 setUrlHistory([url, ...urlHistory.slice(0, 9)]); // Keep last 10 152 152 } ··· 156 156 setSeoData(null); 157 157 158 158 try { 159 - setProgress(20); 160 - 159 + // Quick progress update steps to avoid long UI waits 160 + setProgress(10); 161 + 161 162 const urlObj = new URL(url); 162 - setProgress(40); 163 - 164 - const proxyUrl = `https://api.allorigins.win/get?url=${encodeURIComponent(url)}`; 165 - const response = await fetch(proxyUrl); 166 - setProgress(70); 167 - 168 - if (!response.ok) { 169 - throw new Error(`HTTP error! status: ${response.status}`); 170 - } 171 - 172 - const data = await response.json(); 173 - 174 - if (!data.contents) { 175 - throw new Error('No content received from the website'); 163 + 164 + // Simple in-memory cache to avoid refetching recently requested URLs 165 + // Use a symbol on the window to persist across HMR/dev reloads 166 + const CACHE_KEY = '__seo_tester_cache_v1'; 167 + // @ts-ignore 168 + window[CACHE_KEY] = window[CACHE_KEY] || new Map<string, { html: string; ts: number }>(); 169 + // @ts-ignore 170 + const cache: Map<string, { html: string; ts: number }> = window[CACHE_KEY]; 171 + const cached = cache.get(url); 172 + 173 + let htmlContents: string | null = null; 174 + 175 + // Use cache if fresh (< 5 minutes) 176 + if (cached && (Date.now() - cached.ts) < 5 * 60 * 1000) { 177 + htmlContents = cached.html; 178 + } else { 179 + setProgress(35); 180 + 181 + const proxyUrl = `https://api.allorigins.win/get?url=${encodeURIComponent(url)}`; 182 + 183 + // Add a fetch timeout using AbortController to avoid long waits 184 + const controller = new AbortController(); 185 + const timeout = setTimeout(() => controller.abort(), 8000); // 8s timeout 186 + 187 + const response = await fetch(proxyUrl, { signal: controller.signal }); 188 + clearTimeout(timeout); 189 + 190 + if (!response.ok) { 191 + throw new Error(`HTTP error! status: ${response.status}`); 192 + } 193 + 194 + const data = await response.json(); 195 + 196 + if (!data.contents) { 197 + throw new Error('No content received from the website'); 198 + } 199 + 200 + htmlContents = data.contents; 201 + // store in cache 202 + cache.set(url, { html: htmlContents, ts: Date.now() }); 176 203 } 177 204 178 - setProgress(90); 179 - const extractedData = extractMetaData(data.contents, url); 205 + setProgress(70); 206 + 207 + const extractedData = extractMetaData(htmlContents, url); 180 208 const score = calculateSEOScore(extractedData); 181 - 209 + 182 210 setSeoData(extractedData); 183 211 setSeoScore(score); 184 212 setProgress(100); 185 - 186 - setTimeout(() => { 187 - setShowResults(true); 188 - }, 200); 189 - 190 - toast({ 191 - title: "Success", 192 - description: "SEO analysis completed successfully", 193 - }); 213 + 214 + // Show results immediately (no artificial delay) 215 + setShowResults(true); 216 + 217 + toast({ title: "Success", description: "SEO analysis completed" }); 194 218 } catch (err) { 195 219 console.error('SEO Analysis Error:', err); 196 220 let errorMessage = 'Failed to analyze website. '; 197 221 198 - if (err instanceof TypeError && err.message.includes('Invalid URL')) { 222 + if (err instanceof TypeError && err.message.includes('Invalid URL')) { 199 223 errorMessage += 'Please enter a valid URL starting with http:// or https://'; 200 - } else if (err instanceof Error) { 224 + } else if (err instanceof Error) { 201 225 errorMessage += err.message; 202 226 } else { 203 227 errorMessage += 'Please check the URL and try again.'; ··· 212 236 } finally { 213 237 setIsLoading(false); 214 238 if (!error) { 215 - setTimeout(() => setProgress(0), 1000); 239 + // Remove progress quickly 240 + setTimeout(() => setProgress(0), 200); 216 241 } 217 242 } 218 243 }; ··· 264 289 return <Badge variant="destructive">Poor</Badge>; 265 290 }; 266 291 267 - const AnimatedCounter = ({ value, duration = 1000 }: { value: number; duration?: number }) => { 292 + const AnimatedCounter = ({ value, duration = 400 }: { value: number; duration?: number }) => { 268 293 const [count, setCount] = useState(0); 269 294 270 295 useEffect(() => { 271 296 if (showResults) { 272 297 let start = 0; 273 - const increment = value / (duration / 16); 298 + const frame = 16; 299 + const steps = Math.max(2, Math.round(duration / frame)); 300 + const increment = value / steps; 301 + let currentStep = 0; 302 + 274 303 const timer = setInterval(() => { 304 + currentStep += 1; 275 305 start += increment; 276 - if (start >= value) { 306 + if (currentStep >= steps) { 277 307 setCount(value); 278 308 clearInterval(timer); 279 309 } else { 280 310 setCount(Math.floor(start)); 281 311 } 282 - }, 16); 312 + }, frame); 283 313 return () => clearInterval(timer); 284 314 } 285 315 }, [value, duration, showResults]);