this repo has no description
0
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>