this repo has no description
0
fork

Configure Feed

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

Add servelocal, fix navbar, fix double hover, fix redirect uri, add sign out button and signed in user

uwx 721110d2 ace05de4

+690 -68
+19
kinklist.gitlab.io.code-workspace
··· 1 + { 2 + "folders": [ 3 + { 4 + "path": "." 5 + }, 6 + { 7 + "path": "../wisp.place-monorepo" 8 + }, 9 + { 10 + "path": "../kitty-agent" 11 + }, 12 + { 13 + "path": "../typelex" 14 + } 15 + ], 16 + "settings": { 17 + "typescript.tsdk": "kinklist.gitlab.io\\node_modules\\typescript\\lib" 18 + } 19 + }
+1
package.json
··· 20 20 "@typelex/cli": "^0.4.0", 21 21 "@typelex/emitter": "^0.4.0", 22 22 "@types/masonry-layout": "^4.2.8", 23 + "express": "^5.2.1", 23 24 "preact-portal": "^1.1.3", 24 25 "rolldown": "1.0.0-rc.4", 25 26 "typescript": "6.0.0-dev.20260213"
+537
pnpm-lock.yaml
··· 60 60 '@types/masonry-layout': 61 61 specifier: ^4.2.8 62 62 version: 4.2.8 63 + express: 64 + specifier: ^5.2.1 65 + version: 5.2.1 63 66 preact-portal: 64 67 specifier: ^1.1.3 65 68 version: 1.1.3(preact@10.28.3) ··· 523 526 engines: {node: '>=20.0.0'} 524 527 hasBin: true 525 528 529 + accepts@2.0.0: 530 + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} 531 + engines: {node: '>= 0.6'} 532 + 526 533 ajv@8.17.1: 527 534 resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 528 535 ··· 534 541 resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} 535 542 engines: {node: '>=12'} 536 543 544 + body-parser@2.2.2: 545 + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} 546 + engines: {node: '>=18'} 547 + 537 548 braces@3.0.3: 538 549 resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 539 550 engines: {node: '>=8'} ··· 541 552 bun-types@1.3.9: 542 553 resolution: {integrity: sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg==} 543 554 555 + bytes@3.1.2: 556 + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 557 + engines: {node: '>= 0.8'} 558 + 559 + call-bind-apply-helpers@1.0.2: 560 + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} 561 + engines: {node: '>= 0.4'} 562 + 563 + call-bound@1.0.4: 564 + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} 565 + engines: {node: '>= 0.4'} 566 + 544 567 change-case@5.4.4: 545 568 resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} 546 569 ··· 559 582 resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} 560 583 engines: {node: '>=20'} 561 584 585 + content-disposition@1.0.1: 586 + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} 587 + engines: {node: '>=18'} 588 + 589 + content-type@1.0.5: 590 + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 591 + engines: {node: '>= 0.6'} 592 + 593 + cookie-signature@1.2.2: 594 + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} 595 + engines: {node: '>=6.6.0'} 596 + 597 + cookie@0.7.2: 598 + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 599 + engines: {node: '>= 0.6'} 600 + 601 + debug@4.4.3: 602 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 603 + engines: {node: '>=6.0'} 604 + peerDependencies: 605 + supports-color: '*' 606 + peerDependenciesMeta: 607 + supports-color: 608 + optional: true 609 + 610 + depd@2.0.0: 611 + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 612 + engines: {node: '>= 0.8'} 613 + 614 + dunder-proto@1.0.1: 615 + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 616 + engines: {node: '>= 0.4'} 617 + 618 + ee-first@1.1.1: 619 + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 620 + 562 621 emoji-regex@10.6.0: 563 622 resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} 564 623 624 + encodeurl@2.0.0: 625 + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} 626 + engines: {node: '>= 0.8'} 627 + 565 628 env-paths@3.0.0: 566 629 resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} 567 630 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 568 631 632 + es-define-property@1.0.1: 633 + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 634 + engines: {node: '>= 0.4'} 635 + 636 + es-errors@1.3.0: 637 + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 638 + engines: {node: '>= 0.4'} 639 + 640 + es-object-atoms@1.1.1: 641 + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 642 + engines: {node: '>= 0.4'} 643 + 569 644 escalade@3.2.0: 570 645 resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 571 646 engines: {node: '>=6'} 647 + 648 + escape-html@1.0.3: 649 + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 572 650 573 651 esm-env@1.2.2: 574 652 resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 653 + 654 + etag@1.8.1: 655 + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 656 + engines: {node: '>= 0.6'} 657 + 658 + express@5.2.1: 659 + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} 660 + engines: {node: '>= 18'} 575 661 576 662 fast-deep-equal@3.1.3: 577 663 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} ··· 599 685 resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 600 686 engines: {node: '>=8'} 601 687 688 + finalhandler@2.1.1: 689 + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} 690 + engines: {node: '>= 18.0.0'} 691 + 692 + forwarded@0.2.0: 693 + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 694 + engines: {node: '>= 0.6'} 695 + 696 + fresh@2.0.0: 697 + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} 698 + engines: {node: '>= 0.8'} 699 + 700 + function-bind@1.1.2: 701 + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 702 + 602 703 get-caller-file@2.0.5: 603 704 resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 604 705 engines: {node: 6.* || 8.* || >= 10.*} ··· 607 708 resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} 608 709 engines: {node: '>=18'} 609 710 711 + get-intrinsic@1.3.0: 712 + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} 713 + engines: {node: '>= 0.4'} 714 + 715 + get-proto@1.0.1: 716 + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 717 + engines: {node: '>= 0.4'} 718 + 610 719 glob-parent@5.1.2: 611 720 resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 612 721 engines: {node: '>= 6'} ··· 615 724 resolution: {integrity: sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==} 616 725 engines: {node: '>=20'} 617 726 727 + gopd@1.2.0: 728 + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 729 + engines: {node: '>= 0.4'} 730 + 731 + has-symbols@1.1.0: 732 + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 733 + engines: {node: '>= 0.4'} 734 + 735 + hasown@2.0.2: 736 + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 737 + engines: {node: '>= 0.4'} 738 + 739 + http-errors@2.0.1: 740 + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} 741 + engines: {node: '>= 0.8'} 742 + 618 743 iconv-lite@0.7.2: 619 744 resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} 620 745 engines: {node: '>=0.10.0'} ··· 623 748 resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 624 749 engines: {node: '>= 4'} 625 750 751 + inherits@2.0.4: 752 + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 753 + 754 + ipaddr.js@1.9.1: 755 + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 756 + engines: {node: '>= 0.10'} 757 + 626 758 is-extglob@2.1.1: 627 759 resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 628 760 engines: {node: '>=0.10.0'} ··· 638 770 is-path-inside@4.0.0: 639 771 resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} 640 772 engines: {node: '>=12'} 773 + 774 + is-promise@4.0.0: 775 + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} 641 776 642 777 is-unicode-supported@2.1.0: 643 778 resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} ··· 670 805 peerDependencies: 671 806 react: '>=16.8' 672 807 808 + math-intrinsics@1.1.0: 809 + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 810 + engines: {node: '>= 0.4'} 811 + 812 + media-typer@1.1.0: 813 + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} 814 + engines: {node: '>= 0.8'} 815 + 816 + merge-descriptors@2.0.0: 817 + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} 818 + engines: {node: '>=18'} 819 + 673 820 merge2@1.4.1: 674 821 resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 675 822 engines: {node: '>= 8'} ··· 678 825 resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 679 826 engines: {node: '>=8.6'} 680 827 828 + mime-db@1.54.0: 829 + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} 830 + engines: {node: '>= 0.6'} 831 + 832 + mime-types@3.0.2: 833 + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} 834 + engines: {node: '>=18'} 835 + 681 836 minipass@7.1.2: 682 837 resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 683 838 engines: {node: '>=16 || 14 >=14.17'} ··· 686 841 resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} 687 842 engines: {node: '>= 18'} 688 843 844 + ms@2.1.3: 845 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 846 + 689 847 mustache@4.2.0: 690 848 resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} 691 849 hasBin: true ··· 699 857 engines: {node: ^18 || >=20} 700 858 hasBin: true 701 859 860 + negotiator@1.0.0: 861 + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} 862 + engines: {node: '>= 0.6'} 863 + 702 864 node-gyp-build@4.8.4: 703 865 resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} 704 866 hasBin: true 705 867 868 + object-inspect@1.13.4: 869 + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} 870 + engines: {node: '>= 0.4'} 871 + 872 + on-finished@2.4.1: 873 + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 874 + engines: {node: '>= 0.8'} 875 + 876 + once@1.4.0: 877 + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 878 + 879 + parseurl@1.3.3: 880 + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 881 + engines: {node: '>= 0.8'} 882 + 883 + path-to-regexp@8.3.0: 884 + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} 885 + 706 886 picocolors@1.1.1: 707 887 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 708 888 ··· 723 903 engines: {node: '>=14'} 724 904 hasBin: true 725 905 906 + proxy-addr@2.0.7: 907 + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 908 + engines: {node: '>= 0.10'} 909 + 726 910 qfs-compression@0.2.3: 727 911 resolution: {integrity: sha512-9jS4HdvjUuLGt6nW5ISojhwI4YPgJlojrj7OPRPqMUzSlMu7gUF4m1iPPjuNJQZwTO7i0buAK6kG+0oSFNwXeQ==} 728 912 913 + qs@6.15.0: 914 + resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} 915 + engines: {node: '>=0.6'} 916 + 729 917 queue-microtask@1.2.3: 730 918 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 731 919 732 920 raf-schd@4.0.3: 733 921 resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} 734 922 923 + range-parser@1.2.1: 924 + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 925 + engines: {node: '>= 0.6'} 926 + 927 + raw-body@3.0.2: 928 + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} 929 + engines: {node: '>= 0.10'} 930 + 735 931 react-dom@19.2.4: 736 932 resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} 737 933 peerDependencies: ··· 762 958 engines: {node: ^20.19.0 || >=22.12.0} 763 959 hasBin: true 764 960 961 + router@2.2.0: 962 + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} 963 + engines: {node: '>= 18'} 964 + 765 965 run-parallel@1.2.0: 766 966 resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 767 967 ··· 776 976 engines: {node: '>=10'} 777 977 hasBin: true 778 978 979 + send@1.2.1: 980 + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} 981 + engines: {node: '>= 18'} 982 + 983 + serve-static@2.2.1: 984 + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} 985 + engines: {node: '>= 18'} 986 + 987 + setprototypeof@1.2.0: 988 + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 989 + 990 + side-channel-list@1.0.0: 991 + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 992 + engines: {node: '>= 0.4'} 993 + 994 + side-channel-map@1.0.1: 995 + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 996 + engines: {node: '>= 0.4'} 997 + 998 + side-channel-weakmap@1.0.2: 999 + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1000 + engines: {node: '>= 0.4'} 1001 + 1002 + side-channel@1.1.0: 1003 + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1004 + engines: {node: '>= 0.4'} 1005 + 779 1006 signal-exit@4.1.0: 780 1007 resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 781 1008 engines: {node: '>=14'} ··· 784 1011 resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} 785 1012 engines: {node: '>=14.16'} 786 1013 1014 + statuses@2.0.2: 1015 + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} 1016 + engines: {node: '>= 0.8'} 1017 + 787 1018 string-width@7.2.0: 788 1019 resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 789 1020 engines: {node: '>=18'} ··· 795 1026 tar@7.5.7: 796 1027 resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} 797 1028 engines: {node: '>=18'} 1029 + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me 798 1030 799 1031 temporal-polyfill@0.3.0: 800 1032 resolution: {integrity: sha512-qNsTkX9K8hi+FHDfHmf22e/OGuXmfBm9RqNismxBrnSmZVJKegQ+HYYXT+R7Ha8F/YSm2Y34vmzD4cxMu2u95g==} ··· 809 1041 resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 810 1042 engines: {node: '>=8.0'} 811 1043 1044 + toidentifier@1.0.1: 1045 + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 1046 + engines: {node: '>=0.6'} 1047 + 812 1048 trie-memoize@1.2.0: 813 1049 resolution: {integrity: sha512-hEDLVEP1FCgaRtt0oZDJdz2lK9uK7WlB7ASswt9U9cqruSNueVigtRGxI97hevKlViqhAcRgNgzuY/m8FCCMcg==} 814 1050 815 1051 tslib@2.8.1: 816 1052 resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 817 1053 1054 + type-is@2.0.1: 1055 + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} 1056 + engines: {node: '>= 0.6'} 1057 + 818 1058 typescript@6.0.0-dev.20260213: 819 1059 resolution: {integrity: sha512-zGIJwsX3OEsKIoEvXJzHRpt58fk370/T1N0GsSECAbcTlrsfUe2QQFbdKyKT3HyG2hFFyZg+Q0zYn6VLeahafg==} 820 1060 engines: {node: '>=14.17'} ··· 830 1070 resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} 831 1071 engines: {node: '>=20'} 832 1072 1073 + unpipe@1.0.0: 1074 + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 1075 + engines: {node: '>= 0.8'} 1076 + 1077 + vary@1.1.2: 1078 + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 1079 + engines: {node: '>= 0.8'} 1080 + 833 1081 vscode-jsonrpc@8.2.0: 834 1082 resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} 835 1083 engines: {node: '>=14.0.0'} ··· 850 1098 wrap-ansi@9.0.2: 851 1099 resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} 852 1100 engines: {node: '>=18'} 1101 + 1102 + wrappy@1.0.2: 1103 + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 853 1104 854 1105 y18n@5.0.8: 855 1106 resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} ··· 1367 1618 transitivePeerDependencies: 1368 1619 - '@types/node' 1369 1620 1621 + accepts@2.0.0: 1622 + dependencies: 1623 + mime-types: 3.0.2 1624 + negotiator: 1.0.0 1625 + 1370 1626 ajv@8.17.1: 1371 1627 dependencies: 1372 1628 fast-deep-equal: 3.1.3 ··· 1378 1634 1379 1635 ansi-styles@6.2.3: {} 1380 1636 1637 + body-parser@2.2.2: 1638 + dependencies: 1639 + bytes: 3.1.2 1640 + content-type: 1.0.5 1641 + debug: 4.4.3 1642 + http-errors: 2.0.1 1643 + iconv-lite: 0.7.2 1644 + on-finished: 2.4.1 1645 + qs: 6.15.0 1646 + raw-body: 3.0.2 1647 + type-is: 2.0.1 1648 + transitivePeerDependencies: 1649 + - supports-color 1650 + 1381 1651 braces@3.0.3: 1382 1652 dependencies: 1383 1653 fill-range: 7.1.1 ··· 1386 1656 dependencies: 1387 1657 '@types/node': 25.2.3 1388 1658 1659 + bytes@3.1.2: {} 1660 + 1661 + call-bind-apply-helpers@1.0.2: 1662 + dependencies: 1663 + es-errors: 1.3.0 1664 + function-bind: 1.1.2 1665 + 1666 + call-bound@1.0.4: 1667 + dependencies: 1668 + call-bind-apply-helpers: 1.0.2 1669 + get-intrinsic: 1.3.0 1670 + 1389 1671 change-case@5.4.4: {} 1390 1672 1391 1673 chardet@2.1.1: {} ··· 1400 1682 strip-ansi: 7.1.2 1401 1683 wrap-ansi: 9.0.2 1402 1684 1685 + content-disposition@1.0.1: {} 1686 + 1687 + content-type@1.0.5: {} 1688 + 1689 + cookie-signature@1.2.2: {} 1690 + 1691 + cookie@0.7.2: {} 1692 + 1693 + debug@4.4.3: 1694 + dependencies: 1695 + ms: 2.1.3 1696 + 1697 + depd@2.0.0: {} 1698 + 1699 + dunder-proto@1.0.1: 1700 + dependencies: 1701 + call-bind-apply-helpers: 1.0.2 1702 + es-errors: 1.3.0 1703 + gopd: 1.2.0 1704 + 1705 + ee-first@1.1.1: {} 1706 + 1403 1707 emoji-regex@10.6.0: {} 1708 + 1709 + encodeurl@2.0.0: {} 1404 1710 1405 1711 env-paths@3.0.0: {} 1406 1712 1713 + es-define-property@1.0.1: {} 1714 + 1715 + es-errors@1.3.0: {} 1716 + 1717 + es-object-atoms@1.1.1: 1718 + dependencies: 1719 + es-errors: 1.3.0 1720 + 1407 1721 escalade@3.2.0: {} 1722 + 1723 + escape-html@1.0.3: {} 1408 1724 1409 1725 esm-env@1.2.2: {} 1410 1726 1727 + etag@1.8.1: {} 1728 + 1729 + express@5.2.1: 1730 + dependencies: 1731 + accepts: 2.0.0 1732 + body-parser: 2.2.2 1733 + content-disposition: 1.0.1 1734 + content-type: 1.0.5 1735 + cookie: 0.7.2 1736 + cookie-signature: 1.2.2 1737 + debug: 4.4.3 1738 + depd: 2.0.0 1739 + encodeurl: 2.0.0 1740 + escape-html: 1.0.3 1741 + etag: 1.8.1 1742 + finalhandler: 2.1.1 1743 + fresh: 2.0.0 1744 + http-errors: 2.0.1 1745 + merge-descriptors: 2.0.0 1746 + mime-types: 3.0.2 1747 + on-finished: 2.4.1 1748 + once: 1.4.0 1749 + parseurl: 1.3.3 1750 + proxy-addr: 2.0.7 1751 + qs: 6.15.0 1752 + range-parser: 1.2.1 1753 + router: 2.2.0 1754 + send: 1.2.1 1755 + serve-static: 2.2.1 1756 + statuses: 2.0.2 1757 + type-is: 2.0.1 1758 + vary: 1.1.2 1759 + transitivePeerDependencies: 1760 + - supports-color 1761 + 1411 1762 fast-deep-equal@3.1.3: {} 1412 1763 1413 1764 fast-glob@3.3.3: ··· 1438 1789 dependencies: 1439 1790 to-regex-range: 5.0.1 1440 1791 1792 + finalhandler@2.1.1: 1793 + dependencies: 1794 + debug: 4.4.3 1795 + encodeurl: 2.0.0 1796 + escape-html: 1.0.3 1797 + on-finished: 2.4.1 1798 + parseurl: 1.3.3 1799 + statuses: 2.0.2 1800 + transitivePeerDependencies: 1801 + - supports-color 1802 + 1803 + forwarded@0.2.0: {} 1804 + 1805 + fresh@2.0.0: {} 1806 + 1807 + function-bind@1.1.2: {} 1808 + 1441 1809 get-caller-file@2.0.5: {} 1442 1810 1443 1811 get-east-asian-width@1.4.0: {} 1444 1812 1813 + get-intrinsic@1.3.0: 1814 + dependencies: 1815 + call-bind-apply-helpers: 1.0.2 1816 + es-define-property: 1.0.1 1817 + es-errors: 1.3.0 1818 + es-object-atoms: 1.1.1 1819 + function-bind: 1.1.2 1820 + get-proto: 1.0.1 1821 + gopd: 1.2.0 1822 + has-symbols: 1.1.0 1823 + hasown: 2.0.2 1824 + math-intrinsics: 1.1.0 1825 + 1826 + get-proto@1.0.1: 1827 + dependencies: 1828 + dunder-proto: 1.0.1 1829 + es-object-atoms: 1.1.1 1830 + 1445 1831 glob-parent@5.1.2: 1446 1832 dependencies: 1447 1833 is-glob: 4.0.3 ··· 1455 1841 slash: 5.1.0 1456 1842 unicorn-magic: 0.4.0 1457 1843 1844 + gopd@1.2.0: {} 1845 + 1846 + has-symbols@1.1.0: {} 1847 + 1848 + hasown@2.0.2: 1849 + dependencies: 1850 + function-bind: 1.1.2 1851 + 1852 + http-errors@2.0.1: 1853 + dependencies: 1854 + depd: 2.0.0 1855 + inherits: 2.0.4 1856 + setprototypeof: 1.2.0 1857 + statuses: 2.0.2 1858 + toidentifier: 1.0.1 1859 + 1458 1860 iconv-lite@0.7.2: 1459 1861 dependencies: 1460 1862 safer-buffer: 2.1.2 1461 1863 1462 1864 ignore@7.0.5: {} 1463 1865 1866 + inherits@2.0.4: {} 1867 + 1868 + ipaddr.js@1.9.1: {} 1869 + 1464 1870 is-extglob@2.1.1: {} 1465 1871 1466 1872 is-glob@4.0.3: ··· 1470 1876 is-number@7.0.0: {} 1471 1877 1472 1878 is-path-inside@4.0.0: {} 1879 + 1880 + is-promise@4.0.0: {} 1473 1881 1474 1882 is-unicode-supported@2.1.0: {} 1475 1883 ··· 1505 1913 react: 19.2.4 1506 1914 trie-memoize: 1.2.0 1507 1915 1916 + math-intrinsics@1.1.0: {} 1917 + 1918 + media-typer@1.1.0: {} 1919 + 1920 + merge-descriptors@2.0.0: {} 1921 + 1508 1922 merge2@1.4.1: {} 1509 1923 1510 1924 micromatch@4.0.8: 1511 1925 dependencies: 1512 1926 braces: 3.0.3 1513 1927 picomatch: 2.3.1 1928 + 1929 + mime-db@1.54.0: {} 1930 + 1931 + mime-types@3.0.2: 1932 + dependencies: 1933 + mime-db: 1.54.0 1514 1934 1515 1935 minipass@7.1.2: {} 1516 1936 ··· 1518 1938 dependencies: 1519 1939 minipass: 7.1.2 1520 1940 1941 + ms@2.1.3: {} 1942 + 1521 1943 mustache@4.2.0: {} 1522 1944 1523 1945 mute-stream@3.0.0: {} 1524 1946 1525 1947 nanoid@5.1.6: {} 1526 1948 1949 + negotiator@1.0.0: {} 1950 + 1527 1951 node-gyp-build@4.8.4: {} 1528 1952 1953 + object-inspect@1.13.4: {} 1954 + 1955 + on-finished@2.4.1: 1956 + dependencies: 1957 + ee-first: 1.1.1 1958 + 1959 + once@1.4.0: 1960 + dependencies: 1961 + wrappy: 1.0.2 1962 + 1963 + parseurl@1.3.3: {} 1964 + 1965 + path-to-regexp@8.3.0: {} 1966 + 1529 1967 picocolors@1.1.1: {} 1530 1968 1531 1969 picomatch@2.3.1: {} ··· 1538 1976 1539 1977 prettier@3.8.1: {} 1540 1978 1979 + proxy-addr@2.0.7: 1980 + dependencies: 1981 + forwarded: 0.2.0 1982 + ipaddr.js: 1.9.1 1983 + 1541 1984 qfs-compression@0.2.3: {} 1542 1985 1986 + qs@6.15.0: 1987 + dependencies: 1988 + side-channel: 1.1.0 1989 + 1543 1990 queue-microtask@1.2.3: {} 1544 1991 1545 1992 raf-schd@4.0.3: {} 1546 1993 1994 + range-parser@1.2.1: {} 1995 + 1996 + raw-body@3.0.2: 1997 + dependencies: 1998 + bytes: 3.1.2 1999 + http-errors: 2.0.1 2000 + iconv-lite: 0.7.2 2001 + unpipe: 1.0.0 2002 + 1547 2003 react-dom@19.2.4(react@19.2.4): 1548 2004 dependencies: 1549 2005 react: 19.2.4 ··· 1580 2036 '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 1581 2037 '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 1582 2038 2039 + router@2.2.0: 2040 + dependencies: 2041 + debug: 4.4.3 2042 + depd: 2.0.0 2043 + is-promise: 4.0.0 2044 + parseurl: 1.3.3 2045 + path-to-regexp: 8.3.0 2046 + transitivePeerDependencies: 2047 + - supports-color 2048 + 1583 2049 run-parallel@1.2.0: 1584 2050 dependencies: 1585 2051 queue-microtask: 1.2.3 ··· 1590 2056 1591 2057 semver@7.7.4: {} 1592 2058 2059 + send@1.2.1: 2060 + dependencies: 2061 + debug: 4.4.3 2062 + encodeurl: 2.0.0 2063 + escape-html: 1.0.3 2064 + etag: 1.8.1 2065 + fresh: 2.0.0 2066 + http-errors: 2.0.1 2067 + mime-types: 3.0.2 2068 + ms: 2.1.3 2069 + on-finished: 2.4.1 2070 + range-parser: 1.2.1 2071 + statuses: 2.0.2 2072 + transitivePeerDependencies: 2073 + - supports-color 2074 + 2075 + serve-static@2.2.1: 2076 + dependencies: 2077 + encodeurl: 2.0.0 2078 + escape-html: 1.0.3 2079 + parseurl: 1.3.3 2080 + send: 1.2.1 2081 + transitivePeerDependencies: 2082 + - supports-color 2083 + 2084 + setprototypeof@1.2.0: {} 2085 + 2086 + side-channel-list@1.0.0: 2087 + dependencies: 2088 + es-errors: 1.3.0 2089 + object-inspect: 1.13.4 2090 + 2091 + side-channel-map@1.0.1: 2092 + dependencies: 2093 + call-bound: 1.0.4 2094 + es-errors: 1.3.0 2095 + get-intrinsic: 1.3.0 2096 + object-inspect: 1.13.4 2097 + 2098 + side-channel-weakmap@1.0.2: 2099 + dependencies: 2100 + call-bound: 1.0.4 2101 + es-errors: 1.3.0 2102 + get-intrinsic: 1.3.0 2103 + object-inspect: 1.13.4 2104 + side-channel-map: 1.0.1 2105 + 2106 + side-channel@1.1.0: 2107 + dependencies: 2108 + es-errors: 1.3.0 2109 + object-inspect: 1.13.4 2110 + side-channel-list: 1.0.0 2111 + side-channel-map: 1.0.1 2112 + side-channel-weakmap: 1.0.2 2113 + 1593 2114 signal-exit@4.1.0: {} 1594 2115 1595 2116 slash@5.1.0: {} 1596 2117 2118 + statuses@2.0.2: {} 2119 + 1597 2120 string-width@7.2.0: 1598 2121 dependencies: 1599 2122 emoji-regex: 10.6.0 ··· 1626 2149 dependencies: 1627 2150 is-number: 7.0.0 1628 2151 2152 + toidentifier@1.0.1: {} 2153 + 1629 2154 trie-memoize@1.2.0: {} 1630 2155 1631 2156 tslib@2.8.1: {} 1632 2157 2158 + type-is@2.0.1: 2159 + dependencies: 2160 + content-type: 1.0.5 2161 + media-typer: 1.1.0 2162 + mime-types: 3.0.2 2163 + 1633 2164 typescript@6.0.0-dev.20260213: {} 1634 2165 1635 2166 undici-types@7.16.0: {} ··· 1637 2168 unicode-segmenter@0.14.5: {} 1638 2169 1639 2170 unicorn-magic@0.4.0: {} 2171 + 2172 + unpipe@1.0.0: {} 2173 + 2174 + vary@1.1.2: {} 1640 2175 1641 2176 vscode-jsonrpc@8.2.0: {} 1642 2177 ··· 1658 2193 ansi-styles: 6.2.3 1659 2194 string-width: 7.2.0 1660 2195 strip-ansi: 7.1.2 2196 + 2197 + wrappy@1.0.2: {} 1661 2198 1662 2199 y18n@5.0.8: {} 1663 2200
+5 -1
public/atproto/signed-in-user.ts
··· 7 7 export const oauthClient = new StatefulPreactOAuthClient<KinklistClient>( 8 8 { 9 9 clientId: metadata.client_id, 10 - redirectUri: metadata.redirect_uris[0], 10 + redirectUri: document.location.host === 'localhost' 11 + ? 'http://localhost:8080/oauth-redirect.html' 12 + : document.location.host !== 'kinklist.github.io' 13 + ? 'https://kinklist.wisp.place/oauth-redirect.html' 14 + : 'https://kinklist.github.io/oauth-redirect.html', 11 15 scope: metadata.scope, 12 16 }, 13 17 {
+110 -58
public/main.tsx
··· 421 421 <td> 422 422 {kink.description != null ? ( 423 423 <Tippy content={kink.description}> 424 - <span class="has-description" title={kink.description}> 424 + <span class="has-description" aria-description={kink.description}> 425 425 {kink.name} 426 426 </span> 427 427 </Tippy> ··· 715 715 <h2 id="InputCategory"> 716 716 {currentKink?.category.description != null ? ( 717 717 <Tippy content={currentKink?.category.description}> 718 - <span class="has-description" title={currentKink?.category.description}> 718 + <span class="has-description" aria-description={currentKink?.category.description}> 719 719 {currentKink?.category.name} 720 720 </span> 721 721 </Tippy> ··· 726 726 <h3 id="InputField"><span class="participant">{currentKink?.participant}</span> 727 727 {currentKink?.kink.description != null ? ( 728 728 <Tippy content={currentKink?.kink.description}> 729 - <span class="has-description" title={currentKink?.kink.description}> 729 + <span class="has-description" aria-description={currentKink?.kink.description}> 730 730 {currentKink?.kink.name} 731 731 </span> 732 732 </Tippy> ··· 777 777 const [exportImageOpen, setExportImageOpen] = useState(false); 778 778 const [exportModalContent, setExportModalContent] = useState<HTMLElement | null>(null); 779 779 const [quizModeOpen, setQuizModeOpen] = useState(false); 780 + const [navbarMenuActive, setNavbarMenuActive] = useState(false); 780 781 781 782 function exportImageCallback() { 782 783 const canvas = exportImage(kinkData.value.kinkCategories, kinkData.value.kinksById, (kink, participant) => getSelectedKinkOrDefault(kink, participant).value); ··· 790 791 return; 791 792 } 792 793 793 - // @ts-ignore 794 794 navigator.permissions 795 + // @ts-expect-error 795 796 .query({ name: "clipboard-write" }) 796 797 .then((status) => { 797 798 if (status.state !== "granted") { ··· 827 828 828 829 const [hasInitialSession, setHasInitialSession] = useState(false); 829 830 830 - async function exportAtprotoCallback() { 831 + async function signIn(action: 'upload' | 'sign-in') { 831 832 localStorage.setItem("oauth-redirect-kinks", serializeChoices()); 833 + localStorage.setItem("oauth-redirect-action", action); 832 834 833 835 if (!hasInitialSession) { 834 836 await oauthClient.waitForInitialSession(); ··· 846 848 // in the useEffect that checks for the OAuth redirect page. 847 849 // If it does return, then we can proceed to upload the kinks immediately. 848 850 } 851 + } 852 + 853 + async function exportAtprotoCallback() { 854 + await signIn('upload'); 849 855 850 856 const success = await uploadKinks(); 851 857 ··· 866 872 section: category.name, 867 873 name: kink.name, 868 874 participant: participant, 869 - choice: getSelectedKinkOrDefault(kink, participant), 875 + choice: getSelectedKinkOrDefault(kink, participant).value, 870 876 })), 871 877 ), 872 878 ), ··· 886 892 887 893 // Retrieve kinks from local storage as OAuth metadata is in the hash 888 894 const storedKinks = localStorage.getItem("oauth-redirect-kinks"); 895 + const action = localStorage.getItem("oauth-redirect-action"); 889 896 890 897 if (storedKinks) { 891 898 console.log("Deserializing kinks from local storage"); ··· 896 903 await oauthClient.finalizeAuthorization(new URLSearchParams(hash)); 897 904 } 898 905 899 - console.log("Uploading kinks"); 900 - const success = await uploadKinks(); 906 + if (action === 'upload') { 907 + console.log("Uploading kinks"); 908 + const success = await uploadKinks(); 901 909 902 - // Return to index page without redirecting 903 - history.replaceState( 904 - null, 905 - "", 906 - location.origin + 907 - location.pathname.replace("/oauth-redirect.html", "") + 908 - location.search + 909 - "#" + 910 - serializeChoices(), 911 - ); 910 + // Return to index page without redirecting 911 + history.replaceState( 912 + null, 913 + "", 914 + location.origin + 915 + location.pathname.replace("/oauth-redirect.html", "") + 916 + location.search + 917 + "#" + 918 + serializeChoices(), 919 + ); 920 + 921 + if (success) { 922 + alert("Successfully uploaded kinks!"); 923 + } else { 924 + alert("Failed to upload kinks!"); 925 + } 926 + } 912 927 913 928 // Remove local storage 914 929 localStorage.removeItem("oauth-redirect-kinks"); 915 - 916 - if (success) { 917 - alert("Successfully uploaded kinks!"); 918 - } else { 919 - alert("Failed to upload kinks!"); 920 - } 930 + localStorage.removeItem("oauth-redirect-action"); 921 931 } 922 932 } 923 933 }); ··· 931 941 } 932 942 }, []); 933 943 944 + const [darkThemeChecked, setDarkThemeChecked] = useState(document.documentElement.classList.contains("theme-dark")); 945 + 934 946 return ( 935 947 <div id="root"> 936 948 <nav class="navbar px-5 mt-5 mb-2" role="navigation" aria-label="main navigation"> ··· 938 950 <div class="navbar-item"> 939 951 <h1 class="title">Kink list</h1> 940 952 </div> 941 - <div class="navbar-item"> 942 - <button id="export-image" class="button is-primary" onClick={exportImageCallback}> 953 + 954 + <a class="navbar-item" onClick={e => { 955 + e.preventDefault(); 956 + e.stopPropagation(); 957 + 958 + if (!darkThemeChecked) { 959 + localStorage.setItem("theme", "dark"); 960 + document.documentElement.classList.add("theme-dark"); 961 + setDarkThemeChecked(true); 962 + } else { 963 + localStorage.setItem("theme", "light"); 964 + document.documentElement.classList.remove("theme-dark"); 965 + setDarkThemeChecked(false); 966 + } 967 + }}> 968 + <label class="checkbox"> 969 + <input 970 + id="dark-theme" 971 + type="checkbox" 972 + onChange={(event) => { 973 + if (!darkThemeChecked) { 974 + localStorage.setItem("theme", "dark"); 975 + document.documentElement.classList.add("theme-dark"); 976 + setDarkThemeChecked(true); 977 + } else { 978 + localStorage.setItem("theme", "light"); 979 + document.documentElement.classList.remove("theme-dark"); 980 + setDarkThemeChecked(false); 981 + } 982 + }} 983 + checked={darkThemeChecked} 984 + />{" "} 985 + Dark theme 986 + </label> 987 + </a> 988 + 989 + <div role="button" class={`navbar-burger ${navbarMenuActive ? "is-active" : ""}`} onClick={() => setNavbarMenuActive(!navbarMenuActive)} aria-label="menu" aria-expanded={navbarMenuActive} data-target="navMenu"> 990 + <span aria-hidden="true"></span> 991 + <span aria-hidden="true"></span> 992 + <span aria-hidden="true"></span> 993 + <span aria-hidden="true"></span> 994 + </div> 995 + </div> 996 + 997 + <div class={`navbar-menu ${navbarMenuActive ? "is-active" : ""}`}> 998 + <div class="navbar-start"> 999 + <a class="navbar-item" id="export-image" onClick={exportImageCallback}> 943 1000 Export to Clipboard 944 - </button> 1001 + </a> 945 1002 946 1003 <Modal open={exportImageOpen} onClose={() => setExportImageOpen(false)} container={document.body}> 947 1004 <div class="box"> ··· 949 1006 <div id="export-modal-content">{exportModalContent}</div> 950 1007 </div> 951 1008 </Modal> 952 - </div> 953 - <div class="navbar-item"> 954 - <button id="export-atproto" class="button is-primary" onClick={exportAtprotoCallback}> 1009 + 1010 + <a class="navbar-item" onClick={exportAtprotoCallback}> 955 1011 Export to ATProto 956 - </button> 957 - </div> 958 - <div class="navbar-item"> 959 - <button id="view-changelog" class="button is-secondary" onClick={() => setChangelogOpen(true)}> 1012 + </a> 1013 + 1014 + <a class="navbar-item" onClick={() => setChangelogOpen(true)}> 960 1015 Changelog 961 - </button> 1016 + </a> 962 1017 963 1018 <Modal open={changelogOpen} onClose={() => setChangelogOpen(false)} container={document.body}> 964 1019 <div class="box content"> ··· 975 1030 ))} 976 1031 </div> 977 1032 </Modal> 978 - </div> 979 - <div class="navbar-item"> 980 - <button id="quiz-mode" class="button is-secondary" onClick={() => setQuizModeOpen(true)}> 1033 + 1034 + <a class="navbar-item" onClick={() => setQuizModeOpen(true)}> 981 1035 Quiz Mode 982 - </button> 1036 + </a> 983 1037 984 1038 <Modal open={quizModeOpen} onClose={() => setQuizModeOpen(false)} container={document.body}> 985 1039 <QuizMode /> 986 1040 </Modal> 987 1041 </div> 988 - <div class="navbar-item"> 989 - <label class="checkbox"> 990 - <input 991 - id="dark-theme" 992 - type="checkbox" 993 - onChange={(event) => { 994 - if (event.currentTarget.checked) { 995 - localStorage.setItem("theme", "dark"); 996 - document.documentElement.classList.add("theme-dark"); 997 - } else { 998 - localStorage.setItem("theme", "light"); 999 - document.documentElement.classList.remove("theme-dark"); 1000 - } 1001 - }} 1002 - checked={document.documentElement.classList.contains("theme-dark")} 1003 - />{" "} 1004 - Dark theme 1005 - </label> 1006 - </div> 1042 + 1043 + {hasInitialSession && <div class="navbar-end"> 1044 + {user.value 1045 + ? <> 1046 + <div class="navbar-item"> 1047 + Signed in as @{user.value.handle} 1048 + </div> 1049 + <a class="navbar-item" onClick={() => oauthClient.revokeSessions()}> 1050 + Sign out 1051 + </a> 1052 + </> 1053 + : ( 1054 + <a class="navbar-item" onClick={() => signIn('sign-in')}> 1055 + Sign in with ATProto 1056 + </a> 1057 + )} 1058 + </div>} 1007 1059 </div> 1008 1060 </nav> 1009 1061
-9
public/style.css
··· 217 217 border-color: white; 218 218 } 219 219 220 - /* Stack navbar items vertically on mobile */ 221 - @media screen and (max-width: 1023px) { 222 - .navbar-brand { 223 - display: flex; 224 - flex-direction: column; 225 - justify-content: center; 226 - } 227 - } 228 - 229 220 /* Quiz mode */ 230 221 231 222 #InputOverlay {
+1
public/tsconfig.json
··· 2 2 "compilerOptions": { 3 3 "strict": true, 4 4 "module": "esnext", 5 + "moduleResolution": "bundler", 5 6 "target": "es6", 6 7 "lib": ["ESNext", "dom", "dom.iterable"], 7 8 "jsx": "react-jsx",
+17
servelocal.mjs
··· 1 + // @ts-check 2 + import express, { static as serveStatic } from 'express'; 3 + import { resolve } from 'path'; 4 + const port = process.env.PORT || 8080; 5 + const app = express(); 6 + 7 + // serve static assets normally 8 + app.use(serveStatic(resolve('./public'))); 9 + 10 + // handle every other route with index.html, which will contain 11 + // a script tag to your application's JavaScript file(s). 12 + app.get('*meow', function (request, response) { 13 + response.sendFile(resolve('./public/index.html')); 14 + }); 15 + 16 + app.listen(port); 17 + console.log("server started on port " + port);