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

Compare changes

Choose any two refs to compare.

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