atmosphere explorer
0
fork

Configure Feed

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

new search

Juliet 4b79d86e f0a74a26

+319 -314
+1 -1
package.json
··· 9 9 "serve": "vite preview" 10 10 }, 11 11 "devDependencies": { 12 - "@iconify-json/lucide": "^1.2.85", 12 + "@iconify-json/lucide": "^1.2.86", 13 13 "@iconify/tailwind4": "^1.2.1", 14 14 "@tailwindcss/vite": "^4.1.18", 15 15 "prettier": "^3.8.0",
+156 -156
pnpm-lock.yaml
··· 112 112 version: 1.9.10 113 113 devDependencies: 114 114 '@iconify-json/lucide': 115 - specifier: ^1.2.85 116 - version: 1.2.85 115 + specifier: ^1.2.86 116 + version: 1.2.86 117 117 '@iconify/tailwind4': 118 118 specifier: ^1.2.1 119 119 version: 1.2.1(tailwindcss@4.1.18) 120 120 '@tailwindcss/vite': 121 121 specifier: ^4.1.18 122 - version: 4.1.18(vite@7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 122 + version: 4.1.18(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 123 123 prettier: 124 124 specifier: ^3.8.0 125 125 version: 3.8.0 ··· 137 137 version: 5.9.3 138 138 vite: 139 139 specifier: ^7.3.1 140 - version: 7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 140 + version: 7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 141 141 vite-plugin-solid: 142 142 specifier: ^2.11.10 143 - version: 2.11.10(solid-js@1.9.10)(vite@7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 143 + version: 2.11.10(solid-js@1.9.10)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 144 144 145 145 packages: 146 146 ··· 197 197 '@atcute/lexicons@1.2.6': 198 198 resolution: {integrity: sha512-s76UQd8D+XmHIzrjD9CJ9SOOeeLPHc+sMmcj7UFakAW/dDFXc579fcRdRfuUKvXBL5v1Gs2VgDdlh/IvvQZAwA==} 199 199 200 - '@atcute/mst@0.1.1': 201 - resolution: {integrity: sha512-NZ/lZ68GOjmAgBSeGf6WHyKM5wo1Hhc7PNt9uwsViswGPMNEEKNj9cw+0YGziXee/Qbnvc+CKqbRSPwruhXFQg==} 200 + '@atcute/mst@0.1.2': 201 + resolution: {integrity: sha512-Oz5CZTjqauEJLT9B+zkoy/mjl216DrjCxJFrguRV3N+1NkIbCfAcSRf3UDSNjfzDzBkJvC1WjA/3oQkm83duPg==} 202 202 203 203 '@atcute/multibase@1.1.6': 204 204 resolution: {integrity: sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg==} ··· 215 215 '@atcute/tid@1.1.1': 216 216 resolution: {integrity: sha512-djJ8UGhLkTU5V51yCnBEruMg35qETjWzWy5sJG/2gEOl2Gd7rQWHSaf+yrO6vMS5EFA38U2xOWE3EDUPzvc2ZQ==} 217 217 218 - '@atcute/time-ms@1.0.0': 219 - resolution: {integrity: sha512-iWEOlMBcO3ktB+zQPC2kXka9H/798we+IWq2sjhb+hQJNNfcJrwejzvNi/68Q3jKo/hdfwZjRU9iF8U6D32/2Q==} 218 + '@atcute/time-ms@1.2.0': 219 + resolution: {integrity: sha512-dtNKebVIbr1+yu3a6vgtL4sfkNgxkL3aA+ohHsjtW83WWMjjGvX8GVTVmYCJ2dYSxIoxK0q1yWs11PmlqzmQ/A==} 220 220 221 221 '@atcute/uint8array@1.0.6': 222 222 resolution: {integrity: sha512-ucfRBQc7BFT8n9eCyGOzDHEMKF/nZwhS2pPao4Xtab1ML3HdFYcX2DM1tadCzas85QTGxHe5urnUAAcNKGRi9A==} ··· 658 658 '@codemirror/view': ^6.0.0 659 659 '@lezer/highlight': ^1.0.0 660 660 661 - '@iconify-json/lucide@1.2.85': 662 - resolution: {integrity: sha512-VXUWT6KRDiVK4Ty/7Ypu+U0KnSbHzDAOOiSgLLPhU8u3ES5IusP1X7ahZb1iwiVKGWRG6gkKywaRUIZLgYWXyA==} 661 + '@iconify-json/lucide@1.2.86': 662 + resolution: {integrity: sha512-W/Jz7/gGOkI9u43r+UHmQtZtcyw2YLvMwiHa01WV6V4DYltrPNXiD+bCa+djV8LZB1uwF8CiympOMIbgiQ74nA==} 663 663 664 664 '@iconify/tailwind4@1.2.1': 665 665 resolution: {integrity: sha512-Hd7k8y7uzT3hk8ltw0jGku0r0wA8sc3d2iMvVTYv/9tMxBb+frZtWZGD9hDMU3EYuE+lMn58wi2lS8R2ZbwFcQ==} ··· 727 727 '@noble/secp256k1@3.0.0': 728 728 resolution: {integrity: sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg==} 729 729 730 - '@rollup/rollup-android-arm-eabi@4.55.1': 731 - resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} 730 + '@rollup/rollup-android-arm-eabi@4.55.3': 731 + resolution: {integrity: sha512-qyX8+93kK/7R5BEXPC2PjUt0+fS/VO2BVHjEHyIEWiYn88rcRBHmdLgoJjktBltgAf+NY7RfCGB1SoyKS/p9kg==} 732 732 cpu: [arm] 733 733 os: [android] 734 734 735 - '@rollup/rollup-android-arm64@4.55.1': 736 - resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} 735 + '@rollup/rollup-android-arm64@4.55.3': 736 + resolution: {integrity: sha512-6sHrL42bjt5dHQzJ12Q4vMKfN+kUnZ0atHHnv4V0Wd9JMTk7FDzSY35+7qbz3ypQYMBPANbpGK7JpnWNnhGt8g==} 737 737 cpu: [arm64] 738 738 os: [android] 739 739 740 - '@rollup/rollup-darwin-arm64@4.55.1': 741 - resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} 740 + '@rollup/rollup-darwin-arm64@4.55.3': 741 + resolution: {integrity: sha512-1ht2SpGIjEl2igJ9AbNpPIKzb1B5goXOcmtD0RFxnwNuMxqkR6AUaaErZz+4o+FKmzxcSNBOLrzsICZVNYa1Rw==} 742 742 cpu: [arm64] 743 743 os: [darwin] 744 744 745 - '@rollup/rollup-darwin-x64@4.55.1': 746 - resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} 745 + '@rollup/rollup-darwin-x64@4.55.3': 746 + resolution: {integrity: sha512-FYZ4iVunXxtT+CZqQoPVwPhH7549e/Gy7PIRRtq4t5f/vt54pX6eG9ebttRH6QSH7r/zxAFA4EZGlQ0h0FvXiA==} 747 747 cpu: [x64] 748 748 os: [darwin] 749 749 750 - '@rollup/rollup-freebsd-arm64@4.55.1': 751 - resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} 750 + '@rollup/rollup-freebsd-arm64@4.55.3': 751 + resolution: {integrity: sha512-M/mwDCJ4wLsIgyxv2Lj7Len+UMHd4zAXu4GQ2UaCdksStglWhP61U3uowkaYBQBhVoNpwx5Hputo8eSqM7K82Q==} 752 752 cpu: [arm64] 753 753 os: [freebsd] 754 754 755 - '@rollup/rollup-freebsd-x64@4.55.1': 756 - resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} 755 + '@rollup/rollup-freebsd-x64@4.55.3': 756 + resolution: {integrity: sha512-5jZT2c7jBCrMegKYTYTpni8mg8y3uY8gzeq2ndFOANwNuC/xJbVAoGKR9LhMDA0H3nIhvaqUoBEuJoICBudFrA==} 757 757 cpu: [x64] 758 758 os: [freebsd] 759 759 760 - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': 761 - resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} 760 + '@rollup/rollup-linux-arm-gnueabihf@4.55.3': 761 + resolution: {integrity: sha512-YeGUhkN1oA+iSPzzhEjVPS29YbViOr8s4lSsFaZKLHswgqP911xx25fPOyE9+khmN6W4VeM0aevbDp4kkEoHiA==} 762 762 cpu: [arm] 763 763 os: [linux] 764 764 765 - '@rollup/rollup-linux-arm-musleabihf@4.55.1': 766 - resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} 765 + '@rollup/rollup-linux-arm-musleabihf@4.55.3': 766 + resolution: {integrity: sha512-eo0iOIOvcAlWB3Z3eh8pVM8hZ0oVkK3AjEM9nSrkSug2l15qHzF3TOwT0747omI6+CJJvl7drwZepT+re6Fy/w==} 767 767 cpu: [arm] 768 768 os: [linux] 769 769 770 - '@rollup/rollup-linux-arm64-gnu@4.55.1': 771 - resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} 770 + '@rollup/rollup-linux-arm64-gnu@4.55.3': 771 + resolution: {integrity: sha512-DJay3ep76bKUDImmn//W5SvpjRN5LmK/ntWyeJs/dcnwiiHESd3N4uteK9FDLf0S0W8E6Y0sVRXpOCoQclQqNg==} 772 772 cpu: [arm64] 773 773 os: [linux] 774 774 775 - '@rollup/rollup-linux-arm64-musl@4.55.1': 776 - resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} 775 + '@rollup/rollup-linux-arm64-musl@4.55.3': 776 + resolution: {integrity: sha512-BKKWQkY2WgJ5MC/ayvIJTHjy0JUGb5efaHCUiG/39sSUvAYRBaO3+/EK0AZT1RF3pSj86O24GLLik9mAYu0IJg==} 777 777 cpu: [arm64] 778 778 os: [linux] 779 779 780 - '@rollup/rollup-linux-loong64-gnu@4.55.1': 781 - resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} 780 + '@rollup/rollup-linux-loong64-gnu@4.55.3': 781 + resolution: {integrity: sha512-Q9nVlWtKAG7ISW80OiZGxTr6rYtyDSkauHUtvkQI6TNOJjFvpj4gcH+KaJihqYInnAzEEUetPQubRwHef4exVg==} 782 782 cpu: [loong64] 783 783 os: [linux] 784 784 785 - '@rollup/rollup-linux-loong64-musl@4.55.1': 786 - resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} 785 + '@rollup/rollup-linux-loong64-musl@4.55.3': 786 + resolution: {integrity: sha512-2H5LmhzrpC4fFRNwknzmmTvvyJPHwESoJgyReXeFoYYuIDfBhP29TEXOkCJE/KxHi27mj7wDUClNq78ue3QEBQ==} 787 787 cpu: [loong64] 788 788 os: [linux] 789 789 790 - '@rollup/rollup-linux-ppc64-gnu@4.55.1': 791 - resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} 790 + '@rollup/rollup-linux-ppc64-gnu@4.55.3': 791 + resolution: {integrity: sha512-9S542V0ie9LCTznPYlvaeySwBeIEa7rDBgLHKZ5S9DBgcqdJYburabm8TqiqG6mrdTzfV5uttQRHcbKff9lWtA==} 792 792 cpu: [ppc64] 793 793 os: [linux] 794 794 795 - '@rollup/rollup-linux-ppc64-musl@4.55.1': 796 - resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} 795 + '@rollup/rollup-linux-ppc64-musl@4.55.3': 796 + resolution: {integrity: sha512-ukxw+YH3XXpcezLgbJeasgxyTbdpnNAkrIlFGDl7t+pgCxZ89/6n1a+MxlY7CegU+nDgrgdqDelPRNQ/47zs0g==} 797 797 cpu: [ppc64] 798 798 os: [linux] 799 799 800 - '@rollup/rollup-linux-riscv64-gnu@4.55.1': 801 - resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} 800 + '@rollup/rollup-linux-riscv64-gnu@4.55.3': 801 + resolution: {integrity: sha512-Iauw9UsTTvlF++FhghFJjqYxyXdggXsOqGpFBylaRopVpcbfyIIsNvkf9oGwfgIcf57z3m8+/oSYTo6HutBFNw==} 802 802 cpu: [riscv64] 803 803 os: [linux] 804 804 805 - '@rollup/rollup-linux-riscv64-musl@4.55.1': 806 - resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} 805 + '@rollup/rollup-linux-riscv64-musl@4.55.3': 806 + resolution: {integrity: sha512-3OqKAHSEQXKdq9mQ4eajqUgNIK27VZPW3I26EP8miIzuKzCJ3aW3oEn2pzF+4/Hj/Moc0YDsOtBgT5bZ56/vcA==} 807 807 cpu: [riscv64] 808 808 os: [linux] 809 809 810 - '@rollup/rollup-linux-s390x-gnu@4.55.1': 811 - resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} 810 + '@rollup/rollup-linux-s390x-gnu@4.55.3': 811 + resolution: {integrity: sha512-0CM8dSVzVIaqMcXIFej8zZrSFLnGrAE8qlNbbHfTw1EEPnFTg1U1ekI0JdzjPyzSfUsHWtodilQQG/RA55berA==} 812 812 cpu: [s390x] 813 813 os: [linux] 814 814 815 - '@rollup/rollup-linux-x64-gnu@4.55.1': 816 - resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} 815 + '@rollup/rollup-linux-x64-gnu@4.55.3': 816 + resolution: {integrity: sha512-+fgJE12FZMIgBaKIAGd45rxf+5ftcycANJRWk8Vz0NnMTM5rADPGuRFTYar+Mqs560xuART7XsX2lSACa1iOmQ==} 817 817 cpu: [x64] 818 818 os: [linux] 819 819 820 - '@rollup/rollup-linux-x64-musl@4.55.1': 821 - resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} 820 + '@rollup/rollup-linux-x64-musl@4.55.3': 821 + resolution: {integrity: sha512-tMD7NnbAolWPzQlJQJjVFh/fNH3K/KnA7K8gv2dJWCwwnaK6DFCYST1QXYWfu5V0cDwarWC8Sf/cfMHniNq21A==} 822 822 cpu: [x64] 823 823 os: [linux] 824 824 825 - '@rollup/rollup-openbsd-x64@4.55.1': 826 - resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} 825 + '@rollup/rollup-openbsd-x64@4.55.3': 826 + resolution: {integrity: sha512-u5KsqxOxjEeIbn7bUK1MPM34jrnPwjeqgyin4/N6e/KzXKfpE9Mi0nCxcQjaM9lLmPcHmn/xx1yOjgTMtu1jWQ==} 827 827 cpu: [x64] 828 828 os: [openbsd] 829 829 830 - '@rollup/rollup-openharmony-arm64@4.55.1': 831 - resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} 830 + '@rollup/rollup-openharmony-arm64@4.55.3': 831 + resolution: {integrity: sha512-vo54aXwjpTtsAnb3ca7Yxs9t2INZg7QdXN/7yaoG7nPGbOBXYXQY41Km+S1Ov26vzOAzLcAjmMdjyEqS1JkVhw==} 832 832 cpu: [arm64] 833 833 os: [openharmony] 834 834 835 - '@rollup/rollup-win32-arm64-msvc@4.55.1': 836 - resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} 835 + '@rollup/rollup-win32-arm64-msvc@4.55.3': 836 + resolution: {integrity: sha512-HI+PIVZ+m+9AgpnY3pt6rinUdRYrGHvmVdsNQ4odNqQ/eRF78DVpMR7mOq7nW06QxpczibwBmeQzB68wJ+4W4A==} 837 837 cpu: [arm64] 838 838 os: [win32] 839 839 840 - '@rollup/rollup-win32-ia32-msvc@4.55.1': 841 - resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} 840 + '@rollup/rollup-win32-ia32-msvc@4.55.3': 841 + resolution: {integrity: sha512-vRByotbdMo3Wdi+8oC2nVxtc3RkkFKrGaok+a62AT8lz/YBuQjaVYAS5Zcs3tPzW43Vsf9J0wehJbUY5xRSekA==} 842 842 cpu: [ia32] 843 843 os: [win32] 844 844 845 - '@rollup/rollup-win32-x64-gnu@4.55.1': 846 - resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} 845 + '@rollup/rollup-win32-x64-gnu@4.55.3': 846 + resolution: {integrity: sha512-POZHq7UeuzMJljC5NjKi8vKMFN6/5EOqcX1yGntNLp7rUTpBAXQ1hW8kWPFxYLv07QMcNM75xqVLGPWQq6TKFA==} 847 847 cpu: [x64] 848 848 os: [win32] 849 849 850 - '@rollup/rollup-win32-x64-msvc@4.55.1': 851 - resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} 850 + '@rollup/rollup-win32-x64-msvc@4.55.3': 851 + resolution: {integrity: sha512-aPFONczE4fUFKNXszdvnd2GqKEYQdV5oEsIbKPujJmWlCI9zEsv1Otig8RKK+X9bed9gFUN6LAeN4ZcNuu4zjg==} 852 852 cpu: [x64] 853 853 os: [win32] 854 854 ··· 970 970 '@types/babel__traverse@7.28.0': 971 971 resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} 972 972 973 + '@types/bun@1.3.6': 974 + resolution: {integrity: sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA==} 975 + 973 976 '@types/estree@1.0.8': 974 977 resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 975 978 976 - '@types/node@22.19.6': 977 - resolution: {integrity: sha512-qm+G8HuG6hOHQigsi7VGuLjUVu6TtBo/F05zvX04Mw2uCg9Dv0Qxy3Qw7j41SidlTcl5D/5yg0SEZqOB+EqZnQ==} 978 - 979 - '@types/node@24.10.1': 980 - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} 979 + '@types/node@25.0.9': 980 + resolution: {integrity: sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==} 981 981 982 982 acorn@8.15.0: 983 983 resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} ··· 998 998 solid-js: 999 999 optional: true 1000 1000 1001 - baseline-browser-mapping@2.9.14: 1002 - resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} 1001 + baseline-browser-mapping@2.9.17: 1002 + resolution: {integrity: sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==} 1003 1003 hasBin: true 1004 1004 1005 1005 boolbase@1.0.0: ··· 1010 1010 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1011 1011 hasBin: true 1012 1012 1013 - caniuse-lite@1.0.30001764: 1014 - resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} 1013 + bun-types@1.3.6: 1014 + resolution: {integrity: sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ==} 1015 + 1016 + caniuse-lite@1.0.30001765: 1017 + resolution: {integrity: sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==} 1015 1018 1016 1019 codemirror@6.0.2: 1017 1020 resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} ··· 1389 1392 resolve-pkg-maps@1.0.0: 1390 1393 resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1391 1394 1392 - rollup@4.55.1: 1393 - resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} 1395 + rollup@4.55.3: 1396 + resolution: {integrity: sha512-y9yUpfQvetAjiDLtNMf1hL9NXchIJgWt6zIKeoB+tCd3npX08Eqfzg60V9DhIGVMtQ0AlMkFw5xa+AQ37zxnAA==} 1394 1397 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1395 1398 hasBin: true 1396 1399 ··· 1459 1462 1460 1463 ufo@1.6.3: 1461 1464 resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} 1462 - 1463 - undici-types@6.21.0: 1464 - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1465 1465 1466 1466 undici-types@7.16.0: 1467 1467 resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} ··· 1655 1655 '@standard-schema/spec': 1.1.0 1656 1656 esm-env: 1.2.2 1657 1657 1658 - '@atcute/mst@0.1.1': 1658 + '@atcute/mst@0.1.2': 1659 1659 dependencies: 1660 1660 '@atcute/cbor': 2.3.0 1661 1661 '@atcute/cid': 2.4.0 ··· 1683 1683 '@atcute/cid': 2.4.0 1684 1684 '@atcute/crypto': 2.3.0 1685 1685 '@atcute/lexicons': 1.2.6 1686 - '@atcute/mst': 0.1.1 1686 + '@atcute/mst': 0.1.2 1687 1687 '@atcute/uint8array': 1.0.6 1688 1688 1689 1689 '@atcute/tangled@1.0.14': ··· 1693 1693 1694 1694 '@atcute/tid@1.1.1': 1695 1695 dependencies: 1696 - '@atcute/time-ms': 1.0.0 1696 + '@atcute/time-ms': 1.2.0 1697 1697 1698 - '@atcute/time-ms@1.0.0': 1698 + '@atcute/time-ms@1.2.0': 1699 1699 dependencies: 1700 - '@types/node': 22.19.6 1700 + '@types/bun': 1.3.6 1701 1701 node-gyp-build: 4.8.4 1702 1702 1703 1703 '@atcute/uint8array@1.0.6': {} ··· 2044 2044 '@codemirror/view': 6.39.11 2045 2045 '@lezer/highlight': 1.2.3 2046 2046 2047 - '@iconify-json/lucide@1.2.85': 2047 + '@iconify-json/lucide@1.2.86': 2048 2048 dependencies: 2049 2049 '@iconify/types': 2.0.0 2050 2050 ··· 2129 2129 2130 2130 '@noble/secp256k1@3.0.0': {} 2131 2131 2132 - '@rollup/rollup-android-arm-eabi@4.55.1': 2132 + '@rollup/rollup-android-arm-eabi@4.55.3': 2133 2133 optional: true 2134 2134 2135 - '@rollup/rollup-android-arm64@4.55.1': 2135 + '@rollup/rollup-android-arm64@4.55.3': 2136 2136 optional: true 2137 2137 2138 - '@rollup/rollup-darwin-arm64@4.55.1': 2138 + '@rollup/rollup-darwin-arm64@4.55.3': 2139 2139 optional: true 2140 2140 2141 - '@rollup/rollup-darwin-x64@4.55.1': 2141 + '@rollup/rollup-darwin-x64@4.55.3': 2142 2142 optional: true 2143 2143 2144 - '@rollup/rollup-freebsd-arm64@4.55.1': 2144 + '@rollup/rollup-freebsd-arm64@4.55.3': 2145 2145 optional: true 2146 2146 2147 - '@rollup/rollup-freebsd-x64@4.55.1': 2147 + '@rollup/rollup-freebsd-x64@4.55.3': 2148 2148 optional: true 2149 2149 2150 - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': 2150 + '@rollup/rollup-linux-arm-gnueabihf@4.55.3': 2151 2151 optional: true 2152 2152 2153 - '@rollup/rollup-linux-arm-musleabihf@4.55.1': 2153 + '@rollup/rollup-linux-arm-musleabihf@4.55.3': 2154 2154 optional: true 2155 2155 2156 - '@rollup/rollup-linux-arm64-gnu@4.55.1': 2156 + '@rollup/rollup-linux-arm64-gnu@4.55.3': 2157 2157 optional: true 2158 2158 2159 - '@rollup/rollup-linux-arm64-musl@4.55.1': 2159 + '@rollup/rollup-linux-arm64-musl@4.55.3': 2160 2160 optional: true 2161 2161 2162 - '@rollup/rollup-linux-loong64-gnu@4.55.1': 2162 + '@rollup/rollup-linux-loong64-gnu@4.55.3': 2163 2163 optional: true 2164 2164 2165 - '@rollup/rollup-linux-loong64-musl@4.55.1': 2165 + '@rollup/rollup-linux-loong64-musl@4.55.3': 2166 2166 optional: true 2167 2167 2168 - '@rollup/rollup-linux-ppc64-gnu@4.55.1': 2168 + '@rollup/rollup-linux-ppc64-gnu@4.55.3': 2169 2169 optional: true 2170 2170 2171 - '@rollup/rollup-linux-ppc64-musl@4.55.1': 2171 + '@rollup/rollup-linux-ppc64-musl@4.55.3': 2172 2172 optional: true 2173 2173 2174 - '@rollup/rollup-linux-riscv64-gnu@4.55.1': 2174 + '@rollup/rollup-linux-riscv64-gnu@4.55.3': 2175 2175 optional: true 2176 2176 2177 - '@rollup/rollup-linux-riscv64-musl@4.55.1': 2177 + '@rollup/rollup-linux-riscv64-musl@4.55.3': 2178 2178 optional: true 2179 2179 2180 - '@rollup/rollup-linux-s390x-gnu@4.55.1': 2180 + '@rollup/rollup-linux-s390x-gnu@4.55.3': 2181 2181 optional: true 2182 2182 2183 - '@rollup/rollup-linux-x64-gnu@4.55.1': 2183 + '@rollup/rollup-linux-x64-gnu@4.55.3': 2184 2184 optional: true 2185 2185 2186 - '@rollup/rollup-linux-x64-musl@4.55.1': 2186 + '@rollup/rollup-linux-x64-musl@4.55.3': 2187 2187 optional: true 2188 2188 2189 - '@rollup/rollup-openbsd-x64@4.55.1': 2189 + '@rollup/rollup-openbsd-x64@4.55.3': 2190 2190 optional: true 2191 2191 2192 - '@rollup/rollup-openharmony-arm64@4.55.1': 2192 + '@rollup/rollup-openharmony-arm64@4.55.3': 2193 2193 optional: true 2194 2194 2195 - '@rollup/rollup-win32-arm64-msvc@4.55.1': 2195 + '@rollup/rollup-win32-arm64-msvc@4.55.3': 2196 2196 optional: true 2197 2197 2198 - '@rollup/rollup-win32-ia32-msvc@4.55.1': 2198 + '@rollup/rollup-win32-ia32-msvc@4.55.3': 2199 2199 optional: true 2200 2200 2201 - '@rollup/rollup-win32-x64-gnu@4.55.1': 2201 + '@rollup/rollup-win32-x64-gnu@4.55.3': 2202 2202 optional: true 2203 2203 2204 - '@rollup/rollup-win32-x64-msvc@4.55.1': 2204 + '@rollup/rollup-win32-x64-msvc@4.55.3': 2205 2205 optional: true 2206 2206 2207 2207 '@skyware/firehose@0.5.2': ··· 2281 2281 '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 2282 2282 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 2283 2283 2284 - '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2))': 2284 + '@tailwindcss/vite@4.1.18(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2))': 2285 2285 dependencies: 2286 2286 '@tailwindcss/node': 4.1.18 2287 2287 '@tailwindcss/oxide': 4.1.18 2288 2288 tailwindcss: 4.1.18 2289 - vite: 7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2289 + vite: 7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2290 2290 2291 2291 '@types/babel__core@7.20.5': 2292 2292 dependencies: ··· 2309 2309 dependencies: 2310 2310 '@babel/types': 7.28.6 2311 2311 2312 + '@types/bun@1.3.6': 2313 + dependencies: 2314 + bun-types: 1.3.6 2315 + 2312 2316 '@types/estree@1.0.8': {} 2313 2317 2314 - '@types/node@22.19.6': 2315 - dependencies: 2316 - undici-types: 6.21.0 2317 - 2318 - '@types/node@24.10.1': 2318 + '@types/node@25.0.9': 2319 2319 dependencies: 2320 2320 undici-types: 7.16.0 2321 - optional: true 2322 2321 2323 2322 acorn@8.15.0: {} 2324 2323 ··· 2338 2337 optionalDependencies: 2339 2338 solid-js: 1.9.10 2340 2339 2341 - baseline-browser-mapping@2.9.14: {} 2340 + baseline-browser-mapping@2.9.17: {} 2342 2341 2343 2342 boolbase@1.0.0: {} 2344 2343 2345 2344 browserslist@4.28.1: 2346 2345 dependencies: 2347 - baseline-browser-mapping: 2.9.14 2348 - caniuse-lite: 1.0.30001764 2346 + baseline-browser-mapping: 2.9.17 2347 + caniuse-lite: 1.0.30001765 2349 2348 electron-to-chromium: 1.5.267 2350 2349 node-releases: 2.0.27 2351 2350 update-browserslist-db: 1.2.3(browserslist@4.28.1) 2352 2351 2353 - caniuse-lite@1.0.30001764: {} 2352 + bun-types@1.3.6: 2353 + dependencies: 2354 + '@types/node': 25.0.9 2355 + 2356 + caniuse-lite@1.0.30001765: {} 2354 2357 2355 2358 codemirror@6.0.2: 2356 2359 dependencies: ··· 2665 2668 resolve-pkg-maps@1.0.0: 2666 2669 optional: true 2667 2670 2668 - rollup@4.55.1: 2671 + rollup@4.55.3: 2669 2672 dependencies: 2670 2673 '@types/estree': 1.0.8 2671 2674 optionalDependencies: 2672 - '@rollup/rollup-android-arm-eabi': 4.55.1 2673 - '@rollup/rollup-android-arm64': 4.55.1 2674 - '@rollup/rollup-darwin-arm64': 4.55.1 2675 - '@rollup/rollup-darwin-x64': 4.55.1 2676 - '@rollup/rollup-freebsd-arm64': 4.55.1 2677 - '@rollup/rollup-freebsd-x64': 4.55.1 2678 - '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 2679 - '@rollup/rollup-linux-arm-musleabihf': 4.55.1 2680 - '@rollup/rollup-linux-arm64-gnu': 4.55.1 2681 - '@rollup/rollup-linux-arm64-musl': 4.55.1 2682 - '@rollup/rollup-linux-loong64-gnu': 4.55.1 2683 - '@rollup/rollup-linux-loong64-musl': 4.55.1 2684 - '@rollup/rollup-linux-ppc64-gnu': 4.55.1 2685 - '@rollup/rollup-linux-ppc64-musl': 4.55.1 2686 - '@rollup/rollup-linux-riscv64-gnu': 4.55.1 2687 - '@rollup/rollup-linux-riscv64-musl': 4.55.1 2688 - '@rollup/rollup-linux-s390x-gnu': 4.55.1 2689 - '@rollup/rollup-linux-x64-gnu': 4.55.1 2690 - '@rollup/rollup-linux-x64-musl': 4.55.1 2691 - '@rollup/rollup-openbsd-x64': 4.55.1 2692 - '@rollup/rollup-openharmony-arm64': 4.55.1 2693 - '@rollup/rollup-win32-arm64-msvc': 4.55.1 2694 - '@rollup/rollup-win32-ia32-msvc': 4.55.1 2695 - '@rollup/rollup-win32-x64-gnu': 4.55.1 2696 - '@rollup/rollup-win32-x64-msvc': 4.55.1 2675 + '@rollup/rollup-android-arm-eabi': 4.55.3 2676 + '@rollup/rollup-android-arm64': 4.55.3 2677 + '@rollup/rollup-darwin-arm64': 4.55.3 2678 + '@rollup/rollup-darwin-x64': 4.55.3 2679 + '@rollup/rollup-freebsd-arm64': 4.55.3 2680 + '@rollup/rollup-freebsd-x64': 4.55.3 2681 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.3 2682 + '@rollup/rollup-linux-arm-musleabihf': 4.55.3 2683 + '@rollup/rollup-linux-arm64-gnu': 4.55.3 2684 + '@rollup/rollup-linux-arm64-musl': 4.55.3 2685 + '@rollup/rollup-linux-loong64-gnu': 4.55.3 2686 + '@rollup/rollup-linux-loong64-musl': 4.55.3 2687 + '@rollup/rollup-linux-ppc64-gnu': 4.55.3 2688 + '@rollup/rollup-linux-ppc64-musl': 4.55.3 2689 + '@rollup/rollup-linux-riscv64-gnu': 4.55.3 2690 + '@rollup/rollup-linux-riscv64-musl': 4.55.3 2691 + '@rollup/rollup-linux-s390x-gnu': 4.55.3 2692 + '@rollup/rollup-linux-x64-gnu': 4.55.3 2693 + '@rollup/rollup-linux-x64-musl': 4.55.3 2694 + '@rollup/rollup-openbsd-x64': 4.55.3 2695 + '@rollup/rollup-openharmony-arm64': 4.55.3 2696 + '@rollup/rollup-win32-arm64-msvc': 4.55.3 2697 + '@rollup/rollup-win32-ia32-msvc': 4.55.3 2698 + '@rollup/rollup-win32-x64-gnu': 4.55.3 2699 + '@rollup/rollup-win32-x64-msvc': 4.55.3 2697 2700 fsevents: 2.3.3 2698 2701 2699 2702 sax@1.4.4: {} ··· 2758 2761 2759 2762 ufo@1.6.3: {} 2760 2763 2761 - undici-types@6.21.0: {} 2762 - 2763 - undici-types@7.16.0: 2764 - optional: true 2764 + undici-types@7.16.0: {} 2765 2765 2766 2766 unicode-segmenter@0.14.5: {} 2767 2767 ··· 2771 2771 escalade: 3.2.0 2772 2772 picocolors: 1.1.1 2773 2773 2774 - vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 2774 + vite-plugin-solid@2.11.10(solid-js@1.9.10)(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 2775 2775 dependencies: 2776 2776 '@babel/core': 7.28.6 2777 2777 '@types/babel__core': 7.20.5 ··· 2779 2779 merge-anything: 5.1.7 2780 2780 solid-js: 1.9.10 2781 2781 solid-refresh: 0.6.3(solid-js@1.9.10) 2782 - vite: 7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2783 - vitefu: 1.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 2782 + vite: 7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2783 + vitefu: 1.1.1(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)) 2784 2784 transitivePeerDependencies: 2785 2785 - supports-color 2786 2786 2787 - vite@7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2): 2787 + vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2): 2788 2788 dependencies: 2789 2789 esbuild: 0.27.2 2790 2790 fdir: 6.5.0(picomatch@4.0.3) 2791 2791 picomatch: 4.0.3 2792 2792 postcss: 8.5.6 2793 - rollup: 4.55.1 2793 + rollup: 4.55.3 2794 2794 tinyglobby: 0.2.15 2795 2795 optionalDependencies: 2796 - '@types/node': 24.10.1 2796 + '@types/node': 25.0.9 2797 2797 fsevents: 2.3.3 2798 2798 jiti: 2.6.1 2799 2799 lightningcss: 1.30.2 2800 2800 tsx: 4.19.2 2801 2801 2802 - vitefu@1.1.1(vite@7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 2802 + vitefu@1.1.1(vite@7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2)): 2803 2803 optionalDependencies: 2804 - vite: 7.3.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2804 + vite: 7.3.1(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.19.2) 2805 2805 2806 2806 w3c-keyname@2.2.8: {} 2807 2807
+158 -151
src/components/search.tsx
··· 66 66 return ( 67 67 <button 68 68 onclick={() => setShowSearch(!showSearch())} 69 - class="dark:bg-dark-200 text-baseline dark:hover:bg-dark-100 mr-1 box-border flex h-7 items-center gap-1 rounded-md border-[0.5px] border-neutral-300 bg-white px-2 text-xs hover:bg-neutral-100 active:bg-neutral-200 dark:border-neutral-600 dark:active:bg-neutral-700" 69 + class="dark:bg-dark-200 dark:hover:bg-dark-100 mr-1 box-border flex h-7.5 items-center gap-1 rounded-lg border-[0.5px] border-neutral-300 bg-white px-2 text-xs text-neutral-500 hover:bg-neutral-100 active:bg-neutral-200 dark:border-neutral-600 dark:text-neutral-400 dark:active:bg-neutral-700" 70 70 > 71 71 <span class="iconify lucide--search"></span> 72 - <Show 73 - when={!isTouchDevice} 74 - fallback={<span class="text-neutral-500 dark:text-neutral-400">Search</span>} 75 - > 76 - <kbd class="font-sans leading-none text-neutral-500 select-none dark:text-neutral-400"> 72 + <span>Search</span> 73 + <Show when={!isTouchDevice}> 74 + <kbd class="font-sans text-neutral-400 dark:text-neutral-500"> 77 75 {/Mac/i.test(navigator.platform) ? "⌘" : "⌃"}K 78 76 </kbd> 79 77 </Show> ··· 103 101 }); 104 102 105 103 createEffect(() => { 106 - if (showSearch()) searchInput.focus(); 104 + if (showSearch()) { 105 + searchInput.focus(); 106 + } else { 107 + setInput(undefined); 108 + setSelectedIndex(-1); 109 + setSearch(undefined); 110 + } 107 111 }); 108 112 109 - const fetchTypeahead = async (input: string) => { 113 + const fetchTypeahead = async (input: string | undefined) => { 114 + if (!input) return []; 115 + 110 116 const { prefix, query } = parsePrefix(input); 111 117 112 118 if (prefix === "@") { ··· 125 131 126 132 const [input, setInput] = createSignal<string>(); 127 133 const [selectedIndex, setSelectedIndex] = createSignal(-1); 128 - const [isFocused, setIsFocused] = createSignal(false); 129 - const [search] = createResource(createDebouncedValue(input, 200), fetchTypeahead); 134 + const [search, { mutate: setSearch }] = createResource( 135 + createDebouncedValue(input, 200), 136 + fetchTypeahead, 137 + ); 130 138 131 139 const getPrefixSuggestions = () => { 132 140 const currentInput = input(); ··· 149 157 } 150 158 151 159 setShowSearch(false); 152 - setInput(undefined); 153 - setSelectedIndex(-1); 154 160 155 161 const { prefix, query } = parsePrefix(input); 156 162 ··· 190 196 }; 191 197 192 198 return ( 193 - <form 194 - class="relative w-full" 195 - onsubmit={(e) => { 196 - e.preventDefault(); 197 - processInput(searchInput.value); 198 - }} 199 - > 200 - <label for="input" class="hidden"> 201 - PDS URL, AT URI, NSID, DID, or handle 202 - </label> 203 - <div class="dark:bg-dark-100 flex items-center gap-2 rounded-lg bg-white px-2 outline-1 outline-neutral-200 focus-within:outline-[1.5px] focus-within:outline-neutral-600 dark:outline-neutral-600 dark:focus-within:outline-neutral-400"> 204 - <label 205 - for="input" 206 - class="iconify lucide--search text-neutral-500 dark:text-neutral-400" 207 - ></label> 208 - <input 209 - type="text" 210 - spellcheck={false} 211 - autocapitalize="off" 212 - placeholder="Handle, DID, AT URI, NSID, PDS" 213 - ref={searchInput} 214 - id="input" 215 - class="grow py-1.5 select-none placeholder:text-sm focus:outline-none" 216 - value={input() ?? ""} 217 - onInput={(e) => { 218 - setInput(e.currentTarget.value); 219 - setSelectedIndex(-1); 199 + <Modal open={showSearch()} onClose={() => setShowSearch(false)} alignTop> 200 + <div class="dark:bg-dark-200 dark:shadow-dark-700 pointer-events-auto mx-3 w-full max-w-lg rounded-lg border-[0.5px] border-neutral-300 bg-white shadow-md transition-opacity duration-200 dark:border-neutral-700 starting:opacity-0"> 201 + <form 202 + class="w-full" 203 + onsubmit={(e) => { 204 + e.preventDefault(); 205 + processInput(searchInput.value); 220 206 }} 221 - onFocus={() => setIsFocused(true)} 222 - onBlur={() => { 223 - setSelectedIndex(-1); 224 - setIsFocused(false); 225 - }} 226 - onKeyDown={(e) => { 227 - const results = search(); 228 - const prefixSuggestions = getPrefixSuggestions(); 229 - const totalSuggestions = (prefixSuggestions.length || 0) + (results?.length || 0); 207 + > 208 + <label for="input" class="hidden"> 209 + PDS URL, AT URI, NSID, DID, or handle 210 + </label> 211 + <div 212 + class={`flex items-center gap-2 px-2 ${ 213 + getPrefixSuggestions().length > 0 || search()?.length ? "rounded-t-lg" : "rounded-lg" 214 + }`} 215 + > 216 + <label 217 + for="input" 218 + class="iconify lucide--search text-neutral-500 dark:text-neutral-400" 219 + ></label> 220 + <input 221 + type="text" 222 + spellcheck={false} 223 + autocapitalize="off" 224 + placeholder="Handle, DID, AT URI, NSID, PDS" 225 + ref={searchInput} 226 + id="input" 227 + class="grow py-2.5 select-none placeholder:text-sm focus:outline-none" 228 + value={input() ?? ""} 229 + onInput={(e) => { 230 + setInput(e.currentTarget.value); 231 + setSelectedIndex(-1); 232 + }} 233 + onBlur={() => setSelectedIndex(-1)} 234 + onKeyDown={(e) => { 235 + const results = search(); 236 + const prefixSuggestions = getPrefixSuggestions(); 237 + const totalSuggestions = (prefixSuggestions.length || 0) + (results?.length || 0); 230 238 231 - if (!totalSuggestions) return; 239 + if (!totalSuggestions) return; 232 240 233 - if (e.key === "ArrowDown") { 234 - e.preventDefault(); 235 - setSelectedIndex((prev) => (prev === -1 ? 0 : (prev + 1) % totalSuggestions)); 236 - } else if (e.key === "ArrowUp") { 237 - e.preventDefault(); 238 - setSelectedIndex((prev) => 239 - prev === -1 ? 240 - totalSuggestions - 1 241 - : (prev - 1 + totalSuggestions) % totalSuggestions, 242 - ); 243 - } else if (e.key === "Enter") { 244 - const index = selectedIndex(); 245 - if (index >= 0) { 246 - e.preventDefault(); 247 - if (index < prefixSuggestions.length) { 248 - const selectedPrefix = prefixSuggestions[index]; 249 - setInput(selectedPrefix.prefix); 250 - setSelectedIndex(-1); 251 - searchInput.focus(); 252 - } else { 253 - const adjustedIndex = index - prefixSuggestions.length; 254 - if (results && results[adjustedIndex]) { 241 + if (e.key === "ArrowDown") { 242 + e.preventDefault(); 243 + setSelectedIndex((prev) => (prev === -1 ? 0 : (prev + 1) % totalSuggestions)); 244 + } else if (e.key === "ArrowUp") { 245 + e.preventDefault(); 246 + setSelectedIndex((prev) => 247 + prev === -1 ? 248 + totalSuggestions - 1 249 + : (prev - 1 + totalSuggestions) % totalSuggestions, 250 + ); 251 + } else if (e.key === "Enter") { 252 + const index = selectedIndex(); 253 + if (index >= 0) { 254 + e.preventDefault(); 255 + if (index < prefixSuggestions.length) { 256 + const selectedPrefix = prefixSuggestions[index]; 257 + setInput(selectedPrefix.prefix); 258 + setSelectedIndex(-1); 259 + searchInput.focus(); 260 + } else { 261 + const adjustedIndex = index - prefixSuggestions.length; 262 + if (results && results[adjustedIndex]) { 263 + setShowSearch(false); 264 + navigate(`/at://${results[adjustedIndex].did}`); 265 + } 266 + } 267 + } else if (results?.length && prefixSuggestions.length === 0) { 268 + e.preventDefault(); 255 269 setShowSearch(false); 256 - setInput(undefined); 257 - navigate(`/at://${results[adjustedIndex].did}`); 258 - setSelectedIndex(-1); 270 + navigate(`/at://${results[0].did}`); 259 271 } 260 272 } 261 - } else if (results?.length && prefixSuggestions.length === 0) { 262 - e.preventDefault(); 263 - setShowSearch(false); 264 - setInput(undefined); 265 - navigate(`/at://${results[0].did}`); 266 - setSelectedIndex(-1); 267 - } 268 - } 269 - }} 270 - /> 271 - <Show when={input()} fallback={ListUrlsTooltip()}> 272 - <button 273 - type="button" 274 - class="flex items-center rounded-md p-1 hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-600 dark:active:bg-neutral-500" 275 - onClick={() => setInput(undefined)} 276 - > 277 - <span class="iconify lucide--x"></span> 278 - </button> 279 - </Show> 280 - </div> 281 - <Show when={isFocused() && (getPrefixSuggestions().length > 0 || search()?.length)}> 282 - <div 283 - class="dark:bg-dark-300 dark:shadow-dark-700 absolute z-30 mt-1 flex w-full flex-col rounded-lg border-[0.5px] border-neutral-300 bg-neutral-50 p-2 shadow-md transition-opacity duration-200 dark:border-neutral-700 starting:opacity-0" 284 - onMouseDown={(e) => e.preventDefault()} 285 - > 286 - {/* Prefix suggestions */} 287 - <For each={getPrefixSuggestions()}> 288 - {(prefixItem, index) => ( 273 + }} 274 + /> 275 + <Show when={input()} fallback={ListUrlsTooltip()}> 289 276 <button 290 277 type="button" 291 - class={`flex items-center rounded-md p-2 ${ 292 - index() === selectedIndex() ? 293 - "bg-neutral-200 dark:bg-neutral-700" 294 - : "hover:bg-neutral-200 active:bg-neutral-300 dark:hover:bg-neutral-700 dark:active:bg-neutral-600" 295 - }`} 296 - onClick={() => { 297 - setInput(prefixItem.prefix); 298 - setSelectedIndex(-1); 299 - searchInput.focus(); 300 - }} 278 + class="dark:hover:bg-dark-100 flex items-center rounded-md p-1 hover:bg-neutral-100 active:bg-neutral-200 dark:active:bg-neutral-700" 279 + onClick={() => setInput(undefined)} 301 280 > 302 - <span class={`text-sm font-semibold`}>{prefixItem.prefix}</span> 303 - <span class="text-sm text-neutral-600 dark:text-neutral-400"> 304 - {prefixItem.description} 305 - </span> 281 + <span class="iconify lucide--x"></span> 306 282 </button> 307 - )} 308 - </For> 283 + </Show> 284 + </div> 309 285 310 - {/* Typeahead results */} 311 - <For each={search()}> 312 - {(actor, index) => { 313 - const adjustedIndex = getPrefixSuggestions().length + index(); 314 - return ( 315 - <A 316 - class={`flex items-center gap-2 rounded-md p-2 ${ 317 - adjustedIndex === selectedIndex() ? 318 - "bg-neutral-200 dark:bg-neutral-700" 319 - : "hover:bg-neutral-200 active:bg-neutral-300 dark:hover:bg-neutral-700 dark:active:bg-neutral-600" 320 - }`} 321 - href={`/at://${actor.did}`} 322 - onClick={() => setShowSearch(false)} 323 - > 324 - <img 325 - src={actor.avatar?.replace("img/avatar/", "img/avatar_thumbnail/")} 326 - class="size-9 rounded-full" 327 - /> 328 - <div class="flex min-w-0 flex-col"> 329 - <Show when={actor.displayName}> 330 - <span class="truncate text-sm font-medium">{actor.displayName}</span> 331 - </Show> 332 - <span class="truncate text-xs text-neutral-600 dark:text-neutral-400"> 333 - @{actor.handle} 286 + <Show when={getPrefixSuggestions().length > 0 || (input() && search()?.length)}> 287 + <div 288 + class="flex w-full flex-col border-t border-neutral-200 p-2 dark:border-neutral-700" 289 + onMouseDown={(e) => e.preventDefault()} 290 + > 291 + {/* Prefix suggestions */} 292 + <For each={getPrefixSuggestions()}> 293 + {(prefixItem, index) => ( 294 + <button 295 + type="button" 296 + class={`flex items-center rounded-md p-2 ${ 297 + index() === selectedIndex() ? 298 + "bg-neutral-200 dark:bg-neutral-700" 299 + : "dark:hover:bg-dark-100 hover:bg-neutral-100 active:bg-neutral-200 dark:active:bg-neutral-700" 300 + }`} 301 + onClick={() => { 302 + setInput(prefixItem.prefix); 303 + setSelectedIndex(-1); 304 + searchInput.focus(); 305 + }} 306 + > 307 + <span class={`text-sm font-semibold`}>{prefixItem.prefix}</span> 308 + <span class="text-sm text-neutral-600 dark:text-neutral-400"> 309 + {prefixItem.description} 334 310 </span> 335 - </div> 336 - </A> 337 - ); 338 - }} 339 - </For> 340 - </div> 341 - </Show> 342 - </form> 311 + </button> 312 + )} 313 + </For> 314 + 315 + {/* Typeahead results */} 316 + <For each={search()}> 317 + {(actor, index) => { 318 + const adjustedIndex = getPrefixSuggestions().length + index(); 319 + return ( 320 + <A 321 + class={`flex items-center gap-2 rounded-md p-2 ${ 322 + adjustedIndex === selectedIndex() ? 323 + "bg-neutral-200 dark:bg-neutral-700" 324 + : "dark:hover:bg-dark-100 hover:bg-neutral-100 active:bg-neutral-200 dark:active:bg-neutral-700" 325 + }`} 326 + href={`/at://${actor.did}`} 327 + onClick={() => setShowSearch(false)} 328 + > 329 + <img 330 + src={actor.avatar?.replace("img/avatar/", "img/avatar_thumbnail/")} 331 + class="size-9 rounded-full" 332 + /> 333 + <div class="flex min-w-0 flex-col"> 334 + <Show when={actor.displayName}> 335 + <span class="truncate text-sm font-medium">{actor.displayName}</span> 336 + </Show> 337 + <span class="truncate text-xs text-neutral-600 dark:text-neutral-400"> 338 + @{actor.handle} 339 + </span> 340 + </div> 341 + </A> 342 + ); 343 + }} 344 + </For> 345 + </div> 346 + </Show> 347 + </form> 348 + </div> 349 + </Modal> 343 350 ); 344 351 }; 345 352 ··· 392 399 </Modal> 393 400 <button 394 401 type="button" 395 - class="flex items-center rounded-md p-1 hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-600 dark:active:bg-neutral-500" 402 + class="dark:hover:bg-dark-100 flex items-center rounded-md p-1 hover:bg-neutral-100 active:bg-neutral-200 dark:active:bg-neutral-700" 396 403 onClick={() => setOpenList(true)} 397 404 > 398 405 <span class="iconify lucide--help-circle text-neutral-600 dark:text-neutral-300"></span>
+4 -6
src/layout.tsx
··· 9 9 import { NavBar } from "./components/navbar.jsx"; 10 10 import { NotificationContainer } from "./components/notification.jsx"; 11 11 import { PermissionPromptContainer } from "./components/permission-prompt.jsx"; 12 - import { Search, SearchButton, showSearch } from "./components/search.jsx"; 12 + import { Search, SearchButton } from "./components/search.jsx"; 13 13 import { themeEvent } from "./components/theme.jsx"; 14 14 import { resolveHandle } from "./utils/api.js"; 15 15 import { plcDirectory } from "./views/settings.jsx"; ··· 126 126 </Show> 127 127 <div id="main" class="mx-auto mb-8 flex max-w-lg flex-col items-center p-3"> 128 128 <header 129 - class={`dark:shadow-dark-700 mb-3 flex w-full items-center justify-between rounded-xl border-[0.5px] border-neutral-300 bg-neutral-50 bg-size-[95%] bg-right bg-no-repeat p-2 pl-3 shadow-xs [--header-bg:#fafafa] [--trans-blue:#5BCEFA90] [--trans-pink:#F5A9B890] [--trans-white:#FFFFFF90] dark:border-neutral-700 dark:bg-neutral-800 dark:[--header-bg:#262626] dark:[--trans-blue:#5BCEFAa0] dark:[--trans-pink:#F5A9B8a0] dark:[--trans-white:#FFFFFFa0] ${localStorage.getItem("hrt") === "true" ? "bg-[linear-gradient(to_left,transparent_10%,var(--header-bg)_85%),linear-gradient(to_bottom,var(--trans-blue)_0%,var(--trans-blue)_20%,var(--trans-pink)_20%,var(--trans-pink)_40%,var(--trans-white)_40%,var(--trans-white)_60%,var(--trans-pink)_60%,var(--trans-pink)_80%,var(--trans-blue)_80%,var(--trans-blue)_100%)]" : ""}`} 129 + class={`dark:shadow-dark-700 mb-3 flex h-13 w-full items-center justify-between rounded-xl border-[0.5px] border-neutral-300 bg-neutral-50 bg-size-[95%] bg-right bg-no-repeat p-2 pl-3 shadow-xs [--header-bg:#fafafa] [--trans-blue:#5BCEFA90] [--trans-pink:#F5A9B890] [--trans-white:#FFFFFF90] dark:border-neutral-700 dark:bg-neutral-800 dark:[--header-bg:#262626] dark:[--trans-blue:#5BCEFAa0] dark:[--trans-pink:#F5A9B8a0] dark:[--trans-white:#FFFFFFa0] ${localStorage.getItem("hrt") === "true" ? "bg-[linear-gradient(to_left,transparent_10%,var(--header-bg)_85%),linear-gradient(to_bottom,var(--trans-blue)_0%,var(--trans-blue)_20%,var(--trans-pink)_20%,var(--trans-pink)_40%,var(--trans-white)_40%,var(--trans-white)_60%,var(--trans-pink)_60%,var(--trans-pink)_80%,var(--trans-blue)_80%,var(--trans-blue)_100%)]" : ""}`} 130 130 style={{ 131 131 "background-image": 132 132 props.params.repo && props.params.repo in headers ? ··· 149 149 /> 150 150 </Show> 151 151 </A> 152 - <div class="relative flex items-center gap-0.5 rounded-lg bg-neutral-50/60 px-1 py-0.5 dark:bg-neutral-800/60"> 152 + <div class="relative flex items-center gap-0.5 rounded-lg bg-neutral-50/60 p-1 dark:bg-neutral-800/60"> 153 153 <SearchButton /> 154 154 <Show when={agent()}> 155 155 <RecordEditor create={true} scope="create" /> ··· 170 170 </div> 171 171 </header> 172 172 <div class="flex w-full flex-col items-center gap-3 text-pretty"> 173 - <Show when={showSearch() || location.pathname === "/"}> 174 - <Search /> 175 - </Show> 173 + <Search /> 176 174 <Show when={props.params.pds}> 177 175 <NavBar params={props.params} /> 178 176 </Show>