Bluesky app fork with some witchin' additions 💫

Merge branch 'main' of https://github.com/bluesky-social/social-app

+342 -188
+5
.gitignore
··· 123 123 # deer 124 124 .direnv 125 125 .wrangler 126 + 127 + # bskyweb build output 128 + bskyweb/static/media/*.webp 129 + bskyweb/static/media/*.jpg 130 + bskyweb/static/media/*.png
+6
__tests__/lib/string.test.ts
··· 378 378 'https://music.apple.com/us/playlist/playlistName/playlistId', 379 379 'https://music.apple.com/us/album/albumName/albumId', 380 380 'https://music.apple.com/us/album/albumName/albumId?i=songId', 381 + 'https://music.apple.com/us/song/songName/songId', 381 382 382 383 'https://vimeo.com/videoId', 383 384 'https://vimeo.com/videoId?autoplay=0', ··· 603 604 source: 'appleMusic', 604 605 playerUri: 605 606 'https://embed.music.apple.com/us/album/albumName/albumId?i=songId', 607 + }, 608 + { 609 + type: 'apple_music_song', 610 + source: 'appleMusic', 611 + playerUri: 'https://embed.music.apple.com/us/song/songName/songId', 606 612 }, 607 613 608 614 {
+9 -10
app.config.js
··· 11 11 * 12 12 * @see https://docs.expo.dev/build-reference/variables/#built-in-environment-variables 13 13 */ 14 - const PLATFORM = process.env.EAS_BUILD_PLATFORM 14 + const PLATFORM = process.env.EAS_BUILD_PLATFORM ?? 'web' 15 15 16 16 const IS_TESTFLIGHT = process.env.EXPO_PUBLIC_ENV === 'testflight' 17 17 const IS_PRODUCTION = process.env.EXPO_PUBLIC_ENV === 'production' ··· 54 54 config: { 55 55 usesNonExemptEncryption: false, 56 56 }, 57 + icon: 58 + PLATFORM === 'web' // web build doesn't like .icon files 59 + ? './assets/app-icons/ios_icon_default_next.png' 60 + : './assets/app-icons/ios_icon_default.icon', 57 61 infoPlist: { 58 62 UIBackgroundModes: ['remote-notification'], 59 63 NSCameraUsageDescription: ··· 351 355 * Default set 352 356 */ 353 357 default_light: { 354 - ios: './assets/app-icons/ios_icon_default_light.png', 355 - android: './assets/app-icons/android_icon_default_light.png', 358 + ios: './assets/app-icons/ios_icon_legacy_light.png', 359 + android: './assets/app-icons/android_icon_legacy_light.png', 356 360 prerendered: true, 357 361 }, 358 362 default_dark: { 359 - ios: './assets/app-icons/ios_icon_default_dark.png', 360 - android: './assets/app-icons/android_icon_default_dark.png', 361 - prerendered: true, 362 - }, 363 - next: { 364 - ios: './assets/app-icons/ios_icon_default_next.png', 365 - android: './assets/app-icons/android_icon_default_next.png', 363 + ios: './assets/app-icons/ios_icon_legacy_dark.png', 364 + android: './assets/app-icons/android_icon_legacy_dark.png', 366 365 prerendered: true, 367 366 }, 368 367
assets/app-icons/android_icon_default_dark.png assets/app-icons/android_icon_legacy_dark.png
assets/app-icons/android_icon_default_light.png assets/app-icons/android_icon_legacy_light.png
assets/app-icons/ios_icon_default.icon/Assets/iOS transparent.png

This is a binary file and will not be displayed.

+31
assets/app-icons/ios_icon_default.icon/icon.json
··· 1 + { 2 + "fill" : { 3 + "automatic-gradient" : "srgb:0.00000,0.41569,1.00000,1.00000" 4 + }, 5 + "groups" : [ 6 + { 7 + "layers" : [ 8 + { 9 + "fill" : "none", 10 + "glass" : false, 11 + "image-name" : "iOS transparent.png", 12 + "name" : "iOS transparent" 13 + } 14 + ], 15 + "shadow" : { 16 + "kind" : "neutral", 17 + "opacity" : 0.5 18 + }, 19 + "translucency" : { 20 + "enabled" : true, 21 + "value" : 0.5 22 + } 23 + } 24 + ], 25 + "supported-platforms" : { 26 + "circles" : [ 27 + "watchOS" 28 + ], 29 + "squares" : "shared" 30 + } 31 + }
assets/app-icons/ios_icon_default_dark.png assets/app-icons/ios_icon_legacy_dark.png
assets/app-icons/ios_icon_default_light.png assets/app-icons/ios_icon_legacy_light.png
+10
bskyembed/assets/logo_full_name.svg
··· 1 + <svg width="105" height="32" viewBox="0 0 105 32" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 + <path d="M19.7901 9.77492C21.7947 11.2889 23.9508 14.3587 24.7425 16.0059C25.5342 14.3587 27.6903 11.2889 29.6949 9.77492C31.1413 8.68251 33.485 7.83725 33.485 10.5269C33.485 11.064 33.1789 15.0393 32.9993 15.6848C32.3752 17.9285 30.1009 18.5008 28.0778 18.1544C31.6141 18.7598 32.5136 20.7653 30.5709 22.7708C26.1996 27.2831 24.7425 20.3569 24.7425 20.3569C24.7425 20.3569 23.2854 27.2831 18.9142 22.7708C16.9714 20.7653 17.871 18.7598 21.4072 18.1544C19.3841 18.5008 17.1099 17.9285 16.4857 15.6848C16.3061 15.0393 16 11.064 16 10.5269C16 7.83725 18.3437 8.68251 19.7901 9.77492Z" fill="white"/> 3 + <path d="M44.3863 16.3646C45.5901 16.7932 46.2292 17.7837 46.2292 18.8924C46.2292 20.7698 44.9659 21.908 42.5434 21.908H37.5942V11.3828H42.3799C44.6835 11.3828 45.7982 12.5506 45.7982 14.1028C45.7982 15.1376 45.3226 15.8915 44.3863 16.3646ZM42.2313 13.0237H39.6006V15.7732H42.2313C43.2568 15.7732 43.8067 15.2411 43.8067 14.3541C43.8067 13.5411 43.2419 13.0237 42.2313 13.0237ZM39.6006 20.2524H42.4393C43.5689 20.2524 44.1782 19.735 44.1782 18.8037C44.1782 17.828 43.5986 17.3402 42.4393 17.3402H39.6006V20.2524Z" fill="white"/> 4 + <path d="M49.0111 21.908H47.1385V11.3828H49.0111V21.908Z" fill="white"/> 5 + <path d="M55.2202 18.5524V14.2802H57.0929V21.908H55.2797V20.7993C54.7 21.6567 53.8975 22.0854 52.872 22.0854C51.252 22.0854 50.1968 21.1098 50.1968 19.3359V14.2802H52.0694V19.0254C52.0694 19.9863 52.545 20.4741 53.5111 20.4741C54.4177 20.4741 55.2202 19.8089 55.2202 18.5524Z" fill="white"/> 6 + <path d="M65.6167 18.2272V18.6706H59.8799C60.0137 19.9863 60.7419 20.6367 61.8714 20.6367C62.7334 20.6367 63.3131 20.2672 63.6252 19.5428H65.4235C65.0222 21.095 63.6846 22.0854 61.8566 22.0854C60.7122 22.0854 59.7907 21.7159 59.0922 20.9915C58.3937 20.2672 58.037 19.3063 58.037 18.0941C58.037 16.8967 58.3788 15.9359 59.0773 15.1967C59.7759 14.4724 60.6825 14.1028 61.8269 14.1028C62.9861 14.1028 63.9076 14.4872 64.5912 15.2411C65.2749 15.995 65.6167 17.0002 65.6167 18.2272ZM61.812 15.5515C60.7865 15.5515 60.0731 16.1428 59.8948 17.3698H63.7441C63.5806 16.2611 62.8969 15.5515 61.812 15.5515Z" fill="white"/> 7 + <path d="M69.7673 22.115C67.5379 22.115 66.3638 21.2428 66.2598 19.4837H68.0878C68.1918 20.4298 68.6674 20.7846 69.797 20.7846C70.8076 20.7846 71.3129 20.4741 71.3129 19.868C71.3129 19.3211 70.9562 19.055 69.8118 18.8628L68.935 18.715C67.2555 18.4341 66.4232 17.6654 66.4232 16.4089C66.4232 14.975 67.5676 14.1028 69.6038 14.1028C71.7885 14.1028 72.9181 14.9602 72.9924 16.6898H71.2238C71.1792 15.7585 70.6293 15.4332 69.6038 15.4332C68.712 15.4332 68.2662 15.7289 68.2662 16.3202C68.2662 16.8524 68.6526 17.0889 69.5443 17.2515L70.5104 17.3993C72.3681 17.7393 73.1707 18.4193 73.1707 19.7202C73.1707 21.2576 71.9223 22.115 69.7673 22.115Z" fill="white"/> 8 + <path d="M81.3899 21.908H79.2497L77.0204 18.3602L75.8611 19.5132V21.908H74.0182V11.3828H75.8611V17.4437L78.9822 14.2802H81.2116L78.3134 17.1628L81.3899 21.908Z" fill="white"/> 9 + <path d="M86.2805 16.2019L86.9047 14.2802H88.8665L85.909 22.5289C85.5968 23.3715 85.2104 23.9776 84.72 24.3176C84.2295 24.6576 83.531 24.8202 82.6095 24.8202C82.2974 24.8202 82.0299 24.8054 81.7921 24.7759V23.3124H82.5055C83.3526 23.3124 83.7688 22.795 83.7688 22.0854C83.7688 21.7306 83.6499 21.2132 83.4121 20.548L81.1827 14.2802H83.204L83.8282 16.1872C84.289 17.6211 84.6902 19.0402 85.0469 20.4446C85.3739 19.2324 85.7901 17.8132 86.2805 16.2019Z" fill="white"/> 10 + </svg>
+4 -2
bskyembed/src/components/container.tsx
··· 37 37 return ( 38 38 <div 39 39 ref={ref} 40 - className="w-full bg-white text-black hover:bg-neutral-50 dark:bg-dimmedBg dark:hover:bg-dimmedBgLighten relative transition-colors max-w-[600px] min-w-[300px] flex border dark:border-slate-600 dark:text-slate-200 rounded-xl" 40 + className="w-full bg-brand text-black dark:bg-brand relative transition-colors max-w-[600px] min-w-[300px] flex items-center dark:text-slate-200 rounded-[20px] cursor-pointer hover:bg-opacity-90" 41 41 onClick={() => { 42 42 if (ref.current && href) { 43 43 // forwardRef requires preact/compat - let's keep it simple ··· 49 49 } 50 50 }}> 51 51 {href && <Link href={href} />} 52 - <div className="flex-1 px-4 pt-3 pb-2.5 max-w-full">{children}</div> 52 + <div className="flex-1 px-[6px] pt-[6px] pb-2.5 max-w-full"> 53 + {children} 54 + </div> 53 55 </div> 54 56 ) 55 57 }
+3 -3
bskyembed/src/components/embed.tsx
··· 83 83 return ( 84 84 <Link 85 85 href={`/profile/${record.author.did}/post/${getRkey(record)}`} 86 - className="transition-colors hover:bg-neutral-100 dark:hover:bg-slate-700 border dark:border-slate-600 rounded-xl p-2 gap-1.5 w-full flex flex-col"> 86 + className="transition-colors hover:bg-blue-50 dark:hover:bg-slate-900 border dark:border-slate-600 rounded-xl p-2 gap-1.5 w-full flex flex-col"> 87 87 <div className="flex gap-1.5 items-center"> 88 - <div className="w-4 h-4 rounded-full bg-neutral-300 dark:bg-slate-700 shrink-0"> 88 + <div className="w-4 h-4 rounded-full bg-neutral-300 dark:bg-slate-900 shrink-0"> 89 89 <img 90 90 className="rounded-full" 91 91 src={record.author.avatar} ··· 222 222 223 223 function Info({children}: {children: ComponentChildren}) { 224 224 return ( 225 - <div className="w-full rounded-xl border py-2 px-2.5 flex-row flex gap-2 bg-neutral-50"> 225 + <div className="w-full rounded-xl border py-2 px-2.5 flex-row flex gap-2 hover:bg-blue-50 dark:border-slate-600 dark:hover:bg-slate-900"> 226 226 <img src={infoIcon} className="w-4 h-4 shrink-0 mt-0.5" /> 227 227 <p className="text-sm text-textLight dark:text-textDimmed">{children}</p> 228 228 </div>
+63 -51
bskyembed/src/components/post.tsx
··· 6 6 } from '@atproto/api' 7 7 import {h} from 'preact' 8 8 9 - import replyIcon from '../../assets/bubble_filled_stroke2_corner2_rounded.svg' 10 - import likeIcon from '../../assets/heart2_filled_stroke2_corner0_rounded.svg' 11 - import logo from '../../assets/logo.svg' 12 - import repostIcon from '../../assets/repost_stroke2_corner2_rounded.svg' 9 + import logo from '../../assets/logo_full_name.svg' 10 + import {Like as LikeIcon} from '../icons/Like' 11 + import {Reply as ReplyIcon} from '../icons/Reply' 12 + import {Repost as RepostIcon} from '../icons/Repost' 13 13 import {CONTENT_LABELS} from '../labels' 14 14 import * as bsky from '../types/bsky' 15 15 import {niceDate} from '../util/nice-date' ··· 45 45 const verification = getVerificationState({profile: post.author}) 46 46 47 47 const href = `/profile/${post.author.did}/post/${getRkey(post)}` 48 + 48 49 return ( 49 50 <Container href={href}> 50 - <div className="flex-1 flex-col flex gap-2" lang={record?.langs?.[0]}> 51 - <div className="flex gap-2.5 items-center cursor-pointer w-full max-w-full"> 51 + <div 52 + className="flex-1 flex-col flex gap-2 bg-neutral-50 dark:bg-black dark:hover:bg-slate-900 hover:bg-blue-50 rounded-[14px] p-4" 53 + lang={record?.langs?.[0]}> 54 + <div className="flex gap-2.5 items-center cursor-pointer w-full max-w-full "> 52 55 <Link 53 56 href={`/profile/${post.author.did}`} 54 57 className="rounded-full shrink-0"> ··· 80 83 @{post.author.handle} 81 84 </Link> 82 85 </div> 83 - <Link 84 - href={href} 85 - className="transition-transform hover:scale-110 shrink-0 self-start"> 86 - <img src={logo} className="h-8" /> 87 - </Link> 88 86 </div> 89 87 <PostContent record={record} /> 90 88 <Embed content={post.embed} labels={post.labels} /> 91 - <Link href={href}> 92 - <time 93 - datetime={new Date(post.indexedAt).toISOString()} 94 - className="text-textLight dark:text-textDimmed mt-1 text-sm hover:underline"> 95 - {niceDate(post.indexedAt)} 96 - </time> 97 - </Link> 98 - <div className="border-t dark:border-slate-600 w-full pt-2.5 flex items-center gap-5 text-sm cursor-pointer"> 99 - {!!post.likeCount && ( 100 - <div className="flex items-center gap-2 cursor-pointer"> 101 - <img src={likeIcon} className="w-5 h-5" /> 102 - <p className="font-bold text-neutral-500 dark:text-neutral-300 mb-px"> 103 - {prettyNumber(post.likeCount)} 104 - </p> 105 - </div> 106 - )} 107 - {!!post.repostCount && ( 108 - <div className="flex items-center gap-2 cursor-pointer"> 109 - <img src={repostIcon} className="w-5 h-5" /> 110 - <p className="font-bold text-neutral-500 dark:text-neutral-300 mb-px"> 111 - {prettyNumber(post.repostCount)} 112 - </p> 113 - </div> 114 - )} 115 - <div className="flex items-center gap-2 cursor-pointer"> 116 - <img src={replyIcon} className="w-5 h-5" /> 117 - <p className="font-bold text-neutral-500 dark:text-neutral-300 mb-px"> 118 - Reply 119 - </p> 89 + 90 + <div className="flex items-center justify-between w-full pt-2.5 text-sm"> 91 + <div className="flex items-center gap-3 text-sm cursor-pointer"> 92 + {!!post.likeCount && ( 93 + <div className="flex items-center gap-1 cursor-pointer group"> 94 + <LikeIcon 95 + width={20} 96 + height={20} 97 + className="text-slate-600 dark:text-slate-400 group-hover:text-neutral-800 dark:group-hover:text-white transition-colors" 98 + /> 99 + <p className="font-medium text-slate-600 text-neutral-600 dark:text-neutral-300 mb-px group-hover:text-neutral-800 dark:group-hover:text-white transition-colors dark:text-slate-400"> 100 + {prettyNumber(post.likeCount)} 101 + </p> 102 + </div> 103 + )} 104 + {!!post.replyCount && ( 105 + <div className="flex items-center gap-1 cursor-pointer group"> 106 + <ReplyIcon 107 + width={20} 108 + height={20} 109 + className="text-slate-600 dark:text-slate-400 group-hover:text-neutral-800 dark:group-hover:text-white transition-colors" 110 + /> 111 + <p className="font-medium text-slate-600 text-neutral-600 dark:text-neutral-300 mb-px group-hover:text-neutral-800 dark:group-hover:text-white transition-colors dark:text-slate-400"> 112 + {prettyNumber(post.replyCount)} 113 + </p> 114 + </div> 115 + )} 116 + 117 + {!!post.repostCount && ( 118 + <div className="flex items-center gap-1 cursor-pointer group"> 119 + <RepostIcon 120 + width={20} 121 + height={20} 122 + className="text-slate-600 dark:text-slate-400 group-hover:text-neutral-800 dark:group-hover:text-white transition-colors" 123 + /> 124 + <p className="font-medium text-slate-600 dark:text-slate-400 mb-px group-hover:text-neutral-800 dark:group-hover:text-white transition-colors"> 125 + {prettyNumber(post.repostCount)} 126 + </p> 127 + </div> 128 + )} 120 129 </div> 121 - <div className="flex-1" /> 122 - <p className="cursor-pointer text-brand dark:text-brandLighten font-bold hover:underline hidden min-[450px]:inline"> 123 - {post.replyCount 124 - ? `Read ${prettyNumber(post.replyCount)} ${ 125 - post.replyCount > 1 ? 'replies' : 'reply' 126 - } on Bluesky` 127 - : `View on Bluesky`} 128 - </p> 129 - <p className="cursor-pointer text-brand font-bold hover:underline min-[450px]:hidden"> 130 - <span className="hidden min-[380px]:inline">View on </span>Bluesky 131 - </p> 130 + <Link href={href}> 131 + <time 132 + datetime={new Date(post.indexedAt).toISOString()} 133 + className="text-slate-500 dark:text-textDimmed text-sm hover:underline dark:text-slate-500"> 134 + {niceDate(post.indexedAt)} 135 + </time> 136 + </Link> 132 137 </div> 138 + </div> 139 + <div className="flex items-center justify-end pt-2"> 140 + <Link 141 + href={href} 142 + className="transition-transform hover:scale-110 shrink-0"> 143 + <img src={logo} className="h-8" /> 144 + </Link> 133 145 </div> 134 146 </Container> 135 147 )
+28
bskyembed/src/icons/Like.tsx
··· 1 + import {h} from 'preact' 2 + 3 + export const Like = ({ 4 + width = 16, 5 + height = 17, 6 + fill = 'currentColor', 7 + className, 8 + }: { 9 + width?: number 10 + height?: number 11 + fill?: string 12 + className?: string 13 + }) => ( 14 + <svg 15 + className={className} 16 + width={width} 17 + height={height} 18 + viewBox="0 0 16 17" 19 + fill="none" 20 + xmlns="http://www.w3.org/2000/svg"> 21 + <path 22 + fillRule="evenodd" 23 + clipRule="evenodd" 24 + d="M11.1561 3.62664C10.3307 3.44261 9.35086 3.65762 8.47486 4.54615C8.34958 4.67323 8.17857 4.74478 8.00012 4.74478C7.82167 4.74478 7.65066 4.67324 7.52538 4.54616C6.64938 3.65762 5.66955 3.44261 4.84416 3.62664C4.0022 3.81438 3.25812 4.43047 2.89709 5.33069C2.21997 7.01907 2.83524 10.1257 8.00015 13.1315C13.165 10.1257 13.7803 7.01906 13.1032 5.33069C12.7421 4.43047 11.998 3.81437 11.1561 3.62664ZM14.3407 4.83438C15.4101 7.50098 14.0114 11.2942 8.32611 14.4808C8.12362 14.5943 7.87668 14.5943 7.6742 14.4808C1.98891 11.2942 0.590133 7.501 1.65956 4.83439C2.1788 3.53968 3.26862 2.61187 4.55399 2.32527C5.68567 2.07294 6.92237 2.32723 8.00012 3.18278C9.07786 2.32723 10.3146 2.07294 11.4462 2.32526C12.7316 2.61186 13.8214 3.53967 14.3407 4.83438Z" 25 + fill={fill} 26 + /> 27 + </svg> 28 + )
+28
bskyembed/src/icons/Reply.tsx
··· 1 + import {h} from 'preact' 2 + 3 + export const Reply = ({ 4 + width = 16, 5 + height = 17, 6 + fill = 'currentColor', 7 + className, 8 + }: { 9 + width?: number 10 + height?: number 11 + fill?: string 12 + className?: string 13 + }) => ( 14 + <svg 15 + className={className} 16 + width={width} 17 + height={height} 18 + viewBox="0 0 16 17" 19 + fill="none" 20 + xmlns="http://www.w3.org/2000/svg"> 21 + <path 22 + fillRule="evenodd" 23 + clipRule="evenodd" 24 + d="M1.3335 4.23242C1.3335 3.12785 2.22893 2.23242 3.3335 2.23242H12.6668C13.7714 2.23242 14.6668 3.12785 14.6668 4.23242V10.8991C14.6668 12.0037 13.7714 12.8991 12.6668 12.8991H8.18482L5.00983 14.8041C4.80387 14.9277 4.54737 14.9309 4.33836 14.8126C4.12936 14.6942 4.00016 14.4726 4.00016 14.2324V12.8991H3.3335C2.22893 12.8991 1.3335 12.0037 1.3335 10.8991V4.23242ZM3.3335 3.56576C2.96531 3.56576 2.66683 3.86423 2.66683 4.23242V10.8991C2.66683 11.2673 2.96531 11.5658 3.3335 11.5658H4.66683C5.03502 11.5658 5.3335 11.8642 5.3335 12.2324V13.055L7.65717 11.6608C7.76078 11.5986 7.87933 11.5658 8.00016 11.5658H12.6668C13.035 11.5658 13.3335 11.2673 13.3335 10.8991V4.23242C13.3335 3.86423 13.035 3.56576 12.6668 3.56576H3.3335Z" 25 + fill={fill} 26 + /> 27 + </svg> 28 + )
+26
bskyembed/src/icons/Repost.tsx
··· 1 + import {h} from 'preact' 2 + 3 + export const Repost = ({ 4 + width = 16, 5 + height = 17, 6 + fill = 'currentColor', 7 + className, 8 + }: { 9 + width?: number 10 + height?: number 11 + fill?: string 12 + className?: string 13 + }) => ( 14 + <svg 15 + className={className} 16 + width={width} 17 + height={height} 18 + viewBox="0 0 16 17" 19 + fill="none" 20 + xmlns="http://www.w3.org/2000/svg"> 21 + <path 22 + d="M3.86204 9.76164C4.12239 9.50134 4.54442 9.50131 4.80475 9.76164C5.06503 10.022 5.06503 10.444 4.80475 10.7044L3.94277 11.5663H11.3334C12.0697 11.5663 12.6667 10.9693 12.6667 10.233V8.89966C12.6667 8.53147 12.9652 8.233 13.3334 8.233C13.7015 8.23305 14.0001 8.53151 14.0001 8.89966V10.233C14.0001 11.7057 12.8061 12.8996 11.3334 12.8997H3.94277L4.80475 13.7616C5.06503 14.022 5.06503 14.444 4.80475 14.7044C4.54442 14.9647 4.12239 14.9646 3.86204 14.7044L2.3334 13.1757C1.8127 12.655 1.8127 11.811 2.3334 11.2903L3.86204 9.76164ZM2.00006 7.56633V6.233C2.00006 4.76024 3.19397 3.56633 4.66673 3.56633H12.0574L11.1954 2.70435C10.935 2.444 10.935 2.02199 11.1954 1.76164C11.4557 1.50134 11.8778 1.50131 12.1381 1.76164L13.6667 3.29029C14.1873 3.81096 14.1873 4.65503 13.6667 5.17571L12.1381 6.70435C11.8778 6.96468 11.4557 6.96465 11.1954 6.70435C10.935 6.444 10.935 6.02199 11.1954 5.76164L12.0574 4.89966H4.66673C3.93035 4.89966 3.3334 5.49662 3.3334 6.233V7.56633C3.3334 7.93449 3.03487 8.23294 2.66673 8.233C2.29854 8.233 2.00006 7.93452 2.00006 7.56633Z" 23 + fill={fill} 24 + /> 25 + </svg> 26 + )
+13 -5
src/components/MediaInsetBorder.tsx
··· 1 + import {StyleSheet} from 'react-native' 1 2 import type React from 'react' 2 3 3 - import {atoms as a, useTheme, type ViewStyleProp} from '#/alf' 4 + import {isHighDPI} from '#/lib/browser' 5 + import {atoms as a, platform, useTheme, type ViewStyleProp} from '#/alf' 4 6 import {Fill} from '#/components/Fill' 5 7 6 8 /** ··· 25 27 <Fill 26 28 style={[ 27 29 a.rounded_md, 28 - a.border, 30 + { 31 + borderWidth: platform({ 32 + native: StyleSheet.hairlineWidth, 33 + // while we generally use hairlineWidth (aka 1px), 34 + // we make an exception here for high DPI screens 35 + // as the 1px border is very noticeable -sfn 36 + web: isHighDPI ? 0.5 : StyleSheet.hairlineWidth, 37 + }), 38 + }, 29 39 opaque 30 40 ? [t.atoms.border_contrast_low] 31 41 : [ ··· 34 44 : t.atoms.border_contrast_high, 35 45 {opacity: 0.6}, 36 46 ], 37 - { 38 - pointerEvents: 'none', 39 - }, 47 + a.pointer_events_none, 40 48 style, 41 49 ]}> 42 50 {children}
+1
src/lib/browser.native.ts
··· 2 2 export const isFirefox = false 3 3 export const isTouchDevice = true 4 4 export const isAndroidWeb = false 5 + export const isHighDPI = true
+1
src/lib/browser.ts
··· 6 6 export const isTouchDevice = window.matchMedia('(pointer: coarse)').matches 7 7 export const isAndroidWeb = 8 8 /android/i.test(navigator.userAgent) && isTouchDevice 9 + export const isHighDPI = window.matchMedia('(min-resolution: 2dppx)').matches
+7 -4
src/lib/hooks/useIntentHandler.ts
··· 5 5 6 6 import {useOpenComposer} from '#/lib/hooks/useOpenComposer' 7 7 import {logger} from '#/logger' 8 - import {isNative} from '#/platform/detection' 8 + import {isIOS, isNative} from '#/platform/detection' 9 9 import {useSession} from '#/state/session' 10 10 import {useCloseAllActiveElements} from '#/state/util' 11 11 import { ··· 34 34 35 35 React.useEffect(() => { 36 36 const handleIncomingURL = async (url: string) => { 37 - if (isNative) { 38 - // Close in-app browser if it's open 39 - await WebBrowser.dismissBrowser().catch(() => {}) 37 + if (isIOS) { 38 + // Close in-app browser if it's open (iOS only) 39 + // TEMP: promise never resolves if the browser is not open, so don't await 40 + // https://github.com/expo/expo/issues/40710 41 + // add the await back when possible since it's needed to fix the IAB share bug -sfn 42 + /* await */ WebBrowser.dismissBrowser().catch(() => {}) 40 43 } 41 44 42 45 const referrerInfo = Referrer.getReferrerInfo()
+11 -2
src/lib/strings/embed-player.ts
··· 239 239 const type = pathParams[2] 240 240 const songId = urlp.searchParams.get('i') 241 241 242 - if (pathParams.length === 5 && (type === 'playlist' || type === 'album')) { 242 + if ( 243 + pathParams.length === 5 && 244 + (type === 'playlist' || type === 'album' || type === 'song') 245 + ) { 243 246 // We want to append the songId to the end of the url if it exists 244 247 const embedUri = `https://embed.music.apple.com${urlp.pathname}${ 245 - urlp.search ? '?i=' + songId : '' 248 + songId ? `?i=${songId}` : '' 246 249 }` 247 250 248 251 if (type === 'playlist') { ··· 264 267 source: 'appleMusic', 265 268 playerUri: embedUri, 266 269 } 270 + } 271 + } else if (type === 'song') { 272 + return { 273 + type: 'apple_music_song', 274 + source: 'appleMusic', 275 + playerUri: embedUri, 267 276 } 268 277 } 269 278 }
+85 -86
src/locale/locales/en/messages.po
··· 95 95 msgid "{0, plural, one {following} other {following}}" 96 96 msgstr "" 97 97 98 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:476 98 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:477 99 99 msgid "{0, plural, one {like} other {likes}}" 100 100 msgstr "" 101 101 ··· 103 103 msgid "{0, plural, one {post} other {posts}}" 104 104 msgstr "" 105 105 106 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:460 106 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:461 107 107 msgid "{0, plural, one {quote} other {quotes}}" 108 108 msgstr "" 109 109 110 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:442 110 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:443 111 111 msgid "{0, plural, one {repost} other {reposts}}" 112 112 msgstr "" 113 113 114 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:487 114 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:488 115 115 msgid "{0, plural, one {save} other {saves}}" 116 116 msgstr "" 117 117 ··· 397 397 msgid "{firstAuthorName} verified you" 398 398 msgstr "" 399 399 400 - #: src/components/ProfileHoverCard/index.web.tsx:572 400 + #: src/components/ProfileHoverCard/index.web.tsx:577 401 401 msgid "{following} following" 402 402 msgstr "" 403 403 ··· 630 630 msgid "Account removed from quick access" 631 631 msgstr "" 632 632 633 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:137 633 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:138 634 634 #: src/view/com/profile/ProfileMenu.tsx:156 635 635 msgctxt "toast" 636 636 msgid "Account unblocked" ··· 1144 1144 msgid "App Passwords" 1145 1145 msgstr "" 1146 1146 1147 - #: src/components/moderation/LabelsOnMeDialog.tsx:152 1148 - #: src/components/moderation/LabelsOnMeDialog.tsx:155 1147 + #: src/components/moderation/LabelsOnMeDialog.tsx:154 1148 + #: src/components/moderation/LabelsOnMeDialog.tsx:157 1149 1149 msgid "Appeal" 1150 1150 msgstr "" 1151 1151 1152 - #: src/components/moderation/LabelsOnMeDialog.tsx:270 1152 + #: src/components/moderation/LabelsOnMeDialog.tsx:281 1153 1153 msgid "Appeal \"{0}\" label" 1154 1154 msgstr "" 1155 1155 1156 - #: src/components/moderation/LabelsOnMeDialog.tsx:260 1156 + #: src/components/moderation/LabelsOnMeDialog.tsx:271 1157 1157 #: src/screens/Messages/components/ChatDisabled.tsx:103 1158 1158 msgctxt "toast" 1159 1159 msgid "Appeal submitted" ··· 1192 1192 msgid "Apply Pull Request" 1193 1193 msgstr "" 1194 1194 1195 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:656 1195 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:658 1196 1196 msgid "Archived from {0}" 1197 1197 msgstr "" 1198 1198 1199 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:625 1200 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:664 1199 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:627 1200 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:666 1201 1201 msgid "Archived post" 1202 1202 msgstr "" 1203 1203 ··· 1268 1268 msgid "At least 8 characters" 1269 1269 msgstr "" 1270 1270 1271 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:62 1271 + #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:48 1272 1272 msgctxt "Name of app icon variant" 1273 1273 msgid "Aurora" 1274 1274 msgstr "" ··· 1283 1283 msgid "Available" 1284 1284 msgstr "" 1285 1285 1286 - #: src/components/moderation/LabelsOnMeDialog.tsx:317 1287 - #: src/components/moderation/LabelsOnMeDialog.tsx:318 1286 + #: src/components/moderation/LabelsOnMeDialog.tsx:333 1287 + #: src/components/moderation/LabelsOnMeDialog.tsx:334 1288 1288 #: src/screens/Login/ChooseAccountForm.tsx:90 1289 1289 #: src/screens/Login/ChooseAccountForm.tsx:95 1290 1290 #: src/screens/Login/ForgotPasswordForm.tsx:123 ··· 1355 1355 msgstr "" 1356 1356 1357 1357 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:792 1358 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:333 1358 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:336 1359 1359 #: src/view/com/profile/ProfileMenu.tsx:495 1360 1360 msgid "Block" 1361 1361 msgstr "" ··· 1453 1453 msgid "Bluesky" 1454 1454 msgstr "" 1455 1455 1456 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:686 1456 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:688 1457 1457 msgid "Bluesky cannot confirm the authenticity of the claimed date." 1458 1458 msgstr "" 1459 1459 1460 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:179 1460 + #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:165 1461 1461 msgctxt "Name of app icon variant" 1462 1462 msgid "Bluesky Classic™" 1463 1463 msgstr "" ··· 3016 3016 #: src/screens/Profile/Header/EditProfileDialog.tsx:268 3017 3017 #: src/screens/Profile/Header/EditProfileDialog.tsx:274 3018 3018 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:181 3019 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:195 3019 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:196 3020 3020 msgid "Edit profile" 3021 3021 msgstr "" 3022 3022 3023 3023 #: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:184 3024 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:198 3024 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:199 3025 3025 msgid "Edit Profile" 3026 3026 msgstr "" 3027 3027 ··· 3347 3347 msgid "Expires {0}" 3348 3348 msgstr "" 3349 3349 3350 - #: src/components/moderation/LabelsOnMeDialog.tsx:201 3350 + #: src/components/moderation/LabelsOnMeDialog.tsx:203 3351 3351 #: src/components/moderation/ModerationDetailsDialog.tsx:210 3352 3352 msgid "Expires in {0}" 3353 3353 msgstr "" ··· 3556 3556 msgid "Failed to send email, please try again." 3557 3557 msgstr "" 3558 3558 3559 - #: src/components/moderation/LabelsOnMeDialog.tsx:256 3559 + #: src/components/moderation/LabelsOnMeDialog.tsx:265 3560 3560 #: src/screens/Messages/components/ChatDisabled.tsx:99 3561 3561 msgid "Failed to submit appeal, please try again." 3562 3562 msgstr "" ··· 3740 3740 msgid "Fitness" 3741 3741 msgstr "" 3742 3742 3743 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:163 3743 + #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:149 3744 3744 msgctxt "Name of app icon variant" 3745 3745 msgid "Flat Black" 3746 3746 msgstr "" 3747 3747 3748 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:131 3748 + #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:117 3749 3749 msgctxt "Name of app icon variant" 3750 3750 msgid "Flat Blue" 3751 3751 msgstr "" 3752 3752 3753 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:147 3753 + #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:133 3754 3754 msgctxt "Name of app icon variant" 3755 3755 msgid "Flat White" 3756 3756 msgstr "" ··· 3764 3764 #: src/components/ProfileHoverCard/index.web.tsx:496 3765 3765 #: src/components/ProfileHoverCard/index.web.tsx:507 3766 3766 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:131 3767 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:257 3767 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:258 3768 3768 #: src/screens/VideoFeed/index.tsx:856 3769 3769 msgid "Follow" 3770 3770 msgstr "" ··· 3775 3775 msgstr "" 3776 3776 3777 3777 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:113 3778 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:242 3778 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:243 3779 3779 msgid "Follow {0}" 3780 3780 msgstr "" 3781 3781 ··· 3812 3812 #. User is not following this account, click to follow back 3813 3813 #: src/components/ProfileCard.tsx:518 3814 3814 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:129 3815 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:255 3815 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:256 3816 3816 msgid "Follow back" 3817 3817 msgstr "" 3818 3818 ··· 3855 3855 #: src/components/ProfileHoverCard/index.web.tsx:495 3856 3856 #: src/components/ProfileHoverCard/index.web.tsx:506 3857 3857 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:134 3858 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:253 3858 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:254 3859 3859 #: src/screens/VideoFeed/index.tsx:854 3860 3860 msgid "Following" 3861 3861 msgstr "" ··· 3867 3867 msgstr "" 3868 3868 3869 3869 #: src/components/ProfileCard.tsx:474 3870 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:95 3870 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:96 3871 3871 msgid "Following {0}" 3872 3872 msgstr "" 3873 3873 ··· 4677 4677 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." 4678 4678 msgstr "" 4679 4679 4680 - #: src/components/moderation/LabelsOnMeDialog.tsx:74 4680 + #: src/components/moderation/LabelsOnMeDialog.tsx:76 4681 4681 msgid "Labels on your account" 4682 4682 msgstr "" 4683 4683 4684 - #: src/components/moderation/LabelsOnMeDialog.tsx:76 4684 + #: src/components/moderation/LabelsOnMeDialog.tsx:78 4685 4685 msgid "Labels on your content" 4686 4686 msgstr "" 4687 4687 ··· 4902 4902 msgid "Likes of your reposts notifications" 4903 4903 msgstr "" 4904 4904 4905 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:469 4905 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:470 4906 4906 msgid "Likes on this post" 4907 4907 msgstr "" 4908 4908 ··· 5196 5196 msgid "Messages" 5197 5197 msgstr "" 5198 5198 5199 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:115 5199 + #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:101 5200 5200 msgctxt "Name of app icon variant" 5201 5201 msgid "Midnight" 5202 5202 msgstr "" ··· 5314 5314 msgid "Mute" 5315 5315 msgstr "" 5316 5316 5317 - #: src/components/RichTextTag.tsx:140 5318 - #: src/components/RichTextTag.tsx:153 5317 + #: src/components/RichTextTag.tsx:141 5318 + #: src/components/RichTextTag.tsx:154 5319 5319 msgid "Mute {tag}" 5320 5320 msgstr "" 5321 5321 ··· 5602 5602 msgid "Next" 5603 5603 msgstr "" 5604 5604 5605 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:42 5606 - msgctxt "Name of app icon variant" 5607 - msgid "Next" 5608 - msgstr "" 5609 - 5610 5605 #: src/view/com/lightbox/Lightbox.web.tsx:170 5611 5606 msgid "Next image" 5612 5607 msgstr "" ··· 5646 5641 msgstr "" 5647 5642 5648 5643 #: src/components/ProfileCard.tsx:496 5649 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:118 5644 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:119 5650 5645 msgid "No longer following {0}" 5651 5646 msgstr "" 5652 5647 ··· 5872 5867 msgstr "" 5873 5868 5874 5869 #: src/screens/Login/PasswordUpdatedForm.tsx:37 5875 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:691 5870 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:693 5876 5871 msgid "Okay" 5877 5872 msgstr "" 5878 5873 ··· 6274 6269 msgid "Pin to your profile" 6275 6270 msgstr "" 6276 6271 6277 - #: src/view/com/posts/PostFeedReason.tsx:125 6272 + #: src/view/com/posts/PostFeedReason.tsx:126 6278 6273 msgid "Pinned" 6279 6274 msgstr "" 6280 6275 ··· 6424 6419 msgid "Please enter your username" 6425 6420 msgstr "" 6426 6421 6427 - #: src/components/moderation/LabelsOnMeDialog.tsx:292 6422 + #: src/components/moderation/LabelsOnMeDialog.tsx:308 6428 6423 msgid "Please explain why you think this label was incorrectly applied by {0}" 6429 6424 msgstr "" 6430 6425 ··· 6511 6506 msgid "Post failed to upload. Please check your Internet connection and try again." 6512 6507 msgstr "" 6513 6508 6514 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:133 6515 - #: src/screens/PostThread/components/ThreadItemPost.tsx:111 6516 - #: src/screens/PostThread/components/ThreadItemTreePost.tsx:107 6509 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:134 6510 + #: src/screens/PostThread/components/ThreadItemPost.tsx:112 6511 + #: src/screens/PostThread/components/ThreadItemTreePost.tsx:108 6517 6512 #: src/screens/VideoFeed/index.tsx:534 6518 6513 msgid "Post has been deleted" 6519 6514 msgstr "" ··· 6774 6769 msgid "Quotes" 6775 6770 msgstr "" 6776 6771 6777 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:453 6772 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:454 6778 6773 msgid "Quotes of this post" 6779 6774 msgstr "" 6780 6775 ··· 7276 7271 msgid "Reposts" 7277 7272 msgstr "" 7278 7273 7279 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:435 7274 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:436 7280 7275 msgid "Reposts of this post" 7281 7276 msgstr "" 7282 7277 ··· 7429 7424 msgid "Save" 7430 7425 msgstr "" 7431 7426 7432 - #: src/view/com/lightbox/ImageViewing/index.tsx:613 7427 + #: src/view/com/lightbox/ImageViewing/index.tsx:614 7433 7428 msgctxt "action" 7434 7429 msgid "Save" 7435 7430 msgstr "" ··· 7609 7604 msgid "Security step required" 7610 7605 msgstr "" 7611 7606 7612 - #: src/components/RichTextTag.tsx:111 7607 + #: src/components/RichTextTag.tsx:112 7613 7608 msgid "See {tag} posts" 7614 7609 msgstr "" 7615 7610 7616 - #: src/components/RichTextTag.tsx:124 7611 + #: src/components/RichTextTag.tsx:125 7617 7612 msgid "See {tag} posts by user" 7618 7613 msgstr "" 7619 7614 7620 - #: src/components/RichTextTag.tsx:118 7615 + #: src/components/RichTextTag.tsx:119 7621 7616 msgid "See #{tag} posts" 7622 7617 msgstr "" 7623 7618 7624 - #: src/components/RichTextTag.tsx:132 7619 + #: src/components/RichTextTag.tsx:133 7625 7620 msgid "See #{tag} posts by user" 7626 7621 msgstr "" 7627 7622 ··· 7817 7812 msgid "Send message" 7818 7813 msgstr "" 7819 7814 7820 - #: src/components/PostControls/ShareMenu/RecentChats.tsx:122 7815 + #: src/components/PostControls/ShareMenu/RecentChats.tsx:121 7821 7816 msgid "Send post to {name}" 7822 7817 msgstr "" 7823 7818 ··· 7952 7947 msgid "Share" 7953 7948 msgstr "" 7954 7949 7955 - #: src/view/com/lightbox/ImageViewing/index.tsx:622 7950 + #: src/view/com/lightbox/ImageViewing/index.tsx:623 7956 7951 msgctxt "action" 7957 7952 msgid "Share" 7958 7953 msgstr "" ··· 8124 8119 msgid "Show warning and filter from feeds" 8125 8120 msgstr "" 8126 8121 8127 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:627 8122 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:629 8128 8123 msgid "Shows information about when this post was created" 8129 8124 msgstr "" 8130 8125 ··· 8338 8333 msgid "Sort replies to the same post by:" 8339 8334 msgstr "" 8340 8335 8341 - #: src/components/moderation/LabelsOnMeDialog.tsx:180 8336 + #: src/components/moderation/LabelsOnMeDialog.tsx:182 8342 8337 #: src/components/moderation/ModerationDetailsDialog.tsx:188 8343 8338 msgid "Source: <0>{sourceName}</0>" 8344 8339 msgstr "" ··· 8361 8356 msgid "Sports" 8362 8357 msgstr "" 8363 8358 8364 - #: src/components/PostControls/ShareMenu/RecentChats.tsx:207 8359 + #: src/components/PostControls/ShareMenu/RecentChats.tsx:206 8365 8360 msgid "Start a conversation, and it will appear here." 8366 8361 msgstr "" 8367 8362 ··· 8435 8430 8436 8431 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:117 8437 8432 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:123 8438 - #: src/components/moderation/LabelsOnMeDialog.tsx:326 8439 - #: src/components/moderation/LabelsOnMeDialog.tsx:327 8433 + #: src/components/moderation/LabelsOnMeDialog.tsx:342 8434 + #: src/components/moderation/LabelsOnMeDialog.tsx:343 8440 8435 #: src/screens/Messages/components/ChatDisabled.tsx:154 8441 8436 #: src/screens/Messages/components/ChatDisabled.tsx:155 8442 8437 msgid "Submit" ··· 8510 8505 msgid "Suggestive" 8511 8506 msgstr "" 8512 8507 8513 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:86 8508 + #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:72 8514 8509 msgctxt "Name of app icon variant" 8515 8510 msgid "Sunrise" 8516 8511 msgstr "" 8517 8512 8518 - #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:100 8513 + #: src/screens/Settings/AppIconSettings/useAppIconSets.ts:86 8519 8514 msgctxt "Name of app icon variant" 8520 8515 msgid "Sunset" 8521 8516 msgstr "" ··· 8655 8650 msgid "Text field" 8656 8651 msgstr "" 8657 8652 8658 - #: src/components/moderation/LabelsOnMeDialog.tsx:290 8653 + #: src/components/moderation/LabelsOnMeDialog.tsx:306 8659 8654 #: src/screens/Messages/components/ChatDisabled.tsx:120 8660 8655 msgid "Text input field" 8661 8656 msgstr "" ··· 8702 8697 msgid "That's everything!" 8703 8698 msgstr "" 8704 8699 8705 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:329 8700 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:332 8706 8701 #: src/view/com/profile/ProfileMenu.tsx:483 8707 8702 msgid "The account will be able to interact with you after unblocking." 8708 8703 msgstr "" ··· 8749 8744 msgid "The feed has been replaced with Discover." 8750 8745 msgstr "" 8751 8746 8752 - #: src/components/moderation/LabelsOnMeDialog.tsx:61 8747 + #: src/components/moderation/LabelsOnMeDialog.tsx:63 8753 8748 msgid "The following labels were applied to your account." 8754 8749 msgstr "" 8755 8750 8756 - #: src/components/moderation/LabelsOnMeDialog.tsx:62 8751 + #: src/components/moderation/LabelsOnMeDialog.tsx:64 8757 8752 msgid "The following labels were applied to your content." 8758 8753 msgstr "" 8759 8754 ··· 8877 8872 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:420 8878 8873 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:90 8879 8874 #: src/screens/PostThread/components/ThreadItemAnchorFollowButton.tsx:101 8880 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:104 8881 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:127 8882 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:141 8875 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:105 8876 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:128 8877 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:142 8883 8878 #: src/view/com/profile/ProfileMenu.tsx:136 8884 8879 #: src/view/com/profile/ProfileMenu.tsx:146 8885 8880 #: src/view/com/profile/ProfileMenu.tsx:160 ··· 8940 8935 msgid "This action can be undone at any time." 8941 8936 msgstr "" 8942 8937 8943 - #: src/components/moderation/LabelsOnMeDialog.tsx:273 8938 + #: src/components/moderation/LabelsOnMeDialog.tsx:284 8944 8939 msgid "This appeal will be sent to <0>{sourceName}</0>." 8945 8940 msgstr "" 8946 8941 ··· 9036 9031 msgid "This label was applied by the author." 9037 9032 msgstr "" 9038 9033 9039 - #: src/components/moderation/LabelsOnMeDialog.tsx:167 9034 + #: src/components/moderation/LabelsOnMeDialog.tsx:169 9040 9035 msgid "This label was applied by you." 9041 9036 msgstr "" 9042 9037 ··· 9064 9059 msgid "This moderation service is unavailable. See below for more details. If this issue persists, contact us." 9065 9060 msgstr "" 9066 9061 9067 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:667 9062 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:669 9068 9063 msgid "This post claims to have been created on <0>{0}</0>, but was first seen by Bluesky on <1>{1}</1>." 9069 9064 msgstr "" 9070 9065 ··· 9234 9229 #: src/components/dms/MessageContextMenu.tsx:139 9235 9230 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:476 9236 9231 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:478 9237 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:589 9238 - #: src/screens/PostThread/components/ThreadItemAnchor.tsx:592 9232 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:591 9233 + #: src/screens/PostThread/components/ThreadItemAnchor.tsx:594 9239 9234 msgid "Translate" 9240 9235 msgstr "" 9241 9236 ··· 9323 9318 #: src/components/dms/MessagesListBlockedFooter.tsx:104 9324 9319 #: src/components/dms/MessagesListBlockedFooter.tsx:112 9325 9320 #: src/components/dms/MessagesListBlockedFooter.tsx:119 9326 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:213 9327 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:333 9321 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:214 9322 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:336 9328 9323 #: src/screens/ProfileList/components/Header.tsx:171 9329 9324 #: src/screens/ProfileList/components/Header.tsx:178 9330 9325 #: src/view/com/profile/ProfileMenu.tsx:495 9331 9326 msgid "Unblock" 9332 9327 msgstr "" 9333 9328 9334 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:218 9329 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:219 9335 9330 msgctxt "action" 9336 9331 msgid "Unblock" 9337 9332 msgstr "" ··· 9343 9338 msgid "Unblock account" 9344 9339 msgstr "" 9345 9340 9346 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:327 9341 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:330 9347 9342 #: src/view/com/profile/ProfileMenu.tsx:477 9348 9343 msgid "Unblock Account?" 9349 9344 msgstr "" ··· 9373 9368 msgid "Unfollow" 9374 9369 msgstr "" 9375 9370 9376 - #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:241 9371 + #: src/screens/Profile/Header/ProfileHeaderStandard.tsx:242 9377 9372 msgid "Unfollow {0}" 9378 9373 msgstr "" 9379 9374 ··· 9418 9413 msgid "Unmute" 9419 9414 msgstr "" 9420 9415 9421 - #: src/components/RichTextTag.tsx:140 9422 - #: src/components/RichTextTag.tsx:153 9416 + #: src/components/RichTextTag.tsx:141 9417 + #: src/components/RichTextTag.tsx:154 9423 9418 msgid "Unmute {tag}" 9424 9419 msgstr "" 9425 9420 ··· 10573 10568 msgid "You joined Bluesky using a starter pack {timeAgoString} ago" 10574 10569 msgstr "" 10575 10570 10576 - #: src/components/moderation/LabelsOnMeDialog.tsx:81 10571 + #: src/components/moderation/LabelsOnMeDialog.tsx:83 10577 10572 msgid "You may appeal non-self labels if you feel they were placed in error." 10578 10573 msgstr "" 10579 10574 10580 - #: src/components/moderation/LabelsOnMeDialog.tsx:86 10575 + #: src/components/moderation/LabelsOnMeDialog.tsx:88 10581 10576 msgid "You may appeal these labels if you feel they were placed in error." 10582 10577 msgstr "" 10583 10578 ··· 10714 10709 #: src/screens/Deactivated.tsx:89 10715 10710 #: src/screens/Settings/components/DeactivateAccountDialog.tsx:54 10716 10711 msgid "You're signed in with an App Password. Please sign in with your main password to continue deactivating your account." 10712 + msgstr "" 10713 + 10714 + #: src/components/moderation/LabelsOnMeDialog.tsx:261 10715 + msgid "You've already appealed this label and it's being reviewed by our moderation team." 10717 10716 msgstr "" 10718 10717 10719 10718 #: src/components/moderation/ModerationDetailsDialog.tsx:110
+4 -18
src/screens/Settings/AppIconSettings/useAppIconSets.ts
··· 14 14 name: _(msg({context: 'Name of app icon variant', message: 'Light'})), 15 15 iosImage: () => { 16 16 return require( 17 - `../../../../assets/app-icons/ios_icon_default_light.png`, 17 + `../../../../assets/app-icons/ios_icon_legacy_light.png`, 18 18 ) 19 19 }, 20 20 androidImage: () => { 21 21 return require( 22 - `../../../../assets/app-icons/android_icon_default_light.png`, 22 + `../../../../assets/app-icons/android_icon_legacy_light.png`, 23 23 ) 24 24 }, 25 25 }, ··· 28 28 name: _(msg({context: 'Name of app icon variant', message: 'Dark'})), 29 29 iosImage: () => { 30 30 return require( 31 - `../../../../assets/app-icons/ios_icon_default_dark.png`, 32 - ) 33 - }, 34 - androidImage: () => { 35 - return require( 36 - `../../../../assets/app-icons/android_icon_default_dark.png`, 37 - ) 38 - }, 39 - }, 40 - { 41 - id: 'next', 42 - name: _(msg({context: 'Name of app icon variant', message: 'Next'})), 43 - iosImage: () => { 44 - return require( 45 - `../../../../assets/app-icons/ios_icon_default_next.png`, 31 + `../../../../assets/app-icons/ios_icon_legacy_dark.png`, 46 32 ) 47 33 }, 48 34 androidImage: () => { 49 35 return require( 50 - `../../../../assets/app-icons/android_icon_default_next.png`, 36 + `../../../../assets/app-icons/android_icon_legacy_dark.png`, 51 37 ) 52 38 }, 53 39 },
+7 -7
src/style.css
··· 14 14 :root { 15 15 --text: black; 16 16 --background: white; 17 - --backgroundLight: hsl(211, 20%, 95%); 17 + --backgroundLight: #f9fafb; 18 18 } 19 19 @media (prefers-color-scheme: dark) { 20 20 :root { 21 21 color-scheme: dark; 22 22 --text: white; 23 23 --background: black; 24 - --backgroundLight: hsl(211, 20%, 20%); 24 + --backgroundLight: #111822; 25 25 } 26 26 } 27 27 28 28 html.theme--light { 29 29 --text: black; 30 30 --background: white; 31 - --backgroundLight: hsl(211, 20%, 95%); 31 + --backgroundLight: #f9fafb; 32 32 background-color: white; 33 33 } 34 34 html.theme--dark { ··· 36 36 background-color: black; 37 37 --text: white; 38 38 --background: black; 39 - --backgroundLight: hsl(211, 20%, 20%); 39 + --backgroundLight: #111822; 40 40 } 41 41 html.theme--dim { 42 42 color-scheme: dark; 43 - background-color: hsl(211, 28%, 12%); 43 + background-color: #151d28; 44 44 --text: white; 45 - --background: hsl(211, 20%, 4%); 46 - --backgroundLight: hsl(211, 20%, 10%); 45 + --background: #151d28; 46 + --backgroundLight: #1c2736; 47 47 } 48 48 49 49 /* Buttons and inputs have a font set by UA, so we'll have to reset that */