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

Compare changes

Choose any two refs to compare.

+1 -2
.eslintrc.js
··· 37 'Toast.Action', 38 'AgeAssuranceAdmonition', 39 'Span', 40 - 'StackedButton', 41 ], 42 impliedTextProps: [], 43 suggestedTextWrappers: { ··· 89 'no-unused-vars': 'off', 90 '@typescript-eslint/no-unused-vars': [ 91 'error', 92 - {argsIgnorePattern: '^_', varsIgnorePattern: '^_.+'}, 93 ], 94 '@typescript-eslint/consistent-type-imports': [ 95 'warn',
··· 37 'Toast.Action', 38 'AgeAssuranceAdmonition', 39 'Span', 40 ], 41 impliedTextProps: [], 42 suggestedTextWrappers: { ··· 88 'no-unused-vars': 'off', 89 '@typescript-eslint/no-unused-vars': [ 90 'error', 91 + {argsIgnorePattern: '^_', varsIgnorePattern: '^_'}, 92 ], 93 '@typescript-eslint/consistent-type-imports': [ 94 'warn',
-2
README.md
··· 70 71 See [./LICENSE](./LICENSE) for the full license. 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 ## P.S. 76 77 We โค๏ธ you and all of the ways you support us. Thank you for making Bluesky a great place!
··· 70 71 See [./LICENSE](./LICENSE) for the full license. 72 73 ## P.S. 74 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 "type": "module", 5 "scripts": { 6 "dev": "vite", 7 "build": "tsc && vite build", 8 "build-snippet": "tsc --project tsconfig.snippet.json", 9 "lint": "eslint --cache --ext .js,.jsx,.ts,.tsx src", ··· 21 "eslint-config-preact": "^1.3.0", 22 "eslint-plugin-simple-import-sort": "^12.0.0", 23 "postcss": "^8.4.38", 24 "tailwindcss": "^3.4.3", 25 "terser": "^5.43.1", 26 "typescript": "^5.8.3",
··· 4 "type": "module", 5 "scripts": { 6 "dev": "vite", 7 + "dev-snippet": "tsc --project tsconfig.snippet.json && serve -s dist -p 3000 -n", 8 "build": "tsc && vite build", 9 "build-snippet": "tsc --project tsconfig.snippet.json", 10 "lint": "eslint --cache --ext .js,.jsx,.ts,.tsx src", ··· 22 "eslint-config-preact": "^1.3.0", 23 "eslint-plugin-simple-import-sort": "^12.0.0", 24 "postcss": "^8.4.38", 25 + "serve": "^14.2.5", 26 "tailwindcss": "^3.4.3", 27 "terser": "^5.43.1", 28 "typescript": "^5.8.3",
+11 -1
bskyembed/snippet/embed.ts
··· 3 bluesky: { 4 scan: (element?: Pick<Element, 'querySelectorAll'>) => void 5 } 6 } 7 8 - const EMBED_URL = 'https://embed.bsky.app' 9 10 window.bluesky = window.bluesky || { 11 scan,
··· 3 bluesky: { 4 scan: (element?: Pick<Element, 'querySelectorAll'>) => void 5 } 6 + BSKY_DEV_EMBED_URL?: string 7 } 8 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' 19 20 window.bluesky = window.bluesky || { 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 {resolve} from 'node:path' 2 3 import preact from '@preact/preset-vite' 4 import legacy from '@vitejs/plugin-legacy' 5 - import type {UserConfig} from 'vite' 6 import paths from 'vite-tsconfig-paths' 7 8 const config: UserConfig = { 9 plugins: [ 10 preact(), ··· 12 legacy({ 13 targets: ['defaults', 'not IE 11'], 14 }), 15 ], 16 build: { 17 assetsDir: 'static',
··· 1 + import fs from 'node:fs' 2 import {resolve} from 'node:path' 3 4 import preact from '@preact/preset-vite' 5 import legacy from '@vitejs/plugin-legacy' 6 + import type {Plugin, UserConfig} from 'vite' 7 import paths from 'vite-tsconfig-paths' 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 + 38 const config: UserConfig = { 39 plugins: [ 40 preact(), ··· 42 legacy({ 43 targets: ['defaults', 'not IE 11'], 44 }), 45 + devOnlyRouter(), 46 ], 47 build: { 48 assetsDir: 'static',
+376 -5
bskyembed/yarn.lock
··· 1447 regenerator-runtime "^0.14.1" 1448 systemjs "^6.15.1" 1449 1450 acorn-jsx@^5.3.2: 1451 version "5.3.2" 1452 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" ··· 1461 version "8.11.3" 1462 resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 1463 integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 1464 1465 ajv@^6.12.4: 1466 version "6.12.6" ··· 1472 json-schema-traverse "^0.4.1" 1473 uri-js "^4.2.2" 1474 1475 ansi-regex@^5.0.1: 1476 version "5.0.1" 1477 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" ··· 1507 normalize-path "^3.0.0" 1508 picomatch "^2.0.4" 1509 1510 - arg@^5.0.2: 1511 version "5.0.2" 1512 resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" 1513 integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== ··· 1684 resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 1685 integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== 1686 1687 brace-expansion@^1.1.7: 1688 version "1.1.11" 1689 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" ··· 1738 resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 1739 integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 1740 1741 call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: 1742 version "1.0.7" 1743 resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" ··· 1759 resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" 1760 integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== 1761 1762 caniuse-lite@^1.0.30001524: 1763 version "1.0.30001606" 1764 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" ··· 1769 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" 1770 integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== 1771 1772 - chalk@^4.0.0: 1773 version "4.1.2" 1774 resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 1775 integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== ··· 1777 ansi-styles "^4.1.0" 1778 supports-color "^7.1.0" 1779 1780 chokidar@^3.5.3: 1781 version "3.6.0" 1782 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" ··· 1792 optionalDependencies: 1793 fsevents "~2.3.2" 1794 1795 color-convert@^2.0.1: 1796 version "2.0.1" 1797 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" ··· 1814 resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" 1815 integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== 1816 1817 concat-map@0.0.1: 1818 version "0.0.1" 1819 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1820 integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 1821 1822 convert-source-map@^2.0.0: 1823 version "2.0.0" ··· 1845 shebang-command "^2.0.0" 1846 which "^2.0.1" 1847 1848 css-select@^5.1.0: 1849 version "5.2.2" 1850 resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" ··· 1893 es-errors "^1.3.0" 1894 is-data-view "^1.0.1" 1895 1896 debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.4.1: 1897 version "4.4.1" 1898 resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" ··· 1906 integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 1907 dependencies: 1908 ms "2.1.2" 1909 1910 deep-is@^0.1.3: 1911 version "0.1.4" ··· 2356 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 2357 integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 2358 2359 fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 2360 version "3.1.3" 2361 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" ··· 2496 has-symbols "^1.0.3" 2497 hasown "^2.0.0" 2498 2499 get-symbol-description@^1.0.2: 2500 version "1.0.2" 2501 resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" ··· 2631 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 2632 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 2633 2634 ignore@^5.2.0: 2635 version "5.3.1" 2636 resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" ··· 2661 version "2.0.4" 2662 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 2663 integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 2664 2665 internal-slot@^1.0.7: 2666 version "1.0.7" ··· 2741 dependencies: 2742 has-tostringtag "^1.0.0" 2743 2744 is-extglob@^2.1.1: 2745 version "2.1.1" 2746 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" ··· 2799 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 2800 integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 2801 2802 is-regex@^1.1.4: 2803 version "1.1.4" 2804 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" ··· 2819 dependencies: 2820 call-bind "^1.0.7" 2821 2822 is-string@^1.0.5, is-string@^1.0.7: 2823 version "1.0.7" 2824 resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" ··· 2859 dependencies: 2860 call-bind "^1.0.7" 2861 get-intrinsic "^1.2.4" 2862 2863 isarray@^2.0.5: 2864 version "2.0.5" ··· 2932 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 2933 integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 2934 2935 json-stable-stringify-without-jsonify@^1.0.1: 2936 version "1.0.1" 2937 resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" ··· 3047 resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" 3048 integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== 3049 3050 merge2@^1.3.0, merge2@^1.4.1: 3051 version "1.4.1" 3052 resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" ··· 3060 braces "^3.0.2" 3061 picomatch "^2.3.1" 3062 3063 - minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 3064 version "3.1.2" 3065 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 3066 integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== ··· 3074 dependencies: 3075 brace-expansion "^2.0.1" 3076 3077 "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: 3078 version "7.0.4" 3079 resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" 3080 integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== 3081 3082 ms@2.1.2: 3083 version "2.1.2" ··· 3118 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 3119 integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 3120 3121 node-html-parser@^6.1.12: 3122 version "6.1.13" 3123 resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-6.1.13.tgz#a1df799b83df5c6743fcd92740ba14682083b7e4" ··· 3141 resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 3142 integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== 3143 3144 nth-check@^2.0.1: 3145 version "2.1.1" 3146 resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" ··· 3215 define-properties "^1.2.1" 3216 es-object-atoms "^1.0.0" 3217 3218 once@^1.3.0: 3219 version "1.4.0" 3220 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 3221 integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 3222 dependencies: 3223 wrappy "1" 3224 3225 optionator@^0.9.3: 3226 version "0.9.3" ··· 3265 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 3266 integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 3267 3268 - path-key@^3.1.0: 3269 version "3.1.1" 3270 resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 3271 integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== ··· 3282 dependencies: 3283 lru-cache "^10.2.0" 3284 minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 3285 3286 path-type@^4.0.0: 3287 version "4.0.0" ··· 3409 resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 3410 integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 3411 3412 react-is@^16.13.1: 3413 version "16.13.1" 3414 resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" ··· 3480 unicode-match-property-ecmascript "^2.0.0" 3481 unicode-match-property-value-ecmascript "^2.1.0" 3482 3483 regjsgen@^0.8.0: 3484 version "0.8.0" 3485 resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" ··· 3491 integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== 3492 dependencies: 3493 jsesc "~3.0.2" 3494 3495 resolve-from@^4.0.0: 3496 version "4.0.0" ··· 3582 has-symbols "^1.0.3" 3583 isarray "^2.0.5" 3584 3585 safe-regex-test@^1.0.3: 3586 version "1.0.3" 3587 resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" ··· 3603 dependencies: 3604 lru-cache "^6.0.0" 3605 3606 set-function-length@^1.2.1: 3607 version "1.2.2" 3608 resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" ··· 3646 es-errors "^1.3.0" 3647 get-intrinsic "^1.2.4" 3648 object-inspect "^1.13.1" 3649 3650 signal-exit@^4.0.1: 3651 version "4.1.0" ··· 3791 dependencies: 3792 ansi-regex "^6.0.1" 3793 3794 strip-json-comments@^3.1.1: 3795 version "3.1.1" 3796 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 3797 integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 3798 3799 sucrase@^3.32.0: 3800 version "3.35.0" ··· 3937 resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 3938 integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 3939 3940 typed-array-buffer@^1.0.2: 3941 version "1.0.2" 3942 resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" ··· 4034 escalade "^3.2.0" 4035 picocolors "^1.1.1" 4036 4037 uri-js@^4.2.2: 4038 version "4.4.1" 4039 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" ··· 4046 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 4047 integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 4048 4049 vite-prerender-plugin@^0.5.3: 4050 version "0.5.11" 4051 resolved "https://registry.yarnpkg.com/vite-prerender-plugin/-/vite-prerender-plugin-0.5.11.tgz#83e4f29e03269dceb763fb5ec2376dcc502aa79f" ··· 4138 dependencies: 4139 isexe "^2.0.0" 4140 4141 "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 4142 version "7.0.0" 4143 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" ··· 4147 string-width "^4.1.0" 4148 strip-ansi "^6.0.0" 4149 4150 - wrap-ansi@^8.1.0: 4151 version "8.1.0" 4152 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 4153 integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
··· 1447 regenerator-runtime "^0.14.1" 1448 systemjs "^6.15.1" 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 + 1455 acorn-jsx@^5.3.2: 1456 version "5.3.2" 1457 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" ··· 1466 version "8.11.3" 1467 resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 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" 1479 1480 ajv@^6.12.4: 1481 version "6.12.6" ··· 1487 json-schema-traverse "^0.4.1" 1488 uri-js "^4.2.2" 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 + 1497 ansi-regex@^5.0.1: 1498 version "5.0.1" 1499 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" ··· 1529 normalize-path "^3.0.0" 1530 picomatch "^2.0.4" 1531 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: 1538 version "5.0.2" 1539 resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" 1540 integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== ··· 1711 resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 1712 integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== 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 + 1728 brace-expansion@^1.1.7: 1729 version "1.1.11" 1730 resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" ··· 1779 resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 1780 integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 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 + 1792 call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: 1793 version "1.0.7" 1794 resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" ··· 1810 resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" 1811 integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== 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 + 1818 caniuse-lite@^1.0.30001524: 1819 version "1.0.30001606" 1820 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" ··· 1825 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" 1826 integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== 1827 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: 1841 version "4.1.2" 1842 resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 1843 integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== ··· 1845 ansi-styles "^4.1.0" 1846 supports-color "^7.1.0" 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 + 1853 chokidar@^3.5.3: 1854 version "3.6.0" 1855 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" ··· 1865 optionalDependencies: 1866 fsevents "~2.3.2" 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 + 1882 color-convert@^2.0.1: 1883 version "2.0.1" 1884 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" ··· 1901 resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" 1902 integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== 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 + 1924 concat-map@0.0.1: 1925 version "0.0.1" 1926 resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 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== 1933 1934 convert-source-map@^2.0.0: 1935 version "2.0.0" ··· 1957 shebang-command "^2.0.0" 1958 which "^2.0.1" 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 + 1969 css-select@^5.1.0: 1970 version "5.2.2" 1971 resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e" ··· 2014 es-errors "^1.3.0" 2015 is-data-view "^1.0.1" 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 + 2024 debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.4.1: 2025 version "4.4.1" 2026 resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" ··· 2034 integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 2035 dependencies: 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== 2042 2043 deep-is@^0.1.3: 2044 version "0.1.4" ··· 2489 resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 2490 integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 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 + 2507 fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 2508 version "3.1.3" 2509 resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" ··· 2644 has-symbols "^1.0.3" 2645 hasown "^2.0.0" 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 + 2652 get-symbol-description@^1.0.2: 2653 version "1.0.2" 2654 resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" ··· 2784 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 2785 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 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 + 2792 ignore@^5.2.0: 2793 version "5.3.1" 2794 resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" ··· 2819 version "2.0.4" 2820 resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 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== 2827 2828 internal-slot@^1.0.7: 2829 version "1.0.7" ··· 2904 dependencies: 2905 has-tostringtag "^1.0.0" 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 + 2912 is-extglob@^2.1.1: 2913 version "2.1.1" 2914 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" ··· 2967 resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 2968 integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 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 + 2975 is-regex@^1.1.4: 2976 version "1.1.4" 2977 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" ··· 2992 dependencies: 2993 call-bind "^1.0.7" 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 + 3000 is-string@^1.0.5, is-string@^1.0.7: 3001 version "1.0.7" 3002 resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" ··· 3037 dependencies: 3038 call-bind "^1.0.7" 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" 3047 3048 isarray@^2.0.5: 3049 version "2.0.5" ··· 3117 resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 3118 integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 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 + 3125 json-stable-stringify-without-jsonify@^1.0.1: 3126 version "1.0.1" 3127 resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" ··· 3237 resolved "https://registry.yarnpkg.com/meow/-/meow-13.2.0.tgz#6b7d63f913f984063b3cc261b6e8800c4cd3474f" 3238 integrity sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA== 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 + 3245 merge2@^1.3.0, merge2@^1.4.1: 3246 version "1.4.1" 3247 resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" ··· 3255 braces "^3.0.2" 3256 picomatch "^2.3.1" 3257 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: 3281 version "3.1.2" 3282 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 3283 integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== ··· 3291 dependencies: 3292 brace-expansion "^2.0.1" 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 + 3299 "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: 3300 version "7.0.4" 3301 resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" 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== 3308 3309 ms@2.1.2: 3310 version "2.1.2" ··· 3345 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 3346 integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 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 + 3353 node-html-parser@^6.1.12: 3354 version "6.1.13" 3355 resolved "https://registry.yarnpkg.com/node-html-parser/-/node-html-parser-6.1.13.tgz#a1df799b83df5c6743fcd92740ba14682083b7e4" ··· 3373 resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 3374 integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== 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 + 3383 nth-check@^2.0.1: 3384 version "2.1.1" 3385 resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" ··· 3454 define-properties "^1.2.1" 3455 es-object-atoms "^1.0.0" 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 + 3462 once@^1.3.0: 3463 version "1.4.0" 3464 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 3465 integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 3466 dependencies: 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" 3475 3476 optionator@^0.9.3: 3477 version "0.9.3" ··· 3516 resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 3517 integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 3518 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: 3525 version "3.1.1" 3526 resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 3527 integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== ··· 3538 dependencies: 3539 lru-cache "^10.2.0" 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== 3546 3547 path-type@^4.0.0: 3548 version "4.0.0" ··· 3670 resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 3671 integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 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 + 3688 react-is@^16.13.1: 3689 version "16.13.1" 3690 resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" ··· 3756 unicode-match-property-ecmascript "^2.0.0" 3757 unicode-match-property-value-ecmascript "^2.1.0" 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 + 3774 regjsgen@^0.8.0: 3775 version "0.8.0" 3776 resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" ··· 3782 integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== 3783 dependencies: 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== 3790 3791 resolve-from@^4.0.0: 3792 version "4.0.0" ··· 3878 has-symbols "^1.0.3" 3879 isarray "^2.0.5" 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 + 3886 safe-regex-test@^1.0.3: 3887 version "1.0.3" 3888 resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" ··· 3904 dependencies: 3905 lru-cache "^6.0.0" 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 + 3937 set-function-length@^1.2.1: 3938 version "1.2.2" 3939 resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" ··· 3977 es-errors "^1.3.0" 3978 get-intrinsic "^1.2.4" 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== 3985 3986 signal-exit@^4.0.1: 3987 version "4.1.0" ··· 4127 dependencies: 4128 ansi-regex "^6.0.1" 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 + 4135 strip-json-comments@^3.1.1: 4136 version "3.1.1" 4137 resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 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== 4144 4145 sucrase@^3.32.0: 4146 version "3.35.0" ··· 4283 resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 4284 integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 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 + 4291 typed-array-buffer@^1.0.2: 4292 version "1.0.2" 4293 resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" ··· 4385 escalade "^3.2.0" 4386 picocolors "^1.1.1" 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 + 4396 uri-js@^4.2.2: 4397 version "4.4.1" 4398 resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" ··· 4405 resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 4406 integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 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 + 4413 vite-prerender-plugin@^0.5.3: 4414 version "0.5.11" 4415 resolved "https://registry.yarnpkg.com/vite-prerender-plugin/-/vite-prerender-plugin-0.5.11.tgz#83e4f29e03269dceb763fb5ec2376dcc502aa79f" ··· 4502 dependencies: 4503 isexe "^2.0.0" 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 + 4512 "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": 4513 version "7.0.0" 4514 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" ··· 4518 string-width "^4.1.0" 4519 strip-ansi "^6.0.0" 4520 4521 + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: 4522 version "8.1.0" 4523 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 4524 integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+3 -3
package.json
··· 71 "icons:optimize": "svgo -f ./assets/icons" 72 }, 73 "dependencies": { 74 - "@atproto/api": "^0.17.0", 75 "@bitdrift/react-native": "^0.6.8", 76 "@braintree/sanitize-url": "^6.0.2", 77 "@bsky.app/alf": "^0.1.2", ··· 246 "babel-jest": "^29.7.0", 247 "babel-plugin-macros": "^3.1.0", 248 "babel-plugin-module-resolver": "^5.0.2", 249 - "babel-plugin-react-compiler": "^19.1.0-rc.3", 250 "babel-preset-expo": "~54.0.0", 251 "eslint": "^8.19.0", 252 "eslint-plugin-bsky-internal": "link:./eslint", ··· 254 "eslint-plugin-import": "^2.31.0", 255 "eslint-plugin-lingui": "^0.2.0", 256 "eslint-plugin-react": "^7.33.2", 257 - "eslint-plugin-react-compiler": "^19.1.0-rc.2", 258 "eslint-plugin-react-native-a11y": "^3.3.0", 259 "eslint-plugin-simple-import-sort": "^12.0.0", 260 "file-loader": "6.2.0",
··· 71 "icons:optimize": "svgo -f ./assets/icons" 72 }, 73 "dependencies": { 74 + "@atproto/api": "^0.16.7", 75 "@bitdrift/react-native": "^0.6.8", 76 "@braintree/sanitize-url": "^6.0.2", 77 "@bsky.app/alf": "^0.1.2", ··· 246 "babel-jest": "^29.7.0", 247 "babel-plugin-macros": "^3.1.0", 248 "babel-plugin-module-resolver": "^5.0.2", 249 + "babel-plugin-react-compiler": "^19.1.0-rc.1", 250 "babel-preset-expo": "~54.0.0", 251 "eslint": "^8.19.0", 252 "eslint-plugin-bsky-internal": "link:./eslint", ··· 254 "eslint-plugin-import": "^2.31.0", 255 "eslint-plugin-lingui": "^0.2.0", 256 "eslint-plugin-react": "^7.33.2", 257 + "eslint-plugin-react-compiler": "^19.1.0-rc.1", 258 "eslint-plugin-react-native-a11y": "^3.3.0", 259 "eslint-plugin-simple-import-sort": "^12.0.0", 260 "file-loader": "6.2.0",
+24 -44
src/components/Admonition.tsx
··· 3 4 import {atoms as a, useBreakpoints, useTheme} from '#/alf' 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' 8 import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' 9 import {Text as BaseText, type TextProps} from '#/components/Typography' 10 11 export const colors = { 12 - warning: '#FFC404', 13 } 14 15 type Context = { ··· 25 const t = useTheme() 26 const {type} = useContext(Context) 27 const Icon = { 28 - info: CircleInfoIcon, 29 - tip: CircleInfoIcon, 30 warning: WarningIcon, 31 - error: CircleXIcon, 32 }[type] 33 const fill = { 34 info: t.atoms.text_contrast_medium.color, 35 tip: t.palette.primary_500, 36 - warning: colors.warning, 37 error: t.palette.negative_500, 38 }[type] 39 return <Icon fill={fill} size="md" /> 40 } 41 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 export function Text({ 60 children, 61 style, 62 ...rest 63 }: Pick<TextProps, 'children' | 'style'>) { 64 return ( 65 - <BaseText {...rest} style={[a.text_sm, a.leading_snug, a.pr_md, style]}> 66 {children} 67 </BaseText> 68 ) ··· 71 export function Button({ 72 children, 73 ...props 74 - }: Omit<ButtonProps, 'size' | 'variant'>) { 75 return ( 76 - <BaseButton size="tiny" {...props}> 77 {children} 78 </BaseButton> 79 ) 80 } 81 82 - export function Row({ 83 - children, 84 - style, 85 - }: { 86 - children: React.ReactNode 87 - style?: StyleProp<ViewStyle> 88 - }) { 89 return ( 90 - <View style={[a.flex_1, a.flex_row, a.align_start, a.gap_sm, style]}> 91 {children} 92 </View> 93 ) ··· 105 const t = useTheme() 106 const {gtMobile} = useBreakpoints() 107 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, 112 }[type] 113 return ( 114 <Context.Provider value={{type}}> 115 <View 116 style={[ 117 gtMobile ? a.p_md : a.p_sm, 118 - a.p_md, 119 a.rounded_sm, 120 a.border, 121 - t.atoms.bg, 122 {borderColor}, 123 style, 124 ]}> ··· 141 <Outer type={type} style={style}> 142 <Row> 143 <Icon /> 144 - <Content> 145 - <Text>{children}</Text> 146 - </Content> 147 </Row> 148 </Outer> 149 )
··· 3 4 import {atoms as a, useBreakpoints, useTheme} from '#/alf' 5 import {Button as BaseButton, type ButtonProps} from '#/components/Button' 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' 9 import {Warning_Stroke2_Corner0_Rounded as WarningIcon} from '#/components/icons/Warning' 10 import {Text as BaseText, type TextProps} from '#/components/Typography' 11 12 export const colors = { 13 + warning: { 14 + light: '#DFBC00', 15 + dark: '#BFAF1F', 16 + }, 17 } 18 19 type Context = { ··· 29 const t = useTheme() 30 const {type} = useContext(Context) 31 const Icon = { 32 + info: InfoIcon, 33 + tip: TipIcon, 34 warning: WarningIcon, 35 + error: ErrorIcon, 36 }[type] 37 const fill = { 38 info: t.atoms.text_contrast_medium.color, 39 tip: t.palette.primary_500, 40 + warning: colors.warning.light, 41 error: t.palette.negative_500, 42 }[type] 43 return <Icon fill={fill} size="md" /> 44 } 45 46 export function Text({ 47 children, 48 style, 49 ...rest 50 }: Pick<TextProps, 'children' | 'style'>) { 51 return ( 52 + <BaseText 53 + {...rest} 54 + style={[a.flex_1, a.text_sm, a.leading_snug, a.pr_md, style]}> 55 {children} 56 </BaseText> 57 ) ··· 60 export function Button({ 61 children, 62 ...props 63 + }: Omit<ButtonProps, 'size' | 'variant' | 'color'>) { 64 return ( 65 + <BaseButton size="tiny" variant="outline" color="secondary" {...props}> 66 {children} 67 </BaseButton> 68 ) 69 } 70 71 + export function Row({children}: {children: React.ReactNode}) { 72 return ( 73 + <View style={[a.flex_1, a.flex_row, a.align_center, a.gap_sm]}> 74 {children} 75 </View> 76 ) ··· 88 const t = useTheme() 89 const {gtMobile} = useBreakpoints() 90 const borderColor = { 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, 95 }[type] 96 return ( 97 <Context.Provider value={{type}}> 98 <View 99 style={[ 100 gtMobile ? a.p_md : a.p_sm, 101 a.rounded_sm, 102 a.border, 103 + t.atoms.bg_contrast_25, 104 {borderColor}, 105 style, 106 ]}> ··· 123 <Outer type={type} style={style}> 124 <Row> 125 <Icon /> 126 + <Text>{children}</Text> 127 </Row> 128 </Outer> 129 )
+41 -53
src/components/Button.tsx
··· 274 } else if (color === 'primary_subtle') { 275 if (!disabled) { 276 baseStyles.push({ 277 - backgroundColor: t.palette.primary_50, 278 }) 279 hoverStyles.push({ 280 - backgroundColor: t.palette.primary_100, 281 }) 282 } else { 283 baseStyles.push({ ··· 287 } else if (color === 'negative_subtle') { 288 if (!disabled) { 289 baseStyles.push({ 290 - backgroundColor: t.palette.negative_50, 291 }) 292 hoverStyles.push({ 293 - backgroundColor: t.palette.negative_100, 294 }) 295 } else { 296 baseStyles.push({ ··· 602 } else if (color === 'primary_subtle') { 603 if (!disabled) { 604 baseStyles.push({ 605 - color: t.palette.primary_600, 606 }) 607 } else { 608 baseStyles.push({ 609 - color: t.palette.primary_200, 610 }) 611 } 612 } else if (color === 'negative_subtle') { 613 if (!disabled) { 614 baseStyles.push({ 615 - color: t.palette.negative_600, 616 }) 617 } else { 618 baseStyles.push({ 619 - color: t.palette.negative_200, 620 }) 621 } 622 } ··· 723 } else if (size === 'small') { 724 baseStyles.push(a.text_sm, a.leading_snug, a.font_medium) 725 } else if (size === 'tiny') { 726 - baseStyles.push(a.text_xs, a.leading_snug, a.font_semi_bold) 727 } 728 729 return StyleSheet.flatten(baseStyles) ··· 837 </View> 838 ) 839 } 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 - }
··· 274 } else if (color === 'primary_subtle') { 275 if (!disabled) { 276 baseStyles.push({ 277 + backgroundColor: select(t.name, { 278 + light: t.palette.primary_50, 279 + dim: t.palette.primary_100, 280 + dark: t.palette.primary_100, 281 + }), 282 }) 283 hoverStyles.push({ 284 + backgroundColor: select(t.name, { 285 + light: t.palette.primary_100, 286 + dim: t.palette.primary_200, 287 + dark: t.palette.primary_200, 288 + }), 289 }) 290 } else { 291 baseStyles.push({ ··· 295 } else if (color === 'negative_subtle') { 296 if (!disabled) { 297 baseStyles.push({ 298 + backgroundColor: select(t.name, { 299 + light: t.palette.negative_50, 300 + dim: t.palette.negative_100, 301 + dark: t.palette.negative_100, 302 + }), 303 }) 304 hoverStyles.push({ 305 + backgroundColor: select(t.name, { 306 + light: t.palette.negative_100, 307 + dim: t.palette.negative_200, 308 + dark: t.palette.negative_200, 309 + }), 310 }) 311 } else { 312 baseStyles.push({ ··· 618 } else if (color === 'primary_subtle') { 619 if (!disabled) { 620 baseStyles.push({ 621 + color: select(t.name, { 622 + light: t.palette.primary_600, 623 + dim: t.palette.primary_800, 624 + dark: t.palette.primary_800, 625 + }), 626 }) 627 } else { 628 baseStyles.push({ 629 + color: select(t.name, { 630 + light: t.palette.primary_200, 631 + dim: t.palette.primary_200, 632 + dark: t.palette.primary_200, 633 + }), 634 }) 635 } 636 } else if (color === 'negative_subtle') { 637 if (!disabled) { 638 baseStyles.push({ 639 + color: select(t.name, { 640 + light: t.palette.negative_600, 641 + dim: t.palette.negative_800, 642 + dark: t.palette.negative_800, 643 + }), 644 }) 645 } else { 646 baseStyles.push({ 647 + color: select(t.name, { 648 + light: t.palette.negative_200, 649 + dim: t.palette.negative_200, 650 + dark: t.palette.negative_200, 651 + }), 652 }) 653 } 654 } ··· 755 } else if (size === 'small') { 756 baseStyles.push(a.text_sm, a.leading_snug, a.font_medium) 757 } else if (size === 'tiny') { 758 + baseStyles.push(a.text_xs, a.leading_snug, a.font_medium) 759 } 760 761 return StyleSheet.flatten(baseStyles) ··· 869 </View> 870 ) 871 }
+1
src/components/PostControls/ShareMenu/RecentChats.tsx
··· 24 25 export function RecentChats({postUri}: {postUri: string}) { 26 const control = useDialogContext() 27 const {currentAccount} = useSession() 28 const {data} = useListConvosQuery({status: 'accepted'}) 29 const convos = data?.pages[0]?.convos?.slice(0, 10)
··· 24 25 export function RecentChats({postUri}: {postUri: string}) { 26 const control = useDialogContext() 27 + const {_} = useLingui() 28 const {currentAccount} = useSession() 29 const {data} = useListConvosQuery({status: 'accepted'}) 30 const convos = data?.pages[0]?.convos?.slice(0, 10)
+1
src/components/dialogs/StarterPackDialog.tsx
··· 47 targetDid, 48 enabled, 49 }: StarterPackDialogProps) { 50 const navigation = useNavigation<NavigationProp>() 51 const requireEmailVerification = useRequireEmailVerification() 52
··· 47 targetDid, 48 enabled, 49 }: StarterPackDialogProps) { 50 + const {_} = useLingui() 51 const navigation = useNavigation<NavigationProp>() 52 const requireEmailVerification = useRequireEmailVerification() 53
+1 -3
src/components/moderation/LabelsOnMeDialog.tsx
··· 32 33 export function LabelsOnMeDialog(props: LabelsOnMeDialogProps) { 34 return ( 35 - <Dialog.Outer 36 - control={props.control} 37 - nativeOptions={{preventExpansion: true}}> 38 <Dialog.Handle /> 39 <LabelsOnMeDialogInner {...props} /> 40 </Dialog.Outer>
··· 32 33 export function LabelsOnMeDialog(props: LabelsOnMeDialogProps) { 34 return ( 35 + <Dialog.Outer control={props.control}> 36 <Dialog.Handle /> 37 <LabelsOnMeDialogInner {...props} /> 38 </Dialog.Outer>
+1 -3
src/components/moderation/ModerationDetailsDialog.tsx
··· 24 25 export function ModerationDetailsDialog(props: ModerationDetailsDialogProps) { 26 return ( 27 - <Dialog.Outer 28 - control={props.control} 29 - nativeOptions={{preventExpansion: true}}> 30 <Dialog.Handle /> 31 <ModerationDetailsDialogInner {...props} /> 32 </Dialog.Outer>
··· 24 25 export function ModerationDetailsDialog(props: ModerationDetailsDialogProps) { 26 return ( 27 + <Dialog.Outer control={props.control}> 28 <Dialog.Handle /> 29 <ModerationDetailsDialogInner {...props} /> 30 </Dialog.Outer>
+1 -2
src/components/moderation/ProfileHeaderAlerts.tsx
··· 6 7 export function ProfileHeaderAlerts({ 8 moderation, 9 - style, 10 }: { 11 moderation: ModerationDecision 12 style?: StyleProp<ViewStyle> ··· 17 } 18 19 return ( 20 - <Pills.Row size="lg" style={style}> 21 {modui.alerts.filter(unique).map(cause => ( 22 <Pills.Label 23 size="lg"
··· 6 7 export function ProfileHeaderAlerts({ 8 moderation, 9 }: { 10 moderation: ModerationDecision 11 style?: StyleProp<ViewStyle> ··· 16 } 17 18 return ( 19 + <Pills.Row size="lg"> 20 {modui.alerts.filter(unique).map(cause => ( 21 <Pills.Label 22 size="lg"
+3 -6
src/components/moderation/ReportDialog/index.tsx
··· 219 <Admonition.Outer type="error"> 220 <Admonition.Row> 221 <Admonition.Icon /> 222 - <Admonition.Content> 223 - <Admonition.Text> 224 - <Trans>Something went wrong, please try again</Trans> 225 - </Admonition.Text> 226 - </Admonition.Content> 227 <Admonition.Button 228 - color="negative_subtle" 229 label={_(msg`Retry loading report options`)} 230 onPress={() => refetchLabelers()}> 231 <ButtonText>
··· 219 <Admonition.Outer type="error"> 220 <Admonition.Row> 221 <Admonition.Icon /> 222 + <Admonition.Text> 223 + <Trans>Something went wrong, please try again</Trans> 224 + </Admonition.Text> 225 <Admonition.Button 226 label={_(msg`Retry loading report options`)} 227 onPress={() => refetchLabelers()}> 228 <ButtonText>
+1 -1
src/lib/hooks/useIntentHandler.ts
··· 51 } 52 53 const urlp = new URL(url) 54 - const [__, intent, intentType] = urlp.pathname.split('/') 55 56 // On native, our links look like bluesky://intent/SomeIntent, so we have to check the hostname for the 57 // intent check. On web, we have to check the first part of the path since we have an actual hostname
··· 51 } 52 53 const urlp = new URL(url) 54 + const [_, intent, intentType] = urlp.pathname.split('/') 55 56 // On native, our links look like bluesky://intent/SomeIntent, so we have to check the hostname for the 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 urlp.hostname === 'm.youtube.com' || 106 urlp.hostname === 'music.youtube.com' 107 ) { 108 - const [__, page, shortOrLiveVideoId] = urlp.pathname.split('/') 109 110 const isShorts = page === 'shorts' 111 const isLive = page === 'live' ··· 137 window.location.hostname 138 : 'localhost' 139 140 - const [__, channelOrVideo, clipOrId, id] = urlp.pathname.split('/') 141 142 if (channelOrVideo === 'videos') { 143 return { ··· 162 163 // spotify 164 if (urlp.hostname === 'open.spotify.com') { 165 - const [__, typeOrLocale, idOrType, id] = urlp.pathname.split('/') 166 167 if (idOrType) { 168 if (typeOrLocale === 'playlist' || idOrType === 'playlist') { ··· 210 urlp.hostname === 'soundcloud.com' || 211 urlp.hostname === 'www.soundcloud.com' 212 ) { 213 - const [__, user, trackOrSets, set] = urlp.pathname.split('/') 214 215 if (user && trackOrSets) { 216 if (trackOrSets === 'sets' && set) { ··· 270 } 271 272 if (urlp.hostname === 'vimeo.com' || urlp.hostname === 'www.vimeo.com') { 273 - const [__, videoId] = urlp.pathname.split('/') 274 if (videoId) { 275 return { 276 type: 'vimeo_video', ··· 281 } 282 283 if (urlp.hostname === 'giphy.com' || urlp.hostname === 'www.giphy.com') { 284 - const [__, gifs, nameAndId] = urlp.pathname.split('/') 285 286 /* 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 // These can include (presumably) a tracking id in the path name, so we have to check for that as well 310 if (giphyRegex.test(urlp.hostname)) { 311 // We can link directly to the gif, if its a proper link 312 - const [__, media, trackingOrId, idOrFilename, filename] = 313 urlp.pathname.split('/') 314 315 if (media === 'media') { ··· 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 // be .webp 340 if (urlp.hostname === 'i.giphy.com' || urlp.hostname === 'www.i.giphy.com') { 341 - const [__, mediaOrFilename, filename] = urlp.pathname.split('/') 342 343 if (mediaOrFilename === 'media' && filename) { 344 const gifId = filename.split('.')[0] ··· 389 const path_components = urlp.pathname.slice(1, i + 1).split('/') 390 if (path_components.length === 4) { 391 // discard username - it's not relevant 392 - const [photos, __, albums, id] = path_components 393 if (photos === 'photos' && albums === 'albums') { 394 // this at least has the shape of a valid photo-album URL! 395 return { ··· 417 // link shortened flickr path 418 if (urlp.hostname === 'flic.kr') { 419 const b58alph = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' 420 - let [__, type, idBase58Enc] = urlp.pathname.split('/') 421 let id = 0n 422 for (const char of idBase58Enc) { 423 const nextIdx = b58alph.indexOf(char) ··· 528 return {success: false} 529 } 530 531 - let [__, id, filename] = urlp.pathname.split('/') 532 533 if (!id || !filename) { 534 return {success: false}
··· 105 urlp.hostname === 'm.youtube.com' || 106 urlp.hostname === 'music.youtube.com' 107 ) { 108 + const [_, page, shortOrLiveVideoId] = urlp.pathname.split('/') 109 110 const isShorts = page === 'shorts' 111 const isLive = page === 'live' ··· 137 window.location.hostname 138 : 'localhost' 139 140 + const [_, channelOrVideo, clipOrId, id] = urlp.pathname.split('/') 141 142 if (channelOrVideo === 'videos') { 143 return { ··· 162 163 // spotify 164 if (urlp.hostname === 'open.spotify.com') { 165 + const [_, typeOrLocale, idOrType, id] = urlp.pathname.split('/') 166 167 if (idOrType) { 168 if (typeOrLocale === 'playlist' || idOrType === 'playlist') { ··· 210 urlp.hostname === 'soundcloud.com' || 211 urlp.hostname === 'www.soundcloud.com' 212 ) { 213 + const [_, user, trackOrSets, set] = urlp.pathname.split('/') 214 215 if (user && trackOrSets) { 216 if (trackOrSets === 'sets' && set) { ··· 270 } 271 272 if (urlp.hostname === 'vimeo.com' || urlp.hostname === 'www.vimeo.com') { 273 + const [_, videoId] = urlp.pathname.split('/') 274 if (videoId) { 275 return { 276 type: 'vimeo_video', ··· 281 } 282 283 if (urlp.hostname === 'giphy.com' || urlp.hostname === 'www.giphy.com') { 284 + const [_, gifs, nameAndId] = urlp.pathname.split('/') 285 286 /* 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 // These can include (presumably) a tracking id in the path name, so we have to check for that as well 310 if (giphyRegex.test(urlp.hostname)) { 311 // We can link directly to the gif, if its a proper link 312 + const [_, media, trackingOrId, idOrFilename, filename] = 313 urlp.pathname.split('/') 314 315 if (media === 'media') { ··· 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 // be .webp 340 if (urlp.hostname === 'i.giphy.com' || urlp.hostname === 'www.i.giphy.com') { 341 + const [_, mediaOrFilename, filename] = urlp.pathname.split('/') 342 343 if (mediaOrFilename === 'media' && filename) { 344 const gifId = filename.split('.')[0] ··· 389 const path_components = urlp.pathname.slice(1, i + 1).split('/') 390 if (path_components.length === 4) { 391 // discard username - it's not relevant 392 + const [photos, _, albums, id] = path_components 393 if (photos === 'photos' && albums === 'albums') { 394 // this at least has the shape of a valid photo-album URL! 395 return { ··· 417 // link shortened flickr path 418 if (urlp.hostname === 'flic.kr') { 419 const b58alph = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' 420 + let [_, type, idBase58Enc] = urlp.pathname.split('/') 421 let id = 0n 422 for (const char of idBase58Enc) { 423 const nextIdx = b58alph.indexOf(char) ··· 528 return {success: false} 529 } 530 531 + let [_, id, filename] = urlp.pathname.split('/') 532 533 if (!id || !filename) { 534 return {success: false}
+17
src/lib/strings/helpers.ts
··· 62 }, [splitter, maxCount, text]) 63 } 64 65 export function countLines(str: string | undefined): number { 66 if (!str) return 0 67 return str.match(/\n/g)?.length ?? 0
··· 62 }, [splitter, maxCount, text]) 63 } 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 + 82 export function countLines(str: string | undefined): number { 83 if (!str) return 0 84 return str.match(/\n/g)?.length ?? 0
+1 -1
src/lib/strings/starter-pack.ts
··· 46 } else { 47 const url = new URL(uri) 48 const parts = url.pathname.split('/') 49 - const [__, path, name, rkey] = parts 50 51 if (parts.length !== 4) return null 52 if (path !== 'starter-pack' && path !== 'start') return null
··· 46 } else { 47 const url = new URL(uri) 48 const parts = url.pathname.split('/') 49 + const [_, path, name, rkey] = parts 50 51 if (parts.length !== 4) return null 52 if (path !== 'starter-pack' && path !== 'start') return null
+215 -225
src/locale/locales/en/messages.po
··· 124 msgid "{0, plural, other {# people have}} used this starter pack!" 125 msgstr "" 126 127 - #: src/components/dialogs/StarterPackDialog.tsx:356 128 msgid "{0, plural, other {+# more}}" 129 msgstr "" 130 ··· 521 msgid "7 days" 522 msgstr "" 523 524 - #: src/screens/Onboarding/StepFinished.tsx:340 525 msgid "A collection of popular feeds you can find on Bluesky, including News, Booksky, Game Dev, Blacksky, and Fountain Pens" 526 msgstr "" 527 ··· 568 msgid "Accept Request" 569 msgstr "" 570 571 - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:179 572 - msgid "Accept this language suggestion" 573 - msgstr "" 574 - 575 #: src/screens/Settings/AccessibilitySettings.tsx:44 576 #: src/screens/Settings/Settings.tsx:220 577 #: src/screens/Settings/Settings.tsx:223 ··· 608 msgid "Account muted" 609 msgstr "" 610 611 - #: src/components/moderation/ModerationDetailsDialog.tsx:105 612 #: src/lib/moderation/useModerationCauseDescription.ts:98 613 msgid "Account Muted" 614 msgstr "" 615 616 - #: src/components/moderation/ModerationDetailsDialog.tsx:91 617 msgid "Account Muted by List" 618 msgstr "" 619 ··· 658 659 #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:169 660 #: src/components/dialogs/MutedWords.tsx:333 661 - #: src/components/dialogs/StarterPackDialog.tsx:370 662 - #: src/components/dialogs/StarterPackDialog.tsx:376 663 #: src/view/com/modals/UserAddRemoveLists.tsx:235 664 msgid "Add" 665 msgstr "" ··· 712 msgid "Add another account" 713 msgstr "" 714 715 - #: src/view/com/composer/Composer.tsx:853 716 msgid "Add another post" 717 msgstr "" 718 719 - #: src/view/com/composer/Composer.tsx:1490 720 msgid "Add another post to thread" 721 msgstr "" 722 ··· 739 msgid "Add media to post" 740 msgstr "" 741 742 - #: src/components/moderation/ReportDialog/index.tsx:406 743 - #: src/components/moderation/ReportDialog/index.tsx:410 744 msgid "Add more details (optional)" 745 msgstr "" 746 ··· 794 msgid "Add to saved posts" 795 msgstr "" 796 797 - #: src/components/dialogs/StarterPackDialog.tsx:175 798 #: src/view/com/profile/ProfileMenu.tsx:308 799 #: src/view/com/profile/ProfileMenu.tsx:311 800 msgid "Add to starter packs" ··· 809 msgid "Added to list" 810 msgstr "" 811 812 - #: src/components/dialogs/StarterPackDialog.tsx:257 813 msgid "Added to starter pack" 814 msgstr "" 815 ··· 817 msgid "Additional details (limit 1000 characters)" 818 msgstr "" 819 820 - #: src/components/moderation/ReportDialog/index.tsx:424 821 msgid "Additional details (limit 300 characters)" 822 msgstr "" 823 ··· 883 #: src/screens/Search/components/SearchLanguageDropdown.tsx:64 884 #: src/screens/Search/components/SearchLanguageDropdown.tsx:99 885 #: src/screens/Search/components/SearchLanguageDropdown.tsx:101 886 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:238 887 msgid "All languages" 888 msgstr "" 889 ··· 907 msgstr "" 908 909 #: src/screens/Settings/ActivityPrivacySettings.tsx:52 910 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:91 911 msgid "Allow others to be notified of your posts" 912 msgstr "" 913 ··· 971 msgstr "" 972 973 #: src/components/dialogs/GifSelect.tsx:253 974 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:320 975 msgid "An error has occurred" 976 msgstr "" 977 ··· 1016 msgid "An error occurred while uploading the video." 1017 msgstr "" 1018 1019 - #: src/screens/Onboarding/StepFinished.tsx:358 1020 msgid "An illustration of several Bluesky posts alongside repost, like, and comment icons" 1021 msgstr "" 1022 ··· 1055 msgid "an unknown error occurred" 1056 msgstr "" 1057 1058 - #: src/components/moderation/ModerationDetailsDialog.tsx:136 1059 #: src/lib/moderation/useModerationCauseDescription.ts:144 1060 msgid "an unknown labeler" 1061 msgstr "" ··· 1093 1094 #: src/screens/Settings/ActivityPrivacySettings.tsx:111 1095 #: src/screens/Settings/ActivityPrivacySettings.tsx:116 1096 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:162 1097 msgid "Anyone who follows me" 1098 msgstr "" 1099 ··· 1129 msgid "App password names must be at least 4 characters long" 1130 msgstr "" 1131 1132 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:71 1133 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:74 1134 msgid "App passwords" 1135 msgstr "" 1136 ··· 1139 msgid "App Passwords" 1140 msgstr "" 1141 1142 - #: src/components/moderation/LabelsOnMeDialog.tsx:152 1143 - #: src/components/moderation/LabelsOnMeDialog.tsx:155 1144 msgid "Appeal" 1145 msgstr "" 1146 1147 - #: src/components/moderation/LabelsOnMeDialog.tsx:270 1148 msgid "Appeal \"{0}\" label" 1149 msgstr "" 1150 1151 - #: src/components/moderation/LabelsOnMeDialog.tsx:260 1152 #: src/screens/Messages/components/ChatDisabled.tsx:103 1153 msgctxt "toast" 1154 msgid "Appeal submitted" ··· 1225 msgid "Are you sure you want to remove this from your feeds?" 1226 msgstr "" 1227 1228 - #: src/view/com/composer/Composer.tsx:802 1229 msgid "Are you sure you'd like to discard this draft?" 1230 msgstr "" 1231 1232 - #: src/view/com/composer/Composer.tsx:992 1233 msgid "Are you sure you'd like to discard this post?" 1234 msgstr "" 1235 ··· 1237 msgid "Are you sure?" 1238 msgstr "" 1239 1240 - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:99 1241 msgid "Are you writing in <0>{suggestedLanguageName}</0>?" 1242 msgstr "" 1243 ··· 1278 msgid "Available" 1279 msgstr "" 1280 1281 - #: src/components/moderation/LabelsOnMeDialog.tsx:317 1282 - #: src/components/moderation/LabelsOnMeDialog.tsx:318 1283 #: src/screens/Login/ChooseAccountForm.tsx:90 1284 #: src/screens/Login/ChooseAccountForm.tsx:95 1285 #: src/screens/Login/ForgotPasswordForm.tsx:123 ··· 1311 msgid "Before creating a post or replying, you must first verify your email." 1312 msgstr "" 1313 1314 - #: src/components/dialogs/StarterPackDialog.tsx:70 1315 #: src/components/StarterPack/ProfileStarterPacks.tsx:231 1316 #: src/components/StarterPack/ProfileStarterPacks.tsx:241 1317 msgid "Before creating a starter pack, you must first verify your email." ··· 1562 msgstr "" 1563 1564 #: src/components/LabelingServiceCard/index.tsx:62 1565 - #: src/components/moderation/ReportDialog/index.tsx:686 1566 #: src/screens/Search/components/StarterPackCard.tsx:106 1567 #: src/screens/Search/Explore.tsx:930 1568 msgid "By {0}" ··· 1630 #: src/screens/Settings/Settings.tsx:289 1631 #: src/screens/Takendown.tsx:108 1632 #: src/screens/Takendown.tsx:111 1633 - #: src/view/com/composer/Composer.tsx:1047 1634 - #: src/view/com/composer/Composer.tsx:1058 1635 #: src/view/com/composer/photos/EditImageDialog.web.tsx:43 1636 #: src/view/com/composer/photos/EditImageDialog.web.tsx:52 1637 #: src/view/shell/desktop/LeftNav.tsx:213 ··· 1699 msgid "Change Handle" 1700 msgstr "" 1701 1702 - #: src/components/moderation/ReportDialog/index.tsx:328 1703 msgid "Change moderation service" 1704 msgstr "" 1705 ··· 1712 msgid "Change password dialog" 1713 msgstr "" 1714 1715 - #: src/components/moderation/ReportDialog/index.tsx:247 1716 msgid "Change report reason" 1717 msgstr "" 1718 ··· 1823 msgid "Choose People" 1824 msgstr "" 1825 1826 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:184 1827 msgid "Choose Post Languages" 1828 msgstr "" 1829 1830 - #: src/screens/Onboarding/StepFinished.tsx:573 1831 msgid "Choose the algorithms that power your custom feeds." 1832 msgstr "" 1833 ··· 1920 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:178 1921 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:187 1922 #: src/components/dialogs/SearchablePeopleList.tsx:295 1923 - #: src/components/dialogs/StarterPackDialog.tsx:178 1924 #: src/components/dms/EmojiPopup.android.tsx:58 1925 #: src/components/dms/ReportDialog.tsx:387 1926 #: src/components/dms/ReportDialog.tsx:396 ··· 1938 #: src/components/WhoCanReply.tsx:209 1939 #: src/screens/Settings/components/ChangePasswordDialog.tsx:286 1940 #: src/screens/Settings/components/ChangePasswordDialog.tsx:291 1941 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:335 1942 #: src/view/com/feeds/MissingFeed.tsx:210 1943 #: src/view/com/feeds/MissingFeed.tsx:217 1944 msgid "Close" ··· 1962 #: src/components/dialogs/GifSelect.tsx:263 1963 #: src/components/verification/VerificationsDialog.tsx:136 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 1968 msgid "Close dialog" 1969 msgstr "" 1970 ··· 2007 msgid "Closes password update alert" 2008 msgstr "" 2009 2010 - #: src/view/com/composer/Composer.tsx:1055 2011 msgid "Closes post composer and discards post draft" 2012 msgstr "" 2013 ··· 2053 msgid "Community Guidelines" 2054 msgstr "" 2055 2056 - #: src/screens/Onboarding/StepFinished.tsx:472 2057 - #: src/screens/Onboarding/StepFinished.tsx:586 2058 msgid "Complete onboarding and start using your account" 2059 msgstr "" 2060 ··· 2066 msgid "Compose new post" 2067 msgstr "" 2068 2069 - #: src/view/com/composer/Composer.tsx:956 2070 msgid "Compose posts up to {0, plural, other {# characters}} in length" 2071 msgstr "" 2072 ··· 2074 msgid "Compose reply" 2075 msgstr "" 2076 2077 - #: src/view/com/composer/Composer.tsx:1883 2078 msgid "Compressing video..." 2079 msgstr "" 2080 ··· 2186 msgid "Content Languages" 2187 msgstr "" 2188 2189 - #: src/components/moderation/ModerationDetailsDialog.tsx:84 2190 #: src/lib/moderation/useModerationCauseDescription.ts:82 2191 msgid "Content Not Available" 2192 msgstr "" 2193 2194 - #: src/components/moderation/ModerationDetailsDialog.tsx:52 2195 #: src/components/moderation/ScreenHider.tsx:99 2196 #: src/lib/moderation/useGlobalLabelStrings.ts:22 2197 #: src/lib/moderation/useModerationCauseDescription.ts:45 ··· 2411 2412 #. Text on button to create a new starter pack 2413 #. Text on button to create a new starter pack 2414 - #: src/components/dialogs/StarterPackDialog.tsx:111 2415 - #: src/components/dialogs/StarterPackDialog.tsx:200 2416 #: src/components/StarterPack/ProfileStarterPacks.tsx:296 2417 msgid "Create" 2418 msgstr "" ··· 2478 msgid "Create new account" 2479 msgstr "" 2480 2481 - #: src/components/moderation/ReportDialog/index.tsx:588 2482 #: src/components/ReportDialog/SelectReportOptionView.tsx:102 2483 msgid "Create report for {0}" 2484 msgstr "" 2485 2486 - #: src/components/dialogs/StarterPackDialog.tsx:106 2487 - #: src/components/dialogs/StarterPackDialog.tsx:195 2488 msgid "Create starter pack" 2489 msgstr "" 2490 ··· 2639 2640 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:685 2641 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:687 2642 - #: src/view/com/composer/Composer.tsx:966 2643 msgid "Delete post" 2644 msgstr "" 2645 ··· 2752 2753 #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:92 2754 #: src/screens/Profile/Header/EditProfileDialog.tsx:82 2755 - #: src/view/com/composer/Composer.tsx:804 2756 - #: src/view/com/composer/Composer.tsx:999 2757 msgid "Discard" 2758 msgstr "" 2759 ··· 2762 msgid "Discard changes?" 2763 msgstr "" 2764 2765 - #: src/view/com/composer/Composer.tsx:801 2766 msgid "Discard draft?" 2767 msgstr "" 2768 2769 - #: src/view/com/composer/Composer.tsx:991 2770 msgid "Discard post?" 2771 msgstr "" 2772 ··· 2789 msgid "Dismiss" 2790 msgstr "" 2791 2792 - #: src/view/com/composer/Composer.tsx:1807 2793 msgid "Dismiss error" 2794 msgstr "" 2795 ··· 2815 msgid "Display name" 2816 msgstr "" 2817 2818 - #: src/screens/Onboarding/StepFinished.tsx:346 2819 msgid "Ditch the trolls and clickbait. Find real people and conversations that matter to you." 2820 msgstr "" 2821 ··· 2868 #: src/view/com/auth/server-input/index.tsx:233 2869 #: src/view/com/composer/labels/LabelsBtn.tsx:223 2870 #: src/view/com/composer/labels/LabelsBtn.tsx:230 2871 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:303 2872 #: src/view/com/composer/videos/SubtitleDialog.tsx:168 2873 #: src/view/com/composer/videos/SubtitleDialog.tsx:178 2874 msgid "Done" ··· 3055 msgid "Email 2FA disabled" 3056 msgstr "" 3057 3058 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:62 3059 msgid "Email 2FA enabled" 3060 msgstr "" 3061 ··· 3126 msgstr "" 3127 3128 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:139 3129 - #: src/view/screens/Storybook/Admonitions.tsx:75 3130 msgid "Enable notifications for an account by visiting their profile and pressing the <0>bell icon</0> <1/>." 3131 msgstr "" 3132 ··· 3223 msgid "Entertainment" 3224 msgstr "" 3225 3226 - #: src/view/com/composer/Composer.tsx:1892 3227 #: src/view/com/util/error/ErrorScreen.tsx:42 3228 msgid "Error" 3229 msgstr "" ··· 3232 msgid "Error loading post" 3233 msgstr "" 3234 3235 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:153 3236 msgid "Error loading preference" 3237 msgstr "" 3238 ··· 3346 msgid "Expires {0}" 3347 msgstr "" 3348 3349 - #: src/components/moderation/LabelsOnMeDialog.tsx:201 3350 - #: src/components/moderation/ModerationDetailsDialog.tsx:210 3351 msgid "Expires in {0}" 3352 msgstr "" 3353 ··· 3415 msgid "Failed to add emoji reaction" 3416 msgstr "" 3417 3418 - #: src/components/dialogs/StarterPackDialog.tsx:269 3419 msgid "Failed to add to starter pack" 3420 msgstr "" 3421 ··· 3521 msgid "Failed to remove emoji reaction" 3522 msgstr "" 3523 3524 - #: src/components/dialogs/StarterPackDialog.tsx:288 3525 msgid "Failed to remove from starter pack" 3526 msgstr "" 3527 ··· 3555 msgid "Failed to send email, please try again." 3556 msgstr "" 3557 3558 - #: src/components/moderation/LabelsOnMeDialog.tsx:256 3559 #: src/screens/Messages/components/ChatDisabled.tsx:99 3560 msgid "Failed to submit appeal, please try again." 3561 msgstr "" ··· 3698 msgid "Filter who you receive notifications from" 3699 msgstr "" 3700 3701 - #: src/screens/Onboarding/StepFinished.tsx:478 3702 - #: src/screens/Onboarding/StepFinished.tsx:589 3703 msgid "Finalizing" 3704 msgstr "" 3705 ··· 3719 msgid "Find people to follow" 3720 msgstr "" 3721 3722 - #: src/screens/Search/Shell.tsx:475 3723 msgid "Find posts, users, and feeds on Bluesky" 3724 msgstr "" 3725 3726 - #: src/screens/Onboarding/StepFinished.tsx:344 3727 msgid "Find your people" 3728 msgstr "" 3729 ··· 3750 msgid "Flat White" 3751 msgstr "" 3752 3753 - #: src/screens/Onboarding/StepFinished.tsx:569 3754 msgid "Flexible" 3755 msgstr "" 3756 ··· 3924 msgid "Forever" 3925 msgstr "" 3926 3927 - #: src/screens/Onboarding/StepFinished.tsx:353 3928 msgid "Forget the noise" 3929 msgstr "" 3930 ··· 3941 msgid "Forgot?" 3942 msgstr "" 3943 3944 - #: src/screens/Onboarding/StepFinished.tsx:335 3945 msgid "Free your feed" 3946 msgstr "" 3947 ··· 4419 msgstr "" 4420 4421 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:157 4422 - #: src/view/screens/Storybook/Admonitions.tsx:89 4423 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 msgstr "" 4425 ··· 4598 msgid "It's just you right now! Add more people to your starter pack by searching above." 4599 msgstr "" 4600 4601 - #: src/view/com/composer/Composer.tsx:1826 4602 msgid "Job ID: {0}" 4603 msgstr "" 4604 ··· 4662 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." 4663 msgstr "" 4664 4665 - #: src/components/moderation/LabelsOnMeDialog.tsx:74 4666 msgid "Labels on your account" 4667 msgstr "" 4668 4669 - #: src/components/moderation/LabelsOnMeDialog.tsx:76 4670 msgid "Labels on your content" 4671 msgstr "" 4672 ··· 4748 msgid "Learn more about verification on Bluesky" 4749 msgstr "" 4750 4751 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:127 4752 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:130 4753 msgid "Learn more about what is public on Bluesky." 4754 msgstr "" 4755 ··· 4801 msgid "Let's get your password reset!" 4802 msgstr "" 4803 4804 - #: src/screens/Onboarding/StepFinished.tsx:480 4805 - #: src/screens/Onboarding/StepFinished.tsx:589 4806 msgid "Let's go!" 4807 msgstr "" 4808 ··· 4854 4855 #: src/screens/Post/PostLikedBy.tsx:41 4856 #: src/screens/Profile/ProfileLabelerLikedBy.tsx:32 4857 - #: src/view/screens/ProfileFeedLikedBy.tsx:32 4858 msgid "Liked By" 4859 msgstr "" 4860 ··· 5033 msgid "Log" 5034 msgstr "" 5035 5036 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:106 5037 msgid "Logged-out visibility" 5038 msgstr "" 5039 ··· 5207 msgid "Moderation" 5208 msgstr "" 5209 5210 - #: src/components/moderation/ModerationDetailsDialog.tsx:140 5211 msgid "Moderation details" 5212 msgstr "" 5213 ··· 5256 msgid "Moderation tools" 5257 msgstr "" 5258 5259 - #: src/components/moderation/ModerationDetailsDialog.tsx:54 5260 #: src/lib/moderation/useModerationCauseDescription.ts:47 5261 msgid "Moderator has chosen to set a general warning on the content." 5262 msgstr "" ··· 5266 msgid "More feeds" 5267 msgstr "" 5268 5269 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:87 5270 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:90 5271 msgid "More languages..." 5272 msgstr "" 5273 ··· 5372 msgstr "" 5373 5374 #: src/Navigation.tsx:187 5375 - #: src/view/screens/ModerationMutedAccounts.tsx:116 5376 msgid "Muted Accounts" 5377 msgstr "" 5378 5379 - #: src/view/screens/ModerationMutedAccounts.tsx:202 5380 msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." 5381 msgstr "" 5382 ··· 5439 msgid "Navigates to your profile" 5440 msgstr "" 5441 5442 - #: src/components/moderation/ReportDialog/index.tsx:274 5443 - #: src/components/moderation/ReportDialog/index.tsx:291 5444 msgid "Need to report a copyright violation, legal request, or regulatory compliance issue?" 5445 msgstr "" 5446 ··· 5448 msgid "Need to report a copyright violation?" 5449 msgstr "" 5450 5451 - #: src/screens/Onboarding/StepFinished.tsx:557 5452 msgid "Never lose access to your followers or data." 5453 msgstr "" 5454 ··· 5548 msgid "New posts from {firstAuthorName} and {additionalAuthorsCount, plural, one {{formattedAuthorsCount} other} other {{formattedAuthorsCount} others}}" 5549 msgstr "" 5550 5551 - #: src/components/dialogs/StarterPackDialog.tsx:192 5552 msgid "New starter pack" 5553 msgstr "" 5554 ··· 5575 #: src/screens/Login/LoginForm.tsx:350 5576 #: src/screens/Login/SetNewPasswordForm.tsx:182 5577 #: src/screens/Login/SetNewPasswordForm.tsx:188 5578 - #: src/screens/Onboarding/StepFinished.tsx:473 5579 - #: src/screens/Onboarding/StepFinished.tsx:482 5580 #: src/screens/Settings/components/AddAppPasswordDialog.tsx:157 5581 #: src/screens/Settings/components/AddAppPasswordDialog.tsx:165 5582 #: src/screens/Signup/BackNextButtons.tsx:67 ··· 5596 msgid "Next image" 5597 msgstr "" 5598 5599 - #: src/screens/Onboarding/StepFinished.tsx:355 5600 msgid "No ads, no invasive tracking, no engagement traps. Bluesky respects your time and attention." 5601 msgstr "" 5602 ··· 5639 msgid "No messages yet" 5640 msgstr "" 5641 5642 - #: src/screens/Onboarding/StepFinished.tsx:337 5643 msgid "No more doomscrolling junk-filled algorithms. Find feeds that work for you, not against you." 5644 msgstr "" 5645 ··· 5651 #: src/screens/Messages/Settings.tsx:109 5652 #: src/screens/Settings/ActivityPrivacySettings.tsx:129 5653 #: src/screens/Settings/ActivityPrivacySettings.tsx:134 5654 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:159 5655 msgid "No one" 5656 msgstr "" 5657 ··· 5762 msgid "Note about sharing" 5763 msgstr "" 5764 5765 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:116 5766 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 msgstr "" 5768 ··· 5843 msgstr "" 5844 5845 #: src/components/dialogs/GifSelect.tsx:256 5846 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:323 5847 #: src/view/com/util/ErrorBoundary.tsx:57 5848 msgid "Oh no!" 5849 msgstr "" ··· 5880 msgid "Onboarding reset" 5881 msgstr "" 5882 5883 - #: src/view/com/composer/Composer.tsx:398 5884 msgid "One or more GIFs is missing alt text." 5885 msgstr "" 5886 5887 - #: src/view/com/composer/Composer.tsx:395 5888 msgid "One or more images is missing alt text." 5889 msgstr "" 5890 ··· 5896 msgid "One or more of your selected files are too large. Maximum size is 100ย MB." 5897 msgstr "" 5898 5899 - #: src/view/com/composer/Composer.tsx:405 5900 msgid "One or more videos is missing alt text." 5901 msgstr "" 5902 ··· 5910 5911 #: src/screens/Settings/ActivityPrivacySettings.tsx:120 5912 #: src/screens/Settings/ActivityPrivacySettings.tsx:125 5913 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:157 5914 msgid "Only followers who I follow" 5915 msgstr "" 5916 ··· 5935 msgid "Oops!" 5936 msgstr "" 5937 5938 - #: src/screens/Onboarding/StepFinished.tsx:553 5939 msgid "Open" 5940 msgstr "" 5941 ··· 5953 msgstr "" 5954 5955 #: src/screens/Messages/components/MessageInput.web.tsx:181 5956 - #: src/view/com/composer/Composer.tsx:1475 5957 msgid "Open emoji picker" 5958 msgstr "" 5959 ··· 6053 msgid "Opens device gallery to select up to {MAX_IMAGES, plural, other {# images}}, or a single video or GIF." 6054 msgstr "" 6055 6056 - #: src/view/com/composer/Composer.tsx:1476 6057 msgid "Opens emoji picker" 6058 msgstr "" 6059 ··· 6087 msgid "Opens password reset form" 6088 msgstr "" 6089 6090 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:129 6091 msgid "Opens post language settings" 6092 msgstr "" 6093 ··· 6413 msgid "Please enter your username" 6414 msgstr "" 6415 6416 - #: src/components/moderation/LabelsOnMeDialog.tsx:292 6417 msgid "Please explain why you think this label was incorrectly applied by {0}" 6418 msgstr "" 6419 ··· 6465 msgid "Porn" 6466 msgstr "" 6467 6468 - #: src/screens/PostThread/index.tsx:503 6469 msgctxt "description" 6470 msgid "Post" 6471 msgstr "" 6472 6473 - #: src/view/com/composer/Composer.tsx:1118 6474 msgctxt "action" 6475 msgid "Post" 6476 msgstr "" 6477 6478 - #: src/view/com/composer/Composer.tsx:1116 6479 msgctxt "action" 6480 msgid "Post All" 6481 msgstr "" ··· 6507 msgid "Post has been deleted" 6508 msgstr "" 6509 6510 - #: src/components/moderation/ModerationDetailsDialog.tsx:109 6511 #: src/lib/moderation/useModerationCauseDescription.ts:106 6512 msgid "Post Hidden by Muted Word" 6513 msgstr "" 6514 6515 - #: src/components/moderation/ModerationDetailsDialog.tsx:112 6516 #: src/lib/moderation/useModerationCauseDescription.ts:115 6517 msgid "Post Hidden by You" 6518 msgstr "" ··· 6527 msgstr "" 6528 6529 #. Accessibility label for button that opens dialog to choose post language settings 6530 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:124 6531 msgid "Post language selection" 6532 msgstr "" 6533 ··· 6620 #: src/Navigation.tsx:407 6621 #: src/Navigation.tsx:415 6622 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 6623 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:44 6624 msgid "Privacy and Security" 6625 msgstr "" 6626 6627 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:161 6628 - #: src/view/screens/Storybook/Admonitions.tsx:93 6629 msgid "Privacy and Security settings" 6630 msgstr "" 6631 ··· 6640 msgid "Privacy Policy" 6641 msgstr "" 6642 6643 - #: src/view/com/composer/Composer.tsx:1889 6644 msgid "Processing video..." 6645 msgstr "" 6646 ··· 6666 msgid "Profile updated" 6667 msgstr "" 6668 6669 - #: src/screens/Onboarding/StepFinished.tsx:539 6670 msgid "Public" 6671 msgstr "" 6672 ··· 6679 msgstr "" 6680 6681 #. Accessibility label for button to publish a single post 6682 - #: src/view/com/composer/Composer.tsx:1098 6683 msgid "Publish post" 6684 msgstr "" 6685 6686 #. Accessibility label for button to publish multiple posts in a thread 6687 - #: src/view/com/composer/Composer.tsx:1091 6688 msgid "Publish posts" 6689 msgstr "" 6690 6691 #. Accessibility label for button to publish multiple replies in a thread 6692 - #: src/view/com/composer/Composer.tsx:1076 6693 msgid "Publish replies" 6694 msgstr "" 6695 6696 #. Accessibility label for button to publish a single reply 6697 - #: src/view/com/composer/Composer.tsx:1083 6698 msgid "Publish reply" 6699 msgstr "" 6700 ··· 6853 msgid "Recent Searches" 6854 msgstr "" 6855 6856 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:232 6857 msgid "Recently used" 6858 msgstr "" 6859 ··· 6881 6882 #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:171 6883 #: src/components/dialogs/MutedWords.tsx:443 6884 - #: src/components/dialogs/StarterPackDialog.tsx:370 6885 - #: src/components/dialogs/StarterPackDialog.tsx:376 6886 #: src/components/FeedCard.tsx:343 6887 #: src/components/StarterPack/Wizard/WizardListCard.tsx:104 6888 #: src/components/StarterPack/Wizard/WizardListCard.tsx:111 ··· 7027 msgid "Removed from saved posts" 7028 msgstr "" 7029 7030 - #: src/components/dialogs/StarterPackDialog.tsx:276 7031 msgid "Removed from starter pack" 7032 msgstr "" 7033 ··· 7084 msgid "Replies to this post are disabled." 7085 msgstr "" 7086 7087 - #: src/view/com/composer/Composer.tsx:1114 7088 msgctxt "action" 7089 msgid "Reply" 7090 msgstr "" ··· 7094 msgid "Reply ({0, plural, one {# reply} other {# replies}})" 7095 msgstr "" 7096 7097 - #: src/components/moderation/ModerationDetailsDialog.tsx:118 7098 #: src/lib/moderation/useModerationCauseDescription.ts:125 7099 msgid "Reply Hidden by Thread Author" 7100 msgstr "" 7101 7102 - #: src/components/moderation/ModerationDetailsDialog.tsx:117 7103 #: src/lib/moderation/useModerationCauseDescription.ts:124 7104 msgid "Reply Hidden by You" 7105 msgstr "" ··· 7348 #: src/components/dms/MessageItem.tsx:322 7349 #: src/components/Error.tsx:65 7350 #: src/components/Lists.tsx:110 7351 - #: src/components/moderation/ReportDialog/index.tsx:232 7352 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:55 7353 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:58 7354 #: src/components/StarterPack/ProfileStarterPacks.tsx:342 ··· 7366 #: src/screens/Signup/BackNextButtons.tsx:53 7367 #: src/view/com/util/error/ErrorMessage.tsx:60 7368 #: src/view/com/util/error/ErrorScreen.tsx:97 7369 - #: src/view/screens/Storybook/Admonitions.tsx:63 7370 msgid "Retry" 7371 msgstr "" 7372 7373 - #: src/components/moderation/ReportDialog/index.tsx:229 7374 - #: src/view/screens/Storybook/Admonitions.tsx:60 7375 msgid "Retry loading report options" 7376 msgstr "" 7377 ··· 7501 #: src/components/forms/SearchInput.tsx:34 7502 #: src/components/forms/SearchInput.tsx:36 7503 #: src/screens/Search/Shell.tsx:307 7504 - #: src/screens/Search/Shell.tsx:463 7505 #: src/view/shell/bottom-bar/BottomBar.tsx:198 7506 msgid "Search" 7507 msgstr "" ··· 7561 msgid "Search is currently unavailable when logged out" 7562 msgstr "" 7563 7564 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:215 7565 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:216 7566 msgid "Search languages" 7567 msgstr "" 7568 ··· 7644 msgid "Select {0}" 7645 msgstr "" 7646 7647 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:72 7648 msgid "Select {langName}" 7649 msgstr "" 7650 ··· 7710 msgstr "" 7711 7712 #: src/screens/Settings/LanguageSettings.tsx:178 7713 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:248 7714 msgid "Select languages" 7715 msgstr "" 7716 7717 - #: src/components/moderation/ReportDialog/index.tsx:313 7718 msgid "Select moderation service" 7719 msgstr "" 7720 ··· 7722 msgid "Select moderator" 7723 msgstr "" 7724 7725 - #: src/view/com/composer/select-language/PostLanguageSelect.tsx:57 7726 msgid "Select post language" 7727 msgstr "" 7728 ··· 7743 msgid "Select the moderation service(s) to report to" 7744 msgstr "" 7745 7746 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:194 7747 msgid "Select up to 3 languages used in this post" 7748 msgstr "" 7749 ··· 7805 msgid "Send message" 7806 msgstr "" 7807 7808 - #: src/components/PostControls/ShareMenu/RecentChats.tsx:122 7809 msgid "Send post to {name}" 7810 msgstr "" 7811 ··· 7824 msgid "Send report to {0}" 7825 msgstr "" 7826 7827 - #: src/components/moderation/ReportDialog/index.tsx:652 7828 msgid "Send report to {title}" 7829 msgstr "" 7830 ··· 7880 msgid "Settings for activity from others" 7881 msgstr "" 7882 7883 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:84 7884 msgid "Settings for allowing others to be notified of your posts" 7885 msgstr "" 7886 ··· 8211 msgid "Similar accounts" 8212 msgstr "" 8213 8214 - #: src/screens/Onboarding/StepFinished.tsx:379 8215 - #: src/screens/Onboarding/StepFinished.tsx:461 8216 #: src/screens/Onboarding/StepInterests/index.tsx:240 8217 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:222 8218 #: src/screens/StarterPack/Wizard/index.tsx:218 8219 msgid "Skip" 8220 msgstr "" 8221 8222 - #: src/screens/Onboarding/StepFinished.tsx:372 8223 - #: src/screens/Onboarding/StepFinished.tsx:458 8224 msgid "Skip introduction and start using your account" 8225 msgstr "" 8226 ··· 8275 msgstr "" 8276 8277 #: src/components/ageAssurance/AgeAssuranceInitDialog.tsx:138 8278 - #: src/components/moderation/ReportDialog/index.tsx:224 8279 #: src/screens/Deactivated.tsx:94 8280 #: src/screens/Settings/components/DeactivateAccountDialog.tsx:59 8281 - #: src/view/screens/Storybook/Admonitions.tsx:55 8282 msgid "Something went wrong, please try again" 8283 msgstr "" 8284 ··· 8304 msgid "Something wrong? Let us know." 8305 msgstr "" 8306 8307 - #: src/App.native.tsx:128 8308 - #: src/App.web.tsx:100 8309 msgid "Sorry! Your session expired. Please sign in again." 8310 msgstr "" 8311 ··· 8321 msgid "Sort replies to the same post by:" 8322 msgstr "" 8323 8324 - #: src/components/moderation/LabelsOnMeDialog.tsx:180 8325 - #: src/components/moderation/ModerationDetailsDialog.tsx:188 8326 msgid "Source: <0>{sourceName}</0>" 8327 msgstr "" 8328 ··· 8344 msgid "Sports" 8345 msgstr "" 8346 8347 - #: src/components/PostControls/ShareMenu/RecentChats.tsx:207 8348 msgid "Start a conversation, and it will appear here." 8349 msgstr "" 8350 ··· 8418 8419 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:117 8420 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:123 8421 - #: src/components/moderation/LabelsOnMeDialog.tsx:326 8422 - #: src/components/moderation/LabelsOnMeDialog.tsx:327 8423 #: src/screens/Messages/components/ChatDisabled.tsx:154 8424 #: src/screens/Messages/components/ChatDisabled.tsx:155 8425 msgid "Submit" ··· 8433 msgid "Submit Appeal" 8434 msgstr "" 8435 8436 - #: src/components/moderation/ReportDialog/index.tsx:390 8437 - #: src/components/moderation/ReportDialog/index.tsx:447 8438 - #: src/components/moderation/ReportDialog/index.tsx:454 8439 msgid "Submit report" 8440 msgstr "" 8441 ··· 8636 msgid "Text field" 8637 msgstr "" 8638 8639 - #: src/components/moderation/LabelsOnMeDialog.tsx:290 8640 #: src/screens/Messages/components/ChatDisabled.tsx:120 8641 msgid "Text input field" 8642 msgstr "" ··· 8693 msgid "The app will be restarted" 8694 msgstr "" 8695 8696 - #: src/components/moderation/ModerationDetailsDialog.tsx:121 8697 #: src/lib/moderation/useModerationCauseDescription.ts:128 8698 msgid "The author of this thread has hidden this reply." 8699 msgstr "" ··· 8730 msgid "The feed has been replaced with Discover." 8731 msgstr "" 8732 8733 - #: src/components/moderation/LabelsOnMeDialog.tsx:61 8734 msgid "The following labels were applied to your account." 8735 msgstr "" 8736 8737 - #: src/components/moderation/LabelsOnMeDialog.tsx:62 8738 msgid "The following labels were applied to your content." 8739 msgstr "" 8740 ··· 8754 msgid "The open social network." 8755 msgstr "" 8756 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 #: src/view/screens/PrivacyPolicy.tsx:38 8762 msgid "The Privacy Policy has been moved to <0/>" 8763 msgstr "" ··· 8888 msgstr "" 8889 8890 #: src/components/dialogs/GifSelect.tsx:258 8891 - #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:325 8892 #: src/view/com/util/ErrorBoundary.tsx:59 8893 msgid "There was an unexpected issue in the application. Please let us know if this happened to you!" 8894 msgstr "" ··· 8925 msgid "This action can be undone at any time." 8926 msgstr "" 8927 8928 - #: src/components/moderation/LabelsOnMeDialog.tsx:273 8929 msgid "This appeal will be sent to <0>{sourceName}</0>." 8930 msgstr "" 8931 ··· 8953 msgid "This content is hosted by {0}. Do you want to enable external media?" 8954 msgstr "" 8955 8956 - #: src/components/moderation/ModerationDetailsDialog.tsx:86 8957 #: src/lib/moderation/useModerationCauseDescription.ts:84 8958 msgid "This content is not available because one of the users involved has blocked the other." 8959 msgstr "" ··· 9017 msgid "This is not a valid link" 9018 msgstr "" 9019 9020 - #: src/components/moderation/ModerationDetailsDialog.tsx:170 9021 msgid "This label was applied by the author." 9022 msgstr "" 9023 9024 - #: src/components/moderation/LabelsOnMeDialog.tsx:167 9025 msgid "This label was applied by you." 9026 msgstr "" 9027 ··· 9069 msgid "This post will be hidden from feeds and threads. This cannot be undone." 9070 msgstr "" 9071 9072 - #: src/view/com/composer/Composer.tsx:514 9073 msgid "This post's author has disabled quote posts." 9074 msgstr "" 9075 ··· 9105 msgid "This user has blocked you" 9106 msgstr "" 9107 9108 - #: src/components/moderation/ModerationDetailsDialog.tsx:81 9109 #: src/lib/moderation/useModerationCauseDescription.ts:75 9110 msgid "This user has blocked you. You cannot view their content." 9111 msgstr "" ··· 9114 msgid "This user has requested that their content only be shown to signed-in users." 9115 msgstr "" 9116 9117 - #: src/components/moderation/ModerationDetailsDialog.tsx:61 9118 msgid "This user is included in the <0>{0}</0> list which you have blocked." 9119 msgstr "" 9120 9121 - #: src/components/moderation/ModerationDetailsDialog.tsx:93 9122 msgid "This user is included in the <0>{0}</0> list which you have muted." 9123 msgstr "" 9124 ··· 9250 msgid "TV" 9251 msgstr "" 9252 9253 - #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:64 9254 msgid "Two-factor authentication (2FA)" 9255 msgstr "" 9256 ··· 9375 msgid "Unfortunately, Bluesky is unavailable in Mississippi right now." 9376 msgstr "" 9377 9378 - #: src/components/moderation/ReportDialog/index.tsx:375 9379 msgid "Unfortunately, none of your subscribed labelers supports this report type." 9380 msgstr "" 9381 ··· 9497 msgid "Unsubscribed from list" 9498 msgstr "" 9499 9500 - #: src/view/com/composer/Composer.tsx:894 9501 msgid "Unsupported video type: {mimeType}" 9502 msgstr "" 9503 ··· 9583 msgid "Uploading link thumbnail..." 9584 msgstr "" 9585 9586 - #: src/view/com/composer/Composer.tsx:1886 9587 msgid "Uploading video..." 9588 msgstr "" 9589 ··· 9627 msgid "User blocked" 9628 msgstr "" 9629 9630 - #: src/components/moderation/ModerationDetailsDialog.tsx:73 9631 #: src/lib/moderation/useModerationCauseDescription.ts:63 9632 msgid "User Blocked" 9633 msgstr "" ··· 9640 msgid "User blocked by list" 9641 msgstr "" 9642 9643 - #: src/components/moderation/ModerationDetailsDialog.tsx:59 9644 msgid "User Blocked by List" 9645 msgstr "" 9646 ··· 9648 msgid "User Blocking You" 9649 msgstr "" 9650 9651 - #: src/components/moderation/ModerationDetailsDialog.tsx:79 9652 msgid "User Blocks You" 9653 msgstr "" 9654 ··· 9841 msgid "Video settings" 9842 msgstr "" 9843 9844 - #: src/view/com/composer/Composer.tsx:1896 9845 msgid "Video uploaded" 9846 msgstr "" 9847 ··· 9857 msgid "Videos must be less than 3 minutes long." 9858 msgstr "" 9859 9860 - #: src/view/com/composer/Composer.tsx:585 9861 msgctxt "Action to view the post the user just created" 9862 msgid "View" 9863 msgstr "" 9864 9865 - #: src/screens/Profile/Header/Shell.tsx:241 9866 msgid "View {0}'s avatar" 9867 msgstr "" 9868 ··· 9910 9911 #: src/components/interstitials/TrendingVideos.tsx:198 9912 #: src/components/interstitials/TrendingVideos.tsx:220 9913 - #: src/screens/Search/modules/ExploreTrendingVideos.tsx:193 9914 - #: src/screens/Search/modules/ExploreTrendingVideos.tsx:212 9915 msgid "View more" 9916 msgstr "" 9917 ··· 9919 msgid "View more trending videos" 9920 msgstr "" 9921 9922 - #: src/view/com/composer/Composer.tsx:580 9923 msgid "View post" 9924 msgstr "" 9925 ··· 10050 msgid "We have sent another verification email to <0>{0}</0>." 10051 msgstr "" 10052 10053 - #: src/screens/Onboarding/StepFinished.tsx:531 10054 msgid "We hope you have a wonderful time. Remember, Bluesky is:" 10055 msgstr "" 10056 ··· 10147 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." 10148 msgstr "" 10149 10150 - #: src/view/com/composer/Composer.tsx:511 10151 msgid "We're sorry! The post you are replying to has been deleted." 10152 msgstr "" 10153 ··· 10198 10199 #: src/view/com/auth/SplashScreen.tsx:51 10200 #: src/view/com/auth/SplashScreen.web.tsx:103 10201 - #: src/view/com/composer/Composer.tsx:854 10202 msgid "What's up?" 10203 msgstr "" 10204 ··· 10229 msgstr "" 10230 10231 #: src/components/interstitials/TrendingVideos.tsx:125 10232 - #: src/screens/Search/modules/ExploreTrendingVideos.tsx:107 10233 msgid "Whoops! Trending videos failed to load." 10234 msgstr "" 10235 ··· 10276 msgid "Write a message" 10277 msgstr "" 10278 10279 - #: src/view/com/composer/Composer.tsx:954 10280 msgid "Write post" 10281 msgstr "" 10282 10283 #: src/screens/PostThread/components/ThreadComposePrompt.tsx:90 10284 - #: src/view/com/composer/Composer.tsx:852 10285 msgid "Write your reply" 10286 msgstr "" 10287 ··· 10299 msgid "www.mylivestream.tv" 10300 msgstr "" 10301 10302 - #: src/view/com/composer/select-language/SuggestedLanguage.tsx:181 10303 msgid "Yes" 10304 msgstr "" 10305 ··· 10466 msgid "You have blocked this user" 10467 msgstr "" 10468 10469 - #: src/components/moderation/ModerationDetailsDialog.tsx:75 10470 #: src/lib/moderation/useModerationCauseDescription.ts:57 10471 #: src/lib/moderation/useModerationCauseDescription.ts:65 10472 msgid "You have blocked this user. You cannot view their content." ··· 10486 msgid "You have hidden this post" 10487 msgstr "" 10488 10489 - #: src/components/moderation/ModerationDetailsDialog.tsx:113 10490 msgid "You have hidden this post." 10491 msgstr "" 10492 10493 - #: src/components/moderation/ModerationDetailsDialog.tsx:106 10494 #: src/lib/moderation/useModerationCauseDescription.ts:99 10495 msgid "You have muted this account." 10496 msgstr "" ··· 10512 msgid "You have no lists." 10513 msgstr "" 10514 10515 - #: src/components/dialogs/StarterPackDialog.tsx:100 10516 msgid "You have no starter packs." 10517 msgstr "" 10518 ··· 10520 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 msgstr "" 10522 10523 - #: src/view/screens/ModerationMutedAccounts.tsx:177 10524 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 msgstr "" 10526 ··· 10544 msgid "You haven't muted any words or tags yet" 10545 msgstr "" 10546 10547 - #: src/components/moderation/ModerationDetailsDialog.tsx:120 10548 #: src/lib/moderation/useModerationCauseDescription.ts:127 10549 msgid "You hid this reply." 10550 msgstr "" ··· 10561 msgid "You joined Bluesky using a starter pack {timeAgoString} ago" 10562 msgstr "" 10563 10564 - #: src/components/moderation/LabelsOnMeDialog.tsx:81 10565 msgid "You may appeal non-self labels if you feel they were placed in error." 10566 msgstr "" 10567 10568 - #: src/components/moderation/LabelsOnMeDialog.tsx:86 10569 msgid "You may appeal these labels if you feel they were placed in error." 10570 msgstr "" 10571 ··· 10695 msgid "You're in line" 10696 msgstr "" 10697 10698 - #: src/screens/Onboarding/StepFinished.tsx:528 10699 msgid "You're ready to go!" 10700 msgstr "" 10701 ··· 10704 msgid "You're signed in with an App Password. Please sign in with your main password to continue deactivating your account." 10705 msgstr "" 10706 10707 - #: src/components/moderation/ModerationDetailsDialog.tsx:110 10708 #: src/lib/moderation/useModerationCauseDescription.ts:108 10709 msgid "You've chosen to hide a word or tag within this post." 10710 msgstr "" ··· 10859 msgid "Your password must be at least 8 characters long." 10860 msgstr "" 10861 10862 - #: src/view/com/composer/Composer.tsx:576 10863 msgid "Your post was sent" 10864 msgstr "" 10865 10866 - #: src/view/com/composer/Composer.tsx:573 10867 msgid "Your posts were sent" 10868 msgstr "" 10869 10870 - #: src/screens/Onboarding/StepFinished.tsx:543 10871 msgid "Your posts, likes, and blocks are public. Mutes are private." 10872 msgstr "" 10873 ··· 10875 msgid "Your preferred language" 10876 msgstr "" 10877 10878 - #: src/screens/Onboarding/StepFinished.tsx:421 10879 msgid "Your profile picture" 10880 msgstr "" 10881 10882 - #: src/screens/Onboarding/StepFinished.tsx:349 10883 msgid "Your profile picture surrounded by concentric circles of other users' profile pictures" 10884 msgstr "" 10885 ··· 10887 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 msgstr "" 10889 10890 - #: src/view/com/composer/Composer.tsx:575 10891 msgid "Your reply was sent" 10892 msgstr "" 10893 10894 - #: src/components/moderation/ReportDialog/index.tsx:397 10895 msgid "Your report will be sent to <0>{0}</0>." 10896 msgstr "" 10897
··· 124 msgid "{0, plural, other {# people have}} used this starter pack!" 125 msgstr "" 126 127 + #: src/components/dialogs/StarterPackDialog.tsx:357 128 msgid "{0, plural, other {+# more}}" 129 msgstr "" 130 ··· 521 msgid "7 days" 522 msgstr "" 523 524 + #: src/screens/Onboarding/StepFinished.tsx:341 525 msgid "A collection of popular feeds you can find on Bluesky, including News, Booksky, Game Dev, Blacksky, and Fountain Pens" 526 msgstr "" 527 ··· 568 msgid "Accept Request" 569 msgstr "" 570 571 #: src/screens/Settings/AccessibilitySettings.tsx:44 572 #: src/screens/Settings/Settings.tsx:220 573 #: src/screens/Settings/Settings.tsx:223 ··· 604 msgid "Account muted" 605 msgstr "" 606 607 + #: src/components/moderation/ModerationDetailsDialog.tsx:103 608 #: src/lib/moderation/useModerationCauseDescription.ts:98 609 msgid "Account Muted" 610 msgstr "" 611 612 + #: src/components/moderation/ModerationDetailsDialog.tsx:89 613 msgid "Account Muted by List" 614 msgstr "" 615 ··· 654 655 #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:169 656 #: src/components/dialogs/MutedWords.tsx:333 657 + #: src/components/dialogs/StarterPackDialog.tsx:371 658 + #: src/components/dialogs/StarterPackDialog.tsx:377 659 #: src/view/com/modals/UserAddRemoveLists.tsx:235 660 msgid "Add" 661 msgstr "" ··· 708 msgid "Add another account" 709 msgstr "" 710 711 + #: src/view/com/composer/Composer.tsx:811 712 msgid "Add another post" 713 msgstr "" 714 715 + #: src/view/com/composer/Composer.tsx:1444 716 msgid "Add another post to thread" 717 msgstr "" 718 ··· 735 msgid "Add media to post" 736 msgstr "" 737 738 + #: src/components/moderation/ReportDialog/index.tsx:403 739 + #: src/components/moderation/ReportDialog/index.tsx:407 740 msgid "Add more details (optional)" 741 msgstr "" 742 ··· 790 msgid "Add to saved posts" 791 msgstr "" 792 793 + #: src/components/dialogs/StarterPackDialog.tsx:176 794 #: src/view/com/profile/ProfileMenu.tsx:308 795 #: src/view/com/profile/ProfileMenu.tsx:311 796 msgid "Add to starter packs" ··· 805 msgid "Added to list" 806 msgstr "" 807 808 + #: src/components/dialogs/StarterPackDialog.tsx:258 809 msgid "Added to starter pack" 810 msgstr "" 811 ··· 813 msgid "Additional details (limit 1000 characters)" 814 msgstr "" 815 816 + #: src/components/moderation/ReportDialog/index.tsx:421 817 msgid "Additional details (limit 300 characters)" 818 msgstr "" 819 ··· 879 #: src/screens/Search/components/SearchLanguageDropdown.tsx:64 880 #: src/screens/Search/components/SearchLanguageDropdown.tsx:99 881 #: src/screens/Search/components/SearchLanguageDropdown.tsx:101 882 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:216 883 msgid "All languages" 884 msgstr "" 885 ··· 903 msgstr "" 904 905 #: src/screens/Settings/ActivityPrivacySettings.tsx:52 906 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:92 907 msgid "Allow others to be notified of your posts" 908 msgstr "" 909 ··· 967 msgstr "" 968 969 #: src/components/dialogs/GifSelect.tsx:253 970 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:298 971 msgid "An error has occurred" 972 msgstr "" 973 ··· 1012 msgid "An error occurred while uploading the video." 1013 msgstr "" 1014 1015 + #: src/screens/Onboarding/StepFinished.tsx:359 1016 msgid "An illustration of several Bluesky posts alongside repost, like, and comment icons" 1017 msgstr "" 1018 ··· 1051 msgid "an unknown error occurred" 1052 msgstr "" 1053 1054 + #: src/components/moderation/ModerationDetailsDialog.tsx:134 1055 #: src/lib/moderation/useModerationCauseDescription.ts:144 1056 msgid "an unknown labeler" 1057 msgstr "" ··· 1089 1090 #: src/screens/Settings/ActivityPrivacySettings.tsx:111 1091 #: src/screens/Settings/ActivityPrivacySettings.tsx:116 1092 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:163 1093 msgid "Anyone who follows me" 1094 msgstr "" 1095 ··· 1125 msgid "App password names must be at least 4 characters long" 1126 msgstr "" 1127 1128 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:72 1129 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:75 1130 msgid "App passwords" 1131 msgstr "" 1132 ··· 1135 msgid "App Passwords" 1136 msgstr "" 1137 1138 + #: src/components/moderation/LabelsOnMeDialog.tsx:150 1139 + #: src/components/moderation/LabelsOnMeDialog.tsx:153 1140 msgid "Appeal" 1141 msgstr "" 1142 1143 + #: src/components/moderation/LabelsOnMeDialog.tsx:268 1144 msgid "Appeal \"{0}\" label" 1145 msgstr "" 1146 1147 + #: src/components/moderation/LabelsOnMeDialog.tsx:258 1148 #: src/screens/Messages/components/ChatDisabled.tsx:103 1149 msgctxt "toast" 1150 msgid "Appeal submitted" ··· 1221 msgid "Are you sure you want to remove this from your feeds?" 1222 msgstr "" 1223 1224 + #: src/view/com/composer/Composer.tsx:760 1225 msgid "Are you sure you'd like to discard this draft?" 1226 msgstr "" 1227 1228 + #: src/view/com/composer/Composer.tsx:950 1229 msgid "Are you sure you'd like to discard this post?" 1230 msgstr "" 1231 ··· 1233 msgid "Are you sure?" 1234 msgstr "" 1235 1236 + #: src/view/com/composer/select-language/SuggestedLanguage.tsx:89 1237 msgid "Are you writing in <0>{suggestedLanguageName}</0>?" 1238 msgstr "" 1239 ··· 1274 msgid "Available" 1275 msgstr "" 1276 1277 + #: src/components/moderation/LabelsOnMeDialog.tsx:315 1278 + #: src/components/moderation/LabelsOnMeDialog.tsx:316 1279 #: src/screens/Login/ChooseAccountForm.tsx:90 1280 #: src/screens/Login/ChooseAccountForm.tsx:95 1281 #: src/screens/Login/ForgotPasswordForm.tsx:123 ··· 1307 msgid "Before creating a post or replying, you must first verify your email." 1308 msgstr "" 1309 1310 + #: src/components/dialogs/StarterPackDialog.tsx:71 1311 #: src/components/StarterPack/ProfileStarterPacks.tsx:231 1312 #: src/components/StarterPack/ProfileStarterPacks.tsx:241 1313 msgid "Before creating a starter pack, you must first verify your email." ··· 1558 msgstr "" 1559 1560 #: src/components/LabelingServiceCard/index.tsx:62 1561 + #: src/components/moderation/ReportDialog/index.tsx:683 1562 #: src/screens/Search/components/StarterPackCard.tsx:106 1563 #: src/screens/Search/Explore.tsx:930 1564 msgid "By {0}" ··· 1626 #: src/screens/Settings/Settings.tsx:289 1627 #: src/screens/Takendown.tsx:108 1628 #: src/screens/Takendown.tsx:111 1629 + #: src/view/com/composer/Composer.tsx:1005 1630 + #: src/view/com/composer/Composer.tsx:1016 1631 #: src/view/com/composer/photos/EditImageDialog.web.tsx:43 1632 #: src/view/com/composer/photos/EditImageDialog.web.tsx:52 1633 #: src/view/shell/desktop/LeftNav.tsx:213 ··· 1695 msgid "Change Handle" 1696 msgstr "" 1697 1698 + #: src/components/moderation/ReportDialog/index.tsx:325 1699 msgid "Change moderation service" 1700 msgstr "" 1701 ··· 1708 msgid "Change password dialog" 1709 msgstr "" 1710 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 msgid "Change report reason" 1717 msgstr "" 1718 ··· 1823 msgid "Choose People" 1824 msgstr "" 1825 1826 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:162 1827 msgid "Choose Post Languages" 1828 msgstr "" 1829 1830 + #: src/screens/Onboarding/StepFinished.tsx:575 1831 msgid "Choose the algorithms that power your custom feeds." 1832 msgstr "" 1833 ··· 1920 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:178 1921 #: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:187 1922 #: src/components/dialogs/SearchablePeopleList.tsx:295 1923 + #: src/components/dialogs/StarterPackDialog.tsx:179 1924 #: src/components/dms/EmojiPopup.android.tsx:58 1925 #: src/components/dms/ReportDialog.tsx:387 1926 #: src/components/dms/ReportDialog.tsx:396 ··· 1938 #: src/components/WhoCanReply.tsx:209 1939 #: src/screens/Settings/components/ChangePasswordDialog.tsx:286 1940 #: src/screens/Settings/components/ChangePasswordDialog.tsx:291 1941 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:313 1942 #: src/view/com/feeds/MissingFeed.tsx:210 1943 #: src/view/com/feeds/MissingFeed.tsx:217 1944 msgid "Close" ··· 1962 #: src/components/dialogs/GifSelect.tsx:263 1963 #: src/components/verification/VerificationsDialog.tsx:136 1964 #: src/components/verification/VerifierDialog.tsx:142 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 msgid "Close dialog" 1969 msgstr "" 1970 ··· 2007 msgid "Closes password update alert" 2008 msgstr "" 2009 2010 + #: src/view/com/composer/Composer.tsx:1013 2011 msgid "Closes post composer and discards post draft" 2012 msgstr "" 2013 ··· 2053 msgid "Community Guidelines" 2054 msgstr "" 2055 2056 + #: src/screens/Onboarding/StepFinished.tsx:473 2057 + #: src/screens/Onboarding/StepFinished.tsx:588 2058 msgid "Complete onboarding and start using your account" 2059 msgstr "" 2060 ··· 2066 msgid "Compose new post" 2067 msgstr "" 2068 2069 + #: src/view/com/composer/Composer.tsx:914 2070 msgid "Compose posts up to {0, plural, other {# characters}} in length" 2071 msgstr "" 2072 ··· 2074 msgid "Compose reply" 2075 msgstr "" 2076 2077 + #: src/view/com/composer/Composer.tsx:1834 2078 msgid "Compressing video..." 2079 msgstr "" 2080 ··· 2186 msgid "Content Languages" 2187 msgstr "" 2188 2189 + #: src/components/moderation/ModerationDetailsDialog.tsx:82 2190 #: src/lib/moderation/useModerationCauseDescription.ts:82 2191 msgid "Content Not Available" 2192 msgstr "" 2193 2194 + #: src/components/moderation/ModerationDetailsDialog.tsx:50 2195 #: src/components/moderation/ScreenHider.tsx:99 2196 #: src/lib/moderation/useGlobalLabelStrings.ts:22 2197 #: src/lib/moderation/useModerationCauseDescription.ts:45 ··· 2411 2412 #. Text on button to create a new starter pack 2413 #. Text on button to create a new starter pack 2414 + #: src/components/dialogs/StarterPackDialog.tsx:112 2415 + #: src/components/dialogs/StarterPackDialog.tsx:201 2416 #: src/components/StarterPack/ProfileStarterPacks.tsx:296 2417 msgid "Create" 2418 msgstr "" ··· 2478 msgid "Create new account" 2479 msgstr "" 2480 2481 + #: src/components/moderation/ReportDialog/index.tsx:585 2482 #: src/components/ReportDialog/SelectReportOptionView.tsx:102 2483 msgid "Create report for {0}" 2484 msgstr "" 2485 2486 + #: src/components/dialogs/StarterPackDialog.tsx:107 2487 + #: src/components/dialogs/StarterPackDialog.tsx:196 2488 msgid "Create starter pack" 2489 msgstr "" 2490 ··· 2639 2640 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:685 2641 #: src/components/PostControls/PostMenu/PostMenuItems.tsx:687 2642 + #: src/view/com/composer/Composer.tsx:924 2643 msgid "Delete post" 2644 msgstr "" 2645 ··· 2752 2753 #: src/components/dialogs/lists/CreateOrEditListDialog.tsx:92 2754 #: src/screens/Profile/Header/EditProfileDialog.tsx:82 2755 + #: src/view/com/composer/Composer.tsx:762 2756 + #: src/view/com/composer/Composer.tsx:957 2757 msgid "Discard" 2758 msgstr "" 2759 ··· 2762 msgid "Discard changes?" 2763 msgstr "" 2764 2765 + #: src/view/com/composer/Composer.tsx:759 2766 msgid "Discard draft?" 2767 msgstr "" 2768 2769 + #: src/view/com/composer/Composer.tsx:949 2770 msgid "Discard post?" 2771 msgstr "" 2772 ··· 2789 msgid "Dismiss" 2790 msgstr "" 2791 2792 + #: src/view/com/composer/Composer.tsx:1758 2793 msgid "Dismiss error" 2794 msgstr "" 2795 ··· 2815 msgid "Display name" 2816 msgstr "" 2817 2818 + #: src/screens/Onboarding/StepFinished.tsx:347 2819 msgid "Ditch the trolls and clickbait. Find real people and conversations that matter to you." 2820 msgstr "" 2821 ··· 2868 #: src/view/com/auth/server-input/index.tsx:233 2869 #: src/view/com/composer/labels/LabelsBtn.tsx:223 2870 #: src/view/com/composer/labels/LabelsBtn.tsx:230 2871 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:281 2872 #: src/view/com/composer/videos/SubtitleDialog.tsx:168 2873 #: src/view/com/composer/videos/SubtitleDialog.tsx:178 2874 msgid "Done" ··· 3055 msgid "Email 2FA disabled" 3056 msgstr "" 3057 3058 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:63 3059 msgid "Email 2FA enabled" 3060 msgstr "" 3061 ··· 3126 msgstr "" 3127 3128 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:139 3129 msgid "Enable notifications for an account by visiting their profile and pressing the <0>bell icon</0> <1/>." 3130 msgstr "" 3131 ··· 3222 msgid "Entertainment" 3223 msgstr "" 3224 3225 + #: src/view/com/composer/Composer.tsx:1843 3226 #: src/view/com/util/error/ErrorScreen.tsx:42 3227 msgid "Error" 3228 msgstr "" ··· 3231 msgid "Error loading post" 3232 msgstr "" 3233 3234 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:154 3235 msgid "Error loading preference" 3236 msgstr "" 3237 ··· 3345 msgid "Expires {0}" 3346 msgstr "" 3347 3348 + #: src/components/moderation/LabelsOnMeDialog.tsx:199 3349 + #: src/components/moderation/ModerationDetailsDialog.tsx:208 3350 msgid "Expires in {0}" 3351 msgstr "" 3352 ··· 3414 msgid "Failed to add emoji reaction" 3415 msgstr "" 3416 3417 + #: src/components/dialogs/StarterPackDialog.tsx:270 3418 msgid "Failed to add to starter pack" 3419 msgstr "" 3420 ··· 3520 msgid "Failed to remove emoji reaction" 3521 msgstr "" 3522 3523 + #: src/components/dialogs/StarterPackDialog.tsx:289 3524 msgid "Failed to remove from starter pack" 3525 msgstr "" 3526 ··· 3554 msgid "Failed to send email, please try again." 3555 msgstr "" 3556 3557 + #: src/components/moderation/LabelsOnMeDialog.tsx:254 3558 #: src/screens/Messages/components/ChatDisabled.tsx:99 3559 msgid "Failed to submit appeal, please try again." 3560 msgstr "" ··· 3697 msgid "Filter who you receive notifications from" 3698 msgstr "" 3699 3700 + #: src/screens/Onboarding/StepFinished.tsx:479 3701 + #: src/screens/Onboarding/StepFinished.tsx:591 3702 msgid "Finalizing" 3703 msgstr "" 3704 ··· 3718 msgid "Find people to follow" 3719 msgstr "" 3720 3721 + #: src/screens/Search/Shell.tsx:476 3722 msgid "Find posts, users, and feeds on Bluesky" 3723 msgstr "" 3724 3725 + #: src/screens/Onboarding/StepFinished.tsx:345 3726 msgid "Find your people" 3727 msgstr "" 3728 ··· 3749 msgid "Flat White" 3750 msgstr "" 3751 3752 + #: src/screens/Onboarding/StepFinished.tsx:571 3753 msgid "Flexible" 3754 msgstr "" 3755 ··· 3923 msgid "Forever" 3924 msgstr "" 3925 3926 + #: src/screens/Onboarding/StepFinished.tsx:354 3927 msgid "Forget the noise" 3928 msgstr "" 3929 ··· 3940 msgid "Forgot?" 3941 msgstr "" 3942 3943 + #: src/screens/Onboarding/StepFinished.tsx:336 3944 msgid "Free your feed" 3945 msgstr "" 3946 ··· 4418 msgstr "" 4419 4420 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:157 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>." 4422 msgstr "" 4423 ··· 4596 msgid "It's just you right now! Add more people to your starter pack by searching above." 4597 msgstr "" 4598 4599 + #: src/view/com/composer/Composer.tsx:1777 4600 msgid "Job ID: {0}" 4601 msgstr "" 4602 ··· 4660 msgid "Labels are annotations on users and content. They can be used to hide, warn, and categorize the network." 4661 msgstr "" 4662 4663 + #: src/components/moderation/LabelsOnMeDialog.tsx:72 4664 msgid "Labels on your account" 4665 msgstr "" 4666 4667 + #: src/components/moderation/LabelsOnMeDialog.tsx:74 4668 msgid "Labels on your content" 4669 msgstr "" 4670 ··· 4746 msgid "Learn more about verification on Bluesky" 4747 msgstr "" 4748 4749 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:128 4750 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:131 4751 msgid "Learn more about what is public on Bluesky." 4752 msgstr "" 4753 ··· 4799 msgid "Let's get your password reset!" 4800 msgstr "" 4801 4802 + #: src/screens/Onboarding/StepFinished.tsx:481 4803 + #: src/screens/Onboarding/StepFinished.tsx:591 4804 msgid "Let's go!" 4805 msgstr "" 4806 ··· 4852 4853 #: src/screens/Post/PostLikedBy.tsx:41 4854 #: src/screens/Profile/ProfileLabelerLikedBy.tsx:32 4855 + #: src/view/screens/ProfileFeedLikedBy.tsx:34 4856 msgid "Liked By" 4857 msgstr "" 4858 ··· 5031 msgid "Log" 5032 msgstr "" 5033 5034 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:107 5035 msgid "Logged-out visibility" 5036 msgstr "" 5037 ··· 5205 msgid "Moderation" 5206 msgstr "" 5207 5208 + #: src/components/moderation/ModerationDetailsDialog.tsx:138 5209 msgid "Moderation details" 5210 msgstr "" 5211 ··· 5254 msgid "Moderation tools" 5255 msgstr "" 5256 5257 + #: src/components/moderation/ModerationDetailsDialog.tsx:52 5258 #: src/lib/moderation/useModerationCauseDescription.ts:47 5259 msgid "Moderator has chosen to set a general warning on the content." 5260 msgstr "" ··· 5264 msgid "More feeds" 5265 msgstr "" 5266 5267 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:70 5268 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:73 5269 msgid "More languages..." 5270 msgstr "" 5271 ··· 5370 msgstr "" 5371 5372 #: src/Navigation.tsx:187 5373 + #: src/view/screens/ModerationMutedAccounts.tsx:118 5374 msgid "Muted Accounts" 5375 msgstr "" 5376 5377 + #: src/view/screens/ModerationMutedAccounts.tsx:204 5378 msgid "Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private." 5379 msgstr "" 5380 ··· 5437 msgid "Navigates to your profile" 5438 msgstr "" 5439 5440 + #: src/components/moderation/ReportDialog/index.tsx:271 5441 + #: src/components/moderation/ReportDialog/index.tsx:288 5442 msgid "Need to report a copyright violation, legal request, or regulatory compliance issue?" 5443 msgstr "" 5444 ··· 5446 msgid "Need to report a copyright violation?" 5447 msgstr "" 5448 5449 + #: src/screens/Onboarding/StepFinished.tsx:559 5450 msgid "Never lose access to your followers or data." 5451 msgstr "" 5452 ··· 5546 msgid "New posts from {firstAuthorName} and {additionalAuthorsCount, plural, one {{formattedAuthorsCount} other} other {{formattedAuthorsCount} others}}" 5547 msgstr "" 5548 5549 + #: src/components/dialogs/StarterPackDialog.tsx:193 5550 msgid "New starter pack" 5551 msgstr "" 5552 ··· 5573 #: src/screens/Login/LoginForm.tsx:350 5574 #: src/screens/Login/SetNewPasswordForm.tsx:182 5575 #: src/screens/Login/SetNewPasswordForm.tsx:188 5576 + #: src/screens/Onboarding/StepFinished.tsx:474 5577 + #: src/screens/Onboarding/StepFinished.tsx:483 5578 #: src/screens/Settings/components/AddAppPasswordDialog.tsx:157 5579 #: src/screens/Settings/components/AddAppPasswordDialog.tsx:165 5580 #: src/screens/Signup/BackNextButtons.tsx:67 ··· 5594 msgid "Next image" 5595 msgstr "" 5596 5597 + #: src/screens/Onboarding/StepFinished.tsx:356 5598 msgid "No ads, no invasive tracking, no engagement traps. Bluesky respects your time and attention." 5599 msgstr "" 5600 ··· 5637 msgid "No messages yet" 5638 msgstr "" 5639 5640 + #: src/screens/Onboarding/StepFinished.tsx:338 5641 msgid "No more doomscrolling junk-filled algorithms. Find feeds that work for you, not against you." 5642 msgstr "" 5643 ··· 5649 #: src/screens/Messages/Settings.tsx:109 5650 #: src/screens/Settings/ActivityPrivacySettings.tsx:129 5651 #: src/screens/Settings/ActivityPrivacySettings.tsx:134 5652 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:160 5653 msgid "No one" 5654 msgstr "" 5655 ··· 5760 msgid "Note about sharing" 5761 msgstr "" 5762 5763 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:117 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." 5765 msgstr "" 5766 ··· 5841 msgstr "" 5842 5843 #: src/components/dialogs/GifSelect.tsx:256 5844 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:301 5845 #: src/view/com/util/ErrorBoundary.tsx:57 5846 msgid "Oh no!" 5847 msgstr "" ··· 5878 msgid "Onboarding reset" 5879 msgstr "" 5880 5881 + #: src/view/com/composer/Composer.tsx:359 5882 msgid "One or more GIFs is missing alt text." 5883 msgstr "" 5884 5885 + #: src/view/com/composer/Composer.tsx:356 5886 msgid "One or more images is missing alt text." 5887 msgstr "" 5888 ··· 5894 msgid "One or more of your selected files are too large. Maximum size is 100ย MB." 5895 msgstr "" 5896 5897 + #: src/view/com/composer/Composer.tsx:366 5898 msgid "One or more videos is missing alt text." 5899 msgstr "" 5900 ··· 5908 5909 #: src/screens/Settings/ActivityPrivacySettings.tsx:120 5910 #: src/screens/Settings/ActivityPrivacySettings.tsx:125 5911 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:158 5912 msgid "Only followers who I follow" 5913 msgstr "" 5914 ··· 5933 msgid "Oops!" 5934 msgstr "" 5935 5936 + #: src/screens/Onboarding/StepFinished.tsx:555 5937 msgid "Open" 5938 msgstr "" 5939 ··· 5951 msgstr "" 5952 5953 #: src/screens/Messages/components/MessageInput.web.tsx:181 5954 + #: src/view/com/composer/Composer.tsx:1429 5955 msgid "Open emoji picker" 5956 msgstr "" 5957 ··· 6051 msgid "Opens device gallery to select up to {MAX_IMAGES, plural, other {# images}}, or a single video or GIF." 6052 msgstr "" 6053 6054 + #: src/view/com/composer/Composer.tsx:1430 6055 msgid "Opens emoji picker" 6056 msgstr "" 6057 ··· 6085 msgid "Opens password reset form" 6086 msgstr "" 6087 6088 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:103 6089 msgid "Opens post language settings" 6090 msgstr "" 6091 ··· 6411 msgid "Please enter your username" 6412 msgstr "" 6413 6414 + #: src/components/moderation/LabelsOnMeDialog.tsx:290 6415 msgid "Please explain why you think this label was incorrectly applied by {0}" 6416 msgstr "" 6417 ··· 6463 msgid "Porn" 6464 msgstr "" 6465 6466 + #: src/screens/PostThread/index.tsx:502 6467 msgctxt "description" 6468 msgid "Post" 6469 msgstr "" 6470 6471 + #: src/view/com/composer/Composer.tsx:1076 6472 msgctxt "action" 6473 msgid "Post" 6474 msgstr "" 6475 6476 + #: src/view/com/composer/Composer.tsx:1074 6477 msgctxt "action" 6478 msgid "Post All" 6479 msgstr "" ··· 6505 msgid "Post has been deleted" 6506 msgstr "" 6507 6508 + #: src/components/moderation/ModerationDetailsDialog.tsx:107 6509 #: src/lib/moderation/useModerationCauseDescription.ts:106 6510 msgid "Post Hidden by Muted Word" 6511 msgstr "" 6512 6513 + #: src/components/moderation/ModerationDetailsDialog.tsx:110 6514 #: src/lib/moderation/useModerationCauseDescription.ts:115 6515 msgid "Post Hidden by You" 6516 msgstr "" ··· 6525 msgstr "" 6526 6527 #. Accessibility label for button that opens dialog to choose post language settings 6528 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:98 6529 msgid "Post language selection" 6530 msgstr "" 6531 ··· 6618 #: src/Navigation.tsx:407 6619 #: src/Navigation.tsx:415 6620 #: src/screens/Settings/ActivityPrivacySettings.tsx:40 6621 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:45 6622 msgid "Privacy and Security" 6623 msgstr "" 6624 6625 #: src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx:161 6626 msgid "Privacy and Security settings" 6627 msgstr "" 6628 ··· 6637 msgid "Privacy Policy" 6638 msgstr "" 6639 6640 + #: src/view/com/composer/Composer.tsx:1840 6641 msgid "Processing video..." 6642 msgstr "" 6643 ··· 6663 msgid "Profile updated" 6664 msgstr "" 6665 6666 + #: src/screens/Onboarding/StepFinished.tsx:541 6667 msgid "Public" 6668 msgstr "" 6669 ··· 6676 msgstr "" 6677 6678 #. Accessibility label for button to publish a single post 6679 + #: src/view/com/composer/Composer.tsx:1056 6680 msgid "Publish post" 6681 msgstr "" 6682 6683 #. Accessibility label for button to publish multiple posts in a thread 6684 + #: src/view/com/composer/Composer.tsx:1049 6685 msgid "Publish posts" 6686 msgstr "" 6687 6688 #. Accessibility label for button to publish multiple replies in a thread 6689 + #: src/view/com/composer/Composer.tsx:1034 6690 msgid "Publish replies" 6691 msgstr "" 6692 6693 #. Accessibility label for button to publish a single reply 6694 + #: src/view/com/composer/Composer.tsx:1041 6695 msgid "Publish reply" 6696 msgstr "" 6697 ··· 6850 msgid "Recent Searches" 6851 msgstr "" 6852 6853 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:210 6854 msgid "Recently used" 6855 msgstr "" 6856 ··· 6878 6879 #: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:171 6880 #: src/components/dialogs/MutedWords.tsx:443 6881 + #: src/components/dialogs/StarterPackDialog.tsx:371 6882 + #: src/components/dialogs/StarterPackDialog.tsx:377 6883 #: src/components/FeedCard.tsx:343 6884 #: src/components/StarterPack/Wizard/WizardListCard.tsx:104 6885 #: src/components/StarterPack/Wizard/WizardListCard.tsx:111 ··· 7024 msgid "Removed from saved posts" 7025 msgstr "" 7026 7027 + #: src/components/dialogs/StarterPackDialog.tsx:277 7028 msgid "Removed from starter pack" 7029 msgstr "" 7030 ··· 7081 msgid "Replies to this post are disabled." 7082 msgstr "" 7083 7084 + #: src/view/com/composer/Composer.tsx:1072 7085 msgctxt "action" 7086 msgid "Reply" 7087 msgstr "" ··· 7091 msgid "Reply ({0, plural, one {# reply} other {# replies}})" 7092 msgstr "" 7093 7094 + #: src/components/moderation/ModerationDetailsDialog.tsx:116 7095 #: src/lib/moderation/useModerationCauseDescription.ts:125 7096 msgid "Reply Hidden by Thread Author" 7097 msgstr "" 7098 7099 + #: src/components/moderation/ModerationDetailsDialog.tsx:115 7100 #: src/lib/moderation/useModerationCauseDescription.ts:124 7101 msgid "Reply Hidden by You" 7102 msgstr "" ··· 7345 #: src/components/dms/MessageItem.tsx:322 7346 #: src/components/Error.tsx:65 7347 #: src/components/Lists.tsx:110 7348 + #: src/components/moderation/ReportDialog/index.tsx:229 7349 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:55 7350 #: src/components/Post/Embed/VideoEmbed/VideoEmbedInner/VideoFallback.tsx:58 7351 #: src/components/StarterPack/ProfileStarterPacks.tsx:342 ··· 7363 #: src/screens/Signup/BackNextButtons.tsx:53 7364 #: src/view/com/util/error/ErrorMessage.tsx:60 7365 #: src/view/com/util/error/ErrorScreen.tsx:97 7366 msgid "Retry" 7367 msgstr "" 7368 7369 + #: src/components/moderation/ReportDialog/index.tsx:226 7370 msgid "Retry loading report options" 7371 msgstr "" 7372 ··· 7496 #: src/components/forms/SearchInput.tsx:34 7497 #: src/components/forms/SearchInput.tsx:36 7498 #: src/screens/Search/Shell.tsx:307 7499 + #: src/screens/Search/Shell.tsx:464 7500 #: src/view/shell/bottom-bar/BottomBar.tsx:198 7501 msgid "Search" 7502 msgstr "" ··· 7556 msgid "Search is currently unavailable when logged out" 7557 msgstr "" 7558 7559 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:193 7560 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:194 7561 msgid "Search languages" 7562 msgstr "" 7563 ··· 7639 msgid "Select {0}" 7640 msgstr "" 7641 7642 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:58 7643 msgid "Select {langName}" 7644 msgstr "" 7645 ··· 7705 msgstr "" 7706 7707 #: src/screens/Settings/LanguageSettings.tsx:178 7708 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:226 7709 msgid "Select languages" 7710 msgstr "" 7711 7712 + #: src/components/moderation/ReportDialog/index.tsx:310 7713 msgid "Select moderation service" 7714 msgstr "" 7715 ··· 7717 msgid "Select moderator" 7718 msgstr "" 7719 7720 + #: src/view/com/composer/select-language/PostLanguageSelect.tsx:45 7721 msgid "Select post language" 7722 msgstr "" 7723 ··· 7738 msgid "Select the moderation service(s) to report to" 7739 msgstr "" 7740 7741 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:172 7742 msgid "Select up to 3 languages used in this post" 7743 msgstr "" 7744 ··· 7800 msgid "Send message" 7801 msgstr "" 7802 7803 + #: src/components/PostControls/ShareMenu/RecentChats.tsx:123 7804 msgid "Send post to {name}" 7805 msgstr "" 7806 ··· 7819 msgid "Send report to {0}" 7820 msgstr "" 7821 7822 + #: src/components/moderation/ReportDialog/index.tsx:649 7823 msgid "Send report to {title}" 7824 msgstr "" 7825 ··· 7875 msgid "Settings for activity from others" 7876 msgstr "" 7877 7878 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:85 7879 msgid "Settings for allowing others to be notified of your posts" 7880 msgstr "" 7881 ··· 8206 msgid "Similar accounts" 8207 msgstr "" 8208 8209 + #: src/screens/Onboarding/StepFinished.tsx:380 8210 + #: src/screens/Onboarding/StepFinished.tsx:462 8211 #: src/screens/Onboarding/StepInterests/index.tsx:240 8212 #: src/screens/Onboarding/StepSuggestedAccounts/index.tsx:222 8213 #: src/screens/StarterPack/Wizard/index.tsx:218 8214 msgid "Skip" 8215 msgstr "" 8216 8217 + #: src/screens/Onboarding/StepFinished.tsx:373 8218 + #: src/screens/Onboarding/StepFinished.tsx:459 8219 msgid "Skip introduction and start using your account" 8220 msgstr "" 8221 ··· 8270 msgstr "" 8271 8272 #: src/components/ageAssurance/AgeAssuranceInitDialog.tsx:138 8273 + #: src/components/moderation/ReportDialog/index.tsx:223 8274 #: src/screens/Deactivated.tsx:94 8275 #: src/screens/Settings/components/DeactivateAccountDialog.tsx:59 8276 msgid "Something went wrong, please try again" 8277 msgstr "" 8278 ··· 8298 msgid "Something wrong? Let us know." 8299 msgstr "" 8300 8301 + #: src/App.native.tsx:125 8302 + #: src/App.web.tsx:101 8303 msgid "Sorry! Your session expired. Please sign in again." 8304 msgstr "" 8305 ··· 8315 msgid "Sort replies to the same post by:" 8316 msgstr "" 8317 8318 + #: src/components/moderation/LabelsOnMeDialog.tsx:178 8319 + #: src/components/moderation/ModerationDetailsDialog.tsx:186 8320 msgid "Source: <0>{sourceName}</0>" 8321 msgstr "" 8322 ··· 8338 msgid "Sports" 8339 msgstr "" 8340 8341 + #: src/components/PostControls/ShareMenu/RecentChats.tsx:208 8342 msgid "Start a conversation, and it will appear here." 8343 msgstr "" 8344 ··· 8412 8413 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:117 8414 #: src/components/ageAssurance/AgeAssuranceAppealDialog.tsx:123 8415 + #: src/components/moderation/LabelsOnMeDialog.tsx:324 8416 + #: src/components/moderation/LabelsOnMeDialog.tsx:325 8417 #: src/screens/Messages/components/ChatDisabled.tsx:154 8418 #: src/screens/Messages/components/ChatDisabled.tsx:155 8419 msgid "Submit" ··· 8427 msgid "Submit Appeal" 8428 msgstr "" 8429 8430 + #: src/components/moderation/ReportDialog/index.tsx:387 8431 + #: src/components/moderation/ReportDialog/index.tsx:444 8432 + #: src/components/moderation/ReportDialog/index.tsx:451 8433 msgid "Submit report" 8434 msgstr "" 8435 ··· 8630 msgid "Text field" 8631 msgstr "" 8632 8633 + #: src/components/moderation/LabelsOnMeDialog.tsx:288 8634 #: src/screens/Messages/components/ChatDisabled.tsx:120 8635 msgid "Text input field" 8636 msgstr "" ··· 8687 msgid "The app will be restarted" 8688 msgstr "" 8689 8690 + #: src/components/moderation/ModerationDetailsDialog.tsx:119 8691 #: src/lib/moderation/useModerationCauseDescription.ts:128 8692 msgid "The author of this thread has hidden this reply." 8693 msgstr "" ··· 8724 msgid "The feed has been replaced with Discover." 8725 msgstr "" 8726 8727 + #: src/components/moderation/LabelsOnMeDialog.tsx:59 8728 msgid "The following labels were applied to your account." 8729 msgstr "" 8730 8731 + #: src/components/moderation/LabelsOnMeDialog.tsx:60 8732 msgid "The following labels were applied to your content." 8733 msgstr "" 8734 ··· 8748 msgid "The open social network." 8749 msgstr "" 8750 8751 #: src/view/screens/PrivacyPolicy.tsx:38 8752 msgid "The Privacy Policy has been moved to <0/>" 8753 msgstr "" ··· 8878 msgstr "" 8879 8880 #: src/components/dialogs/GifSelect.tsx:258 8881 + #: src/view/com/composer/select-language/PostLanguageSelectDialog.tsx:303 8882 #: src/view/com/util/ErrorBoundary.tsx:59 8883 msgid "There was an unexpected issue in the application. Please let us know if this happened to you!" 8884 msgstr "" ··· 8915 msgid "This action can be undone at any time." 8916 msgstr "" 8917 8918 + #: src/components/moderation/LabelsOnMeDialog.tsx:271 8919 msgid "This appeal will be sent to <0>{sourceName}</0>." 8920 msgstr "" 8921 ··· 8943 msgid "This content is hosted by {0}. Do you want to enable external media?" 8944 msgstr "" 8945 8946 + #: src/components/moderation/ModerationDetailsDialog.tsx:84 8947 #: src/lib/moderation/useModerationCauseDescription.ts:84 8948 msgid "This content is not available because one of the users involved has blocked the other." 8949 msgstr "" ··· 9007 msgid "This is not a valid link" 9008 msgstr "" 9009 9010 + #: src/components/moderation/ModerationDetailsDialog.tsx:168 9011 msgid "This label was applied by the author." 9012 msgstr "" 9013 9014 + #: src/components/moderation/LabelsOnMeDialog.tsx:165 9015 msgid "This label was applied by you." 9016 msgstr "" 9017 ··· 9059 msgid "This post will be hidden from feeds and threads. This cannot be undone." 9060 msgstr "" 9061 9062 + #: src/view/com/composer/Composer.tsx:475 9063 msgid "This post's author has disabled quote posts." 9064 msgstr "" 9065 ··· 9095 msgid "This user has blocked you" 9096 msgstr "" 9097 9098 + #: src/components/moderation/ModerationDetailsDialog.tsx:79 9099 #: src/lib/moderation/useModerationCauseDescription.ts:75 9100 msgid "This user has blocked you. You cannot view their content." 9101 msgstr "" ··· 9104 msgid "This user has requested that their content only be shown to signed-in users." 9105 msgstr "" 9106 9107 + #: src/components/moderation/ModerationDetailsDialog.tsx:59 9108 msgid "This user is included in the <0>{0}</0> list which you have blocked." 9109 msgstr "" 9110 9111 + #: src/components/moderation/ModerationDetailsDialog.tsx:91 9112 msgid "This user is included in the <0>{0}</0> list which you have muted." 9113 msgstr "" 9114 ··· 9240 msgid "TV" 9241 msgstr "" 9242 9243 + #: src/screens/Settings/PrivacyAndSecuritySettings.tsx:65 9244 msgid "Two-factor authentication (2FA)" 9245 msgstr "" 9246 ··· 9365 msgid "Unfortunately, Bluesky is unavailable in Mississippi right now." 9366 msgstr "" 9367 9368 + #: src/components/moderation/ReportDialog/index.tsx:372 9369 msgid "Unfortunately, none of your subscribed labelers supports this report type." 9370 msgstr "" 9371 ··· 9487 msgid "Unsubscribed from list" 9488 msgstr "" 9489 9490 + #: src/view/com/composer/Composer.tsx:852 9491 msgid "Unsupported video type: {mimeType}" 9492 msgstr "" 9493 ··· 9573 msgid "Uploading link thumbnail..." 9574 msgstr "" 9575 9576 + #: src/view/com/composer/Composer.tsx:1837 9577 msgid "Uploading video..." 9578 msgstr "" 9579 ··· 9617 msgid "User blocked" 9618 msgstr "" 9619 9620 + #: src/components/moderation/ModerationDetailsDialog.tsx:71 9621 #: src/lib/moderation/useModerationCauseDescription.ts:63 9622 msgid "User Blocked" 9623 msgstr "" ··· 9630 msgid "User blocked by list" 9631 msgstr "" 9632 9633 + #: src/components/moderation/ModerationDetailsDialog.tsx:57 9634 msgid "User Blocked by List" 9635 msgstr "" 9636 ··· 9638 msgid "User Blocking You" 9639 msgstr "" 9640 9641 + #: src/components/moderation/ModerationDetailsDialog.tsx:77 9642 msgid "User Blocks You" 9643 msgstr "" 9644 ··· 9831 msgid "Video settings" 9832 msgstr "" 9833 9834 + #: src/view/com/composer/Composer.tsx:1847 9835 msgid "Video uploaded" 9836 msgstr "" 9837 ··· 9847 msgid "Videos must be less than 3 minutes long." 9848 msgstr "" 9849 9850 + #: src/view/com/composer/Composer.tsx:546 9851 msgctxt "Action to view the post the user just created" 9852 msgid "View" 9853 msgstr "" 9854 9855 + #: src/screens/Profile/Header/Shell.tsx:229 9856 msgid "View {0}'s avatar" 9857 msgstr "" 9858 ··· 9900 9901 #: src/components/interstitials/TrendingVideos.tsx:198 9902 #: src/components/interstitials/TrendingVideos.tsx:220 9903 + #: src/screens/Search/modules/ExploreTrendingVideos.tsx:194 9904 + #: src/screens/Search/modules/ExploreTrendingVideos.tsx:213 9905 msgid "View more" 9906 msgstr "" 9907 ··· 9909 msgid "View more trending videos" 9910 msgstr "" 9911 9912 + #: src/view/com/composer/Composer.tsx:541 9913 msgid "View post" 9914 msgstr "" 9915 ··· 10040 msgid "We have sent another verification email to <0>{0}</0>." 10041 msgstr "" 10042 10043 + #: src/screens/Onboarding/StepFinished.tsx:533 10044 msgid "We hope you have a wonderful time. Remember, Bluesky is:" 10045 msgstr "" 10046 ··· 10137 msgid "We're sorry, but your search could not be completed. Please try again in a few minutes." 10138 msgstr "" 10139 10140 + #: src/view/com/composer/Composer.tsx:472 10141 msgid "We're sorry! The post you are replying to has been deleted." 10142 msgstr "" 10143 ··· 10188 10189 #: src/view/com/auth/SplashScreen.tsx:51 10190 #: src/view/com/auth/SplashScreen.web.tsx:103 10191 + #: src/view/com/composer/Composer.tsx:812 10192 msgid "What's up?" 10193 msgstr "" 10194 ··· 10219 msgstr "" 10220 10221 #: src/components/interstitials/TrendingVideos.tsx:125 10222 + #: src/screens/Search/modules/ExploreTrendingVideos.tsx:108 10223 msgid "Whoops! Trending videos failed to load." 10224 msgstr "" 10225 ··· 10266 msgid "Write a message" 10267 msgstr "" 10268 10269 + #: src/view/com/composer/Composer.tsx:912 10270 msgid "Write post" 10271 msgstr "" 10272 10273 #: src/screens/PostThread/components/ThreadComposePrompt.tsx:90 10274 + #: src/view/com/composer/Composer.tsx:810 10275 msgid "Write your reply" 10276 msgstr "" 10277 ··· 10289 msgid "www.mylivestream.tv" 10290 msgstr "" 10291 10292 + #: src/view/com/composer/select-language/SuggestedLanguage.tsx:102 10293 msgid "Yes" 10294 msgstr "" 10295 ··· 10456 msgid "You have blocked this user" 10457 msgstr "" 10458 10459 + #: src/components/moderation/ModerationDetailsDialog.tsx:73 10460 #: src/lib/moderation/useModerationCauseDescription.ts:57 10461 #: src/lib/moderation/useModerationCauseDescription.ts:65 10462 msgid "You have blocked this user. You cannot view their content." ··· 10476 msgid "You have hidden this post" 10477 msgstr "" 10478 10479 + #: src/components/moderation/ModerationDetailsDialog.tsx:111 10480 msgid "You have hidden this post." 10481 msgstr "" 10482 10483 + #: src/components/moderation/ModerationDetailsDialog.tsx:104 10484 #: src/lib/moderation/useModerationCauseDescription.ts:99 10485 msgid "You have muted this account." 10486 msgstr "" ··· 10502 msgid "You have no lists." 10503 msgstr "" 10504 10505 + #: src/components/dialogs/StarterPackDialog.tsx:101 10506 msgid "You have no starter packs." 10507 msgstr "" 10508 ··· 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." 10511 msgstr "" 10512 10513 + #: src/view/screens/ModerationMutedAccounts.tsx:179 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." 10515 msgstr "" 10516 ··· 10534 msgid "You haven't muted any words or tags yet" 10535 msgstr "" 10536 10537 + #: src/components/moderation/ModerationDetailsDialog.tsx:118 10538 #: src/lib/moderation/useModerationCauseDescription.ts:127 10539 msgid "You hid this reply." 10540 msgstr "" ··· 10551 msgid "You joined Bluesky using a starter pack {timeAgoString} ago" 10552 msgstr "" 10553 10554 + #: src/components/moderation/LabelsOnMeDialog.tsx:79 10555 msgid "You may appeal non-self labels if you feel they were placed in error." 10556 msgstr "" 10557 10558 + #: src/components/moderation/LabelsOnMeDialog.tsx:84 10559 msgid "You may appeal these labels if you feel they were placed in error." 10560 msgstr "" 10561 ··· 10685 msgid "You're in line" 10686 msgstr "" 10687 10688 + #: src/screens/Onboarding/StepFinished.tsx:530 10689 msgid "You're ready to go!" 10690 msgstr "" 10691 ··· 10694 msgid "You're signed in with an App Password. Please sign in with your main password to continue deactivating your account." 10695 msgstr "" 10696 10697 + #: src/components/moderation/ModerationDetailsDialog.tsx:108 10698 #: src/lib/moderation/useModerationCauseDescription.ts:108 10699 msgid "You've chosen to hide a word or tag within this post." 10700 msgstr "" ··· 10849 msgid "Your password must be at least 8 characters long." 10850 msgstr "" 10851 10852 + #: src/view/com/composer/Composer.tsx:537 10853 msgid "Your post was sent" 10854 msgstr "" 10855 10856 + #: src/view/com/composer/Composer.tsx:534 10857 msgid "Your posts were sent" 10858 msgstr "" 10859 10860 + #: src/screens/Onboarding/StepFinished.tsx:545 10861 msgid "Your posts, likes, and blocks are public. Mutes are private." 10862 msgstr "" 10863 ··· 10865 msgid "Your preferred language" 10866 msgstr "" 10867 10868 + #: src/screens/Onboarding/StepFinished.tsx:422 10869 msgid "Your profile picture" 10870 msgstr "" 10871 10872 + #: src/screens/Onboarding/StepFinished.tsx:350 10873 msgid "Your profile picture surrounded by concentric circles of other users' profile pictures" 10874 msgstr "" 10875 ··· 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." 10878 msgstr "" 10879 10880 + #: src/view/com/composer/Composer.tsx:536 10881 msgid "Your reply was sent" 10882 msgstr "" 10883 10884 + #: src/components/moderation/ReportDialog/index.tsx:394 10885 msgid "Your report will be sent to <0>{0}</0>." 10886 msgstr "" 10887
+5 -10
src/logger/metrics.ts
··· 175 'feed:suggestion:press': { 176 feedUrl: string 177 } 178 - 'feed:showMore': { 179 - feed: string 180 feedContext: string 181 } 182 - 'feed:showLess': { 183 - feed: string 184 feedContext: string 185 } 186 - 'feed:clickthrough': { 187 - feed: string 188 count: number 189 } 190 - 'feed:engaged': { 191 - feed: string 192 count: number 193 } 194 - 'feed:seen': { 195 - feed: string 196 count: number 197 } 198
··· 175 'feed:suggestion:press': { 176 feedUrl: string 177 } 178 + 'discover:showMore': { 179 feedContext: string 180 } 181 + 'discover:showLess': { 182 feedContext: string 183 } 184 + 'discover:clickthrough': { 185 count: number 186 } 187 + 'discover:engaged': { 188 count: number 189 } 190 + 'discover:seen': { 191 count: number 192 } 193
+2
src/screens/Onboarding/StepFinished.tsx
··· 69 import * as bsky from '#/types/bsky' 70 71 export function StepFinished() { 72 const {state, dispatch} = useContext(Context) 73 const onboardDispatch = useOnboardingDispatch() 74 const [saving, setSaving] = useState(false) ··· 494 495 function Dot({active}: {active: boolean}) { 496 const t = useTheme() 497 498 return ( 499 <View
··· 69 import * as bsky from '#/types/bsky' 70 71 export function StepFinished() { 72 + const {_} = useLingui() 73 const {state, dispatch} = useContext(Context) 74 const onboardDispatch = useOnboardingDispatch() 75 const [saving, setSaving] = useState(false) ··· 495 496 function Dot({active}: {active: boolean}) { 497 const t = useTheme() 498 + const {_} = useLingui() 499 500 return ( 501 <View
+1 -1
src/screens/PostThread/components/ThreadItemAnchor.tsx
··· 621 622 if (!isBackdated) return null 623 624 - const orange = colors.warning 625 626 return ( 627 <>
··· 621 622 if (!isBackdated) return null 623 624 + const orange = t.name === 'light' ? colors.warning.dark : colors.warning.light 625 626 return ( 627 <>
+12 -13
src/screens/PostThread/index.tsx
··· 148 */ 149 const shouldHandleScroll = useRef(true) 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. 154 * 155 * We want this to fire every time we change params (which will reset 156 * `deferParents` via `onLayout` on the anchor post, due to the key change), ··· 195 * will give us a _positive_ offset, which will scroll the anchor post 196 * back _up_ to the top of the screen. 197 */ 198 - const offset = anchorOffsetTop - headerHeight 199 - list.scrollToOffset({offset}) 200 201 /* 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`. 206 * 207 * The `isRoot` here is needed because if we're looking at the anchor 208 * post, this handler will not fire after `deferParents` is set to 209 * `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. 213 */ 214 - if (offset > 0 || isRoot) shouldHandleScroll.current = false 215 } 216 }) 217
··· 148 */ 149 const shouldHandleScroll = useRef(true) 150 /** 151 + * Called any time the content size of the list changes, _just_ before paint. 152 * 153 * We want this to fire every time we change params (which will reset 154 * `deferParents` via `onLayout` on the anchor post, due to the key change), ··· 193 * will give us a _positive_ offset, which will scroll the anchor post 194 * back _up_ to the top of the screen. 195 */ 196 + list.scrollToOffset({ 197 + offset: anchorOffsetTop - headerHeight, 198 + }) 199 200 /* 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`. 205 * 206 * The `isRoot` here is needed because if we're looking at the anchor 207 * post, this handler will not fire after `deferParents` is set to 208 * `false`, since there are no parents to render above it. In this case, 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. 212 */ 213 + if (!deferParents || isRoot) shouldHandleScroll.current = false 214 } 215 }) 216
+11 -23
src/screens/Profile/Header/Shell.tsx
··· 209 210 {children} 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 - ))} 235 236 <GrowableAvatar style={[a.absolute, {top: 104, left: 10}]}> 237 <TouchableWithoutFeedback
··· 209 210 {children} 211 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 + )} 223 224 <GrowableAvatar style={[a.absolute, {top: 104, left: 10}]}> 225 <TouchableWithoutFeedback
+1
src/screens/Search/Shell.tsx
··· 428 const {hasSession} = useSession() 429 const {gtTablet} = useBreakpoints() 430 const [activeTab, setActiveTab] = useState(0) 431 432 const onPageSelected = useCallback( 433 (index: number) => {
··· 428 const {hasSession} = useSession() 429 const {gtTablet} = useBreakpoints() 430 const [activeTab, setActiveTab] = useState(0) 431 + const {_} = useLingui() 432 433 const onPageSelected = useCallback( 434 (index: number) => {
+1
src/screens/Search/modules/ExploreTrendingVideos.tsx
··· 31 } 32 33 export function ExploreTrendingVideos() { 34 const gutters = useGutters([0, 'base']) 35 const {data, isLoading, error} = usePostFeedQuery(FEED_DESC, FEED_PARAMS) 36
··· 31 } 32 33 export function ExploreTrendingVideos() { 34 + const {_} = useLingui() 35 const gutters = useGutters([0, 'base']) 36 const {data, isLoading, error} = usePostFeedQuery(FEED_DESC, FEED_PARAMS) 37
+1 -1
src/screens/Settings/AppPasswords.tsx
··· 195 </View> 196 {appPassword.privileged && ( 197 <View style={[a.flex_row, a.gap_sm, a.align_center, a.mt_md]}> 198 - <WarningIcon style={[{color: colors.warning}]} /> 199 <Text style={t.atoms.text_contrast_high}> 200 <Trans>Allows access to direct messages</Trans> 201 </Text>
··· 195 </View> 196 {appPassword.privileged && ( 197 <View style={[a.flex_row, a.gap_sm, a.align_center, a.mt_md]}> 198 + <WarningIcon style={[{color: colors.warning[t.scheme]}]} /> 199 <Text style={t.atoms.text_contrast_high}> 200 <Trans>Allows access to direct messages</Trans> 201 </Text>
+2 -2
src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx
··· 134 <Admonition.Outer type="tip"> 135 <Admonition.Row> 136 <Admonition.Icon /> 137 - <Admonition.Content> 138 <Admonition.Text> 139 <Trans> 140 Enable notifications for an account by visiting their ··· 166 . 167 </Trans> 168 </Admonition.Text> 169 - </Admonition.Content> 170 </Admonition.Row> 171 </Admonition.Outer> 172 ) : (
··· 134 <Admonition.Outer type="tip"> 135 <Admonition.Row> 136 <Admonition.Icon /> 137 + <View style={[a.flex_1, a.gap_sm]}> 138 <Admonition.Text> 139 <Trans> 140 Enable notifications for an account by visiting their ··· 166 . 167 </Trans> 168 </Admonition.Text> 169 + </View> 170 </Admonition.Row> 171 </Admonition.Outer> 172 ) : (
+3 -2
src/screens/Settings/PrivacyAndSecuritySettings.tsx
··· 1 import {type AppBskyNotificationDeclaration} from '@atproto/api' 2 import {msg, Trans} from '@lingui/macro' 3 import {useLingui} from '@lingui/react' ··· 111 <Admonition.Outer type="tip" style={[a.flex_1]}> 112 <Admonition.Row> 113 <Admonition.Icon /> 114 - <Admonition.Content> 115 <Admonition.Text> 116 <Trans> 117 Note: Bluesky is an open and public network. This setting ··· 130 <Trans>Learn more about what is public on Bluesky.</Trans> 131 </InlineLinkText> 132 </Admonition.Text> 133 - </Admonition.Content> 134 </Admonition.Row> 135 </Admonition.Outer> 136 </SettingsList.Item>
··· 1 + import {View} from 'react-native' 2 import {type AppBskyNotificationDeclaration} from '@atproto/api' 3 import {msg, Trans} from '@lingui/macro' 4 import {useLingui} from '@lingui/react' ··· 112 <Admonition.Outer type="tip" style={[a.flex_1]}> 113 <Admonition.Row> 114 <Admonition.Icon /> 115 + <View style={[a.flex_1, a.gap_sm]}> 116 <Admonition.Text> 117 <Trans> 118 Note: Bluesky is an open and public network. This setting ··· 131 <Trans>Learn more about what is public on Bluesky.</Trans> 132 </InlineLinkText> 133 </Admonition.Text> 134 + </View> 135 </Admonition.Row> 136 </Admonition.Outer> 137 </SettingsList.Item>
+12 -26
src/state/feed-feedback.tsx
··· 12 13 import {PROD_FEEDS, STAGING_FEEDS} from '#/lib/constants' 14 import {isNetworkError} from '#/lib/hooks/useCleanError' 15 import {Logger} from '#/logger' 16 import { 17 type FeedSourceFeedInfo, ··· 89 const aggregatedStats = useRef<AggregatedStats | null>(null) 90 const throttledFlushAggregatedStats = useMemo( 91 () => 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], 105 ) 106 107 const sendToFeedNoDelay = useCallback(() => { ··· 142 sendOrAggregateInteractionsForStats( 143 aggregatedStats.current, 144 interactionsToSend, 145 - feed?.feedDescriptor ?? 'unknown', 146 ) 147 throttledFlushAggregatedStats() 148 logger.debug('flushed') ··· 279 function sendOrAggregateInteractionsForStats( 280 stats: AggregatedStats, 281 interactions: AppBskyFeedDefs.Interaction[], 282 - feed: string, 283 ) { 284 for (let interaction of interactions) { 285 switch (interaction.event) { 286 // Pressing "Show more" / "Show less" is relatively uncommon so we won't aggregate them. 287 // This lets us send the feed context together with them. 288 case 'app.bsky.feed.defs#requestLess': { 289 - logger.metric('feed:showLess', { 290 - feed, 291 feedContext: interaction.feedContext ?? '', 292 }) 293 break 294 } 295 case 'app.bsky.feed.defs#requestMore': { 296 - logger.metric('feed:showMore', { 297 - feed, 298 feedContext: interaction.feedContext ?? '', 299 }) 300 break ··· 324 } 325 } 326 327 - function flushToStatsig(stats: AggregatedStats | null, feedDescriptor: string) { 328 if (stats === null) { 329 return 330 } 331 332 if (stats.clickthroughCount > 0) { 333 - logger.metric('feed:clickthrough', { 334 count: stats.clickthroughCount, 335 - feed: feedDescriptor, 336 }) 337 stats.clickthroughCount = 0 338 } 339 340 if (stats.engagedCount > 0) { 341 - logger.metric('feed:engaged', { 342 count: stats.engagedCount, 343 - feed: feedDescriptor, 344 }) 345 stats.engagedCount = 0 346 } 347 348 if (stats.seenCount > 0) { 349 - logger.metric('feed:seen', { 350 count: stats.seenCount, 351 - feed: feedDescriptor, 352 }) 353 stats.seenCount = 0 354 }
··· 12 13 import {PROD_FEEDS, STAGING_FEEDS} from '#/lib/constants' 14 import {isNetworkError} from '#/lib/hooks/useCleanError' 15 + import {logEvent} from '#/lib/statsig/statsig' 16 import {Logger} from '#/logger' 17 import { 18 type FeedSourceFeedInfo, ··· 90 const aggregatedStats = useRef<AggregatedStats | null>(null) 91 const throttledFlushAggregatedStats = useMemo( 92 () => 93 + throttle(() => flushToStatsig(aggregatedStats.current), 45e3, { 94 + leading: true, // The outer call is already throttled somewhat. 95 + trailing: true, 96 + }), 97 + [], 98 ) 99 100 const sendToFeedNoDelay = useCallback(() => { ··· 135 sendOrAggregateInteractionsForStats( 136 aggregatedStats.current, 137 interactionsToSend, 138 ) 139 throttledFlushAggregatedStats() 140 logger.debug('flushed') ··· 271 function sendOrAggregateInteractionsForStats( 272 stats: AggregatedStats, 273 interactions: AppBskyFeedDefs.Interaction[], 274 ) { 275 for (let interaction of interactions) { 276 switch (interaction.event) { 277 // Pressing "Show more" / "Show less" is relatively uncommon so we won't aggregate them. 278 // This lets us send the feed context together with them. 279 case 'app.bsky.feed.defs#requestLess': { 280 + logEvent('discover:showLess', { 281 feedContext: interaction.feedContext ?? '', 282 }) 283 break 284 } 285 case 'app.bsky.feed.defs#requestMore': { 286 + logEvent('discover:showMore', { 287 feedContext: interaction.feedContext ?? '', 288 }) 289 break ··· 313 } 314 } 315 316 + function flushToStatsig(stats: AggregatedStats | null) { 317 if (stats === null) { 318 return 319 } 320 321 if (stats.clickthroughCount > 0) { 322 + logEvent('discover:clickthrough', { 323 count: stats.clickthroughCount, 324 }) 325 stats.clickthroughCount = 0 326 } 327 328 if (stats.engagedCount > 0) { 329 + logEvent('discover:engaged', { 330 count: stats.engagedCount, 331 }) 332 stats.engagedCount = 0 333 } 334 335 if (stats.seenCount > 0) { 336 + logEvent('discover:seen', { 337 count: stats.seenCount, 338 }) 339 stats.seenCount = 0 340 }
+1 -1
src/state/persisted/schema.ts
··· 71 contentLanguages: z.array(z.string()), 72 /** 73 * The language(s) the user is currently posting in, configured within the 74 - * composer. Multiple languages are separated by commas. 75 * 76 * BCP-47 2-letter language code without region. 77 */
··· 71 contentLanguages: z.array(z.string()), 72 /** 73 * The language(s) the user is currently posting in, configured within the 74 + * composer. Multiple languages are psearate by commas. 75 * 76 * BCP-47 2-letter language code without region. 77 */
-4
src/state/preferences/languages.tsx
··· 156 return postLanguage.split(',').filter(Boolean) 157 } 158 159 - export function fromPostLanguages(languages: string[]): string { 160 - return languages.filter(Boolean).join(',') 161 - } 162 - 163 export function hasPostLanguage(postLanguage: string, code2: string): boolean { 164 return toPostLanguages(postLanguage).includes(code2) 165 }
··· 156 return postLanguage.split(',').filter(Boolean) 157 } 158 159 export function hasPostLanguage(postLanguage: string, code2: string): boolean { 160 return toPostLanguages(postLanguage).includes(code2) 161 }
+5 -5
src/state/queries/post-feed.ts
··· 492 } 493 } 494 } else if (feedDesc.startsWith('author')) { 495 - const [__, actor, filter] = feedDesc.split('|') 496 return new AuthorFeedAPI({agent, feedParams: {actor, filter}}) 497 } else if (feedDesc.startsWith('likes')) { 498 - const [__, actor] = feedDesc.split('|') 499 return new LikesFeedAPI({agent, feedParams: {actor}}) 500 } else if (feedDesc.startsWith('feedgen')) { 501 - const [__, feed] = feedDesc.split('|') 502 return new CustomFeedAPI({ 503 agent, 504 feedParams: {feed}, 505 userInterests, 506 }) 507 } else if (feedDesc.startsWith('list')) { 508 - const [__, list] = feedDesc.split('|') 509 return new ListFeedAPI({agent, feedParams: {list}}) 510 } else if (feedDesc.startsWith('posts')) { 511 - const [__, uriList] = feedDesc.split('|') 512 return new PostListFeedAPI({agent, feedParams: {uris: uriList.split(',')}}) 513 } else if (feedDesc === 'demo') { 514 return new DemoFeedAPI({agent})
··· 492 } 493 } 494 } else if (feedDesc.startsWith('author')) { 495 + const [_, actor, filter] = feedDesc.split('|') 496 return new AuthorFeedAPI({agent, feedParams: {actor, filter}}) 497 } else if (feedDesc.startsWith('likes')) { 498 + const [_, actor] = feedDesc.split('|') 499 return new LikesFeedAPI({agent, feedParams: {actor}}) 500 } else if (feedDesc.startsWith('feedgen')) { 501 + const [_, feed] = feedDesc.split('|') 502 return new CustomFeedAPI({ 503 agent, 504 feedParams: {feed}, 505 userInterests, 506 }) 507 } else if (feedDesc.startsWith('list')) { 508 + const [_, list] = feedDesc.split('|') 509 return new ListFeedAPI({agent, feedParams: {list}}) 510 } else if (feedDesc.startsWith('posts')) { 511 + const [_, uriList] = feedDesc.split('|') 512 return new PostListFeedAPI({agent, feedParams: {uris: uriList.split(',')}}) 513 } else if (feedDesc === 'demo') { 514 return new DemoFeedAPI({agent})
+1 -1
src/state/queries/trending/useGetSuggestedUsersQuery.ts
··· 69 queryClient.getQueriesData<AppBskyUnspeccedGetSuggestedUsers.OutputSchema>({ 70 queryKey: [getSuggestedUsersQueryKeyRoot], 71 }) 72 - for (const [_key, response] of responses) { 73 if (!response) { 74 continue 75 }
··· 69 queryClient.getQueriesData<AppBskyUnspeccedGetSuggestedUsers.OutputSchema>({ 70 queryKey: [getSuggestedUsersQueryKeyRoot], 71 }) 72 + for (const [_, response] of responses) { 73 if (!response) { 74 continue 75 }
+8
src/state/session/agent.ts
··· 321 322 // Now the agent is ready. 323 const account = agentToSessionAccountOrThrow(this) 324 this.persistSessionHandler = event => { 325 onSessionChange(this, account.did, event) 326 if (event !== 'create' && event !== 'update') { 327 addSessionErrorLog(account.did, event)
··· 321 322 // Now the agent is ready. 323 const account = agentToSessionAccountOrThrow(this) 324 + let lastSession = this.sessionManager.session 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 + 333 onSessionChange(this, account.did, event) 334 if (event !== 'create' && event !== 'update') { 335 addSessionErrorLog(account.did, event)
+6 -55
src/view/com/composer/Composer.tsx
··· 88 import {useModalControls} from '#/state/modals' 89 import {useRequireAltTextEnabled} from '#/state/preferences' 90 import { 91 - fromPostLanguages, 92 toPostLanguages, 93 useLanguagePrefs, 94 useLanguagePrefsApi, ··· 198 const [publishingStage, setPublishingStage] = useState('') 199 const [error, setError] = useState('') 200 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 const [composerState, composerDispatch] = useReducer( 240 composerReducer, 241 { ··· 453 thread, 454 replyTo: replyTo?.uri, 455 onStateChange: setPublishingStage, 456 - langs: currentLanguages, 457 }) 458 ).uris[0] 459 ··· 529 isPartOfThread: thread.posts.length > 1, 530 hasLink: !!post.embed.link, 531 hasQuote: !!post.embed.quote, 532 - langs: fromPostLanguages(currentLanguages), 533 logContext: 'Composer', 534 }) 535 index++ ··· 596 thread, 597 canPost, 598 isPublishing, 599 - currentLanguages, 600 onClose, 601 onPost, 602 onPostSuccess, ··· 693 <> 694 <SuggestedLanguage 695 text={activePost.richtext.text} 696 - replyToLanguages={replyToLanguages} 697 - currentLanguages={currentLanguages} 698 - onAcceptSuggestedLanguage={setAcceptedLanguageSuggestion} 699 /> 700 <ComposerPills 701 isReply={!!replyTo} ··· 718 type: 'add_post', 719 }) 720 }} 721 - currentLanguages={currentLanguages} 722 - onSelectLanguage={onSelectLanguage} 723 /> 724 </> 725 ) ··· 1331 onEmojiButtonPress, 1332 onSelectVideo, 1333 onAddPost, 1334 - currentLanguages, 1335 - onSelectLanguage, 1336 }: { 1337 post: PostDraft 1338 dispatch: (action: PostAction) => void ··· 1341 onError: (error: string) => void 1342 onSelectVideo: (postId: string, asset: ImagePickerAsset) => void 1343 onAddPost: () => void 1344 - currentLanguages: string[] 1345 - onSelectLanguage?: (language: string) => void 1346 }) { 1347 const t = useTheme() 1348 const {_} = useLingui() ··· 1496 <PlusIcon size="lg" /> 1497 </Button> 1498 )} 1499 - <PostLanguageSelect 1500 - currentLanguages={currentLanguages} 1501 - onSelectLanguage={onSelectLanguage} 1502 - /> 1503 <CharProgress 1504 count={post.shortenedGraphemeLength} 1505 style={{width: 65}}
··· 88 import {useModalControls} from '#/state/modals' 89 import {useRequireAltTextEnabled} from '#/state/preferences' 90 import { 91 toPostLanguages, 92 useLanguagePrefs, 93 useLanguagePrefsApi, ··· 197 const [publishingStage, setPublishingStage] = useState('') 198 const [error, setError] = useState('') 199 200 const [composerState, composerDispatch] = useReducer( 201 composerReducer, 202 { ··· 414 thread, 415 replyTo: replyTo?.uri, 416 onStateChange: setPublishingStage, 417 + langs: toPostLanguages(langPrefs.postLanguage), 418 }) 419 ).uris[0] 420 ··· 490 isPartOfThread: thread.posts.length > 1, 491 hasLink: !!post.embed.link, 492 hasQuote: !!post.embed.quote, 493 + langs: langPrefs.postLanguage, 494 logContext: 'Composer', 495 }) 496 index++ ··· 557 thread, 558 canPost, 559 isPublishing, 560 + langPrefs.postLanguage, 561 onClose, 562 onPost, 563 onPostSuccess, ··· 654 <> 655 <SuggestedLanguage 656 text={activePost.richtext.text} 657 + // NOTE(@elijaharita): currently just choosing the first language if any exists 658 + replyToLanguage={replyTo?.langs?.[0]} 659 /> 660 <ComposerPills 661 isReply={!!replyTo} ··· 678 type: 'add_post', 679 }) 680 }} 681 /> 682 </> 683 ) ··· 1289 onEmojiButtonPress, 1290 onSelectVideo, 1291 onAddPost, 1292 }: { 1293 post: PostDraft 1294 dispatch: (action: PostAction) => void ··· 1297 onError: (error: string) => void 1298 onSelectVideo: (postId: string, asset: ImagePickerAsset) => void 1299 onAddPost: () => void 1300 }) { 1301 const t = useTheme() 1302 const {_} = useLingui() ··· 1450 <PlusIcon size="lg" /> 1451 </Button> 1452 )} 1453 + <PostLanguageSelect /> 1454 <CharProgress 1455 count={post.shortenedGraphemeLength} 1456 style={{width: 65}}
+1
src/view/com/composer/photos/EditImageDialog.web.tsx
··· 116 }) { 117 const t = useTheme() 118 const [isDragging, setIsDragging] = useState(false) 119 const control = Dialog.useDialogContext() 120 121 const source = image.source
··· 116 }) { 117 const t = useTheme() 118 const [isDragging, setIsDragging] = useState(false) 119 + const {_} = useLingui() 120 const control = Dialog.useDialogContext() 121 122 const source = image.source
+9 -35
src/view/com/composer/select-language/PostLanguageSelect.tsx
··· 17 import {Text} from '#/components/Typography' 18 import {PostLanguageSelectDialog} from './PostLanguageSelectDialog' 19 20 - export function PostLanguageSelect({ 21 - currentLanguages: currentLanguagesProp, 22 - onSelectLanguage, 23 - }: { 24 - currentLanguages?: string[] 25 - onSelectLanguage?: (language: string) => void 26 - }) { 27 const {_} = useLingui() 28 const langPrefs = useLanguagePrefs() 29 const setLangPrefs = useLanguagePrefsApi() ··· 32 const dedupedHistory = Array.from( 33 new Set([...langPrefs.postLanguageHistory, langPrefs.postLanguage]), 34 ) 35 - 36 - const currentLanguages = 37 - currentLanguagesProp ?? toPostLanguages(langPrefs.postLanguage) 38 39 if ( 40 dedupedHistory.length === 1 && ··· 43 return ( 44 <> 45 <LanguageBtn onPress={languageDialogControl.open} /> 46 - <PostLanguageSelectDialog 47 - control={languageDialogControl} 48 - currentLanguages={currentLanguages} 49 - /> 50 </> 51 ) 52 } ··· 55 <> 56 <Menu.Root> 57 <Menu.Trigger label={_(msg`Select post language`)}> 58 - {({props}) => ( 59 - <LanguageBtn currentLanguages={currentLanguages} {...props} /> 60 - )} 61 </Menu.Trigger> 62 <Menu.Outer> 63 <Menu.Group> ··· 70 <Menu.Item 71 key={historyItem} 72 label={_(msg`Select ${langName}`)} 73 - onPress={() => { 74 - setLangPrefs.setPostLanguage(historyItem) 75 - onSelectLanguage?.(historyItem) 76 - }}> 77 <Menu.ItemText>{langName}</Menu.ItemText> 78 <Menu.ItemRadio 79 - selected={currentLanguages.includes(historyItem)} 80 /> 81 </Menu.Item> 82 ) ··· 94 </Menu.Outer> 95 </Menu.Root> 96 97 - <PostLanguageSelectDialog 98 - control={languageDialogControl} 99 - currentLanguages={currentLanguages} 100 - onSelectLanguage={onSelectLanguage} 101 - /> 102 </> 103 ) 104 } 105 106 - function LanguageBtn( 107 - props: Omit<ButtonProps, 'label' | 'children'> & { 108 - currentLanguages?: string[] 109 - }, 110 - ) { 111 const {_} = useLingui() 112 const langPrefs = useLanguagePrefs() 113 const t = useTheme() 114 115 const postLanguagesPref = toPostLanguages(langPrefs.postLanguage) 116 - const currentLanguages = props.currentLanguages ?? postLanguagesPref 117 118 return ( 119 <Button ··· 132 {({pressed, hovered}) => { 133 const color = 134 pressed || hovered ? t.palette.primary_300 : t.palette.primary_500 135 - if (currentLanguages.length > 0) { 136 return ( 137 <Text 138 style={[ ··· 143 {maxWidth: 100}, 144 ]} 145 numberOfLines={1}> 146 - {currentLanguages 147 .map(lang => codeToLanguageName(lang, langPrefs.appLanguage)) 148 .join(', ')} 149 </Text>
··· 17 import {Text} from '#/components/Typography' 18 import {PostLanguageSelectDialog} from './PostLanguageSelectDialog' 19 20 + export function PostLanguageSelect() { 21 const {_} = useLingui() 22 const langPrefs = useLanguagePrefs() 23 const setLangPrefs = useLanguagePrefsApi() ··· 26 const dedupedHistory = Array.from( 27 new Set([...langPrefs.postLanguageHistory, langPrefs.postLanguage]), 28 ) 29 30 if ( 31 dedupedHistory.length === 1 && ··· 34 return ( 35 <> 36 <LanguageBtn onPress={languageDialogControl.open} /> 37 + <PostLanguageSelectDialog control={languageDialogControl} /> 38 </> 39 ) 40 } ··· 43 <> 44 <Menu.Root> 45 <Menu.Trigger label={_(msg`Select post language`)}> 46 + {({props}) => <LanguageBtn {...props} />} 47 </Menu.Trigger> 48 <Menu.Outer> 49 <Menu.Group> ··· 56 <Menu.Item 57 key={historyItem} 58 label={_(msg`Select ${langName}`)} 59 + onPress={() => setLangPrefs.setPostLanguage(historyItem)}> 60 <Menu.ItemText>{langName}</Menu.ItemText> 61 <Menu.ItemRadio 62 + selected={historyItem === langPrefs.postLanguage} 63 /> 64 </Menu.Item> 65 ) ··· 77 </Menu.Outer> 78 </Menu.Root> 79 80 + <PostLanguageSelectDialog control={languageDialogControl} /> 81 </> 82 ) 83 } 84 85 + function LanguageBtn(props: Omit<ButtonProps, 'label' | 'children'>) { 86 const {_} = useLingui() 87 const langPrefs = useLanguagePrefs() 88 const t = useTheme() 89 90 const postLanguagesPref = toPostLanguages(langPrefs.postLanguage) 91 92 return ( 93 <Button ··· 106 {({pressed, hovered}) => { 107 const color = 108 pressed || hovered ? t.palette.primary_300 : t.palette.primary_500 109 + if (postLanguagesPref.length > 0) { 110 return ( 111 <Text 112 style={[ ··· 117 {maxWidth: 100}, 118 ]} 119 numberOfLines={1}> 120 + {postLanguagesPref 121 .map(lang => codeToLanguageName(lang, langPrefs.appLanguage)) 122 .join(', ')} 123 </Text>
+3 -25
src/view/com/composer/select-language/PostLanguageSelectDialog.tsx
··· 8 import {type Language, LANGUAGES, LANGUAGES_MAP_CODE2} from '#/locale/languages' 9 import {isNative, isWeb} from '#/platform/detection' 10 import { 11 - toPostLanguages, 12 useLanguagePrefs, 13 useLanguagePrefsApi, 14 } from '#/state/preferences/languages' ··· 24 25 export function PostLanguageSelectDialog({ 26 control, 27 - /** 28 - * Optionally can be passed to show different values than what is saved in 29 - * langPrefs. 30 - */ 31 - currentLanguages, 32 - onSelectLanguage, 33 }: { 34 control: Dialog.DialogControlProps 35 - currentLanguages?: string[] 36 - onSelectLanguage?: (language: string) => void 37 }) { 38 const {height} = useWindowDimensions() 39 const insets = useSafeAreaInsets() ··· 49 nativeOptions={{minHeight: height - insets.top}}> 50 <Dialog.Handle /> 51 <ErrorBoundary renderError={renderErrorBoundary}> 52 - <DialogInner 53 - currentLanguages={currentLanguages} 54 - onSelectLanguage={onSelectLanguage} 55 - /> 56 </ErrorBoundary> 57 </Dialog.Outer> 58 ) 59 } 60 61 - export function DialogInner({ 62 - currentLanguages, 63 - onSelectLanguage, 64 - }: { 65 - currentLanguages?: string[] 66 - onSelectLanguage?: (language: string) => void 67 - }) { 68 const control = Dialog.useDialogContext() 69 const [headerHeight, setHeaderHeight] = useState(0) 70 ··· 81 }, []) 82 83 const langPrefs = useLanguagePrefs() 84 - const postLanguagesPref = 85 - currentLanguages ?? toPostLanguages(langPrefs.postLanguage) 86 - 87 const [checkedLanguagesCode2, setCheckedLanguagesCode2] = useState<string[]>( 88 - postLanguagesPref || [langPrefs.primaryLanguage], 89 ) 90 const [search, setSearch] = useState('') 91 ··· 100 langsString = langPrefs.primaryLanguage 101 } 102 setLangPrefs.setPostLanguage(langsString) 103 - onSelectLanguage?.(langsString) 104 }) 105 } 106
··· 8 import {type Language, LANGUAGES, LANGUAGES_MAP_CODE2} from '#/locale/languages' 9 import {isNative, isWeb} from '#/platform/detection' 10 import { 11 useLanguagePrefs, 12 useLanguagePrefsApi, 13 } from '#/state/preferences/languages' ··· 23 24 export function PostLanguageSelectDialog({ 25 control, 26 }: { 27 control: Dialog.DialogControlProps 28 }) { 29 const {height} = useWindowDimensions() 30 const insets = useSafeAreaInsets() ··· 40 nativeOptions={{minHeight: height - insets.top}}> 41 <Dialog.Handle /> 42 <ErrorBoundary renderError={renderErrorBoundary}> 43 + <DialogInner /> 44 </ErrorBoundary> 45 </Dialog.Outer> 46 ) 47 } 48 49 + export function DialogInner() { 50 const control = Dialog.useDialogContext() 51 const [headerHeight, setHeaderHeight] = useState(0) 52 ··· 63 }, []) 64 65 const langPrefs = useLanguagePrefs() 66 const [checkedLanguagesCode2, setCheckedLanguagesCode2] = useState<string[]>( 67 + langPrefs.postLanguage.split(',') || [langPrefs.primaryLanguage], 68 ) 69 const [search, setSearch] = useState('') 70 ··· 79 langsString = langPrefs.primaryLanguage 80 } 81 setLangPrefs.setPostLanguage(langsString) 82 }) 83 } 84
+44 -121
src/view/com/composer/select-language/SuggestedLanguage.tsx
··· 1 import {useEffect, useState} from 'react' 2 - import {Text as RNText, View} from 'react-native' 3 import {parseLanguage} from '@atproto/api' 4 import {msg, Trans} from '@lingui/macro' 5 import {useLingui} from '@lingui/react' 6 import lande from 'lande' 7 8 import {code3ToCode2Strict, codeToLanguageName} from '#/locale/helpers' 9 - import {useLanguagePrefs} from '#/state/preferences/languages' 10 import {atoms as a, useTheme} from '#/alf' 11 import {Button, ButtonText} from '#/components/Button' 12 import {Earth_Stroke2_Corner2_Rounded as EarthIcon} from '#/components/icons/Globe' ··· 18 19 export function SuggestedLanguage({ 20 text, 21 - replyToLanguages: replyToLanguagesProp, 22 - currentLanguages, 23 - onAcceptSuggestedLanguage, 24 }: { 25 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 40 }) { 41 - const langPrefs = useLanguagePrefs() 42 - const replyToLanguages = replyToLanguagesProp 43 - .map(lang => cleanUpLanguage(lang)) 44 - .filter(Boolean) as string[] 45 - const [hasInteracted, setHasInteracted] = useState(false) 46 const [suggestedLanguage, setSuggestedLanguage] = useState< 47 string | undefined 48 - >(undefined) 49 50 useEffect(() => { 51 - if (text.length > 0 && !hasInteracted) { 52 - setHasInteracted(true) 53 } 54 - }, [text, hasInteracted]) 55 56 - useEffect(() => { 57 const textTrimmed = text.trim() 58 59 // Don't run the language model on small posts, the results are likely ··· 68 }) 69 70 return () => cancelIdle(idle) 71 - }, [text]) 72 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) { 90 const suggestedLanguageName = codeToLanguageName( 91 suggestedLanguage, 92 langPrefs.appLanguage, 93 ) 94 95 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 <View 150 style={[ 151 - a.gap_md, 152 a.border, 153 a.flex_row, 154 a.align_center, 155 a.rounded_sm, 156 - a.p_md, 157 - a.pl_lg, 158 t.atoms.bg, 159 - t.atoms.border_contrast_low, 160 ]}> 161 <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> 174 175 <Button 176 - size="small" 177 color="secondary" 178 - onPress={() => onAccept(value)} 179 - label={_(msg`Accept this language suggestion`)}> 180 <ButtonText> 181 <Trans>Yes</Trans> 182 </ButtonText> 183 </Button> 184 </View> 185 - </View> 186 - ) 187 } 188 189 /**
··· 1 import {useEffect, useState} from 'react' 2 + import {View} from 'react-native' 3 import {parseLanguage} from '@atproto/api' 4 import {msg, Trans} from '@lingui/macro' 5 import {useLingui} from '@lingui/react' 6 import lande from 'lande' 7 8 import {code3ToCode2Strict, codeToLanguageName} from '#/locale/helpers' 9 + import { 10 + toPostLanguages, 11 + useLanguagePrefs, 12 + useLanguagePrefsApi, 13 + } from '#/state/preferences/languages' 14 import {atoms as a, useTheme} from '#/alf' 15 import {Button, ButtonText} from '#/components/Button' 16 import {Earth_Stroke2_Corner2_Rounded as EarthIcon} from '#/components/icons/Globe' ··· 22 23 export function SuggestedLanguage({ 24 text, 25 + replyToLanguage: replyToLanguageProp, 26 }: { 27 text: string 28 + replyToLanguage?: string 29 }) { 30 + const replyToLanguage = cleanUpLanguage(replyToLanguageProp) 31 const [suggestedLanguage, setSuggestedLanguage] = useState< 32 string | undefined 33 + >(text.length === 0 ? replyToLanguage : undefined) 34 + const langPrefs = useLanguagePrefs() 35 + const setLangPrefs = useLanguagePrefsApi() 36 + const t = useTheme() 37 + const {_} = useLingui() 38 39 useEffect(() => { 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 45 } 46 47 const textTrimmed = text.trim() 48 49 // Don't run the language model on small posts, the results are likely ··· 58 }) 59 60 return () => cancelIdle(idle) 61 + }, [text, replyToLanguage]) 62 63 + if ( 64 + suggestedLanguage && 65 + !toPostLanguages(langPrefs.postLanguage).includes(suggestedLanguage) 66 + ) { 67 const suggestedLanguageName = codeToLanguageName( 68 suggestedLanguage, 69 langPrefs.appLanguage, 70 ) 71 72 return ( 73 <View 74 style={[ 75 + t.atoms.border_contrast_low, 76 + a.gap_sm, 77 a.border, 78 a.flex_row, 79 a.align_center, 80 a.rounded_sm, 81 + a.px_lg, 82 + a.py_md, 83 + a.mx_md, 84 + a.my_sm, 85 t.atoms.bg, 86 ]}> 87 <EarthIcon /> 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> 94 95 <Button 96 color="secondary" 97 + size="small" 98 + variant="solid" 99 + onPress={() => setLangPrefs.setPostLanguage(suggestedLanguage)} 100 + label={_(msg`Change post language to ${suggestedLanguageName}`)}> 101 <ButtonText> 102 <Trans>Yes</Trans> 103 </ButtonText> 104 </Button> 105 </View> 106 + ) 107 + } else { 108 + return null 109 + } 110 } 111 112 /**
+1 -1
src/view/com/composer/text-input/web/TagDecorator.ts
··· 30 31 let match 32 while ((match = regex.exec(textContent))) { 33 - const [matchedString, __, tag] = match 34 35 if (!tag || tag.replace(TRAILING_PUNCTUATION_REGEX, '').length > 64) 36 continue
··· 30 31 let match 32 while ((match = regex.exec(textContent))) { 33 + const [matchedString, _, tag] = match 34 35 if (!tag || tag.replace(TRAILING_PUNCTUATION_REGEX, '').length > 64) 36 continue
+1 -1
src/view/com/posts/PostFeedErrorMessage.tsx
··· 126 })[knownError], 127 [_l, knownError], 128 ) 129 - const [__, uri] = feedDesc.split('|') 130 const [ownerDid] = safeParseFeedgenUri(uri) 131 const removePromptControl = Prompt.usePromptControl() 132 const {mutateAsync: removeFeed} = useRemoveFeedMutation()
··· 126 })[knownError], 127 [_l, knownError], 128 ) 129 + const [_, uri] = feedDesc.split('|') 130 const [ownerDid] = safeParseFeedgenUri(uri) 131 const removePromptControl = Prompt.usePromptControl() 132 const {mutateAsync: removeFeed} = useRemoveFeedMutation()
+2
src/view/screens/ModerationMutedAccounts.tsx
··· 2 import {type StyleProp, View, type ViewStyle} from 'react-native' 3 import {type AppBskyActorDefs as ActorDefs} from '@atproto/api' 4 import {Trans} from '@lingui/macro' 5 import {useFocusEffect} from '@react-navigation/native' 6 import {type NativeStackScreenProps} from '@react-navigation/native-stack' 7 ··· 26 export function ModerationMutedAccounts({}: Props) { 27 const t = useTheme() 28 const moderationOpts = useModerationOpts() 29 const setMinimalShellMode = useSetMinimalShellMode() 30 31 const [isPTRing, setIsPTRing] = useState(false)
··· 2 import {type StyleProp, View, type ViewStyle} from 'react-native' 3 import {type AppBskyActorDefs as ActorDefs} from '@atproto/api' 4 import {Trans} from '@lingui/macro' 5 + import {useLingui} from '@lingui/react' 6 import {useFocusEffect} from '@react-navigation/native' 7 import {type NativeStackScreenProps} from '@react-navigation/native-stack' 8 ··· 27 export function ModerationMutedAccounts({}: Props) { 28 const t = useTheme() 29 const moderationOpts = useModerationOpts() 30 + const {_} = useLingui() 31 const setMinimalShellMode = useSetMinimalShellMode() 32 33 const [isPTRing, setIsPTRing] = useState(false)
+2
src/view/screens/ProfileFeedLikedBy.tsx
··· 1 import {useCallback} from 'react' 2 import {Trans} from '@lingui/macro' 3 import {useFocusEffect} from '@react-navigation/native' 4 5 import { ··· 16 const setMinimalShellMode = useSetMinimalShellMode() 17 const {name, rkey} = route.params 18 const uri = makeRecordUri(name, 'app.bsky.feed.generator', rkey) 19 20 useFocusEffect( 21 useCallback(() => {
··· 1 import {useCallback} from 'react' 2 import {Trans} from '@lingui/macro' 3 + import {useLingui} from '@lingui/react' 4 import {useFocusEffect} from '@react-navigation/native' 5 6 import { ··· 17 const setMinimalShellMode = useSetMinimalShellMode() 18 const {name, rkey} = route.params 19 const uri = makeRecordUri(name, 'app.bsky.feed.generator', rkey) 20 + const {_} = useLingui() 21 22 useFocusEffect( 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' 4 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' 18 import {InlineLinkText} from '#/components/Link' 19 import {H1} from '#/components/Typography' 20 21 export function Admonitions() { 22 - const {_} = useLingui() 23 - const t = useTheme() 24 - 25 return ( 26 <View style={[a.gap_md]}> 27 <H1>Admonitions</H1> ··· 46 <Admonition type="error"> 47 The quick brown fox jumps over the lazy dog. 48 </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 </View> 105 ) 106 }
··· 1 + import {View} from 'react-native' 2 3 + import {atoms as a} from '#/alf' 4 + import {Admonition} from '#/components/Admonition' 5 import {InlineLinkText} from '#/components/Link' 6 import {H1} from '#/components/Typography' 7 8 export function Admonitions() { 9 return ( 10 <View style={[a.gap_md]}> 11 <H1>Admonitions</H1> ··· 30 <Admonition type="error"> 31 The quick brown fox jumps over the lazy dog. 32 </Admonition> 33 </View> 34 ) 35 }
-25
src/view/screens/Storybook/Buttons.tsx
··· 8 ButtonIcon, 9 type ButtonSize, 10 ButtonText, 11 - StackedButton, 12 } from '#/components/Button' 13 import {ChevronLeft_Stroke2_Corner0_Rounded as ChevronLeft} from '#/components/icons/Chevron' 14 import {Globe_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe' ··· 18 return ( 19 <View style={[a.gap_md]}> 20 <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 46 {[ 47 'primary',
··· 8 ButtonIcon, 9 type ButtonSize, 10 ButtonText, 11 } from '#/components/Button' 12 import {ChevronLeft_Stroke2_Corner0_Rounded as ChevronLeft} from '#/components/icons/Chevron' 13 import {Globe_Stroke2_Corner0_Rounded as Globe} from '#/components/icons/Globe' ··· 17 return ( 18 <View style={[a.gap_md]}> 19 <Text style={[a.font_bold, a.text_5xl]}>Buttons</Text> 20 21 {[ 22 'primary',
+12 -48
yarn.lock
··· 77 tlds "^1.234.0" 78 zod "^3.23.8" 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 "@atproto/aws@^0.2.28": 95 version "0.2.28" 96 resolved "https://registry.yarnpkg.com/@atproto/aws/-/aws-0.2.28.tgz#17bd88a6276e323ebb094a3f01bd94b1173a29a4" ··· 184 uint8arrays "3.0.0" 185 zod "^3.23.8" 186 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 "@atproto/common@0.1.0": 198 version "0.1.0" 199 resolved "https://registry.yarnpkg.com/@atproto/common/-/common-0.1.0.tgz#4216a8fef5b985ab62ac21252a0f8ca0f4a0f210" ··· 322 integrity sha512-3aAzEAy9EAPs3CxznzMhEcqDd7m3vz1eze/ya9/ThbB7yleqJIhz5GY2q76tCCwHPhn5qDDMhlA9kKV6fG23gA== 323 dependencies: 324 "@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 "@atproto/syntax" "^0.4.1" 337 iso-datestring-validator "^2.2.2" 338 multiformats "^9.9.0" ··· 549 integrity sha512-sDi68+QE1XHegTaNAndlX41Gp827pouSzSs8CyAwhrqZdsJUxE3P7TMtrA0z+zAjvxVyvzscRc0TsN/fGUGrhw== 550 dependencies: 551 "@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 zod "^3.23.8" 561 562 "@aws-crypto/crc32@3.0.0": ··· 8646 dependencies: 8647 "@babel/helper-define-polyfill-provider" "^0.6.3" 8648 8649 - babel-plugin-react-compiler@^19.1.0-rc.2, babel-plugin-react-compiler@^19.1.0-rc.3: 8650 version "19.1.0-rc.3" 8651 resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-19.1.0-rc.3.tgz#45e5a282a2460b3701971e5eb8310a90a7919022" 8652 integrity sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA== ··· 10860 dependencies: 10861 "@typescript-eslint/utils" "^5.61.0" 10862 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== 10867 dependencies: 10868 "@babel/core" "^7.24.4" 10869 "@babel/parser" "^7.24.4"
··· 77 tlds "^1.234.0" 78 zod "^3.23.8" 79 80 "@atproto/aws@^0.2.28": 81 version "0.2.28" 82 resolved "https://registry.yarnpkg.com/@atproto/aws/-/aws-0.2.28.tgz#17bd88a6276e323ebb094a3f01bd94b1173a29a4" ··· 170 uint8arrays "3.0.0" 171 zod "^3.23.8" 172 173 "@atproto/common@0.1.0": 174 version "0.1.0" 175 resolved "https://registry.yarnpkg.com/@atproto/common/-/common-0.1.0.tgz#4216a8fef5b985ab62ac21252a0f8ca0f4a0f210" ··· 298 integrity sha512-3aAzEAy9EAPs3CxznzMhEcqDd7m3vz1eze/ya9/ThbB7yleqJIhz5GY2q76tCCwHPhn5qDDMhlA9kKV6fG23gA== 299 dependencies: 300 "@atproto/common-web" "^0.4.2" 301 "@atproto/syntax" "^0.4.1" 302 iso-datestring-validator "^2.2.2" 303 multiformats "^9.9.0" ··· 514 integrity sha512-sDi68+QE1XHegTaNAndlX41Gp827pouSzSs8CyAwhrqZdsJUxE3P7TMtrA0z+zAjvxVyvzscRc0TsN/fGUGrhw== 515 dependencies: 516 "@atproto/lexicon" "^0.5.0" 517 zod "^3.23.8" 518 519 "@aws-crypto/crc32@3.0.0": ··· 8603 dependencies: 8604 "@babel/helper-define-polyfill-provider" "^0.6.3" 8605 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: 8614 version "19.1.0-rc.3" 8615 resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-19.1.0-rc.3.tgz#45e5a282a2460b3701971e5eb8310a90a7919022" 8616 integrity sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA== ··· 10824 dependencies: 10825 "@typescript-eslint/utils" "^5.61.0" 10826 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== 10831 dependencies: 10832 "@babel/core" "^7.24.4" 10833 "@babel/parser" "^7.24.4"