learn and share notes on atproto (wip) 🦉 malfestio.stormlightlabs.org/
readability solid axum atproto srs

refactor: replace emoji with Tailwind CSS icons with egoist plugin

+148 -4
+2
web/package.json
··· 29 29 "unified": "^11.0.5" 30 30 }, 31 31 "devDependencies": { 32 + "@egoist/tailwindcss-icons": "^1.9.0", 32 33 "@eslint/js": "^9.39.2", 34 + "@iconify-json/bi": "^1.2.7", 33 35 "@solidjs/testing-library": "^0.8.10", 34 36 "@testing-library/jest-dom": "^6.9.1", 35 37 "@testing-library/user-event": "^14.6.1",
+138
web/pnpm-lock.yaml
··· 57 57 specifier: ^11.0.5 58 58 version: 11.0.5 59 59 devDependencies: 60 + '@egoist/tailwindcss-icons': 61 + specifier: ^1.9.0 62 + version: 1.9.0(tailwindcss@4.1.18) 60 63 '@eslint/js': 61 64 specifier: ^9.39.2 62 65 version: 9.39.2 66 + '@iconify-json/bi': 67 + specifier: ^1.2.7 68 + version: 1.2.7 63 69 '@solidjs/testing-library': 64 70 specifier: ^0.8.10 65 71 version: 0.8.10(@solidjs/router@0.15.4(solid-js@1.9.10))(solid-js@1.9.10) ··· 110 116 111 117 '@adobe/css-tools@4.4.4': 112 118 resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} 119 + 120 + '@antfu/install-pkg@1.1.0': 121 + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} 122 + 123 + '@antfu/utils@8.1.1': 124 + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} 113 125 114 126 '@asamuzakjp/css-color@4.1.1': 115 127 resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} ··· 237 249 resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} 238 250 engines: {node: '>=18'} 239 251 252 + '@egoist/tailwindcss-icons@1.9.0': 253 + resolution: {integrity: sha512-xWA9cUy6hzlK7Y6TaoRIcwmilSXiTJ8rbXcEdf9uht7yzDgw/yIgF4rThIQMrpD2Y2v4od51+r2y6Z7GStanDQ==} 254 + peerDependencies: 255 + tailwindcss: '*' 256 + 240 257 '@emnapi/core@1.7.1': 241 258 resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} 242 259 ··· 308 325 '@humanwhocodes/retry@0.4.3': 309 326 resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 310 327 engines: {node: '>=18.18'} 328 + 329 + '@iconify-json/bi@1.2.7': 330 + resolution: {integrity: sha512-IPz8WNxmLkH1I9msl+0Q4OnmjjvP4uU0Z61a4i4sqonB6vKSbMGUWuGn8/YuuszlReVj8rf+3gNv5JU8Xoljyg==} 331 + 332 + '@iconify/types@2.0.0': 333 + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 334 + 335 + '@iconify/utils@2.3.0': 336 + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} 311 337 312 338 '@jridgewell/gen-mapping@0.3.13': 313 339 resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} ··· 850 876 concat-map@0.0.1: 851 877 resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 852 878 879 + confbox@0.1.8: 880 + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 881 + 882 + confbox@0.2.2: 883 + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} 884 + 853 885 convert-source-map@2.0.0: 854 886 resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 855 887 ··· 987 1019 expect-type@1.3.0: 988 1020 resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} 989 1021 engines: {node: '>=12.0.0'} 1022 + 1023 + exsolve@1.0.8: 1024 + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} 990 1025 991 1026 extend@3.0.2: 992 1027 resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} ··· 1055 1090 resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1056 1091 engines: {node: '>=18'} 1057 1092 1093 + globals@15.15.0: 1094 + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} 1095 + engines: {node: '>=18'} 1096 + 1058 1097 globals@16.5.0: 1059 1098 resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} 1060 1099 engines: {node: '>=18'} ··· 1204 1243 known-css-properties@0.30.0: 1205 1244 resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} 1206 1245 1246 + kolorist@1.8.0: 1247 + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 1248 + 1207 1249 levn@0.4.1: 1208 1250 resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1209 1251 engines: {node: '>= 0.8.0'} ··· 1278 1320 resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} 1279 1321 engines: {node: '>= 12.0.0'} 1280 1322 1323 + local-pkg@1.1.2: 1324 + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} 1325 + engines: {node: '>=14'} 1326 + 1281 1327 locate-path@6.0.0: 1282 1328 resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1283 1329 engines: {node: '>=10'} ··· 1389 1435 resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1390 1436 engines: {node: '>=16 || 14 >=14.17'} 1391 1437 1438 + mlly@1.8.0: 1439 + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 1440 + 1392 1441 motion-dom@12.23.23: 1393 1442 resolution: {integrity: sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==} 1394 1443 ··· 1437 1486 p-locate@5.0.0: 1438 1487 resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1439 1488 engines: {node: '>=10'} 1489 + 1490 + package-manager-detector@1.6.0: 1491 + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} 1440 1492 1441 1493 parent-module@1.0.1: 1442 1494 resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} ··· 1466 1518 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1467 1519 engines: {node: '>=12'} 1468 1520 1521 + pkg-types@1.3.1: 1522 + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1523 + 1524 + pkg-types@2.3.0: 1525 + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} 1526 + 1469 1527 postcss@8.5.6: 1470 1528 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1471 1529 engines: {node: ^10 || ^12 || >=14} ··· 1484 1542 punycode@2.3.1: 1485 1543 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1486 1544 engines: {node: '>=6'} 1545 + 1546 + quansync@0.2.11: 1547 + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} 1487 1548 1488 1549 react-is@17.0.2: 1489 1550 resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} ··· 1712 1773 engines: {node: '>=14.17'} 1713 1774 hasBin: true 1714 1775 1776 + ufo@1.6.1: 1777 + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1778 + 1715 1779 undici-types@7.16.0: 1716 1780 resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 1717 1781 ··· 1865 1929 1866 1930 '@adobe/css-tools@4.4.4': {} 1867 1931 1932 + '@antfu/install-pkg@1.1.0': 1933 + dependencies: 1934 + package-manager-detector: 1.6.0 1935 + tinyexec: 1.0.2 1936 + 1937 + '@antfu/utils@8.1.1': {} 1938 + 1868 1939 '@asamuzakjp/css-color@4.1.1': 1869 1940 dependencies: 1870 1941 '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) ··· 2018 2089 2019 2090 '@csstools/css-tokenizer@3.0.4': {} 2020 2091 2092 + '@egoist/tailwindcss-icons@1.9.0(tailwindcss@4.1.18)': 2093 + dependencies: 2094 + '@iconify/utils': 2.3.0 2095 + tailwindcss: 4.1.18 2096 + transitivePeerDependencies: 2097 + - supports-color 2098 + 2021 2099 '@emnapi/core@1.7.1': 2022 2100 dependencies: 2023 2101 '@emnapi/wasi-threads': 1.1.0 ··· 2092 2170 '@humanwhocodes/module-importer@1.0.1': {} 2093 2171 2094 2172 '@humanwhocodes/retry@0.4.3': {} 2173 + 2174 + '@iconify-json/bi@1.2.7': 2175 + dependencies: 2176 + '@iconify/types': 2.0.0 2177 + 2178 + '@iconify/types@2.0.0': {} 2179 + 2180 + '@iconify/utils@2.3.0': 2181 + dependencies: 2182 + '@antfu/install-pkg': 1.1.0 2183 + '@antfu/utils': 8.1.1 2184 + '@iconify/types': 2.0.0 2185 + debug: 4.4.3 2186 + globals: 15.15.0 2187 + kolorist: 1.8.0 2188 + local-pkg: 1.1.2 2189 + mlly: 1.8.0 2190 + transitivePeerDependencies: 2191 + - supports-color 2095 2192 2096 2193 '@jridgewell/gen-mapping@0.3.13': 2097 2194 dependencies: ··· 2629 2726 2630 2727 concat-map@0.0.1: {} 2631 2728 2729 + confbox@0.1.8: {} 2730 + 2731 + confbox@0.2.2: {} 2732 + 2632 2733 convert-source-map@2.0.0: {} 2633 2734 2634 2735 cross-spawn@7.0.6: ··· 2783 2884 2784 2885 expect-type@1.3.0: {} 2785 2886 2887 + exsolve@1.0.8: {} 2888 + 2786 2889 extend@3.0.2: {} 2787 2890 2788 2891 fast-deep-equal@3.1.3: {} ··· 2828 2931 2829 2932 globals@14.0.0: {} 2830 2933 2934 + globals@15.15.0: {} 2935 + 2831 2936 globals@16.5.0: {} 2832 2937 2833 2938 graceful-fs@4.2.11: {} ··· 2979 3084 2980 3085 known-css-properties@0.30.0: {} 2981 3086 3087 + kolorist@1.8.0: {} 3088 + 2982 3089 levn@0.4.1: 2983 3090 dependencies: 2984 3091 prelude-ls: 1.2.1 ··· 3032 3139 lightningcss-linux-x64-musl: 1.30.2 3033 3140 lightningcss-win32-arm64-msvc: 1.30.2 3034 3141 lightningcss-win32-x64-msvc: 1.30.2 3142 + 3143 + local-pkg@1.1.2: 3144 + dependencies: 3145 + mlly: 1.8.0 3146 + pkg-types: 2.3.0 3147 + quansync: 0.2.11 3035 3148 3036 3149 locate-path@6.0.0: 3037 3150 dependencies: ··· 3233 3346 dependencies: 3234 3347 brace-expansion: 2.0.2 3235 3348 3349 + mlly@1.8.0: 3350 + dependencies: 3351 + acorn: 8.15.0 3352 + pathe: 2.0.3 3353 + pkg-types: 1.3.1 3354 + ufo: 1.6.1 3355 + 3236 3356 motion-dom@12.23.23: 3237 3357 dependencies: 3238 3358 motion-utils: 12.23.6 ··· 3271 3391 dependencies: 3272 3392 p-limit: 3.1.0 3273 3393 3394 + package-manager-detector@1.6.0: {} 3395 + 3274 3396 parent-module@1.0.1: 3275 3397 dependencies: 3276 3398 callsites: 3.1.0 ··· 3293 3415 3294 3416 picomatch@4.0.3: {} 3295 3417 3418 + pkg-types@1.3.1: 3419 + dependencies: 3420 + confbox: 0.1.8 3421 + mlly: 1.8.0 3422 + pathe: 2.0.3 3423 + 3424 + pkg-types@2.3.0: 3425 + dependencies: 3426 + confbox: 0.2.2 3427 + exsolve: 1.0.8 3428 + pathe: 2.0.3 3429 + 3296 3430 postcss@8.5.6: 3297 3431 dependencies: 3298 3432 nanoid: 3.3.11 ··· 3310 3444 property-information@7.1.0: {} 3311 3445 3312 3446 punycode@2.3.1: {} 3447 + 3448 + quansync@0.2.11: {} 3313 3449 3314 3450 react-is@17.0.2: {} 3315 3451 ··· 3526 3662 - supports-color 3527 3663 3528 3664 typescript@5.9.3: {} 3665 + 3666 + ufo@1.6.1: {} 3529 3667 3530 3668 undici-types@7.16.0: {} 3531 3669
+4 -2
web/src/components/ReviewStats.tsx
··· 22 22 <div class="space-y-4"> 23 23 <div class="flex items-center justify-between"> 24 24 <h3 class="text-lg font-semibold text-white">Study Progress</h3> 25 - {/* TODO: fire icon */} 26 - <span class="text-2xl">🔥 {stats().current_streak} day streak</span> 25 + <span class="text-2xl flex items-center gap-2"> 26 + <i class="i-bi-fire" /> 27 + <span>{stats().current_streak} day streak</span> 28 + </span> 27 29 </div> 28 30 29 31 <div class="grid grid-cols-3 gap-4 text-center">
+1
web/src/index.css
··· 1 1 @import "tailwindcss"; 2 + @plugin "@egoist/tailwindcss-icons";
+3 -2
web/src/pages/Review.tsx
··· 67 67 when={cards().length > 0} 68 68 fallback={ 69 69 <div class="text-center py-8"> 70 - {/* TODO: replace with an icon */} 71 - <p class="text-4xl mb-4">🎉</p> 70 + <p class="text-4xl mb-4 flex items-center gap-2"> 71 + <i class="i-bi-star-fill text-yellow-400" /> 72 + </p> 72 73 <Show 73 74 when={sessionComplete()} 74 75 fallback={