+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==
+22
patches/sonner-native+0.21.0.patch
+22
patches/sonner-native+0.21.0.patch
···
1
+
diff --git a/node_modules/sonner-native/lib/commonjs/toast.js b/node_modules/sonner-native/lib/commonjs/toast.js
2
+
index 121816a..0c3c7bd 100644
3
+
--- a/node_modules/sonner-native/lib/commonjs/toast.js
4
+
+++ b/node_modules/sonner-native/lib/commonjs/toast.js
5
+
@@ -264,7 +264,7 @@ const Toast = exports.Toast = /*#__PURE__*/React.forwardRef(({
6
+
...toastSwipeHandlerProps,
7
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
8
+
entering: entering,
9
+
- exiting: exiting,
10
+
+ exiting: _reactNative.Platform.OS === 'android' ? undefined : exiting,
11
+
children: jsx
12
+
})
13
+
});
14
+
@@ -274,7 +274,7 @@ const Toast = exports.Toast = /*#__PURE__*/React.forwardRef(({
15
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
16
+
style: [unstyled ? undefined : elevationStyle, defaultStyles.toast, toastStyleCtx, styles?.toast, style, wiggleAnimationStyle],
17
+
entering: entering,
18
+
- exiting: exiting,
19
+
+ exiting: _reactNative.Platform.OS === 'android' ? undefined : exiting,
20
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
21
+
style: [defaultStyles.toastContent, toastContentStyleCtx, styles?.toastContent],
22
+
children: [promiseOptions || variant === 'loading' ? 'loading' in icons ? icons.loading : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.ActivityIndicator, {}) : icon ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
+3
patches/sonner-native+0.21.0.patch.md
+3
patches/sonner-native+0.21.0.patch.md
+3
src/components/StarterPack/Wizard/WizardListCard.tsx
+3
src/components/StarterPack/Wizard/WizardListCard.tsx
···
13
13
import {DISCOVER_FEED_URI, STARTER_PACK_MAX_SIZE} from '#/lib/constants'
14
14
import {sanitizeDisplayName} from '#/lib/strings/display-names'
15
15
import {sanitizeHandle} from '#/lib/strings/handles'
16
+
import {logger} from '#/logger'
16
17
import {useSession} from '#/state/session'
17
18
import {UserAvatar} from '#/view/com/util/UserAvatar'
18
19
import {
···
150
151
if (profile.did === targetProfileDid) return
151
152
152
153
if (!included) {
154
+
logger.metric('starterPack:addUser', {})
153
155
dispatch({type: 'AddProfile', profile})
154
156
} else {
157
+
logger.metric('starterPack:removeUser', {})
155
158
dispatch({type: 'RemoveProfile', profileDid: profile.did})
156
159
}
157
160
}
-247
src/components/WelcomeModal.tsx
-247
src/components/WelcomeModal.tsx
···
1
-
import {useEffect, useState} from 'react'
2
-
import {Pressable, View} from 'react-native'
3
-
import {ImageBackground} from 'expo-image'
4
-
import {msg, Trans} from '@lingui/macro'
5
-
import {useLingui} from '@lingui/react'
6
-
import {FocusGuards, FocusScope} from 'radix-ui/internal'
7
-
8
-
import {logger} from '#/logger'
9
-
import {useLoggedOutViewControls} from '#/state/shell/logged-out'
10
-
import {Logo} from '#/view/icons/Logo'
11
-
import {atoms as a, flatten, useBreakpoints, web} from '#/alf'
12
-
import {Button, ButtonText} from '#/components/Button'
13
-
import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times'
14
-
import {Text} from '#/components/Typography'
15
-
16
-
const welcomeModalBg = require('../../assets/images/welcome-modal-bg.jpg')
17
-
18
-
interface WelcomeModalProps {
19
-
control: {
20
-
isOpen: boolean
21
-
open: () => void
22
-
close: () => void
23
-
}
24
-
}
25
-
26
-
export function WelcomeModal({control}: WelcomeModalProps) {
27
-
const {_} = useLingui()
28
-
const {requestSwitchToAccount} = useLoggedOutViewControls()
29
-
const {gtMobile} = useBreakpoints()
30
-
const [isExiting, setIsExiting] = useState(false)
31
-
const [signInLinkHovered, setSignInLinkHovered] = useState(false)
32
-
33
-
const fadeOutAndClose = (callback?: () => void) => {
34
-
setIsExiting(true)
35
-
setTimeout(() => {
36
-
control.close()
37
-
if (callback) callback()
38
-
}, 150)
39
-
}
40
-
41
-
useEffect(() => {
42
-
if (control.isOpen) {
43
-
logger.metric('welcomeModal:presented', {})
44
-
}
45
-
}, [control.isOpen])
46
-
47
-
const onPressCreateAccount = () => {
48
-
logger.metric('welcomeModal:signupClicked', {})
49
-
control.close()
50
-
requestSwitchToAccount({requestedAccount: 'new'})
51
-
}
52
-
53
-
const onPressExplore = () => {
54
-
logger.metric('welcomeModal:exploreClicked', {})
55
-
fadeOutAndClose()
56
-
}
57
-
58
-
const onPressSignIn = () => {
59
-
logger.metric('welcomeModal:signinClicked', {})
60
-
control.close()
61
-
requestSwitchToAccount({requestedAccount: 'existing'})
62
-
}
63
-
64
-
FocusGuards.useFocusGuards()
65
-
66
-
return (
67
-
<View
68
-
role="dialog"
69
-
aria-modal
70
-
style={[
71
-
a.fixed,
72
-
a.inset_0,
73
-
a.justify_center,
74
-
a.align_center,
75
-
{zIndex: 9999, backgroundColor: 'rgba(0,0,0,0.2)'},
76
-
web({backdropFilter: 'blur(15px)'}),
77
-
isExiting ? a.fade_out : a.fade_in,
78
-
]}>
79
-
<FocusScope.FocusScope asChild loop trapped>
80
-
<View
81
-
style={flatten([
82
-
{
83
-
maxWidth: 800,
84
-
maxHeight: 600,
85
-
width: '90%',
86
-
height: '90%',
87
-
backgroundColor: '#C0DCF0',
88
-
},
89
-
a.rounded_lg,
90
-
a.overflow_hidden,
91
-
a.zoom_in,
92
-
])}>
93
-
<ImageBackground
94
-
source={welcomeModalBg}
95
-
style={[a.flex_1, a.justify_center]}
96
-
contentFit="cover">
97
-
<View style={[a.gap_2xl, a.align_center, a.p_4xl]}>
98
-
<View
99
-
style={[
100
-
a.flex_row,
101
-
a.align_center,
102
-
a.justify_center,
103
-
a.w_full,
104
-
a.p_0,
105
-
]}>
106
-
<View style={[a.flex_row, a.align_center, a.gap_xs]}>
107
-
<Logo width={26} />
108
-
<Text
109
-
style={[
110
-
a.text_2xl,
111
-
a.font_semi_bold,
112
-
a.user_select_none,
113
-
{color: '#354358', letterSpacing: -0.5},
114
-
]}>
115
-
Bluesky
116
-
</Text>
117
-
</View>
118
-
</View>
119
-
<View
120
-
style={[
121
-
a.gap_sm,
122
-
a.align_center,
123
-
a.pt_5xl,
124
-
a.pb_3xl,
125
-
a.mt_2xl,
126
-
]}>
127
-
<Text
128
-
style={[
129
-
gtMobile ? a.text_4xl : a.text_3xl,
130
-
a.font_semi_bold,
131
-
a.text_center,
132
-
{color: '#354358'},
133
-
web({
134
-
backgroundImage:
135
-
'linear-gradient(180deg, #313F54 0%, #667B99 83.65%, rgba(102, 123, 153, 0.50) 100%)',
136
-
backgroundClip: 'text',
137
-
WebkitBackgroundClip: 'text',
138
-
WebkitTextFillColor: 'transparent',
139
-
color: 'transparent',
140
-
lineHeight: 1.2,
141
-
letterSpacing: -0.5,
142
-
}),
143
-
]}>
144
-
<Trans>Real people.</Trans>
145
-
{'\n'}
146
-
<Trans>Real conversations.</Trans>
147
-
{'\n'}
148
-
<Trans>Social media you control.</Trans>
149
-
</Text>
150
-
</View>
151
-
<View style={[a.gap_md, a.align_center]}>
152
-
<View>
153
-
<Button
154
-
onPress={onPressCreateAccount}
155
-
label={_(msg`Create account`)}
156
-
size="large"
157
-
color="primary"
158
-
style={{
159
-
width: 200,
160
-
backgroundColor: '#006AFF',
161
-
}}>
162
-
<ButtonText>
163
-
<Trans>Create account</Trans>
164
-
</ButtonText>
165
-
</Button>
166
-
<Button
167
-
onPress={onPressExplore}
168
-
label={_(msg`Explore the app`)}
169
-
size="large"
170
-
color="primary"
171
-
variant="ghost"
172
-
style={[a.bg_transparent, {width: 200}]}
173
-
hoverStyle={[a.bg_transparent]}>
174
-
{({hovered}) => (
175
-
<ButtonText
176
-
style={[hovered && [a.underline], {color: '#006AFF'}]}>
177
-
<Trans>Explore the app</Trans>
178
-
</ButtonText>
179
-
)}
180
-
</Button>
181
-
</View>
182
-
<View style={[a.align_center, {minWidth: 200}]}>
183
-
<Text
184
-
style={[
185
-
a.text_md,
186
-
a.text_center,
187
-
{color: '#405168', lineHeight: 24},
188
-
]}>
189
-
<Trans>Already have an account?</Trans>{' '}
190
-
<Pressable
191
-
onPointerEnter={() => setSignInLinkHovered(true)}
192
-
onPointerLeave={() => setSignInLinkHovered(false)}
193
-
accessibilityRole="button"
194
-
accessibilityLabel={_(msg`Sign in`)}
195
-
accessibilityHint="">
196
-
<Text
197
-
style={[
198
-
a.font_medium,
199
-
{
200
-
color: '#006AFF',
201
-
fontSize: undefined,
202
-
},
203
-
signInLinkHovered && a.underline,
204
-
]}
205
-
onPress={onPressSignIn}>
206
-
<Trans>Sign in</Trans>
207
-
</Text>
208
-
</Pressable>
209
-
</Text>
210
-
</View>
211
-
</View>
212
-
</View>
213
-
<Button
214
-
label={_(msg`Close welcome modal`)}
215
-
style={[
216
-
a.absolute,
217
-
{
218
-
top: 8,
219
-
right: 8,
220
-
},
221
-
a.bg_transparent,
222
-
]}
223
-
hoverStyle={[a.bg_transparent]}
224
-
onPress={() => {
225
-
logger.metric('welcomeModal:dismissed', {})
226
-
fadeOutAndClose()
227
-
}}
228
-
color="secondary"
229
-
size="small"
230
-
variant="ghost"
231
-
shape="round">
232
-
{({hovered, pressed, focused}) => (
233
-
<XIcon
234
-
size="md"
235
-
style={{
236
-
color: '#354358',
237
-
opacity: hovered || pressed || focused ? 1 : 0.7,
238
-
}}
239
-
/>
240
-
)}
241
-
</Button>
242
-
</ImageBackground>
243
-
</View>
244
-
</FocusScope.FocusScope>
245
-
</View>
246
-
)
247
-
}
+4
src/components/dialogs/StarterPackDialog.tsx
+4
src/components/dialogs/StarterPackDialog.tsx
···
11
11
12
12
import {useRequireEmailVerification} from '#/lib/hooks/useRequireEmailVerification'
13
13
import {type NavigationProp} from '#/lib/routes/types'
14
+
import {logger} from '#/logger'
14
15
import {isWeb} from '#/platform/detection'
15
16
import {
16
17
invalidateActorStarterPacksWithMembershipQuery,
···
294
295
if (!starterPack.list?.uri || isPendingRefresh) return
295
296
296
297
const listUri = starterPack.list.uri
298
+
const starterPackUri = starterPack.uri
297
299
298
300
setIsPendingRefresh(true)
299
301
···
302
304
listUri: listUri,
303
305
actorDid: targetDid,
304
306
})
307
+
logger.metric('starterPack:addUser', {starterPack: starterPackUri})
305
308
} else {
306
309
if (!starterPackWithMembership.listItem?.uri) {
307
310
console.error('Cannot remove: missing membership URI')
···
313
316
actorDid: targetDid,
314
317
membershipUri: starterPackWithMembership.listItem.uri,
315
318
})
319
+
logger.metric('starterPack:removeUser', {starterPack: starterPackUri})
316
320
}
317
321
}
318
322
-3
src/components/hooks/useWelcomeModal.native.ts
-3
src/components/hooks/useWelcomeModal.native.ts
-43
src/components/hooks/useWelcomeModal.ts
-43
src/components/hooks/useWelcomeModal.ts
···
1
-
import {useEffect, useState} from 'react'
2
-
3
-
import {isWeb} from '#/platform/detection'
4
-
import {useSession} from '#/state/session'
5
-
6
-
export function useWelcomeModal() {
7
-
const {hasSession} = useSession()
8
-
const [isOpen, setIsOpen] = useState(false)
9
-
10
-
const open = () => setIsOpen(true)
11
-
const close = () => {
12
-
setIsOpen(false)
13
-
// Mark that user has actively closed the modal, don't show again this session
14
-
if (typeof window !== 'undefined') {
15
-
sessionStorage.setItem('welcomeModalClosed', 'true')
16
-
}
17
-
}
18
-
19
-
useEffect(() => {
20
-
// Only show modal if:
21
-
// 1. User is not logged in
22
-
// 2. We're on the web (this is a web-only feature)
23
-
// 3. We're on the homepage (path is '/' or '/home')
24
-
// 4. User hasn't actively closed the modal in this session
25
-
if (isWeb && !hasSession && typeof window !== 'undefined') {
26
-
const currentPath = window.location.pathname
27
-
const isHomePage = currentPath === '/'
28
-
const hasUserClosedModal =
29
-
sessionStorage.getItem('welcomeModalClosed') === 'true'
30
-
31
-
if (isHomePage && !hasUserClosedModal) {
32
-
// Small delay to ensure the page has loaded
33
-
const timer = setTimeout(() => {
34
-
open()
35
-
}, 1000)
36
-
37
-
return () => clearTimeout(timer)
38
-
}
39
-
}
40
-
}, [hasSession])
41
-
42
-
return {isOpen, open, close}
43
-
}
-1
src/lib/statsig/gates.ts
-1
src/lib/statsig/gates.ts
+116
-153
src/locale/locales/en/messages.po
+116
-153
src/locale/locales/en/messages.po
···
125
125
msgid "{0, plural, other {# people have}} used this starter pack!"
126
126
msgstr ""
127
127
128
-
#: src/components/dialogs/StarterPackDialog.tsx:356
128
+
#: src/components/dialogs/StarterPackDialog.tsx:360
129
129
msgid "{0, plural, other {+# more}}"
130
130
msgstr ""
131
131
···
593
593
594
594
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:429
595
595
#: src/screens/Messages/components/RequestButtons.tsx:91
596
-
#: src/view/com/profile/ProfileMenu.tsx:178
596
+
#: src/view/com/profile/ProfileMenu.tsx:183
597
597
msgctxt "toast"
598
598
msgid "Account blocked"
599
599
msgstr ""
600
600
601
-
#: src/view/com/profile/ProfileMenu.tsx:191
601
+
#: src/view/com/profile/ProfileMenu.tsx:196
602
602
msgctxt "toast"
603
603
msgid "Account followed"
604
604
msgstr ""
605
605
606
606
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:452
607
-
#: src/view/com/profile/ProfileMenu.tsx:154
607
+
#: src/view/com/profile/ProfileMenu.tsx:159
608
608
msgctxt "toast"
609
609
msgid "Account muted"
610
610
msgstr ""
···
627
627
msgstr ""
628
628
629
629
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:146
630
-
#: src/view/com/profile/ProfileMenu.tsx:168
630
+
#: src/view/com/profile/ProfileMenu.tsx:173
631
631
msgctxt "toast"
632
632
msgid "Account unblocked"
633
633
msgstr ""
634
634
635
-
#: src/view/com/profile/ProfileMenu.tsx:203
635
+
#: src/view/com/profile/ProfileMenu.tsx:208
636
636
msgctxt "toast"
637
637
msgid "Account unfollowed"
638
638
msgstr ""
639
639
640
640
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:442
641
-
#: src/view/com/profile/ProfileMenu.tsx:144
641
+
#: src/view/com/profile/ProfileMenu.tsx:149
642
642
msgctxt "toast"
643
643
msgid "Account unmuted"
644
644
msgstr ""
···
659
659
660
660
#: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:169
661
661
#: src/components/dialogs/MutedWords.tsx:333
662
-
#: src/components/dialogs/StarterPackDialog.tsx:370
663
-
#: src/components/dialogs/StarterPackDialog.tsx:376
662
+
#: src/components/dialogs/StarterPackDialog.tsx:374
663
+
#: src/components/dialogs/StarterPackDialog.tsx:380
664
664
#: src/view/com/modals/UserAddRemoveLists.tsx:235
665
665
msgid "Add"
666
666
msgstr ""
···
669
669
msgid "Add {0} more to continue"
670
670
msgstr ""
671
671
672
-
#: src/components/StarterPack/Wizard/WizardListCard.tsx:61
672
+
#: src/components/StarterPack/Wizard/WizardListCard.tsx:62
673
673
msgid "Add {displayName} to starter pack"
674
674
msgstr ""
675
675
···
790
790
msgid "Add this feed to your feeds"
791
791
msgstr ""
792
792
793
-
#: src/view/com/profile/ProfileMenu.tsx:361
794
-
#: src/view/com/profile/ProfileMenu.tsx:364
793
+
#: src/view/com/profile/ProfileMenu.tsx:366
794
+
#: src/view/com/profile/ProfileMenu.tsx:369
795
795
msgid "Add to lists"
796
796
msgstr ""
797
797
798
-
#: src/components/dialogs/StarterPackDialog.tsx:175
799
-
#: src/view/com/profile/ProfileMenu.tsx:351
800
-
#: src/view/com/profile/ProfileMenu.tsx:354
798
+
#: src/components/dialogs/StarterPackDialog.tsx:176
799
+
#: src/view/com/profile/ProfileMenu.tsx:356
800
+
#: src/view/com/profile/ProfileMenu.tsx:359
801
801
msgid "Add to starter packs"
802
802
msgstr ""
803
803
···
814
814
msgid "Added to list"
815
815
msgstr ""
816
816
817
-
#: src/components/dialogs/StarterPackDialog.tsx:257
817
+
#: src/components/dialogs/StarterPackDialog.tsx:258
818
818
msgid "Added to starter pack"
819
819
msgstr ""
820
820
···
908
908
msgid "Already have a code?"
909
909
msgstr ""
910
910
911
-
#: src/components/WelcomeModal.tsx:189
912
-
msgid "Already have an account?"
913
-
msgstr ""
914
-
915
911
#: src/screens/Login/ChooseAccountForm.tsx:43
916
912
msgid "Already signed in as @{0}"
917
913
msgstr ""
···
1074
1070
msgstr ""
1075
1071
1076
1072
#: src/Navigation.tsx:524
1077
-
#: src/screens/Settings/AppIconSettings/index.tsx:67
1073
+
#: src/screens/Settings/AppIconSettings/index.tsx:61
1078
1074
#: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:18
1079
1075
#: src/screens/Settings/AppIconSettings/SettingsListItem.tsx:23
1080
1076
msgid "App Icon"
···
1286
1282
msgid "Before creating a post or replying, you must first verify your email."
1287
1283
msgstr ""
1288
1284
1289
-
#: src/components/dialogs/StarterPackDialog.tsx:70
1285
+
#: src/components/dialogs/StarterPackDialog.tsx:71
1290
1286
#: src/components/StarterPack/ProfileStarterPacks.tsx:231
1291
1287
#: src/components/StarterPack/ProfileStarterPacks.tsx:241
1292
1288
msgid "Before creating a starter pack, you must first verify your email."
···
1314
1310
1315
1311
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:858
1316
1312
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:352
1317
-
#: src/view/com/profile/ProfileMenu.tsx:559
1313
+
#: src/view/com/profile/ProfileMenu.tsx:564
1318
1314
msgid "Block"
1319
1315
msgstr ""
1320
1316
···
1324
1320
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:745
1325
1321
#: src/screens/Messages/components/RequestButtons.tsx:144
1326
1322
#: src/screens/Messages/components/RequestButtons.tsx:146
1327
-
#: src/view/com/profile/ProfileMenu.tsx:465
1328
-
#: src/view/com/profile/ProfileMenu.tsx:472
1323
+
#: src/view/com/profile/ProfileMenu.tsx:470
1324
+
#: src/view/com/profile/ProfileMenu.tsx:477
1329
1325
msgid "Block account"
1330
1326
msgstr ""
1331
1327
1332
1328
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:853
1333
-
#: src/view/com/profile/ProfileMenu.tsx:542
1329
+
#: src/view/com/profile/ProfileMenu.tsx:547
1334
1330
msgid "Block Account?"
1335
1331
msgstr ""
1336
1332
···
1386
1382
msgstr ""
1387
1383
1388
1384
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:855
1389
-
#: src/view/com/profile/ProfileMenu.tsx:554
1385
+
#: src/view/com/profile/ProfileMenu.tsx:559
1390
1386
msgid "Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
1391
1387
msgstr ""
1392
1388
···
1403
1399
msgid "Blocking is public. Blocked accounts cannot reply in your threads, mention you, or otherwise interact with you."
1404
1400
msgstr ""
1405
1401
1406
-
#: src/view/com/profile/ProfileMenu.tsx:551
1402
+
#: src/view/com/profile/ProfileMenu.tsx:556
1407
1403
msgid "Blocking will not prevent labels from being applied on your account, but it will stop this account from replying in your threads or interacting with you."
1408
1404
msgstr ""
1409
1405
···
1446
1442
1447
1443
#: src/screens/Signup/StepInfo/Policies.tsx:32
1448
1444
msgid "Bluesky's Updated Community Guidelines"
1449
-
msgstr ""
1450
-
1451
-
#: src/screens/Settings/AppIconSettings/index.tsx:99
1452
-
msgid "Bluesky+"
1453
-
msgstr ""
1454
-
1455
-
#: src/screens/Settings/AppIconSettings/index.tsx:102
1456
-
msgid "Bluesky+ icons"
1457
1445
msgstr ""
1458
1446
1459
1447
#: src/lib/moderation/useLabelBehaviorDescription.ts:56
···
1579
1567
#: src/screens/Profile/Header/EditProfileDialog.tsx:254
1580
1568
#: src/screens/Profile/Header/EditProfileDialog.tsx:262
1581
1569
#: src/screens/Search/Shell.tsx:349
1582
-
#: src/screens/Settings/AppIconSettings/index.tsx:44
1583
-
#: src/screens/Settings/AppIconSettings/index.tsx:230
1570
+
#: src/screens/Settings/AppIconSettings/index.tsx:38
1571
+
#: src/screens/Settings/AppIconSettings/index.tsx:195
1584
1572
#: src/screens/Settings/components/ChangeHandleDialog.tsx:78
1585
1573
#: src/screens/Settings/components/ChangeHandleDialog.tsx:85
1586
1574
#: src/screens/Settings/components/ChangePasswordDialog.tsx:246
···
1645
1633
msgid "Change"
1646
1634
msgstr ""
1647
1635
1648
-
#: src/screens/Settings/AppIconSettings/index.tsx:39
1636
+
#: src/screens/Settings/AppIconSettings/index.tsx:33
1649
1637
msgid "Change app icon"
1650
1638
msgstr ""
1651
1639
1652
-
#: src/screens/Settings/AppIconSettings/index.tsx:38
1653
-
#: src/screens/Settings/AppIconSettings/index.tsx:226
1640
+
#: src/screens/Settings/AppIconSettings/index.tsx:32
1641
+
#: src/screens/Settings/AppIconSettings/index.tsx:191
1654
1642
msgid "Change app icon to \"{0}\""
1655
1643
msgstr ""
1656
1644
···
1684
1672
msgid "Change your password"
1685
1673
msgstr ""
1686
1674
1687
-
#: src/screens/Settings/AppIconSettings/index.tsx:221
1675
+
#: src/screens/Settings/AppIconSettings/index.tsx:186
1688
1676
msgid "Changes app icon"
1689
1677
msgstr ""
1690
1678
···
1880
1868
#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:178
1881
1869
#: src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx:187
1882
1870
#: src/components/dialogs/SearchablePeopleList.tsx:295
1883
-
#: src/components/dialogs/StarterPackDialog.tsx:178
1871
+
#: src/components/dialogs/StarterPackDialog.tsx:179
1884
1872
#: src/components/dms/EmojiPopup.android.tsx:58
1885
1873
#: src/components/dms/ReportDialog.tsx:387
1886
1874
#: src/components/dms/ReportDialog.tsx:396
···
1926
1914
msgid "Close dialog"
1927
1915
msgstr ""
1928
1916
1929
-
#: src/view/shell/index.web.tsx:106
1917
+
#: src/view/shell/index.web.tsx:96
1930
1918
msgid "Close drawer menu"
1931
1919
msgstr ""
1932
1920
···
1957
1945
msgid "Close this dialog"
1958
1946
msgstr ""
1959
1947
1960
-
#: src/components/WelcomeModal.tsx:214
1961
-
msgid "Close welcome modal"
1962
-
msgstr ""
1963
-
1964
1948
#: src/screens/Login/PasswordUpdatedForm.tsx:32
1965
1949
msgid "Closes password update alert"
1966
1950
msgstr ""
···
2217
2201
msgid "Copy App Password"
2218
2202
msgstr ""
2219
2203
2220
-
#: src/view/com/profile/ProfileMenu.tsx:502
2221
-
#: src/view/com/profile/ProfileMenu.tsx:505
2204
+
#: src/view/com/profile/ProfileMenu.tsx:507
2205
+
#: src/view/com/profile/ProfileMenu.tsx:510
2222
2206
msgid "Copy at:// URI"
2223
2207
msgstr ""
2224
2208
···
2233
2217
msgstr ""
2234
2218
2235
2219
#: src/screens/Settings/components/ChangeHandleDialog.tsx:501
2236
-
#: src/view/com/profile/ProfileMenu.tsx:511
2237
-
#: src/view/com/profile/ProfileMenu.tsx:514
2220
+
#: src/view/com/profile/ProfileMenu.tsx:516
2221
+
#: src/view/com/profile/ProfileMenu.tsx:519
2238
2222
msgid "Copy DID"
2239
2223
msgstr ""
2240
2224
···
2265
2249
msgid "Copy link to post"
2266
2250
msgstr ""
2267
2251
2268
-
#: src/view/com/profile/ProfileMenu.tsx:263
2269
-
#: src/view/com/profile/ProfileMenu.tsx:274
2252
+
#: src/view/com/profile/ProfileMenu.tsx:268
2253
+
#: src/view/com/profile/ProfileMenu.tsx:279
2270
2254
msgid "Copy link to profile"
2271
2255
msgstr ""
2272
2256
···
2298
2282
msgstr ""
2299
2283
2300
2284
#: src/components/PostControls/ShareMenu/ShareMenuItems.web.tsx:104
2301
-
#: src/view/com/profile/ProfileMenu.tsx:283
2302
-
#: src/view/com/profile/ProfileMenu.tsx:293
2285
+
#: src/view/com/profile/ProfileMenu.tsx:288
2286
+
#: src/view/com/profile/ProfileMenu.tsx:298
2303
2287
#: src/view/screens/ProfileList.tsx:530
2304
2288
msgid "Copy via bsky.app"
2305
2289
msgstr ""
···
2357
2341
2358
2342
#. Text on button to create a new starter pack
2359
2343
#. Text on button to create a new starter pack
2360
-
#: src/components/dialogs/StarterPackDialog.tsx:111
2361
-
#: src/components/dialogs/StarterPackDialog.tsx:200
2344
+
#: src/components/dialogs/StarterPackDialog.tsx:112
2345
+
#: src/components/dialogs/StarterPackDialog.tsx:201
2362
2346
#: src/components/StarterPack/ProfileStarterPacks.tsx:296
2363
2347
msgid "Create"
2364
2348
msgstr ""
···
2379
2363
2380
2364
#: src/components/LoggedOutCTA.tsx:71
2381
2365
#: src/components/LoggedOutCTA.tsx:76
2382
-
#: src/components/WelcomeModal.tsx:155
2383
-
#: src/components/WelcomeModal.tsx:163
2384
2366
#: src/view/com/auth/SplashScreen.tsx:74
2385
2367
#: src/view/com/auth/SplashScreen.web.tsx:123
2386
2368
#: src/view/shell/bottom-bar/BottomBar.tsx:345
···
2429
2411
msgid "Create report for {0}"
2430
2412
msgstr ""
2431
2413
2432
-
#: src/components/dialogs/StarterPackDialog.tsx:106
2433
-
#: src/components/dialogs/StarterPackDialog.tsx:195
2414
+
#: src/components/dialogs/StarterPackDialog.tsx:107
2415
+
#: src/components/dialogs/StarterPackDialog.tsx:196
2434
2416
msgid "Create starter pack"
2435
2417
msgstr ""
2436
2418
···
2459
2441
msgid "Customize who can interact with this post."
2460
2442
msgstr ""
2461
2443
2462
-
#: src/screens/Onboarding/Layout.tsx:60
2444
+
#: src/screens/Onboarding/Layout.tsx:61
2463
2445
msgid "Customizes your Bluesky experience"
2464
2446
msgstr ""
2465
2447
···
2519
2501
msgid "Default"
2520
2502
msgstr ""
2521
2503
2522
-
#: src/screens/Settings/AppIconSettings/index.tsx:75
2504
+
#: src/screens/Settings/AppIconSettings/index.tsx:69
2523
2505
msgid "Default icons"
2524
2506
msgstr ""
2525
2507
···
2654
2636
msgid "Detach quote post?"
2655
2637
msgstr ""
2656
2638
2639
+
#: src/screens/Settings/AppIconSettings/useAppIconSets.ts:43
2640
+
msgctxt "Name of app icon variant"
2641
+
msgid "Dev mode!!!"
2642
+
msgstr ""
2643
+
2657
2644
#: src/screens/Settings/AboutSettings.tsx:138
2658
2645
msgctxt "toast"
2659
2646
msgid "Developer mode disabled"
···
2805
2792
msgid "Ditch the trolls and clickbait. Find real people and conversations that matter to you."
2806
2793
msgstr ""
2807
2794
2808
-
#: src/view/com/profile/ProfileMenu.tsx:323
2809
-
#: src/view/com/profile/ProfileMenu.tsx:335
2795
+
#: src/view/com/profile/ProfileMenu.tsx:328
2796
+
#: src/view/com/profile/ProfileMenu.tsx:340
2810
2797
msgid "Divorce mutual"
2811
2798
msgstr ""
2812
2799
···
3002
2989
msgid "Edit list details"
3003
2990
msgstr ""
3004
2991
3005
-
#: src/view/com/profile/ProfileMenu.tsx:398
3006
-
#: src/view/com/profile/ProfileMenu.tsx:404
2992
+
#: src/view/com/profile/ProfileMenu.tsx:403
2993
+
#: src/view/com/profile/ProfileMenu.tsx:409
3007
2994
msgid "Edit live status"
3008
2995
msgstr ""
3009
2996
···
3393
3380
msgid "Explore"
3394
3381
msgstr ""
3395
3382
3396
-
#: src/components/WelcomeModal.tsx:168
3397
-
#: src/components/WelcomeModal.tsx:177
3398
-
msgid "Explore the app"
3399
-
msgstr ""
3400
-
3401
3383
#: src/screens/Settings/AccountSettings.tsx:150
3402
3384
#: src/screens/Settings/AccountSettings.tsx:154
3403
3385
msgid "Export my data"
···
3437
3419
msgid "Failed to add emoji reaction"
3438
3420
msgstr ""
3439
3421
3440
-
#: src/components/dialogs/StarterPackDialog.tsx:269
3422
+
#: src/components/dialogs/StarterPackDialog.tsx:270
3441
3423
msgid "Failed to add to starter pack"
3442
3424
msgstr ""
3443
3425
···
3543
3525
msgid "Failed to remove emoji reaction"
3544
3526
msgstr ""
3545
3527
3546
-
#: src/components/dialogs/StarterPackDialog.tsx:288
3528
+
#: src/components/dialogs/StarterPackDialog.tsx:289
3547
3529
msgid "Failed to remove from starter pack"
3548
3530
msgstr ""
3549
3531
···
3647
3629
msgid "Feed menu"
3648
3630
msgstr ""
3649
3631
3650
-
#: src/components/StarterPack/Wizard/WizardListCard.tsx:57
3632
+
#: src/components/StarterPack/Wizard/WizardListCard.tsx:58
3651
3633
msgid "Feed toggle"
3652
3634
msgstr ""
3653
3635
···
3797
3779
msgid "Follow 7 accounts"
3798
3780
msgstr ""
3799
3781
3800
-
#: src/view/com/profile/ProfileMenu.tsx:325
3801
-
#: src/view/com/profile/ProfileMenu.tsx:340
3782
+
#: src/view/com/profile/ProfileMenu.tsx:330
3783
+
#: src/view/com/profile/ProfileMenu.tsx:345
3802
3784
msgid "Follow account"
3803
3785
msgstr ""
3804
3786
···
4092
4074
#: src/components/dms/ReportDialog.tsx:197
4093
4075
#: src/components/ReportDialog/SelectReportOptionView.tsx:81
4094
4076
#: src/components/ReportDialog/SubmitView.tsx:110
4095
-
#: src/screens/Onboarding/Layout.tsx:120
4096
-
#: src/screens/Onboarding/Layout.tsx:213
4077
+
#: src/screens/Onboarding/Layout.tsx:121
4078
+
#: src/screens/Onboarding/Layout.tsx:214
4097
4079
#: src/screens/Signup/BackNextButtons.tsx:35
4098
4080
msgid "Go back to previous step"
4099
4081
msgstr ""
···
4112
4094
msgid "Go Home"
4113
4095
msgstr ""
4114
4096
4115
-
#: src/view/com/profile/ProfileMenu.tsx:399
4116
-
#: src/view/com/profile/ProfileMenu.tsx:406
4097
+
#: src/view/com/profile/ProfileMenu.tsx:404
4098
+
#: src/view/com/profile/ProfileMenu.tsx:411
4117
4099
msgid "Go live"
4118
4100
msgstr ""
4119
4101
···
5302
5284
msgstr ""
5303
5285
5304
5286
#: src/screens/ProfileList/components/MoreOptionsMenu.tsx:149
5305
-
#: src/view/com/profile/ProfileMenu.tsx:240
5306
-
#: src/view/com/profile/ProfileMenu.tsx:246
5287
+
#: src/view/com/profile/ProfileMenu.tsx:245
5288
+
#: src/view/com/profile/ProfileMenu.tsx:251
5307
5289
#: src/view/screens/ProfileList.tsx:768
5308
5290
msgid "More options"
5309
5291
msgstr ""
···
5337
5319
5338
5320
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:726
5339
5321
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:732
5340
-
#: src/view/com/profile/ProfileMenu.tsx:444
5341
-
#: src/view/com/profile/ProfileMenu.tsx:451
5322
+
#: src/view/com/profile/ProfileMenu.tsx:449
5323
+
#: src/view/com/profile/ProfileMenu.tsx:456
5342
5324
msgid "Mute account"
5343
5325
msgstr ""
5344
5326
···
5594
5576
msgid "New posts from {firstAuthorName} and {additionalAuthorsCount, plural, one {{formattedAuthorsCount} other} other {{formattedAuthorsCount} others}}"
5595
5577
msgstr ""
5596
5578
5597
-
#: src/components/dialogs/StarterPackDialog.tsx:192
5579
+
#: src/components/dialogs/StarterPackDialog.tsx:193
5598
5580
msgid "New starter pack"
5599
5581
msgstr ""
5600
5582
···
5630
5612
#: src/screens/StarterPack/Wizard/index.tsx:214
5631
5613
#: src/screens/StarterPack/Wizard/index.tsx:392
5632
5614
#: src/screens/StarterPack/Wizard/index.tsx:399
5633
-
msgid "Next"
5634
-
msgstr ""
5635
-
5636
-
#: src/screens/Settings/AppIconSettings/useAppIconSets.ts:42
5637
-
msgctxt "Name of app icon variant"
5638
5615
msgid "Next"
5639
5616
msgstr ""
5640
5617
···
5800
5777
msgid "Not Found"
5801
5778
msgstr ""
5802
5779
5803
-
#: src/view/com/profile/ProfileMenu.tsx:566
5780
+
#: src/view/com/profile/ProfileMenu.tsx:571
5804
5781
msgid "Note about sharing"
5805
5782
msgstr ""
5806
5783
···
5889
5866
#. Confirm button text.
5890
5867
#: src/screens/Profile/Header/ProfileHeaderLabeler.tsx:391
5891
5868
#: src/screens/Search/modules/ExploreInterestsCard.tsx:48
5892
-
#: src/screens/Settings/AppIconSettings/index.tsx:48
5893
-
#: src/screens/Settings/AppIconSettings/index.tsx:234
5869
+
#: src/screens/Settings/AppIconSettings/index.tsx:42
5870
+
#: src/screens/Settings/AppIconSettings/index.tsx:199
5894
5871
msgid "OK"
5895
5872
msgstr ""
5896
5873
···
6270
6247
msgid "Permission to access your photo library was denied. Please enable it in your system settings."
6271
6248
msgstr ""
6272
6249
6273
-
#: src/components/StarterPack/Wizard/WizardListCard.tsx:57
6250
+
#: src/components/StarterPack/Wizard/WizardListCard.tsx:58
6274
6251
msgid "Person toggle"
6275
6252
msgstr ""
6276
6253
···
6871
6848
msgid "Read the patches and contribute"
6872
6849
msgstr ""
6873
6850
6874
-
#: src/components/WelcomeModal.tsx:146
6875
-
msgid "Real conversations."
6876
-
msgstr ""
6877
-
6878
-
#: src/components/WelcomeModal.tsx:144
6879
-
msgid "Real people."
6880
-
msgstr ""
6881
-
6882
6851
#: src/screens/Takendown.tsx:171
6883
6852
#: src/screens/Takendown.tsx:179
6884
6853
msgid "Reason for appeal"
···
6937
6906
6938
6907
#: src/components/dialogs/lists/ListAddRemoveUsersDialog.tsx:171
6939
6908
#: src/components/dialogs/MutedWords.tsx:443
6940
-
#: src/components/dialogs/StarterPackDialog.tsx:370
6941
-
#: src/components/dialogs/StarterPackDialog.tsx:376
6909
+
#: src/components/dialogs/StarterPackDialog.tsx:374
6910
+
#: src/components/dialogs/StarterPackDialog.tsx:380
6942
6911
#: src/components/FeedCard.tsx:343
6943
-
#: src/components/StarterPack/Wizard/WizardListCard.tsx:104
6944
-
#: src/components/StarterPack/Wizard/WizardListCard.tsx:111
6912
+
#: src/components/StarterPack/Wizard/WizardListCard.tsx:105
6913
+
#: src/components/StarterPack/Wizard/WizardListCard.tsx:112
6945
6914
#: src/screens/Bookmarks/index.tsx:255
6946
6915
#: src/screens/Settings/Settings.tsx:668
6947
6916
#: src/view/com/modals/UserAddRemoveLists.tsx:235
···
6949
6918
msgid "Remove"
6950
6919
msgstr ""
6951
6920
6952
-
#: src/components/StarterPack/Wizard/WizardListCard.tsx:60
6921
+
#: src/components/StarterPack/Wizard/WizardListCard.tsx:61
6953
6922
msgid "Remove {displayName} from starter pack"
6954
6923
msgstr ""
6955
6924
···
7050
7019
msgid "Remove this feed from your saved feeds"
7051
7020
msgstr ""
7052
7021
7053
-
#: src/view/com/profile/ProfileMenu.tsx:373
7054
7022
#: src/view/com/profile/ProfileMenu.tsx:378
7023
+
#: src/view/com/profile/ProfileMenu.tsx:383
7055
7024
msgid "Remove trust"
7056
7025
msgstr ""
7057
7026
···
7061
7030
7062
7031
#: src/components/verification/VerificationRemovePrompt.tsx:46
7063
7032
#: src/components/verification/VerificationsDialog.tsx:252
7064
-
#: src/view/com/profile/ProfileMenu.tsx:417
7065
-
#: src/view/com/profile/ProfileMenu.tsx:420
7033
+
#: src/view/com/profile/ProfileMenu.tsx:422
7034
+
#: src/view/com/profile/ProfileMenu.tsx:425
7066
7035
msgid "Remove verification"
7067
7036
msgstr ""
7068
7037
···
7092
7061
msgid "Removed from saved feeds"
7093
7062
msgstr ""
7094
7063
7095
-
#: src/components/dialogs/StarterPackDialog.tsx:276
7064
+
#: src/components/dialogs/StarterPackDialog.tsx:277
7096
7065
msgid "Removed from starter pack"
7097
7066
msgstr ""
7098
7067
···
7209
7178
msgid "Report"
7210
7179
msgstr ""
7211
7180
7212
-
#: src/view/com/profile/ProfileMenu.tsx:484
7213
-
#: src/view/com/profile/ProfileMenu.tsx:487
7181
+
#: src/view/com/profile/ProfileMenu.tsx:489
7182
+
#: src/view/com/profile/ProfileMenu.tsx:492
7214
7183
msgid "Report account"
7215
7184
msgstr ""
7216
7185
···
7662
7631
msgid "Search my posts"
7663
7632
msgstr ""
7664
7633
7665
-
#: src/view/com/profile/ProfileMenu.tsx:302
7666
-
#: src/view/com/profile/ProfileMenu.tsx:305
7634
+
#: src/view/com/profile/ProfileMenu.tsx:307
7635
+
#: src/view/com/profile/ProfileMenu.tsx:310
7667
7636
msgid "Search posts"
7668
7637
msgstr ""
7669
7638
···
7945
7914
msgid "Server address"
7946
7915
msgstr ""
7947
7916
7948
-
#: src/screens/Settings/AppIconSettings/index.tsx:178
7917
+
#: src/screens/Settings/AppIconSettings/index.tsx:143
7949
7918
msgid "Set app icon to {0}"
7950
7919
msgstr ""
7951
7920
···
7953
7922
msgid "Set new password"
7954
7923
msgstr ""
7955
7924
7956
-
#: src/screens/Onboarding/Layout.tsx:49
7925
+
#: src/screens/Onboarding/Layout.tsx:50
7957
7926
msgid "Set up your account"
7958
7927
msgstr ""
7959
7928
···
8047
8016
msgid "Share a fun fact!"
8048
8017
msgstr ""
8049
8018
8050
-
#: src/view/com/profile/ProfileMenu.tsx:571
8019
+
#: src/view/com/profile/ProfileMenu.tsx:576
8051
8020
msgid "Share anyway"
8052
8021
msgstr ""
8053
8022
···
8095
8064
#: src/screens/ProfileList/components/MoreOptionsMenu.tsx:171
8096
8065
#: src/screens/StarterPack/StarterPackScreen.tsx:615
8097
8066
#: src/screens/StarterPack/StarterPackScreen.tsx:623
8098
-
#: src/view/com/profile/ProfileMenu.tsx:263
8099
-
#: src/view/com/profile/ProfileMenu.tsx:276
8100
-
#: src/view/com/profile/ProfileMenu.tsx:283
8101
-
#: src/view/com/profile/ProfileMenu.tsx:295
8067
+
#: src/view/com/profile/ProfileMenu.tsx:268
8068
+
#: src/view/com/profile/ProfileMenu.tsx:281
8069
+
#: src/view/com/profile/ProfileMenu.tsx:288
8070
+
#: src/view/com/profile/ProfileMenu.tsx:300
8102
8071
msgid "Share via..."
8103
8072
msgstr ""
8104
8073
···
8223
8192
8224
8193
#: src/components/dialogs/Signin.tsx:97
8225
8194
#: src/components/dialogs/Signin.tsx:99
8226
-
#: src/components/WelcomeModal.tsx:194
8227
-
#: src/components/WelcomeModal.tsx:206
8228
8195
#: src/screens/Login/index.tsx:177
8229
8196
#: src/screens/Login/index.tsx:200
8230
8197
#: src/screens/Login/LoginForm.tsx:188
···
8338
8305
msgid "Snoozes the reminder"
8339
8306
msgstr ""
8340
8307
8341
-
#: src/components/WelcomeModal.tsx:148
8342
-
msgid "Social media you control."
8343
-
msgstr ""
8344
-
8345
8308
#: src/screens/Onboarding/index.tsx:53
8346
8309
#: src/screens/Onboarding/state.ts:108
8347
8310
msgid "Software Dev"
···
8775
8738
msgstr ""
8776
8739
8777
8740
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:348
8778
-
#: src/view/com/profile/ProfileMenu.tsx:547
8741
+
#: src/view/com/profile/ProfileMenu.tsx:552
8779
8742
msgid "The account will be able to interact with you after unblocking."
8780
8743
msgstr ""
8781
8744
8782
-
#: src/screens/Settings/AppIconSettings/index.tsx:41
8783
-
#: src/screens/Settings/AppIconSettings/index.tsx:227
8745
+
#: src/screens/Settings/AppIconSettings/index.tsx:35
8746
+
#: src/screens/Settings/AppIconSettings/index.tsx:192
8784
8747
msgid "The app will be restarted"
8785
8748
msgstr ""
8786
8749
···
8954
8917
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:115
8955
8918
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:137
8956
8919
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:150
8957
-
#: src/view/com/profile/ProfileMenu.tsx:148
8958
-
#: src/view/com/profile/ProfileMenu.tsx:158
8959
-
#: src/view/com/profile/ProfileMenu.tsx:172
8960
-
#: src/view/com/profile/ProfileMenu.tsx:182
8961
-
#: src/view/com/profile/ProfileMenu.tsx:195
8962
-
#: src/view/com/profile/ProfileMenu.tsx:207
8920
+
#: src/view/com/profile/ProfileMenu.tsx:153
8921
+
#: src/view/com/profile/ProfileMenu.tsx:163
8922
+
#: src/view/com/profile/ProfileMenu.tsx:177
8923
+
#: src/view/com/profile/ProfileMenu.tsx:187
8924
+
#: src/view/com/profile/ProfileMenu.tsx:200
8925
+
#: src/view/com/profile/ProfileMenu.tsx:212
8963
8926
msgid "There was an issue! {0}"
8964
8927
msgstr ""
8965
8928
···
9172
9135
msgid "This post's author has disabled quote posts."
9173
9136
msgstr ""
9174
9137
9175
-
#: src/view/com/profile/ProfileMenu.tsx:568
9138
+
#: src/view/com/profile/ProfileMenu.tsx:573
9176
9139
msgid "This profile is only visible to logged-in users. It won't be visible to people who aren't signed in."
9177
9140
msgstr ""
9178
9141
···
9344
9307
msgid "Trust emerges from relationships, communities, and shared context, so weโre also enabling <0>trusted verifiers</0>: organizations that can directly issue verification."
9345
9308
msgstr ""
9346
9309
9347
-
#: src/view/com/profile/ProfileMenu.tsx:385
9348
-
#: src/view/com/profile/ProfileMenu.tsx:388
9310
+
#: src/view/com/profile/ProfileMenu.tsx:390
9311
+
#: src/view/com/profile/ProfileMenu.tsx:393
9349
9312
msgid "Trust verifier"
9350
9313
msgstr ""
9351
9314
···
9422
9385
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:352
9423
9386
#: src/screens/ProfileList/components/Header.tsx:171
9424
9387
#: src/screens/ProfileList/components/Header.tsx:178
9425
-
#: src/view/com/profile/ProfileMenu.tsx:559
9388
+
#: src/view/com/profile/ProfileMenu.tsx:564
9426
9389
#: src/view/screens/ProfileList.tsx:741
9427
9390
msgid "Unblock"
9428
9391
msgstr ""
···
9434
9397
9435
9398
#: src/components/dms/ConvoMenu.tsx:247
9436
9399
#: src/components/dms/ConvoMenu.tsx:250
9437
-
#: src/view/com/profile/ProfileMenu.tsx:464
9438
-
#: src/view/com/profile/ProfileMenu.tsx:470
9400
+
#: src/view/com/profile/ProfileMenu.tsx:469
9401
+
#: src/view/com/profile/ProfileMenu.tsx:475
9439
9402
msgid "Unblock account"
9440
9403
msgstr ""
9441
9404
9442
9405
#: src/screens/Profile/Header/ProfileHeaderStandard.tsx:346
9443
-
#: src/view/com/profile/ProfileMenu.tsx:541
9406
+
#: src/view/com/profile/ProfileMenu.tsx:546
9444
9407
msgid "Unblock Account?"
9445
9408
msgstr ""
9446
9409
···
9469
9432
msgid "Unfollow {0}"
9470
9433
msgstr ""
9471
9434
9472
-
#: src/view/com/profile/ProfileMenu.tsx:324
9473
-
#: src/view/com/profile/ProfileMenu.tsx:337
9435
+
#: src/view/com/profile/ProfileMenu.tsx:329
9436
+
#: src/view/com/profile/ProfileMenu.tsx:342
9474
9437
msgid "Unfollow account"
9475
9438
msgstr ""
9476
9439
···
9514
9477
9515
9478
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:725
9516
9479
#: src/components/PostControls/PostMenu/PostMenuItems.tsx:731
9517
-
#: src/view/com/profile/ProfileMenu.tsx:443
9518
-
#: src/view/com/profile/ProfileMenu.tsx:449
9480
+
#: src/view/com/profile/ProfileMenu.tsx:448
9481
+
#: src/view/com/profile/ProfileMenu.tsx:454
9519
9482
msgid "Unmute account"
9520
9483
msgstr ""
9521
9484
···
9842
9805
9843
9806
#: src/components/verification/VerificationCreatePrompt.tsx:84
9844
9807
#: src/components/verification/VerificationCreatePrompt.tsx:86
9845
-
#: src/view/com/profile/ProfileMenu.tsx:427
9846
-
#: src/view/com/profile/ProfileMenu.tsx:430
9808
+
#: src/view/com/profile/ProfileMenu.tsx:432
9809
+
#: src/view/com/profile/ProfileMenu.tsx:435
9847
9810
msgid "Verify account"
9848
9811
msgstr ""
9849
9812
···
10599
10562
msgid "You have no lists."
10600
10563
msgstr ""
10601
10564
10602
-
#: src/components/dialogs/StarterPackDialog.tsx:100
10565
+
#: src/components/dialogs/StarterPackDialog.tsx:101
10603
10566
msgid "You have no starter packs."
10604
10567
msgstr ""
10605
10568
+7
-5
src/logger/metrics.ts
+7
-5
src/logger/metrics.ts
···
48
48
// Screen events
49
49
'splash:signInPressed': {}
50
50
'splash:createAccountPressed': {}
51
-
'welcomeModal:signupClicked': {}
52
-
'welcomeModal:exploreClicked': {}
53
-
'welcomeModal:signinClicked': {}
54
-
'welcomeModal:dismissed': {}
55
-
'welcomeModal:presented': {}
56
51
'signup:nextPressed': {
57
52
activeStep: number
58
53
phoneVerificationRequired?: boolean
···
326
321
| 'ChatsList'
327
322
| 'SendViaChatDialog'
328
323
}
324
+
'starterPack:addUser': {
325
+
starterPack?: string
326
+
}
327
+
'starterPack:removeUser': {
328
+
starterPack?: string
329
+
}
329
330
'starterPack:share': {
330
331
starterPack: string
331
332
shareType: 'link' | 'qrcode'
···
357
358
'feed:interstitial:feedCard:press': {}
358
359
359
360
'profile:header:suggestedFollowsCard:press': {}
361
+
'profile:addToStarterPack': {}
360
362
361
363
'test:all:always': {}
362
364
'test:all:sometimes': {}
+3
-2
src/screens/Onboarding/Layout.tsx
+3
-2
src/screens/Onboarding/Layout.tsx
···
1
1
import React, {useState} from 'react'
2
2
import {ScrollView, View} from 'react-native'
3
+
import {Dimensions} from 'react-native'
3
4
import {useSafeAreaInsets} from 'react-native-safe-area-context'
4
5
import {msg} from '@lingui/macro'
5
6
import {useLingui} from '@lingui/react'
···
77
78
a.absolute,
78
79
a.z_10,
79
80
{
80
-
left: '50%',
81
+
left: isWeb ? '50%' : Dimensions.get('window').width / 2 - 45,
81
82
top: insets.top + 2,
82
-
transform: [{translateX: '-50%'}],
83
83
},
84
+
web({transform: [{translateX: '-50%'}]}),
84
85
]}>
85
86
<ButtonText>[DEV] Clear</ButtonText>
86
87
</Button>
+62
-39
src/state/session/index.tsx
+62
-39
src/state/session/index.tsx
···
14
14
createAgentAndResume,
15
15
sessionAccountToSession,
16
16
} from './agent'
17
-
import {getInitialState, reducer} from './reducer'
17
+
import {type Action, getInitialState, reducer, type State} from './reducer'
18
18
19
19
export {isSignupQueued} from './util'
20
20
import {addSessionDebugLog} from './logging'
···
46
46
})
47
47
ApiContext.displayName = 'SessionApiContext'
48
48
49
+
class SessionStore {
50
+
private state: State
51
+
private listeners = new Set<() => void>()
52
+
53
+
constructor() {
54
+
// Careful: By the time this runs, `persisted` needs to already be filled.
55
+
const initialState = getInitialState(persisted.get('session').accounts)
56
+
addSessionDebugLog({type: 'reducer:init', state: initialState})
57
+
this.state = initialState
58
+
}
59
+
60
+
getState = (): State => {
61
+
return this.state
62
+
}
63
+
64
+
subscribe = (listener: () => void) => {
65
+
this.listeners.add(listener)
66
+
return () => {
67
+
this.listeners.delete(listener)
68
+
}
69
+
}
70
+
71
+
dispatch = (action: Action) => {
72
+
const nextState = reducer(this.state, action)
73
+
this.state = nextState
74
+
// Persist synchronously without waiting for the React render cycle.
75
+
if (nextState.needsPersist) {
76
+
nextState.needsPersist = false
77
+
const persistedData = {
78
+
accounts: nextState.accounts,
79
+
currentAccount: nextState.accounts.find(
80
+
a => a.did === nextState.currentAgentState.did,
81
+
),
82
+
}
83
+
addSessionDebugLog({type: 'persisted:broadcast', data: persistedData})
84
+
persisted.write('session', persistedData)
85
+
}
86
+
this.listeners.forEach(listener => listener())
87
+
}
88
+
}
89
+
49
90
export function Provider({children}: React.PropsWithChildren<{}>) {
50
91
const cancelPendingTask = useOneTaskAtATime()
51
-
const [state, dispatch] = React.useReducer(reducer, null, () => {
52
-
const initialState = getInitialState(persisted.get('session').accounts)
53
-
addSessionDebugLog({type: 'reducer:init', state: initialState})
54
-
return initialState
55
-
})
92
+
const [store] = React.useState(() => new SessionStore())
93
+
const state = React.useSyncExternalStore(store.subscribe, store.getState)
56
94
57
95
const onAgentSessionChange = React.useCallback(
58
96
(agent: BskyAgent, accountDid: string, sessionEvent: AtpSessionEvent) => {
···
60
98
if (sessionEvent === 'expired' || sessionEvent === 'create-failed') {
61
99
emitSessionDropped()
62
100
}
63
-
dispatch({
101
+
store.dispatch({
64
102
type: 'received-agent-event',
65
103
agent,
66
104
refreshedAccount,
···
68
106
sessionEvent,
69
107
})
70
108
},
71
-
[],
109
+
[store],
72
110
)
73
111
74
112
const createAccount = React.useCallback<SessionApiContext['createAccount']>(
···
84
122
if (signal.aborted) {
85
123
return
86
124
}
87
-
dispatch({
125
+
store.dispatch({
88
126
type: 'switched-to-account',
89
127
newAgent: agent,
90
128
newAccount: account,
···
92
130
logger.metric('account:create:success', metrics, {statsig: true})
93
131
addSessionDebugLog({type: 'method:end', method: 'createAccount', account})
94
132
},
95
-
[onAgentSessionChange, cancelPendingTask],
133
+
[store, onAgentSessionChange, cancelPendingTask],
96
134
)
97
135
98
136
const login = React.useCallback<SessionApiContext['login']>(
···
107
145
if (signal.aborted) {
108
146
return
109
147
}
110
-
dispatch({
148
+
store.dispatch({
111
149
type: 'switched-to-account',
112
150
newAgent: agent,
113
151
newAccount: account,
···
119
157
)
120
158
addSessionDebugLog({type: 'method:end', method: 'login', account})
121
159
},
122
-
[onAgentSessionChange, cancelPendingTask],
160
+
[store, onAgentSessionChange, cancelPendingTask],
123
161
)
124
162
125
163
const logoutCurrentAccount = React.useCallback<
···
128
166
logContext => {
129
167
addSessionDebugLog({type: 'method:start', method: 'logout'})
130
168
cancelPendingTask()
131
-
dispatch({
169
+
store.dispatch({
132
170
type: 'logged-out-current-account',
133
171
})
134
172
logger.metric(
···
138
176
)
139
177
addSessionDebugLog({type: 'method:end', method: 'logout'})
140
178
},
141
-
[cancelPendingTask],
179
+
[store, cancelPendingTask],
142
180
)
143
181
144
182
const logoutEveryAccount = React.useCallback<
···
147
185
logContext => {
148
186
addSessionDebugLog({type: 'method:start', method: 'logout'})
149
187
cancelPendingTask()
150
-
dispatch({
188
+
store.dispatch({
151
189
type: 'logged-out-every-account',
152
190
})
153
191
logger.metric(
···
157
195
)
158
196
addSessionDebugLog({type: 'method:end', method: 'logout'})
159
197
},
160
-
[cancelPendingTask],
198
+
[store, cancelPendingTask],
161
199
)
162
200
163
201
const resumeSession = React.useCallback<SessionApiContext['resumeSession']>(
···
176
214
if (signal.aborted) {
177
215
return
178
216
}
179
-
dispatch({
217
+
store.dispatch({
180
218
type: 'switched-to-account',
181
219
newAgent: agent,
182
220
newAccount: account,
183
221
})
184
222
addSessionDebugLog({type: 'method:end', method: 'resumeSession', account})
185
223
},
186
-
[onAgentSessionChange, cancelPendingTask],
224
+
[store, onAgentSessionChange, cancelPendingTask],
187
225
)
188
226
189
227
const partialRefreshSession = React.useCallback<
···
193
231
const signal = cancelPendingTask()
194
232
const {data} = await agent.com.atproto.server.getSession()
195
233
if (signal.aborted) return
196
-
dispatch({
234
+
store.dispatch({
197
235
type: 'partial-refresh-session',
198
236
accountDid: agent.session!.did,
199
237
patch: {
···
201
239
emailAuthFactor: data.emailAuthFactor,
202
240
},
203
241
})
204
-
}, [state, cancelPendingTask])
242
+
}, [store, state, cancelPendingTask])
205
243
206
244
const removeAccount = React.useCallback<SessionApiContext['removeAccount']>(
207
245
account => {
···
211
249
account,
212
250
})
213
251
cancelPendingTask()
214
-
dispatch({
252
+
store.dispatch({
215
253
type: 'removed-account',
216
254
accountDid: account.did,
217
255
})
218
256
addSessionDebugLog({type: 'method:end', method: 'removeAccount', account})
219
257
},
220
-
[cancelPendingTask],
258
+
[store, cancelPendingTask],
221
259
)
222
-
223
-
React.useEffect(() => {
224
-
if (state.needsPersist) {
225
-
state.needsPersist = false
226
-
const persistedData = {
227
-
accounts: state.accounts,
228
-
currentAccount: state.accounts.find(
229
-
a => a.did === state.currentAgentState.did,
230
-
),
231
-
}
232
-
addSessionDebugLog({type: 'persisted:broadcast', data: persistedData})
233
-
persisted.write('session', persistedData)
234
-
}
235
-
}, [state])
236
-
237
260
React.useEffect(() => {
238
261
return persisted.onUpdate('session', nextSession => {
239
262
const synced = nextSession
240
263
addSessionDebugLog({type: 'persisted:receive', data: synced})
241
-
dispatch({
264
+
store.dispatch({
242
265
type: 'synced-accounts',
243
266
syncedAccounts: synced.accounts,
244
267
syncedCurrentDid: synced.currentAccount?.did,
···
262
285
}
263
286
}
264
287
})
265
-
}, [state, resumeSession])
288
+
}, [store, state, resumeSession])
266
289
267
290
const stateContext = React.useMemo(
268
291
() => ({
+6
-1
src/view/com/profile/ProfileMenu.tsx
+6
-1
src/view/com/profile/ProfileMenu.tsx
···
118
118
})
119
119
}, [queryClient, profile.did])
120
120
121
+
const onPressAddToStarterPacks = React.useCallback(() => {
122
+
logger.metric('profile:addToStarterPack', {})
123
+
addToStarterPacksDialogControl.open()
124
+
}, [addToStarterPacksDialogControl])
125
+
121
126
const onPressShare = React.useCallback(() => {
122
127
shareUrl(toShareUrl(makeProfileLink(profile)))
123
128
}, [profile])
···
349
354
<Menu.Item
350
355
testID="profileHeaderDropdownStarterPackAddRemoveBtn"
351
356
label={_(msg`Add to starter packs`)}
352
-
onPress={addToStarterPacksDialogControl.open}>
357
+
onPress={onPressAddToStarterPacks}>
353
358
<Menu.ItemText>
354
359
<Trans>Add to starter packs</Trans>
355
360
</Menu.ItemText>
-10
src/view/shell/index.web.tsx
-10
src/view/shell/index.web.tsx
···
8
8
import {useIntentHandler} from '#/lib/hooks/useIntentHandler'
9
9
import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries'
10
10
import {type NavigationProp} from '#/lib/routes/types'
11
-
import {useGate} from '#/lib/statsig/statsig'
12
11
import {useIsDrawerOpen, useSetDrawerOpen} from '#/state/shell'
13
12
import {useComposerKeyboardShortcut} from '#/state/shell/composer/useComposerKeyboardShortcut'
14
13
import {useCloseAllActiveElements} from '#/state/util'
···
20
19
import {LinkWarningDialog} from '#/components/dialogs/LinkWarning'
21
20
import {MutedWordsDialog} from '#/components/dialogs/MutedWords'
22
21
import {SigninDialog} from '#/components/dialogs/Signin'
23
-
import {useWelcomeModal} from '#/components/hooks/useWelcomeModal'
24
22
import {
25
23
Outlet as PolicyUpdateOverlayPortalOutlet,
26
24
usePolicyUpdateContext,
27
25
} from '#/components/PolicyUpdateOverlay'
28
26
import {Outlet as PortalOutlet} from '#/components/Portal'
29
-
import {WelcomeModal} from '#/components/WelcomeModal'
30
27
import {FlatNavigator, RoutesContainer} from '#/Navigation'
31
28
import {Composer} from './Composer.web'
32
29
import {DrawerContent} from './Drawer'
···
42
39
const showDrawer = !isDesktop && isDrawerOpen
43
40
const [showDrawerDelayedExit, setShowDrawerDelayedExit] = useState(showDrawer)
44
41
const {state: policyUpdateState} = usePolicyUpdateContext()
45
-
const welcomeModalControl = useWelcomeModal()
46
-
const gate = useGate()
47
42
48
43
useLayoutEffect(() => {
49
44
if (showDrawer !== showDrawerDelayedExit) {
···
80
75
<EmailDialog />
81
76
<LinkWarningDialog />
82
77
<Lightbox />
83
-
84
-
{/* Show welcome modal if the gate is enabled */}
85
-
{welcomeModalControl.isOpen && gate('welcome_modal') && (
86
-
<WelcomeModal control={welcomeModalControl} />
87
-
)}
88
78
89
79
{/* Until policy update has been completed by the user, don't render anything that is portaled */}
90
80
{policyUpdateState.completed && (