mirror of https://git.lenooby09.tech/LeNooby09/social-app.git

Compare changes

Choose any two refs to compare.

+1 -2
.eslintrc.js
··· 37 37 'Toast.Action', 38 38 'AgeAssuranceAdmonition', 39 39 'Span', 40 - 'StackedButton', 41 40 ], 42 41 impliedTextProps: [], 43 42 suggestedTextWrappers: { ··· 89 88 'no-unused-vars': 'off', 90 89 '@typescript-eslint/no-unused-vars': [ 91 90 'error', 92 - {argsIgnorePattern: '^_', varsIgnorePattern: '^_.+'}, 91 + {argsIgnorePattern: '^_', varsIgnorePattern: '^_'}, 93 92 ], 94 93 '@typescript-eslint/consistent-type-imports': [ 95 94 'warn',
-2
README.md
··· 70 70 71 71 See [./LICENSE](./LICENSE) for the full license. 72 72 73 - Bluesky Social PBC has committed to a software patent non-aggression pledge. For details see [the original announcement](https://bsky.social/about/blog/10-01-2025-patent-pledge). 74 - 75 73 ## P.S. 76 74 77 75 We โค๏ธ you and all of the ways you support us. Thank you for making Bluesky a great place!
+26
bskyembed/README.md
··· 1 + ## Run / Test 2 + 3 + Install dependencies: 4 + 5 + ```bash 6 + cd bskyembed 7 + yarn 8 + ``` 9 + 10 + Run the dev server: 11 + 12 + ```bash 13 + yarn dev 14 + ``` 15 + 16 + You can see the embed homepage at http://localhost:5173 17 + 18 + ### Testbed 19 + 20 + In another terminal window, run the snippet dev script: 21 + 22 + ```bash 23 + yarn dev-snippet 24 + ``` 25 + 26 + You can then see the testbed page at http://localhost:5173/test
+2
bskyembed/package.json
··· 4 4 "type": "module", 5 5 "scripts": { 6 6 "dev": "vite", 7 + "dev-snippet": "tsc --project tsconfig.snippet.json && serve -s dist -p 3000 -n", 7 8 "build": "tsc && vite build", 8 9 "build-snippet": "tsc --project tsconfig.snippet.json", 9 10 "lint": "eslint --cache --ext .js,.jsx,.ts,.tsx src", ··· 21 22 "eslint-config-preact": "^1.3.0", 22 23 "eslint-plugin-simple-import-sort": "^12.0.0", 23 24 "postcss": "^8.4.38", 25 + "serve": "^14.2.5", 24 26 "tailwindcss": "^3.4.3", 25 27 "terser": "^5.43.1", 26 28 "typescript": "^5.8.3",
+11 -1
bskyembed/snippet/embed.ts
··· 3 3 bluesky: { 4 4 scan: (element?: Pick<Element, 'querySelectorAll'>) => void 5 5 } 6 + BSKY_DEV_EMBED_URL?: string 6 7 } 7 8 8 - const EMBED_URL = 'https://embed.bsky.app' 9 + /** 10 + * Allow url to be overwritten during development 11 + */ 12 + const IS_DEV = 13 + window.location.protocol === 'file:' || 14 + window.location.hostname === 'localhost' 15 + const EMBED_URL = 16 + IS_DEV && window.BSKY_DEV_EMBED_URL 17 + ? window.BSKY_DEV_EMBED_URL 18 + : 'https://embed.bsky.app' 9 19 10 20 window.bluesky = window.bluesky || { 11 21 scan,
+1054
bskyembed/test.html
··· 1 + <!doctype html> 2 + <html> 3 + <head> 4 + <link 5 + rel="stylesheet" 6 + href="https://unpkg.com/svbstrate@5.1.0/svbstrate.css" /> 7 + <style> 8 + body { 9 + padding: 2rem; 10 + } 11 + section { 12 + margin-bottom: 4rem; 13 + } 14 + h1 { 15 + margin-bottom: 1rem; 16 + } 17 + .grid { 18 + display: grid; 19 + grid-template-columns: repeat(auto-fill, minmax(400px, 1fr)); 20 + gap: 2rem; 21 + } 22 + .item { 23 + text-align: center; 24 + } 25 + .item img { 26 + width: 100%; 27 + max-width: 400px; 28 + display: block; 29 + margin: 0 auto 0.5rem; 30 + transition: opacity 0.2s ease-in-out; 31 + } 32 + </style> 33 + <script> 34 + // This overrides the default embed URL that the script uses 35 + // (https://embed.bsky.app) 36 + window.BSKY_DEV_EMBED_URL = 'http://localhost:5173' 37 + </script> 38 + <script 39 + async 40 + src="http://localhost:3000/embed.js" 41 + charset="utf-8"></script> 42 + </head> 43 + <body class="p12"> 44 + <!-- Base embeds --> 45 + <section> 46 + <h1>Base embeds test</h1> 47 + <div class="grid"> 48 + <div class="item"> 49 + <blockquote 50 + class="bluesky-embed" 51 + data-bluesky-uri="at://did:plc:yaqf6zpqlko6hkm5zukoilix/app.bsky.feed.post/3lkcj4xgmdc2l" 52 + data-bluesky-cid="bafyreicsat53vek22bcwiciquqdffd7dyrpnink6dhf2nfdlvt5olvb5hm" 53 + data-bluesky-embed-color-mode="system"> 54 + <p lang="en"> 55 + <br /><br /><a 56 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcj4xgmdc2l?ref_src=embed" 57 + >[image or embed]</a 58 + > 59 + </p> 60 + &mdash; test-all-embeds-b.bsky.social (<a 61 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix?ref_src=embed" 62 + >@test-all-embeds-b.bsky.social</a 63 + >) 64 + <a 65 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcj4xgmdc2l?ref_src=embed" 66 + >Mar 13, 2025 at 6:58 PM</a 67 + > 68 + </blockquote> 69 + <div>Image</div> 70 + </div> 71 + 72 + <div class="item"> 73 + <blockquote 74 + class="bluesky-embed" 75 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchac5lbs23" 76 + data-bluesky-cid="bafyreihcgknwgp7kgph3w3mmqqa7mrw4f2rw2e7chrjsuy6viruajiw7di" 77 + data-bluesky-embed-color-mode="system"> 78 + <p lang="en"> 79 + Test with self-label<br /><br /><a 80 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchac5lbs23?ref_src=embed" 81 + >[image or embed]</a 82 + > 83 + </p> 84 + &mdash; Embed Tester (<a 85 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 86 + >@test-all-embeds-a.bsky.social</a 87 + >) 88 + <a 89 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchac5lbs23?ref_src=embed" 90 + >Mar 13, 2025 at 6:24 PM</a 91 + > 92 + </blockquote> 93 + <div>Image w/ label</div> 94 + </div> 95 + 96 + <div class="item"> 97 + <blockquote 98 + class="bluesky-embed" 99 + data-bluesky-uri="at://did:plc:yaqf6zpqlko6hkm5zukoilix/app.bsky.feed.post/3lkcj64e3x22l" 100 + data-bluesky-cid="bafyreidafwmfabuo2fkz445of7pwetbud7vc4u4mcdjrflv46iivx4dmni" 101 + data-bluesky-embed-color-mode="system"> 102 + <p lang="en"> 103 + <br /><br /><a 104 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcj64e3x22l?ref_src=embed" 105 + >[image or embed]</a 106 + > 107 + </p> 108 + &mdash; test-all-embeds-b.bsky.social (<a 109 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix?ref_src=embed" 110 + >@test-all-embeds-b.bsky.social</a 111 + >) 112 + <a 113 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcj64e3x22l?ref_src=embed" 114 + >Mar 13, 2025 at 6:59 PM</a 115 + > 116 + </blockquote> 117 + <div>Image</div> 118 + </div> 119 + 120 + <div class="item"> 121 + <blockquote 122 + class="bluesky-embed" 123 + data-bluesky-uri="at://did:plc:5veiziiwyjpv5qmrlovrq2go/app.bsky.feed.post/3lwrv45dgzc2p" 124 + data-bluesky-cid="bafyreiaik27g4gu5egf7k3gd3ut6lfbvjeggwavsvw6g3e2rtrsmhqwikq" 125 + data-bluesky-embed-color-mode="system"> 126 + <p lang="en"> 127 + De Reclame, 11e Jaargang, No 8, 1932 128 + designreviewed.com/artefacts/de...<br /><br /><a 129 + href="https://bsky.app/profile/did:plc:5veiziiwyjpv5qmrlovrq2go/post/3lwrv45dgzc2p?ref_src=embed" 130 + >[image or embed]</a 131 + > 132 + </p> 133 + &mdash; Design Reviewed (<a 134 + href="https://bsky.app/profile/did:plc:5veiziiwyjpv5qmrlovrq2go?ref_src=embed" 135 + >@designreviewed.com</a 136 + >) 137 + <a 138 + href="https://bsky.app/profile/did:plc:5veiziiwyjpv5qmrlovrq2go/post/3lwrv45dgzc2p?ref_src=embed" 139 + >Aug 19, 2025 at 2:45 PM</a 140 + > 141 + </blockquote> 142 + <div>Image x2</div> 143 + </div> 144 + 145 + <div class="item"> 146 + <blockquote 147 + class="bluesky-embed" 148 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkjhqtunc22v" 149 + data-bluesky-cid="bafyreiflpcym2ggfoyaj7rppnx3sds3vxw6oz3735a3tpmqmm7oupeatra" 150 + data-bluesky-embed-color-mode="system"> 151 + <p lang="en"> 152 + Test with 3 images<br /><br /><a 153 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjhqtunc22v?ref_src=embed" 154 + >[image or embed]</a 155 + > 156 + </p> 157 + &mdash; Embed Tester (<a 158 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 159 + >@test-all-embeds-a.bsky.social</a 160 + >) 161 + <a 162 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjhqtunc22v?ref_src=embed" 163 + >Mar 16, 2025 at 1:22 PM</a 164 + > 165 + </blockquote> 166 + <div>Image x3</div> 167 + </div> 168 + 169 + <div class="item"> 170 + <blockquote 171 + class="bluesky-embed" 172 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkjhsgb4vk2z" 173 + data-bluesky-cid="bafyreiafnxubhqmidi7tppgqepddcwcdarbpsobrccoihwdqkrcat4dpxy" 174 + data-bluesky-embed-color-mode="system"> 175 + <p lang="en"> 176 + Test with 4 images<br /><br /><a 177 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjhsgb4vk2z?ref_src=embed" 178 + >[image or embed]</a 179 + > 180 + </p> 181 + &mdash; Embed Tester (<a 182 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 183 + >@test-all-embeds-a.bsky.social</a 184 + >) 185 + <a 186 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjhsgb4vk2z?ref_src=embed" 187 + >Mar 16, 2025 at 1:23 PM</a 188 + > 189 + </blockquote> 190 + <div>Image x4</div> 191 + </div> 192 + 193 + <div class="item"> 194 + <blockquote 195 + class="bluesky-embed" 196 + data-bluesky-uri="at://did:plc:yaqf6zpqlko6hkm5zukoilix/app.bsky.feed.post/3lkcj5shusk2l" 197 + data-bluesky-cid="bafyreif74k7knls6upxuxwl2e6jn7m2us7tn6t5rcx63zipujwqyioibi4" 198 + data-bluesky-embed-color-mode="system"> 199 + <p lang="en"> 200 + <br /><br /><a 201 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcj5shusk2l?ref_src=embed" 202 + >[image or embed]</a 203 + > 204 + </p> 205 + &mdash; test-all-embeds-b.bsky.social (<a 206 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix?ref_src=embed" 207 + >@test-all-embeds-b.bsky.social</a 208 + >) 209 + <a 210 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcj5shusk2l?ref_src=embed" 211 + >Mar 13, 2025 at 6:58 PM</a 212 + > 213 + </blockquote> 214 + <div>Video</div> 215 + </div> 216 + 217 + <div class="item"> 218 + <blockquote 219 + class="bluesky-embed" 220 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchdnqmzc23" 221 + data-bluesky-cid="bafyreiaegqfmhl63vxm3uuipkdn2dqivyrqy65gyygqib4upse7djnauqy" 222 + data-bluesky-embed-color-mode="system"> 223 + <p lang="en"> 224 + Test video with self-label<br /><br /><a 225 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchdnqmzc23?ref_src=embed" 226 + >[image or embed]</a 227 + > 228 + </p> 229 + &mdash; Embed Tester (<a 230 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 231 + >@test-all-embeds-a.bsky.social</a 232 + >) 233 + <a 234 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchdnqmzc23?ref_src=embed" 235 + >Mar 13, 2025 at 6:26 PM</a 236 + > 237 + </blockquote> 238 + <div>Video w/ label</div> 239 + </div> 240 + 241 + <div class="item"> 242 + <blockquote 243 + class="bluesky-embed" 244 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchef5c2c23" 245 + data-bluesky-cid="bafyreigua3qzj7qjgygwsyl325l6za3rrmkohc467ozaf7pdpd33trn3pu" 246 + data-bluesky-embed-color-mode="system"> 247 + <p lang="en"> 248 + Test gif<br /><br /><a 249 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchef5c2c23?ref_src=embed" 250 + >[image or embed]</a 251 + > 252 + </p> 253 + &mdash; Embed Tester (<a 254 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 255 + >@test-all-embeds-a.bsky.social</a 256 + >) 257 + <a 258 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchef5c2c23?ref_src=embed" 259 + >Mar 13, 2025 at 6:26 PM</a 260 + > 261 + </blockquote> 262 + <div>GIF</div> 263 + </div> 264 + 265 + <div class="item"> 266 + <blockquote 267 + class="bluesky-embed" 268 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchgiinq22h" 269 + data-bluesky-cid="bafyreiau42wvwdzikxev26hpogwmzaox7lxqygfkisoxfjlsl7epcldxa4" 270 + data-bluesky-embed-color-mode="system"> 271 + <p lang="en"> 272 + Test with list<br /><br /><a 273 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchgiinq22h?ref_src=embed" 274 + >[image or embed]</a 275 + > 276 + </p> 277 + &mdash; Embed Tester (<a 278 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 279 + >@test-all-embeds-a.bsky.social</a 280 + >) 281 + <a 282 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchgiinq22h?ref_src=embed" 283 + >Mar 13, 2025 at 6:27 PM</a 284 + > 285 + </blockquote> 286 + <div>List</div> 287 + </div> 288 + 289 + <div class="item"> 290 + <blockquote 291 + class="bluesky-embed" 292 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchgwpy222h" 293 + data-bluesky-cid="bafyreibnfmqwydsi7bfrcxjcafhvajo53n52uiwdpb4kvyksz2ffsa53ua" 294 + data-bluesky-embed-color-mode="system"> 295 + <p lang="en"> 296 + Test list with self-label<br /><br /><a 297 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchgwpy222h?ref_src=embed" 298 + >[image or embed]</a 299 + > 300 + </p> 301 + &mdash; Embed Tester (<a 302 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 303 + >@test-all-embeds-a.bsky.social</a 304 + >) 305 + <a 306 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchgwpy222h?ref_src=embed" 307 + >Mar 13, 2025 at 6:28 PM</a 308 + > 309 + </blockquote> 310 + <div>List w/ label</div> 311 + </div> 312 + 313 + <div class="item"> 314 + <blockquote 315 + class="bluesky-embed" 316 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchhfft722h" 317 + data-bluesky-cid="bafyreiangyijdechqaapd2obxxvyby6c6dwhrlva4qiwhdxji3yjdlrcby" 318 + data-bluesky-embed-color-mode="system"> 319 + <p lang="en"> 320 + Test with moderated list<br /><br /><a 321 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchhfft722h?ref_src=embed" 322 + >[image or embed]</a 323 + > 324 + </p> 325 + &mdash; Embed Tester (<a 326 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 327 + >@test-all-embeds-a.bsky.social</a 328 + >) 329 + <a 330 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchhfft722h?ref_src=embed" 331 + >Mar 13, 2025 at 6:28 PM</a 332 + > 333 + </blockquote> 334 + <div>List (takendown)</div> 335 + </div> 336 + 337 + <div class="item"> 338 + <blockquote 339 + class="bluesky-embed" 340 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchj6t27k2h" 341 + data-bluesky-cid="bafyreidzyg3tpx5widxfhjvz3hcyrqozxj2nsnep3u652a3qzlljsc5if4" 342 + data-bluesky-embed-color-mode="system"> 343 + <p lang="en"> 344 + Test feed<br /><br /><a 345 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchj6t27k2h?ref_src=embed" 346 + >[image or embed]</a 347 + > 348 + </p> 349 + &mdash; Embed Tester (<a 350 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 351 + >@test-all-embeds-a.bsky.social</a 352 + >) 353 + <a 354 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchj6t27k2h?ref_src=embed" 355 + >Mar 13, 2025 at 6:29 PM</a 356 + > 357 + </blockquote> 358 + <div>Feed</div> 359 + </div> 360 + 361 + <div class="item"> 362 + <blockquote 363 + class="bluesky-embed" 364 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkjid3khps2r" 365 + data-bluesky-cid="bafyreiadznx3fxyzc5dw76uydxvrz6vn2ccfh7i5nzaa5o6fmiwrcyie5m" 366 + data-bluesky-embed-color-mode="system"> 367 + <p lang="en"> 368 + Test adult content feed<br /><br /><a 369 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjid3khps2r?ref_src=embed" 370 + >[image or embed]</a 371 + > 372 + </p> 373 + &mdash; Embed Tester (<a 374 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 375 + >@test-all-embeds-a.bsky.social</a 376 + >) 377 + <a 378 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjid3khps2r?ref_src=embed" 379 + >Mar 16, 2025 at 1:32 PM</a 380 + > 381 + </blockquote> 382 + <div>Feed w/ label</div> 383 + </div> 384 + 385 + <div class="item"> 386 + <blockquote 387 + class="bluesky-embed" 388 + data-bluesky-uri="at://did:plc:yaqf6zpqlko6hkm5zukoilix/app.bsky.feed.post/3lkcja4gxus2i" 389 + data-bluesky-cid="bafyreicf6jrpv2it74re5ce7o6nvxcs24qg3s7blb2vy4vdoaaaunbuhru" 390 + data-bluesky-embed-color-mode="system"> 391 + <p lang="en"> 392 + <br /><br /><a 393 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcja4gxus2i?ref_src=embed" 394 + >[image or embed]</a 395 + > 396 + </p> 397 + &mdash; test-all-embeds-b.bsky.social (<a 398 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix?ref_src=embed" 399 + >@test-all-embeds-b.bsky.social</a 400 + >) 401 + <a 402 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcja4gxus2i?ref_src=embed" 403 + >Mar 13, 2025 at 7:00 PM</a 404 + > 405 + </blockquote> 406 + <div>Link</div> 407 + </div> 408 + 409 + <div class="item"> 410 + <blockquote 411 + class="bluesky-embed" 412 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkcinqa4t22o" 413 + data-bluesky-cid="bafyreicinqmddgw6ccmmbo3q4exz6phmekbwwyxn5jklycvfsq3aknw7gy" 414 + data-bluesky-embed-color-mode="system"> 415 + <p lang="en"> 416 + Quote post of self-labeled moderated image<br /><br /><a 417 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkcinqa4t22o?ref_src=embed" 418 + >[image or embed]</a 419 + > 420 + </p> 421 + &mdash; Embed Tester (<a 422 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 423 + >@test-all-embeds-a.bsky.social</a 424 + >) 425 + <a 426 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkcinqa4t22o?ref_src=embed" 427 + >Mar 13, 2025 at 6:49 PM</a 428 + > 429 + </blockquote> 430 + <div>Link w/ label</div> 431 + </div> 432 + 433 + <div class="item"> 434 + <blockquote 435 + class="bluesky-embed" 436 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchnlwlbs2h" 437 + data-bluesky-cid="bafyreigyilbttv6kasvf2gdciju56xofmwvnls2angvur4y3c5m2lc4byi" 438 + data-bluesky-embed-color-mode="system"> 439 + <p lang="en"> 440 + Test starter pack<br /><br /><a 441 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchnlwlbs2h?ref_src=embed" 442 + >[image or embed]</a 443 + > 444 + </p> 445 + &mdash; Embed Tester (<a 446 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 447 + >@test-all-embeds-a.bsky.social</a 448 + >) 449 + <a 450 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchnlwlbs2h?ref_src=embed" 451 + >Mar 13, 2025 at 6:31 PM</a 452 + > 453 + </blockquote> 454 + <div>Starter pack</div> 455 + </div> 456 + 457 + <div class="item"> 458 + <blockquote 459 + class="bluesky-embed" 460 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchnwmycs2h" 461 + data-bluesky-cid="bafyreibdxzxyldghjvzahpceasx7wkzwmycx2zdyak2c3cx2ouaivls2da" 462 + data-bluesky-embed-color-mode="system"> 463 + <p lang="en"> 464 + Test starter pack with self-label<br /><br /><a 465 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchnwmycs2h?ref_src=embed" 466 + >[image or embed]</a 467 + > 468 + </p> 469 + &mdash; Embed Tester (<a 470 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 471 + >@test-all-embeds-a.bsky.social</a 472 + >) 473 + <a 474 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchnwmycs2h?ref_src=embed" 475 + >Mar 13, 2025 at 6:32 PM</a 476 + > 477 + </blockquote> 478 + <div>Starter pack w/ self label</div> 479 + </div> 480 + 481 + <div class="item"> 482 + <blockquote 483 + class="bluesky-embed" 484 + data-bluesky-uri="at://did:plc:ykoz7xgzdig674y6k4723vzf/app.bsky.feed.post/3lxdwwigues2y" 485 + data-bluesky-cid="bafyreibpgpvyx6vozaxn557ngffzbvvucdrpflfnjw73tr3qi5e7tfitpy" 486 + data-bluesky-embed-color-mode="system"> 487 + <p lang="en"> 488 + go.bsky.app/FVMZBTc test<br /><br /><a 489 + href="https://bsky.app/profile/did:plc:ykoz7xgzdig674y6k4723vzf/post/3lxdwwigues2y?ref_src=embed" 490 + >[image or embed]</a 491 + > 492 + </p> 493 + &mdash; h ๐Ÿชฝ partner @ INTDEV (<a 494 + href="https://bsky.app/profile/did:plc:ykoz7xgzdig674y6k4723vzf?ref_src=embed" 495 + >@hannah-final.bsky.social</a 496 + >) 497 + <a 498 + href="https://bsky.app/profile/did:plc:ykoz7xgzdig674y6k4723vzf/post/3lxdwwigues2y?ref_src=embed" 499 + >Aug 26, 2025 at 7:05 PM</a 500 + > 501 + </blockquote> 502 + <div>Starter pack w/ signups</div> 503 + </div> 504 + </div> 505 + </section> 506 + 507 + <!-- Quote posts --> 508 + <section> 509 + <h1>Quote posts</h1> 510 + <div class="grid"> 511 + <div class="item"> 512 + <blockquote 513 + class="bluesky-embed" 514 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchp7oaq22h" 515 + data-bluesky-cid="bafyreidq6y2zee36am3xdt3lfb4yhgn3u5pil7ljgkdx74biluw424ck3m" 516 + data-bluesky-embed-color-mode="system"> 517 + <p lang="en"> 518 + Quote post<br /><br /><a 519 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchp7oaq22h?ref_src=embed" 520 + >[image or embed]</a 521 + > 522 + </p> 523 + &mdash; Embed Tester (<a 524 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 525 + >@test-all-embeds-a.bsky.social</a 526 + >) 527 + <a 528 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchp7oaq22h?ref_src=embed" 529 + >Mar 13, 2025 at 6:32 PM</a 530 + > 531 + </blockquote> 532 + <div>Image</div> 533 + </div> 534 + 535 + <div class="item"> 536 + <blockquote 537 + class="bluesky-embed" 538 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchpijwu22h" 539 + data-bluesky-cid="bafyreifblfh6mhb4zrhjzkfwa2ytgzrr7jueukhzwj2nfifmy77h7v74ji" 540 + data-bluesky-embed-color-mode="system"> 541 + <p lang="en"> 542 + Quote post with moderated embed<br /><br /><a 543 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchpijwu22h?ref_src=embed" 544 + >[image or embed]</a 545 + > 546 + </p> 547 + &mdash; Embed Tester (<a 548 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 549 + >@test-all-embeds-a.bsky.social</a 550 + >) 551 + <a 552 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchpijwu22h?ref_src=embed" 553 + >Mar 13, 2025 at 6:32 PM</a 554 + > 555 + </blockquote> 556 + <div>Image w/ label</div> 557 + </div> 558 + 559 + <div class="item"> 560 + <blockquote 561 + class="bluesky-embed" 562 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchpvu6is2h" 563 + data-bluesky-cid="bafyreidm573hmhxt65d6xvoxki4omvoaltkta7s3efoydrxxod37bdhree" 564 + data-bluesky-embed-color-mode="system"> 565 + <p lang="en"> 566 + Quote post of video<br /><br /><a 567 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchpvu6is2h?ref_src=embed" 568 + >[image or embed]</a 569 + > 570 + </p> 571 + &mdash; Embed Tester (<a 572 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 573 + >@test-all-embeds-a.bsky.social</a 574 + >) 575 + <a 576 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchpvu6is2h?ref_src=embed" 577 + >Mar 13, 2025 at 6:33 PM</a 578 + > 579 + </blockquote> 580 + <div>Video</div> 581 + </div> 582 + 583 + <div class="item"> 584 + <blockquote 585 + class="bluesky-embed" 586 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchq5dfrk2h" 587 + data-bluesky-cid="bafyreiba4sabzwtomrhede6tnhmgddj2q4m4ksxhud3g7flldrbwritlzq" 588 + data-bluesky-embed-color-mode="system"> 589 + <p lang="en"> 590 + Quote post of moderated video<br /><br /><a 591 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchq5dfrk2h?ref_src=embed" 592 + >[image or embed]</a 593 + > 594 + </p> 595 + &mdash; Embed Tester (<a 596 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 597 + >@test-all-embeds-a.bsky.social</a 598 + >) 599 + <a 600 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchq5dfrk2h?ref_src=embed" 601 + >Mar 13, 2025 at 6:33 PM</a 602 + > 603 + </blockquote> 604 + <div>Moderated Video</div> 605 + </div> 606 + 607 + <div class="item"> 608 + <blockquote 609 + class="bluesky-embed" 610 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkjip5qduk2l" 611 + data-bluesky-cid="bafyreib4ddu6imsar7hjm6bsunrrumts4b3pftmr23qlrnytcthkingilu" 612 + data-bluesky-embed-color-mode="system"> 613 + <p lang="en"> 614 + Quote post of gif<br /><br /><a 615 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjip5qduk2l?ref_src=embed" 616 + >[image or embed]</a 617 + > 618 + </p> 619 + &mdash; Embed Tester (<a 620 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 621 + >@test-all-embeds-a.bsky.social</a 622 + >) 623 + <a 624 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjip5qduk2l?ref_src=embed" 625 + >Mar 16, 2025 at 1:39 PM</a 626 + > 627 + </blockquote> 628 + <div>GIF</div> 629 + </div> 630 + 631 + <div class="item"> 632 + <blockquote 633 + class="bluesky-embed" 634 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkjip5qduk2l" 635 + data-bluesky-cid="bafyreib4ddu6imsar7hjm6bsunrrumts4b3pftmr23qlrnytcthkingilu" 636 + data-bluesky-embed-color-mode="system"> 637 + <p lang="en"> 638 + Quote post of gif<br /><br /><a 639 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjip5qduk2l?ref_src=embed" 640 + >[image or embed]</a 641 + > 642 + </p> 643 + &mdash; Embed Tester (<a 644 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 645 + >@test-all-embeds-a.bsky.social</a 646 + >) 647 + <a 648 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkjip5qduk2l?ref_src=embed" 649 + >Mar 16, 2025 at 1:39 PM</a 650 + > 651 + </blockquote> 652 + <div>List</div> 653 + </div> 654 + 655 + <div class="item"> 656 + <blockquote 657 + class="bluesky-embed" 658 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchqmp2722h" 659 + data-bluesky-cid="bafyreicwzdm3qlx567fznroqija6rryl4ghjwn7hz2o47ygy2kd6bsmsou" 660 + data-bluesky-embed-color-mode="system"> 661 + <p lang="en"> 662 + Quote post of moderated list<br /><br /><a 663 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchqmp2722h?ref_src=embed" 664 + >[image or embed]</a 665 + > 666 + </p> 667 + &mdash; Embed Tester (<a 668 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 669 + >@test-all-embeds-a.bsky.social</a 670 + >) 671 + <a 672 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchqmp2722h?ref_src=embed" 673 + >Mar 13, 2025 at 6:33 PM</a 674 + > 675 + </blockquote> 676 + <div>List (takedown)</div> 677 + </div> 678 + 679 + <div class="item"> 680 + <blockquote 681 + class="bluesky-embed" 682 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchqrrigs2h" 683 + data-bluesky-cid="bafyreiakfe2qer733rl5ncq2auwoay3zc5qeiepiwzz3yuvds6acbdnjti" 684 + data-bluesky-embed-color-mode="system"> 685 + <p lang="en"> 686 + Quote post of feed<br /><br /><a 687 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchqrrigs2h?ref_src=embed" 688 + >[image or embed]</a 689 + > 690 + </p> 691 + &mdash; Embed Tester (<a 692 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 693 + >@test-all-embeds-a.bsky.social</a 694 + >) 695 + <a 696 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchqrrigs2h?ref_src=embed" 697 + >Mar 13, 2025 at 6:33 PM</a 698 + > 699 + </blockquote> 700 + <div>Feed</div> 701 + </div> 702 + 703 + <div class="item"> 704 + <blockquote 705 + class="bluesky-embed" 706 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchqyf6u22h" 707 + data-bluesky-cid="bafyreicbaf4h437o656jsuygqsyv2z4ff5wu46gjiw7z7rwnhaiwjpa2ia" 708 + data-bluesky-embed-color-mode="system"> 709 + <p lang="en"> 710 + Quote post of link<br /><br /><a 711 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchqyf6u22h?ref_src=embed" 712 + >[image or embed]</a 713 + > 714 + </p> 715 + &mdash; Embed Tester (<a 716 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 717 + >@test-all-embeds-a.bsky.social</a 718 + >) 719 + <a 720 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchqyf6u22h?ref_src=embed" 721 + >Mar 13, 2025 at 6:33 PM</a 722 + > 723 + </blockquote> 724 + <div>Link</div> 725 + </div> 726 + 727 + <div class="item"> 728 + <blockquote 729 + class="bluesky-embed" 730 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchremdhc2h" 731 + data-bluesky-cid="bafyreifexo35hh6x7cfmxzyewfqoufyidaz6ko5dtycwrezspidph3ydnu" 732 + data-bluesky-embed-color-mode="system"> 733 + <p lang="en"> 734 + Quote post of moderated link<br /><br /><a 735 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchremdhc2h?ref_src=embed" 736 + >[image or embed]</a 737 + > 738 + </p> 739 + &mdash; Embed Tester (<a 740 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 741 + >@test-all-embeds-a.bsky.social</a 742 + >) 743 + <a 744 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchremdhc2h?ref_src=embed" 745 + >Mar 13, 2025 at 6:33 PM</a 746 + > 747 + </blockquote> 748 + <div>Link w/label</div> 749 + </div> 750 + 751 + <div class="item"> 752 + <blockquote 753 + class="bluesky-embed" 754 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkchrlw4vk2h" 755 + data-bluesky-cid="bafyreihcwafgvujqkzts3spunit6ku6mpix76m2s2iz3gbxhyw33b4k3uq" 756 + data-bluesky-embed-color-mode="system"> 757 + <p lang="en"> 758 + Quote post of starter pack<br /><br /><a 759 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchrlw4vk2h?ref_src=embed" 760 + >[image or embed]</a 761 + > 762 + </p> 763 + &mdash; Embed Tester (<a 764 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 765 + >@test-all-embeds-a.bsky.social</a 766 + >) 767 + <a 768 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkchrlw4vk2h?ref_src=embed" 769 + >Mar 13, 2025 at 6:34 PM</a 770 + > 771 + </blockquote> 772 + <div>Starter pack</div> 773 + </div> 774 + </div> 775 + </section> 776 + 777 + <!-- Quote post states --> 778 + <section> 779 + <h1>Quote post states</h1> 780 + <div class="grid"> 781 + <div class="item"> 782 + <blockquote 783 + class="bluesky-embed" 784 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkcieaeil22a" 785 + data-bluesky-cid="bafyreihsujirmypaycahu2dqc7oxcrhohgtqclljudc2s2drqqxmvpgrem" 786 + data-bluesky-embed-color-mode="system"> 787 + <p lang="en"> 788 + Quoted post of deleted post<br /><br /><a 789 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkcieaeil22a?ref_src=embed" 790 + >[image or embed]</a 791 + > 792 + </p> 793 + &mdash; Embed Tester (<a 794 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 795 + >@test-all-embeds-a.bsky.social</a 796 + >) 797 + <a 798 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkcieaeil22a?ref_src=embed" 799 + >Mar 13, 2025 at 6:44 PM</a 800 + > 801 + </blockquote> 802 + <div>Deleted</div> 803 + </div> 804 + 805 + <div class="item"> 806 + <blockquote 807 + class="bluesky-embed" 808 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkciefiepk2a" 809 + data-bluesky-cid="bafyreihvgdhd65s3e2e2uhkcyet2apdfo6zfmbbkf6jvn5v6holejae2ya" 810 + data-bluesky-embed-color-mode="system"> 811 + <p lang="en"> 812 + Quoted post of detached post<br /><br /><a 813 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkciefiepk2a?ref_src=embed" 814 + >[image or embed]</a 815 + > 816 + </p> 817 + &mdash; Embed Tester (<a 818 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 819 + >@test-all-embeds-a.bsky.social</a 820 + >) 821 + <a 822 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkciefiepk2a?ref_src=embed" 823 + >Mar 13, 2025 at 6:44 PM</a 824 + > 825 + </blockquote> 826 + <div>Detached quoted post</div> 827 + </div> 828 + 829 + <div class="item"> 830 + <blockquote 831 + class="bluesky-embed" 832 + data-bluesky-uri="at://did:plc:2b5zvgrtdw5mlariyuvgd7tv/app.bsky.feed.post/3lkcikkheys2c" 833 + data-bluesky-cid="bafyreibez43l4k4yxm6472igwosrzeefyn2xmjgxtpezj2ktzx66zi6gyy" 834 + data-bluesky-embed-color-mode="system"> 835 + <p lang="en"> 836 + Quoted post of user who blocks me<br /><br /><a 837 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkcikkheys2c?ref_src=embed" 838 + >[image or embed]</a 839 + > 840 + </p> 841 + &mdash; Embed Tester (<a 842 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv?ref_src=embed" 843 + >@test-all-embeds-a.bsky.social</a 844 + >) 845 + <a 846 + href="https://bsky.app/profile/did:plc:2b5zvgrtdw5mlariyuvgd7tv/post/3lkcikkheys2c?ref_src=embed" 847 + >Mar 13, 2025 at 6:48 PM</a 848 + > 849 + </blockquote> 850 + <div>Blocked</div> 851 + </div> 852 + </div> 853 + </section> 854 + 855 + <!-- Default avatars --> 856 + <section> 857 + <h1>Default avatars</h1> 858 + <div class="grid"> 859 + <div class="item"> 860 + <blockquote 861 + class="bluesky-embed" 862 + data-bluesky-uri="at://did:plc:yaqf6zpqlko6hkm5zukoilix/app.bsky.feed.post/3lkcivbqv522o" 863 + data-bluesky-cid="bafyreicekaiu4nqpdlltvbohbuslw4g4xs5sqk4d6bngfrn3y3e5web63i" 864 + data-bluesky-embed-color-mode="system"> 865 + <p lang="en">test</p> 866 + &mdash; test-all-embeds-b.bsky.social (<a 867 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix?ref_src=embed" 868 + >@test-all-embeds-b.bsky.social</a 869 + >) 870 + <a 871 + href="https://bsky.app/profile/did:plc:yaqf6zpqlko6hkm5zukoilix/post/3lkcivbqv522o?ref_src=embed" 872 + >Mar 13, 2025 at 6:54 PM</a 873 + > 874 + </blockquote> 875 + <div>Default avatar</div> 876 + </div> 877 + 878 + <div class="item"> 879 + <blockquote 880 + class="bluesky-embed" 881 + data-bluesky-uri="at://did:plc:464y3vjt35kayax3f3fhk2to/app.bsky.feed.post/3lr6qrk74rc2o" 882 + data-bluesky-cid="bafyreihtxhy56u2im7hki3bgiesll7ofv63glev3xtf677bdnygzaooaq4" 883 + data-bluesky-embed-color-mode="system"> 884 + <p lang="en"> 885 + quote<br /><br /><a 886 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to/post/3lr6qrk74rc2o?ref_src=embed" 887 + >[image or embed]</a 888 + > 889 + </p> 890 + &mdash; beep boop 2 (<a 891 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to?ref_src=embed" 892 + >@bleh-5.bsky.social</a 893 + >) 894 + <a 895 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to/post/3lr6qrk74rc2o?ref_src=embed" 896 + >Jun 9, 2025 at 9:00 AM</a 897 + > 898 + </blockquote> 899 + <div>Default avi quote</div> 900 + </div> 901 + 902 + <div class="item"> 903 + <blockquote 904 + class="bluesky-embed" 905 + data-bluesky-uri="at://did:plc:464y3vjt35kayax3f3fhk2to/app.bsky.feed.post/3lr6qsegoy22o" 906 + data-bluesky-cid="bafyreig3btwlldbmhkfygczijtexpsvxjcisseldiwlnoc3ovgdejoashm" 907 + data-bluesky-embed-color-mode="system"> 908 + <p lang="en"> 909 + bsky.app/profile/did:...<br /><br /><a 910 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to/post/3lr6qsegoy22o?ref_src=embed" 911 + >[image or embed]</a 912 + > 913 + </p> 914 + &mdash; beep boop 2 (<a 915 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to?ref_src=embed" 916 + >@bleh-5.bsky.social</a 917 + >) 918 + <a 919 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to/post/3lr6qsegoy22o?ref_src=embed" 920 + >Jun 9, 2025 at 9:01 AM</a 921 + > 922 + </blockquote> 923 + <div>Default avi list</div> 924 + </div> 925 + 926 + <div class="item"> 927 + <blockquote 928 + class="bluesky-embed" 929 + data-bluesky-uri="at://did:plc:464y3vjt35kayax3f3fhk2to/app.bsky.feed.post/3lr6qy3dpu22o" 930 + data-bluesky-cid="bafyreihdd7kzpnqr73bvpbvwwxv6fcwr7oyi7tveylozj3psiyppfv7bku" 931 + data-bluesky-embed-color-mode="system"> 932 + <p lang="en"> 933 + feed bsky.app/profile/why....<br /><br /><a 934 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to/post/3lr6qy3dpu22o?ref_src=embed" 935 + >[image or embed]</a 936 + > 937 + </p> 938 + &mdash; beep boop 2 (<a 939 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to?ref_src=embed" 940 + >@bleh-5.bsky.social</a 941 + >) 942 + <a 943 + href="https://bsky.app/profile/did:plc:464y3vjt35kayax3f3fhk2to/post/3lr6qy3dpu22o?ref_src=embed" 944 + >Jun 9, 2025 at 9:04 AM</a 945 + > 946 + </blockquote> 947 + <div>Default avi feed</div> 948 + </div> 949 + </div> 950 + </section> 951 + 952 + <!-- Verification --> 953 + <section> 954 + <h1>Verification</h1> 955 + <div class="grid"> 956 + <div class="item"> 957 + <blockquote 958 + class="bluesky-embed" 959 + data-bluesky-uri="at://did:plc:inz4fkbbp7ms3ixufw6xuvdi/app.bsky.feed.post/3lxjdltb4ts27" 960 + data-bluesky-cid="bafyreiaybsdmauo65e7sz5jmpfh4xnuho5lsurwpeunxxrzec5kesb6v5y" 961 + data-bluesky-embed-color-mode="system"> 962 + <p lang=""> 963 + Viewers in Africa, Asia, and Australia will be able to see the 964 + blood moon in the skyโ€”but those in the Americas will have to 965 + settle for a live feed this time around. 966 + www.wired.com/story/how-to...<br /><br /><a 967 + href="https://bsky.app/profile/did:plc:inz4fkbbp7ms3ixufw6xuvdi/post/3lxjdltb4ts27?ref_src=embed" 968 + >[image or embed]</a 969 + > 970 + </p> 971 + &mdash; WIRED (<a 972 + href="https://bsky.app/profile/did:plc:inz4fkbbp7ms3ixufw6xuvdi?ref_src=embed" 973 + >@wired.com</a 974 + >) 975 + <a 976 + href="https://bsky.app/profile/did:plc:inz4fkbbp7ms3ixufw6xuvdi/post/3lxjdltb4ts27?ref_src=embed" 977 + >Aug 28, 2025 at 10:35 PM</a 978 + > 979 + </blockquote> 980 + <div>Trusted verifier</div> 981 + </div> 982 + 983 + <div class="item"> 984 + <blockquote 985 + class="bluesky-embed" 986 + data-bluesky-uri="at://did:plc:idd5adskstkxy3fzsmer6dtn/app.bsky.feed.post/3lx7j264p7s25" 987 + data-bluesky-cid="bafyreih2kxdfmpvtrfhudho6untfityh3bw3mvlialhvbzcfpdqbuhtrdi" 988 + data-bluesky-embed-color-mode="system"> 989 + <p lang="en"> 990 + Wired is one of the few US media organisations which fully 991 + appreciates what&#x27;s happening.<br /><br /><a 992 + href="https://bsky.app/profile/did:plc:idd5adskstkxy3fzsmer6dtn/post/3lx7j264p7s25?ref_src=embed" 993 + >[image or embed]</a 994 + > 995 + </p> 996 + &mdash; TJ McIntyre (<a 997 + href="https://bsky.app/profile/did:plc:idd5adskstkxy3fzsmer6dtn?ref_src=embed" 998 + >@tjmcintyre.com</a 999 + >) 1000 + <a 1001 + href="https://bsky.app/profile/did:plc:idd5adskstkxy3fzsmer6dtn/post/3lx7j264p7s25?ref_src=embed" 1002 + >Aug 25, 2025 at 12:46 AM</a 1003 + > 1004 + </blockquote> 1005 + <div>Trusted verifier quoted</div> 1006 + </div> 1007 + 1008 + <div class="item"> 1009 + <blockquote 1010 + class="bluesky-embed" 1011 + data-bluesky-uri="at://did:plc:p2cp5gopk7mgjegy6wadk3ep/app.bsky.feed.post/3lxciw4rf4c2p" 1012 + data-bluesky-cid="bafyreicctppfb44vitkn73rx546wvvybs7e7ftkc3dhsz56vm7a6my5fdq" 1013 + data-bluesky-embed-color-mode="system"> 1014 + <p lang="en">test</p> 1015 + &mdash; Samuel (<a 1016 + href="https://bsky.app/profile/did:plc:p2cp5gopk7mgjegy6wadk3ep?ref_src=embed" 1017 + >@samuel.bsky.team</a 1018 + >) 1019 + <a 1020 + href="https://bsky.app/profile/did:plc:p2cp5gopk7mgjegy6wadk3ep/post/3lxciw4rf4c2p?ref_src=embed" 1021 + >Aug 26, 2025 at 5:22 AM</a 1022 + > 1023 + </blockquote> 1024 + <div>Verified</div> 1025 + </div> 1026 + 1027 + <div class="item"> 1028 + <blockquote 1029 + class="bluesky-embed" 1030 + data-bluesky-uri="at://did:plc:p2cp5gopk7mgjegy6wadk3ep/app.bsky.feed.post/3lxdeaccemk2j" 1031 + data-bluesky-cid="bafyreibmveixwjpcc2a4va2c5wihztsgdlysxvi4bz4xe7ilxe7uvuzn3u" 1032 + data-bluesky-embed-color-mode="system"> 1033 + <p lang="en"> 1034 + atproto in one post<br /><br /><a 1035 + href="https://bsky.app/profile/did:plc:p2cp5gopk7mgjegy6wadk3ep/post/3lxdeaccemk2j?ref_src=embed" 1036 + >[image or embed]</a 1037 + > 1038 + </p> 1039 + &mdash; Samuel (<a 1040 + href="https://bsky.app/profile/did:plc:p2cp5gopk7mgjegy6wadk3ep?ref_src=embed" 1041 + >@samuel.bsky.team</a 1042 + >) 1043 + <a 1044 + href="https://bsky.app/profile/did:plc:p2cp5gopk7mgjegy6wadk3ep/post/3lxdeaccemk2j?ref_src=embed" 1045 + >Aug 26, 2025 at 1:30 PM</a 1046 + > 1047 + </blockquote> 1048 + 1049 + <div>Verified quoted</div> 1050 + </div> 1051 + </div> 1052 + </section> 1053 + </body> 1054 + </html>
+32 -1
bskyembed/vite.config.ts
··· 1 + import fs from 'node:fs' 1 2 import {resolve} from 'node:path' 2 3 3 4 import preact from '@preact/preset-vite' 4 5 import legacy from '@vitejs/plugin-legacy' 5 - import type {UserConfig} from 'vite' 6 + import type {Plugin, UserConfig} from 'vite' 6 7 import paths from 'vite-tsconfig-paths' 7 8 9 + /** 10 + * World's hackiest router, for dev only. Serves `/post.html` to requests that start with `/embed/` 11 + */ 12 + function devOnlyRouter(): Plugin { 13 + return { 14 + name: 'embed-to-post-html', 15 + configureServer(server) { 16 + server.middlewares.use((req, res, next) => { 17 + const url = req.url || '' 18 + if (!url.startsWith('/embed/')) return next() 19 + 20 + const html = fs.readFileSync( 21 + resolve(process.cwd(), 'post.html'), 22 + 'utf8', 23 + ) 24 + 25 + server 26 + .transformIndexHtml(url, html) 27 + .then(transformed => { 28 + res.statusCode = 200 29 + res.setHeader('Content-Type', 'text/html') 30 + res.end(transformed) 31 + }) 32 + .catch(next) 33 + }) 34 + }, 35 + } 36 + } 37 + 8 38 const config: UserConfig = { 9 39 plugins: [ 10 40 preact(), ··· 12 42 legacy({ 13 43 targets: ['defaults', 'not IE 11'], 14 44 }), 45 + devOnlyRouter(), 15 46 ], 16 47 build: { 17 48 assetsDir: 'static',
+376 -5
bskyembed/yarn.lock
··· 1447 1447 regenerator-runtime "^0.14.1" 1448 1448 systemjs "^6.15.1" 1449 1449 1450 + "@zeit/schemas@2.36.0": 1451 + version "2.36.0" 1452 + resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.36.0.tgz#7a1b53f4091e18d0b404873ea3e3c83589c765f2" 1453 + integrity sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg== 1454 + 1450 1455 acorn-jsx@^5.3.2: 1451 1456 version "5.3.2" 1452 1457 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" ··· 1461 1466 version "8.11.3" 1462 1467 resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 1463 1468 integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 1469 + 1470 + ajv@8.12.0: 1471 + version "8.12.0" 1472 + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" 1473 + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== 1474 + dependencies: 1475 + fast-deep-equal "^3.1.1" 1476 + json-schema-traverse "^1.0.0" 1477 + require-from-string "^2.0.2" 1478 + uri-js "^4.2.2" 1464 1479 1465 1480 ajv@^6.12.4: 1466 1481 version "6.12.6" ··· 1472 1487 json-schema-traverse "^0.4.1" 1473 1488 uri-js "^4.2.2" 1474 1489 1490 + ansi-align@^3.0.1: 1491 + version "3.0.1" 1492 + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" 1493 + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== 1494 + dependencies: 1495 + string-width "^4.1.0" 1496 + 1475 1497 ansi-regex@^5.0.1: 1476 1498 version "5.0.1" 1477 1499 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" ··· 1507 1529 normalize-path "^3.0.0" 1508 1530 picomatch "^2.0.4" 1509 1531 1510 - arg@^5.0.2: 1532 + arch@^2.2.0: 1533 + version "2.2.0" 1534 + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" 1535 + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== 1536 + 1537 + arg@5.0.2, arg@^5.0.2: 1511 1538 version "5.0.2" 1512 1539 resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" 1513 1540 integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== ··· 1684 1711 resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 1685 1712 integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== 1686 1713 1714 + boxen@7.0.0: 1715 + version "7.0.0" 1716 + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.0.0.tgz#9e5f8c26e716793fc96edcf7cf754cdf5e3fbf32" 1717 + integrity sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg== 1718 + dependencies: 1719 + ansi-align "^3.0.1" 1720 + camelcase "^7.0.0" 1721 + chalk "^5.0.1" 1722 + cli-boxes "^3.0.0" 1723 + string-width "^5.1.2" 1724 + type-fest "^2.13.0" 1725 + widest-line "^4.0.1" 1726 + wrap-ansi "^8.0.1" 1727 + 1687 1728 brace-expansion@^1.1.7: 1688 1729 version "1.1.11" 1689 1730 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" ··· 1738 1779 resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 1739 1780 integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 1740 1781 1782 + bytes@3.0.0: 1783 + version "3.0.0" 1784 + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 1785 + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== 1786 + 1787 + bytes@3.1.2: 1788 + version "3.1.2" 1789 + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 1790 + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 1791 + 1741 1792 call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: 1742 1793 version "1.0.7" 1743 1794 resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" ··· 1759 1810 resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" 1760 1811 integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== 1761 1812 1813 + camelcase@^7.0.0: 1814 + version "7.0.1" 1815 + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" 1816 + integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== 1817 + 1762 1818 caniuse-lite@^1.0.30001524: 1763 1819 version "1.0.30001606" 1764 1820 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" ··· 1769 1825 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" 1770 1826 integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== 1771 1827 1772 - chalk@^4.0.0: 1828 + chalk-template@0.4.0: 1829 + version "0.4.0" 1830 + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" 1831 + integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== 1832 + dependencies: 1833 + chalk "^4.1.2" 1834 + 1835 + chalk@5.0.1: 1836 + version "5.0.1" 1837 + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" 1838 + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== 1839 + 1840 + chalk@^4.0.0, chalk@^4.1.2: 1773 1841 version "4.1.2" 1774 1842 resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 1775 1843 integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== ··· 1777 1845 ansi-styles "^4.1.0" 1778 1846 supports-color "^7.1.0" 1779 1847 1848 + chalk@^5.0.1: 1849 + version "5.6.2" 1850 + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" 1851 + integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== 1852 + 1780 1853 chokidar@^3.5.3: 1781 1854 version "3.6.0" 1782 1855 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" ··· 1792 1865 optionalDependencies: 1793 1866 fsevents "~2.3.2" 1794 1867 1868 + cli-boxes@^3.0.0: 1869 + version "3.0.0" 1870 + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" 1871 + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== 1872 + 1873 + clipboardy@3.0.0: 1874 + version "3.0.0" 1875 + resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-3.0.0.tgz#f3876247404d334c9ed01b6f269c11d09a5e3092" 1876 + integrity sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg== 1877 + dependencies: 1878 + arch "^2.2.0" 1879 + execa "^5.1.1" 1880 + is-wsl "^2.2.0" 1881 + 1795 1882 color-convert@^2.0.1: 1796 1883 version "2.0.1" 1797 1884 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" ··· 1814 1901 resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" 1815 1902 integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== 1816 1903 1904 + compressible@~2.0.18: 1905 + version "2.0.18" 1906 + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" 1907 + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== 1908 + dependencies: 1909 + mime-db ">= 1.43.0 < 2" 1910 + 1911 + compression@1.8.1: 1912 + version "1.8.1" 1913 + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" 1914 + integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== 1915 + dependencies: 1916 + bytes "3.1.2" 1917 + compressible "~2.0.18" 1918 + debug "2.6.9" 1919 + negotiator "~0.6.4" 1920 + on-headers "~1.1.0" 1921 + safe-buffer "5.2.1" 1922 + vary "~1.1.2" 1923 + 1817 1924 concat-map@0.0.1: 1818 1925 version "0.0.1" 1819 1926 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1820 1927 integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 1928 + 1929 + content-disposition@0.5.2: 1930 + version "0.5.2" 1931 + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 1932 + integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== 1821 1933 1822 1934 convert-source-map@^2.0.0: 1823 1935 version "2.0.0" ··· 1845 1957 shebang-command "^2.0.0" 1846 1958 which "^2.0.1" 1847 1959 1960 + cross-spawn@^7.0.3: 1961 + version "7.0.6" 1962 + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 1963 + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 1964 + dependencies: 1965 + path-key "^3.1.0" 1966 + shebang-command "^2.0.0" 1967 + which "^2.0.1" 1968 + 1848 1969 css-select@^5.1.0: 1849 1970 version "5.2.2" 1850 1971 resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" ··· 1893 2014 es-errors "^1.3.0" 1894 2015 is-data-view "^1.0.1" 1895 2016 2017 + debug@2.6.9: 2018 + version "2.6.9" 2019 + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 2020 + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 2021 + dependencies: 2022 + ms "2.0.0" 2023 + 1896 2024 debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.4.1: 1897 2025 version "4.4.1" 1898 2026 resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" ··· 1906 2034 integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 1907 2035 dependencies: 1908 2036 ms "2.1.2" 2037 + 2038 + deep-extend@^0.6.0: 2039 + version "0.6.0" 2040 + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 2041 + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 1909 2042 1910 2043 deep-is@^0.1.3: 1911 2044 version "0.1.4" ··· 2356 2489 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 2357 2490 integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 2358 2491 2492 + execa@^5.1.1: 2493 + version "5.1.1" 2494 + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 2495 + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 2496 + dependencies: 2497 + cross-spawn "^7.0.3" 2498 + get-stream "^6.0.0" 2499 + human-signals "^2.1.0" 2500 + is-stream "^2.0.0" 2501 + merge-stream "^2.0.0" 2502 + npm-run-path "^4.0.1" 2503 + onetime "^5.1.2" 2504 + signal-exit "^3.0.3" 2505 + strip-final-newline "^2.0.0" 2506 + 2359 2507 fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 2360 2508 version "3.1.3" 2361 2509 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" ··· 2496 2644 has-symbols "^1.0.3" 2497 2645 hasown "^2.0.0" 2498 2646 2647 + get-stream@^6.0.0: 2648 + version "6.0.1" 2649 + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 2650 + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 2651 + 2499 2652 get-symbol-description@^1.0.2: 2500 2653 version "1.0.2" 2501 2654 resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" ··· 2631 2784 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 2632 2785 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 2633 2786 2787 + human-signals@^2.1.0: 2788 + version "2.1.0" 2789 + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 2790 + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 2791 + 2634 2792 ignore@^5.2.0: 2635 2793 version "5.3.1" 2636 2794 resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" ··· 2661 2819 version "2.0.4" 2662 2820 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 2663 2821 integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 2822 + 2823 + ini@~1.3.0: 2824 + version "1.3.8" 2825 + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 2826 + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 2664 2827 2665 2828 internal-slot@^1.0.7: 2666 2829 version "1.0.7" ··· 2741 2904 dependencies: 2742 2905 has-tostringtag "^1.0.0" 2743 2906 2907 + is-docker@^2.0.0: 2908 + version "2.2.1" 2909 + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" 2910 + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== 2911 + 2744 2912 is-extglob@^2.1.1: 2745 2913 version "2.1.1" 2746 2914 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" ··· 2799 2967 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 2800 2968 integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 2801 2969 2970 + is-port-reachable@4.0.0: 2971 + version "4.0.0" 2972 + resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-4.0.0.tgz#dac044091ef15319c8ab2f34604d8794181f8c2d" 2973 + integrity sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig== 2974 + 2802 2975 is-regex@^1.1.4: 2803 2976 version "1.1.4" 2804 2977 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" ··· 2819 2992 dependencies: 2820 2993 call-bind "^1.0.7" 2821 2994 2995 + is-stream@^2.0.0: 2996 + version "2.0.1" 2997 + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 2998 + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 2999 + 2822 3000 is-string@^1.0.5, is-string@^1.0.7: 2823 3001 version "1.0.7" 2824 3002 resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" ··· 2859 3037 dependencies: 2860 3038 call-bind "^1.0.7" 2861 3039 get-intrinsic "^1.2.4" 3040 + 3041 + is-wsl@^2.2.0: 3042 + version "2.2.0" 3043 + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" 3044 + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== 3045 + dependencies: 3046 + is-docker "^2.0.0" 2862 3047 2863 3048 isarray@^2.0.5: 2864 3049 version "2.0.5" ··· 2932 3117 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 2933 3118 integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 2934 3119 3120 + json-schema-traverse@^1.0.0: 3121 + version "1.0.0" 3122 + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 3123 + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 3124 + 2935 3125 json-stable-stringify-without-jsonify@^1.0.1: 2936 3126 version "1.0.1" 2937 3127 resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" ··· 3047 3237 resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" 3048 3238 integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== 3049 3239 3240 + merge-stream@^2.0.0: 3241 + version "2.0.0" 3242 + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 3243 + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 3244 + 3050 3245 merge2@^1.3.0, merge2@^1.4.1: 3051 3246 version "1.4.1" 3052 3247 resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" ··· 3060 3255 braces "^3.0.2" 3061 3256 picomatch "^2.3.1" 3062 3257 3063 - minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 3258 + "mime-db@>= 1.43.0 < 2": 3259 + version "1.54.0" 3260 + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" 3261 + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== 3262 + 3263 + mime-db@~1.33.0: 3264 + version "1.33.0" 3265 + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 3266 + integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== 3267 + 3268 + mime-types@2.1.18: 3269 + version "2.1.18" 3270 + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 3271 + integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== 3272 + dependencies: 3273 + mime-db "~1.33.0" 3274 + 3275 + mimic-fn@^2.1.0: 3276 + version "2.1.0" 3277 + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 3278 + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 3279 + 3280 + minimatch@3.1.2, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 3064 3281 version "3.1.2" 3065 3282 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 3066 3283 integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== ··· 3074 3291 dependencies: 3075 3292 brace-expansion "^2.0.1" 3076 3293 3294 + minimist@^1.2.0: 3295 + version "1.2.8" 3296 + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 3297 + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 3298 + 3077 3299 "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: 3078 3300 version "7.0.4" 3079 3301 resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" 3080 3302 integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== 3303 + 3304 + ms@2.0.0: 3305 + version "2.0.0" 3306 + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 3307 + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 3081 3308 3082 3309 ms@2.1.2: 3083 3310 version "2.1.2" ··· 3118 3345 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 3119 3346 integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 3120 3347 3348 + negotiator@~0.6.4: 3349 + version "0.6.4" 3350 + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" 3351 + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== 3352 + 3121 3353 node-html-parser@^6.1.12: 3122 3354 version "6.1.13" 3123 3355 resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-6.1.13.tgz#a1df799b83df5c6743fcd92740ba14682083b7e4" ··· 3141 3373 resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 3142 3374 integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== 3143 3375 3376 + npm-run-path@^4.0.1: 3377 + version "4.0.1" 3378 + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 3379 + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 3380 + dependencies: 3381 + path-key "^3.0.0" 3382 + 3144 3383 nth-check@^2.0.1: 3145 3384 version "2.1.1" 3146 3385 resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" ··· 3215 3454 define-properties "^1.2.1" 3216 3455 es-object-atoms "^1.0.0" 3217 3456 3457 + on-headers@~1.1.0: 3458 + version "1.1.0" 3459 + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" 3460 + integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== 3461 + 3218 3462 once@^1.3.0: 3219 3463 version "1.4.0" 3220 3464 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 3221 3465 integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 3222 3466 dependencies: 3223 3467 wrappy "1" 3468 + 3469 + onetime@^5.1.2: 3470 + version "5.1.2" 3471 + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 3472 + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 3473 + dependencies: 3474 + mimic-fn "^2.1.0" 3224 3475 3225 3476 optionator@^0.9.3: 3226 3477 version "0.9.3" ··· 3265 3516 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 3266 3517 integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 3267 3518 3268 - path-key@^3.1.0: 3519 + path-is-inside@1.0.2: 3520 + version "1.0.2" 3521 + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 3522 + integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== 3523 + 3524 + path-key@^3.0.0, path-key@^3.1.0: 3269 3525 version "3.1.1" 3270 3526 resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 3271 3527 integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== ··· 3282 3538 dependencies: 3283 3539 lru-cache "^10.2.0" 3284 3540 minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 3541 + 3542 + path-to-regexp@3.3.0: 3543 + version "3.3.0" 3544 + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.3.0.tgz#f7f31d32e8518c2660862b644414b6d5c63a611b" 3545 + integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw== 3285 3546 3286 3547 path-type@^4.0.0: 3287 3548 version "4.0.0" ··· 3409 3670 resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 3410 3671 integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 3411 3672 3673 + range-parser@1.2.0: 3674 + version "1.2.0" 3675 + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 3676 + integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== 3677 + 3678 + rc@^1.0.1, rc@^1.1.6: 3679 + version "1.2.8" 3680 + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 3681 + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 3682 + dependencies: 3683 + deep-extend "^0.6.0" 3684 + ini "~1.3.0" 3685 + minimist "^1.2.0" 3686 + strip-json-comments "~2.0.1" 3687 + 3412 3688 react-is@^16.13.1: 3413 3689 version "16.13.1" 3414 3690 resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" ··· 3480 3756 unicode-match-property-ecmascript "^2.0.0" 3481 3757 unicode-match-property-value-ecmascript "^2.1.0" 3482 3758 3759 + registry-auth-token@3.3.2: 3760 + version "3.3.2" 3761 + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" 3762 + integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== 3763 + dependencies: 3764 + rc "^1.1.6" 3765 + safe-buffer "^5.0.1" 3766 + 3767 + registry-url@3.1.0: 3768 + version "3.1.0" 3769 + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 3770 + integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== 3771 + dependencies: 3772 + rc "^1.0.1" 3773 + 3483 3774 regjsgen@^0.8.0: 3484 3775 version "0.8.0" 3485 3776 resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" ··· 3491 3782 integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== 3492 3783 dependencies: 3493 3784 jsesc "~3.0.2" 3785 + 3786 + require-from-string@^2.0.2: 3787 + version "2.0.2" 3788 + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 3789 + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 3494 3790 3495 3791 resolve-from@^4.0.0: 3496 3792 version "4.0.0" ··· 3582 3878 has-symbols "^1.0.3" 3583 3879 isarray "^2.0.5" 3584 3880 3881 + safe-buffer@5.2.1, safe-buffer@^5.0.1: 3882 + version "5.2.1" 3883 + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 3884 + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 3885 + 3585 3886 safe-regex-test@^1.0.3: 3586 3887 version "1.0.3" 3587 3888 resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" ··· 3603 3904 dependencies: 3604 3905 lru-cache "^6.0.0" 3605 3906 3907 + serve-handler@6.1.6: 3908 + version "6.1.6" 3909 + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.6.tgz#50803c1d3e947cd4a341d617f8209b22bd76cfa1" 3910 + integrity sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ== 3911 + dependencies: 3912 + bytes "3.0.0" 3913 + content-disposition "0.5.2" 3914 + mime-types "2.1.18" 3915 + minimatch "3.1.2" 3916 + path-is-inside "1.0.2" 3917 + path-to-regexp "3.3.0" 3918 + range-parser "1.2.0" 3919 + 3920 + serve@^14.2.5: 3921 + version "14.2.5" 3922 + resolved "https://registry.yarnpkg.com/serve/-/serve-14.2.5.tgz#569e333b99a484b3a6d25acce4a569c8c4f96373" 3923 + integrity sha512-Qn/qMkzCcMFVPb60E/hQy+iRLpiU8PamOfOSYoAHmmF+fFFmpPpqa6Oci2iWYpTdOUM3VF+TINud7CfbQnsZbA== 3924 + dependencies: 3925 + "@zeit/schemas" "2.36.0" 3926 + ajv "8.12.0" 3927 + arg "5.0.2" 3928 + boxen "7.0.0" 3929 + chalk "5.0.1" 3930 + chalk-template "0.4.0" 3931 + clipboardy "3.0.0" 3932 + compression "1.8.1" 3933 + is-port-reachable "4.0.0" 3934 + serve-handler "6.1.6" 3935 + update-check "1.5.4" 3936 + 3606 3937 set-function-length@^1.2.1: 3607 3938 version "1.2.2" 3608 3939 resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" ··· 3646 3977 es-errors "^1.3.0" 3647 3978 get-intrinsic "^1.2.4" 3648 3979 object-inspect "^1.13.1" 3980 + 3981 + signal-exit@^3.0.3: 3982 + version "3.0.7" 3983 + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 3984 + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 3649 3985 3650 3986 signal-exit@^4.0.1: 3651 3987 version "4.1.0" ··· 3791 4127 dependencies: 3792 4128 ansi-regex "^6.0.1" 3793 4129 4130 + strip-final-newline@^2.0.0: 4131 + version "2.0.0" 4132 + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 4133 + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 4134 + 3794 4135 strip-json-comments@^3.1.1: 3795 4136 version "3.1.1" 3796 4137 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 3797 4138 integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 4139 + 4140 + strip-json-comments@~2.0.1: 4141 + version "2.0.1" 4142 + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 4143 + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== 3798 4144 3799 4145 sucrase@^3.32.0: 3800 4146 version "3.35.0" ··· 3937 4283 resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 3938 4284 integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 3939 4285 4286 + type-fest@^2.13.0: 4287 + version "2.19.0" 4288 + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" 4289 + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== 4290 + 3940 4291 typed-array-buffer@^1.0.2: 3941 4292 version "1.0.2" 3942 4293 resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" ··· 4034 4385 escalade "^3.2.0" 4035 4386 picocolors "^1.1.1" 4036 4387 4388 + update-check@1.5.4: 4389 + version "1.5.4" 4390 + resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.4.tgz#5b508e259558f1ad7dbc8b4b0457d4c9d28c8743" 4391 + integrity sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ== 4392 + dependencies: 4393 + registry-auth-token "3.3.2" 4394 + registry-url "3.1.0" 4395 + 4037 4396 uri-js@^4.2.2: 4038 4397 version "4.4.1" 4039 4398 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" ··· 4046 4405 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 4047 4406 integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 4048 4407 4408 + vary@~1.1.2: 4409 + version "1.1.2" 4410 + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 4411 + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 4412 + 4049 4413 vite-prerender-plugin@^0.5.3: 4050 4414 version "0.5.11" 4051 4415 resolved "https://registry.yarnpkg.com/vite-prerender-plugin/-/vite-prerender-plugin-0.5.11.tgz#83e4f29e03269dceb763fb5ec2376dcc502aa79f" ··· 4138 4502 dependencies: 4139 4503 isexe "^2.0.0" 4140 4504 4505 + widest-line@^4.0.1: 4506 + version "4.0.1" 4507 + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" 4508 + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== 4509 + dependencies: 4510 + string-width "^5.0.1" 4511 + 4141 4512 "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 4142 4513 version "7.0.0" 4143 4514 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" ··· 4147 4518 string-width "^4.1.0" 4148 4519 strip-ansi "^6.0.0" 4149 4520 4150 - wrap-ansi@^8.1.0: 4521 + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: 4151 4522 version "8.1.0" 4152 4523 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 4153 4524 integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+3 -3
package.json
··· 71 71 "icons:optimize": "svgo -f ./assets/icons" 72 72 }, 73 73 "dependencies": { 74 - "@atproto/api": "^0.17.0", 74 + "@atproto/api": "^0.16.7", 75 75 "@bitdrift/react-native": "^0.6.8", 76 76 "@braintree/sanitize-url": "^6.0.2", 77 77 "@bsky.app/alf": "^0.1.2", ··· 246 246 "babel-jest": "^29.7.0", 247 247 "babel-plugin-macros": "^3.1.0", 248 248 "babel-plugin-module-resolver": "^5.0.2", 249 - "babel-plugin-react-compiler": "^19.1.0-rc.3", 249 + "babel-plugin-react-compiler": "^19.1.0-rc.1", 250 250 "babel-preset-expo": "~54.0.0", 251 251 "eslint": "^8.19.0", 252 252 "eslint-plugin-bsky-internal": "link:./eslint", ··· 254 254 "eslint-plugin-import": "^2.31.0", 255 255 "eslint-plugin-lingui": "^0.2.0", 256 256 "eslint-plugin-react": "^7.33.2", 257 - "eslint-plugin-react-compiler": "^19.1.0-rc.2", 257 + "eslint-plugin-react-compiler": "^19.1.0-rc.1", 258 258 "eslint-plugin-react-native-a11y": "^3.3.0", 259 259 "eslint-plugin-simple-import-sort": "^12.0.0", 260 260 "file-loader": "6.2.0",
+24 -44
src/components/Admonition.tsx
··· 3 3 4 4 import {atoms as a, useBreakpoints, useTheme} from '#/alf' 5 5 import {Button as BaseButton, type ButtonProps} from '#/components/Button' 6 - import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfoIcon} from '#/components/icons/CircleInfo' 7 - import {CircleX_Stroke2_Corner0_Rounded as CircleXIcon} from '#/components/icons/CircleX' 6 + import {CircleInfo_Stroke2_Corner0_Rounded as ErrorIcon} from '#/components/icons/CircleInfo' 7 + import {Eye_Stroke2_Corner0_Rounded as InfoIcon} from '#/components/icons/Eye' 8 + import {Leaf_Stroke2_Corner0_Rounded as TipIcon} from '#/components/icons/Leaf' 8 9 import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' 9 10 import {Text as BaseText, type TextProps} from '#/components/Typography' 10 11 11 12 export const colors = { 12 - warning: '#FFC404', 13 + warning: { 14 + light: '#DFBC00', 15 + dark: '#BFAF1F', 16 + }, 13 17 } 14 18 15 19 type Context = { ··· 25 29 const t = useTheme() 26 30 const {type} = useContext(Context) 27 31 const Icon = { 28 - info: CircleInfoIcon, 29 - tip: CircleInfoIcon, 32 + info: InfoIcon, 33 + tip: TipIcon, 30 34 warning: WarningIcon, 31 - error: CircleXIcon, 35 + error: ErrorIcon, 32 36 }[type] 33 37 const fill = { 34 38 info: t.atoms.text_contrast_medium.color, 35 39 tip: t.palette.primary_500, 36 - warning: colors.warning, 40 + warning: colors.warning.light, 37 41 error: t.palette.negative_500, 38 42 }[type] 39 43 return <Icon fill={fill} size="md" /> 40 44 } 41 45 42 - export function Content({ 43 - children, 44 - style, 45 - ...rest 46 - }: { 47 - children: React.ReactNode 48 - style?: StyleProp<ViewStyle> 49 - }) { 50 - return ( 51 - <View 52 - style={[a.gap_sm, a.flex_1, {minHeight: 20}, a.justify_center, style]} 53 - {...rest}> 54 - {children} 55 - </View> 56 - ) 57 - } 58 - 59 46 export function Text({ 60 47 children, 61 48 style, 62 49 ...rest 63 50 }: Pick<TextProps, 'children' | 'style'>) { 64 51 return ( 65 - <BaseText {...rest} style={[a.text_sm, a.leading_snug, a.pr_md, style]}> 52 + <BaseText 53 + {...rest} 54 + style={[a.flex_1, a.text_sm, a.leading_snug, a.pr_md, style]}> 66 55 {children} 67 56 </BaseText> 68 57 ) ··· 71 60 export function Button({ 72 61 children, 73 62 ...props 74 - }: Omit<ButtonProps, 'size' | 'variant'>) { 63 + }: Omit<ButtonProps, 'size' | 'variant' | 'color'>) { 75 64 return ( 76 - <BaseButton size="tiny" {...props}> 65 + <BaseButton size="tiny" variant="outline" color="secondary" {...props}> 77 66 {children} 78 67 </BaseButton> 79 68 ) 80 69 } 81 70 82 - export function Row({ 83 - children, 84 - style, 85 - }: { 86 - children: React.ReactNode 87 - style?: StyleProp<ViewStyle> 88 - }) { 71 + export function Row({children}: {children: React.ReactNode}) { 89 72 return ( 90 - <View style={[a.flex_1, a.flex_row, a.align_start, a.gap_sm, style]}> 73 + <View style={[a.flex_1, a.flex_row, a.align_center, a.gap_sm]}> 91 74 {children} 92 75 </View> 93 76 ) ··· 105 88 const t = useTheme() 106 89 const {gtMobile} = useBreakpoints() 107 90 const borderColor = { 108 - info: t.atoms.border_contrast_high.borderColor, 109 - tip: t.palette.primary_500, 110 - warning: colors.warning, 111 - error: t.palette.negative_500, 91 + info: t.atoms.border_contrast_low.borderColor, 92 + tip: t.atoms.border_contrast_low.borderColor, 93 + warning: t.atoms.border_contrast_low.borderColor, 94 + error: t.atoms.border_contrast_low.borderColor, 112 95 }[type] 113 96 return ( 114 97 <Context.Provider value={{type}}> 115 98 <View 116 99 style={[ 117 100 gtMobile ? a.p_md : a.p_sm, 118 - a.p_md, 119 101 a.rounded_sm, 120 102 a.border, 121 - t.atoms.bg, 103 + t.atoms.bg_contrast_25, 122 104 {borderColor}, 123 105 style, 124 106 ]}> ··· 141 123 <Outer type={type} style={style}> 142 124 <Row> 143 125 <Icon /> 144 - <Content> 145 - <Text>{children}</Text> 146 - </Content> 126 + <Text>{children}</Text> 147 127 </Row> 148 128 </Outer> 149 129 )
+41 -53
src/components/Button.tsx
··· 274 274 } else if (color === 'primary_subtle') { 275 275 if (!disabled) { 276 276 baseStyles.push({ 277 - backgroundColor: t.palette.primary_50, 277 + backgroundColor: select(t.name, { 278 + light: t.palette.primary_50, 279 + dim: t.palette.primary_100, 280 + dark: t.palette.primary_100, 281 + }), 278 282 }) 279 283 hoverStyles.push({ 280 - backgroundColor: t.palette.primary_100, 284 + backgroundColor: select(t.name, { 285 + light: t.palette.primary_100, 286 + dim: t.palette.primary_200, 287 + dark: t.palette.primary_200, 288 + }), 281 289 }) 282 290 } else { 283 291 baseStyles.push({ ··· 287 295 } else if (color === 'negative_subtle') { 288 296 if (!disabled) { 289 297 baseStyles.push({ 290 - backgroundColor: t.palette.negative_50, 298 + backgroundColor: select(t.name, { 299 + light: t.palette.negative_50, 300 + dim: t.palette.negative_100, 301 + dark: t.palette.negative_100, 302 + }), 291 303 }) 292 304 hoverStyles.push({ 293 - backgroundColor: t.palette.negative_100, 305 + backgroundColor: select(t.name, { 306 + light: t.palette.negative_100, 307 + dim: t.palette.negative_200, 308 + dark: t.palette.negative_200, 309 + }), 294 310 }) 295 311 } else { 296 312 baseStyles.push({ ··· 602 618 } else if (color === 'primary_subtle') { 603 619 if (!disabled) { 604 620 baseStyles.push({ 605 - color: t.palette.primary_600, 621 + color: select(t.name, { 622 + light: t.palette.primary_600, 623 + dim: t.palette.primary_800, 624 + dark: t.palette.primary_800, 625 + }), 606 626 }) 607 627 } else { 608 628 baseStyles.push({ 609 - color: t.palette.primary_200, 629 + color: select(t.name, { 630 + light: t.palette.primary_200, 631 + dim: t.palette.primary_200, 632 + dark: t.palette.primary_200, 633 + }), 610 634 }) 611 635 } 612 636 } else if (color === 'negative_subtle') { 613 637 if (!disabled) { 614 638 baseStyles.push({ 615 - color: t.palette.negative_600, 639 + color: select(t.name, { 640 + light: t.palette.negative_600, 641 + dim: t.palette.negative_800, 642 + dark: t.palette.negative_800, 643 + }), 616 644 }) 617 645 } else { 618 646 baseStyles.push({ 619 - color: t.palette.negative_200, 647 + color: select(t.name, { 648 + light: t.palette.negative_200, 649 + dim: t.palette.negative_200, 650 + dark: t.palette.negative_200, 651 + }), 620 652 }) 621 653 } 622 654 } ··· 723 755 } else if (size === 'small') { 724 756 baseStyles.push(a.text_sm, a.leading_snug, a.font_medium) 725 757 } else if (size === 'tiny') { 726 - baseStyles.push(a.text_xs, a.leading_snug, a.font_semi_bold) 758 + baseStyles.push(a.text_xs, a.leading_snug, a.font_medium) 727 759 } 728 760 729 761 return StyleSheet.flatten(baseStyles) ··· 837 869 </View> 838 870 ) 839 871 } 840 - 841 - export type StackedButtonProps = Omit< 842 - ButtonProps, 843 - keyof VariantProps | 'children' 844 - > & 845 - Pick<VariantProps, 'color'> & { 846 - children: React.ReactNode 847 - icon: React.ComponentType<SVGIconProps> 848 - } 849 - 850 - export function StackedButton({children, ...props}: StackedButtonProps) { 851 - return ( 852 - <Button 853 - {...props} 854 - size="tiny" 855 - style={[ 856 - a.flex_col, 857 - { 858 - height: 72, 859 - paddingHorizontal: 16, 860 - borderRadius: 20, 861 - gap: 4, 862 - }, 863 - props.style, 864 - ]}> 865 - <StackedButtonInnerText icon={props.icon}> 866 - {children} 867 - </StackedButtonInnerText> 868 - </Button> 869 - ) 870 - } 871 - 872 - function StackedButtonInnerText({ 873 - children, 874 - icon: Icon, 875 - }: Pick<StackedButtonProps, 'icon' | 'children'>) { 876 - const textStyles = useSharedButtonTextStyles() 877 - return ( 878 - <> 879 - <Icon width={24} fill={textStyles.color} /> 880 - <ButtonText>{children}</ButtonText> 881 - </> 882 - ) 883 - }
+1
src/components/PostControls/ShareMenu/RecentChats.tsx
··· 24 24 25 25 export function RecentChats({postUri}: {postUri: string}) { 26 26 const control = useDialogContext() 27 + const {_} = useLingui() 27 28 const {currentAccount} = useSession() 28 29 const {data} = useListConvosQuery({status: 'accepted'}) 29 30 const convos = data?.pages[0]?.convos?.slice(0, 10)
+1
src/components/dialogs/StarterPackDialog.tsx
··· 47 47 targetDid, 48 48 enabled, 49 49 }: StarterPackDialogProps) { 50 + const {_} = useLingui() 50 51 const navigation = useNavigation<NavigationProp>() 51 52 const requireEmailVerification = useRequireEmailVerification() 52 53
+1 -3
src/components/moderation/LabelsOnMeDialog.tsx
··· 32 32 33 33 export function LabelsOnMeDialog(props: LabelsOnMeDialogProps) { 34 34 return ( 35 - <Dialog.Outer 36 - control={props.control} 37 - nativeOptions={{preventExpansion: true}}> 35 + <Dialog.Outer control={props.control}> 38 36 <Dialog.Handle /> 39 37 <LabelsOnMeDialogInner {...props} /> 40 38 </Dialog.Outer>
+1 -3
src/components/moderation/ModerationDetailsDialog.tsx
··· 24 24 25 25 export function ModerationDetailsDialog(props: ModerationDetailsDialogProps) { 26 26 return ( 27 - <Dialog.Outer 28 - control={props.control} 29 - nativeOptions={{preventExpansion: true}}> 27 + <Dialog.Outer control={props.control}> 30 28 <Dialog.Handle /> 31 29 <ModerationDetailsDialogInner {...props} /> 32 30 </Dialog.Outer>
+1 -2
src/components/moderation/ProfileHeaderAlerts.tsx
··· 6 6 7 7 export function ProfileHeaderAlerts({ 8 8 moderation, 9 - style, 10 9 }: { 11 10 moderation: ModerationDecision 12 11 style?: StyleProp<ViewStyle> ··· 17 16 } 18 17 19 18 return ( 20 - <Pills.Row size="lg" style={style}> 19 + <Pills.Row size="lg"> 21 20 {modui.alerts.filter(unique).map(cause => ( 22 21 <Pills.Label 23 22 size="lg"
+3 -6
src/components/moderation/ReportDialog/index.tsx
··· 219 219 <Admonition.Outer type="error"> 220 220 <Admonition.Row> 221 221 <Admonition.Icon /> 222 - <Admonition.Content> 223 - <Admonition.Text> 224 - <Trans>Something went wrong, please try again</Trans> 225 - </Admonition.Text> 226 - </Admonition.Content> 222 + <Admonition.Text> 223 + <Trans>Something went wrong, please try again</Trans> 224 + </Admonition.Text> 227 225 <Admonition.Button 228 - color="negative_subtle" 229 226 label={_(msg`Retry loading report options`)} 230 227 onPress={() => refetchLabelers()}> 231 228 <ButtonText>
+1 -1
src/lib/hooks/useIntentHandler.ts
··· 51 51 } 52 52 53 53 const urlp = new URL(url) 54 - const [__, intent, intentType] = urlp.pathname.split('/') 54 + const [_, intent, intentType] = urlp.pathname.split('/') 55 55 56 56 // On native, our links look like bluesky://intent/SomeIntent, so we have to check the hostname for the 57 57 // intent check. On web, we have to check the first part of the path since we have an actual hostname
+11 -11
src/lib/strings/embed-player.ts
··· 105 105 urlp.hostname === 'm.youtube.com' || 106 106 urlp.hostname === 'music.youtube.com' 107 107 ) { 108 - const [__, page, shortOrLiveVideoId] = urlp.pathname.split('/') 108 + const [_, page, shortOrLiveVideoId] = urlp.pathname.split('/') 109 109 110 110 const isShorts = page === 'shorts' 111 111 const isLive = page === 'live' ··· 137 137 window.location.hostname 138 138 : 'localhost' 139 139 140 - const [__, channelOrVideo, clipOrId, id] = urlp.pathname.split('/') 140 + const [_, channelOrVideo, clipOrId, id] = urlp.pathname.split('/') 141 141 142 142 if (channelOrVideo === 'videos') { 143 143 return { ··· 162 162 163 163 // spotify 164 164 if (urlp.hostname === 'open.spotify.com') { 165 - const [__, typeOrLocale, idOrType, id] = urlp.pathname.split('/') 165 + const [_, typeOrLocale, idOrType, id] = urlp.pathname.split('/') 166 166 167 167 if (idOrType) { 168 168 if (typeOrLocale === 'playlist' || idOrType === 'playlist') { ··· 210 210 urlp.hostname === 'soundcloud.com' || 211 211 urlp.hostname === 'www.soundcloud.com' 212 212 ) { 213 - const [__, user, trackOrSets, set] = urlp.pathname.split('/') 213 + const [_, user, trackOrSets, set] = urlp.pathname.split('/') 214 214 215 215 if (user && trackOrSets) { 216 216 if (trackOrSets === 'sets' && set) { ··· 270 270 } 271 271 272 272 if (urlp.hostname === 'vimeo.com' || urlp.hostname === 'www.vimeo.com') { 273 - const [__, videoId] = urlp.pathname.split('/') 273 + const [_, videoId] = urlp.pathname.split('/') 274 274 if (videoId) { 275 275 return { 276 276 type: 'vimeo_video', ··· 281 281 } 282 282 283 283 if (urlp.hostname === 'giphy.com' || urlp.hostname === 'www.giphy.com') { 284 - const [__, gifs, nameAndId] = urlp.pathname.split('/') 284 + const [_, gifs, nameAndId] = urlp.pathname.split('/') 285 285 286 286 /* 287 287 * nameAndId is a string that consists of the name (dash separated) and the id of the gif (the last part of the name) ··· 309 309 // These can include (presumably) a tracking id in the path name, so we have to check for that as well 310 310 if (giphyRegex.test(urlp.hostname)) { 311 311 // We can link directly to the gif, if its a proper link 312 - const [__, media, trackingOrId, idOrFilename, filename] = 312 + const [_, media, trackingOrId, idOrFilename, filename] = 313 313 urlp.pathname.split('/') 314 314 315 315 if (media === 'media') { ··· 338 338 // Finally, we should see if it is a link to i.giphy.com. These links don't necessarily end in .gif but can also 339 339 // be .webp 340 340 if (urlp.hostname === 'i.giphy.com' || urlp.hostname === 'www.i.giphy.com') { 341 - const [__, mediaOrFilename, filename] = urlp.pathname.split('/') 341 + const [_, mediaOrFilename, filename] = urlp.pathname.split('/') 342 342 343 343 if (mediaOrFilename === 'media' && filename) { 344 344 const gifId = filename.split('.')[0] ··· 389 389 const path_components = urlp.pathname.slice(1, i + 1).split('/') 390 390 if (path_components.length === 4) { 391 391 // discard username - it's not relevant 392 - const [photos, __, albums, id] = path_components 392 + const [photos, _, albums, id] = path_components 393 393 if (photos === 'photos' && albums === 'albums') { 394 394 // this at least has the shape of a valid photo-album URL! 395 395 return { ··· 417 417 // link shortened flickr path 418 418 if (urlp.hostname === 'flic.kr') { 419 419 const b58alph = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' 420 - let [__, type, idBase58Enc] = urlp.pathname.split('/') 420 + let [_, type, idBase58Enc] = urlp.pathname.split('/') 421 421 let id = 0n 422 422 for (const char of idBase58Enc) { 423 423 const nextIdx = b58alph.indexOf(char) ··· 528 528 return {success: false} 529 529 } 530 530 531 - let [__, id, filename] = urlp.pathname.split('/') 531 + let [_, id, filename] = urlp.pathname.split('/') 532 532 533 533 if (!id || !filename) { 534 534 return {success: false}
+17
src/lib/strings/helpers.ts
··· 62 62 }, [splitter, maxCount, text]) 63 63 } 64 64 65 + // https://stackoverflow.com/a/52171480 66 + export function toHashCode(str: string, seed = 0): number { 67 + let h1 = 0xdeadbeef ^ seed, 68 + h2 = 0x41c6ce57 ^ seed 69 + for (let i = 0, ch; i < str.length; i++) { 70 + ch = str.charCodeAt(i) 71 + h1 = Math.imul(h1 ^ ch, 2654435761) 72 + h2 = Math.imul(h2 ^ ch, 1597334677) 73 + } 74 + h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) 75 + h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909) 76 + h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) 77 + h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909) 78 + 79 + return 4294967296 * (2097151 & h2) + (h1 >>> 0) 80 + } 81 + 65 82 export function countLines(str: string | undefined): number { 66 83 if (!str) return 0 67 84 return str.match(/\n/g)?.length ?? 0
+1 -1
src/lib/strings/starter-pack.ts
··· 46 46 } else { 47 47 const url = new URL(uri) 48 48 const parts = url.pathname.split('/') 49 - const [__, path, name, rkey] = parts 49 + const [_, path, name, rkey] = parts 50 50 51 51 if (parts.length !== 4) return null 52 52 if (path !== 'starter-pack' && path !== 'start') return null
+215 -225
src/locale/locales/en/messages.po
··· 124 124 msgid "{0, plural, other {# people have}} used this starter pack!" 125 125 msgstr "" 126 126 127 - #: src/components/dialogs/StarterPackDialog.tsx:356 127 + #: src/components/dialogs/StarterPackDialog.tsx:357 128 128 msgid "{0, plural, other {+# more}}" 129 129 msgstr "" 130 130 ··· 521 521 msgid "7 days" 522 522 msgstr "" 523 523 524 - #: src/screens/Onboarding/StepFinished.tsx:340 524 + #: src/screens/Onboarding/StepFinished.tsx:341 525 525 msgid "A collection of popular feeds you can find on Bluesky, including News, Booksky, Game Dev, Blacksky, and Fountain Pens" 526 526 msgstr "" 527 527 ··· 568 568 msgid "Accept Request" 569 569 msgstr "" 570 570 571 - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:179 572 - msgid "Accept this language suggestion" 573 - msgstr "" 574 - 575 571 #: src/screens/Settings/AccessibilitySettings.tsx:44 576 572 #: src/screens/Settings/Settings.tsx:220 577 573 #: src/screens/Settings/Settings.tsx:223 ··· 608 604 msgid "Account muted" 609 605 msgstr "" 610 606 611 - #: src/components/moderation/ModerationDetailsDialog.tsx:105 607 + #: src/components/moderation/ModerationDetailsDialog.tsx:103 612 608 #: src/lib/moderation/useModerationCauseDescription.ts:98 613 609 msgid "Account Muted" 614 610 msgstr "" 615 611 616 - #: src/components/moderation/ModerationDetailsDialog.tsx:91 612 + #: src/components/moderation/ModerationDetailsDialog.tsx:89 617 613 msgid "Account Muted by List" 618 614 msgstr "" 619 615 ··· 658 654 659 655 #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:169 660 656 #: src/components/dialogs/MutedWords.tsx:333 661 - #: src/components/dialogs/StarterPackDialog.tsx:370 662 - #: src/components/dialogs/StarterPackDialog.tsx:376 657 + #: src/components/dialogs/StarterPackDialog.tsx:371 658 + #: src/components/dialogs/StarterPackDialog.tsx:377 663 659 #: src/view/com/modals/UserAddRemoveLists.tsx:235 664 660 msgid "Add" 665 661 msgstr "" ··· 712 708 msgid "Add another account" 713 709 msgstr "" 714 710 715 - #: src/view/com/composer/Composer.tsx:853 711 + #: src/view/com/composer/Composer.tsx:811 716 712 msgid "Add another post" 717 713 msgstr "" 718 714 719 - #: src/view/com/composer/Composer.tsx:1490 715 + #: src/view/com/composer/Composer.tsx:1444 720 716 msgid "Add another post to thread" 721 717 msgstr "" 722 718 ··· 739 735 msgid "Add media to post" 740 736 msgstr "" 741 737 742 - #: src/components/moderation/ReportDialog/index.tsx:406 743 - #: src/components/moderation/ReportDialog/index.tsx:410 738 + #: src/components/moderation/ReportDialog/index.tsx:403 739 + #: src/components/moderation/ReportDialog/index.tsx:407 744 740 msgid "Add more details (optional)" 745 741 msgstr "" 746 742 ··· 794 790 msgid "Add to saved posts" 795 791 msgstr "" 796 792 797 - #: src/components/dialogs/StarterPackDialog.tsx:175 793 + #: src/components/dialogs/StarterPackDialog.tsx:176 798 794 #: src/view/com/profile/ProfileMenu.tsx:308 799 795 #: src/view/com/profile/ProfileMenu.tsx:311 800 796 msgid "Add to starter packs" ··· 809 805 msgid "Added to list" 810 806 msgstr "" 811 807 812 - #: src/components/dialogs/StarterPackDialog.tsx:257 808 + #: src/components/dialogs/StarterPackDialog.tsx:258 813 809 msgid "Added to starter pack" 814 810 msgstr "" 815 811 ··· 817 813 msgid "Additional details (limit 1000 characters)" 818 814 msgstr "" 819 815 820 - #: src/components/moderation/ReportDialog/index.tsx:424 816 + #: src/components/moderation/ReportDialog/index.tsx:421 821 817 msgid "Additional details (limit 300 characters)" 822 818 msgstr "" 823 819 ··· 883 879 #: src/screens/Search/components/SearchLanguageDropdown.tsx:64 884 880 #: src/screens/Search/components/SearchLanguageDropdown.tsx:99 885 881 #: src/screens/Search/components/SearchLanguageDropdown.tsx:101 886 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:238 882 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:216 887 883 msgid "All languages" 888 884 msgstr "" 889 885 ··· 907 903 msgstr "" 908 904 909 905 #: src/screens/Settings/ActivityPrivacySettings.tsx:52 910 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:91 906 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:92 911 907 msgid "Allow others to be notified of your posts" 912 908 msgstr "" 913 909 ··· 971 967 msgstr "" 972 968 973 969 #: src/components/dialogs/GifSelect.tsx:253 974 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:320 970 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:298 975 971 msgid "An error has occurred" 976 972 msgstr "" 977 973 ··· 1016 1012 msgid "An error occurred while uploading the video." 1017 1013 msgstr "" 1018 1014 1019 - #: src/screens/Onboarding/StepFinished.tsx:358 1015 + #: src/screens/Onboarding/StepFinished.tsx:359 1020 1016 msgid "An illustration of several Bluesky posts alongside repost, like, and comment icons" 1021 1017 msgstr "" 1022 1018 ··· 1055 1051 msgid "an unknown error occurred" 1056 1052 msgstr "" 1057 1053 1058 - #: src/components/moderation/ModerationDetailsDialog.tsx:136 1054 + #: src/components/moderation/ModerationDetailsDialog.tsx:134 1059 1055 #: src/lib/moderation/useModerationCauseDescription.ts:144 1060 1056 msgid "an unknown labeler" 1061 1057 msgstr "" ··· 1093 1089 1094 1090 #: src/screens/Settings/ActivityPrivacySettings.tsx:111 1095 1091 #: src/screens/Settings/ActivityPrivacySettings.tsx:116 1096 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:162 1092 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:163 1097 1093 msgid "Anyone who follows me" 1098 1094 msgstr "" 1099 1095 ··· 1129 1125 msgid "App password names must be at least 4 characters long" 1130 1126 msgstr "" 1131 1127 1132 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:71 1133 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:74 1128 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:72 1129 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:75 1134 1130 msgid "App passwords" 1135 1131 msgstr "" 1136 1132 ··· 1139 1135 msgid "App Passwords" 1140 1136 msgstr "" 1141 1137 1142 - #: src/components/moderation/LabelsOnMeDialog.tsx:152 1143 - #: src/components/moderation/LabelsOnMeDialog.tsx:155 1138 + #: src/components/moderation/LabelsOnMeDialog.tsx:150 1139 + #: src/components/moderation/LabelsOnMeDialog.tsx:153 1144 1140 msgid "Appeal" 1145 1141 msgstr "" 1146 1142 1147 - #: src/components/moderation/LabelsOnMeDialog.tsx:270 1143 + #: src/components/moderation/LabelsOnMeDialog.tsx:268 1148 1144 msgid "Appeal \"{0}\" label" 1149 1145 msgstr "" 1150 1146 1151 - #: src/components/moderation/LabelsOnMeDialog.tsx:260 1147 + #: src/components/moderation/LabelsOnMeDialog.tsx:258 1152 1148 #: src/screens/Messages/components/ChatDisabled.tsx:103 1153 1149 msgctxt "toast" 1154 1150 msgid "Appeal submitted" ··· 1225 1221 msgid "Are you sure you want to remove this from your feeds?" 1226 1222 msgstr "" 1227 1223 1228 - #: src/view/com/composer/Composer.tsx:802 1224 + #: src/view/com/composer/Composer.tsx:760 1229 1225 msgid "Are you sure you'd like to discard this draft?" 1230 1226 msgstr "" 1231 1227 1232 - #: src/view/com/composer/Composer.tsx:992 1228 + #: src/view/com/composer/Composer.tsx:950 1233 1229 msgid "Are you sure you'd like to discard this post?" 1234 1230 msgstr "" 1235 1231 ··· 1237 1233 msgid "Are you sure?" 1238 1234 msgstr "" 1239 1235 1240 - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:99 1236 + #: src/view/com/composer/select-language/SuggestedLanguage.tsx:89 1241 1237 msgid "Are you writing in <0>{suggestedLanguageName}</0>?" 1242 1238 msgstr "" 1243 1239 ··· 1278 1274 msgid "Available" 1279 1275 msgstr "" 1280 1276 1281 - #: src/components/moderation/LabelsOnMeDialog.tsx:317 1282 - #: src/components/moderation/LabelsOnMeDialog.tsx:318 1277 + #: src/components/moderation/LabelsOnMeDialog.tsx:315 1278 + #: src/components/moderation/LabelsOnMeDialog.tsx:316 1283 1279 #: src/screens/Login/ChooseAccountForm.tsx:90 1284 1280 #: src/screens/Login/ChooseAccountForm.tsx:95 1285 1281 #: src/screens/Login/ForgotPasswordForm.tsx:123 ··· 1311 1307 msgid "Before creating a post or replying, you must first verify your email." 1312 1308 msgstr "" 1313 1309 1314 - #: src/components/dialogs/StarterPackDialog.tsx:70 1310 + #: src/components/dialogs/StarterPackDialog.tsx:71 1315 1311 #: src/components/StarterPack/ProfileStarterPacks.tsx:231 1316 1312 #: src/components/StarterPack/ProfileStarterPacks.tsx:241 1317 1313 msgid "Before creating a starter pack, you must first verify your email." ··· 1562 1558 msgstr "" 1563 1559 1564 1560 #: src/components/LabelingServiceCard/index.tsx:62 1565 - #: src/components/moderation/ReportDialog/index.tsx:686 1561 + #: src/components/moderation/ReportDialog/index.tsx:683 1566 1562 #: src/screens/Search/components/StarterPackCard.tsx:106 1567 1563 #: src/screens/Search/Explore.tsx:930 1568 1564 msgid "By {0}" ··· 1630 1626 #: src/screens/Settings/Settings.tsx:289 1631 1627 #: src/screens/Takendown.tsx:108 1632 1628 #: src/screens/Takendown.tsx:111 1633 - #: src/view/com/composer/Composer.tsx:1047 1634 - #: src/view/com/composer/Composer.tsx:1058 1629 + #: src/view/com/composer/Composer.tsx:1005 1630 + #: src/view/com/composer/Composer.tsx:1016 1635 1631 #: src/view/com/composer/photos/EditImageDialog.web.tsx:43 1636 1632 #: src/view/com/composer/photos/EditImageDialog.web.tsx:52 1637 1633 #: src/view/shell/desktop/LeftNav.tsx:213 ··· 1699 1695 msgid "Change Handle" 1700 1696 msgstr "" 1701 1697 1702 - #: src/components/moderation/ReportDialog/index.tsx:328 1698 + #: src/components/moderation/ReportDialog/index.tsx:325 1703 1699 msgid "Change moderation service" 1704 1700 msgstr "" 1705 1701 ··· 1712 1708 msgid "Change password dialog" 1713 1709 msgstr "" 1714 1710 1715 - #: src/components/moderation/ReportDialog/index.tsx:247 1711 + #: src/view/com/composer/select-language/SuggestedLanguage.tsx:100 1712 + msgid "Change post language to {suggestedLanguageName}" 1713 + msgstr "" 1714 + 1715 + #: src/components/moderation/ReportDialog/index.tsx:244 1716 1716 msgid "Change report reason" 1717 1717 msgstr "" 1718 1718 ··· 1823 1823 msgid "Choose People" 1824 1824 msgstr "" 1825 1825 1826 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:184 1826 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:162 1827 1827 msgid "Choose Post Languages" 1828 1828 msgstr "" 1829 1829 1830 - #: src/screens/Onboarding/StepFinished.tsx:573 1830 + #: src/screens/Onboarding/StepFinished.tsx:575 1831 1831 msgid "Choose the algorithms that power your custom feeds." 1832 1832 msgstr "" 1833 1833 ··· 1920 1920 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:178 1921 1921 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:187 1922 1922 #: src/components/dialogs/SearchablePeopleList.tsx:295 1923 - #: src/components/dialogs/StarterPackDialog.tsx:178 1923 + #: src/components/dialogs/StarterPackDialog.tsx:179 1924 1924 #: src/components/dms/EmojiPopup.android.tsx:58 1925 1925 #: src/components/dms/ReportDialog.tsx:387 1926 1926 #: src/components/dms/ReportDialog.tsx:396 ··· 1938 1938 #: src/components/WhoCanReply.tsx:209 1939 1939 #: src/screens/Settings/components/ChangePasswordDialog.tsx:286 1940 1940 #: src/screens/Settings/components/ChangePasswordDialog.tsx:291 1941 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:335 1941 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:313 1942 1942 #: src/view/com/feeds/MissingFeed.tsx:210 1943 1943 #: src/view/com/feeds/MissingFeed.tsx:217 1944 1944 msgid "Close" ··· 1962 1962 #: src/components/dialogs/GifSelect.tsx:263 1963 1963 #: src/components/verification/VerificationsDialog.tsx:136 1964 1964 #: src/components/verification/VerifierDialog.tsx:142 1965 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:204 1966 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:298 1967 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:330 1965 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:182 1966 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:276 1967 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:308 1968 1968 msgid "Close dialog" 1969 1969 msgstr "" 1970 1970 ··· 2007 2007 msgid "Closes password update alert" 2008 2008 msgstr "" 2009 2009 2010 - #: src/view/com/composer/Composer.tsx:1055 2010 + #: src/view/com/composer/Composer.tsx:1013 2011 2011 msgid "Closes post composer and discards post draft" 2012 2012 msgstr "" 2013 2013 ··· 2053 2053 msgid "Community Guidelines" 2054 2054 msgstr "" 2055 2055 2056 - #: src/screens/Onboarding/StepFinished.tsx:472 2057 - #: src/screens/Onboarding/StepFinished.tsx:586 2056 + #: src/screens/Onboarding/StepFinished.tsx:473 2057 + #: src/screens/Onboarding/StepFinished.tsx:588 2058 2058 msgid "Complete onboarding and start using your account" 2059 2059 msgstr "" 2060 2060 ··· 2066 2066 msgid "Compose new post" 2067 2067 msgstr "" 2068 2068 2069 - #: src/view/com/composer/Composer.tsx:956 2069 + #: src/view/com/composer/Composer.tsx:914 2070 2070 msgid "Compose posts up to {0, plural, other {# characters}} in length" 2071 2071 msgstr "" 2072 2072 ··· 2074 2074 msgid "Compose reply" 2075 2075 msgstr "" 2076 2076 2077 - #: src/view/com/composer/Composer.tsx:1883 2077 + #: src/view/com/composer/Composer.tsx:1834 2078 2078 msgid "Compressing video..." 2079 2079 msgstr "" 2080 2080 ··· 2186 2186 msgid "Content Languages" 2187 2187 msgstr "" 2188 2188 2189 - #: src/components/moderation/ModerationDetailsDialog.tsx:84 2189 + #: src/components/moderation/ModerationDetailsDialog.tsx:82 2190 2190 #: src/lib/moderation/useModerationCauseDescription.ts:82 2191 2191 msgid "Content Not Available" 2192 2192 msgstr "" 2193 2193 2194 - #: src/components/moderation/ModerationDetailsDialog.tsx:52 2194 + #: src/components/moderation/ModerationDetailsDialog.tsx:50 2195 2195 #: src/components/moderation/ScreenHider.tsx:99 2196 2196 #: src/lib/moderation/useGlobalLabelStrings.ts:22 2197 2197 #: src/lib/moderation/useModerationCauseDescription.ts:45 ··· 2411 2411 2412 2412 #. Text on button to create a new starter pack 2413 2413 #. Text on button to create a new starter pack 2414 - #: src/components/dialogs/StarterPackDialog.tsx:111 2415 - #: src/components/dialogs/StarterPackDialog.tsx:200 2414 + #: src/components/dialogs/StarterPackDialog.tsx:112 2415 + #: src/components/dialogs/StarterPackDialog.tsx:201 2416 2416 #: src/components/StarterPack/ProfileStarterPacks.tsx:296 2417 2417 msgid "Create" 2418 2418 msgstr "" ··· 2478 2478 msgid "Create new account" 2479 2479 msgstr "" 2480 2480 2481 - #: src/components/moderation/ReportDialog/index.tsx:588 2481 + #: src/components/moderation/ReportDialog/index.tsx:585 2482 2482 #: src/components/ReportDialog/SelectReportOptionView.tsx:102 2483 2483 msgid "Create report for {0}" 2484 2484 msgstr "" 2485 2485 2486 - #: src/components/dialogs/StarterPackDialog.tsx:106 2487 - #: src/components/dialogs/StarterPackDialog.tsx:195 2486 + #: src/components/dialogs/StarterPackDialog.tsx:107 2487 + #: src/components/dialogs/StarterPackDialog.tsx:196 2488 2488 msgid "Create starter pack" 2489 2489 msgstr "" 2490 2490 ··· 2639 2639 2640 2640 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:685 2641 2641 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:687 2642 - #: src/view/com/composer/Composer.tsx:966 2642 + #: src/view/com/composer/Composer.tsx:924 2643 2643 msgid "Delete post" 2644 2644 msgstr "" 2645 2645 ··· 2752 2752 2753 2753 #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:92 2754 2754 #: src/screens/Profile/Header/EditProfileDialog.tsx:82 2755 - #: src/view/com/composer/Composer.tsx:804 2756 - #: src/view/com/composer/Composer.tsx:999 2755 + #: src/view/com/composer/Composer.tsx:762 2756 + #: src/view/com/composer/Composer.tsx:957 2757 2757 msgid "Discard" 2758 2758 msgstr "" 2759 2759 ··· 2762 2762 msgid "Discard changes?" 2763 2763 msgstr "" 2764 2764 2765 - #: src/view/com/composer/Composer.tsx:801 2765 + #: src/view/com/composer/Composer.tsx:759 2766 2766 msgid "Discard draft?" 2767 2767 msgstr "" 2768 2768 2769 - #: src/view/com/composer/Composer.tsx:991 2769 + #: src/view/com/composer/Composer.tsx:949 2770 2770 msgid "Discard post?" 2771 2771 msgstr "" 2772 2772 ··· 2789 2789 msgid "Dismiss" 2790 2790 msgstr "" 2791 2791 2792 - #: src/view/com/composer/Composer.tsx:1807 2792 + #: src/view/com/composer/Composer.tsx:1758 2793 2793 msgid "Dismiss error" 2794 2794 msgstr "" 2795 2795 ··· 2815 2815 msgid "Display name" 2816 2816 msgstr "" 2817 2817 2818 - #: src/screens/Onboarding/StepFinished.tsx:346 2818 + #: src/screens/Onboarding/StepFinished.tsx:347 2819 2819 msgid "Ditch the trolls and clickbait. Find real people and conversations that matter to you." 2820 2820 msgstr "" 2821 2821 ··· 2868 2868 #: src/view/com/auth/server-input/index.tsx:233 2869 2869 #: src/view/com/composer/labels/LabelsBtn.tsx:223 2870 2870 #: src/view/com/composer/labels/LabelsBtn.tsx:230 2871 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:303 2871 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:281 2872 2872 #: src/view/com/composer/videos/SubtitleDialog.tsx:168 2873 2873 #: src/view/com/composer/videos/SubtitleDialog.tsx:178 2874 2874 msgid "Done" ··· 3055 3055 msgid "Email 2FA disabled" 3056 3056 msgstr "" 3057 3057 3058 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:62 3058 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:63 3059 3059 msgid "Email 2FA enabled" 3060 3060 msgstr "" 3061 3061 ··· 3126 3126 msgstr "" 3127 3127 3128 3128 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:139 3129 - #: src/view/screens/Storybook/Admonitions.tsx:75 3130 3129 msgid "Enable notifications for an account by visiting their profile and pressing the <0>bell icon</0> <1/>." 3131 3130 msgstr "" 3132 3131 ··· 3223 3222 msgid "Entertainment" 3224 3223 msgstr "" 3225 3224 3226 - #: src/view/com/composer/Composer.tsx:1892 3225 + #: src/view/com/composer/Composer.tsx:1843 3227 3226 #: src/view/com/util/error/ErrorScreen.tsx:42 3228 3227 msgid "Error" 3229 3228 msgstr "" ··· 3232 3231 msgid "Error loading post" 3233 3232 msgstr "" 3234 3233 3235 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:153 3234 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:154 3236 3235 msgid "Error loading preference" 3237 3236 msgstr "" 3238 3237 ··· 3346 3345 msgid "Expires {0}" 3347 3346 msgstr "" 3348 3347 3349 - #: src/components/moderation/LabelsOnMeDialog.tsx:201 3350 - #: src/components/moderation/ModerationDetailsDialog.tsx:210 3348 + #: src/components/moderation/LabelsOnMeDialog.tsx:199 3349 + #: src/components/moderation/ModerationDetailsDialog.tsx:208 3351 3350 msgid "Expires in {0}" 3352 3351 msgstr "" 3353 3352 ··· 3415 3414 msgid "Failed to add emoji reaction" 3416 3415 msgstr "" 3417 3416 3418 - #: src/components/dialogs/StarterPackDialog.tsx:269 3417 + #: src/components/dialogs/StarterPackDialog.tsx:270 3419 3418 msgid "Failed to add to starter pack" 3420 3419 msgstr "" 3421 3420 ··· 3521 3520 msgid "Failed to remove emoji reaction" 3522 3521 msgstr "" 3523 3522 3524 - #: src/components/dialogs/StarterPackDialog.tsx:288 3523 + #: src/components/dialogs/StarterPackDialog.tsx:289 3525 3524 msgid "Failed to remove from starter pack" 3526 3525 msgstr "" 3527 3526 ··· 3555 3554 msgid "Failed to send email, please try again." 3556 3555 msgstr "" 3557 3556 3558 - #: src/components/moderation/LabelsOnMeDialog.tsx:256 3557 + #: src/components/moderation/LabelsOnMeDialog.tsx:254 3559 3558 #: src/screens/Messages/components/ChatDisabled.tsx:99 3560 3559 msgid "Failed to submit appeal, please try again." 3561 3560 msgstr "" ··· 3698 3697 msgid "Filter who you receive notifications from" 3699 3698 msgstr "" 3700 3699 3701 - #: src/screens/Onboarding/StepFinished.tsx:478 3702 - #: src/screens/Onboarding/StepFinished.tsx:589 3700 + #: src/screens/Onboarding/StepFinished.tsx:479 3701 + #: src/screens/Onboarding/StepFinished.tsx:591 3703 3702 msgid "Finalizing" 3704 3703 msgstr "" 3705 3704 ··· 3719 3718 msgid "Find people to follow" 3720 3719 msgstr "" 3721 3720 3722 - #: src/screens/Search/Shell.tsx:475 3721 + #: src/screens/Search/Shell.tsx:476 3723 3722 msgid "Find posts, users, and feeds on Bluesky" 3724 3723 msgstr "" 3725 3724 3726 - #: src/screens/Onboarding/StepFinished.tsx:344 3725 + #: src/screens/Onboarding/StepFinished.tsx:345 3727 3726 msgid "Find your people" 3728 3727 msgstr "" 3729 3728 ··· 3750 3749 msgid "Flat White" 3751 3750 msgstr "" 3752 3751 3753 - #: src/screens/Onboarding/StepFinished.tsx:569 3752 + #: src/screens/Onboarding/StepFinished.tsx:571 3754 3753 msgid "Flexible" 3755 3754 msgstr "" 3756 3755 ··· 3924 3923 msgid "Forever" 3925 3924 msgstr "" 3926 3925 3927 - #: src/screens/Onboarding/StepFinished.tsx:353 3926 + #: src/screens/Onboarding/StepFinished.tsx:354 3928 3927 msgid "Forget the noise" 3929 3928 msgstr "" 3930 3929 ··· 3941 3940 msgid "Forgot?" 3942 3941 msgstr "" 3943 3942 3944 - #: src/screens/Onboarding/StepFinished.tsx:335 3943 + #: src/screens/Onboarding/StepFinished.tsx:336 3945 3944 msgid "Free your feed" 3946 3945 msgstr "" 3947 3946 ··· 4419 4418 msgstr "" 4420 4419 4421 4420 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:157 4422 - #: src/view/screens/Storybook/Admonitions.tsx:89 4423 4421 msgid "If you want to restrict who can receive notifications for your account's activity, you can change this in <0>Settings โ†’ Privacy and Security</0>." 4424 4422 msgstr "" 4425 4423 ··· 4598 4596 msgid "It's just you right now! Add more people to your starter pack by searching above." 4599 4597 msgstr "" 4600 4598 4601 - #: src/view/com/composer/Composer.tsx:1826 4599 + #: src/view/com/composer/Composer.tsx:1777 4602 4600 msgid "Job ID: {0}" 4603 4601 msgstr "" 4604 4602 ··· 4662 4660 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." 4663 4661 msgstr "" 4664 4662 4665 - #: src/components/moderation/LabelsOnMeDialog.tsx:74 4663 + #: src/components/moderation/LabelsOnMeDialog.tsx:72 4666 4664 msgid "Labels on your account" 4667 4665 msgstr "" 4668 4666 4669 - #: src/components/moderation/LabelsOnMeDialog.tsx:76 4667 + #: src/components/moderation/LabelsOnMeDialog.tsx:74 4670 4668 msgid "Labels on your content" 4671 4669 msgstr "" 4672 4670 ··· 4748 4746 msgid "Learn more about verification on Bluesky" 4749 4747 msgstr "" 4750 4748 4751 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:127 4752 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:130 4749 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:128 4750 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:131 4753 4751 msgid "Learn more about what is public on Bluesky." 4754 4752 msgstr "" 4755 4753 ··· 4801 4799 msgid "Let's get your password reset!" 4802 4800 msgstr "" 4803 4801 4804 - #: src/screens/Onboarding/StepFinished.tsx:480 4805 - #: src/screens/Onboarding/StepFinished.tsx:589 4802 + #: src/screens/Onboarding/StepFinished.tsx:481 4803 + #: src/screens/Onboarding/StepFinished.tsx:591 4806 4804 msgid "Let's go!" 4807 4805 msgstr "" 4808 4806 ··· 4854 4852 4855 4853 #: src/screens/Post/PostLikedBy.tsx:41 4856 4854 #: src/screens/Profile/ProfileLabelerLikedBy.tsx:32 4857 - #: src/view/screens/ProfileFeedLikedBy.tsx:32 4855 + #: src/view/screens/ProfileFeedLikedBy.tsx:34 4858 4856 msgid "Liked By" 4859 4857 msgstr "" 4860 4858 ··· 5033 5031 msgid "Log" 5034 5032 msgstr "" 5035 5033 5036 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:106 5034 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:107 5037 5035 msgid "Logged-out visibility" 5038 5036 msgstr "" 5039 5037 ··· 5207 5205 msgid "Moderation" 5208 5206 msgstr "" 5209 5207 5210 - #: src/components/moderation/ModerationDetailsDialog.tsx:140 5208 + #: src/components/moderation/ModerationDetailsDialog.tsx:138 5211 5209 msgid "Moderation details" 5212 5210 msgstr "" 5213 5211 ··· 5256 5254 msgid "Moderation tools" 5257 5255 msgstr "" 5258 5256 5259 - #: src/components/moderation/ModerationDetailsDialog.tsx:54 5257 + #: src/components/moderation/ModerationDetailsDialog.tsx:52 5260 5258 #: src/lib/moderation/useModerationCauseDescription.ts:47 5261 5259 msgid "Moderator has chosen to set a general warning on the content." 5262 5260 msgstr "" ··· 5266 5264 msgid "More feeds" 5267 5265 msgstr "" 5268 5266 5269 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:87 5270 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:90 5267 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:70 5268 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:73 5271 5269 msgid "More languages..." 5272 5270 msgstr "" 5273 5271 ··· 5372 5370 msgstr "" 5373 5371 5374 5372 #: src/Navigation.tsx:187 5375 - #: src/view/screens/ModerationMutedAccounts.tsx:116 5373 + #: src/view/screens/ModerationMutedAccounts.tsx:118 5376 5374 msgid "Muted Accounts" 5377 5375 msgstr "" 5378 5376 5379 - #: src/view/screens/ModerationMutedAccounts.tsx:202 5377 + #: src/view/screens/ModerationMutedAccounts.tsx:204 5380 5378 msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." 5381 5379 msgstr "" 5382 5380 ··· 5439 5437 msgid "Navigates to your profile" 5440 5438 msgstr "" 5441 5439 5442 - #: src/components/moderation/ReportDialog/index.tsx:274 5443 - #: src/components/moderation/ReportDialog/index.tsx:291 5440 + #: src/components/moderation/ReportDialog/index.tsx:271 5441 + #: src/components/moderation/ReportDialog/index.tsx:288 5444 5442 msgid "Need to report a copyright violation, legal request, or regulatory compliance issue?" 5445 5443 msgstr "" 5446 5444 ··· 5448 5446 msgid "Need to report a copyright violation?" 5449 5447 msgstr "" 5450 5448 5451 - #: src/screens/Onboarding/StepFinished.tsx:557 5449 + #: src/screens/Onboarding/StepFinished.tsx:559 5452 5450 msgid "Never lose access to your followers or data." 5453 5451 msgstr "" 5454 5452 ··· 5548 5546 msgid "New posts from {firstAuthorName} and {additionalAuthorsCount, plural, one {{formattedAuthorsCount} other} other {{formattedAuthorsCount} others}}" 5549 5547 msgstr "" 5550 5548 5551 - #: src/components/dialogs/StarterPackDialog.tsx:192 5549 + #: src/components/dialogs/StarterPackDialog.tsx:193 5552 5550 msgid "New starter pack" 5553 5551 msgstr "" 5554 5552 ··· 5575 5573 #: src/screens/Login/LoginForm.tsx:350 5576 5574 #: src/screens/Login/SetNewPasswordForm.tsx:182 5577 5575 #: src/screens/Login/SetNewPasswordForm.tsx:188 5578 - #: src/screens/Onboarding/StepFinished.tsx:473 5579 - #: src/screens/Onboarding/StepFinished.tsx:482 5576 + #: src/screens/Onboarding/StepFinished.tsx:474 5577 + #: src/screens/Onboarding/StepFinished.tsx:483 5580 5578 #: src/screens/Settings/components/AddAppPasswordDialog.tsx:157 5581 5579 #: src/screens/Settings/components/AddAppPasswordDialog.tsx:165 5582 5580 #: src/screens/Signup/BackNextButtons.tsx:67 ··· 5596 5594 msgid "Next image" 5597 5595 msgstr "" 5598 5596 5599 - #: src/screens/Onboarding/StepFinished.tsx:355 5597 + #: src/screens/Onboarding/StepFinished.tsx:356 5600 5598 msgid "No ads, no invasive tracking, no engagement traps. Bluesky respects your time and attention." 5601 5599 msgstr "" 5602 5600 ··· 5639 5637 msgid "No messages yet" 5640 5638 msgstr "" 5641 5639 5642 - #: src/screens/Onboarding/StepFinished.tsx:337 5640 + #: src/screens/Onboarding/StepFinished.tsx:338 5643 5641 msgid "No more doomscrolling junk-filled algorithms. Find feeds that work for you, not against you." 5644 5642 msgstr "" 5645 5643 ··· 5651 5649 #: src/screens/Messages/Settings.tsx:109 5652 5650 #: src/screens/Settings/ActivityPrivacySettings.tsx:129 5653 5651 #: src/screens/Settings/ActivityPrivacySettings.tsx:134 5654 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:159 5652 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:160 5655 5653 msgid "No one" 5656 5654 msgstr "" 5657 5655 ··· 5762 5760 msgid "Note about sharing" 5763 5761 msgstr "" 5764 5762 5765 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:116 5763 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:117 5766 5764 msgid "Note: Bluesky is an open and public network. This setting only limits the visibility of your content on the Bluesky app and website, and other apps may not respect this setting. Your content may still be shown to logged-out users by other apps and websites." 5767 5765 msgstr "" 5768 5766 ··· 5843 5841 msgstr "" 5844 5842 5845 5843 #: src/components/dialogs/GifSelect.tsx:256 5846 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:323 5844 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:301 5847 5845 #: src/view/com/util/ErrorBoundary.tsx:57 5848 5846 msgid "Oh no!" 5849 5847 msgstr "" ··· 5880 5878 msgid "Onboarding reset" 5881 5879 msgstr "" 5882 5880 5883 - #: src/view/com/composer/Composer.tsx:398 5881 + #: src/view/com/composer/Composer.tsx:359 5884 5882 msgid "One or more GIFs is missing alt text." 5885 5883 msgstr "" 5886 5884 5887 - #: src/view/com/composer/Composer.tsx:395 5885 + #: src/view/com/composer/Composer.tsx:356 5888 5886 msgid "One or more images is missing alt text." 5889 5887 msgstr "" 5890 5888 ··· 5896 5894 msgid "One or more of your selected files are too large. Maximum size is 100ย MB." 5897 5895 msgstr "" 5898 5896 5899 - #: src/view/com/composer/Composer.tsx:405 5897 + #: src/view/com/composer/Composer.tsx:366 5900 5898 msgid "One or more videos is missing alt text." 5901 5899 msgstr "" 5902 5900 ··· 5910 5908 5911 5909 #: src/screens/Settings/ActivityPrivacySettings.tsx:120 5912 5910 #: src/screens/Settings/ActivityPrivacySettings.tsx:125 5913 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:157 5911 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:158 5914 5912 msgid "Only followers who I follow" 5915 5913 msgstr "" 5916 5914 ··· 5935 5933 msgid "Oops!" 5936 5934 msgstr "" 5937 5935 5938 - #: src/screens/Onboarding/StepFinished.tsx:553 5936 + #: src/screens/Onboarding/StepFinished.tsx:555 5939 5937 msgid "Open" 5940 5938 msgstr "" 5941 5939 ··· 5953 5951 msgstr "" 5954 5952 5955 5953 #: src/screens/Messages/components/MessageInput.web.tsx:181 5956 - #: src/view/com/composer/Composer.tsx:1475 5954 + #: src/view/com/composer/Composer.tsx:1429 5957 5955 msgid "Open emoji picker" 5958 5956 msgstr "" 5959 5957 ··· 6053 6051 msgid "Opens device gallery to select up to {MAX_IMAGES, plural, other {# images}}, or a single video or GIF." 6054 6052 msgstr "" 6055 6053 6056 - #: src/view/com/composer/Composer.tsx:1476 6054 + #: src/view/com/composer/Composer.tsx:1430 6057 6055 msgid "Opens emoji picker" 6058 6056 msgstr "" 6059 6057 ··· 6087 6085 msgid "Opens password reset form" 6088 6086 msgstr "" 6089 6087 6090 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:129 6088 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:103 6091 6089 msgid "Opens post language settings" 6092 6090 msgstr "" 6093 6091 ··· 6413 6411 msgid "Please enter your username" 6414 6412 msgstr "" 6415 6413 6416 - #: src/components/moderation/LabelsOnMeDialog.tsx:292 6414 + #: src/components/moderation/LabelsOnMeDialog.tsx:290 6417 6415 msgid "Please explain why you think this label was incorrectly applied by {0}" 6418 6416 msgstr "" 6419 6417 ··· 6465 6463 msgid "Porn" 6466 6464 msgstr "" 6467 6465 6468 - #: src/screens/PostThread/index.tsx:503 6466 + #: src/screens/PostThread/index.tsx:502 6469 6467 msgctxt "description" 6470 6468 msgid "Post" 6471 6469 msgstr "" 6472 6470 6473 - #: src/view/com/composer/Composer.tsx:1118 6471 + #: src/view/com/composer/Composer.tsx:1076 6474 6472 msgctxt "action" 6475 6473 msgid "Post" 6476 6474 msgstr "" 6477 6475 6478 - #: src/view/com/composer/Composer.tsx:1116 6476 + #: src/view/com/composer/Composer.tsx:1074 6479 6477 msgctxt "action" 6480 6478 msgid "Post All" 6481 6479 msgstr "" ··· 6507 6505 msgid "Post has been deleted" 6508 6506 msgstr "" 6509 6507 6510 - #: src/components/moderation/ModerationDetailsDialog.tsx:109 6508 + #: src/components/moderation/ModerationDetailsDialog.tsx:107 6511 6509 #: src/lib/moderation/useModerationCauseDescription.ts:106 6512 6510 msgid "Post Hidden by Muted Word" 6513 6511 msgstr "" 6514 6512 6515 - #: src/components/moderation/ModerationDetailsDialog.tsx:112 6513 + #: src/components/moderation/ModerationDetailsDialog.tsx:110 6516 6514 #: src/lib/moderation/useModerationCauseDescription.ts:115 6517 6515 msgid "Post Hidden by You" 6518 6516 msgstr "" ··· 6527 6525 msgstr "" 6528 6526 6529 6527 #. Accessibility label for button that opens dialog to choose post language settings 6530 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:124 6528 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:98 6531 6529 msgid "Post language selection" 6532 6530 msgstr "" 6533 6531 ··· 6620 6618 #: src/Navigation.tsx:407 6621 6619 #: src/Navigation.tsx:415 6622 6620 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 6623 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:44 6621 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:45 6624 6622 msgid "Privacy and Security" 6625 6623 msgstr "" 6626 6624 6627 6625 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:161 6628 - #: src/view/screens/Storybook/Admonitions.tsx:93 6629 6626 msgid "Privacy and Security settings" 6630 6627 msgstr "" 6631 6628 ··· 6640 6637 msgid "Privacy Policy" 6641 6638 msgstr "" 6642 6639 6643 - #: src/view/com/composer/Composer.tsx:1889 6640 + #: src/view/com/composer/Composer.tsx:1840 6644 6641 msgid "Processing video..." 6645 6642 msgstr "" 6646 6643 ··· 6666 6663 msgid "Profile updated" 6667 6664 msgstr "" 6668 6665 6669 - #: src/screens/Onboarding/StepFinished.tsx:539 6666 + #: src/screens/Onboarding/StepFinished.tsx:541 6670 6667 msgid "Public" 6671 6668 msgstr "" 6672 6669 ··· 6679 6676 msgstr "" 6680 6677 6681 6678 #. Accessibility label for button to publish a single post 6682 - #: src/view/com/composer/Composer.tsx:1098 6679 + #: src/view/com/composer/Composer.tsx:1056 6683 6680 msgid "Publish post" 6684 6681 msgstr "" 6685 6682 6686 6683 #. Accessibility label for button to publish multiple posts in a thread 6687 - #: src/view/com/composer/Composer.tsx:1091 6684 + #: src/view/com/composer/Composer.tsx:1049 6688 6685 msgid "Publish posts" 6689 6686 msgstr "" 6690 6687 6691 6688 #. Accessibility label for button to publish multiple replies in a thread 6692 - #: src/view/com/composer/Composer.tsx:1076 6689 + #: src/view/com/composer/Composer.tsx:1034 6693 6690 msgid "Publish replies" 6694 6691 msgstr "" 6695 6692 6696 6693 #. Accessibility label for button to publish a single reply 6697 - #: src/view/com/composer/Composer.tsx:1083 6694 + #: src/view/com/composer/Composer.tsx:1041 6698 6695 msgid "Publish reply" 6699 6696 msgstr "" 6700 6697 ··· 6853 6850 msgid "Recent Searches" 6854 6851 msgstr "" 6855 6852 6856 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:232 6853 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:210 6857 6854 msgid "Recently used" 6858 6855 msgstr "" 6859 6856 ··· 6881 6878 6882 6879 #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:171 6883 6880 #: src/components/dialogs/MutedWords.tsx:443 6884 - #: src/components/dialogs/StarterPackDialog.tsx:370 6885 - #: src/components/dialogs/StarterPackDialog.tsx:376 6881 + #: src/components/dialogs/StarterPackDialog.tsx:371 6882 + #: src/components/dialogs/StarterPackDialog.tsx:377 6886 6883 #: src/components/FeedCard.tsx:343 6887 6884 #: src/components/StarterPack/Wizard/WizardListCard.tsx:104 6888 6885 #: src/components/StarterPack/Wizard/WizardListCard.tsx:111 ··· 7027 7024 msgid "Removed from saved posts" 7028 7025 msgstr "" 7029 7026 7030 - #: src/components/dialogs/StarterPackDialog.tsx:276 7027 + #: src/components/dialogs/StarterPackDialog.tsx:277 7031 7028 msgid "Removed from starter pack" 7032 7029 msgstr "" 7033 7030 ··· 7084 7081 msgid "Replies to this post are disabled." 7085 7082 msgstr "" 7086 7083 7087 - #: src/view/com/composer/Composer.tsx:1114 7084 + #: src/view/com/composer/Composer.tsx:1072 7088 7085 msgctxt "action" 7089 7086 msgid "Reply" 7090 7087 msgstr "" ··· 7094 7091 msgid "Reply ({0, plural, one {# reply} other {# replies}})" 7095 7092 msgstr "" 7096 7093 7097 - #: src/components/moderation/ModerationDetailsDialog.tsx:118 7094 + #: src/components/moderation/ModerationDetailsDialog.tsx:116 7098 7095 #: src/lib/moderation/useModerationCauseDescription.ts:125 7099 7096 msgid "Reply Hidden by Thread Author" 7100 7097 msgstr "" 7101 7098 7102 - #: src/components/moderation/ModerationDetailsDialog.tsx:117 7099 + #: src/components/moderation/ModerationDetailsDialog.tsx:115 7103 7100 #: src/lib/moderation/useModerationCauseDescription.ts:124 7104 7101 msgid "Reply Hidden by You" 7105 7102 msgstr "" ··· 7348 7345 #: src/components/dms/MessageItem.tsx:322 7349 7346 #: src/components/Error.tsx:65 7350 7347 #: src/components/Lists.tsx:110 7351 - #: src/components/moderation/ReportDialog/index.tsx:232 7348 + #: src/components/moderation/ReportDialog/index.tsx:229 7352 7349 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:55 7353 7350 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:58 7354 7351 #: src/components/StarterPack/ProfileStarterPacks.tsx:342 ··· 7366 7363 #: src/screens/Signup/BackNextButtons.tsx:53 7367 7364 #: src/view/com/util/error/ErrorMessage.tsx:60 7368 7365 #: src/view/com/util/error/ErrorScreen.tsx:97 7369 - #: src/view/screens/Storybook/Admonitions.tsx:63 7370 7366 msgid "Retry" 7371 7367 msgstr "" 7372 7368 7373 - #: src/components/moderation/ReportDialog/index.tsx:229 7374 - #: src/view/screens/Storybook/Admonitions.tsx:60 7369 + #: src/components/moderation/ReportDialog/index.tsx:226 7375 7370 msgid "Retry loading report options" 7376 7371 msgstr "" 7377 7372 ··· 7501 7496 #: src/components/forms/SearchInput.tsx:34 7502 7497 #: src/components/forms/SearchInput.tsx:36 7503 7498 #: src/screens/Search/Shell.tsx:307 7504 - #: src/screens/Search/Shell.tsx:463 7499 + #: src/screens/Search/Shell.tsx:464 7505 7500 #: src/view/shell/bottom-bar/BottomBar.tsx:198 7506 7501 msgid "Search" 7507 7502 msgstr "" ··· 7561 7556 msgid "Search is currently unavailable when logged out" 7562 7557 msgstr "" 7563 7558 7564 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:215 7565 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:216 7559 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:193 7560 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:194 7566 7561 msgid "Search languages" 7567 7562 msgstr "" 7568 7563 ··· 7644 7639 msgid "Select {0}" 7645 7640 msgstr "" 7646 7641 7647 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:72 7642 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:58 7648 7643 msgid "Select {langName}" 7649 7644 msgstr "" 7650 7645 ··· 7710 7705 msgstr "" 7711 7706 7712 7707 #: src/screens/Settings/LanguageSettings.tsx:178 7713 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:248 7708 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:226 7714 7709 msgid "Select languages" 7715 7710 msgstr "" 7716 7711 7717 - #: src/components/moderation/ReportDialog/index.tsx:313 7712 + #: src/components/moderation/ReportDialog/index.tsx:310 7718 7713 msgid "Select moderation service" 7719 7714 msgstr "" 7720 7715 ··· 7722 7717 msgid "Select moderator" 7723 7718 msgstr "" 7724 7719 7725 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:57 7720 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:45 7726 7721 msgid "Select post language" 7727 7722 msgstr "" 7728 7723 ··· 7743 7738 msgid "Select the moderation service(s) to report to" 7744 7739 msgstr "" 7745 7740 7746 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:194 7741 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:172 7747 7742 msgid "Select up to 3 languages used in this post" 7748 7743 msgstr "" 7749 7744 ··· 7805 7800 msgid "Send message" 7806 7801 msgstr "" 7807 7802 7808 - #: src/components/PostControls/ShareMenu/RecentChats.tsx:122 7803 + #: src/components/PostControls/ShareMenu/RecentChats.tsx:123 7809 7804 msgid "Send post to {name}" 7810 7805 msgstr "" 7811 7806 ··· 7824 7819 msgid "Send report to {0}" 7825 7820 msgstr "" 7826 7821 7827 - #: src/components/moderation/ReportDialog/index.tsx:652 7822 + #: src/components/moderation/ReportDialog/index.tsx:649 7828 7823 msgid "Send report to {title}" 7829 7824 msgstr "" 7830 7825 ··· 7880 7875 msgid "Settings for activity from others" 7881 7876 msgstr "" 7882 7877 7883 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:84 7878 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:85 7884 7879 msgid "Settings for allowing others to be notified of your posts" 7885 7880 msgstr "" 7886 7881 ··· 8211 8206 msgid "Similar accounts" 8212 8207 msgstr "" 8213 8208 8214 - #: src/screens/Onboarding/StepFinished.tsx:379 8215 - #: src/screens/Onboarding/StepFinished.tsx:461 8209 + #: src/screens/Onboarding/StepFinished.tsx:380 8210 + #: src/screens/Onboarding/StepFinished.tsx:462 8216 8211 #: src/screens/Onboarding/StepInterests/index.tsx:240 8217 8212 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:222 8218 8213 #: src/screens/StarterPack/Wizard/index.tsx:218 8219 8214 msgid "Skip" 8220 8215 msgstr "" 8221 8216 8222 - #: src/screens/Onboarding/StepFinished.tsx:372 8223 - #: src/screens/Onboarding/StepFinished.tsx:458 8217 + #: src/screens/Onboarding/StepFinished.tsx:373 8218 + #: src/screens/Onboarding/StepFinished.tsx:459 8224 8219 msgid "Skip introduction and start using your account" 8225 8220 msgstr "" 8226 8221 ··· 8275 8270 msgstr "" 8276 8271 8277 8272 #: src/components/ageAssurance/AgeAssuranceInitDialog.tsx:138 8278 - #: src/components/moderation/ReportDialog/index.tsx:224 8273 + #: src/components/moderation/ReportDialog/index.tsx:223 8279 8274 #: src/screens/Deactivated.tsx:94 8280 8275 #: src/screens/Settings/components/DeactivateAccountDialog.tsx:59 8281 - #: src/view/screens/Storybook/Admonitions.tsx:55 8282 8276 msgid "Something went wrong, please try again" 8283 8277 msgstr "" 8284 8278 ··· 8304 8298 msgid "Something wrong? Let us know." 8305 8299 msgstr "" 8306 8300 8307 - #: src/App.native.tsx:128 8308 - #: src/App.web.tsx:100 8301 + #: src/App.native.tsx:125 8302 + #: src/App.web.tsx:101 8309 8303 msgid "Sorry! Your session expired. Please sign in again." 8310 8304 msgstr "" 8311 8305 ··· 8321 8315 msgid "Sort replies to the same post by:" 8322 8316 msgstr "" 8323 8317 8324 - #: src/components/moderation/LabelsOnMeDialog.tsx:180 8325 - #: src/components/moderation/ModerationDetailsDialog.tsx:188 8318 + #: src/components/moderation/LabelsOnMeDialog.tsx:178 8319 + #: src/components/moderation/ModerationDetailsDialog.tsx:186 8326 8320 msgid "Source: <0>{sourceName}</0>" 8327 8321 msgstr "" 8328 8322 ··· 8344 8338 msgid "Sports" 8345 8339 msgstr "" 8346 8340 8347 - #: src/components/PostControls/ShareMenu/RecentChats.tsx:207 8341 + #: src/components/PostControls/ShareMenu/RecentChats.tsx:208 8348 8342 msgid "Start a conversation, and it will appear here." 8349 8343 msgstr "" 8350 8344 ··· 8418 8412 8419 8413 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:117 8420 8414 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:123 8421 - #: src/components/moderation/LabelsOnMeDialog.tsx:326 8422 - #: src/components/moderation/LabelsOnMeDialog.tsx:327 8415 + #: src/components/moderation/LabelsOnMeDialog.tsx:324 8416 + #: src/components/moderation/LabelsOnMeDialog.tsx:325 8423 8417 #: src/screens/Messages/components/ChatDisabled.tsx:154 8424 8418 #: src/screens/Messages/components/ChatDisabled.tsx:155 8425 8419 msgid "Submit" ··· 8433 8427 msgid "Submit Appeal" 8434 8428 msgstr "" 8435 8429 8436 - #: src/components/moderation/ReportDialog/index.tsx:390 8437 - #: src/components/moderation/ReportDialog/index.tsx:447 8438 - #: src/components/moderation/ReportDialog/index.tsx:454 8430 + #: src/components/moderation/ReportDialog/index.tsx:387 8431 + #: src/components/moderation/ReportDialog/index.tsx:444 8432 + #: src/components/moderation/ReportDialog/index.tsx:451 8439 8433 msgid "Submit report" 8440 8434 msgstr "" 8441 8435 ··· 8636 8630 msgid "Text field" 8637 8631 msgstr "" 8638 8632 8639 - #: src/components/moderation/LabelsOnMeDialog.tsx:290 8633 + #: src/components/moderation/LabelsOnMeDialog.tsx:288 8640 8634 #: src/screens/Messages/components/ChatDisabled.tsx:120 8641 8635 msgid "Text input field" 8642 8636 msgstr "" ··· 8693 8687 msgid "The app will be restarted" 8694 8688 msgstr "" 8695 8689 8696 - #: src/components/moderation/ModerationDetailsDialog.tsx:121 8690 + #: src/components/moderation/ModerationDetailsDialog.tsx:119 8697 8691 #: src/lib/moderation/useModerationCauseDescription.ts:128 8698 8692 msgid "The author of this thread has hidden this reply." 8699 8693 msgstr "" ··· 8730 8724 msgid "The feed has been replaced with Discover." 8731 8725 msgstr "" 8732 8726 8733 - #: src/components/moderation/LabelsOnMeDialog.tsx:61 8727 + #: src/components/moderation/LabelsOnMeDialog.tsx:59 8734 8728 msgid "The following labels were applied to your account." 8735 8729 msgstr "" 8736 8730 8737 - #: src/components/moderation/LabelsOnMeDialog.tsx:62 8731 + #: src/components/moderation/LabelsOnMeDialog.tsx:60 8738 8732 msgid "The following labels were applied to your content." 8739 8733 msgstr "" 8740 8734 ··· 8754 8748 msgid "The open social network." 8755 8749 msgstr "" 8756 8750 8757 - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:119 8758 - msgid "The post you're replying to was marked as being written in {suggestedLanguageName} by its author. Would you like to reply in <0>{suggestedLanguageName}</0>?" 8759 - msgstr "" 8760 - 8761 8751 #: src/view/screens/PrivacyPolicy.tsx:38 8762 8752 msgid "The Privacy Policy has been moved to <0/>" 8763 8753 msgstr "" ··· 8888 8878 msgstr "" 8889 8879 8890 8880 #: src/components/dialogs/GifSelect.tsx:258 8891 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:325 8881 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:303 8892 8882 #: src/view/com/util/ErrorBoundary.tsx:59 8893 8883 msgid "There was an unexpected issue in the application. Please let us know if this happened to you!" 8894 8884 msgstr "" ··· 8925 8915 msgid "This action can be undone at any time." 8926 8916 msgstr "" 8927 8917 8928 - #: src/components/moderation/LabelsOnMeDialog.tsx:273 8918 + #: src/components/moderation/LabelsOnMeDialog.tsx:271 8929 8919 msgid "This appeal will be sent to <0>{sourceName}</0>." 8930 8920 msgstr "" 8931 8921 ··· 8953 8943 msgid "This content is hosted by {0}. Do you want to enable external media?" 8954 8944 msgstr "" 8955 8945 8956 - #: src/components/moderation/ModerationDetailsDialog.tsx:86 8946 + #: src/components/moderation/ModerationDetailsDialog.tsx:84 8957 8947 #: src/lib/moderation/useModerationCauseDescription.ts:84 8958 8948 msgid "This content is not available because one of the users involved has blocked the other." 8959 8949 msgstr "" ··· 9017 9007 msgid "This is not a valid link" 9018 9008 msgstr "" 9019 9009 9020 - #: src/components/moderation/ModerationDetailsDialog.tsx:170 9010 + #: src/components/moderation/ModerationDetailsDialog.tsx:168 9021 9011 msgid "This label was applied by the author." 9022 9012 msgstr "" 9023 9013 9024 - #: src/components/moderation/LabelsOnMeDialog.tsx:167 9014 + #: src/components/moderation/LabelsOnMeDialog.tsx:165 9025 9015 msgid "This label was applied by you." 9026 9016 msgstr "" 9027 9017 ··· 9069 9059 msgid "This post will be hidden from feeds and threads. This cannot be undone." 9070 9060 msgstr "" 9071 9061 9072 - #: src/view/com/composer/Composer.tsx:514 9062 + #: src/view/com/composer/Composer.tsx:475 9073 9063 msgid "This post's author has disabled quote posts." 9074 9064 msgstr "" 9075 9065 ··· 9105 9095 msgid "This user has blocked you" 9106 9096 msgstr "" 9107 9097 9108 - #: src/components/moderation/ModerationDetailsDialog.tsx:81 9098 + #: src/components/moderation/ModerationDetailsDialog.tsx:79 9109 9099 #: src/lib/moderation/useModerationCauseDescription.ts:75 9110 9100 msgid "This user has blocked you. You cannot view their content." 9111 9101 msgstr "" ··· 9114 9104 msgid "This user has requested that their content only be shown to signed-in users." 9115 9105 msgstr "" 9116 9106 9117 - #: src/components/moderation/ModerationDetailsDialog.tsx:61 9107 + #: src/components/moderation/ModerationDetailsDialog.tsx:59 9118 9108 msgid "This user is included in the <0>{0}</0> list which you have blocked." 9119 9109 msgstr "" 9120 9110 9121 - #: src/components/moderation/ModerationDetailsDialog.tsx:93 9111 + #: src/components/moderation/ModerationDetailsDialog.tsx:91 9122 9112 msgid "This user is included in the <0>{0}</0> list which you have muted." 9123 9113 msgstr "" 9124 9114 ··· 9250 9240 msgid "TV" 9251 9241 msgstr "" 9252 9242 9253 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:64 9243 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:65 9254 9244 msgid "Two-factor authentication (2FA)" 9255 9245 msgstr "" 9256 9246 ··· 9375 9365 msgid "Unfortunately, Bluesky is unavailable in Mississippi right now." 9376 9366 msgstr "" 9377 9367 9378 - #: src/components/moderation/ReportDialog/index.tsx:375 9368 + #: src/components/moderation/ReportDialog/index.tsx:372 9379 9369 msgid "Unfortunately, none of your subscribed labelers supports this report type." 9380 9370 msgstr "" 9381 9371 ··· 9497 9487 msgid "Unsubscribed from list" 9498 9488 msgstr "" 9499 9489 9500 - #: src/view/com/composer/Composer.tsx:894 9490 + #: src/view/com/composer/Composer.tsx:852 9501 9491 msgid "Unsupported video type: {mimeType}" 9502 9492 msgstr "" 9503 9493 ··· 9583 9573 msgid "Uploading link thumbnail..." 9584 9574 msgstr "" 9585 9575 9586 - #: src/view/com/composer/Composer.tsx:1886 9576 + #: src/view/com/composer/Composer.tsx:1837 9587 9577 msgid "Uploading video..." 9588 9578 msgstr "" 9589 9579 ··· 9627 9617 msgid "User blocked" 9628 9618 msgstr "" 9629 9619 9630 - #: src/components/moderation/ModerationDetailsDialog.tsx:73 9620 + #: src/components/moderation/ModerationDetailsDialog.tsx:71 9631 9621 #: src/lib/moderation/useModerationCauseDescription.ts:63 9632 9622 msgid "User Blocked" 9633 9623 msgstr "" ··· 9640 9630 msgid "User blocked by list" 9641 9631 msgstr "" 9642 9632 9643 - #: src/components/moderation/ModerationDetailsDialog.tsx:59 9633 + #: src/components/moderation/ModerationDetailsDialog.tsx:57 9644 9634 msgid "User Blocked by List" 9645 9635 msgstr "" 9646 9636 ··· 9648 9638 msgid "User Blocking You" 9649 9639 msgstr "" 9650 9640 9651 - #: src/components/moderation/ModerationDetailsDialog.tsx:79 9641 + #: src/components/moderation/ModerationDetailsDialog.tsx:77 9652 9642 msgid "User Blocks You" 9653 9643 msgstr "" 9654 9644 ··· 9841 9831 msgid "Video settings" 9842 9832 msgstr "" 9843 9833 9844 - #: src/view/com/composer/Composer.tsx:1896 9834 + #: src/view/com/composer/Composer.tsx:1847 9845 9835 msgid "Video uploaded" 9846 9836 msgstr "" 9847 9837 ··· 9857 9847 msgid "Videos must be less than 3 minutes long." 9858 9848 msgstr "" 9859 9849 9860 - #: src/view/com/composer/Composer.tsx:585 9850 + #: src/view/com/composer/Composer.tsx:546 9861 9851 msgctxt "Action to view the post the user just created" 9862 9852 msgid "View" 9863 9853 msgstr "" 9864 9854 9865 - #: src/screens/Profile/Header/Shell.tsx:241 9855 + #: src/screens/Profile/Header/Shell.tsx:229 9866 9856 msgid "View {0}'s avatar" 9867 9857 msgstr "" 9868 9858 ··· 9910 9900 9911 9901 #: src/components/interstitials/TrendingVideos.tsx:198 9912 9902 #: src/components/interstitials/TrendingVideos.tsx:220 9913 - #: src/screens/Search/modules/ExploreTrendingVideos.tsx:193 9914 - #: src/screens/Search/modules/ExploreTrendingVideos.tsx:212 9903 + #: src/screens/Search/modules/ExploreTrendingVideos.tsx:194 9904 + #: src/screens/Search/modules/ExploreTrendingVideos.tsx:213 9915 9905 msgid "View more" 9916 9906 msgstr "" 9917 9907 ··· 9919 9909 msgid "View more trending videos" 9920 9910 msgstr "" 9921 9911 9922 - #: src/view/com/composer/Composer.tsx:580 9912 + #: src/view/com/composer/Composer.tsx:541 9923 9913 msgid "View post" 9924 9914 msgstr "" 9925 9915 ··· 10050 10040 msgid "We have sent another verification email to <0>{0}</0>." 10051 10041 msgstr "" 10052 10042 10053 - #: src/screens/Onboarding/StepFinished.tsx:531 10043 + #: src/screens/Onboarding/StepFinished.tsx:533 10054 10044 msgid "We hope you have a wonderful time. Remember, Bluesky is:" 10055 10045 msgstr "" 10056 10046 ··· 10147 10137 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." 10148 10138 msgstr "" 10149 10139 10150 - #: src/view/com/composer/Composer.tsx:511 10140 + #: src/view/com/composer/Composer.tsx:472 10151 10141 msgid "We're sorry! The post you are replying to has been deleted." 10152 10142 msgstr "" 10153 10143 ··· 10198 10188 10199 10189 #: src/view/com/auth/SplashScreen.tsx:51 10200 10190 #: src/view/com/auth/SplashScreen.web.tsx:103 10201 - #: src/view/com/composer/Composer.tsx:854 10191 + #: src/view/com/composer/Composer.tsx:812 10202 10192 msgid "What's up?" 10203 10193 msgstr "" 10204 10194 ··· 10229 10219 msgstr "" 10230 10220 10231 10221 #: src/components/interstitials/TrendingVideos.tsx:125 10232 - #: src/screens/Search/modules/ExploreTrendingVideos.tsx:107 10222 + #: src/screens/Search/modules/ExploreTrendingVideos.tsx:108 10233 10223 msgid "Whoops! Trending videos failed to load." 10234 10224 msgstr "" 10235 10225 ··· 10276 10266 msgid "Write a message" 10277 10267 msgstr "" 10278 10268 10279 - #: src/view/com/composer/Composer.tsx:954 10269 + #: src/view/com/composer/Composer.tsx:912 10280 10270 msgid "Write post" 10281 10271 msgstr "" 10282 10272 10283 10273 #: src/screens/PostThread/components/ThreadComposePrompt.tsx:90 10284 - #: src/view/com/composer/Composer.tsx:852 10274 + #: src/view/com/composer/Composer.tsx:810 10285 10275 msgid "Write your reply" 10286 10276 msgstr "" 10287 10277 ··· 10299 10289 msgid "www.mylivestream.tv" 10300 10290 msgstr "" 10301 10291 10302 - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:181 10292 + #: src/view/com/composer/select-language/SuggestedLanguage.tsx:102 10303 10293 msgid "Yes" 10304 10294 msgstr "" 10305 10295 ··· 10466 10456 msgid "You have blocked this user" 10467 10457 msgstr "" 10468 10458 10469 - #: src/components/moderation/ModerationDetailsDialog.tsx:75 10459 + #: src/components/moderation/ModerationDetailsDialog.tsx:73 10470 10460 #: src/lib/moderation/useModerationCauseDescription.ts:57 10471 10461 #: src/lib/moderation/useModerationCauseDescription.ts:65 10472 10462 msgid "You have blocked this user. You cannot view their content." ··· 10486 10476 msgid "You have hidden this post" 10487 10477 msgstr "" 10488 10478 10489 - #: src/components/moderation/ModerationDetailsDialog.tsx:113 10479 + #: src/components/moderation/ModerationDetailsDialog.tsx:111 10490 10480 msgid "You have hidden this post." 10491 10481 msgstr "" 10492 10482 10493 - #: src/components/moderation/ModerationDetailsDialog.tsx:106 10483 + #: src/components/moderation/ModerationDetailsDialog.tsx:104 10494 10484 #: src/lib/moderation/useModerationCauseDescription.ts:99 10495 10485 msgid "You have muted this account." 10496 10486 msgstr "" ··· 10512 10502 msgid "You have no lists." 10513 10503 msgstr "" 10514 10504 10515 - #: src/components/dialogs/StarterPackDialog.tsx:100 10505 + #: src/components/dialogs/StarterPackDialog.tsx:101 10516 10506 msgid "You have no starter packs." 10517 10507 msgstr "" 10518 10508 ··· 10520 10510 msgid "You have not blocked any accounts yet. To block an account, go to their profile and select \"Block account\" from the menu on their account." 10521 10511 msgstr "" 10522 10512 10523 - #: src/view/screens/ModerationMutedAccounts.tsx:177 10513 + #: src/view/screens/ModerationMutedAccounts.tsx:179 10524 10514 msgid "You have not muted any accounts yet. To mute an account, go to their profile and select \"Mute account\" from the menu on their account." 10525 10515 msgstr "" 10526 10516 ··· 10544 10534 msgid "You haven't muted any words or tags yet" 10545 10535 msgstr "" 10546 10536 10547 - #: src/components/moderation/ModerationDetailsDialog.tsx:120 10537 + #: src/components/moderation/ModerationDetailsDialog.tsx:118 10548 10538 #: src/lib/moderation/useModerationCauseDescription.ts:127 10549 10539 msgid "You hid this reply." 10550 10540 msgstr "" ··· 10561 10551 msgid "You joined Bluesky using a starter pack {timeAgoString} ago" 10562 10552 msgstr "" 10563 10553 10564 - #: src/components/moderation/LabelsOnMeDialog.tsx:81 10554 + #: src/components/moderation/LabelsOnMeDialog.tsx:79 10565 10555 msgid "You may appeal non-self labels if you feel they were placed in error." 10566 10556 msgstr "" 10567 10557 10568 - #: src/components/moderation/LabelsOnMeDialog.tsx:86 10558 + #: src/components/moderation/LabelsOnMeDialog.tsx:84 10569 10559 msgid "You may appeal these labels if you feel they were placed in error." 10570 10560 msgstr "" 10571 10561 ··· 10695 10685 msgid "You're in line" 10696 10686 msgstr "" 10697 10687 10698 - #: src/screens/Onboarding/StepFinished.tsx:528 10688 + #: src/screens/Onboarding/StepFinished.tsx:530 10699 10689 msgid "You're ready to go!" 10700 10690 msgstr "" 10701 10691 ··· 10704 10694 msgid "You're signed in with an App Password. Please sign in with your main password to continue deactivating your account." 10705 10695 msgstr "" 10706 10696 10707 - #: src/components/moderation/ModerationDetailsDialog.tsx:110 10697 + #: src/components/moderation/ModerationDetailsDialog.tsx:108 10708 10698 #: src/lib/moderation/useModerationCauseDescription.ts:108 10709 10699 msgid "You've chosen to hide a word or tag within this post." 10710 10700 msgstr "" ··· 10859 10849 msgid "Your password must be at least 8 characters long." 10860 10850 msgstr "" 10861 10851 10862 - #: src/view/com/composer/Composer.tsx:576 10852 + #: src/view/com/composer/Composer.tsx:537 10863 10853 msgid "Your post was sent" 10864 10854 msgstr "" 10865 10855 10866 - #: src/view/com/composer/Composer.tsx:573 10856 + #: src/view/com/composer/Composer.tsx:534 10867 10857 msgid "Your posts were sent" 10868 10858 msgstr "" 10869 10859 10870 - #: src/screens/Onboarding/StepFinished.tsx:543 10860 + #: src/screens/Onboarding/StepFinished.tsx:545 10871 10861 msgid "Your posts, likes, and blocks are public. Mutes are private." 10872 10862 msgstr "" 10873 10863 ··· 10875 10865 msgid "Your preferred language" 10876 10866 msgstr "" 10877 10867 10878 - #: src/screens/Onboarding/StepFinished.tsx:421 10868 + #: src/screens/Onboarding/StepFinished.tsx:422 10879 10869 msgid "Your profile picture" 10880 10870 msgstr "" 10881 10871 10882 - #: src/screens/Onboarding/StepFinished.tsx:349 10872 + #: src/screens/Onboarding/StepFinished.tsx:350 10883 10873 msgid "Your profile picture surrounded by concentric circles of other users' profile pictures" 10884 10874 msgstr "" 10885 10875 ··· 10887 10877 msgid "Your profile, posts, feeds, and lists will no longer be visible to other Bluesky users. You can reactivate your account at any time by logging in." 10888 10878 msgstr "" 10889 10879 10890 - #: src/view/com/composer/Composer.tsx:575 10880 + #: src/view/com/composer/Composer.tsx:536 10891 10881 msgid "Your reply was sent" 10892 10882 msgstr "" 10893 10883 10894 - #: src/components/moderation/ReportDialog/index.tsx:397 10884 + #: src/components/moderation/ReportDialog/index.tsx:394 10895 10885 msgid "Your report will be sent to <0>{0}</0>." 10896 10886 msgstr "" 10897 10887
+5 -10
src/logger/metrics.ts
··· 175 175 'feed:suggestion:press': { 176 176 feedUrl: string 177 177 } 178 - 'feed:showMore': { 179 - feed: string 178 + 'discover:showMore': { 180 179 feedContext: string 181 180 } 182 - 'feed:showLess': { 183 - feed: string 181 + 'discover:showLess': { 184 182 feedContext: string 185 183 } 186 - 'feed:clickthrough': { 187 - feed: string 184 + 'discover:clickthrough': { 188 185 count: number 189 186 } 190 - 'feed:engaged': { 191 - feed: string 187 + 'discover:engaged': { 192 188 count: number 193 189 } 194 - 'feed:seen': { 195 - feed: string 190 + 'discover:seen': { 196 191 count: number 197 192 } 198 193
+2
src/screens/Onboarding/StepFinished.tsx
··· 69 69 import * as bsky from '#/types/bsky' 70 70 71 71 export function StepFinished() { 72 + const {_} = useLingui() 72 73 const {state, dispatch} = useContext(Context) 73 74 const onboardDispatch = useOnboardingDispatch() 74 75 const [saving, setSaving] = useState(false) ··· 494 495 495 496 function Dot({active}: {active: boolean}) { 496 497 const t = useTheme() 498 + const {_} = useLingui() 497 499 498 500 return ( 499 501 <View
+1 -1
src/screens/PostThread/components/ThreadItemAnchor.tsx
··· 621 621 622 622 if (!isBackdated) return null 623 623 624 - const orange = colors.warning 624 + const orange = t.name === 'light' ? colors.warning.dark : colors.warning.light 625 625 626 626 return ( 627 627 <>
+12 -13
src/screens/PostThread/index.tsx
··· 148 148 */ 149 149 const shouldHandleScroll = useRef(true) 150 150 /** 151 - * Called any time the content size of the list changes. Could be a fresh 152 - * render, items being added to the list, or any resize that changes the 153 - * scrollable size of the content. 151 + * Called any time the content size of the list changes, _just_ before paint. 154 152 * 155 153 * We want this to fire every time we change params (which will reset 156 154 * `deferParents` via `onLayout` on the anchor post, due to the key change), ··· 195 193 * will give us a _positive_ offset, which will scroll the anchor post 196 194 * back _up_ to the top of the screen. 197 195 */ 198 - const offset = anchorOffsetTop - headerHeight 199 - list.scrollToOffset({offset}) 196 + list.scrollToOffset({ 197 + offset: anchorOffsetTop - headerHeight, 198 + }) 200 199 201 200 /* 202 - * After we manage to do a positive adjustment, we need to ensure this 203 - * doesn't run again until scroll handling is requested again via 204 - * `shouldHandleScroll.current === true` and a params change via 205 - * `prepareForParamsUpdate`. 201 + * After the second pass, `deferParents` will be `false`, and we need 202 + * to ensure this doesn't run again until scroll handling is requested 203 + * again via `shouldHandleScroll.current === true` and a params 204 + * change via `prepareForParamsUpdate`. 206 205 * 207 206 * The `isRoot` here is needed because if we're looking at the anchor 208 207 * post, this handler will not fire after `deferParents` is set to 209 208 * `false`, since there are no parents to render above it. In this case, 210 - * we want to make sure `shouldHandleScroll` is set to `false` right away 211 - * so that subsequent size changes unrelated to a params change (like 212 - * pagination) do not affect scroll. 209 + * we want to make sure `shouldHandleScroll` is set to `false` so that 210 + * subsequent size changes unrelated to a params change (like pagination) 211 + * do not affect scroll. 213 212 */ 214 - if (offset > 0 || isRoot) shouldHandleScroll.current = false 213 + if (!deferParents || isRoot) shouldHandleScroll.current = false 215 214 } 216 215 }) 217 216
+11 -23
src/screens/Profile/Header/Shell.tsx
··· 209 209 210 210 {children} 211 211 212 - {!isPlaceholderProfile && 213 - (isMe ? ( 214 - <LabelsOnMe 215 - type="account" 216 - labels={profile.labels} 217 - style={[ 218 - a.px_lg, 219 - a.pt_xs, 220 - a.pb_sm, 221 - isIOS ? a.pointer_events_auto : {pointerEvents: 'box-none'}, 222 - ]} 223 - /> 224 - ) : ( 225 - <ProfileHeaderAlerts 226 - moderation={moderation} 227 - style={[ 228 - a.px_lg, 229 - a.pt_xs, 230 - a.pb_sm, 231 - isIOS ? a.pointer_events_auto : {pointerEvents: 'box-none'}, 232 - ]} 233 - /> 234 - ))} 212 + {!isPlaceholderProfile && ( 213 + <View 214 + style={[a.px_lg, a.pt_xs, a.pb_sm]} 215 + pointerEvents={isIOS ? 'auto' : 'box-none'}> 216 + {isMe ? ( 217 + <LabelsOnMe type="account" labels={profile.labels} /> 218 + ) : ( 219 + <ProfileHeaderAlerts moderation={moderation} /> 220 + )} 221 + </View> 222 + )} 235 223 236 224 <GrowableAvatar style={[a.absolute, {top: 104, left: 10}]}> 237 225 <TouchableWithoutFeedback
+1
src/screens/Search/Shell.tsx
··· 428 428 const {hasSession} = useSession() 429 429 const {gtTablet} = useBreakpoints() 430 430 const [activeTab, setActiveTab] = useState(0) 431 + const {_} = useLingui() 431 432 432 433 const onPageSelected = useCallback( 433 434 (index: number) => {
+1
src/screens/Search/modules/ExploreTrendingVideos.tsx
··· 31 31 } 32 32 33 33 export function ExploreTrendingVideos() { 34 + const {_} = useLingui() 34 35 const gutters = useGutters([0, 'base']) 35 36 const {data, isLoading, error} = usePostFeedQuery(FEED_DESC, FEED_PARAMS) 36 37
+1 -1
src/screens/Settings/AppPasswords.tsx
··· 195 195 </View> 196 196 {appPassword.privileged && ( 197 197 <View style={[a.flex_row, a.gap_sm, a.align_center, a.mt_md]}> 198 - <WarningIcon style={[{color: colors.warning}]} /> 198 + <WarningIcon style={[{color: colors.warning[t.scheme]}]} /> 199 199 <Text style={t.atoms.text_contrast_high}> 200 200 <Trans>Allows access to direct messages</Trans> 201 201 </Text>
+2 -2
src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx
··· 134 134 <Admonition.Outer type="tip"> 135 135 <Admonition.Row> 136 136 <Admonition.Icon /> 137 - <Admonition.Content> 137 + <View style={[a.flex_1, a.gap_sm]}> 138 138 <Admonition.Text> 139 139 <Trans> 140 140 Enable notifications for an account by visiting their ··· 166 166 . 167 167 </Trans> 168 168 </Admonition.Text> 169 - </Admonition.Content> 169 + </View> 170 170 </Admonition.Row> 171 171 </Admonition.Outer> 172 172 ) : (
+3 -2
src/screens/Settings/PrivacyAndSecuritySettings.tsx
··· 1 + import {View} from 'react-native' 1 2 import {type AppBskyNotificationDeclaration} from '@atproto/api' 2 3 import {msg, Trans} from '@lingui/macro' 3 4 import {useLingui} from '@lingui/react' ··· 111 112 <Admonition.Outer type="tip" style={[a.flex_1]}> 112 113 <Admonition.Row> 113 114 <Admonition.Icon /> 114 - <Admonition.Content> 115 + <View style={[a.flex_1, a.gap_sm]}> 115 116 <Admonition.Text> 116 117 <Trans> 117 118 Note: Bluesky is an open and public network. This setting ··· 130 131 <Trans>Learn more about what is public on Bluesky.</Trans> 131 132 </InlineLinkText> 132 133 </Admonition.Text> 133 - </Admonition.Content> 134 + </View> 134 135 </Admonition.Row> 135 136 </Admonition.Outer> 136 137 </SettingsList.Item>
+12 -26
src/state/feed-feedback.tsx
··· 12 12 13 13 import {PROD_FEEDS, STAGING_FEEDS} from '#/lib/constants' 14 14 import {isNetworkError} from '#/lib/hooks/useCleanError' 15 + import {logEvent} from '#/lib/statsig/statsig' 15 16 import {Logger} from '#/logger' 16 17 import { 17 18 type FeedSourceFeedInfo, ··· 89 90 const aggregatedStats = useRef<AggregatedStats | null>(null) 90 91 const throttledFlushAggregatedStats = useMemo( 91 92 () => 92 - throttle( 93 - () => 94 - flushToStatsig( 95 - aggregatedStats.current, 96 - feed?.feedDescriptor ?? 'unknown', 97 - ), 98 - 45e3, 99 - { 100 - leading: true, // The outer call is already throttled somewhat. 101 - trailing: true, 102 - }, 103 - ), 104 - [feed?.feedDescriptor], 93 + throttle(() => flushToStatsig(aggregatedStats.current), 45e3, { 94 + leading: true, // The outer call is already throttled somewhat. 95 + trailing: true, 96 + }), 97 + [], 105 98 ) 106 99 107 100 const sendToFeedNoDelay = useCallback(() => { ··· 142 135 sendOrAggregateInteractionsForStats( 143 136 aggregatedStats.current, 144 137 interactionsToSend, 145 - feed?.feedDescriptor ?? 'unknown', 146 138 ) 147 139 throttledFlushAggregatedStats() 148 140 logger.debug('flushed') ··· 279 271 function sendOrAggregateInteractionsForStats( 280 272 stats: AggregatedStats, 281 273 interactions: AppBskyFeedDefs.Interaction[], 282 - feed: string, 283 274 ) { 284 275 for (let interaction of interactions) { 285 276 switch (interaction.event) { 286 277 // Pressing "Show more" / "Show less" is relatively uncommon so we won't aggregate them. 287 278 // This lets us send the feed context together with them. 288 279 case 'app.bsky.feed.defs#requestLess': { 289 - logger.metric('feed:showLess', { 290 - feed, 280 + logEvent('discover:showLess', { 291 281 feedContext: interaction.feedContext ?? '', 292 282 }) 293 283 break 294 284 } 295 285 case 'app.bsky.feed.defs#requestMore': { 296 - logger.metric('feed:showMore', { 297 - feed, 286 + logEvent('discover:showMore', { 298 287 feedContext: interaction.feedContext ?? '', 299 288 }) 300 289 break ··· 324 313 } 325 314 } 326 315 327 - function flushToStatsig(stats: AggregatedStats | null, feedDescriptor: string) { 316 + function flushToStatsig(stats: AggregatedStats | null) { 328 317 if (stats === null) { 329 318 return 330 319 } 331 320 332 321 if (stats.clickthroughCount > 0) { 333 - logger.metric('feed:clickthrough', { 322 + logEvent('discover:clickthrough', { 334 323 count: stats.clickthroughCount, 335 - feed: feedDescriptor, 336 324 }) 337 325 stats.clickthroughCount = 0 338 326 } 339 327 340 328 if (stats.engagedCount > 0) { 341 - logger.metric('feed:engaged', { 329 + logEvent('discover:engaged', { 342 330 count: stats.engagedCount, 343 - feed: feedDescriptor, 344 331 }) 345 332 stats.engagedCount = 0 346 333 } 347 334 348 335 if (stats.seenCount > 0) { 349 - logger.metric('feed:seen', { 336 + logEvent('discover:seen', { 350 337 count: stats.seenCount, 351 - feed: feedDescriptor, 352 338 }) 353 339 stats.seenCount = 0 354 340 }
+1 -1
src/state/persisted/schema.ts
··· 71 71 contentLanguages: z.array(z.string()), 72 72 /** 73 73 * The language(s) the user is currently posting in, configured within the 74 - * composer. Multiple languages are separated by commas. 74 + * composer. Multiple languages are psearate by commas. 75 75 * 76 76 * BCP-47 2-letter language code without region. 77 77 */
-4
src/state/preferences/languages.tsx
··· 156 156 return postLanguage.split(',').filter(Boolean) 157 157 } 158 158 159 - export function fromPostLanguages(languages: string[]): string { 160 - return languages.filter(Boolean).join(',') 161 - } 162 - 163 159 export function hasPostLanguage(postLanguage: string, code2: string): boolean { 164 160 return toPostLanguages(postLanguage).includes(code2) 165 161 }
+5 -5
src/state/queries/post-feed.ts
··· 492 492 } 493 493 } 494 494 } else if (feedDesc.startsWith('author')) { 495 - const [__, actor, filter] = feedDesc.split('|') 495 + const [_, actor, filter] = feedDesc.split('|') 496 496 return new AuthorFeedAPI({agent, feedParams: {actor, filter}}) 497 497 } else if (feedDesc.startsWith('likes')) { 498 - const [__, actor] = feedDesc.split('|') 498 + const [_, actor] = feedDesc.split('|') 499 499 return new LikesFeedAPI({agent, feedParams: {actor}}) 500 500 } else if (feedDesc.startsWith('feedgen')) { 501 - const [__, feed] = feedDesc.split('|') 501 + const [_, feed] = feedDesc.split('|') 502 502 return new CustomFeedAPI({ 503 503 agent, 504 504 feedParams: {feed}, 505 505 userInterests, 506 506 }) 507 507 } else if (feedDesc.startsWith('list')) { 508 - const [__, list] = feedDesc.split('|') 508 + const [_, list] = feedDesc.split('|') 509 509 return new ListFeedAPI({agent, feedParams: {list}}) 510 510 } else if (feedDesc.startsWith('posts')) { 511 - const [__, uriList] = feedDesc.split('|') 511 + const [_, uriList] = feedDesc.split('|') 512 512 return new PostListFeedAPI({agent, feedParams: {uris: uriList.split(',')}}) 513 513 } else if (feedDesc === 'demo') { 514 514 return new DemoFeedAPI({agent})
+1 -1
src/state/queries/trending/useGetSuggestedUsersQuery.ts
··· 69 69 queryClient.getQueriesData<AppBskyUnspeccedGetSuggestedUsers.OutputSchema>({ 70 70 queryKey: [getSuggestedUsersQueryKeyRoot], 71 71 }) 72 - for (const [_key, response] of responses) { 72 + for (const [_, response] of responses) { 73 73 if (!response) { 74 74 continue 75 75 }
+8
src/state/session/agent.ts
··· 321 321 322 322 // Now the agent is ready. 323 323 const account = agentToSessionAccountOrThrow(this) 324 + let lastSession = this.sessionManager.session 324 325 this.persistSessionHandler = event => { 326 + if (this.sessionManager.session) { 327 + lastSession = this.sessionManager.session 328 + } else if (event === 'network-error') { 329 + // Put it back, we'll try again later. 330 + this.sessionManager.session = lastSession 331 + } 332 + 325 333 onSessionChange(this, account.did, event) 326 334 if (event !== 'create' && event !== 'update') { 327 335 addSessionErrorLog(account.did, event)
+6 -55
src/view/com/composer/Composer.tsx
··· 88 88 import {useModalControls} from '#/state/modals' 89 89 import {useRequireAltTextEnabled} from '#/state/preferences' 90 90 import { 91 - fromPostLanguages, 92 91 toPostLanguages, 93 92 useLanguagePrefs, 94 93 useLanguagePrefsApi, ··· 198 197 const [publishingStage, setPublishingStage] = useState('') 199 198 const [error, setError] = useState('') 200 199 201 - /** 202 - * A temporary local reference to a language suggestion that the user has 203 - * accepted. This overrides the global post language preference, but is not 204 - * stored permanently. 205 - */ 206 - const [acceptedLanguageSuggestion, setAcceptedLanguageSuggestion] = useState< 207 - string | null 208 - >(null) 209 - 210 - /** 211 - * The language(s) of the post being replied to. 212 - */ 213 - const [replyToLanguages, setReplyToLanguages] = useState<string[]>( 214 - replyTo?.langs || [], 215 - ) 216 - 217 - /** 218 - * The currently selected languages of the post. Prefer local temporary 219 - * language suggestion over global lang prefs, if available. 220 - */ 221 - const currentLanguages = useMemo( 222 - () => 223 - acceptedLanguageSuggestion 224 - ? [acceptedLanguageSuggestion] 225 - : toPostLanguages(langPrefs.postLanguage), 226 - [acceptedLanguageSuggestion, langPrefs.postLanguage], 227 - ) 228 - 229 - /** 230 - * When the user selects a language from the composer language selector, 231 - * clear any temporary language suggestions they may have selected 232 - * previously, and any we might try to suggest to them. 233 - */ 234 - const onSelectLanguage = () => { 235 - setAcceptedLanguageSuggestion(null) 236 - setReplyToLanguages([]) 237 - } 238 - 239 200 const [composerState, composerDispatch] = useReducer( 240 201 composerReducer, 241 202 { ··· 453 414 thread, 454 415 replyTo: replyTo?.uri, 455 416 onStateChange: setPublishingStage, 456 - langs: currentLanguages, 417 + langs: toPostLanguages(langPrefs.postLanguage), 457 418 }) 458 419 ).uris[0] 459 420 ··· 529 490 isPartOfThread: thread.posts.length > 1, 530 491 hasLink: !!post.embed.link, 531 492 hasQuote: !!post.embed.quote, 532 - langs: fromPostLanguages(currentLanguages), 493 + langs: langPrefs.postLanguage, 533 494 logContext: 'Composer', 534 495 }) 535 496 index++ ··· 596 557 thread, 597 558 canPost, 598 559 isPublishing, 599 - currentLanguages, 560 + langPrefs.postLanguage, 600 561 onClose, 601 562 onPost, 602 563 onPostSuccess, ··· 693 654 <> 694 655 <SuggestedLanguage 695 656 text={activePost.richtext.text} 696 - replyToLanguages={replyToLanguages} 697 - currentLanguages={currentLanguages} 698 - onAcceptSuggestedLanguage={setAcceptedLanguageSuggestion} 657 + // NOTE(@elijaharita): currently just choosing the first language if any exists 658 + replyToLanguage={replyTo?.langs?.[0]} 699 659 /> 700 660 <ComposerPills 701 661 isReply={!!replyTo} ··· 718 678 type: 'add_post', 719 679 }) 720 680 }} 721 - currentLanguages={currentLanguages} 722 - onSelectLanguage={onSelectLanguage} 723 681 /> 724 682 </> 725 683 ) ··· 1331 1289 onEmojiButtonPress, 1332 1290 onSelectVideo, 1333 1291 onAddPost, 1334 - currentLanguages, 1335 - onSelectLanguage, 1336 1292 }: { 1337 1293 post: PostDraft 1338 1294 dispatch: (action: PostAction) => void ··· 1341 1297 onError: (error: string) => void 1342 1298 onSelectVideo: (postId: string, asset: ImagePickerAsset) => void 1343 1299 onAddPost: () => void 1344 - currentLanguages: string[] 1345 - onSelectLanguage?: (language: string) => void 1346 1300 }) { 1347 1301 const t = useTheme() 1348 1302 const {_} = useLingui() ··· 1496 1450 <PlusIcon size="lg" /> 1497 1451 </Button> 1498 1452 )} 1499 - <PostLanguageSelect 1500 - currentLanguages={currentLanguages} 1501 - onSelectLanguage={onSelectLanguage} 1502 - /> 1453 + <PostLanguageSelect /> 1503 1454 <CharProgress 1504 1455 count={post.shortenedGraphemeLength} 1505 1456 style={{width: 65}}
+1
src/view/com/composer/photos/EditImageDialog.web.tsx
··· 116 116 }) { 117 117 const t = useTheme() 118 118 const [isDragging, setIsDragging] = useState(false) 119 + const {_} = useLingui() 119 120 const control = Dialog.useDialogContext() 120 121 121 122 const source = image.source
+9 -35
src/view/com/composer/select-language/PostLanguageSelect.tsx
··· 17 17 import {Text} from '#/components/Typography' 18 18 import {PostLanguageSelectDialog} from './PostLanguageSelectDialog' 19 19 20 - export function PostLanguageSelect({ 21 - currentLanguages: currentLanguagesProp, 22 - onSelectLanguage, 23 - }: { 24 - currentLanguages?: string[] 25 - onSelectLanguage?: (language: string) => void 26 - }) { 20 + export function PostLanguageSelect() { 27 21 const {_} = useLingui() 28 22 const langPrefs = useLanguagePrefs() 29 23 const setLangPrefs = useLanguagePrefsApi() ··· 32 26 const dedupedHistory = Array.from( 33 27 new Set([...langPrefs.postLanguageHistory, langPrefs.postLanguage]), 34 28 ) 35 - 36 - const currentLanguages = 37 - currentLanguagesProp ?? toPostLanguages(langPrefs.postLanguage) 38 29 39 30 if ( 40 31 dedupedHistory.length === 1 && ··· 43 34 return ( 44 35 <> 45 36 <LanguageBtn onPress={languageDialogControl.open} /> 46 - <PostLanguageSelectDialog 47 - control={languageDialogControl} 48 - currentLanguages={currentLanguages} 49 - /> 37 + <PostLanguageSelectDialog control={languageDialogControl} /> 50 38 </> 51 39 ) 52 40 } ··· 55 43 <> 56 44 <Menu.Root> 57 45 <Menu.Trigger label={_(msg`Select post language`)}> 58 - {({props}) => ( 59 - <LanguageBtn currentLanguages={currentLanguages} {...props} /> 60 - )} 46 + {({props}) => <LanguageBtn {...props} />} 61 47 </Menu.Trigger> 62 48 <Menu.Outer> 63 49 <Menu.Group> ··· 70 56 <Menu.Item 71 57 key={historyItem} 72 58 label={_(msg`Select ${langName}`)} 73 - onPress={() => { 74 - setLangPrefs.setPostLanguage(historyItem) 75 - onSelectLanguage?.(historyItem) 76 - }}> 59 + onPress={() => setLangPrefs.setPostLanguage(historyItem)}> 77 60 <Menu.ItemText>{langName}</Menu.ItemText> 78 61 <Menu.ItemRadio 79 - selected={currentLanguages.includes(historyItem)} 62 + selected={historyItem === langPrefs.postLanguage} 80 63 /> 81 64 </Menu.Item> 82 65 ) ··· 94 77 </Menu.Outer> 95 78 </Menu.Root> 96 79 97 - <PostLanguageSelectDialog 98 - control={languageDialogControl} 99 - currentLanguages={currentLanguages} 100 - onSelectLanguage={onSelectLanguage} 101 - /> 80 + <PostLanguageSelectDialog control={languageDialogControl} /> 102 81 </> 103 82 ) 104 83 } 105 84 106 - function LanguageBtn( 107 - props: Omit<ButtonProps, 'label' | 'children'> & { 108 - currentLanguages?: string[] 109 - }, 110 - ) { 85 + function LanguageBtn(props: Omit<ButtonProps, 'label' | 'children'>) { 111 86 const {_} = useLingui() 112 87 const langPrefs = useLanguagePrefs() 113 88 const t = useTheme() 114 89 115 90 const postLanguagesPref = toPostLanguages(langPrefs.postLanguage) 116 - const currentLanguages = props.currentLanguages ?? postLanguagesPref 117 91 118 92 return ( 119 93 <Button ··· 132 106 {({pressed, hovered}) => { 133 107 const color = 134 108 pressed || hovered ? t.palette.primary_300 : t.palette.primary_500 135 - if (currentLanguages.length > 0) { 109 + if (postLanguagesPref.length > 0) { 136 110 return ( 137 111 <Text 138 112 style={[ ··· 143 117 {maxWidth: 100}, 144 118 ]} 145 119 numberOfLines={1}> 146 - {currentLanguages 120 + {postLanguagesPref 147 121 .map(lang => codeToLanguageName(lang, langPrefs.appLanguage)) 148 122 .join(', ')} 149 123 </Text>
+3 -25
src/view/com/composer/select-language/PostLanguageSelectDialog.tsx
··· 8 8 import {type Language, LANGUAGES, LANGUAGES_MAP_CODE2} from '#/locale/languages' 9 9 import {isNative, isWeb} from '#/platform/detection' 10 10 import { 11 - toPostLanguages, 12 11 useLanguagePrefs, 13 12 useLanguagePrefsApi, 14 13 } from '#/state/preferences/languages' ··· 24 23 25 24 export function PostLanguageSelectDialog({ 26 25 control, 27 - /** 28 - * Optionally can be passed to show different values than what is saved in 29 - * langPrefs. 30 - */ 31 - currentLanguages, 32 - onSelectLanguage, 33 26 }: { 34 27 control: Dialog.DialogControlProps 35 - currentLanguages?: string[] 36 - onSelectLanguage?: (language: string) => void 37 28 }) { 38 29 const {height} = useWindowDimensions() 39 30 const insets = useSafeAreaInsets() ··· 49 40 nativeOptions={{minHeight: height - insets.top}}> 50 41 <Dialog.Handle /> 51 42 <ErrorBoundary renderError={renderErrorBoundary}> 52 - <DialogInner 53 - currentLanguages={currentLanguages} 54 - onSelectLanguage={onSelectLanguage} 55 - /> 43 + <DialogInner /> 56 44 </ErrorBoundary> 57 45 </Dialog.Outer> 58 46 ) 59 47 } 60 48 61 - export function DialogInner({ 62 - currentLanguages, 63 - onSelectLanguage, 64 - }: { 65 - currentLanguages?: string[] 66 - onSelectLanguage?: (language: string) => void 67 - }) { 49 + export function DialogInner() { 68 50 const control = Dialog.useDialogContext() 69 51 const [headerHeight, setHeaderHeight] = useState(0) 70 52 ··· 81 63 }, []) 82 64 83 65 const langPrefs = useLanguagePrefs() 84 - const postLanguagesPref = 85 - currentLanguages ?? toPostLanguages(langPrefs.postLanguage) 86 - 87 66 const [checkedLanguagesCode2, setCheckedLanguagesCode2] = useState<string[]>( 88 - postLanguagesPref || [langPrefs.primaryLanguage], 67 + langPrefs.postLanguage.split(',') || [langPrefs.primaryLanguage], 89 68 ) 90 69 const [search, setSearch] = useState('') 91 70 ··· 100 79 langsString = langPrefs.primaryLanguage 101 80 } 102 81 setLangPrefs.setPostLanguage(langsString) 103 - onSelectLanguage?.(langsString) 104 82 }) 105 83 } 106 84
+44 -121
src/view/com/composer/select-language/SuggestedLanguage.tsx
··· 1 1 import {useEffect, useState} from 'react' 2 - import {Text as RNText, View} from 'react-native' 2 + import {View} from 'react-native' 3 3 import {parseLanguage} from '@atproto/api' 4 4 import {msg, Trans} from '@lingui/macro' 5 5 import {useLingui} from '@lingui/react' 6 6 import lande from 'lande' 7 7 8 8 import {code3ToCode2Strict, codeToLanguageName} from '#/locale/helpers' 9 - import {useLanguagePrefs} from '#/state/preferences/languages' 9 + import { 10 + toPostLanguages, 11 + useLanguagePrefs, 12 + useLanguagePrefsApi, 13 + } from '#/state/preferences/languages' 10 14 import {atoms as a, useTheme} from '#/alf' 11 15 import {Button, ButtonText} from '#/components/Button' 12 16 import {Earth_Stroke2_Corner2_Rounded as EarthIcon} from '#/components/icons/Globe' ··· 18 22 19 23 export function SuggestedLanguage({ 20 24 text, 21 - replyToLanguages: replyToLanguagesProp, 22 - currentLanguages, 23 - onAcceptSuggestedLanguage, 25 + replyToLanguage: replyToLanguageProp, 24 26 }: { 25 27 text: string 26 - /** 27 - * All languages associated with the post being replied to. 28 - */ 29 - replyToLanguages: string[] 30 - /** 31 - * All languages currently selected for the post being composed. 32 - */ 33 - currentLanguages: string[] 34 - /** 35 - * Called when the user accepts a suggested language. We only pass a single 36 - * language here. If the post being replied to has multiple languages, we 37 - * only suggest the first one. 38 - */ 39 - onAcceptSuggestedLanguage: (language: string | null) => void 28 + replyToLanguage?: string 40 29 }) { 41 - const langPrefs = useLanguagePrefs() 42 - const replyToLanguages = replyToLanguagesProp 43 - .map(lang => cleanUpLanguage(lang)) 44 - .filter(Boolean) as string[] 45 - const [hasInteracted, setHasInteracted] = useState(false) 30 + const replyToLanguage = cleanUpLanguage(replyToLanguageProp) 46 31 const [suggestedLanguage, setSuggestedLanguage] = useState< 47 32 string | undefined 48 - >(undefined) 33 + >(text.length === 0 ? replyToLanguage : undefined) 34 + const langPrefs = useLanguagePrefs() 35 + const setLangPrefs = useLanguagePrefsApi() 36 + const t = useTheme() 37 + const {_} = useLingui() 49 38 50 39 useEffect(() => { 51 - if (text.length > 0 && !hasInteracted) { 52 - setHasInteracted(true) 40 + // For replies, suggest the language of the post being replied to if no text 41 + // has been typed yet 42 + if (replyToLanguage && text.length === 0) { 43 + setSuggestedLanguage(replyToLanguage) 44 + return 53 45 } 54 - }, [text, hasInteracted]) 55 46 56 - useEffect(() => { 57 47 const textTrimmed = text.trim() 58 48 59 49 // Don't run the language model on small posts, the results are likely ··· 68 58 }) 69 59 70 60 return () => cancelIdle(idle) 71 - }, [text]) 61 + }, [text, replyToLanguage]) 72 62 73 - /* 74 - * We've detected a language, and the user hasn't already selected it. 75 - */ 76 - const hasLanguageSuggestion = 77 - suggestedLanguage && !currentLanguages.includes(suggestedLanguage) 78 - /* 79 - * We have not detected a different language, and the user is not already 80 - * using or has not already selected one of the languages of the post they 81 - * are replying to. 82 - */ 83 - const hasSuggestedReplyLanguage = 84 - !hasInteracted && 85 - !suggestedLanguage && 86 - replyToLanguages.length && 87 - !replyToLanguages.some(l => currentLanguages.includes(l)) 88 - 89 - if (hasLanguageSuggestion) { 63 + if ( 64 + suggestedLanguage && 65 + !toPostLanguages(langPrefs.postLanguage).includes(suggestedLanguage) 66 + ) { 90 67 const suggestedLanguageName = codeToLanguageName( 91 68 suggestedLanguage, 92 69 langPrefs.appLanguage, 93 70 ) 94 71 95 72 return ( 96 - <LanguageSuggestionButton 97 - label={ 98 - <RNText> 99 - <Trans> 100 - Are you writing in{' '} 101 - <Text style={[a.font_bold]}>{suggestedLanguageName}</Text>? 102 - </Trans> 103 - </RNText> 104 - } 105 - value={suggestedLanguage} 106 - onAccept={onAcceptSuggestedLanguage} 107 - /> 108 - ) 109 - } else if (hasSuggestedReplyLanguage) { 110 - const suggestedLanguageName = codeToLanguageName( 111 - replyToLanguages[0], 112 - langPrefs.appLanguage, 113 - ) 114 - 115 - return ( 116 - <LanguageSuggestionButton 117 - label={ 118 - <RNText> 119 - <Trans> 120 - The post you're replying to was marked as being written in{' '} 121 - {suggestedLanguageName} by its author. Would you like to reply in{' '} 122 - <Text style={[a.font_bold]}>{suggestedLanguageName}</Text>? 123 - </Trans> 124 - </RNText> 125 - } 126 - value={replyToLanguages[0]} 127 - onAccept={onAcceptSuggestedLanguage} 128 - /> 129 - ) 130 - } else { 131 - return null 132 - } 133 - } 134 - 135 - function LanguageSuggestionButton({ 136 - label, 137 - value, 138 - onAccept, 139 - }: { 140 - label: React.ReactNode 141 - value: string 142 - onAccept: (language: string | null) => void 143 - }) { 144 - const t = useTheme() 145 - const {_} = useLingui() 146 - 147 - return ( 148 - <View style={[a.px_lg, a.py_sm]}> 149 73 <View 150 74 style={[ 151 - a.gap_md, 75 + t.atoms.border_contrast_low, 76 + a.gap_sm, 152 77 a.border, 153 78 a.flex_row, 154 79 a.align_center, 155 80 a.rounded_sm, 156 - a.p_md, 157 - a.pl_lg, 81 + a.px_lg, 82 + a.py_md, 83 + a.mx_md, 84 + a.my_sm, 158 85 t.atoms.bg, 159 - t.atoms.border_contrast_low, 160 86 ]}> 161 87 <EarthIcon /> 162 - <View style={[a.flex_1]}> 163 - <Text 164 - style={[ 165 - a.flex_1, 166 - a.leading_snug, 167 - { 168 - maxWidth: 400, 169 - }, 170 - ]}> 171 - {label} 172 - </Text> 173 - </View> 88 + <Text style={[a.flex_1]}> 89 + <Trans> 90 + Are you writing in{' '} 91 + <Text style={[a.font_semi_bold]}>{suggestedLanguageName}</Text>? 92 + </Trans> 93 + </Text> 174 94 175 95 <Button 176 - size="small" 177 96 color="secondary" 178 - onPress={() => onAccept(value)} 179 - label={_(msg`Accept this language suggestion`)}> 97 + size="small" 98 + variant="solid" 99 + onPress={() => setLangPrefs.setPostLanguage(suggestedLanguage)} 100 + label={_(msg`Change post language to ${suggestedLanguageName}`)}> 180 101 <ButtonText> 181 102 <Trans>Yes</Trans> 182 103 </ButtonText> 183 104 </Button> 184 105 </View> 185 - </View> 186 - ) 106 + ) 107 + } else { 108 + return null 109 + } 187 110 } 188 111 189 112 /**
+1 -1
src/view/com/composer/text-input/web/TagDecorator.ts
··· 30 30 31 31 let match 32 32 while ((match = regex.exec(textContent))) { 33 - const [matchedString, __, tag] = match 33 + const [matchedString, _, tag] = match 34 34 35 35 if (!tag || tag.replace(TRAILING_PUNCTUATION_REGEX, '').length > 64) 36 36 continue
+1 -1
src/view/com/posts/PostFeedErrorMessage.tsx
··· 126 126 })[knownError], 127 127 [_l, knownError], 128 128 ) 129 - const [__, uri] = feedDesc.split('|') 129 + const [_, uri] = feedDesc.split('|') 130 130 const [ownerDid] = safeParseFeedgenUri(uri) 131 131 const removePromptControl = Prompt.usePromptControl() 132 132 const {mutateAsync: removeFeed} = useRemoveFeedMutation()
+2
src/view/screens/ModerationMutedAccounts.tsx
··· 2 2 import {type StyleProp, View, type ViewStyle} from 'react-native' 3 3 import {type AppBskyActorDefs as ActorDefs} from '@atproto/api' 4 4 import {Trans} from '@lingui/macro' 5 + import {useLingui} from '@lingui/react' 5 6 import {useFocusEffect} from '@react-navigation/native' 6 7 import {type NativeStackScreenProps} from '@react-navigation/native-stack' 7 8 ··· 26 27 export function ModerationMutedAccounts({}: Props) { 27 28 const t = useTheme() 28 29 const moderationOpts = useModerationOpts() 30 + const {_} = useLingui() 29 31 const setMinimalShellMode = useSetMinimalShellMode() 30 32 31 33 const [isPTRing, setIsPTRing] = useState(false)
+2
src/view/screens/ProfileFeedLikedBy.tsx
··· 1 1 import {useCallback} from 'react' 2 2 import {Trans} from '@lingui/macro' 3 + import {useLingui} from '@lingui/react' 3 4 import {useFocusEffect} from '@react-navigation/native' 4 5 5 6 import { ··· 16 17 const setMinimalShellMode = useSetMinimalShellMode() 17 18 const {name, rkey} = route.params 18 19 const uri = makeRecordUri(name, 'app.bsky.feed.generator', rkey) 20 + const {_} = useLingui() 19 21 20 22 useFocusEffect( 21 23 useCallback(() => {
+3 -74
src/view/screens/Storybook/Admonitions.tsx
··· 1 - import {Text as RNText, View} from 'react-native' 2 - import {msg, Trans} from '@lingui/macro' 3 - import {useLingui} from '@lingui/react' 1 + import {View} from 'react-native' 4 2 5 - import {atoms as a, useTheme} from '#/alf' 6 - import { 7 - Admonition, 8 - Button as AdmonitionButton, 9 - Content as AdmonitionContent, 10 - Icon as AdmonitionIcon, 11 - Outer as AdmonitionOuter, 12 - Row as AdmonitionRow, 13 - Text as AdmonitionText, 14 - } from '#/components/Admonition' 15 - import {ButtonIcon, ButtonText} from '#/components/Button' 16 - import {ArrowRotateCounterClockwise_Stroke2_Corner0_Rounded as Retry} from '#/components/icons/ArrowRotateCounterClockwise' 17 - import {BellRinging_Filled_Corner0_Rounded as BellRingingFilledIcon} from '#/components/icons/BellRinging' 3 + import {atoms as a} from '#/alf' 4 + import {Admonition} from '#/components/Admonition' 18 5 import {InlineLinkText} from '#/components/Link' 19 6 import {H1} from '#/components/Typography' 20 7 21 8 export function Admonitions() { 22 - const {_} = useLingui() 23 - const t = useTheme() 24 - 25 9 return ( 26 10 <View style={[a.gap_md]}> 27 11 <H1>Admonitions</H1> ··· 46 30 <Admonition type="error"> 47 31 The quick brown fox jumps over the lazy dog. 48 32 </Admonition> 49 - 50 - <AdmonitionOuter type="error"> 51 - <AdmonitionRow> 52 - <AdmonitionIcon /> 53 - <AdmonitionContent> 54 - <AdmonitionText> 55 - <Trans>Something went wrong, please try again</Trans> 56 - </AdmonitionText> 57 - </AdmonitionContent> 58 - <AdmonitionButton 59 - color="negative_subtle" 60 - label={_(msg`Retry loading report options`)} 61 - onPress={() => {}}> 62 - <ButtonText> 63 - <Trans>Retry</Trans> 64 - </ButtonText> 65 - <ButtonIcon icon={Retry} /> 66 - </AdmonitionButton> 67 - </AdmonitionRow> 68 - </AdmonitionOuter> 69 - 70 - <AdmonitionOuter type="tip"> 71 - <AdmonitionRow> 72 - <AdmonitionIcon /> 73 - <AdmonitionContent> 74 - <AdmonitionText> 75 - <Trans> 76 - Enable notifications for an account by visiting their profile 77 - and pressing the{' '} 78 - <RNText style={[a.font_bold, t.atoms.text_contrast_high]}> 79 - bell icon 80 - </RNText>{' '} 81 - <BellRingingFilledIcon 82 - size="xs" 83 - style={t.atoms.text_contrast_high} 84 - /> 85 - . 86 - </Trans> 87 - </AdmonitionText> 88 - <AdmonitionText> 89 - <Trans> 90 - If you want to restrict who can receive notifications for your 91 - account's activity, you can change this in{' '} 92 - <InlineLinkText 93 - label={_(msg`Privacy and Security settings`)} 94 - to={{screen: 'ActivityPrivacySettings'}} 95 - style={[a.font_bold]}> 96 - Settings &rarr; Privacy and Security 97 - </InlineLinkText> 98 - . 99 - </Trans> 100 - </AdmonitionText> 101 - </AdmonitionContent> 102 - </AdmonitionRow> 103 - </AdmonitionOuter> 104 33 </View> 105 34 ) 106 35 }
-25
src/view/screens/Storybook/Buttons.tsx
··· 8 8 ButtonIcon, 9 9 type ButtonSize, 10 10 ButtonText, 11 - StackedButton, 12 11 } from '#/components/Button' 13 12 import {ChevronLeft_Stroke2_Corner0_Rounded as ChevronLeft} from '#/components/icons/Chevron' 14 13 import {Globe_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe' ··· 18 17 return ( 19 18 <View style={[a.gap_md]}> 20 19 <Text style={[a.font_bold, a.text_5xl]}>Buttons</Text> 21 - 22 - <View style={[a.flex_row, a.gap_md, a.align_start, {maxWidth: 350}]}> 23 - <StackedButton 24 - label="stacked" 25 - icon={Globe} 26 - color="secondary" 27 - style={[a.flex_1]}> 28 - Bop it 29 - </StackedButton> 30 - <StackedButton 31 - label="stacked" 32 - icon={Globe} 33 - color="negative_subtle" 34 - style={[a.flex_1]}> 35 - Twist it 36 - </StackedButton> 37 - <StackedButton 38 - label="stacked" 39 - icon={Globe} 40 - color="primary" 41 - style={[a.flex_1]}> 42 - Pull it 43 - </StackedButton> 44 - </View> 45 20 46 21 {[ 47 22 'primary',
+12 -48
yarn.lock
··· 77 77 tlds "^1.234.0" 78 78 zod "^3.23.8" 79 79 80 - "@atproto/api@^0.17.0": 81 - version "0.17.0" 82 - resolved "https://registry.yarnpkg.com/@atproto/api/-/api-0.17.0.tgz#1fe87ef703f8020dbe00bb5e5cc18622b8b91f4a" 83 - integrity sha512-FNS9SW7/3kslAnJH7F4fO9/jPjXzC0NMD6u9NjJ/h4EnaIEpWHZQPkmD9Q2hvAwD6+Uo2boYZEPKkOa55Lr5Dg== 84 - dependencies: 85 - "@atproto/common-web" "^0.4.3" 86 - "@atproto/lexicon" "^0.5.1" 87 - "@atproto/syntax" "^0.4.1" 88 - "@atproto/xrpc" "^0.7.5" 89 - await-lock "^2.2.2" 90 - multiformats "^9.9.0" 91 - tlds "^1.234.0" 92 - zod "^3.23.8" 93 - 94 80 "@atproto/aws@^0.2.28": 95 81 version "0.2.28" 96 82 resolved "https://registry.yarnpkg.com/@atproto/aws/-/aws-0.2.28.tgz#17bd88a6276e323ebb094a3f01bd94b1173a29a4" ··· 184 170 uint8arrays "3.0.0" 185 171 zod "^3.23.8" 186 172 187 - "@atproto/common-web@^0.4.3": 188 - version "0.4.3" 189 - resolved "https://registry.yarnpkg.com/@atproto/common-web/-/common-web-0.4.3.tgz#b4480220b5682db09da45f4ef906eb7619c838b5" 190 - integrity sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg== 191 - dependencies: 192 - graphemer "^1.4.0" 193 - multiformats "^9.9.0" 194 - uint8arrays "3.0.0" 195 - zod "^3.23.8" 196 - 197 173 "@atproto/common@0.1.0": 198 174 version "0.1.0" 199 175 resolved "https://registry.yarnpkg.com/@atproto/common/-/common-0.1.0.tgz#4216a8fef5b985ab62ac21252a0f8ca0f4a0f210" ··· 322 298 integrity sha512-3aAzEAy9EAPs3CxznzMhEcqDd7m3vz1eze/ya9/ThbB7yleqJIhz5GY2q76tCCwHPhn5qDDMhlA9kKV6fG23gA== 323 299 dependencies: 324 300 "@atproto/common-web" "^0.4.2" 325 - "@atproto/syntax" "^0.4.1" 326 - iso-datestring-validator "^2.2.2" 327 - multiformats "^9.9.0" 328 - zod "^3.23.8" 329 - 330 - "@atproto/lexicon@^0.5.1": 331 - version "0.5.1" 332 - resolved "https://registry.yarnpkg.com/@atproto/lexicon/-/lexicon-0.5.1.tgz#e9b7d5c70dc5a38518a8069cd80fea77ab526947" 333 - integrity sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A== 334 - dependencies: 335 - "@atproto/common-web" "^0.4.3" 336 301 "@atproto/syntax" "^0.4.1" 337 302 iso-datestring-validator "^2.2.2" 338 303 multiformats "^9.9.0" ··· 549 514 integrity sha512-sDi68+QE1XHegTaNAndlX41Gp827pouSzSs8CyAwhrqZdsJUxE3P7TMtrA0z+zAjvxVyvzscRc0TsN/fGUGrhw== 550 515 dependencies: 551 516 "@atproto/lexicon" "^0.5.0" 552 - zod "^3.23.8" 553 - 554 - "@atproto/xrpc@^0.7.5": 555 - version "0.7.5" 556 - resolved "https://registry.yarnpkg.com/@atproto/xrpc/-/xrpc-0.7.5.tgz#40cef1a657b5f28af8ebec9e3dac5872e58e88ea" 557 - integrity sha512-MUYNn5d2hv8yVegRL0ccHvTHAVj5JSnW07bkbiaz96UH45lvYNRVwt44z+yYVnb0/mvBzyD3/ZQ55TRGt7fHkA== 558 - dependencies: 559 - "@atproto/lexicon" "^0.5.1" 560 517 zod "^3.23.8" 561 518 562 519 "@aws-crypto/crc32@3.0.0": ··· 8646 8603 dependencies: 8647 8604 "@babel/helper-define-polyfill-provider" "^0.6.3" 8648 8605 8649 - babel-plugin-react-compiler@^19.1.0-rc.2, babel-plugin-react-compiler@^19.1.0-rc.3: 8606 + babel-plugin-react-compiler@^19.1.0-rc.1: 8607 + version "19.1.0-rc.1" 8608 + resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-19.1.0-rc.1.tgz#99d131be61017e40abbaedd98321069bf8b7e54a" 8609 + integrity sha512-M4fpG+Hfq5gWzsJeeMErdRokzg0fdJ8IAk+JDhfB/WLT+U3WwJWR8edphypJrk447/JEvYu6DBFwsTn10bMW4Q== 8610 + dependencies: 8611 + "@babel/types" "^7.26.0" 8612 + 8613 + babel-plugin-react-compiler@^19.1.0-rc.2: 8650 8614 version "19.1.0-rc.3" 8651 8615 resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-19.1.0-rc.3.tgz#45e5a282a2460b3701971e5eb8310a90a7919022" 8652 8616 integrity sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA== ··· 10860 10824 dependencies: 10861 10825 "@typescript-eslint/utils" "^5.61.0" 10862 10826 10863 - eslint-plugin-react-compiler@^19.1.0-rc.2: 10864 - version "19.1.0-rc.2" 10865 - resolved "https://registry.yarnpkg.com/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-19.1.0-rc.2.tgz#83343e7422e00fa61e729af8e8468f0ddec37925" 10866 - integrity sha512-oKalwDGcD+RX9mf3NEO4zOoUMeLvjSvcbbEOpquzmzqEEM2MQdp7/FY/Hx9NzmUwFzH1W9SKTz5fihfMldpEYw== 10827 + eslint-plugin-react-compiler@^19.1.0-rc.1: 10828 + version "19.1.0-rc.1" 10829 + resolved "https://registry.yarnpkg.com/eslint-plugin-react-compiler/-/eslint-plugin-react-compiler-19.1.0-rc.1.tgz#e974ba9541c9a4464d77723e0505b5742bc22e56" 10830 + integrity sha512-3umw5eqZXapBl7aQGmvcjheKhUbsElb9jTETxRZg371e1LG4EPs/zCHt2JzP+wNcdaZWzjU/R730zPUJblY2zw== 10867 10831 dependencies: 10868 10832 "@babel/core" "^7.24.4" 10869 10833 "@babel/parser" "^7.24.4"