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