this repo has no description
10
fork

Configure Feed

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

Add hero OG preview image, favicon, and asset generation

Use a 1200x630 PNG (og-hero) for Open Graph and Twitter cards so shares
show the sky, clouds, and hero copy. Add favicon.ico from the union icon
with SVG kept as alternate. Add generate-static-images script and gen:images
task. Remove the podcast line from the cross-posting section intro.

Made-with: Cursor

+458 -15
+30 -9
components/CrossPollination.tsx
··· 23 23 <div class="text-center"> 24 24 <h2 class="text-section">Post once, show everywhere.</h2> 25 25 <div class="divider" /> 26 - <p class="text-body mt-2" style={{ maxWidth: "640px", margin: "1rem auto 0" }}> 27 - Wherever you get your podcasts — but for everything. 26 + <p 27 + class="text-body mt-2" 28 + style={{ maxWidth: "640px", margin: "1rem auto 0" }} 29 + > 28 30 Your content flows freely across every app in the Atmosphere. 29 31 </p> 30 32 </div> ··· 36 38 {contentTypes.map((item, i) => ( 37 39 <div 38 40 key={item.label} 39 - class={`flow-node flow-node-left glass-subtle ${i === contentTypes.length - 1 ? "flow-node-open" : ""}`} 41 + class={`flow-node flow-node-left glass-subtle ${ 42 + i === contentTypes.length - 1 ? "flow-node-open" : "" 43 + }`} 40 44 style={{ animationDelay: `${i * 0.12}s` }} 41 45 > 42 46 {item.label} ··· 53 57 height="36" 54 58 class="flow-hub-logo" 55 59 /> 56 - <span class="flow-hub-label font-mono">Your Atmosphere Account</span> 60 + <span class="flow-hub-label font-mono"> 61 + Your Atmosphere Account 62 + </span> 57 63 </div> 58 64 59 65 {/* Animated connection lines */} 60 66 <div class="flow-lines flow-lines-left" aria-hidden="true"> 61 67 {[0, 1, 2, 3, 4, 5].map((i) => ( 62 - <div key={`l${i}`} class="flow-line" style={{ animationDelay: `${i * 0.15}s` }} /> 68 + <div 69 + key={`l${i}`} 70 + class="flow-line" 71 + style={{ animationDelay: `${i * 0.15}s` }} 72 + /> 63 73 ))} 64 74 </div> 65 75 <div class="flow-lines flow-lines-right" aria-hidden="true"> 66 76 {[0, 1, 2, 3, 4, 5].map((i) => ( 67 - <div key={`r${i}`} class="flow-line" style={{ animationDelay: `${i * 0.15 + 0.6}s` }} /> 77 + <div 78 + key={`r${i}`} 79 + class="flow-line" 80 + style={{ animationDelay: `${i * 0.15 + 0.6}s` }} 81 + /> 68 82 ))} 69 83 </div> 70 84 </div> ··· 74 88 {destinations.map((item, i) => ( 75 89 <div 76 90 key={item.label} 77 - class={`flow-node flow-node-right glass-subtle ${i === destinations.length - 1 ? "flow-node-open" : ""}`} 91 + class={`flow-node flow-node-right glass-subtle ${ 92 + i === destinations.length - 1 ? "flow-node-open" : "" 93 + }`} 78 94 style={{ animationDelay: `${i * 0.12 + 0.3}s` }} 79 95 > 80 96 {item.label} ··· 85 101 86 102 <p 87 103 class="text-body-sm text-center mt-3" 88 - style={{ maxWidth: "520px", margin: "1.5rem auto 0", fontStyle: "italic" }} 104 + style={{ 105 + maxWidth: "520px", 106 + margin: "1.5rem auto 0", 107 + fontStyle: "italic", 108 + }} 89 109 > 90 110 These are just examples. The Atmosphere is open — any app can create 91 - and surface any kind of content. The possibilities grow with every new app that joins. 111 + and surface any kind of content. The possibilities grow with every new 112 + app that joins. 92 113 </p> 93 114 </div> 94 115 </section>
+1
deno.json
··· 4 4 "check": "deno fmt --check . && deno lint . && deno check", 5 5 "dev": "vite", 6 6 "build": "vite build", 7 + "gen:images": "deno run -A --node-modules-dir=auto scripts/generate-static-images.ts", 7 8 "start": "deno serve -A _fresh/server.js", 8 9 "update": "deno run -A -r jsr:@fresh/update ." 9 10 },
+234 -2
deno.lock
··· 37 37 "npm:esbuild-wasm@~0.25.11": "0.25.12", 38 38 "npm:esbuild@0.25.7": "0.25.7", 39 39 "npm:esbuild@~0.25.5": "0.25.12", 40 + "npm:png-to-ico@*": "3.0.1", 40 41 "npm:preact-render-to-string@^6.6.3": "6.6.7_preact@10.29.1", 41 42 "npm:preact@^10.27.2": "10.29.1", 42 43 "npm:preact@^10.28.2": "10.29.1", 43 44 "npm:preact@^10.28.3": "10.29.1", 44 45 "npm:rollup@^4.50.0": "4.60.1", 46 + "npm:sharp@*": "0.34.5", 45 47 "npm:vite@^7.1.3": "7.3.2", 46 48 "npm:vite@^7.1.4": "7.3.2" 47 49 }, ··· 191 193 "debug", 192 194 "gensync", 193 195 "json5", 194 - "semver" 196 + "semver@6.3.1" 195 197 ] 196 198 }, 197 199 "@babel/generator@7.29.1": { ··· 217 219 "@babel/helper-validator-option", 218 220 "browserslist", 219 221 "lru-cache", 220 - "semver" 222 + "semver@6.3.1" 221 223 ] 222 224 }, 223 225 "@babel/helper-globals@7.28.0": { ··· 342 344 "dependencies": [ 343 345 "@babel/helper-string-parser", 344 346 "@babel/helper-validator-identifier" 347 + ] 348 + }, 349 + "@emnapi/runtime@1.9.2": { 350 + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", 351 + "dependencies": [ 352 + "tslib" 345 353 ] 346 354 }, 347 355 "@esbuild/aix-ppc64@0.25.12": { ··· 734 742 "os": ["win32"], 735 743 "cpu": ["x64"] 736 744 }, 745 + "@img/colour@1.1.0": { 746 + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==" 747 + }, 748 + "@img/sharp-darwin-arm64@0.34.5": { 749 + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", 750 + "optionalDependencies": [ 751 + "@img/sharp-libvips-darwin-arm64" 752 + ], 753 + "os": ["darwin"], 754 + "cpu": ["arm64"] 755 + }, 756 + "@img/sharp-darwin-x64@0.34.5": { 757 + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", 758 + "optionalDependencies": [ 759 + "@img/sharp-libvips-darwin-x64" 760 + ], 761 + "os": ["darwin"], 762 + "cpu": ["x64"] 763 + }, 764 + "@img/sharp-libvips-darwin-arm64@1.2.4": { 765 + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", 766 + "os": ["darwin"], 767 + "cpu": ["arm64"] 768 + }, 769 + "@img/sharp-libvips-darwin-x64@1.2.4": { 770 + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", 771 + "os": ["darwin"], 772 + "cpu": ["x64"] 773 + }, 774 + "@img/sharp-libvips-linux-arm64@1.2.4": { 775 + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", 776 + "os": ["linux"], 777 + "cpu": ["arm64"] 778 + }, 779 + "@img/sharp-libvips-linux-arm@1.2.4": { 780 + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", 781 + "os": ["linux"], 782 + "cpu": ["arm"] 783 + }, 784 + "@img/sharp-libvips-linux-ppc64@1.2.4": { 785 + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", 786 + "os": ["linux"], 787 + "cpu": ["ppc64"] 788 + }, 789 + "@img/sharp-libvips-linux-riscv64@1.2.4": { 790 + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", 791 + "os": ["linux"], 792 + "cpu": ["riscv64"] 793 + }, 794 + "@img/sharp-libvips-linux-s390x@1.2.4": { 795 + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", 796 + "os": ["linux"], 797 + "cpu": ["s390x"] 798 + }, 799 + "@img/sharp-libvips-linux-x64@1.2.4": { 800 + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", 801 + "os": ["linux"], 802 + "cpu": ["x64"] 803 + }, 804 + "@img/sharp-libvips-linuxmusl-arm64@1.2.4": { 805 + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", 806 + "os": ["linux"], 807 + "cpu": ["arm64"] 808 + }, 809 + "@img/sharp-libvips-linuxmusl-x64@1.2.4": { 810 + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", 811 + "os": ["linux"], 812 + "cpu": ["x64"] 813 + }, 814 + "@img/sharp-linux-arm64@0.34.5": { 815 + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", 816 + "optionalDependencies": [ 817 + "@img/sharp-libvips-linux-arm64" 818 + ], 819 + "os": ["linux"], 820 + "cpu": ["arm64"] 821 + }, 822 + "@img/sharp-linux-arm@0.34.5": { 823 + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", 824 + "optionalDependencies": [ 825 + "@img/sharp-libvips-linux-arm" 826 + ], 827 + "os": ["linux"], 828 + "cpu": ["arm"] 829 + }, 830 + "@img/sharp-linux-ppc64@0.34.5": { 831 + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", 832 + "optionalDependencies": [ 833 + "@img/sharp-libvips-linux-ppc64" 834 + ], 835 + "os": ["linux"], 836 + "cpu": ["ppc64"] 837 + }, 838 + "@img/sharp-linux-riscv64@0.34.5": { 839 + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", 840 + "optionalDependencies": [ 841 + "@img/sharp-libvips-linux-riscv64" 842 + ], 843 + "os": ["linux"], 844 + "cpu": ["riscv64"] 845 + }, 846 + "@img/sharp-linux-s390x@0.34.5": { 847 + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", 848 + "optionalDependencies": [ 849 + "@img/sharp-libvips-linux-s390x" 850 + ], 851 + "os": ["linux"], 852 + "cpu": ["s390x"] 853 + }, 854 + "@img/sharp-linux-x64@0.34.5": { 855 + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", 856 + "optionalDependencies": [ 857 + "@img/sharp-libvips-linux-x64" 858 + ], 859 + "os": ["linux"], 860 + "cpu": ["x64"] 861 + }, 862 + "@img/sharp-linuxmusl-arm64@0.34.5": { 863 + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", 864 + "optionalDependencies": [ 865 + "@img/sharp-libvips-linuxmusl-arm64" 866 + ], 867 + "os": ["linux"], 868 + "cpu": ["arm64"] 869 + }, 870 + "@img/sharp-linuxmusl-x64@0.34.5": { 871 + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", 872 + "optionalDependencies": [ 873 + "@img/sharp-libvips-linuxmusl-x64" 874 + ], 875 + "os": ["linux"], 876 + "cpu": ["x64"] 877 + }, 878 + "@img/sharp-wasm32@0.34.5": { 879 + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", 880 + "dependencies": [ 881 + "@emnapi/runtime" 882 + ], 883 + "cpu": ["wasm32"] 884 + }, 885 + "@img/sharp-win32-arm64@0.34.5": { 886 + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", 887 + "os": ["win32"], 888 + "cpu": ["arm64"] 889 + }, 890 + "@img/sharp-win32-ia32@0.34.5": { 891 + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", 892 + "os": ["win32"], 893 + "cpu": ["ia32"] 894 + }, 895 + "@img/sharp-win32-x64@0.34.5": { 896 + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", 897 + "os": ["win32"], 898 + "cpu": ["x64"] 899 + }, 737 900 "@jridgewell/gen-mapping@0.3.13": { 738 901 "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 739 902 "dependencies": [ ··· 936 1099 "@types/estree@1.0.8": { 937 1100 "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" 938 1101 }, 1102 + "@types/node@22.19.17": { 1103 + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", 1104 + "dependencies": [ 1105 + "undici-types" 1106 + ] 1107 + }, 939 1108 "baseline-browser-mapping@2.10.17": { 940 1109 "integrity": "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==", 941 1110 "bin": true ··· 962 1131 "dependencies": [ 963 1132 "ms" 964 1133 ] 1134 + }, 1135 + "detect-libc@2.1.2": { 1136 + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==" 965 1137 }, 966 1138 "electron-to-chromium@1.5.335": { 967 1139 "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==" ··· 1109 1281 "yallist" 1110 1282 ] 1111 1283 }, 1284 + "minimist@1.2.8": { 1285 + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" 1286 + }, 1112 1287 "ms@2.1.3": { 1113 1288 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1114 1289 }, ··· 1127 1302 }, 1128 1303 "picomatch@4.0.4": { 1129 1304 "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==" 1305 + }, 1306 + "png-to-ico@3.0.1": { 1307 + "integrity": "sha512-S8BOAoaGd9gT5uaemQ62arIY3Jzco7Uc7LwUTqRyqJDTsKqOAiyfyN4dSdT0D+Zf8XvgztgpRbM5wnQd7EgYwg==", 1308 + "dependencies": [ 1309 + "@types/node", 1310 + "minimist", 1311 + "pngjs" 1312 + ], 1313 + "bin": true 1314 + }, 1315 + "pngjs@7.0.0": { 1316 + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==" 1130 1317 }, 1131 1318 "postcss@8.5.9": { 1132 1319 "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", ··· 1184 1371 "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1185 1372 "bin": true 1186 1373 }, 1374 + "semver@7.7.4": { 1375 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", 1376 + "bin": true 1377 + }, 1378 + "sharp@0.34.5": { 1379 + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", 1380 + "dependencies": [ 1381 + "@img/colour", 1382 + "detect-libc", 1383 + "semver@7.7.4" 1384 + ], 1385 + "optionalDependencies": [ 1386 + "@img/sharp-darwin-arm64", 1387 + "@img/sharp-darwin-x64", 1388 + "@img/sharp-libvips-darwin-arm64", 1389 + "@img/sharp-libvips-darwin-x64", 1390 + "@img/sharp-libvips-linux-arm", 1391 + "@img/sharp-libvips-linux-arm64", 1392 + "@img/sharp-libvips-linux-ppc64", 1393 + "@img/sharp-libvips-linux-riscv64", 1394 + "@img/sharp-libvips-linux-s390x", 1395 + "@img/sharp-libvips-linux-x64", 1396 + "@img/sharp-libvips-linuxmusl-arm64", 1397 + "@img/sharp-libvips-linuxmusl-x64", 1398 + "@img/sharp-linux-arm", 1399 + "@img/sharp-linux-arm64", 1400 + "@img/sharp-linux-ppc64", 1401 + "@img/sharp-linux-riscv64", 1402 + "@img/sharp-linux-s390x", 1403 + "@img/sharp-linux-x64", 1404 + "@img/sharp-linuxmusl-arm64", 1405 + "@img/sharp-linuxmusl-x64", 1406 + "@img/sharp-wasm32", 1407 + "@img/sharp-win32-arm64", 1408 + "@img/sharp-win32-ia32", 1409 + "@img/sharp-win32-x64" 1410 + ], 1411 + "scripts": true 1412 + }, 1187 1413 "source-map-js@1.2.1": { 1188 1414 "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" 1189 1415 }, ··· 1193 1419 "fdir", 1194 1420 "picomatch@4.0.4" 1195 1421 ] 1422 + }, 1423 + "tslib@2.8.1": { 1424 + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 1425 + }, 1426 + "undici-types@6.21.0": { 1427 + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" 1196 1428 }, 1197 1429 "update-browserslist-db@1.2.3_browserslist@4.28.2": { 1198 1430 "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+7 -4
routes/_app.tsx
··· 233 233 content="The last social account you'll ever need. One account for all your apps." 234 234 /> 235 235 <meta property="og:type" content="website" /> 236 - <meta property="og:image" content={socialImageUrl("/union.svg")} /> 237 - <meta property="og:image:type" content="image/svg+xml" /> 236 + <meta property="og:image" content={socialImageUrl("/og-hero.png")} /> 237 + <meta property="og:image:type" content="image/png" /> 238 + <meta property="og:image:width" content="1200" /> 239 + <meta property="og:image:height" content="630" /> 238 240 <meta 239 241 property="og:image:alt" 240 - content="Atmosphere Account — logo" 242 + content="Atmosphere Account — sky, glass clouds, and hero headline" 241 243 /> 242 244 <meta name="twitter:card" content="summary_large_image" /> 243 - <meta name="twitter:image" content={socialImageUrl("/union.svg")} /> 245 + <meta name="twitter:image" content={socialImageUrl("/og-hero.png")} /> 246 + <link rel="icon" href="/favicon.ico" sizes="any" /> 244 247 <link rel="icon" type="image/svg+xml" href="/union.svg" /> 245 248 <link rel="apple-touch-icon" href="/union.svg" /> 246 249 <script
+27
scripts/generate-static-images.ts
··· 1 + import sharp from "npm:sharp@0.34.5"; 2 + import { Buffer } from "node:buffer"; 3 + import { readFile, writeFile } from "node:fs/promises"; 4 + import { dirname, join } from "node:path"; 5 + import { fileURLToPath } from "node:url"; 6 + 7 + const root = join(dirname(fileURLToPath(import.meta.url)), ".."); 8 + 9 + const ogSvg = await readFile(join(root, "static/og-hero.svg")); 10 + const ogPng = await sharp(ogSvg).png().resize(1200, 630).toBuffer(); 11 + await writeFile(join(root, "static/og-hero.png"), ogPng); 12 + console.log("Wrote static/og-hero.png", ogPng.length, "bytes"); 13 + 14 + const unionSvg = await readFile(join(root, "static/union.svg")); 15 + const bg = { r: 0, g: 0, b: 0, alpha: 0 }; 16 + const icon32 = await sharp(unionSvg).resize(32, 32, { 17 + fit: "contain", 18 + background: bg, 19 + }).png().toBuffer(); 20 + const icon16 = await sharp(unionSvg).resize(16, 16, { 21 + fit: "contain", 22 + background: bg, 23 + }).png().toBuffer(); 24 + const pngToIco = (await import("npm:png-to-ico@3.0.1")).default; 25 + const ico = await pngToIco([icon16, icon32]); 26 + await writeFile(join(root, "static/favicon.ico"), Buffer.from(ico)); 27 + console.log("Wrote static/favicon.ico");
static/favicon.ico

This is a binary file and will not be displayed.

static/og-hero.png

This is a binary file and will not be displayed.

+159
static/og-hero.svg
··· 1 + <svg 2 + xmlns="http://www.w3.org/2000/svg" 3 + width="1200" 4 + height="630" 5 + viewBox="0 0 1200 630" 6 + fill="none" 7 + > 8 + <defs> 9 + <linearGradient 10 + id="sky" 11 + x1="600" 12 + y1="0" 13 + x2="600" 14 + y2="630" 15 + gradientUnits="userSpaceOnUse" 16 + > 17 + <stop stop-color="#e8f0fe" /> 18 + <stop offset="0.25" stop-color="#c9d8f5" /> 19 + <stop offset="0.5" stop-color="#a8c4f0" /> 20 + <stop offset="0.75" stop-color="#c0d4f5" /> 21 + <stop offset="1" stop-color="#ebe4f5" /> 22 + </linearGradient> 23 + <radialGradient 24 + id="sun" 25 + cx="0" 26 + cy="0" 27 + r="1" 28 + gradientUnits="userSpaceOnUse" 29 + gradientTransform="translate(620 120) rotate(90) scale(520 340)" 30 + > 31 + <stop stop-color="#fff6d8" stop-opacity="0.95" /> 32 + <stop offset="0.35" stop-color="#ffe8b8" stop-opacity="0.55" /> 33 + <stop offset="0.7" stop-color="#ffd8a0" stop-opacity="0.18" /> 34 + <stop offset="1" stop-color="#ffd8a0" stop-opacity="0" /> 35 + </radialGradient> 36 + <linearGradient 37 + id="cloudStroke" 38 + x1="0" 39 + y1="0" 40 + x2="0" 41 + y2="1" 42 + gradientUnits="objectBoundingBox" 43 + > 44 + <stop stop-color="#D0FCFF" /> 45 + <stop offset="0.78" stop-color="#E9FEFF" stop-opacity="0.55" /> 46 + <stop offset="1" stop-color="#E9FEFF" stop-opacity="0.42" /> 47 + </linearGradient> 48 + <filter 49 + id="cloudBlur" 50 + x="-20%" 51 + y="-20%" 52 + width="140%" 53 + height="140%" 54 + color-interpolation-filters="sRGB" 55 + > 56 + <feGaussianBlur stdDeviation="12" result="b" /> 57 + <feMerge> 58 + <feMergeNode in="b" /> 59 + <feMergeNode in="SourceGraphic" /> 60 + </feMerge> 61 + </filter> 62 + </defs> 63 + <rect width="1200" height="630" fill="url(#sky)" /> 64 + <rect width="1200" height="630" fill="url(#sun)" /> 65 + 66 + <!-- Hero clouds (geometry from GlassClouds, scaled to frame) --> 67 + <g opacity="0.92" filter="url(#cloudBlur)"> 68 + <g transform="translate(-80 -20) scale(0.42)"> 69 + <path 70 + fill="#79CFFF" 71 + fill-opacity="0.2" 72 + stroke="url(#cloudStroke)" 73 + stroke-width="4" 74 + stroke-linejoin="round" 75 + d="M430.377 323.959C431.455 323.986 432.536 324 433.621 324C495.134 324 545 279.795 545 225.266C545 172.442 498.203 129.307 439.355 126.661C424.209 88.0793 382.821 60.3905 334.137 60.3905C326.999 60.3905 320.017 60.9858 313.253 62.1233C296.847 25.72 256.703 0 209.782 0C148.269 0 98.4028 44.2046 98.4028 98.7337C98.4028 108.487 99.9982 117.911 102.97 126.81C45.3852 130.62 0 173.245 0 225.266C0 279.795 49.8661 324 111.379 324C113.192 324 114.994 323.962 116.786 323.886V324H430.377V323.959Z" 76 + /> 77 + </g> 78 + <g transform="translate(720 40) scale(0.36)"> 79 + <path 80 + fill="#79CFFF" 81 + fill-opacity="0.16" 82 + stroke="url(#cloudStroke)" 83 + stroke-width="4" 84 + stroke-linejoin="round" 85 + d="M332 259.96C332.83 259.98 333.67 260 334.51 260C381.94 260 420 225.02 420 182.81C420 141.85 384.81 107.68 339.37 105.56C327.68 74.84 295.58 53 257.93 53C252.42 53 247.03 53.48 241.81 54.39C229.15 25.49 198.16 5 161.92 5C114.42 5 75.94 39.98 75.94 82.19C75.94 89.92 77.17 97.37 79.47 104.43C35.01 107.48 0 141.25 0 182.81C0 225.02 38.47 260 85.93 260C87.33 260 88.72 259.97 90.1 259.91V260H332V259.96Z" 86 + /> 87 + </g> 88 + <g transform="translate(80 280) scale(0.48)"> 89 + <path 90 + fill="#79CFFF" 91 + fill-opacity="0.15" 92 + stroke="url(#cloudStroke)" 93 + stroke-width="4" 94 + stroke-linejoin="round" 95 + d="M490 369.95C491.23 369.98 492.47 370 493.71 370C563.73 370 620 319.6 620 257.3C620 197 564.63 147.7 500.67 144.68C483.44 100.58 436.3 68.93 380.85 68.93C372.72 68.93 364.78 69.61 357.08 70.9C338.4 29.33 292.67 0 238.87 0C168.85 0 112 50.41 112 112.71C112 123.83 113.82 134.58 117.2 144.73C51.65 149.08 0 197.73 0 257.3C0 319.6 56.78 370 126.79 370C128.85 370 130.9 369.96 132.94 369.87V370H490V369.95Z" 96 + /> 97 + </g> 98 + <g transform="translate(780 320) scale(0.4)"> 99 + <path 100 + fill="#79CFFF" 101 + fill-opacity="0.18" 102 + stroke="url(#cloudStroke)" 103 + stroke-width="4" 104 + stroke-linejoin="round" 105 + d="M300 229.96C300.75 229.98 301.51 230 302.27 230C345.13 230 380 198.09 380 159.26C380 121.6 347.21 90.52 305.59 88.58C295.05 60.39 266.03 40 232.03 40C227.05 40 222.18 40.43 217.47 41.26C206.05 14.95 178.07 -3 145.37 -3C102.5 -3 67.63 28.91 67.63 68.75C67.63 75.84 68.74 82.68 70.81 89.15C30.65 91.95 0 122.89 0 160.26C0 198.89 34.73 230 77.59 230C78.85 230 80.11 229.97 81.36 229.92V230H300V229.96Z" 106 + /> 107 + </g> 108 + <g transform="translate(420 420) scale(0.38)"> 109 + <path 110 + fill="#79CFFF" 111 + fill-opacity="0.17" 112 + stroke="url(#cloudStroke)" 113 + stroke-width="4" 114 + stroke-linejoin="round" 115 + d="M379 289.96C380 289.98 381.01 290 382.03 290C436.23 290 480 250.57 480 201.63C480 154.21 438.75 115.62 387.85 113.26C374.43 79.32 338 55 295.08 55C288.78 55 282.63 55.53 276.66 56.53C262.19 23.02 225.83 0 183.72 0C129.52 0 85.75 39.43 85.75 88.37C85.75 96.99 87.15 105.31 89.77 113.19C40.04 116.48 0 153.75 0 199.63C0 250.57 43.92 290 98.12 290C99.71 290 101.3 289.97 102.88 289.9V290H379V289.96Z" 116 + /> 117 + </g> 118 + </g> 119 + 120 + <text 121 + x="600" 122 + y="248" 123 + text-anchor="middle" 124 + fill="rgba(18,26,47,0.68)" 125 + font-family="ui-monospace, 'Cascadia Code', 'SF Mono', Menlo, Consolas, monospace" 126 + font-size="22" 127 + font-weight="600" 128 + letter-spacing="0.42em" 129 + >ATMOSPHERE ACCOUNT</text> 130 + <text 131 + x="600" 132 + y="338" 133 + text-anchor="middle" 134 + fill="#0e1428" 135 + font-family="ui-monospace, 'Cascadia Code', 'SF Mono', Menlo, Consolas, monospace" 136 + font-size="56" 137 + font-weight="600" 138 + letter-spacing="-0.03em" 139 + >The last social account</text> 140 + <text 141 + x="600" 142 + y="408" 143 + text-anchor="middle" 144 + fill="#0e1428" 145 + font-family="ui-monospace, 'Cascadia Code', 'SF Mono', Menlo, Consolas, monospace" 146 + font-size="56" 147 + font-weight="600" 148 + letter-spacing="-0.03em" 149 + >you'll ever need.</text> 150 + <text 151 + x="600" 152 + y="482" 153 + text-anchor="middle" 154 + fill="rgba(18,26,47,0.93)" 155 + font-family="ui-sans-serif, system-ui, -apple-system, Segoe UI, sans-serif" 156 + font-size="26" 157 + font-weight="400" 158 + >One account for all your apps. Yours to keep, wherever you go.</text> 159 + </svg>