Compare commits

...

1199 commits
v0.6.2 ... main

Author SHA1 Message Date
Ayo
9264207406 feat(yolk): rename service in docker-file
Some checks failed
ci / ci (push) Has been cancelled
build & push docker container / docker (push) Has been cancelled
2025-08-08 22:11:14 +02:00
Ayo
4babfe9c46 feat(yolk): use redis in docker-compose 2025-08-08 22:08:05 +02:00
Ayo
fe3f416f54 chore: add TODO 2025-08-08 21:54:57 +02:00
Ayo
69506f7d99 Merge branch 'main' of github.com:ayoayco/elk 2025-08-08 21:33:38 +02:00
renovate[bot]
78fd25ac10
chore(deps): update devdependencies (#3344)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-05 12:51:54 +01:00
renovate[bot]
7fc8aa7bc2
chore(deps): update dependency @antfu/eslint-config to v5 (#3345)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-04 08:20:28 +01:00
Ayo
f8a702704f Merge branch 'main' of github.com:ayoayco/elk 2025-07-30 15:45:54 +02:00
nove-b
da26c38e59
fix(ui): Asterisk pairs are removed in code block (#3326)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-07-29 08:20:09 +00:00
Simon Ramsay
e8e2192e75
feat: pass origin as website when loging into server (#3299) 2025-07-29 00:02:18 +00:00
Ayo
2d6ba0cab5 feat(yolk): disable singServerInstance 2025-07-28 14:24:47 +02:00
Ayo
1db09a2a41 feat(yolk): change config to single server social.ayco.io 2025-07-28 13:40:22 +02:00
Ayo
7f733512a2 chore(yolk): remove --prod on Dockerfile deps installation 2025-07-28 13:25:01 +02:00
Ayo Ayco
31364c1b63
fix: error accessing thumbnail when instance is not defined (#3342) 2025-07-28 10:35:11 +00:00
Ayo
e170e22621 Merge branch 'dev' of github.com:ayoayco/elk 2025-07-28 12:02:11 +02:00
Ayo
078ca947aa Merge branch 'main' of github.com:elk-zone/elk into dev 2025-07-28 11:57:00 +02:00
Ayo
a57ce2db7b fix: error accessing thumbnail when instance is not defined 2025-07-28 11:56:38 +02:00
TAKAHASHI Shuuji
317929504e
Merge pull request #3340
chore(deps): update dependency nuxt-component-meta to v0.13.0
2025-07-28 16:57:35 +09:00
TAKAHASHI Shuuji
3ef80d56ef
Merge pull request #3341
fix(deps): update dependency browser-fs-access to ^0.38.0
2025-07-28 15:11:29 +09:00
renovate[bot]
cfb68319fe
fix(deps): update dependency browser-fs-access to ^0.38.0 2025-07-28 00:47:37 +00:00
renovate[bot]
f3d1ac9fca
chore(deps): update dependency nuxt-component-meta to v0.13.0 2025-07-28 00:47:10 +00:00
Ayo
5b073ee32a chore: skip dev dependencies on prod Dockerfile 2025-07-27 21:23:13 +02:00
Ayo
ebf11b5d57 style(yolk): normal nav title color 2025-07-27 18:39:31 +02:00
Ayo
2780036983 feat(yolk): replace client_name 2025-07-27 18:39:04 +02:00
Ayo
f202edd5fd feat(yolk): replace icons & logo 2025-07-27 18:38:45 +02:00
Ayo
a876d81f51 chore(yolk): add background to README 2025-07-27 10:52:36 +02:00
Ayo
e09e4d5b4d feat(yolk): change app name & logo 2025-07-27 10:50:27 +02:00
renovate[bot]
b8144db9ac
chore(deps): update lint (#3337)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-07-27 04:38:35 +00:00
renovate[bot]
b320b37e52
fix(deps): update dependency form-data to v4.0.4 [security] (#3338)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-22 08:27:17 +02:00
renovate[bot]
167f6d78b4
chore(deps): update devdependencies (#3323)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 18:23:05 +02:00
renovate[bot]
379ab78db3
chore(deps): update dependency unstorage to ^1.16.1 (#3336)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-21 09:52:22 +02:00
Florens Verschelde
3adcce4e36
chore: fix eslint warning for as prop (#3332) 2025-07-19 17:00:05 +00:00
nove-b
1d128f56f9
fix(ui): Publish button for threaded posts allows multiple click (#3333) 2025-07-18 09:19:28 +00:00
Florens Verschelde
190be77043
fix(ui): increase target size of back button (#3325) 2025-07-07 22:47:25 +00:00
renovate[bot]
a51f8f172a
chore(deps): update dependency nuxt-component-meta to v0.12.1 (#3324)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-07 10:19:56 +01:00
Clovis
8b6f15a214
feat: do not use language detection features on low end devices (#3317)
Co-authored-by: admin <admin@Sonar.lan>
2025-07-02 15:32:12 +00:00
renovate[bot]
dd2148095a
chore(deps): update devdependencies (#3321)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-07-01 21:39:21 +01:00
renovate[bot]
4f5648f151
chore(deps): update dependency nuxt-component-meta to v0.12.0 (#3322)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-30 10:39:11 +01:00
nove-b
548183e14a
fix(profile): incorrect "pinned post" label shown on other account (#3320) 2025-06-29 15:28:36 +00:00
renovate[bot]
e12b1d2b6c
chore(deps): update devdependencies (#3312)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-23 10:17:09 +01:00
renovate[bot]
f4567dcacc
chore(deps): update dependency vitest to v3.2.4 (#3319)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-23 09:50:14 +01:00
Thomas Steiner
d3bffd1da2
feat: add support for the Language Detector API (#3316) 2025-06-21 11:17:24 +00:00
Thomas Steiner
d22579fd89
feat: add support for the Translation API (#3314) 2025-06-21 11:15:56 +00:00
fratorgano
73f6790d01
fix: Proposal to use the "moon" icon for unlisted posts (#3313) 2025-06-16 16:31:49 +00:00
renovate[bot]
b669514243
chore(deps): update dependency vitest to v3.2.3 (#3311)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-16 08:42:27 +01:00
renovate[bot]
df9554e7ae
chore(deps): update dependency vitest to v3.2.2 (#3308)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 08:41:58 +00:00
renovate[bot]
1d485c91b1
chore(deps): update dependency @unocss/eslint-config to ^66.1.4 (#3307)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-09 10:36:07 +02:00
renovate[bot]
a5ec0cbd3f
chore(deps): update devdependencies (#3305)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 14:49:13 +00:00
renovate[bot]
5f55a5928a
chore(deps): update dependency vitest to v3.1.4 (#3304)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-02 00:40:17 +00:00
Joaquín Sánchez
220189abd8
feat(i18n): include missing Spanish translation entries (#3300) 2025-05-21 22:31:55 +00:00
Daniel Roe
a3fbc056a9
refactor: migrate to nuxt compatibilityVersion: 4 (#3298) 2025-05-20 14:05:01 +00:00
renovate[bot]
46e4433e1c
chore(deps): update devdependencies (#3297)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-19 04:48:14 +00:00
renovate[bot]
f9feb4e8e4
chore(deps): update lint (#3296)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-19 03:52:06 +00:00
Darek
d31e353d0d
docs: Add mastodon.com.pl server to readme (#3289) 2025-05-17 01:12:26 +00:00
Xabi
4340472873
feat(i18n): update eu-ES.json (#3294) 2025-05-16 05:19:59 +00:00
renovate[bot]
9cf88c8d38
chore(deps): update dependency vitest to v3.1.3 (#3292)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-12 10:27:32 +01:00
renovate[bot]
fc3dce6600
chore(deps): update dependency @antfu/eslint-config to ^4.13.0 (#3293)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-12 09:46:17 +01:00
iamdtms
b78417b4de
feat(i18n): update hu-HU.json (#3285)
Co-authored-by: Tamas <iamtamasdohany@gmail.com>
2025-05-05 14:29:47 +00:00
renovate[bot]
b62006228f
chore(deps): update dependency eslint to ^9.26.0 (#3286)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 09:38:48 +01:00
renovate[bot]
1fbea88e58
chore(deps): update dependency vitest to v3.1.2 (#3287)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-05 09:08:35 +01:00
Francesco
2d86894d9f
feat(i18n): Update it-IT locale (#3281) 2025-05-02 05:03:30 +00:00
Duy
ad60711ee3
feat(i18n): Update vi-VN.json (#3282) 2025-05-02 05:02:43 +00:00
renovate[bot]
889de794c3
chore(deps): update devdependencies (#3280)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-28 10:46:20 +01:00
renovate[bot]
920d3f3327
chore(deps): update all non-major dependencies (#3279)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-28 08:33:53 +00:00
ayo
f6c34e9120
feat: show server info on aside when not signed in (#3274) 2025-04-28 08:32:56 +00:00
ayo
81675930eb
fix: fetch for followed tags needs authorized session (#3277) 2025-04-28 08:32:05 +00:00
renovate[bot]
ec594410e4
chore(deps): update dependency eslint to ^9.25.1 (#3278)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-28 09:25:58 +01:00
Emanuel Pina
8c6c03a9a2
feat(i18n): Update pt-PT translation (#3275) 2025-04-28 05:35:33 +00:00
ayo
b82e85585c
feat: show followed hashtag badge (#3273) 2025-04-26 12:53:54 +00:00
ayo
b0f301843b
feat: search for following when viewing accounts in a list (#3272) 2025-04-26 12:46:56 +00:00
renovate[bot]
c3b3f0fc4f
chore(deps): update dependency eslint to ^9.25.0 (#3269)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 10:27:14 +01:00
renovate[bot]
8ba1f7f1d0
chore(deps): update actions/setup-node action to v4.4.0 (#3268)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-21 10:25:41 +01:00
Duy
19457573ed
feat(i18n): update vi-VN.json (#3267) 2025-04-20 08:43:49 +00:00
iamdtms
218c85c89e
feat(i18n): update hu-HU.json (#3261)
Co-authored-by: Tamas <iamtamasdohany@gmail.com>
2025-04-14 15:36:50 +00:00
renovate[bot]
4968fac2a9
chore(deps): update dependency @antfu/eslint-config to ^4.12.0 (#3263)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-14 07:13:52 +00:00
renovate[bot]
30eb3e9e5c
chore(deps): update devdependencies (#3262)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-14 06:48:40 +00:00
renovate[bot]
27f543a20d
chore(deps): update devdependencies (#3258)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-07 07:53:06 -07:00
renovate[bot]
d73fcf27db
chore(deps): update dependency eslint to ^9.24.0 (#3259)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-07 05:51:30 -07:00
iamdtms
0a5c2e1598
feat(i18n): update hu-HU.json (#3257) 2025-04-06 16:05:52 +00:00
Xabi
ab9345b6a8
feat(i18n): update eu-ES.json (#3255) 2025-04-02 08:25:42 +00:00
renovate[bot]
cd9af5da87
chore(deps): update dependency @antfu/ni to v24 (#3253)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 06:35:10 +00:00
renovate[bot]
398a792245
chore(deps): update lint (#3252)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 05:08:05 +00:00
renovate[bot]
81b1fb2d0c
chore(deps): update dependency @unlazy/nuxt to ^0.12.4 (#3250)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 03:44:23 +00:00
renovate[bot]
ddcce77dc1
chore(deps): update dependency nuxt-component-meta to v0.10.1 (#3251)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-31 03:44:03 +00:00
haayman
d9c4cdb2f1
feat: Update nl-NL.json uppercase key ALT (#3249) 2025-03-27 02:07:12 +00:00
haayman
46deba2c14
feat: Update nl-NL.json (#3248) 2025-03-26 04:34:13 +00:00
@beer
5319c1c031
chore: use navigator.userAgent instead of navigator.platform (#3247) 2025-03-25 13:59:10 +00:00
renovate[bot]
40fb0b70ec
fix(deps): update dependency prosemirror-highlight to ^0.13.0 (#3206)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-25 03:05:55 +00:00
renovate[bot]
149208300d
chore(deps): update devdependencies (#3245)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-25 03:04:35 +00:00
haayman
114e49f4bb
feat: Update nl-NL.json (#3246) 2025-03-24 23:27:33 +00:00
renovate[bot]
bf131da26e
chore(deps): update dependency vitest to v3.0.9 (#3244)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-24 07:37:56 +00:00
patak
ea46a5c0c2
chore: pause codeflow (#3242) 2025-03-21 16:18:07 +00:00
TAKAHASHI Shuuji
e20815b84c
fix: make notification timestamp gray and use <time> tag (#3223) 2025-03-20 17:44:25 +00:00
renovate[bot]
2d4a1cfef1
chore(deps): update dependency nuxt to v3.16.0 [security] (#3239)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2025-03-20 17:42:21 +00:00
renovate[bot]
02b9b5cbf3
chore(deps): update all non-major dependencies (#3236)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 04:28:47 +00:00
renovate[bot]
1679c0dcc4
chore(deps): update lint (#3237)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-17 04:15:46 +00:00
Daniel Roe
1bf113a960
fix: move to mocked-exports rather than implicit unenv dep (#3232) 2025-03-14 05:07:11 +00:00
Francesco
5623f87607
feat(i18n): Update it-IT locale (#3233) 2025-03-11 05:50:12 +00:00
renovate[bot]
96e6c2a730
chore(deps): update pnpm to v9.15.8 (#3231)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 01:26:41 +00:00
renovate[bot]
b26a9dfcf9
chore(deps): update dependency vitest to v3.0.8 (#3230)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-10 01:25:21 +00:00
Emanuel Pina
37e6a84ba5
feat(i18n): Update pt-PT translation (#3229) 2025-03-07 04:55:23 +00:00
TAKAHASHI Shuuji
538064589d
ci: refer .npmrc to ensure using consistent node version (#3228) 2025-03-06 16:18:29 +00:00
@beer
54265dab29
chore: bump node version (#3227) 2025-03-06 14:34:45 +00:00
Xabi
91de331184
feat(i18n): update eu-ES.json (#3226) 2025-03-04 14:52:44 +00:00
TAKAHASHI Shuuji
979c2fae29
chore: adjust unmute video setting wording (#3225) 2025-03-04 13:50:37 +00:00
TAKAHASHI Shuuji
4422bf6286
fix: handle v2 instance property correctly for mastodon v4.2 or lower (#3224) 2025-03-04 04:20:29 +00:00
Xabi
3b075847b0
feat(i18n): update eu-ES.json (#3220) 2025-03-04 02:31:38 +00:00
renovate[bot]
616d08c1f9
chore(deps): update dependency @unocss/eslint-config to v66 (#3222)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 17:11:43 +00:00
renovate[bot]
c640dc5d9e
chore(deps): update all non-major dependencies (#3211)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 08:01:29 +00:00
renovate[bot]
099b88b3b1
chore(deps): update lint (#3221)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-03-03 07:39:36 +00:00
TAKAHASHI Shuuji
d94b14ae53
feat: show notification timestamp (#3215) 2025-03-02 16:54:35 +00:00
TAKAHASHI Shuuji
41379627b5
feat: add new preference to unmute videos by default (#3218) 2025-03-02 14:55:00 +00:00
TAKAHASHI Shuuji
60b1d0224c
refactor: remove withDefaults macro and clean up reactive props destructuring (#3217) 2025-03-02 14:50:12 +00:00
TAKAHASHI Shuuji
7d9712c209
feat: adopt to /api/v2/instance to fetch app vapid_key (#3193) 2025-03-02 10:56:27 +00:00
renovate[bot]
74b7c9da2c
chore(deps): update dependency vitest to v3.0.7 (#3210)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-24 20:44:45 +00:00
Duy
260290f011
feat(i18n): Update vi-VN locale (#3208) 2025-02-18 16:32:20 +00:00
renovate[bot]
dad766177f
chore(deps): update lint (#3205)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-17 06:02:45 +00:00
✨ Q (it/its) ✨
55ad2438ed
feat(i18n): Welsh translation (#1236)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-02-09 06:35:02 +00:00
Xabi
1ebac1a450
feat(i18n): update eu-ES.json (#3198) 2025-02-09 05:50:16 +00:00
Ayo Ayco
fed57014af
feat(i18n): Update tl-PH locale (#3192) 2025-02-07 05:44:27 +00:00
Shinigami
9f4945bad8
fix: replace deprecated v1.instance (#3183) 2025-02-06 16:56:43 +00:00
TAKAHASHI Shuuji
4cbafc5f56
docs: fix broken link in CONTRIBUTING.md (#3191) 2025-02-05 13:35:36 +00:00
Francesco
c1b465069d
feat(i18n): Update it-IT locale (#3189)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-02-05 03:52:56 +00:00
TAKAHASHI Shuuji
9f9d71e050
fix: mute duration picker was missing (#3190) 2025-02-05 03:39:12 +00:00
renovate[bot]
f9977c7f84
chore(deps): update dependency vitest to v3.0.5 [security] (#3188)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-04 20:44:26 +00:00
Shinigami
efe0a81787
fix: status preview card npe (#3184) 2025-02-04 14:07:29 +00:00
Shinigami
cfe81eef82
feat: add some i18n de (#3185) 2025-02-04 14:07:18 +00:00
TAKAHASHI Shuuji
06a282e890
chore: pin sha512 hash of pnpm@9.15.5 package to workaround npm registry key issue (#3187) 2025-02-04 13:22:56 +00:00
renovate[bot]
4da8cdd3b2
chore(deps): update dependency eslint to ^9.19.0 (#3176)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-03 06:05:02 +00:00
renovate[bot]
9e52a97795
chore(deps): update all non-major dependencies (#3175)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-02-03 06:01:25 +00:00
renovate[bot]
bfd05f74d7
chore(deps): update dependency @antfu/eslint-config to v4 (#3178)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-02-03 05:59:04 +00:00
renovate[bot]
76bf8cf09b
fix(deps): update dependencies (#3177)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-02-03 05:55:56 +00:00
renovate[bot]
d35a1fdbb2
chore(deps): update devdependencies (major) (#3180)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-02-03 05:53:39 +00:00
renovate[bot]
44409a92f2
chore(deps): update dependency vitest to v3 (#3179)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-02-03 05:52:57 +00:00
TAKAHASHI Shuuji
835ed51da6 chore: workaround for npm registry key change for Dockerfile 2025-02-03 12:48:39 +09:00
SerKo
12273eae1d
fix: update status ref to use status.value (#3174)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-02-03 03:03:02 +00:00
TAKAHASHI Shuuji
414adb5a71 chore: workaround for npm registry key change 2025-02-03 11:48:02 +09:00
Emanuel Pina
daf7b8b941
feat(i18n): Update pt-PT translation (#3173) 2025-02-02 07:45:22 +00:00
Xabi
307b04dfdd
feat(i18n): update eu-ES.json (#3170) 2025-02-01 14:20:10 +00:00
patak
8116d69b6c
chore: remove welcome screen (#3168) 2025-02-01 06:25:06 +00:00
Clovis
5c38c91aee
fix: account avatar should not be streched (#3165) 2025-01-31 06:47:52 +00:00
Ayo Ayco
3d951ba44c
feat: redirect code.elk.zone to github repository (#3166) 2025-01-31 03:18:46 +00:00
Duy
fce8d79c4d
feat(i18n): Update vi-VN.json (#3164) 2025-01-31 03:07:24 +00:00
Clovis
be6aa1e878
feat: update poll (#3111)
Co-authored-by: Clovis <clovis@synapse-medicine.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-01-31 03:06:58 +00:00
Clovis
e52b34c62d
fix: account profile page title (#3159) 2025-01-29 03:02:20 +00:00
Francesco
8e2a1d58c1
feat(i18n): Update it-IT locale (#3162) 2025-01-29 02:10:23 +00:00
Emanuel Pina
853fc5cf1a
feat(i18n): Update pt-PT translation (#3163) 2025-01-29 02:10:05 +00:00
Dohány Tamás
bf000b70a1
feat(i18n): update hu-HU.json (#3160) 2025-01-28 13:21:37 +00:00
TAKAHASHI Shuuji
374d1908fc
chore: release v0.16.0 (#3158) 2025-01-27 18:42:25 +00:00
Francesco
210278703d
feat(i18n): Update it-IT locale (#3145) 2025-01-27 10:51:07 +00:00
TAKAHASHI Shuuji
f6a47167c5
fix: remove extra padding and hover effect on dark theme (#3157) 2025-01-27 07:18:33 +00:00
TAKAHASHI Shuuji
e4a3cf00f0
fix: prevent infinite account hover card (#3153) 2025-01-27 07:18:19 +00:00
Xabi
443208468e
feat(i18n): update eu-ES.json (#3154) 2025-01-25 01:53:02 +00:00
TAKAHASHI Shuuji
a7d64fd132
feat: bluesky-style follow notification (#3151) 2025-01-24 15:21:57 +00:00
Ecron
39b2182a00
fix(lang): Update ca-valencia.json (#3146) 2025-01-24 07:59:39 +00:00
TAKAHASHI Shuuji
72d6e0596b
chore(deps): update devdependencies (#3152) 2025-01-24 07:55:33 +00:00
renovate[bot]
e214076620
chore(deps): update dependency @antfu/eslint-config to ^3.14.0 (#3143)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-20 04:13:43 +00:00
renovate[bot]
2ffefc8392
chore(deps): update all non-major dependencies (#3144)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-20 04:13:28 +00:00
TAKAHASHI Shuuji
f5cada0be8
style: fix broken layout "more from" badge in card with square image (#3141) 2025-01-18 09:33:07 +00:00
TAKAHASHI Shuuji
2c0052edc4
feat(i18n): update Japanese localization (#3117) 2025-01-18 02:54:42 +00:00
TAKAHASHI Shuuji
4d7dc4e5ac
chore: update devDependencies except nuxt (#3140) 2025-01-17 04:14:26 +00:00
renovate[bot]
5d4e84241a
chore(deps): update devdependencies (major) (#3132)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-16 03:11:27 +00:00
Aleksandr Ippatev
a7cd43fcd9
fix: disable publish when be bypassed by Ctrl + Enter (#3133) 2025-01-14 08:39:59 +00:00
renovate[bot]
2a85c9ebd4
chore(deps): update lint (#3131)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2025-01-13 05:30:58 +00:00
TAKAHASHI Shuuji
9da6f45269
chore: update devDependencies (#3130) 2025-01-09 11:33:32 +00:00
renovate[bot]
9a5497e318
fix(deps): update vueuse to v12 (major) (#3095)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-07 22:35:12 +00:00
renovate[bot]
29761c6b10
fix(deps): update dependency happy-dom to v16 (#3129)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-06 07:50:54 +00:00
renovate[bot]
7198e1e618
chore(deps): update pnpm to v9.15.3 (#3128)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-06 07:50:40 +00:00
@beer
154fdaaad9
chore(utils): remove unnecessary await (#3124) 2025-01-04 06:15:25 +00:00
Joaquín Sánchez
e59f5dbb8f
fix(rtl): replace ellipsis span anchor content with bdi (#3123) 2025-01-03 00:52:04 +00:00
Joaquín Sánchez
e986de7f6c
feat(i18n): add missing Spanish timeline and status translations (#3121) 2025-01-02 06:16:48 +00:00
Xabi
6cfadd7f7c
feat(i18n): update eu-ES.json (#3116) 2024-12-31 09:46:13 +00:00
TAKAHASHI Shuuji
ed70b3c611
chore: update devDependencies (#3115) 2024-12-30 13:09:44 +00:00
renovate[bot]
ed5d03044b
chore(deps): update dependency @antfu/eslint-config to ^3.12.1 (#3113)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-30 07:52:28 +00:00
renovate[bot]
b179271e3c
chore(deps): update all non-major dependencies (#3112)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-30 07:47:30 +00:00
Sho Sakuma
cadd2c3fa0
feat(i18n): Unify expression in Japanese translation (#3105) 2024-12-24 14:10:03 +00:00
renovate[bot]
1281ecf869
chore(deps): update all non-major dependencies (#3100)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-23 15:24:54 +00:00
TAKAHASHI Shuuji
209330be6d
chore: update consola to 3.3.1 (#3103) 2024-12-23 14:59:13 +00:00
TAKAHASHI Shuuji
08aac8a995
chore: update dependencies except nuxt (#3102) 2024-12-23 07:45:15 +00:00
TAKAHASHI Shuuji
3b6a1762d6
chore: downgrade dependencies to avoid 500 error on /oauth/callback (#3075)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-22 21:40:53 +00:00
Rose Liverman
5e2df3821c
docs: Remove duplicate instruction in ReadMe (#3031)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-12-22 13:35:47 +00:00
Duy
371a996624
feat(i18n): Update vi-VN.json (#3099) 2024-12-21 13:08:17 +00:00
Francesco
d8710d5b06
feat(i18n): Update it-IT locale (#3098) 2024-12-20 16:06:03 +00:00
Emanuel Pina
3b33127dd9
feat(i18n): update pt-PT translation (#3097) 2024-12-20 04:02:39 +00:00
TAKAHASHI Shuuji
dd4076f49c
feat: show pinned posts on individual account page (#2779) 2024-12-19 04:19:20 +00:00
Estela ad Astra
4c63f6b8fc
feat(i18n): Finish catalan translation (#2990)
Signed-off-by: Estela ad Astra <i@estela.moe>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-12-17 06:08:09 +00:00
Clovis
7a52a6122a
fix: more menu is not opening on click (#3090)
Co-authored-by: Clovis <clovis@synapse-medicine.com>
2024-12-16 15:43:09 +00:00
renovate[bot]
4928148eed
fix(deps): update dependencies (#3094)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-16 15:10:18 +00:00
Clovis
83513bf624
fix: MenuBottom settings are always empty (#3091)
Co-authored-by: Clovis <clovis@synapse-medicine.com>
2024-12-16 04:12:48 +00:00
renovate[bot]
1e156ec82b
chore(deps): update devdependencies (#3092)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-16 02:26:51 +00:00
renovate[bot]
e67f6b0392
chore(deps): update lint (#3093)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-12-16 01:48:47 +00:00
Ayo Ayco
fa6c8a8fa1
feat(ui): disable publish button (#3085) 2024-12-14 07:29:49 +00:00
TAKAHASHI Shuuji
fb411e89f4
feat: support 'annual_report' notification type (#3084) 2024-12-13 09:39:38 +00:00
renovate[bot]
62e6bdf43c
chore(deps): update devdependencies (#3081)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-09 20:34:44 +00:00
renovate[bot]
4d42624765
chore(deps): update pnpm to v9.15.0 (#3083)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-09 16:56:57 +00:00
renovate[bot]
f885616537
chore(deps): update dependency vitest to v2.1.8 (#3080)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-09 16:56:55 +00:00
renovate[bot]
900017bb3f
chore(deps): update lint (#3082)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-12-09 03:50:20 +00:00
TAKAHASHI Shuuji
b7cff82ab2
chore: update @nuxtjs/i18n to 9.1.1 (#3078) 2024-12-08 08:14:32 +00:00
renovate[bot]
6b98b6116b
chore(deps): update dependency eslint-plugin-format to ^0.1.3 (#3073)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-02 11:36:19 +00:00
renovate[bot]
cca29e6695
chore(deps): update dependency vitest to v2.1.6 (#3074)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-02 10:05:19 +00:00
Andrew Crescencio
b4cb027a8e
refactor: code from profile avatar image reduced motion setting issue (#3069)
Co-authored-by: null <null>
2024-12-01 01:59:42 +00:00
TAKAHASHI Shuuji
e1b8d5cb33
fix: apply missing reordering to local public timeline (#3071) 2024-11-30 15:36:09 +00:00
Joaquín Sánchez
672e057f83
docs: add primary light theme to fix color contrast (#3070) 2024-11-30 14:42:17 +00:00
TAKAHASHI Shuuji
7a4b1907b1
chore: change default theme color and fix color contrast (#3062) 2024-11-30 14:41:33 +00:00
Markus Unterwaditzer
302da09248
fix: Add basic user-agent to all mastodon-bound requests (#2277) 2024-11-27 15:32:44 +00:00
Andrew Crescencio
008248ee0f
fix(ui): Profile avatar image motion setting #3044 (#3066)
Co-authored-by: null <null>
2024-11-27 09:09:33 +00:00
renovate[bot]
5753f0b869
fix(deps): update dependencies (#3048)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-11-27 04:09:16 +00:00
renovate[bot]
08672d6f2c
chore(deps): update pnpm to v9.14.2 (#3065)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-25 08:28:19 +00:00
renovate[bot]
4675599b08
chore(deps): update devdependencies (#3064)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-25 04:21:29 +00:00
renovate[bot]
beeb30f039
fix(deps): update dependencies (major) (#2994)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-11-25 03:41:34 +00:00
renovate[bot]
eab541b7b8
chore(deps): update dependency @antfu/eslint-config to ^3.9.2 (#3063)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-25 01:23:31 +00:00
TAKAHASHI Shuuji
f4b667fef6
chore: use latest i18n v9 (#3059) 2024-11-24 13:36:16 +00:00
XL
e6ebde3ac4
fix: remove extra margins before tags (#3039) 2024-11-24 10:29:11 +00:00
TAKAHASHI Shuuji
aff559780b
chore: fix @nuxt/schema warning (#3061) 2024-11-24 05:13:17 +00:00
TAKAHASHI Shuuji
63caf91ec1
chore: remove @vueuse/motion patch (#3060) 2024-11-24 02:38:02 +00:00
renovate[bot]
beb2b2d3bd
chore(deps): update dependency vitest to v2.1.5 (#3051)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-19 10:51:08 +00:00
renovate[bot]
fb5cd0ecdb
chore(deps): update lint (#3053)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-18 07:08:04 -05:00
renovate[bot]
62141629c7
chore(deps): update pnpm to v9.13.2 (#3054)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-18 07:08:01 -05:00
renovate[bot]
726319efb6
chore(deps): update devdependencies (#3052)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-17 22:23:39 -05:00
Dohány Tamás
f742a01430
feat(i18n): update hu-HU.json (#3049) 2024-11-13 22:55:58 +01:00
renovate[bot]
428db939ab
chore(deps): update all non-major dependencies (#3047)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-11 02:02:01 +00:00
renovate[bot]
019bce3590
chore(deps): update devdependencies (#3046)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-11 01:07:34 +00:00
TAKAHASHI Shuuji
738bc88be2
docs: fix documentation build error (#3045)
Co-authored-by: userquin <userquin@gmail.com>
2024-11-11 00:49:56 +00:00
renovate[bot]
816f452646
fix(deps): update dependency happy-dom to v15.10.2 [security] (#3041)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-08 07:02:20 +00:00
renovate[bot]
f6265bd387
fix(deps): update dependency happy-dom to v15.10.2 [security] (#3040)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-07 09:05:52 +00:00
renovate[bot]
9c25621f12
chore(deps): update dependency vitest to v2.1.4 (#3037)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-04 17:05:10 +00:00
renovate[bot]
074deb4ce6
chore(deps): update devdependencies (#3038)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-04 11:52:48 +00:00
renovate[bot]
b1428a53bd
chore(deps): update lint (#3010)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-02 06:33:35 +00:00
TAKAHASHI Shuuji
54cc0e4735
feat: support wider emoji (#3028) 2024-10-29 02:26:41 +08:00
renovate[bot]
9fc75afdf0
chore(deps): update pnpm to v9.12.3 (#3026)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-28 06:12:59 +00:00
renovate[bot]
aae808e36b
chore(deps): update devdependencies (#3025)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-10-27 20:28:42 -07:00
TAKAHASHI Shuuji
41346e318b
feat: add credits to creators in link previews using fediverse:creator (#3012) 2024-10-26 06:13:21 +00:00
Emanuel Pina
98a910c6f1
feat(i18n): update pt-PT translation (#3024) 2024-10-26 03:49:52 +00:00
Wladimir Palant
49a5f49966
fix(ui): Avoid duplicate IDs for grouped notifications (#3014) 2024-10-26 03:37:40 +00:00
Xabi
c153f719fe
fix(i18n): update Basque localisation (#3018) 2024-10-26 03:29:30 +00:00
Francesco
83fd1f3224
feat(i18n): Update it-IT locale (#3021) 2024-10-26 03:29:17 +00:00
Duy
86581a7172
fix(i18n): Update vi-VN.json (#3020) 2024-10-26 03:29:05 +00:00
TAKAHASHI Shuuji
18b3d36e03
chore: update masto.js to latest version 6.10.1 (#3019) 2024-10-24 03:46:15 +00:00
Wladimir Palant
2c8307b3d8
fix: Do not require Git for development (#3015) 2024-10-24 00:50:30 +00:00
Wladimir Palant
83fce5d8a1
fix(i18n): Allowed translating "No posts here" text (#3016) 2024-10-23 12:51:28 +00:00
Wladimir Palant
2f3fe82593
fix(i18n): Improved consistency of the German translation (#3013) 2024-10-22 14:10:39 +00:00
TAKAHASHI Shuuji
907657725d
fix(ui): fix and adjust bottom navigation preview on setting page (#2818) 2024-10-21 09:33:35 +00:00
jyn
dac42e062c
feat(a11y): make menu buttons in 'More' dropdown selectable with the keyboard (#2976)
Co-authored-by: userquin <userquin@gmail.com>
2024-10-21 09:00:51 +00:00
TAKAHASHI Shuuji
ae1da4c3e8
feat: add 6 new bottom nav buttons (#3011) 2024-10-21 08:48:06 +00:00
renovate[bot]
78b013dc0f
chore(deps): update dependency vitest to v2.1.3 (#3008)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 02:23:55 +00:00
renovate[bot]
2d66e6f5d7
chore(deps): update pnpm to v9.12.2 (#3009)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 02:23:51 +00:00
Wladimir Palant
9440527f17
fix(i18n): Fixed some German out-of-context translations (#3005) 2024-10-20 03:41:18 +00:00
Wladimir Palant
6e731866be
fix(i18n): Correct some German translations, also make them more consistent (#3001) 2024-10-18 16:45:45 +00:00
renovate[bot]
d0681bd907
fix(deps): update dependency @vueuse/motion to v2.2.6 (#2991)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 09:34:17 +01:00
renovate[bot]
36981cd40f
chore(deps): update dependency eslint to ^9.12.0 (#2992)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 09:34:15 +01:00
renovate[bot]
18433fa3e0
chore(deps): update pnpm to v9.12.1 (#2993)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-14 09:34:13 +01:00
renovate[bot]
466921de44
chore(deps): update devdependencies (#2987)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-10 03:40:02 +00:00
renovate[bot]
b395ab2cf9
chore(deps): update dependency vitest to v2.1.2 (#2988)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-10 03:35:17 +00:00
Duy
3bc6e106d2
feat(i18n): Update vi-VN.json (#2967) 2024-10-09 17:16:40 +00:00
TAKAHASHI Shuuji
f64878861e
chore: fix eslint error preventing ci (#2989) 2024-10-09 17:16:07 +00:00
Daniel Roe
abf8dd3ea1
chore: suppress type differences for nitro v2.10 2024-10-06 07:37:04 +01:00
renovate[bot]
f5b62f3a59
chore(deps): update devdependencies (#2982)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 12:49:05 +00:00
renovate[bot]
502993946b
fix(deps): update dependency @unocss/nuxt to ^0.63.0 (#2983)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 08:26:15 +00:00
renovate[bot]
320ddc0e28
chore(deps): update dependency @antfu/eslint-config to v3 (#2984)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-09-30 08:11:56 +00:00
renovate[bot]
97826c00bc
chore(deps): update dependency eslint to ^9.11.1 (#2981)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-30 01:33:14 +00:00
patak-dev
1335bbfcd5 chore: release v0.15.1
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-09-26 09:13:34 +02:00
Joaquín Sánchez
44074ff1a3
fix: change page reload and account switch logic (#2975) 2024-09-25 15:55:32 +00:00
Joaquín Sánchez
54344acf4b
fix: prevent reloading page (#2973) 2024-09-23 16:08:02 +00:00
Daniel Roe
fe58a2b522
chore: release v0.15.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-09-23 15:02:26 +01:00
Joaquín Sánchez
4d95c17e86
fix: add new service worker (#2971) 2024-09-23 12:45:46 +00:00
renovate[bot]
2f4ee35561
chore(deps): update dependency vitest to v2.1.1 (#2960)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 11:29:55 +00:00
Joaquín Sánchez
10076be909
fix: top level await (chrome 129) (#2970) 2024-09-23 10:53:10 +00:00
renovate[bot]
7ab2f16f35
chore(deps): update dependency eslint to ^9.11.0 (#2968)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 09:27:38 +00:00
renovate[bot]
7a1ed8f9a2
chore(deps): update pnpm to v9.11.0 (#2969)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-23 09:27:34 +00:00
TAKAHASHI Shuuji
744c1784c3
fix: fix invalid permissions-policy value for fullscreen (#2941) 2024-09-19 12:00:39 +00:00
renovate[bot]
7aabe17860
fix(deps): update dependency prosemirror-highlight to ^0.9.0 (#2961)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-19 11:59:36 +00:00
renovate[bot]
bc324ec8ae
chore(deps): update dependency nuxt-component-meta to v0.8.2 (#2958)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-19 11:59:01 +00:00
renovate[bot]
ff9c025126
chore(deps): update devdependencies (#2959)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-19 11:58:15 +00:00
Joaquín Sánchez
662a8aec69
chore: cleanup ModalContainer.vue (#2956) 2024-09-14 03:56:25 +00:00
Joaquín Sánchez
01ffb1a3e1
fix(ui): composer dialog layout broken (#2955) 2024-09-12 09:36:43 +00:00
Joaquín Sánchez
4061075dde
fix(ui): generate only one thread composer in PublishWidgetList and provide it to each widget (#2953) 2024-09-11 20:37:14 +00:00
Joaquín Sánchez
dbf743afd9
fix(ui): bind attributes to PublishWidgetList list (#2952) 2024-09-11 15:43:30 +00:00
renovate[bot]
dd6fab86ee
chore(deps): update dependency nuxt to ^3.13.1 (#2946)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-09-11 14:37:59 +00:00
renovate[bot]
344ec56da0
chore(deps): update all non-major dependencies (#2949)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 11:29:26 +00:00
Daniel Roe
672e8a9a24
fix: bump unstorage and address type issues (#2951) 2024-09-11 11:20:26 +00:00
renovate[bot]
201ab3b13a
chore(deps): update dependency eslint to ^9.10.0 (#2948)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-09 11:24:14 +00:00
renovate[bot]
6fd288dcc1
fix(deps): update dependency @vueuse/motion to v2.2.5 (#2947)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-09 11:23:00 +00:00
Joaquín Sánchez
41eb84416a
fix(ui): add loading indicator (#2769) 2024-09-07 09:37:01 +00:00
Shinigami
e477cd8ee2
chore: use script setup lang=ts everywhere (#2944) 2024-09-07 09:30:43 +00:00
Shinigami
4caa63e84f
perf: reduce timeline limit on slow connection (#2945) 2024-09-07 09:27:01 +00:00
Shinigami
3054667050
chore: unify script setup lang order (#2943) 2024-09-07 07:38:18 +00:00
renovate[bot]
b2102732cf
chore(deps): update devdependencies (#2939)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-02 06:56:23 +00:00
renovate[bot]
7141a75544
chore(deps): update pnpm to v9.9.0 (#2940)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-02 06:55:39 +00:00
Sho Sakuma
926f7769c2
fix(i18n): Fix redundant Japanese translation (#2938) 2024-09-02 06:54:39 +00:00
Duy
538fadc908
feat(i18n): Update vi-VN.json (#2937) 2024-08-31 13:53:17 +00:00
renovate[bot]
f605d96836
chore(deps): update devdependencies (#2931)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 03:20:57 +00:00
renovate[bot]
0c1dd1cb7b
chore(deps): update lint (#2932)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 02:56:38 +00:00
Ao Ito
53f3d44f21
refactor: remove redundant imports (#2927) 2024-08-24 12:16:10 +00:00
renovate[bot]
faae7e32f4
fix(deps): update dependencies (major) (#2921)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-22 10:28:35 +00:00
renovate[bot]
b8efd67e83
fix(deps): update vueuse to v11 (major) (#2922)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-08-20 15:51:05 +00:00
renovate[bot]
7de45d154e
chore(deps): update all non-major dependencies (#2920)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 02:54:17 +00:00
renovate[bot]
1353f62ebb
chore(deps): update dependency prettier to ^3.3.3 (#2919)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 02:51:09 +00:00
renovate[bot]
e22555b581
fix(deps): update dependencies (major) (#2559)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-08-16 15:49:14 +00:00
renovate[bot]
55372aa530
chore(deps): update devdependencies (#2782)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-08-16 15:20:49 +00:00
renovate[bot]
efa8a89f92
chore(deps): update dependency eslint to v9 (#2785)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-16 14:58:14 +00:00
renovate[bot]
0fba07e6e5
chore(deps): update dependency @antfu/eslint-config to ^2.19.0 (#2726)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-08-16 14:52:08 +00:00
renovate[bot]
23f82d3296
fix(deps): update dependencies (#2526)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-08-16 14:35:44 +00:00
Ao Ito
bd7fd961d0
feat: add custom metadata type for PageMeta (#2907) 2024-08-16 14:33:39 +00:00
renovate[bot]
1a8d365779
chore(deps): update dependency vitest to v2.0.5 (#2911)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-16 14:29:39 +00:00
Daniel Roe
335ae78a67
chore: bump and patch dependencies to augment vue (#2918) 2024-08-16 13:31:43 +00:00
renovate[bot]
bdf5a18b4d
chore(deps): update pnpm to v9.7.0 (#2917)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-13 15:52:58 +00:00
Chris​‌​‮ ‬Hayes‌​​​
71369c4c78
fix(ui): profile name gets cut off by roles (#2915) 2024-08-13 15:45:09 +00:00
TAKAHASHI Shuuji
1d62c2640e
fix(ui): adjust z-index of Embedded Media Player and sticky header (#2848) 2024-08-10 14:55:05 +00:00
TAKAHASHI Shuuji
d79add2ddb
fix(ui): fix z-index of horizontal line between statuses (#2778) 2024-08-10 14:54:01 +00:00
KaKi87
f15c8a18d0
feat(i18n): Update French translations (#1839)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-08-09 06:06:09 +00:00
TAKAHASHI Shuuji
879f0d8648
feat(ui): overlap multiple account icons in notification (#2869) 2024-08-09 06:00:19 +00:00
Lixou
20ac0d5066
fix(ui): change apple app status bar style (#2903)
Co-authored-by: Joaquín Sánchez <userquin@gmail.com>
2024-08-09 05:58:49 +00:00
Chris​‌​‮ ‬Hayes‌​​​
fb7f2b5a8e
docs(contributing): update node and pnpm version (#2913) 2024-08-09 05:57:18 +00:00
renovate[bot]
4a3218dae3
chore(deps): update dependency vitest to v2.0.4 (#2909)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-29 02:19:26 +00:00
renovate[bot]
21f7a029fa
chore(deps): update pnpm to v9.6.0 (#2908)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-22 06:38:20 +00:00
renovate[bot]
f8b4f700e7
chore(deps): update dependency vitest to v2 (#2906)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-16 04:06:56 +00:00
renovate[bot]
d2aee8fc37
chore(deps): update pnpm to v9.5.0 (#2905)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-08 07:31:58 +00:00
renovate[bot]
2144f2484b
chore(deps): update amannn/action-semantic-pull-request action to v5.5.3 (#2898)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-01 02:43:41 +00:00
Ediz Baha
83de5da08a
fix(i18n): Update tr-TR.json (#2894) 2024-06-25 00:24:54 +00:00
renovate[bot]
108db77a9d
chore(deps): update all non-major dependencies (#2783)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-24 03:11:24 +00:00
renovate[bot]
385f218e7b
fix(deps): update dependency @vueuse/motion to v2.2.3 (#2881)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-24 03:05:38 +00:00
renovate[bot]
f224acb4e2
chore(deps): update docker/build-push-action action to v6 (#2892)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-24 03:00:20 +00:00
Sebastian Di Luzio
0d84257ac0
docs: add crab.bumscode.com to list of community elk deployments (#2887) 2024-06-17 17:34:59 +00:00
renovate[bot]
b4886fa135
chore(deps): update dependency vitest to v1.6.0 (#2822)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-14 08:19:42 +00:00
Daniel Roe
16a09cd959
fix: use correct meta attribute for twitter info 2024-06-10 22:20:54 +01:00
TAKAHASHI Shuuji
97ce2fc819
feat: keyboard status navigation with j/k (#2739) 2024-05-31 10:35:04 +00:00
Lixou
9a864e8bcb
chore(deps): Update masto.js (#2876) 2024-05-30 19:40:17 +00:00
Francesco
ca34d3df70
feat(i18n): Update it-IT locale (#2879) 2024-05-30 01:16:21 +00:00
Joaquín Sánchez
2c889a39b8
chore: fix invalid html markup in SettingsToggleItem (#2810) 2024-05-29 03:42:58 +00:00
Joaquín Sánchez
7047968cfc
feat(a11y): add semantic markup to language settings (#2812) 2024-05-29 03:42:54 +00:00
Shinigami
0b207c3bb5
chore: set package-manager-strict to false (#2873) 2024-05-28 14:23:45 +02:00
Shinigami
6f7efc9f32
fix(i18n): update de-DE (#2874) 2024-05-28 00:21:00 +00:00
renovate[bot]
a88d51b60b
chore(deps): update pnpm to v9 (#2841)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-27 23:27:17 +00:00
Lefteris T
65557fab5e
feat(i18n): added greek translation (#2831)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-05-11 15:26:21 +00:00
Valtteri Laitinen
09b5dd6ac9
feat(i18n): update Finnish localization (#2867) 2024-05-09 10:15:01 +00:00
Alex
a1b5cbc12e
feat(i18n): update zh-CN translations (#2868) 2024-05-08 11:34:34 +00:00
Xabi
bd950af9cf
feat(i18n): update eu-ES.json (#2866) 2024-05-07 23:58:56 +00:00
lazzzis
04befd6138
feat(i18n): update zh-CN.json (#2865) 2024-05-05 18:25:29 +00:00
Kevin Pliester
0b53dfc89f
feat(i18n): update German translations (#2861) 2024-05-03 20:32:24 +00:00
lzh
c39b60d448
feat(i18n): update zh-CN.json (#2858) 2024-05-02 19:50:19 +00:00
lzh
50481af19e
docs(i18n): Update dev path in the contribution guide (#2857) 2024-05-02 13:40:15 +00:00
Dohány Tamás
6c2e5849ef
feat(i18n): update hu-HU.json (#2856) 2024-05-02 13:40:08 +00:00
pt
9496ffc3e6
feat(i18n): update uk-UA.json (#2854) 2024-04-28 08:18:37 +00:00
pt
ab92fd696c
feat(i18n): update uk-UA.json (#2852) 2024-04-26 04:39:42 +00:00
Francesco
7d4b84fda8
feat(i18n): Update it-IT locale (#2851) 2024-04-25 03:27:21 +00:00
Xabi
a67b3efde2
feat(i18n): update eu-ES.json (#2840) 2024-04-24 03:17:03 +00:00
Duy
e546e665d8
feat(i18n): Update vi-VN.json (#2838) 2024-04-24 03:17:00 +00:00
Emanuel Pina
d1ae45de14
feat(i18n): update pt-PT translation (#2850) 2024-04-24 03:16:55 +00:00
Joaquín Sánchez
8ad05dfd47
feat(i18n): add open image preview dialog spanish translation (#2839) 2024-04-22 15:38:06 +00:00
TAKAHASHI Shuuji
09cae9f924
fix(ui): fix publish dialog layout (#2842) 2024-04-22 12:54:20 +00:00
TAKAHASHI Shuuji
bd8cfc7b57
fix(i18n,a11y): fix missing or incorrect translations in aria-label strings (#2837) 2024-04-21 10:26:35 +00:00
Joaquín Sánchez
77f0e2c2f8
feat(a11y): add semantic markup to preference settings (#2811) 2024-04-21 07:14:12 +00:00
lazzzis
57ff04853b
fix(ui): show custom emoji in spoiler text (#2836) 2024-04-21 05:25:40 +00:00
Joaquín Sánchez
1eaaa6ce9a
feat(i18n): add manage lists spanish translation (#2832) 2024-04-18 19:39:08 +00:00
patak-dev
1526847a18 chore: release v0.14.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-04-18 14:53:14 +02:00
Duy
cc1d149ac8
feat(i18n): Update vi-VN.json (#2830) 2024-04-18 07:26:04 +00:00
Duy
569604646d
feat(i18n): Update vi-VN.json (#2825) 2024-04-18 04:20:15 +00:00
Dohány Tamás
6f47d1aeff
feat(i18n): update hu-HU.json (#2828) 2024-04-18 04:20:10 +00:00
Francesco
9d62edf295
feat(i18n): Update it-IT locale (#2827) 2024-04-18 04:20:06 +00:00
Xabi
7f4d8c04c6
feat(i18n): update eu-ES.json (#2826) 2024-04-18 04:20:01 +00:00
Emanuel Pina
79c6714bac
feat(i18n): Update pt-PT language (#2829) 2024-04-18 04:19:57 +00:00
lazzzis
ecd7a6f8cb
feat(ui): add manage list at the end of the lists (#2824) 2024-04-16 17:51:27 +00:00
Andy Maloney
4ed97dab55
feat(i18n): add en-CA for Canadian English (#2820) 2024-04-15 03:07:07 +00:00
Andy Maloney
d4eeb7441d
feat(i18n): update en-GB.json (#2821) 2024-04-15 03:01:47 +00:00
Joaquín Sánchez
c504e14ff5
feat(a11y): add semantic markup to interface settings (#2809)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-04-14 18:06:25 +00:00
Joaquín Sánchez
f78ce97f05
chore(ui): publish widget using computed ref without .value inside computed (#2816) 2024-04-14 16:17:16 +00:00
TAKAHASHI Shuuji
c1f8e3efb5
feat: support more than 4 media attachments with 3 columns grid (#2802) 2024-04-14 11:04:28 +00:00
Dohány Tamás
e4c7124d28
feat(i18n): update hu-HU.json (#2813) 2024-04-14 08:21:27 +00:00
Joaquín Sánchez
6bb9ad0511
fix(a11y): add aria-* entries to interface settings (#2799)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-04-13 10:39:59 +00:00
Emanuel Pina
8697cc44e4
feat(i18n): Update portuguese from Portugal translation (#2806) 2024-04-13 10:14:31 +00:00
Alan Ye
8e5a801ef9
fix(i18n): correct the spelling of Favorite in the US (#2807) 2024-04-13 08:07:01 +00:00
TAKAHASHI Shuuji
876ae4098c
feat(i18n): update en-GB localization (#2808) 2024-04-13 08:06:37 +00:00
TAKAHASHI Shuuji
9c916e0932
fix: remove nav buttons from initial selection on setting page (#2803) 2024-04-12 17:22:34 +00:00
Joaquín Sánchez
14162f8bcb
feat(ui): add font size outline when focused (#2798) 2024-04-12 17:19:37 +00:00
Xabi
9fa8149f68
feat(i18n): update eu-ES.json (#2804) 2024-04-12 17:17:54 +00:00
Joaquín Sánchez
e3979c61e7
feat(i18n): add spanish bottom navigation translations (#2801) 2024-04-12 17:17:29 +00:00
Francesco
1d817a8b69
feat(i18n): Update it-IT locale (#2800) 2024-04-12 17:17:08 +00:00
TAKAHASHI Shuuji
2cb070c83c
feat: allow choosing favorite buttons in bottom navigation bar (#2761) 2024-04-12 09:38:43 +00:00
lazzzis
2a6a994da1
fix: list name is not up-to-date after modification (#2797) 2024-04-12 04:14:54 +00:00
Dohány Tamás
706cffe209
feat(i18n): update hu-HU.json, thread related strings (#2795) 2024-04-11 13:41:47 +00:00
Joaquín Sánchez
dde907f4bb
feat(i18n): add spanish threads translations (#2794) 2024-04-10 20:23:30 +00:00
Xabi
81143de09b
feat(i18n): update eu-ES.json (#2792) 2024-04-09 19:09:05 +00:00
Dohány Tamás
8fdac7f79e
feat(i18n): update hu-HU.json (#2789) 2024-04-09 03:06:58 +00:00
Duy
7b819d116c
feat(i18n): Update vi-VN.json (#2791) 2024-04-09 03:01:48 +00:00
Francesco
bda2df2192
feat(i18n): Update it-IT locale (#2790) 2024-04-09 03:01:45 +00:00
Emanuel Pina
2cada8a75c
feat(i18n): Update portuguese from Portugal translation (#2788) 2024-04-09 03:01:40 +00:00
TAKAHASHI Shuuji
e0280ad8c4
fix(ui): fix regression where editor is expanded before composing (#2787) 2024-04-08 15:30:55 +00:00
Sebastian Di Luzio
1234fb2dd1
feat: add threaded drafts & posts (#2715)
Co-authored-by: Sebastian Di Luzio <sebastian.di-luzio@iu.org>
Co-authored-by: Emanuel Pina <contacto@emanuelpina.pt>
Co-authored-by: lazzzis <lazzzis@outlook.com>
Co-authored-by: Joaquín Sánchez <userquin@gmail.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
Co-authored-by: Francesco <129339155+katullo11@users.noreply.github.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: patak-dev <matias.capeletto@gmail.com>
2024-04-08 09:53:26 +00:00
Joaquín Sánchez
0538f97ada
chore: update i18n to 8.3.0 (#2765) 2024-04-08 07:30:17 +00:00
Tamas
61265a792f
feat(i18n): update hu-HU.json - review (#2780) 2024-04-08 07:29:45 +00:00
lazzzis
2599c85047
fix(ui): make display name clickable in grouped follow notification (#2776) 2024-04-07 08:29:38 +00:00
Francesco
ab2201f94d
feat(i18n): Update it-IT locale (#2774) 2024-04-07 08:28:26 +00:00
Tamas
80a8f58611
feat(i18n): update hu-HU.json (#2773) 2024-04-06 18:25:23 +00:00
Joaquín Sánchez
e53f651fbb
fix(ui,a11y): focus lost when navigating using the keyboard (tab) (#2766) 2024-04-06 03:58:50 +00:00
patak-dev
25fb7c1c97 chore: release v0.13.2
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-04-05 18:29:15 +02:00
TAKAHASHI Shuuji
839aa52e86
fix: adjust background spacing in direct message (#2764) 2024-04-05 16:23:52 +00:00
TAKAHASHI Shuuji
9ff55289ea
ci(ci.yml): limit maximum execution time of ci test (#2763) 2024-04-05 16:19:53 +00:00
Joaquín Sánchez
73293fbcd3
chore: update nuxt to 3.11.2 (#2755) 2024-04-05 14:34:42 +00:00
TAKAHASHI Shuuji
a27c218802
chore: update github avatar images (#2762) 2024-04-05 14:34:19 +00:00
Emanuel Pina
f8fc0efadc
feat(i18n): Update portuguese from Portugal translation (#2756) 2024-04-05 09:16:30 +00:00
Joaquín Sánchez
618a5b2df3
chore(ui): use full width in settings toggle items (#2754) 2024-04-05 09:16:11 +00:00
lazzzis
1146dca5f6
fix(ui): media preview card is misaligned (#2751) 2024-04-05 09:15:44 +00:00
Joaquín Sánchez
f86e856ee6
feat(i18n): add missing spanish translations (gifs, docs and contributing) (#2753) 2024-04-04 18:36:03 +00:00
renovate[bot]
6d13d61227
chore(deps): update devdependencies (#2725)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-04-04 16:47:27 +00:00
Francesco
0de9825bf2
feat(i18n): Update it-IT locale (#2750) 2024-04-04 13:25:09 +00:00
Joaquín Sánchez
3f0b234cc4
feat(ui): add max. file size check before upload attachment (#2709)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2024-04-04 10:28:18 +00:00
lazzzis
8f04ea8eee
feat(ui): improve gif support (#2752) 2024-04-04 10:27:52 +00:00
Emanuel Pina
7dcafa3fe0
feat(i18n): Update portuguese from Portugal translation (#2747) 2024-04-04 05:17:03 +00:00
Joaquín Sánchez
bead2183b2
fix(ui): don't scroll on settings item click when external or _blank target link (#2742) 2024-04-03 13:59:42 +00:00
patak
59dda09cd4
fix: notifications in update timeline (#2740) 2024-04-03 13:59:24 +00:00
lazzzis
d0b115751f
feat(ui): style blockquote (#2744) 2024-04-03 04:17:52 +00:00
lazzzis
c6787aae3f
fix(ui): clicking on custom emoji does not navigate to status detail (#2743) 2024-04-03 04:17:30 +00:00
patak
9025416ab3
feat: update info dialog (#2741) 2024-04-02 03:17:45 +00:00
TAKAHASHI Shuuji
aa28257754
feat: add "Documentation" link to "About" page (#2734) 2024-04-01 14:57:11 +00:00
TAKAHASHI Shuuji
d807e06fa0
refactor: various typo fixes (#2735) 2024-04-01 14:56:30 +00:00
TAKAHASHI Shuuji
611d556936
feat: put sign-in icon to default "Sign in" button (#2736) 2024-04-01 14:55:31 +00:00
Xabi
4313002950
feat(i18n): update eu-ES.json (#2737) 2024-04-01 14:54:37 +00:00
TAKAHASHI Shuuji
de11a60b17
feat: add "How to contribute?" link next to language status (#2733) 2024-04-01 05:27:47 +00:00
TAKAHASHI Shuuji
5064b269e7
feat: show background color for direct post to reduce mistake (#2732) 2024-04-01 05:26:51 +00:00
TAKAHASHI Shuuji
d8d9975756
fix: hide duplicated status actions items on details page in zen mode (#2731) 2024-04-01 05:25:53 +00:00
TAKAHASHI Shuuji
eee671cdc3
fix: improve keyboard operability especially on search page and editor (#2730)
Co-authored-by: patak <583075+patak-dev@users.noreply.github.com>
2024-04-01 05:24:42 +00:00
lazzzis
587c063aba
fix(ui): remove a duplicated command (#2718) 2024-03-30 04:19:22 +00:00
lazzzis
28514e956d
fix(ui): wrong polls are removed (#2720) 2024-03-30 04:18:33 +00:00
lazzzis
42aeb8fa35
fix(ui): prevent from navigating to search page when opening command panel (#2719) 2024-03-30 04:15:58 +00:00
Joaquín Sánchez
f6f50a582e
fix(ui): change status actions title (#2717) 2024-03-29 20:04:55 +00:00
patak-dev
f86818867b chore: release v0.13.1
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-03-29 16:37:28 +01:00
Sma11X
82d962a54b
fix: add missing notification event type (#2714) 2024-03-29 15:31:53 +00:00
renovate[bot]
1b189043e4
chore(deps): update devdependencies (major) (#2400)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 08:51:07 +00:00
renovate[bot]
a4867566d9
chore(deps): update devdependencies (#2697)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 08:34:06 +00:00
renovate[bot]
0757db69b2
chore(deps): update dependency @types/prettier to v3 (#2712)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 08:33:11 +00:00
renovate[bot]
f0de25c992
chore(deps): update dependency @antfu/eslint-config to ^2.9.0 (#2711)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-26 08:32:33 +00:00
TAKAHASHI Shuuji
660549b08b
chore: update masto to v6.7.0 (#2708) 2024-03-21 15:18:53 +00:00
Joaquín Sánchez
7807730118
feat(i18n): add missing spanish mute duration dialog entries (#2696) 2024-03-21 12:37:57 +00:00
Joaquín Sánchez
b526db0860
chore: update i18n module to 8.2.0 (#2703) 2024-03-21 12:13:28 +00:00
Sma11X
0133324ded
fix: correct local timeline stream (#2707) 2024-03-21 10:08:51 +00:00
TAKAHASHI Shuuji
e9ab0cd40b
fix: prevent showing notification errors for dev for known emoji reaction types (#2704) 2024-03-19 15:04:16 +00:00
Joaquín Sánchez
9251ec496b
chore: add ofetch to typescript.hoist (#2693)
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-03-19 12:56:14 +00:00
renovate[bot]
bd4cd02b2b
chore(deps): update pnpm to v8.15.5 (#2698)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-19 12:40:13 +00:00
Joaquín Sánchez
74ccfece5d
chore: update nuxt to 3.11.1 (#2702) 2024-03-19 12:36:25 +00:00
Sma11X
c89e499f96
fix: pre tag overwritten by default style (#2699) 2024-03-18 11:34:03 +00:00
Dohány Tamás
89e3582dd7
feat(i18n): Update hu-HU.json (#2694) 2024-03-17 19:11:42 +00:00
TAKAHASHI Shuuji
48c013709a
ci(docker.yml): support linux/arm64 container (#2691) 2024-03-17 15:15:04 +00:00
renovate[bot]
f90f0a2e61
chore(deps): update pnpm to v8.15.4 (#2627)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-17 15:14:19 +00:00
renovate[bot]
c58b585855
chore(deps): update lint (#2399)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-17 15:14:04 +00:00
Joaquín Sánchez
ded2e0f3d7
chore: update nuxt to 3.11.0 (#2692) 2024-03-17 14:32:02 +00:00
Joaquín Sánchez
21d5633233
chore: bump to eslint-config to 2.8.1 (#2685) 2024-03-13 06:39:28 +00:00
Joaquín Sánchez
7703565c75
fix(ui): hashtags not working when composing (#2686) 2024-03-12 20:47:05 +00:00
cuithon
5a9546ec0a
chore: fix typo (#2681)
Signed-off-by: cuithon <dscs@outlook.com>
2024-03-12 07:58:20 +00:00
patak
bc30a8bd82 chore: release v0.13.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-03-11 12:08:52 +01:00
Duy
c432c2bd0d
feat(i18n): Update vi-VN.json (#2664) 2024-03-11 10:55:18 +00:00
Francesco
364fbd350b
feat(i18n): Update it-IT locale (#2666) 2024-03-11 10:55:05 +00:00
Xabi
c64580f782
feat(i18n): update eu-ES.json (#2670) 2024-03-11 10:54:53 +00:00
Emanuel Pina
e7dfdafd59
feat(i18n): Update portuguese from Portugal translation (#2671) 2024-03-11 10:54:38 +00:00
Ayo Ayco
b06ec9356d
feat(i18n): update Tagalog translations (#2677) 2024-03-11 10:54:20 +00:00
TAKAHASHI Shuuji
3b1a66c93c
fix: fix vue/no-ref-as-operand and vue/return-in-computed-property ESLint errors (#2679) 2024-03-11 10:53:25 +00:00
TAKAHASHI Shuuji
ed8a1811cc
chore: upgrade @vueuse/core from 10.8.0 to 10.9.0 (#2674) 2024-03-10 18:38:37 +00:00
TAKAHASHI Shuuji
dfbe2e080d
fix: prevent empty search keyword to send invalid request (#2676) 2024-03-10 18:37:32 +00:00
TAKAHASHI Shuuji
0fd9374e8c
fix: fix incorrect follow status on followers and following pages (#2669) 2024-03-09 19:31:40 +00:00
TAKAHASHI Shuuji
1c8e48bee4
fix: show loading spinner on follow button while fetching account relationship (#2667)
Co-authored-by: patak <583075+patak-dev@users.noreply.github.com>
2024-03-09 18:44:44 +00:00
TAKAHASHI Shuuji
3448335356
feat: allow to set mute duration and notifications mute option (#2665) 2024-03-09 09:52:41 +00:00
Joaquín Sánchez
4954473f50
chore: extract bg and theme colors to constants (#2662) 2024-03-07 19:15:35 +00:00
TAKAHASHI Shuuji
efa17caf5e
fix: consistent hover highlight styling in mobile bottom navigation menus (#2661) 2024-03-07 19:14:20 +00:00
Joaquín Sánchez
df165f0023
fix(pwa): wrong web manifest colors (#2659) 2024-03-07 14:55:27 +00:00
TAKAHASHI Shuuji
0f583ece28
feat: remember last accessed explore tab (#2658) 2024-03-07 14:33:25 +00:00
Ivan Demchuk
d579977790
feat(i18n): update Ukrainian translations (#2660) 2024-03-07 13:41:24 +00:00
TAKAHASHI Shuuji
8786c83db7
fix: remember last accessed notification tab (#2654) 2024-03-06 22:00:07 +00:00
patak
1ce913e69d chore: release v0.12.1
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-03-06 16:52:16 +01:00
Joaquín Sánchez
48a8b74e7c
fix(ui): mentions not working when composing (#2655) 2024-03-06 15:42:41 +00:00
patak
1ff13952b0 chore: release v0.12.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-03-06 08:48:14 +01:00
Francesco
02f7c4b291
feat(i18n): Update it-IT locale (#2652) 2024-03-05 20:12:05 +00:00
Joaquín Sánchez
9da77637b2
chore: bump to eslint-config v2.8.0 (#2651)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2024-03-05 14:48:58 +00:00
Joaquín Sánchez
62f70250d5
fix(ui): wrong reply to account (#2649) 2024-03-05 13:21:58 +00:00
Joaquín Sánchez
873c62e9ef
feat(i18n): add missing nav.hashtags entry for Spanish translation (#2650) 2024-03-05 13:21:12 +00:00
Emanuel Pina
b1ff1e6277
feat(i18n): Update portuguese from Portugal translation (#2648) 2024-03-05 13:20:44 +00:00
TAKAHASHI Shuuji
f644148844
feat: introduce new "Followed tags" page (#2642)
Co-authored-by: patak <583075+patak-dev@users.noreply.github.com>
2024-03-05 10:27:10 +00:00
Joaquín Sánchez
3120bbb77f
feat(content-rich html parsing): add paragraphs LTR/RTL direction support (#2545) 2024-03-05 06:25:58 +00:00
renovate[bot]
6cbe65c9d8
chore(deps): update devdependencies (#2646)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-04 20:39:12 +00:00
qezwan
1c908363cb
feat(i18n): Add central kurdish locale(ckb) (#2332)
Co-authored-by: userquin <userquin@gmail.com>
2024-03-04 20:28:57 +00:00
Jafar Farganlooj
c01a15c930
feat(i18n): Add Persian translation (#2535)
Co-authored-by: userquin <userquin@gmail.com>
2024-03-04 19:59:03 +00:00
nonnullish
0c15aa55d8
fix: fix emoji placement (#2626) (#2645) 2024-03-04 19:56:59 +00:00
Joaquín Sánchez
9f04e17e57
fix(ui): avoid fetching status account in replying to until visible (#2638) 2024-03-04 19:55:02 +00:00
Joaquín Sánchez
308b50cbad
feat(ui): fetch account data on demand (#2632) 2024-03-04 19:20:13 +00:00
TAKAHASHI Shuuji
e44833b18a
feat: show tag hover card when hovering cursor on hashtag links (#2621)
Co-authored-by: userquin <userquin@gmail.com>
2024-03-04 16:45:25 +00:00
Joaquín Sánchez
0fa87f71a4
chore(tests): fix vitest can't terminate worker (#2644) 2024-03-04 16:41:38 +00:00
Emanuel Pina
edfbe2c3ed
feat(i18n): Update portuguese from Portugal translation (#2633) 2024-03-04 16:02:35 +00:00
Joaquín Sánchez
70c7e93919
refactor: update no reactivity transform changes (#2639) 2024-03-04 16:01:56 +00:00
TAKAHASHI Shuuji
95e466146d
fix: show correct reply target user account in reply post header (#2640) 2024-02-29 20:55:46 +00:00
Joaquín Sánchez
efec212a9f
fix(pwa): update pwa plugin to fix broken prompt (#2634) 2024-02-29 16:55:31 +00:00
Kevin Pliester
1844af0a41
feat(i18n): German translation for new shortcuts (#2641) 2024-02-29 16:09:04 +00:00
Joaquín Sánchez
72b80d4984
fix(ui): missing replying to links (#2637) 2024-02-28 18:02:09 +00:00
Francesco
6dc5a68c80
feat(i18n): Update it-IT locale (#2630) 2024-02-26 13:22:51 +00:00
TAKAHASHI Shuuji
310b32c123
fix: allow to edit alt description of attached image again (#2631) 2024-02-26 13:11:21 +00:00
Joaquín Sánchez
748dd5e19f
fix(cache): return cached account as promise (#2623) 2024-02-25 19:43:34 +00:00
Joaquín Sánchez
c00d6f7bf8
feat(ui): add missing goto magic keys spanish translation entries (#2625) 2024-02-25 19:39:57 +00:00
Joaquín Sánchez
fc5d248094
fix(ui): account mentions not being fetched when visible (#2624) 2024-02-25 19:28:38 +00:00
Joaquín Sánchez
6f20ce5bba
chore(test): add hanging-process reporter on CI (#2622) 2024-02-25 14:13:27 +00:00
TAKAHASHI Shuuji
edcc8741bf
feat: add several new shortcut keys for navigation (#2618) 2024-02-24 19:28:56 +00:00
renovate[bot]
3584151fab
fix(deps): update tiptap to v2.2.4 (#2398)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: userquin <userquin@gmail.com>
2024-02-24 19:26:14 +00:00
Joaquín Sánchez
efb6967e6a
fix(ui): help preview tabindex, auto focus and buttons (#2616) 2024-02-24 18:24:55 +00:00
Joaquín Sánchez
eddbb1eee9
chore: cleanup isHydrated (#2614)
Co-authored-by: patak <583075+patak-dev@users.noreply.github.com>
2024-02-24 18:24:19 +00:00
Joaquín Sánchez
6b40319723
fix(ui): wrong tabindex usage 2 (#2617) 2024-02-24 18:23:37 +00:00
Joaquín Sánchez
913e2892f7
fix(ui): wrong tabindex usage (#2615) 2024-02-24 18:13:12 +00:00
renovate[bot]
a3c5272e07
chore(deps): update devdependencies (#2388)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-24 16:56:38 +00:00
Joaquín Sánchez
55037f04cd
chore: update nuxt to 3.10.3 (#2610) 2024-02-24 16:46:14 +00:00
patak
1fefb6e5b6
fix: paginator watch (#2613) 2024-02-24 14:51:51 +00:00
patak
3769176eaa
feat: . shortcut to show new items (#2612) 2024-02-24 14:46:54 +00:00
TAKAHASHI Shuuji
082650d458
fix: fix [object Object] on the mentions tab (#2611) 2024-02-24 14:18:13 +00:00
Joaquín Sánchez
36004a7eba
feat: bump to latest vue 3.4.19 (#2607)
Co-authored-by: patak <matias.capeletto@gmail.com>
2024-02-24 12:24:21 +00:00
Joaquín Sánchez
81ef8ff9aa
chore: include .gitattributes for eol (#2606) 2024-02-23 13:32:51 +00:00
Joaquín Sánchez
da163903b1
chore: bump to @vueuse/gesture v2.0.0 (#2605) 2024-02-23 13:04:44 +00:00
patak
ccfa7a8d10
refactor: no reactivity transform (#2600) 2024-02-21 15:20:08 +00:00
Xabi
b9394c2fa5
fix(i18n): update eu-ES.json (#2594) 2024-02-19 12:42:57 +00:00
Yudai Nishiyama
1954c34628
feat(i18n): Update ja-JP.json (#2588) 2024-02-19 12:05:02 +00:00
patak
9f005a0a59 chore: release v0.11.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2024-02-19 10:33:00 +01:00
TAKAHASHI Shuuji
bf0c562794
fix(suggestion): allow case-insensitive emoji suggestion (#2565) 2024-02-19 09:23:58 +00:00
renovate[bot]
54fe0c1ab9
chore(deps): update dependency vitest to ^1.3.0 (#2556)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-17 17:29:14 +00:00
Shinigami
1bbc2eca24
fix: notification badge (#2592)
Co-authored-by: Ayo <ramon.aycojr@gmail.com>
2024-02-16 16:48:53 +00:00
renovate[bot]
dcc1b74824
chore(deps): update pnpm to v8.15.3 (#2557)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-15 15:49:27 +00:00
ocavue
8eb6b2378a
refactor: migrate from shikiji to shiki v1 (#2591) 2024-02-15 07:43:09 +00:00
lazzzis
40415f34a4
fix: fix tooltip overlaps with editor tool popup on Mobile (#2582) 2024-02-11 06:39:45 +00:00
Emanuel Pina
be4752ee0c
feat(i18n): Update portuguese from Portugal translation (#2577) 2024-02-08 15:41:26 +00:00
Joaquín Sánchez
30e2295af4
feat(i18n): Update es.json (#2576) 2024-01-26 23:23:57 +00:00
华丽
285f83e2fa
feat: Add option to preserve whitespace in parseOptions (#2448) 2024-01-26 18:44:07 +00:00
Duy
8db37617d4
feat(i18n): Update vi-VN.json (#2574) 2024-01-26 18:43:07 +00:00
Francesco
172883a499
feat(i18n): Update it-IT locale (#2572) 2024-01-26 03:21:23 +00:00
TAKAHASHI Shuuji
2a59543836
fix: allow to translate "Lock" string on profile (#2571) 2024-01-24 15:48:24 +00:00
TAKAHASHI Shuuji
77b917a921
fix: rename tab label from "Mention" to "Mentions" (#2570) 2024-01-24 12:12:42 +00:00
Francesco
af8a6e6809
feat(i18n): Update it-IT locale (#2569) 2024-01-24 09:13:02 +00:00
Francesco
6d8b33a58a
feat(i18n): Update it-IT locale (#2567) 2024-01-23 05:26:09 +00:00
patak
7322711609
fix: subscribe to proper user.notification stream (#2566) 2024-01-21 08:52:52 +00:00
Duy
b8e8693342
feat(i18n): Update vi-VN.json (#2560) 2024-01-21 08:31:22 +00:00
TAKAHASHI Shuuji
f0bc78ba2c
refactor: fix lint warnings (#2564) 2024-01-21 09:30:15 +01:00
TAKAHASHI Shuuji
cadf1b4a7c
feat: add Bluesky and Friendica icons (#2563) 2024-01-18 10:21:49 +00:00
TAKAHASHI Shuuji
f79d84ad6e
feat: add new setting to disable blur for low-performance device (#2561) 2024-01-18 08:18:49 +00:00
renovate[bot]
b0125eb3fc
chore(deps): update docker/setup-qemu-action action to v3 (#2558)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-15 08:35:52 +00:00
Emanuel Pina
77175416a6
feat(i18n): Update portuguese from Portugal translation (#2555) 2024-01-10 15:31:28 +00:00
renovate[bot]
7836edd10a
chore(deps): update docker/metadata-action action to v5 (#2527)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-10 15:02:29 +00:00
renovate[bot]
0ae189207f
chore(deps): update docker/login-action action to v3 (#2515)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-10 14:01:10 +00:00
renovate[bot]
56d4967eb7
chore(deps): update docker/setup-buildx-action action to v3 (#2528)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-10 13:46:05 +00:00
TAKAHASHI Shuuji
0451ac98c9
feat: improve title and layout of the confirm dialog (#2307) 2024-01-09 19:51:36 +00:00
ghose
54e53889e5
feat(i18n): updated gl-ES translation (#2522)
Co-authored-by: Joaquín Sánchez <userquin@gmail.com>
Co-authored-by: patak <matias.capeletto@gmail.com>
2024-01-09 14:35:04 +01:00
yrming
149963c304
feat(i18n): complete the translation of copy_account_name (#2487) 2024-01-09 09:12:29 +00:00
Cesar Gomez
44f5ec1fa2
feat(i18n): missing and rewording es and es-419 keys (#2511)
Co-authored-by: patak <matias.capeletto@gmail.com>
2024-01-09 09:08:42 +00:00
patak
6c5bb83ac3
feat: upgrade to masto.js v6 (#2530) 2024-01-09 08:56:15 +00:00
Joshix-1
d8ea685803
fix: meta og:url should use the origin of the request instead of elk.zone (#2550) 2024-01-09 08:14:35 +00:00
Duy
3fa1fc349c
feat(i18n): update vi-VN.json (#2506) 2024-01-08 20:26:04 +00:00
Joaquín Sánchez
3adf92ea56
feat: add LTR/RTL in hashtags and mentions support (#2541)
Co-authored-by: Daniel Roe <daniel@roe.dev>
2024-01-04 19:51:32 +00:00
Matty Jorgensen
b016320eaf
feat: add Vercel KV (#2533) 2024-01-02 10:58:37 +00:00
ocavue
77588c1890
fix: trigger code block highlighting when the highlighter is ready (#2539) 2024-01-01 16:46:37 +00:00
北雁云依
e43993770d
fix: spoiler button style in notifications (#2537) 2024-01-01 17:48:52 +01:00
TAKAHASHI Shuuji
9070fa4053
feat: add a new link icon (#2534) 2024-01-01 17:48:10 +01:00
Roshan Jossy
7f041c3ac8
docs: use GitHub markdown formatting for note in Readme (#2536) 2024-01-01 17:47:49 +01:00
Sebastian Di Luzio
b7c22287d6
chore: run unit tests in watch mode by default (#2525) 2023-12-22 21:50:59 +00:00
Sebastian Di Luzio
07042b9f31
fix: correct linking of theme colors (#2524) 2023-12-22 13:25:34 +01:00
Shinigami
c0bb6e293c
feat: show emoji tooltip (#2485) 2023-12-22 12:16:46 +00:00
ocavue
74138a9a58
refactor: migrate from shiki to shikiji (#2520) 2023-12-20 18:54:40 +00:00
renovate[bot]
e63473a5f8
chore(deps): update pnpm to v8.12.1 (#2514)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-19 20:59:20 +00:00
renovate[bot]
24378e0be8
chore(deps): update dependency vitest to ^1.1.0 (#2338)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-19 20:58:50 +00:00
Daniel Roe
5ce005b55a
chore: correct type import from floating-vue (#2518) 2023-12-19 22:31:39 +01:00
Daniel Roe
3ae2d50bff
test: reenable nuxt runtime tests (with latest test-utils) (#2497) 2023-12-14 11:45:52 +00:00
renovate[bot]
2b421f1039
chore(deps): update pnpm to v8.12.0 (#2507)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 21:42:53 +00:00
renovate[bot]
e0ddbc1da2
chore(deps): update dependency vitest to v1 (#2508)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 21:42:19 +00:00
Xabi
ca3a818678
fix(i18n): update Basque localisation (#2503) 2023-12-09 16:05:10 +00:00
Joaquín Sánchez
9155c32ece
chore(pwa): improve DX for $pwa (#2498) 2023-12-09 16:04:41 +00:00
Cesar Gomez
3dbdb99118
feat(i18n): es & es-419 locales sync (#2505) 2023-12-09 16:03:43 +00:00
renovate[bot]
c3d96d2811
chore(deps): update dependency node to v20 (#2501)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-05 10:18:22 +00:00
renovate[bot]
429d1d7ce8
chore(deps): update actions/setup-node action to v4 (#2499)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-05 10:18:19 +00:00
Joaquín Sánchez
5503ecbea2
chore(pwa): change sw generation logic (#2494) 2023-12-01 17:28:31 +00:00
Tamas
21376e013a
feat(i18n): hu-HU.json update (#2489) 2023-11-29 22:27:04 +00:00
Daniel Roe
17f6d93c7c
chore: update nuxt to v3.8.2 (#2490) 2023-11-29 22:26:10 +00:00
renovate[bot]
0e701afb98
chore(deps): update all non-major dependencies (#2389)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-29 17:55:12 +00:00
renovate[bot]
cdcc89518a
chore(deps): update actions/checkout action to v4 (#2391)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-29 17:54:45 +00:00
renovate[bot]
1f6a7186f8
chore(deps): update docker/build-push-action action to v5 (#2401)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-29 17:54:13 +00:00
Tamas
ad1461bd2d
feat(i18n): hu-HU.json issue (#2486)
Co-authored-by: Tamas Dohany <iamdtms@gmail.com>
Co-authored-by: Tamas Dohany <dohany.tamas@atlatszo.hu>
2023-11-29 11:19:28 +00:00
Daniel Roe
7ba9b05d12
chore: bump @nuxtjs/color-mode (#2488) 2023-11-29 11:09:44 +00:00
yrming
9c39eed209
feat: unify the style of under construction page (#2483) 2023-11-28 10:54:22 +00:00
Francesco
7ed95e317f
feat(i18n): Update it-IT locale (#2473) 2023-11-27 17:55:51 +00:00
Tamas
46105c86c6
feat(i18n): update hu-HU.json (#2480)
Co-authored-by: Tamas Dohany <iamdtms@gmail.com>
2023-11-27 12:19:13 +00:00
Sma11X
7785f4fe06
feat(settings): convert metadata to text (#2444) 2023-11-27 12:17:58 +00:00
Emanuel Pina
585d8c6f0b
fix(i18n): Update portuguese from Portugal translation (#2482) 2023-11-27 12:11:11 +00:00
Alex
1f752e65ed
fix: move the ALT text button for video attahcments to the top (#2479) 2023-11-24 08:19:53 +00:00
Tamas
7595162a0e
feat(i18n): update hu-HU.json (#2477)
Co-authored-by: Tamas Dohany <iamdtms@gmail.com>
2023-11-22 18:10:22 +00:00
TAKAHASHI Shuuji
20c30e92a3
feat: support Threads icon in profile links (#2474) 2023-11-17 08:40:23 +00:00
TAKAHASHI Shuuji
e00e4074e1
feat: put account name copy button (#2347) 2023-11-14 14:34:56 +00:00
patak
7ec76ffed9 chore: release v0.10.3
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-11-14 11:05:09 +01:00
patak
c41b427c2e
fix: btn-solid text color for dark mode (#2471) 2023-11-13 17:30:36 +00:00
Ayo Ayco
c55545612e
feat: allow https as frame-src (#2468) 2023-11-12 06:42:02 +00:00
Adityawarman Dewa Putra
dab0502319
feat(i18n): Update id-ID locale (#2460) 2023-11-11 09:21:20 +00:00
Adityawarman Dewa Putra
10bd555926
feat: add pinterest icon in profile metadata (#2461) 2023-11-11 09:20:41 +00:00
Xabi
53dc1f37ca
fix(i18n): update Basque localisation (#2465) 2023-11-11 09:18:41 +00:00
TAKAHASHI Shuuji
68f92e07b7
feat(a11y): improve button color contrast with white text (#2449) 2023-11-09 20:24:11 +00:00
Ayo Ayco
957f0d3b17
feat: display embedded media player (#2417) 2023-11-07 09:57:44 +00:00
JP
0bd1209bee
feat(i18n): Update arabic locale (#2459) 2023-11-06 07:42:17 +00:00
Tamas
00c4a369cc
feat(i18n): update hu-HU.json (#2458)
Co-authored-by: Tamas Dohany <iamdtms@gmail.com>
2023-11-06 07:41:52 +00:00
Adityawarman Dewa Putra
8a5ddb7c87
feat(i18n): Update the id-ID locale (#2456) 2023-11-06 07:40:50 +00:00
Francesco
90878f97b5
feat(i18n): Update it-IT locale (#2440) 2023-11-03 15:00:41 +00:00
Emanuel Pina
09189378e0
fix(i18n): Update portuguese from Portugal translation (#2446) 2023-11-03 15:00:16 +00:00
Ɗʊƴ
769968c2e8
fix(i18n): Add new strings (#2447) 2023-11-03 14:59:33 +00:00
Tom Doe
5d09e7d2ab
fix: #2439 - endMessage in CommonPaginator (#2441) 2023-10-24 13:01:57 +00:00
Francesco
0924c9d9be
feat(i18n): Update it-IT locale (#2438) 2023-10-22 20:47:46 -05:00
Sma11X
293534fb8b
fix: correct links content with query symbol (#2377) 2023-10-22 16:14:37 +00:00
Sma11X
5fceb70971
feat: handle follow request (#2339) 2023-10-22 16:11:00 +00:00
Emanuel Pina
d825a71d1f
fix(i18n): Update portuguese from Portugal translation (#2437) 2023-10-22 16:07:23 +00:00
Daniel Roe
a47071d341 chore: bump some lockfile dependencies 2023-10-18 09:47:29 +01:00
Daniel Roe
52c947f9e5 chore: update nuxt-vitest 2023-10-18 09:36:46 +01:00
Xabi
07b7f38386
fix(i18n): update eu-ES.json (#2432) 2023-10-17 08:09:47 +00:00
TAKAHASHI Shuuji
291f99cbea
feat(ui): add "search" to the keyboard shortcut help (#2429) 2023-10-16 10:51:37 +00:00
Sma11X
1fe598f554
fix: some keyboard shortcuts not working in non-english (#2324) 2023-10-13 07:13:37 +00:00
Sma11X
e9f274f304
feat: replace links in status after translated (#2385)
Co-authored-by: patak <matias.capeletto@gmail.com>
2023-10-13 07:12:48 +00:00
Daniel Roe
ca0afe585d chore: dedupe dependencies 2023-10-12 16:30:35 +01:00
Joaquín Sánchez
1a0e83365a
fix(pwa): add manifest-src to CSP (#2428) 2023-10-12 16:57:52 +02:00
Anthony Fu
77a3bd833d chore: update devtools 2023-10-11 17:46:23 +08:00
Abel Derderian
02abe2d920
feat(i18n): Update the fr-FR locale (#2421) 2023-10-09 21:24:23 +00:00
Joaquín Sánchez
c8d9c4b871
fix(ui): exclude notifications without the status (#2375) 2023-10-09 20:33:02 +00:00
Emanuel Pina
fee811dd75
fix(i18n): Update portguese from Portugal translation (#2364) 2023-10-09 20:20:42 +00:00
Xabi
1910a1d782
fix(i18n): update Basque localisation (#2376) 2023-10-09 20:19:14 +00:00
Joaquín Sánchez
c387702bb1
feat(i18n): include missing Spanish entries (#2381) 2023-10-09 20:17:33 +00:00
Sebastian Di Luzio
e015adcf4e
fix: profile header avatar being pushed lower on smaller devices (#2423) 2023-10-09 20:14:04 +00:00
Daniel Roe
12eaae6bbb chore: export Emoji as explicit type 2023-10-03 00:09:18 +01:00
patak
e199e02e79 chore: release v0.10.2
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-10-02 09:24:30 +02:00
Pavel Ruzicka
b42e77af24
i18n: update cs-CZ.json (#2418) 2023-10-01 02:41:21 -05:00
patak
0343898146 fix: revert publish height (#2334)
This reverts commit b74eec6a03.
2023-09-30 09:59:03 +02:00
TAKAHASHI Shuuji
b5f2cea1dc
feat(i18n): update Japanese localization (#2415) 2023-09-28 12:03:44 +00:00
Ɗʊƴ
2a9f607049
fix(i18n): Update vi-VN.json (#2396)
Co-authored-by: patak <matias.capeletto@gmail.com>
2023-09-25 19:11:15 +00:00
Francesco
043883bd8e
feat(i18n): Update it-IT locale (#2408) 2023-09-25 19:10:05 +00:00
Francesco
ed5592260f
feat(i18n): Update it-IT locale (#2370) 2023-09-20 06:52:50 +00:00
Sebastian Di Luzio
f4b0be8aed
feat: make new users signup notifications link to their profile (#2406) 2023-09-20 06:52:05 +00:00
Tamas
b723d51786
feat(i18n): Add Hungarian translation (hu-HU) (#2373)
Co-authored-by: Tamas Dohany <iamdtms@gmail.com>
Co-authored-by: Zsolt Botykai <zsolt.botykai@gmail.com>
2023-09-15 21:25:34 +00:00
renovate[bot]
25d4325bd0
chore(deps): update lint (#2390)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-13 06:34:15 +00:00
Anthony Fu
319f9c4ece fix(ui): improve notifications alignment and icons consistenty 2023-09-08 18:14:19 +02:00
Anthony Fu
06ef226440 chore: clean up footer 2023-09-08 17:57:08 +02:00
Anthony Fu
3691ec389a fix: improve elk-group-hover shortcut, close #2386 2023-09-08 17:56:29 +02:00
YRMING
ca2ca2bef4
feat: unify the format of locale keys (#2380) 2023-09-06 12:51:01 +00:00
Ayo Ayco
907d9999dc
feat: filter notifications by type (#2371)
Co-authored-by: Xabi <xabi.rn@gmail.com>
Co-authored-by: userquin <userquin@gmail.com>
2023-09-06 09:13:16 +00:00
renovate[bot]
e9c5de577e
chore(deps): update dependency lint-staged to v14 (#2354)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-05 14:22:33 +00:00
renovate[bot]
87d6ed39eb
fix(deps): update dependency iso-639-1 to v3 (#2355)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-05 13:43:52 +00:00
renovate[bot]
cf20ac29db
chore(deps): update lint (#2311)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-05 13:42:20 +00:00
renovate[bot]
1a96f87da0
fix(deps): update tiptap to v2.1.8 (#2256)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-05 13:42:01 +00:00
renovate[bot]
0f825a6efb
chore(deps): update devdependencies (#2310)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2023-09-05 12:55:03 +00:00
renovate[bot]
1b8d72105d
chore(deps): update pnpm to v8.7.1 (#2337)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-05 11:57:03 +00:00
TAKAHASHI Shuuji
5ef2996b40
feat: add keyboard shortcut helper link or button (#2365) 2023-08-28 15:24:34 +00:00
Sma11X
1ac3164d0c
fix(i18n): add missing translation (#2340) 2023-08-24 11:09:54 +00:00
Liberal dev
e4725d433e
fix(i18n): fix Korean translation (#2335) 2023-08-24 11:09:35 +00:00
Valtteri Laitinen
3716e3af6e
feat(i18n): update and improve Finnish locale (#2341) 2023-08-24 11:08:56 +00:00
Francesco
366f3e07df
feat(i18n): Update it-IT locale (#2350) 2023-08-24 11:06:00 +00:00
Joaquín Sánchez
6801ea6c2d
fix: compose page error (#2360) 2023-08-23 10:33:26 +00:00
Sma11X
4b37d19f65
fix: change status focus style (#2356) 2023-08-23 10:32:59 +00:00
Sma11X
c1bca79c50
fix: shrink the height of avatar (#2361) 2023-08-22 21:58:31 +00:00
Valtteri Laitinen
ee88c111f2
fix(i18n): use "post" and "boost" consistently (#2344) 2023-08-20 21:41:02 +00:00
舜岳
067550720a
refactor: solve the problem that the title is not centered (#2353) 2023-08-19 10:35:11 +00:00
Valtteri Laitinen
c5b1b32f2c
fix(i18n): correct typo (#2343) 2023-08-15 16:13:44 +00:00
Joaquín Sánchez
bd7436e5d2
feat(i18n): Add missing Spanish translations (#2336) 2023-08-14 14:05:35 +00:00
Valtteri Laitinen
8b883dc957
fix(i18n): delete unused strings (#2345) 2023-08-14 13:57:38 +00:00
Valtteri Laitinen
06808da616
fix(i18n): use normal question mark (#2342) 2023-08-14 13:56:33 +00:00
Anthony Fu
0b900128c1 chore: release v0.10.1
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-08-13 12:31:14 +02:00
Florian Martinez
b74eec6a03
fix: publish height (#2334) 2023-08-13 08:39:18 +00:00
Florian Martinez
92d0f18389
fix: role indicator (#2333) 2023-08-13 08:28:32 +00:00
Liberal dev
c0f936f8fe
feat(i18n): Improve Korean translation (#2320) 2023-08-12 10:27:37 +00:00
Francesco
7e492422fe
fix(i18n): it-IT typo (#2323) 2023-08-12 10:27:07 +00:00
lazzzis
4325bca22b
feat(a11y): enhance post-related a11y features (#2328) 2023-08-12 10:26:37 +00:00
Duy
5a765187ab
fix(i18n): Update vi-VN.json (#2330) 2023-08-12 10:25:40 +00:00
lazzzis
e9a02ca337
fix: like/bookmark button is disappeared (#2327) 2023-08-12 12:25:24 +02:00
Xabi
221a6f2fc3
fix(i18n): update Basque localisation (#2325) 2023-08-11 12:21:40 +00:00
lazzzis
2267db11c6
feat: disabled boost button (#2326) 2023-08-11 11:56:47 +00:00
lazzzis
a4d34323ed
feat(a11y): add checkbox role to toggle items (#2321) 2023-08-10 10:18:35 +00:00
lazzzis
91db9b03a8
docs: fix a broken link in README (#2322) 2023-08-10 10:06:52 +00:00
Liberal dev
0be47261c7
fix(i18n): Improve Korean translation (#2319) 2023-08-09 22:33:12 +00:00
Liberal dev
49b39b7fa8
fix(i18n): Update Korean translation (#2318) 2023-08-09 18:59:32 +02:00
Vee Satayamas
1f37e3ab8b
feat(i18n): Add Thai locale (#2115) 2023-08-09 11:51:07 +00:00
Eric
e183c62036
fix(i18n): Update zh-CN.json (#2313) 2023-08-09 11:50:25 +00:00
Mikhail
370c8dd58e
fix(i18n): Add missing translations for ru-RU (#2212) 2023-08-09 11:49:15 +00:00
Liberal dev
b19f73c870
feat(i18n): Improve Korean translation (#2316) 2023-08-09 11:48:04 +00:00
Emanuel Pina
dccdcbbbe2
fix(i18n): Update portuguese from Portugal translation (#2285) 2023-08-09 11:47:25 +00:00
Duy
280911b233
fix(i18n): Update vi-VN.json (#2303) 2023-08-09 11:46:46 +00:00
Liberal dev
f3d17d3be2
fix: improve default font family (#2314) 2023-08-09 11:46:26 +00:00
Francesco
3f6cc16850
fix(i18n): Update it-IT locale (#2294) 2023-08-09 11:46:13 +00:00
Daniel Roe
4ebc8b6798 fix: deduplicate unstorage version 2023-08-08 11:30:38 +01:00
三咲智子 Kevin Deng
7079564ffe
refactor: upgrade vue-macros 2023-08-08 02:32:35 +08:00
Ayaka Rizumu
991034115b
feat: pull down to close bottom nav sidebar (#2290) 2023-08-03 15:05:58 +00:00
Nicolas Lœuillet
57814915d6
fix(i18n): fr-FR typo (#2295)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-08-02 10:45:53 +00:00
Chanhwi Joo
8181738d48
fix(i18n): Update Korean localization (#2292) 2023-08-02 10:44:24 +00:00
TAKAHASHI Shuuji
0a8cc317a9
feat: show delete confirmation dialog when clicking "Delete & re-draft" menu (#2296)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-08-02 10:41:47 +00:00
renovate[bot]
8df73b13bd
chore(deps): update dependency prettier to v3 (#2257)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-08-02 10:37:43 +00:00
Sma11X
d975c6fc2c
fix: add attributes before status update (#2293) 2023-08-02 10:31:08 +00:00
renovate[bot]
67d5d5c00a
chore(deps): update lint (#2233)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-08-02 10:28:18 +00:00
Sma11X
603e10b6ca
fix: check login in zen mode (#2258) 2023-08-02 10:27:31 +00:00
Anthony Fu
9ae0d9b744 ci: add merge_group event for merge queue 2023-08-02 12:13:23 +02:00
Anthony Fu
28f9540113 pref: improve unocss perf 2023-08-02 12:12:48 +02:00
Sma11X
468a17ad58
fix: nav more menu not active (#2300) 2023-08-02 11:43:24 +02:00
renovate[bot]
b84a6ccc32
chore(deps): update devdependencies (#2236)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-01 22:57:32 +01:00
Daniel Roe
a45b7173e5
chore: update to nuxt v3.6.5 (#2299) 2023-08-01 22:11:26 +01:00
三咲智子 Kevin Deng
d23f1d39eb
refactor: replace defineModels with defineModel 2023-08-01 17:44:01 +08:00
Daniel Roe
e6172ad38b chore: update nuxt-vitest 2023-08-01 10:36:19 +01:00
Daniel Roe
5870e8d6e6 test: work around mocking issue 2023-07-31 23:56:21 +01:00
renovate[bot]
3d696646c5
chore(deps): update dependency vitest to ^0.33.0 (#2235)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-31 20:20:25 +01:00
Daniel Roe
6edb6ccb15 chore: update nuxt-vitest 2023-07-31 19:53:33 +01:00
renovate[bot]
6cb7fca3ab
chore(deps): update all non-major dependencies (#2234)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-31 19:48:59 +01:00
Daniel Roe
3375563e64 fix: augment vueCompilerOptions in pkg-types 2023-07-31 17:15:53 +01:00
Liberal dev
832ee35a93
fix(i18n): update Korean localisation (#2275) 2023-07-30 21:39:32 +02:00
TAKAHASHI Shuuji
550540fad0
fix: correct ratio of profile header avatar (#2288) 2023-07-30 21:24:06 +02:00
Alex
e59c2af818
fix: cannot fullscreen due to Permission-Policy (#2281) 2023-07-29 20:45:30 +02:00
TAKAHASHI Shuuji
ee6ee30df1
feat: hide original post area in the edit widget (#2283) 2023-07-29 20:38:13 +02:00
Niklas Wolf
675f5184a0
feat: use configured writing/post language of user from mastodon (#2282) 2023-07-29 14:01:17 +02:00
tzhao11
0a9f2d99d5
feat(i18n): Update zh-CN locale (#2200) 2023-07-29 11:43:18 +02:00
Sma11X
35dcf91a06
feat(i18n): sync zh-CN (#2248) 2023-07-29 11:42:59 +02:00
kernoeb
7876727a41
chore(docs): add notice for notifications on Brave browser (#2260) 2023-07-29 11:02:34 +02:00
Xabi
3c3fad808d
fix(i18n): update eu-ES.json (#2259) 2023-07-29 11:02:09 +02:00
TAKAHASHI Shuuji
357fac4d49
feat: show save failed error messages on the profile config page (#2274) 2023-07-29 10:52:57 +02:00
Duy
f45f51d44b
feat(i18n): Update vi-VN.json (#2278) 2023-07-29 10:31:07 +02:00
Duy
5bbbf14c92
feat(i18n): update vi-VN.json (#2268) 2023-07-26 15:39:35 +02:00
Florian Martinez
0a933614fa
feat: role labels wrap (#2266) 2023-07-25 17:29:54 +02:00
Florian Martinez
22a1388d50
feat: add roles into account header and info (#2265) 2023-07-25 16:43:26 +02:00
TAKAHASHI Shuuji
0719ad0afd
docs: fix image URLs (#2264) 2023-07-25 07:15:07 +01:00
patak
1671dfb617 chore: release v0.10.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-07-24 10:26:17 +02:00
TAKAHASHI Shuuji
b730fab643
fix: prevent the lost of focus on compose icons (#2253) 2023-07-22 19:22:17 +02:00
Francesco
81e1383da5
feat(i18n): Update it-IT locale (#2249) 2023-07-22 14:00:21 +02:00
linjin
cdc43775a6
fix: display background when text is selected (#2222) 2023-07-21 14:55:00 +02:00
Natsu Kagami
2a57c64fa0
fix: only add domain when none was provided (#2225) 2023-07-21 14:52:55 +02:00
Kowlin
8a86282951
fix: Show lock indicator with the correct state (#2226) 2023-07-21 14:50:36 +02:00
Emanuel Pina
da31709677
fix(i18n): Update portuguese from Portugal translation (#2242) 2023-07-21 14:48:12 +02:00
klrtk
b14a8e63c6
fix: Use favorite star icon in notifications when enabled (#2229) 2023-07-21 14:41:43 +02:00
TAKAHASHI Shuuji
cc89692d80
fix(a11y): make the bottom menu button focusable and navigable with a11y label (#2247) 2023-07-21 12:17:32 +02:00
Francesco
5782c326b2
feat(i18n): Update it-IT locale (#2246) 2023-07-21 09:08:49 +02:00
Kevin Pliester
af444391b5
fix(i18n): add missing translations for de-DE (#2241) 2023-07-19 14:40:27 +02:00
Cesar Gomez
9bc44f44a0
feat(i18n): sync report keys into es lang (#2202) 2023-07-19 14:16:06 +02:00
Abel Derderian
f7f4167b06
feat(i18n): Update the fr-FR locale (#2231) 2023-07-17 12:14:31 +02:00
Xabi
8fa9c40e86
fix(i18n): update Basque localisation (#2136) 2023-07-17 10:53:25 +02:00
Xabi
31a4924186
fix(i18n): update Basque localisation (#2230) 2023-07-17 10:52:39 +02:00
Emanuel Pina
a6b9d4a82b
fix(i18n): update portuguese from Portugal translation (#2186) 2023-07-15 15:21:15 +02:00
Florian Martinez
ca897bdd2f
feat: add experimental features descriptions (#2228)
Co-authored-by: patak <matias.capeletto@gmail.com>
2023-07-14 21:01:35 +02:00
Ryan Cao
fa44850686
chore(renovate): ignore node version correctly (#2224) 2023-07-11 16:03:59 +01:00
Natsu Kagami
a6e4da8c41
fix: add domain when querying for user on GoToSocial (#2221) 2023-07-11 13:59:48 +01:00
Daniel Roe
895c1ecd8d chore(docs): bump docus version and remove baseURL 2023-07-11 11:33:28 +01:00
Aaron Ransley
ae35f9d11d
fix: Update command key in keyboard shortcuts modal (#2208) 2023-07-10 11:32:15 +02:00
Joaquín Sánchez
2506c02c39
fix(ui): stop question mark propagation (#2209) 2023-07-10 11:29:42 +02:00
Joaquín Sánchez
a08d9d147c
fix: installed pwa shortcuts (#2205) 2023-07-07 11:56:06 +01:00
Daniel Roe
cb109b49b8 fix: don't redirect to generated path 2023-07-06 21:19:01 +01:00
Daniel Roe
d51303cb8b
chore: update to nuxt v3.6.2 (#2203) 2023-07-06 21:13:25 +01:00
patak
c00354c833 fix: custom emojis 2023-07-06 21:33:01 +02:00
三咲智子 Kevin Deng
1ee0ec68c5
feat: show hint on empty timeline 2023-07-05 14:33:41 +08:00
三咲智子 Kevin Deng
5c1411b3de
chore: fix pwa type 2023-07-04 13:32:22 +08:00
三咲智子 Kevin Deng
2d8ec4ab89
chore: upgrade deps 2023-07-04 13:18:36 +08:00
三咲智子 Kevin Deng
c7e20296a2
chore: remove default npm option 2023-07-04 13:06:17 +08:00
Horváth Bálint
a98ca69382
fix: status card confusion (#2196) 2023-07-03 21:04:16 +02:00
Philip Sorst
886fc89df6
fix(i18n): add missing translations for de-DE (#2194) 2023-07-03 18:34:43 +02:00
三咲智子 Kevin Deng
112502155e
feat: add account share 2023-07-03 15:58:48 +08:00
Guto Carvalho
be446f5433
docs: add bolha.us server to readme (#2191) 2023-07-03 15:46:55 +08:00
Francesco
a9f5e4b5e7
fix(i18n): update it-IT locale (#2178) 2023-07-02 22:13:05 +02:00
Joaquín Sánchez
78b8b441ba
fix(ui): do not show poll expiration if missing (#2176) 2023-07-03 02:12:24 +08:00
三咲智子 Kevin Deng
d52755a153
feat: withdraw follow request
closes #2179
closes #2162
2023-07-03 02:09:30 +08:00
三咲智子 Kevin Deng
d5856b83c6
feat: add locked for account 2023-07-03 01:55:18 +08:00
三咲智子 Kevin Deng
338e203b6f
chore: upgrade devtools 2023-07-03 01:31:09 +08:00
renovate[bot]
026ef988c4
fix(deps): update dependency lru-cache to v10 (#2181)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-02 17:15:53 +00:00
renovate[bot]
5f2dca1979
chore(deps): update devdependencies (#2163)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: 三咲智子 Kevin Deng <sxzz@sxzz.moe>
2023-07-03 01:11:13 +08:00
三咲智子 Kevin Deng
676470bae2
chore: ignore deps 2023-07-03 01:07:55 +08:00
renovate[bot]
e0525e5f55
chore(deps): update dependency vitest to ^0.32.2 (#2097)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-02 16:48:59 +00:00
三咲智子 Kevin Deng
d4ce90a7e8
fix: tsconfig in service worker 2023-07-03 00:41:25 +08:00
三咲智子 Kevin Deng
171f0ec857
refactor: upgrade volar 2023-07-03 00:34:39 +08:00
renovate[bot]
fbf49368c1
chore(deps): update lint (#2180)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: 三咲智子 Kevin Deng <sxzz@sxzz.moe>
2023-07-02 16:26:23 +00:00
三咲智子 Kevin Deng
3f8d68c7f7
chore: fix typo 2023-07-03 00:19:11 +08:00
renovate[bot]
0c6260367e
chore(deps): update pnpm to v8.6.5 (#2188)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-26 22:36:30 +08:00
Joaquín Sánchez
0b5797249f
feat(pwa): include window-controls-overlay in installed pwa logic (#2135) 2023-06-23 21:40:21 +02:00
Joaquín Sánchez
e453a316f7
chore: bump to pwa plugin 0.16.4 (#2159)
Co-authored-by: Daniel Roe <daniel@roe.dev>
2023-06-23 21:39:02 +02:00
Pavel Biryukov
25a5d3fe7b
feat(i18n): Russial localization improvements (#2169)
Co-authored-by: Pavel Biryukov <birksovskiy@proton.me>
2023-06-23 21:37:32 +02:00
Ashwin Agarwal
34aca66fef
feat: Report posts (#2184) 2023-06-23 14:24:10 +02:00
Joaquín Sánchez
5ea09d323f
feat(i18n): add spanish translation for "polls" (#2166) 2023-06-14 16:13:22 +02:00
Francesco
4541486d0d
feat(i18n): Update it-IT locale (#2150) 2023-06-14 15:16:13 +02:00
Horváth Bálint
a94fe1c9d0
feat: media preview modal - better zoom support (#2133) 2023-06-12 20:46:53 +02:00
renovate[bot]
58f3ff6cd6
chore(deps): update pnpm to v8.6.2 (#2164)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-12 22:14:25 +08:00
Vince Chu
fbc779d174
chore: Add elk.mstdn.ca to README.md (#2154) 2023-06-08 19:01:59 +00:00
Eddie Coldrick
7c1873c4e3
chore: Add MastodonAppUK to README (#2157) 2023-06-08 20:59:02 +02:00
Daniel Roe
123cf13145
chore: copy across .npmrc to docker build (#2152) 2023-06-08 10:53:33 +01:00
renovate[bot]
58053d0b53
fix(deps): update dependency @vueuse/motion to v2.0.0 (#2131)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-08 05:26:48 +08:00
renovate[bot]
68d0d55532
chore(deps): update lint (#2144)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-08 05:24:22 +08:00
renovate[bot]
b6304ab18c
chore(deps): update pnpm to v8.6.1 (#2098)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-08 05:24:03 +08:00
Eddie Coldrick
e996e53a64
chore: add elkmeuk to README (#2149) 2023-06-07 15:01:15 +02:00
Joaquín Sánchez
f15150c40d
docs: typo in the sharp-ico repository link (#2142) 2023-06-03 12:25:08 +01:00
Joaquín Sánchez
01486c2aef
chore: bump to vite-plugin-pwa 0.16.0 (#2141) 2023-06-01 08:11:11 +01:00
Ryan Cao
5ad32c9e26
fix: handle hidden followers/following count (#2120) 2023-05-31 17:59:54 +02:00
Laura Langdon
2b1a5072d7
docs: add alt text instructions (#2139) 2023-05-31 15:41:23 +02:00
Joaquín Sánchez
c6c4d52556
fix(pwa): pwa icons in dev and build (#2137) 2023-05-30 19:38:24 +02:00
Joaquín Sánchez
d601a117c0
chore: add generate pwa icons script (#2130) 2023-05-29 16:52:27 +02:00
renovate[bot]
0767df3f78
chore(deps): update devdependencies (#2084)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-29 14:45:10 +02:00
renovate[bot]
670a4ef632
chore(deps): update lint (#2085)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-29 14:44:08 +02:00
Daniel Roe
0633c09726
chore: bump to nuxt v3.5.2 (#2134) 2023-05-29 14:26:01 +02:00
Daniel Roe
d535ae6ee1 fix: work around volar parsing issue 2023-05-29 13:46:45 +02:00
Daniel Roe
209013af09 fix: re-key paginator slots 2023-05-29 13:42:18 +02:00
Xabi
dfa0e5f300
fix(i18n): update eu-ES.json (#2129) 2023-05-29 10:26:55 +02:00
Daniel Roe
897968027c
chore: upgrade to nuxt v3.5 and vue v3.3 (#2132) 2023-05-29 15:16:34 +08:00
Joaquín Sánchez
ad0725e9ae
fix(ui): hidden pwa badge and install prompt (#2127) 2023-05-26 15:25:11 +02:00
Paulina3xz
4a167c5bf5
feat(i18n): Added all missing Polish translations + translation fixes (#2082) 2023-05-22 17:31:46 +02:00
Duy
4c0c6f1325
feat(i18n): Update vi-VN.json (#2121) 2023-05-22 17:31:21 +02:00
Duy
dff36d5c43
feat(i18n): Add Vietnamese locale (#2116)
Co-authored-by: userquin <userquin@gmail.com>
2023-05-22 14:33:30 +02:00
Emanuel Pina
a50f97e5f3
fix(i18n): update portuguese from Portugal translation (#2118) 2023-05-22 10:37:59 +02:00
Tuur Martens
9c9a1f7c35
fix: poll would sometimes remove last entry (#2117) 2023-05-21 21:57:29 +02:00
Joshix-1
e251a8a50b
chore: publish docker images on forks (#2106) 2023-05-21 17:29:29 +01:00
Joaquín Sánchez
dfb5a665f0
feat(pwa): add screenshots and orientation to webmanifest (#2109) 2023-05-21 17:28:28 +01:00
Tuur Martens
22556984fa
feat: adhere to and display poll limits (#2114) 2023-05-21 13:37:33 +02:00
Tuur Martens
1fda33848e
feat: poll creation (#2111) 2023-05-20 21:23:41 +02:00
Arash
d9add9f670
fix(i18n): update tr-TR translations (#2108) 2023-05-19 21:04:27 +02:00
patak
49ee431676 chore: release v0.9.7
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-05-16 10:46:03 +02:00
patak
0092c8cbe9 fix: force using username@server settings if present 2023-05-16 10:45:22 +02:00
patak
d0a4c51ef5 chore: release v0.9.6
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-05-16 09:45:25 +02:00
patak
52b2d12bf9 fix: tweak sidebar max-height 2023-05-16 09:38:25 +02:00
Cesar Gomez
5e5fb0e287
chore(i18n): little es translated word change for no_bookmarks and no_fa… (#2101) 2023-05-16 08:48:59 +02:00
Francesco
886488a3c9
feat(i18n): Update it-IT locale (#2100) 2023-05-16 08:48:13 +02:00
Joaquín Sánchez
69f9004917
feat(docs): allow edit any locale file (#2099) 2023-05-15 14:35:43 +02:00
patak
f635e0a634 fix: personal notes on loading 2023-05-15 09:26:55 +02:00
patak
29f6a73de1
fix: user acct not respecting domain (#2088) 2023-05-10 13:19:50 +01:00
Elan Hasson
f28c90498b
docs: Update README.md to fix typo (#2087) 2023-05-10 12:29:48 +01:00
Joaquín Sánchez
66484bac80
fix(ui): check empty spoiler text (#2092) 2023-05-10 11:28:48 +00:00
Joaquín Sánchez
99077da1bf
fix(ui): handle empty spoiler text (#2091) 2023-05-10 13:17:58 +02:00
patak
fc97e8ff5b fix: pasting emojis 2023-05-08 21:10:52 +02:00
patak
9d3c7ef116
feat: review compose buttons (#2076) 2023-05-08 08:45:27 +02:00
patak
e9740fe693
feat: separate search and explore (#2075)
Co-authored-by: TAKAHASHI Shuuji <shuuji3@gmail.com>
2023-05-07 17:41:18 +02:00
Francesco
1fbd88c826
feat(i18n): Update it-IT locale (#2080) 2023-05-07 17:00:36 +02:00
Emanuel Pina
d3cdadd444
fix(i18n): update portuguese from Portugal translation (#2077) 2023-05-07 07:57:46 +02:00
TAKAHASHI Shuuji
582a9847a1
feat: add 'use star favorite icon' preference (#2067) 2023-05-06 17:52:33 +02:00
patak
126cd4d535
feat: search back to the right (#2071) 2023-05-06 17:49:15 +02:00
Bram Van der Sype
c9265028d2
fix(i18n): Updated nl-NL.json (#2054) 2023-05-06 17:47:23 +02:00
DoceAzedo
77717c960c
feat(i18n): add Brazilian Portuguese locale (#2073)
Co-authored-by: userquin <userquin@gmail.com>
Co-authored-by: emanuelpina <emanuelpina@users.noreply.github.com>
2023-05-06 17:45:42 +02:00
Ayo Ayco
454ad18f1b
fix: regression with media hidden (#2072) 2023-05-06 11:26:16 +02:00
Abel Derderian
4be5d81f17
feat(i18n): Update fr-FR locale (#2060) 2023-05-06 08:57:42 +02:00
patak
5ffb96baf6 chore: release v0.9.5
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-05-05 19:36:06 +02:00
Natsu Kagami
1487932c1d
fix: Handle failure when fetching user preferences (#2069) 2023-05-05 19:34:43 +02:00
Ayo Ayco
d9e7a09d24
feat: respect Media Display preferences (#2065) 2023-05-05 18:12:07 +02:00
TAKAHASHI Shuuji
a3116e703a
feat(i18n): update Japanese localization (#2061) 2023-05-05 17:40:09 +02:00
Francesco
8dd29039cd
feat(i18n): Update it-IT locale (#2055) 2023-05-05 16:13:34 +02:00
enpitsulin
0034b22da4
fix: image preview should justify-center (#2062) 2023-05-05 10:22:41 +02:00
patak
eebe57840b chore: release v0.9.4
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-05-04 22:58:24 +02:00
patak
d59cdb0aa4 fix: extra spacing when no media in posts 2023-05-04 22:49:12 +02:00
patak
16561845f8 fix: respect always expand content warnings 2023-05-04 22:29:47 +02:00
patak
e9de11000b fix: new compose button opens compose route 2023-05-04 21:09:23 +02:00
Nikita Karamov
c6c844f3fd
fix: notification templates for admin reports (#2045)
Co-authored-by: patak <matias.capeletto@gmail.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2023-05-03 15:01:35 +00:00
patak
fb61891c29 chore: release v0.9.3
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-05-03 09:51:13 +02:00
patak
94323c8fe1 fix: personal note flash on profile
Fixes #2053
2023-05-03 09:25:08 +02:00
patak
f1f5a96929 chore: release v0.9.2
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-05-02 17:55:39 +02:00
patak
df0c30c2f2 fix: account for width on sidebar media queries 2023-05-02 17:44:34 +02:00
patak
68f2c3fc5b chore: release v0.9.1
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-05-02 14:15:55 +02:00
patak
d0ede35e89 fix: respect zenMode preference default 2023-05-02 14:13:53 +02:00
patak
c54aed62fb chore: release v0.9.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-05-02 13:42:22 +02:00
renovate[bot]
5adc5eecf1
chore(deps): update devdependencies (#1944)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-02 11:11:22 +01:00
renovate[bot]
4c1e37caa2
chore(deps): update lint (#2011)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Daniel Roe <daniel@roe.dev>
2023-05-02 11:03:49 +01:00
Daniel Roe
847de1b39b chore: ignore vue and vue-tsc dependencies for now 2023-05-02 10:59:44 +01:00
Daniel Roe
0a98c5f13d
chore: upgrade to nuxt v3.4.3 (#2046) 2023-05-02 11:48:33 +02:00
Shinigami
835269fa1d
chore(deps): replace esno with tsx (#1966) 2023-05-02 02:04:12 +02:00
Anthony Fu
61526df93f chore: upgrade to VueUse v10 2023-05-02 01:58:55 +02:00
Shinigami
076c47b7b0
feat: prefer en language as top (#2042) 2023-05-01 19:30:57 +02:00
Emanuel Pina
98777f078c
fix(i18n): Update portuguese from Portugal translation (#2044) 2023-05-01 19:29:30 +02:00
patak
dcf0f93eb9
feat: compose button (#2037) 2023-05-01 18:08:09 +02:00
patak
656b789e7c
feat: height responsive sidebar (#2038) 2023-05-01 17:58:37 +02:00
Francesco
70cb620ccd
feat(i18n): Update it-IT locale (#2041) 2023-05-01 17:34:50 +02:00
Phojie Rengel
3c3324f070
feat(i18n): add Tagalog translation (#2019)
Co-authored-by: Ayo Ayco <ayo@ayco.io>
2023-05-01 11:55:49 +02:00
patak
f3e1b6db67 fix: empty glass header on large screens 2023-04-30 21:46:07 +02:00
patak
d4e0d5c5f5
feat: better messages for no favourites and bookmarks (#2031) 2023-04-30 17:49:33 +02:00
Alex
ccf115ca4c
fix: refresh status after edit (#2032) 2023-04-30 17:19:14 +02:00
patak
c7b77216c1 fix: long title and description for expansion not showing
Fixes #1948
2023-04-29 22:57:26 +02:00
patak
8b8de1182c fix: avoid flash of connected line while loading avatars 2023-04-29 21:53:41 +02:00
Mark Pinero
99dc8a0479
fix(default): update layout to use dynamic vh (#1817) 2023-04-28 19:44:58 +02:00
renovate[bot]
28a68f47eb
fix(deps): update tiptap to v2.0.3 (#1987) 2023-04-28 19:38:22 +02:00
Emanuel Pina
9cc4c23e50
fix(i18n): update portuguese from Portugal translation (#2009) 2023-04-28 19:34:35 +02:00
renovate[bot]
2b42f225dd
chore(deps): update pnpm to v8.3.1 (#2012) 2023-04-28 19:34:04 +02:00
Christof Dorner
320ed81555
fix: detect Takahe hashtags correctly (#2024) 2023-04-28 19:33:34 +02:00
Alex
5bd17d3006
docs: fix contributing_guide link (#2029) 2023-04-28 09:21:19 +01:00
Phojie Rengel
5dc136372b
refactor: button creation with v-for to remove redundancy (#2020) 2023-04-28 09:42:23 +02:00
Alex
5c3b8be055
feat: add wellbeing preference hide news (#2026) 2023-04-28 09:38:44 +02:00
Alex
cbba846c4f
fix: translation button still display when posts have no contents (#2027) 2023-04-28 09:36:05 +02:00
Alex
574d72af61
fix: reply remove-and-re-draft error (#2028) 2023-04-28 11:25:53 +08:00
Peter Budai
a0d036952d
feat(editor): Respect default privacy setting of the account (2nd) (#1733)
Co-authored-by: patak <matias.capeletto@gmail.com>
2023-04-27 20:41:10 +00:00
Shinigami
23c1dfec10
feat: lazy load images (#1969) 2023-04-26 22:46:00 +02:00
Phojie Rengel
1ceb3e2857
docs: update translation guide file to copy (#2017) 2023-04-25 17:41:51 +02:00
Francesco
3f1cdbbfa9
feat(i18n): Update it-IT locale (#2015) 2023-04-24 21:00:56 +02:00
Joaquín Sánchez
59e418e2e0
fix: content render receiving undefined when converting to vnode (#2016) 2023-04-24 20:46:17 +02:00
manuq
ac4188274c
feat(ui): add clear button to search input field (#1989)
Co-authored-by: patak <matias.capeletto@gmail.com>
2023-04-24 17:05:26 +02:00
Francesco
450908ecb2
feat(i18n): Update it-IT locale (#2014) 2023-04-24 16:50:37 +02:00
Francesco
85260e8aaa
feat(i18n): Update it-IT locale (#2008) 2023-04-24 13:42:54 +02:00
patak
b2c1a4ddef
fix: emoji sizing (#2007) 2023-04-24 07:19:29 +02:00
Peter Budai
85ac040c2f
fix: Re-enable user card hover over mentions in posts (#1745) 2023-04-23 21:40:55 +02:00
Alec LeFors
94d22fd488
fix: Allow account handles to wrap in AccountHeader (#1991) 2023-04-23 21:35:01 +02:00
Daniel Roe
5b1ad44875
chore: bump nuxt to v3.4.2 (#1998) 2023-04-23 21:27:52 +02:00
Francesco
21f57f1cfa
feat(i18n): Add Italian Localisation (#2005)
Co-authored-by: Joaquín Sánchez <userquin@gmail.com>
2023-04-23 20:10:24 +02:00
Joaquín Sánchez
6727e63626
feat(i18n): Update Spanish translations (#2006) 2023-04-23 17:03:37 +02:00
Joaquín Sánchez
54e2afa56b
feat(ui): use sticky position on settings mid panel (#2004) 2023-04-23 14:21:54 +02:00
manuq
56405f52bb
fix: Add zen mode to preferences, remove shortcut (#2003) 2023-04-23 12:21:33 +02:00
patak
9564985a4e
fix: unicode emojis when editing (#2002) 2023-04-22 19:12:17 +02:00
Xabi
aa77919925
fix(i18n): update Basque localisation (#2001) 2023-04-22 15:45:08 +02:00
JP
1eb47b98f5
fix(i18n): update Arabic localisation (#1993) 2023-04-22 14:36:41 +02:00
Liberal dev
acb2b80cdd
fix(i18n): update Korean localisation (#1996) 2023-04-22 14:35:39 +02:00
Tuur Martens
dbbbe8aa01
feat: improve personal notes (#1978) 2023-04-22 12:41:27 +02:00
patak
bda18e7ac5 chore: use "boosted" instead of "reblogged" 2023-04-21 21:38:45 +02:00
patak
ce149e4cb4 fix: notification with null status should be excluded
Fixes #1995
2023-04-21 21:35:39 +02:00
patak
6f19d54586 chore: release v0.8.1
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-04-21 15:15:40 +02:00
Daniel Roe
6fc6517811 chore: fix lockfile 2023-04-20 12:16:49 +01:00
Daniel Roe
58a7f15216 chore: bump nuxt-vitest version 2023-04-20 12:15:12 +01:00
patak
ea44f8bc30 fix: allow custom emojis on profile metadata field names
Fixes #1992
2023-04-19 21:32:07 +02:00
patak
d34a5e6e96 chore: fix titleTemplate param type 2023-04-16 22:35:25 +02:00
patak
1f559fae08 fix: use @unhead/vue 2023-04-16 22:33:22 +02:00
Kingsley Yung
ca8d785d9e
feat: allow user to view follow list in "Hide following/follower count" mode (#1901) 2023-04-16 21:47:20 +02:00
Liberal dev
18ea4ffb6e
feat(i18n): add Korean translation (#1968) 2023-04-16 21:42:32 +02:00
Joaquín Sánchez
f07d32375a
fix: saving profile data breaks cache (#1937) 2023-04-16 21:39:33 +02:00
Joaquín Sánchez
c71259334c
fix: remove flashing text on page reload (#1939) 2023-04-16 21:33:51 +02:00
patak
13581323b0 chore: fix lint 2023-04-16 21:25:55 +02:00
Emanuel Pina
587f73c4a0
fix(i18n): update portuguese from Portugal translation (#1984) 2023-04-16 20:36:35 +02:00
Ivan Demchuk
2267556b8b
chore: add a script to cleanup old translations (#1963) 2023-04-16 14:28:45 +02:00
Emanuel Pina
dac044e6ad
fix(i18n): update portuguese from Portugal translation (#1975) 2023-04-16 14:27:59 +02:00
Shinigami
3442dfe75d
feat: hide status from suspended account (#1967) 2023-04-16 14:22:03 +02:00
Glaydus
ce5e81e160
fix(i18n): update Polish translations (#1982) 2023-04-16 14:17:31 +02:00
Cesar Gomez
621d280a96
feat(i18n): sync es base lang (#1979) 2023-04-15 18:57:52 +02:00
Daniel Roe
fb1ca7d8f1
fix: use purpose: any for normal pwa icon (#1981) 2023-04-15 17:16:20 +01:00
Anthony Fu
189d358b2a
chore: update all deps (#1976) 2023-04-12 14:35:35 +02:00
renovate[bot]
3acf87d5b6
chore(deps): update lint (#1971)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Shinigami92 <chrissi92@hotmail.de>
2023-04-11 08:04:22 -07:00
renovate[bot]
d33ac87c64
fix(deps): update dependency @unocss/nuxt to ^0.51.0 (#1973)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-11 07:03:27 -07:00
renovate[bot]
a037583631
chore(deps): update dependency vitest to ^0.30.1 (#1972)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-11 07:03:20 -07:00
renovate[bot]
d6e199b83a
chore(deps): update pnpm to v8 (#1970)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-11 06:44:14 -07:00
Tuur Martens
79538a65ee
fix: wrong profile showing on hover sometimes (#1913) (#1964) 2023-04-10 20:12:27 +02:00
Tuur Martens
2dc7ad27bf
feat: personal notes (#1960) 2023-04-09 21:11:37 +02:00
renovate[bot]
921eaae949
fix(deps): update tiptap to v2.0.2 (#1524)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-03 22:23:45 +02:00
Alex
2f79f53877
feat(i18n): sync zh-CN with en (#1865) 2023-04-03 15:34:59 +02:00
renovate[bot]
973805f16d
chore(deps): update dependency typescript to ^5.0.3 (#1945)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-03 15:34:33 +02:00
Joaquín Sánchez
685b16d403
chore: change pwa module name (#1947) 2023-04-03 15:34:19 +02:00
Joaquín Sánchez
ab2881b9a2
refactor: remove useHeadFixed workaround (#1938)
Co-authored-by: Ayaka Rizumu <464388324@qq.com>
2023-04-01 04:14:12 -07:00
Daniel Roe
60a37e0bf8 chore: update devtools 2023-03-31 11:50:34 +01:00
ghose
da94117f61
feat(i18n): Update Gaician translation (#1934) 2023-03-30 22:11:00 +02:00
三咲智子 Kevin Deng
605359b9df
chore: release v0.8.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-03-31 03:21:30 +08:00
三咲智子 Kevin Deng
c513907dbb
chore(deps): upgrade tiptap 2023-03-31 03:16:51 +08:00
renovate[bot]
4cc0101a06
chore(deps): update devdependencies (#1927)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-30 19:13:27 +00:00
三咲智子 Kevin Deng
f4f6208420
refactor: remove unused function 2023-03-31 03:07:49 +08:00
renovate[bot]
3c43a1cdd1
chore(deps): update lint (#1928)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: 三咲智子 Kevin Deng <sxzz@sxzz.moe>
2023-03-30 19:01:24 +00:00
renovate[bot]
2838e18ff7
chore(deps): update dependency typescript to v5 (#1930)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-31 02:58:04 +08:00
renovate[bot]
da2ac06d8a
chore(deps): update pnpm to v7.30.5 (#1929) 2023-03-27 20:18:22 +02:00
Baptiste Girardeau
881a49e0d9
fix: syntax for robots.txt disallow rules (#1925) 2023-03-26 17:11:22 +02:00
Daniel Roe
e062fb5e52
perf: set maxAge for various public assets (#1916) 2023-03-26 16:53:07 +02:00
renovate[bot]
a1026d3aab
fix(deps): update dependencies (#1908)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: 三咲智子 Kevin Deng <sxzz@sxzz.moe>
2023-03-24 00:12:42 +00:00
renovate[bot]
42dc99929e
chore(deps): update devdependencies (#1736)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 08:02:15 +08:00
三咲智子 Kevin Deng
0916b05afd
refactor(docs): replace palette function 2023-03-24 07:51:30 +08:00
三咲智子 Kevin Deng
331d652ef0
fix(docs): remove npm lock file 2023-03-24 07:46:22 +08:00
renovate[bot]
e9ddf3e6a0
chore(deps): update docker/build-push-action action to v4 (#1919)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 07:40:30 +08:00
renovate[bot]
5dd3a52865
chore(deps): update dependency vitest to ^0.29.7 (#1918)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-24 07:39:03 +08:00
renovate[bot]
a82558130a
chore(deps): update dependency prettier to ^2.8.5 (#1917)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-23 23:35:22 +00:00
三咲智子 Kevin Deng
b51bae5361
ci: disable nuxt tests temporally 2023-03-24 06:39:21 +08:00
Eddie Coldrick
c94ff39982
style: Change logo files with added left/right padding (#1896) 2023-03-21 12:59:24 +01:00
Kevin
5717e5e677
chore(deps): upgrade nuxt 2023-03-21 12:20:36 +08:00
Joaquín Sánchez
0dbea5915f
docs(fix): pwa plugin link (#1915) 2023-03-20 17:49:39 +00:00
tarquinwj
f533a10097
docs: VAPID protocol information is wrong (#1914) 2023-03-20 18:11:24 +01:00
Kevin
c0561e7eed
chore: upgrade vue-tsc 2023-03-20 23:45:02 +08:00
Kevin
0418d05753
refactor(list): improve form 2023-03-20 23:43:13 +08:00
Kevin
01d1a30413
chore: upgrade deps 2023-03-20 23:11:04 +08:00
Kevin
55e0f040a3
chore: switch full iconify package 2023-03-20 22:56:35 +08:00
renovate[bot]
60924e5f5d
chore(deps): update all non-major dependencies (#1735)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-20 22:44:07 +08:00
Kevin
776594ec3d
chore: ignore upgrading node dep 2023-03-20 22:37:45 +08:00
renovate[bot]
189695c767
chore(deps): update dependency bumpp to v9 (#1909)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-20 22:32:37 +08:00
Anthony Fu
791642fac4 fix: replying-to padding 2023-03-19 23:36:09 +01:00
Anthony Fu
5dd3f4bfa3
feat: simplify notifications (#1905) 2023-03-19 21:55:19 +01:00
Cesar Gomez
a25376b60d
feat(i18n): es base sync (#1884) 2023-03-19 18:38:12 +01:00
forenta
eea2511e1d
fix(i18n): de-DE: Small update (#1907) 2023-03-19 18:04:47 +01:00
kongmoumou
01ed4f68dc
fix: sticky hover style on mobile (#1513)
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
2023-03-19 12:24:27 +00:00
renovate[bot]
6abd2a8770
chore(deps): update lint (#1887)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-19 12:16:44 +00:00
Anthony Fu
9465c2fe89 chore: update lint 2023-03-19 13:12:20 +01:00
Kingsley Yung
c7558ee7c5
feat: Include following count in hide follower count setting (#1897) 2023-03-16 21:14:06 +01:00
Xabi
8c7dc5a6df
fix(i18n): update Basque localisation (#1899) 2023-03-16 21:09:42 +01:00
WhiskeyOmega
ae268de5bf
chore: update ecosytem link (#1900) 2023-03-16 20:23:31 +01:00
renovate[bot]
05f3f04578
chore(deps): update dependency vitest to ^0.29.3 (#1886) 2023-03-16 09:16:32 +01:00
Francis Gulotta
dc397e133c
docs: add mastodon link to header (#1885) 2023-03-13 11:32:54 +01:00
patak
3732a2cc16
fix: copy and paste custom-emoji (#1873) 2023-03-09 11:18:03 +00:00
Vjacheslav Trushkin
fa3cfd6059
fix: get custom emoji id from title attribute (#1871) 2023-03-08 21:19:53 +01:00
patak
c76e8e8f5e chore: release v0.7.5
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-03-08 14:54:01 +01:00
Zaidhaan
9589bbae3a
fix(a11y): add aria labels to bottom navigation links (#1867) 2023-03-08 14:07:02 +01:00
Emanuel Pina
ecd17c6709
fix(i18n): Update portuguese from Portugal translation (#1868) 2023-03-08 14:04:04 +01:00
patak
0f477236ac fix: remove extra top margin from notifications 2023-03-07 21:43:23 +01:00
patak
82d6b2ad29 fix: avoid single metadata icon on last line 2023-03-07 21:02:00 +01:00
Hartmut
c4d8137186
feat: basic keyboard shortcuts (#319) 2023-03-07 20:32:21 +01:00
Zaidhaan
69c1bd8b6a
fix: wrap non-sensitive spoilers in spoiler status (#1864) 2023-03-07 19:41:00 +01:00
Zaidhaan
bc09a28af6
fix: render replies to fill the screen height (#1859) 2023-03-06 19:58:22 +01:00
Zaidhaan
cb0b7b58bb
fix: disallow media description exceeding limits (#1854) 2023-03-06 14:12:31 +01:00
Nicolò Ribaudo
8fd697126b
feat: add metadata icon for Matrix (#1860) 2023-03-06 13:45:14 +01:00
Daryl White
b72809c048
docs: Add content for feature page (#1853) 2023-03-05 09:51:13 +00:00
TAKAHASHI Shuuji
73a8e4f545
feat(i18n): update Japanese localization (#1850) 2023-03-04 14:35:37 +01:00
Zaidhaan
cd6d328266
fix: only use username part of mention (#1843) 2023-03-02 21:07:28 +01:00
Zaidhaan
dbfb450e23
fix: allow parsing codeblocks with multiple text nodes in children (#1842) 2023-03-02 15:27:32 +01:00
Jorge Caballero
f3ad179c69
docs: Add elk.fedified.com to ecosystem list (#1837) 2023-03-01 08:18:13 +01:00
Falko Zurell
4d88c79019
fix: extended docker-compose.yml to addres Bug #1696 (#1701) 2023-03-01 08:17:34 +01:00
Glaydus
b7ebf31bd9
feat(i18n): include missing Polish translations (#1820) 2023-02-28 23:12:14 +01:00
Basil
1445a57d8d
feat: copy content warning when replying (#1672) 2023-02-28 23:10:04 +01:00
Nathan Knowler
ddb765c4a2
fix(ui): make nav links unselectable on mobile (#1691) 2023-02-28 23:01:31 +01:00
Zaidhaan
32eaee82e2
fix: resize large images attachments on upload (#1824) 2023-02-28 22:58:19 +01:00
Zaidhaan
2842a5f383
fix: avoid bar width division by zero (#1826) 2023-02-28 22:44:15 +01:00
Carles Barreda
a5cece7b42
feat(i18n): Remove outdated keys for catala and valencia (#1827) 2023-02-28 22:42:55 +01:00
Joaquín Sánchez
baba3faa34
feat(i18n): ca-valencia language detection in Edge browser (#1828) 2023-02-28 22:36:05 +01:00
Jan van den Berg
2ccec5e09c
fix(i18n): Update nl-NL.json (#1229)
Co-authored-by: Joran Quinten <joran@joranquinten.nl>
2023-02-25 22:27:21 +01:00
Carles Barreda
1356f86b54
feat(i18n): add catalan and valencian translations (#1823) 2023-02-25 22:24:03 +01:00
gummipunkt
5259f6940f
fix(i18n): update de-DE locale (#1575)
Co-authored-by: gummipunkt <patti2012@gmail.com>
Co-authored-by: Shinigami <chrissi92@hotmail.de>
2023-02-25 14:24:52 +01:00
Valtteri Laitinen
5edf713bcc
fix(i18n): use American spelling (#1751) 2023-02-25 12:10:53 +01:00
Roni Laukkarinen
981d777682
fix: Custom-emoji size on editor revisited (#1799) 2023-02-25 12:10:03 +01:00
Xabi
9e455499b9
fix(i18n): update Basque localisation (#1807) 2023-02-25 12:09:41 +01:00
Joaquín Sánchez
3596d8bec3
fix: handle frozen state (#1792) 2023-02-25 12:09:24 +01:00
Zaidhaan
d810b2de3a
fix: do not overwrite status drafts (#1822) 2023-02-24 23:34:17 +01:00
Zaidhaan
8c783204d3
fix: display correct percentages for multiple choice polls (#1821) 2023-02-24 21:39:45 +01:00
Cristiano Verondini
958f5967b9
fix: unswap uid/gid in dockerfile (#1810) 2023-02-23 05:27:50 -08:00
三咲智子 Kevin Deng
bcf0965795
refactor: get short commit 2023-02-23 19:17:28 +08:00
Zaidhaan
f98c667613
fix: properly parse bolded italics (#1808) 2023-02-23 08:13:39 +01:00
patak
29b37e67c7
docs: fix typos in readme (#1805) 2023-02-20 15:42:25 +01:00
Emanuel Pina
015d8a944e
fix(i18n): update portuguese from Portugal translation (#1788) 2023-02-20 07:06:01 +01:00
Joaquín Sánchez
41175b02ca
feat(i18n): include missing Spanish translations (#1785) 2023-02-18 17:07:48 +01:00
Xabi
75ca138c6e
feat(i18n): add Euskara/Basque localisation (#1779) 2023-02-18 16:40:28 +01:00
Joaquín Sánchez
aeba239964
fix: installing deps on main error (#1790) 2023-02-18 13:44:28 +01:00
Joaquín Sánchez
fb01c467cb
docs(pwa): typo in Other browsers on iOS entry (#1783) 2023-02-18 13:01:17 +01:00
Michel EDIGHOFFER
6b649df218
chore(i18n): en as source language (#1597) 2023-02-18 12:21:09 +01:00
Anthony Fu
2a06cf26d8 chore: upgrade nuxt devtools 2023-02-18 10:57:09 +01:00
TAKAHASHI Shuuji
3ad0abce3b
feat(i18n): update Japanese localization (#1775)
Co-authored-by: kazuya kawaguchi <kawakazu80@gmail.com>
2023-02-18 08:31:14 +01:00
Kingsley Yung
1be6a8c6ec
fix: update masto.js to 5.9.2 (#1786) 2023-02-18 08:30:24 +01:00
Horváth Bálint
ff070ea9da
fix: better loading handling on status page (#1729)
Co-authored-by: Michel EDIGHOFFER <edimitchel@gmail.com>
2023-02-17 23:11:35 +01:00
Daryl White
76efc724eb
docs: Readme.md for docs and guide/index additions (#1773) 2023-02-17 17:32:45 +01:00
三咲智子 Kevin Deng
b7e565dedc
refactor: specific package manager for stale-dep 2023-02-17 15:30:23 +01:00
三咲智子 Kevin Deng
acf719775f
refactor: upgrade stale-dep 2023-02-17 15:17:47 +01:00
Santiago García Pimentel
1003a2a898
fix: Spanish translation for request to follow is incorrect (#1766) 2023-02-17 12:19:01 +01:00
Joaquín Sánchez
6f96c732f7
feat(pwa): add FAQ to PWA docs and link on push subscription error (#1767)
Co-authored-by: Michel EDIGHOFFER <edimitchel@gmail.com>
2023-02-17 12:11:19 +01:00
Emanuel Pina
aa8f8ddd79
fix(i18n): update portuguese from Portugal translation (#1768) 2023-02-17 12:10:10 +01:00
Michel EDIGHOFFER
4cc213c5b1
feat: french translations (#1771) 2023-02-17 11:41:35 +01:00
Alex
3ff39fb79f
feat(i18n): sync zh-CN translations (#1741)
Co-authored-by: Chris <1633711653@qq.com>
2023-02-17 11:06:04 +01:00
Horváth Bálint
b1dbd22cd4
docs: docs/pwa improvements (#1762)
Co-authored-by: Joaquín Sánchez <userquin@gmail.com>
2023-02-16 14:18:34 +01:00
Daniel Roe
436489461c
refactor: inject pwa client plugin from module (#1758) 2023-02-16 10:23:26 +01:00
yheuhtozr
523578ba7b
fix(ui): unintentionally hardcoded word order of status.replying_to (#1744) 2023-02-15 20:21:08 +01:00
Chee Aun
769b84867a
fix: limit pinch scale to minimum 0.5 (#1740) 2023-02-15 20:20:10 +01:00
Emanuel Pina
33a53de8d7
fix(i18n): update portuguese from Portugal translation (#1754) 2023-02-15 20:18:28 +01:00
Joaquín Sánchez
24eb181d6d
docs(i18n): include translation status in contributing guide (#1734)
Co-authored-by: Michel EDIGHOFFER <edimitchel@gmail.com>
2023-02-15 20:17:48 +01:00
Cesar Gomez
0fdbb17591
feat(i18n): Emojimart localization and fetching entry at en … (#1731)
Co-authored-by: userquin <userquin@gmail.com>
2023-02-15 20:15:11 +01:00
Joaquín Sánchez
3118ed6012
docs: add PWA cookbook (#1747)
Co-authored-by: Michel EDIGHOFFER <edimitchel@gmail.com>
2023-02-15 13:07:30 +01:00
Tuur Martens
fbe1463f17
feat: data saving mode (#1638) 2023-02-15 10:34:23 +00:00
Tuur Martens
52fbb70a08
fix(MainContent): disallow markdown usage in username (#1618) 2023-02-15 11:21:33 +01:00
baptiste0928
f73019c1fd
fix: return redirect for whatsapp user agent (#1753) 2023-02-15 02:13:43 -08:00
Michel EDIGHOFFER
ef680ab8b3
fix: remove alone vertical bar on start (#1687) 2023-02-14 14:42:53 +00:00
Joaquín Sánchez
1153421915
fix: prepare translations status on codeflow fails (#1749) 2023-02-14 13:59:21 +00:00
moshyfawn
f091e06d19
fix: remove bot icon auto focus (#1708) 2023-02-13 22:51:45 +01:00
Chris
271c78fdbb
fix(ui): fix button width shrinked (#1742) 2023-02-13 20:21:45 +01:00
Benben Weng
379f56795d
feat(i18n): add zh-TW translation (#1628)
Co-authored-by: Alex Liu <39984251+Mini-ghost@users.noreply.github.com>
2023-02-13 20:08:07 +01:00
patak
635d55befb
chore: add code of conduct (#1743) 2023-02-13 02:11:06 -08:00
Emanuel Pina
171963ae25
fix(i18n): update portuguese from Portugal translation (#1732) 2023-02-12 21:47:09 +01:00
patak
a3cc2cecfd chore: release v0.7.4
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-02-12 20:27:57 +01:00
Glaydus
f295ddbcd2
feat(i18n): add missing Polish (and English) translation entries (#1669) 2023-02-12 17:59:07 +01:00
Joaquín Sánchez
da7cc78a7e
fix: revert #1699 (#1730) 2023-02-12 16:15:29 +01:00
Daniel Roe
54f020b165 fix: use nitro publicAssets to emit manifests 2023-02-12 15:49:20 +01:00
Daniel Roe
37036b4ca6
fix: add badge to bottom bar notifications icon (#1722) 2023-02-12 15:39:05 +01:00
ghose
059c1c7b33
feat(i18n): update gl-ES (#1720)
Co-authored-by: Joaquín Sánchez <userquin@gmail.com>
2023-02-12 14:27:55 +01:00
Emanuel Pina
90c98857ce
fix(i18n): update portuguese from Portugal translation (#1655) 2023-02-12 14:26:28 +01:00
Daniel Roe
788819ac97 chore: release v0.7.3
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-02-12 13:22:36 +01:00
Daniel Roe
898a43b783 fix: update import for tauri 2023-02-12 13:21:57 +01:00
Daniel Roe
d7a95eab3b fix: use callback url with route param rather than query 2023-02-12 13:18:07 +01:00
Joaquín Sánchez
c6f0432d8d
fix(i18n): better login description for single instance server (#1727) 2023-02-12 04:10:14 -08:00
Daniel Roe
79d43515f5
chore: upgrade docs to nuxt 3.2.0 as well (#1728) 2023-02-12 04:09:55 -08:00
Daniel Roe
148fd63c24 refactor: move back to cf unstorage driver 2023-02-12 12:57:56 +01:00
Daniel Roe
efaeb67261
chore: upgrade to nuxt v3.2.0 (#1695) 2023-02-12 03:56:29 -08:00
Daniel Roe
73dc060578 fix: access headers outside of computed 2023-02-12 12:48:58 +01:00
Joaquín Sánchez
b9c2bc5c70
fix(pwa): configure sw and web manifest cache control headers (#1724) 2023-02-12 12:08:50 +01:00
Daniel Roe
c2ffdcf78b fix: only generate sourcemap in development 2023-02-12 11:22:43 +01:00
moshyfawn
a9427e2ea0
fix: default main content dir to ltr (#1710)
Co-authored-by: moshyfawn <oleg.butorov.98@gmail.com>
2023-02-11 21:43:21 +01:00
Joaquín Sánchez
c5fe184281
feat: add translation status to language settings (#1717) 2023-02-11 21:42:55 +01:00
Peter Budai
3e648f6fbc
feat(editor): Respect default privacy setting of the account (#1699) 2023-02-11 18:04:41 +01:00
三咲智子 Kevin Deng
db2892c4c0
refactor: disable reactivity transform from vue core
use the feature from vue macros instead
2023-02-11 17:51:14 +01:00
Joaquín Sánchez
972a13499f
feat(docs): add translation status (#1689)
Co-authored-by: Michel EDIGHOFFER <edimitchel@gmail.com>
2023-02-11 17:15:08 +01:00
TAKAHASHI Shuuji
0eefcfa281
feat(i18n): update Japanese localization (#1697)
Co-authored-by: kazuya kawaguchi <kawakazu80@gmail.com>
2023-02-10 07:50:37 -08:00
Michel EDIGHOFFER
328fd1bf70
fix: add margin on top of search width to make the border visible (#1700) 2023-02-10 10:53:05 +01:00
TAKAHASHI Shuuji
943b5f151d
fix(i18n): tiny fix on "Github" (#1698) 2023-02-10 10:50:39 +01:00
Daniel Roe
9578ed1e5d
fix: revert upgrade to nuxt v3.2.0 (#1692) 2023-02-09 15:32:30 -08:00
Daniel Roe
44c3dd762e
chore: upgrade to nuxt v3.2.0 (#1684) 2023-02-09 09:47:59 -08:00
三咲智子 Kevin Deng
4400818a31
fix: upgrade nuxt schema 2023-02-09 18:24:49 +01:00
Anthony Fu
11eaeeebbe feat: enable devtools 2023-02-09 17:03:18 +01:00
Daniel Roe
acd7010fbc test: disable stale-dep in test mode 2023-02-09 13:01:22 +01:00
Daniel Roe
f04b09a40d
refactor: use server auto-imports (#1675) 2023-02-08 12:00:43 -08:00
Daniel Roe
7da49afde5 refactor: use route rules for prerendering 2023-02-08 18:12:51 +01:00
Daniel Roe
c25715b26d
feat: allow using elk as a nuxt layer (#1665) 2023-02-08 01:51:16 -08:00
Milos Dimitrijevic
a3310b6ea2
chore: add .nvmrc to ensure node v18 (#1579) 2023-02-08 10:23:07 +01:00
三咲智子 Kevin Deng
11d179b13b
refactor: upgrade vue macros 2023-02-08 10:20:58 +01:00
Alexander Harding
36191c500f
fix: prevent videos from clipping when in fullscreen mode (#1397)
Co-authored-by: Tomasz Rymkiewicz <kreha1@pm.me>
2023-02-07 06:32:37 -08:00
Daniel Roe
2128d11238
refactor: move single instance config to runtime (#1664) 2023-02-07 04:10:43 -08:00
Peter Budai
9e09c9072f
fix(ui): Prevent word-wrap on "Replying To" (#1663) 2023-02-07 09:12:30 +01:00
Chris-Robin Ennen
f1087fd270
fix: only count 23 characters per link when composing (#1660) 2023-02-06 15:03:16 -08:00
Joaquín Sánchez
65bbc7c790
fix: close databases on page freeze event without pwa (#1662) 2023-02-06 15:01:30 -08:00
Joaquín Sánchez
32cfe6371f
fix: handle frozen page lifecycle state (#1658) 2023-02-06 14:22:56 -08:00
Joaquín Sánchez
f7a8d471a6
fix: sign-out and empty content (#1654) 2023-02-06 04:16:24 -08:00
Daniel Roe
6e7ac24821
fix: work around hotfix cloudflare kv storage bug (#1650) 2023-02-06 11:03:52 +01:00
Daniel Roe
6dc38c7d8e
perf: tree-shake dependencies from server (#1647) 2023-02-06 10:34:50 +01:00
renovate[bot]
357dff2140
chore(deps): update dependency typescript to ^4.9.5 (#1648)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-05 16:55:11 -08:00
renovate[bot]
4ff2dce87f
chore(deps): update dependency vitest to ^0.28.4 (#1649)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-05 16:47:21 -08:00
Daniel Roe
e31fc4087c fix: transpile masto 2023-02-05 17:44:37 +00:00
Alex Liu
2bd8dc2dd5
fix: character count should includes spoiler text (#1535)
* fix: character count should includes spoiler text

* fix: draft empty conditions exclude spoiler text
2023-02-05 09:36:33 -08:00
Joaquín Sánchez
04c4ff5225
feat(i18n): add missing spanish translation entries (#1635) 2023-02-05 17:11:30 +01:00
victordelva
b7a3e93097
feat: add bold and italic buttons to editor (#1469) 2023-02-05 16:11:09 +00:00
Michel EDIGHOFFER
7380e243c4
fix: make nav title sticky + add more grabbale area for native (#1602) 2023-02-05 16:35:21 +01:00
Niklas Wolf
76bad723ab
feat: prioritize user languages in language picker (#1614) 2023-02-05 07:14:26 -08:00
Kingsley Yung
297b104e1c
fix: repeated content on reblog without comment (re-open) (#1627) 2023-02-05 07:12:49 -08:00
Ayo Ayco
0fbe34c1e8
fix: filter and cw logic (#1633) 2023-02-05 07:05:42 -08:00
Tuur Martens
a1b2da3d5e
feat: adjust hide username emojis pref to only hide in timeline (#1631) 2023-02-05 14:00:25 +01:00
Daniel Roe
7dfe91bb9d docs: mention SINGLE_INSTANCE_SERVER 2023-02-05 12:16:07 +00:00
Joaquín Sánchez
53d0812efd
feat: allow running elk with a single server (#1606) 2023-02-05 04:10:19 -08:00
Niklas Wolf
61428cd9cd
fix: reply language defaults to status language (#1611) 2023-02-05 13:08:01 +01:00
Tuur Martens
d204b6b1fd
chore: remove dead gesture code (#1632) 2023-02-05 09:46:23 +01:00
Evan Boehs
5f2b5a584a
feat: introduce "request to follow" closes #1076 (#1615)
closes https://github.com/elk-zone/elk/issues/1076
closes https://github.com/elk-zone/elk/pull/1411
2023-02-04 22:26:37 +01:00
Emanuel Pina
8d9c043b7a
fix(i18n): Update portuguese from Portugal translation (#1624) 2023-02-04 20:40:47 +01:00
Joaquín Sánchez
0cc4c41315
feat(pwa): add more errors and elk repo link in push notifications subscription errors (#1610) 2023-02-04 19:43:24 +01:00
Tuur Martens
2cf8f591e8
feat: image pinch to zoom (#1620) 2023-02-04 19:05:55 +01:00
Tuur Martens
e92d1c6adf
feat: add preference to hide emojis in usernames (#1612) 2023-02-04 18:02:05 +01:00
Evan Boehs
0258894484 feat: organize preferences 2023-02-03 22:17:44 +01:00
Evan Boehs
4a74b16d24 feat: option to hide alt indicator closes #1410 2023-02-03 22:17:44 +01:00
Evan Boehs
87496e01af fix: remove saturation for links fixes #1528 2023-02-03 22:17:44 +01:00
Evan Boehs
97964ede5c feat: add outline to verified links closes #155 2023-02-03 22:17:44 +01:00
patak
34949e063e chore: release v0.7.2
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-02-03 21:53:58 +01:00
Michel EDIGHOFFER
347b9ef43d
fix: hide side nav in zen mode (#1608) 2023-02-03 21:52:43 +01:00
patak
3f5f0d11fc chore: release v0.7.1
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-02-03 18:10:17 +01:00
Joaquín Sánchez
6784f3a090
fix: undo changes on push notifications settings stops working (#1599) 2023-02-03 17:01:43 +01:00
JP
eb5748ac65
feat(i18n): update Arabic localization (#1493) 2023-02-03 15:27:05 +01:00
Emanuel Pina
95233b30d0
fix(i18n): Update portuguese from Portugal translation (#1520) 2023-02-03 15:26:42 +01:00
Michel EDIGHOFFER
832e15bf68
chore: add missing french translation + adding changes from KaKi87 (#1564)
Co-authored-by: KaKi87 <KaKi87@pm.me>
2023-02-03 14:25:04 +00:00
Tuur Martens
a8e7fd52a9
fix(Tiptap): don't consume key events if no items (#1594) 2023-02-03 15:21:29 +01:00
Horváth Bálint
faa96c7705
fix: Web Share Target text field merge (#1572)
Co-authored-by: userquin <userquin@gmail.com>
2023-02-03 15:20:32 +01:00
Michel EDIGHOFFER
6eedaa98bc
fix: lists link on side nav (#1596) 2023-02-03 15:19:08 +01:00
patak
f8ff30d31b chore: release v0.7.0
Some checks failed
build & push docker container / docker (push) Has been cancelled
Release / release (push) Has been cancelled
2023-02-03 13:26:12 +01:00
Glaydus
080f4afef0
feat(i18n): Update Polish translations (#1529) 2023-02-03 13:22:06 +01:00
JD Hartley
7f1b443f65
refactor: swap out the bot account indicator icon (#1478) 2023-02-03 13:12:16 +01:00
Joaquín Sánchez
6c1ec2a252
feat(lists): add error handling (#1593) 2023-02-03 13:09:08 +01:00
TAKAHASHI Shuuji
2daaad90a1
feat(i18n): update Japanese localization (#1592)
Co-authored-by: kazuya kawaguchi <kawakazu80@gmail.com>
2023-02-03 12:05:28 +01:00
Joaquín Sánchez
4fc468539e
fix(lists): focus lost when focusing buttons (#1591) 2023-02-03 11:48:27 +01:00
Michel EDIGHOFFER
4b1b18768d
feat: use explorer page as search for mobile only (#1301) 2023-02-03 11:40:54 +01:00
Joaquín Sánchez
a2fb458696
fix(ui): add viewport header to enable/disable pinch to zoom in Safari (#1590) 2023-02-03 10:05:17 +01:00
Alex
a46ec605e1
feat(i18n): sync zh-CN (#1571)
Co-authored-by: Ayaka Rizumu <rizumu@oqo.moe>
2023-02-03 00:14:54 +01:00
Evan Boehs
073ca13d7c
fix: make buttons consistent (#1583) 2023-02-03 00:09:12 +01:00
Evan Boehs
5947323538
fix(i18n): add the in delete (#1582) 2023-02-02 22:45:30 +01:00
Evan Boehs
3b3d4906be
feat(i18n): locales for alt text (#1580) 2023-02-02 22:42:21 +01:00
Joaquín Sánchez
fc706f9050
fix: list should be user-only (#1581) 2023-02-02 21:35:18 +00:00
Evan Boehs
e58d09b6cc
feat: finish list CRUD (#1532)
Co-authored-by: userquin <userquin@gmail.com>
closes https://github.com/elk-zone/elk/issues/372
2023-02-02 22:02:39 +01:00
Vasily Kuzin
809d4a6eb3
fix(i18n): update RU locale (#1514) 2023-02-02 12:11:36 +01:00
Svyatoslav Kryukov
cf76ba3114
fix: missed language code fallback (#1559) 2023-02-02 11:36:35 +01:00
Svyatoslav Kryukov
a025b3b434
fix: update GitHub card paths lookup (#1563) 2023-02-01 20:14:23 +01:00
Svyatoslav Kryukov
a287284664
fix: update stackblitz card to a new format (#1562) 2023-02-01 19:01:38 +01:00
Cesar Gomez
b41b9353b8
feat(i18n): es-419 cv translation support and separating some base strings for idiomatic context (#1505) 2023-02-01 18:01:14 +01:00
Joaquín Sánchez
4c054a37fd
feat: add opt-in pinch to zoom setting (#1557) 2023-02-01 15:43:27 +01:00
Shlee
22fea9d53a
docs: add elk.aus.social to the ecosystem (#1555) 2023-02-01 04:36:15 -08:00
WhiskeyOmega
2481071b2b
docs: add new elk instances (#1553) 2023-02-01 04:19:15 -08:00
Raistlingru
94f3a2c6fb
docs: add hostux.social to community instances (#1511)
* docs: add hostux.social to community instances

* Update README.md

---------

Co-authored-by: Daniel Roe <daniel@roe.dev>
2023-01-31 11:19:31 -08:00
chouchoui
9190aeccdf
fix: viewport meta value for iOS PWA safe area (#1533) 2023-01-31 11:14:58 -08:00
Cyril Lambin
611b6bece7
fix: French translation revision (#1434) 2023-01-31 10:49:46 +01:00
Roni Laukkarinen
d39e23ebff
fix: Custom-emoji size on editor (#1503) 2023-01-31 04:46:21 +01:00
Chris
54f3695f50
fix(ui): statusCard style in RTL (#1499) 2023-01-31 04:44:55 +01:00
Clark Cui
e18fe70f80
fix: account setting button hover style (#1525) 2023-01-31 04:43:12 +01:00
Alex Liu
bd77d467c3
feat: refetch home page when click elk logo (#1129) 2023-01-31 04:42:46 +01:00
Cully Fung
b62fd01057
chore: update zh-cn locales (#1497) 2023-01-31 04:39:06 +01:00
Anthony Fu
04404e0c0b
chore: upgrade to Nuxt 3.1 (#1455)
Co-authored-by: Daniel Roe <daniel@roe.dev>
2023-01-31 04:07:17 +01:00
Joaquín Sánchez
80a4ec502e
fix(a11y): allow pinch to zoom (#1515) 2023-01-30 05:32:27 -08:00
Anthony Fu
9c3a3de41d fix: initial default value in PublishWidget 2023-01-30 12:23:49 +01:00
Anthony Fu
e277832b61 fix: avoid reference context in getDefaultDraft 2023-01-30 12:20:22 +01:00
Anthony Fu
2a4862fb42 feat(ui): display post language 2023-01-30 12:09:04 +01:00
Anthony Fu
8d792d003d refactor: make auto import more explicit 2023-01-30 11:58:58 +01:00
Anthony Fu
fbdaf8bbef chore: cleanup 2023-01-30 10:36:39 +01:00
renovate[bot]
a29f52ee1a
chore(deps): update dependency vitest to ^0.28.3 (#1523)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-29 16:20:47 -08:00
Stanislas
72bf6fb6f0
fix: handle account switching when accounts have the same id (#1510) 2023-01-29 07:58:32 -08:00
Daniel Roe
fa44fae991
perf!: allow tree-shaking unstorage drivers (#1516)
* perf: allow tree-shaking unstorage drivers

* fix: allow overriding fsBase at runtime

* fix: remove `fsBase` export
2023-01-29 07:52:01 -08:00
Daniel Roe
415d36ce32
refactor: move pwa/build-info -> appConfig (#1508) 2023-01-29 06:18:27 -08:00
Anthony Fu
1c9004a731 chore: update lock 2023-01-29 14:25:44 +01:00
Anthony Fu
6dbf7ae74f chore: migrate to nuxt-vitest 2023-01-29 14:20:48 +01:00
Niklas Wolf
b48b7f4c16
feat: allow disabling translation for specific languages (#1371) 2023-01-29 04:18:49 -08:00
TAKAHASHI Shuuji
e197a1dbe9
fix: use "⌘" as modifier key name on macOS (#1506)
* fix: use 'Command' as modifier key name on macOS

* fix: use more reliable `useIsMac()` instead of `userAgentData`

* refactor: apply suggestion from @userquin

* fix: use `⌘` as Command key symbol
2023-01-28 23:41:42 -08:00
John HU
fda85e31bc
fix: disable user-select on StatusActionButton component (#1281) 2023-01-28 14:17:26 -08:00
John HU
7d127d397a
fix: correct federated timeline title icon (#1340) 2023-01-28 14:16:16 -08:00
sechi
8c76dad3c0
fix: prevent click event when publish button is disabled (#1481) 2023-01-28 14:00:20 -08:00
Roni Laukkarinen
ca65f7379e
fix(a11y): do not prevent arbitrary zooming on mobile devices (#1501) 2023-01-28 13:56:00 -08:00
Cesar Gomez
4f23bebf2e
feat(i18n): sync base es (#1496)
* feat(i18n): es-ES sync

* fix: improving confirmation dialogs entries

* fix: improving grayscale mode entry

* fix: hashtag entry translated
2023-01-28 09:32:44 -08:00
TAKAHASHI Shuuji
2ce7c462ae
feat(i18n): update Japanese localization (#1418) 2023-01-28 07:11:30 -08:00
Alex Liu
bdcb8f46fd
chore: adjust zh-TW translation wording (#1430) 2023-01-28 12:54:33 +01:00
Emanuel Pina
664c0a2ab7
fix(i18n): Update portuguese from Portugal translation (#1476) 2023-01-27 23:31:33 +01:00
Glaydus
1924ec8d07
fix(i18n): updated Polish translation (#1490)
Co-authored-by: Karol Krenski <kkrenski@gmail.com>
2023-01-27 23:27:40 +01:00
Osma Ahvenlampi
3e365fc30a
fix: updated Finnish localization with some errors fixed (#1489) 2023-01-27 16:56:16 +01:00
Evan Boehs
e393049f04
feat: more list support (#1479) 2023-01-27 16:15:46 +01:00
Osma Ahvenlampi
9d353fa07b
feat(i18n): revised Finnish localization (#1487) 2023-01-27 13:32:20 +01:00
Joaquín Sánchez
a15fd7b2ca
chore(i18n): update i18n module and en-US file (#1485) 2023-01-27 12:12:57 +01:00
ghose
068daf7a77
fix: update gl-ES (#1482) 2023-01-27 10:28:38 +01:00
Daniel Roe
541a1f93bc
feat: add privacy policy (#1484) 2023-01-27 09:45:23 +01:00
Evan Boehs
3904bc4d2d
feat: initial support for lists (#1474) 2023-01-26 22:41:28 +01:00
Joaquín Sánchez
901463301c
feat(pwa): don't show install widget if cancelled from widget (#1459) 2023-01-26 21:30:39 +01:00
Evan Boehs
d26510a766
feat: hide reply count (#1439)
* feat: hide reply count

* fix(i18n): rearrange strings

* style: new line
2023-01-26 13:41:43 +01:00
Anthony Fu
75c4fa54d7 chore: unstable test ci 2023-01-26 12:46:13 +01:00
Emanuel Pina
5eac588d6d
fix(i18n): Update portuguese from Portugal translation (#1447) 2023-01-25 21:30:04 +01:00
Joaquín Sánchez
050092b87a
fix(pwa): add maskable icon to web manifest (#1456) 2023-01-25 21:16:32 +01:00
三咲智子 Kevin Deng
bc78b50ee0
fix: upgrade vue macros 2023-01-26 00:53:26 +08:00
Joaquín Sánchez
d5653076f9
chore(pwa): reduce pwa prompts image opacity (#1452) 2023-01-25 17:06:16 +01:00
victordelva
adb17d7f14
fix: default user language when writing a publication (#1446) 2023-01-25 16:41:09 +01:00
Sakana
255c341a78
feat(i18n): add some Chinese translation (#1386) 2023-01-25 23:33:59 +08:00
Joaquín Sánchez
eda218de0b
fix(pwa): use 303 redirect in web share target api (#1448) 2023-01-25 16:32:52 +01:00
Joaquín Sánchez
f96cdae1ba
feat(pwa): add install PWA widget (#1451) 2023-01-25 16:26:51 +01:00
Joaquín Sánchez
3c888d3914
fix: unescape html entities in page title (#1392) 2023-01-25 05:12:55 -08:00
ghose
18af058e4d
feat(i18n): galician language contribution (#1417) 2023-01-25 06:50:20 +01:00
Alex Liu
1d1f4bccca
fix: make the user switcher's buttons fill container (#1437) 2023-01-25 06:49:31 +01:00
Joaquín Sánchez
0e021e4388
chore(i18n): initialize spanish properly (detect es-419) (#1428) 2023-01-24 23:35:26 +01:00
Shinigami
5527468258
fix: tag if condition (#1432) 2023-01-24 21:57:24 +00:00
wheat
46a8472001
feat(preferences): option to hide account hover card (#1431) 2023-01-24 21:46:33 +01:00
三咲智子 Kevin Deng
4e97c31caf
fix: back to rollup 2 2023-01-25 03:06:00 +08:00
三咲智子 Kevin Deng
3c59263f21
fix: pin vitest version 2023-01-25 03:02:20 +08:00
三咲智子 Kevin Deng
7545921385
fix: upgrade & downupgrade deps 2023-01-25 02:52:48 +08:00
三咲智子 Kevin Deng
d7bba4dbc9
fix: keep patches folder 2023-01-25 01:59:56 +08:00
Jay
84f45809ea
fix(i18n): Update zh-TW translations (#1429) 2023-01-25 01:58:34 +08:00
三咲智子 Kevin Deng
727cc5d495
chore: upgrade deps 2023-01-25 01:56:18 +08:00
Joaquín Sánchez
82694b87b6
chore(i18n): move country variants to avoid changing contributing guide (#1403) 2023-01-24 15:42:57 +01:00
599 changed files with 51230 additions and 19694 deletions

View file

@ -11,7 +11,6 @@ dist
.netlify/
.eslintcache
public/shiki
public/emojis
*~

View file

@ -1,12 +1,14 @@
NUXT_PUBLIC_TRANSLATE_API=
NUXT_PUBLIC_DEFAULT_SERVER=
NUXT_PUBLIC_SINGLE_INSTANCE=
NUXT_PUBLIC_PRIVACY_POLICY_URL=
# Production only
NUXT_CLOUDFLARE_ACCOUNT_ID=
NUXT_CLOUDFLARE_NAMESPACE_ID=
NUXT_CLOUDFLARE_API_TOKEN=
# 'cloudflare' | 'fs'
# 'cloudflare' | 'vercel' | 'fs'
NUXT_STORAGE_DRIVER=
NUXT_STORAGE_FS_BASE=

View file

@ -1,11 +0,0 @@
*.css
*.png
*.ico
*.toml
*.patch
*.txt
Dockerfile
public/
https-dev-config/localhost.crt
https-dev-config/localhost.key
Dockerfile

View file

@ -1,18 +0,0 @@
{
"extends": "@antfu",
"ignorePatterns": ["!pages/public"],
"overrides": [
{
"files": ["locales/**.json"],
"rules": {
"jsonc/sort-keys": "error"
}
}
],
"rules": {
"vue/no-restricted-syntax":["error", {
"selector": "VElement[name='a']",
"message": "Use NuxtLink instead."
}]
}
}

1
.gitattributes vendored Normal file
View file

@ -0,0 +1 @@
* text=auto eol=lf

View file

@ -2,4 +2,4 @@
name: 🚀 New feature proposal
about: Propose a new feature
labels: 's: pending triage'
---
---

View file

@ -3,6 +3,14 @@
"extends": ["config:base", "schedule:weekly", "group:allNonMajor"],
"labels": ["c: dependencies"],
"rangeStrategy": "bump",
"ignoreDeps": [
"vue",
"vue-tsc",
"typescript",
// Intl.Segmenter is not supported in Firefox
"string-length"
],
"packageRules": [
{
"groupName": "devDependencies",
@ -32,7 +40,6 @@
"groupName": "lint",
"matchPackageNames": [
"@antfu/eslint-config",
"@types/prettier",
"eslint",
"prettier"
]
@ -56,6 +63,10 @@
{
"groupName": "typescript",
"matchPackageNames": ["typescript"]
},
{
"matchDatasources": ["node-version"],
"enabled": false
}
],
"vulnerabilityAlerts": {

View file

@ -10,18 +10,21 @@ on:
branches:
- main
workflow_dispatch: {}
merge_group: {}
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: corepack enable
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
# workaround for npm registry key change
# ref. `pnpm@10.1.0` / `pnpm@9.15.4` cannot be installed due to key id mismatch · Issue #612 · nodejs/corepack
# - https://github.com/nodejs/corepack/issues/612#issuecomment-2629496091
- run: npm i -g corepack@latest && corepack enable
- uses: actions/setup-node@v4.4.0
with:
node-version: 18
cache: pnpm
node-version-file: .nvmrc
- name: 📦 Install dependencies
run: pnpm install --frozen-lockfile
@ -30,7 +33,8 @@ jobs:
run: pnpm nuxi prepare
- name: 🧪 Test project
run: pnpm test
run: pnpm test:ci
timeout-minutes: 10
- name: 📝 Lint
run: pnpm lint

View file

@ -16,29 +16,29 @@ jobs:
packages: write
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Docker meta
id: metal
uses: docker/metadata-action@v4
uses: docker/metadata-action@v5
with:
images: |
ghcr.io/elk-zone/elk
ghcr.io/${{ github.repository }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
if: github.event_name != 'pull_request'
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Build and push
uses: docker/build-push-action@v3
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.metal.outputs.tags }}
labels: ${{ steps.metal.outputs.labels }}

View file

@ -12,14 +12,14 @@ jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 18
node-version-file: .nvmrc
- run: npx changelogithub
env:

View file

@ -19,6 +19,6 @@ jobs:
name: Semantic Pull Request
steps:
- name: Validate PR title
uses: amannn/action-semantic-pull-request@v5.0.2
uses: amannn/action-semantic-pull-request@v5.5.3
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

3
.gitignore vendored
View file

@ -2,6 +2,7 @@ node_modules
*.log
dist
.output
.pnpm-store
.nuxt
.env
.DS_Store
@ -9,8 +10,8 @@ dist
.vite-inspect
.netlify/
.eslintcache
elk-translation-status.json
public/shiki
public/emojis
*~

2
.npmrc
View file

@ -1,4 +1,4 @@
shamefully-hoist=true
strict-peer-dependencies=false
shell-emulator=true
ignore-workspace-root-check=true
package-manager-strict=false

1
.nvmrc Normal file
View file

@ -0,0 +1 @@
22

47
.vscode/settings.json vendored
View file

@ -5,10 +5,6 @@
"unmute",
"unstorage"
],
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"editor.formatOnSave": false,
"files.associations": {
"*.css": "postcss"
},
@ -22,8 +18,45 @@
],
"i18n-ally.preferredDelimiter": "_",
"i18n-ally.sortKeys": true,
"i18n-ally.sourceLanguage": "en-US",
"i18n-ally.sourceLanguage": "en",
// Enable the ESlint flat config support
"eslint.experimental.useFlatConfig": true,
// Disable the default formatter, use eslint instead
"prettier.enable": false,
"volar.completion.preferredTagNameCase": "pascal",
"volar.completion.preferredAttrNameCase": "kebab"
"editor.formatOnSave": false,
// Auto fix
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "never"
},
// Silent the stylistic rules in you IDE, but still auto fix them
"eslint.rules.customizations": [
{ "rule": "style/*", "severity": "off" },
{ "rule": "*-indent", "severity": "off" },
{ "rule": "*-spacing", "severity": "off" },
{ "rule": "*-spaces", "severity": "off" },
{ "rule": "*-order", "severity": "off" },
{ "rule": "*-dangle", "severity": "off" },
{ "rule": "*-newline", "severity": "off" },
{ "rule": "*quotes", "severity": "off" },
{ "rule": "*semi", "severity": "off" }
],
// Enable eslint for all supported languages
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"vue",
"html",
"markdown",
"json",
"jsonc",
"yaml"
]
}

45
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,45 @@
# Code Of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, political party, or sexual identity and orientation. Note, however, that religion, political party, or other ideological affiliation provide no exemptions for the behavior we outline as unacceptable in this Code of Conduct.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team by DM at [the Elk Discord](https://chat.elk.zone). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org

View file

@ -1,14 +1,10 @@
# Contributing Guide
Hi! We are really excited that you are interested in contributing to Elk. Before submitting your contribution, please make sure to take a moment and read through the following guide.
Hi! We are excited that you are interested in contributing to Elk. Before submitting your contribution, please make sure to take a moment and read through the following guide.
Refer also to https://github.com/antfu/contribute.
### Online
You can use [StackBlitz Codeflow](https://stackblitz.com/codeflow) to fix bugs or implement features. You'll also see a Codeflow button on PRs to review them without a local setup. Once the elk repo has been cloned in Codeflow, the dev server will start automatically and print the URL to open the App. You should receive a prompt in the bottom-right suggesting to open it in the Editor or in another Tab. To learn more, check out the [Codeflow docs](https://developer.stackblitz.com/codeflow/what-is-codeflow).
[![Open in Codeflow](https://developer.stackblitz.com/img/open_in_codeflow.svg)](https://pr.new/elk-zone/elk)
For guidelines on contributing to the documentation, refer to the [docs README](./docs/README.md).
### Local Setup
@ -16,9 +12,10 @@ To develop and test the Elk package:
1. Fork the Elk repository to your own GitHub account and then clone it to your local device.
2. Ensure using the latest Node.js (16.x)
2. Ensure using the LTS version of Node.js.
If you have [nvm](https://github.com/nvm-sh/nvm), you can run `nvm i` to install the required version.
3. The package manager used to install and link dependencies must be [pnpm](https://pnpm.io/) v7. To use it you must first enable [Corepack](https://github.com/nodejs/corepack) by running `corepack enable`. (Note: on Linux in a standard Node 16+ environment, you should follow the instructions to install via Node's `corepack` rather than using the `curl` command)
3. The package manager used to install and link dependencies must be [pnpm](https://pnpm.io/) v9. To use it you must first enable [Corepack](https://github.com/nodejs/corepack) by running `corepack enable`. (Note: on Linux in a standard Node 20+ environment, you should follow the instructions to install via Node's `corepack` rather than using the `curl` command)
4. Check out a branch where you can work and commit your changes:
```shell
@ -50,16 +47,16 @@ nr test
In order to run Elk with PWA enabled, run `pnpm dev:pwa` in Elk's root folder to start dev server or `pnpm dev:mocked:pwa` to start dev server with `@elkdev@universeodon.com` user.
You should test the Elk PWA application on private browsing mode on any Chromium based browser: will not work on Firefox and Safari.
You should test the Elk PWA application on private browsing mode on any Chromium-based browser: will not work on Firefox and Safari.
If not using private browsing mode, you will need to uninstall the PWA application from your browser once you finish testing:
- Open `Dev Tools` (`Option + ⌘ + J` on macOS, `Shift + CTRL + J` on Windows/Linux)
- Go to `Application > Storage`, you should check following checkboxes:
- Go to `Application > Storage`, you should check the following checkboxes:
- Application: [x] Unregister service worker
- Storage: [x] IndexedDB and [x] Local and session storage
- Cache: [x] Cache storage and [x] Application cache
- Click on `Clear site data` button
- Go to `Application > Service Workers` and check the current `service worker` is missing or has the state `deleted` or `redundant`
- Go to `Application > Service Workers` and check if the current `service worker` is missing or has the state `deleted` or `redundant`
## CI errors
@ -78,38 +75,45 @@ Elk supports `right-to-left` languages, we need to make sure that the UI is work
Simple approach used by most websites of relying on direction set in HTML element does not work because direction for various items, such as timeline, does not always match direction set in HTML.
We've added some `UnoCSS` utilities styles to help you with that:
- Do not use `left/right` padding and margin: for example `pl-1`. Use `padding-inline-start/end` instead. So `pl-1` should be `ps-1`, `pr-1` should be `pe-1`. Same rules applies for margin.
- Do not use `left/right` padding and margin: for example `pl-1`. Use `padding-inline-start/end` instead. So `pl-1` should be `ps-1`, `pr-1` should be `pe-1`. The same rules apply to margin.
- Do not use `rtl-` classes, such as `rtl-left-0`.
- For icons that should be rotated for RTL, add `class="rtl-flip"`. This can only be used for icons outside of elements with `dir="auto"`, such as timeline, and is the only exception from rule above. For icons inside timeline it might not work as expected.
- For icons that should be rotated for RTL, add `class="rtl-flip"`. This can only be used for icons outside of elements with `dir="auto"`, such as timeline, and is the only exception to the rule above. For icons inside the timeline, it might not work as expected.
- For absolute positioned elements, don't use `left/right`: for example `left-0`. Use `inset-inline-start/end` instead. `UnoCSS` shortcuts are `inset-is` for `inset-inline-start` and `inset-ie` for `inset-inline-end`. Example: `left-0` should be replaced with `inset-is-0`.
- If you need to change border radius for an entire left or right side, use `border-inline-start/end`. `UnoCSS` shortcuts are `rounded-is` for left side, `rounded-ie` for right side. Example: `rounded-l-5` should be replaced with `rounded-ie-5`.
- If you need to change border radius for one corner, use `border-start-end-radius` and similar rules. `UnoCSS` shortcuts are `rounded` + top/bottom as either `-bs` (top) or `-be` (bottom) + left/right as either `-is` (left) or `-ie` (right). Example: `rounded-tl-0` should be replaced with `rounded-bs-is-0`.
- If you need to change the border radius for an entire left or right side, use `border-inline-start/end`. `UnoCSS` shortcuts are `rounded-is` for left side, `rounded-ie` for right side. Example: `rounded-l-5` should be replaced with `rounded-ie-5`.
- If you need to change the border radius for one corner, use `border-start-end-radius` and similar rules. `UnoCSS` shortcuts are `rounded` + top/bottom as either `-bs` (top) or `-be` (bottom) + left/right as either `-is` (left) or `-ie` (right). Example: `rounded-tl-0` should be replaced with `rounded-bs-is-0`.
## Internationalization
We are using [vue-i18n](https://vue-i18n.intlify.dev/) via [nuxt-i18n](https://i18n.nuxtjs.org/) to handle internationalization.
You can check the current [translation status](https://docs.elk.zone/guide/contributing#translation-status): more instructions on the table caption.
If you are updating a translation in your local environment, you can run the following commands to check the status:
- from root folder: `nr prepare-translation-status`
- change to `docs` folder and run docs dev server `nr dev`
- open `http://localhost:3000/guide/contributing#translation-status` in your browser
### Adding a new language
1. Add a new file in [locales](./locales) folder with the language code as the filename.
2. Copy [en-US](./locales/en-US.json) and translate the strings.
3. Add the language to the `locales` array in [config/i18n.ts](./config/i18n.ts#L12), below `en` and `ar`:
- If your language have multiple country variants, add the generic one for language only (only if there are a lot of common entries, you can always add it as a new one)
- Add all country variants in [country variants object](./config/i18n.ts#L97)
2. Copy [en](./locales/en.json) and translate the strings.
3. Add the language to the `locales` array in [config/i18n.ts](./config/i18n.ts#L61), below `en` and `ar`:
- If your language has multiple country variants, add the generic one for language only (only if there are a lot of common entries, you can always add it as a new one)
- Add all country variants in [country variants object](./config/i18n.ts#L12)
- Add all country variants files with empty `messages` object: `{}`
- Translate the strings in the generic language file
- Later, when anyone wants to add the corresponding translations for the country variant, you can override all entries in the corresponding file: check `en` (english variants), and override the entries in all country files, if you omit them, `i18n` module will use the language entry. You will need also copy from base file to the rest of country variants those messages not being shared (the Elk team is working on resolving this, assuming it can be resolved).
- Later, when anyone wants to add the corresponding translations for the country variant, just override any entry in the corresponding file: you can see an example with `en` variants.
- If the generic language already exists:
- If the translation doesn't differ from the generic language, then add the corresponding translations in the corresponding file
- If the translation differs from the generic language, then add the corresponding translations in the corresponding file and remove it from the country variants entry
4. If the language is `right-to-left`, add `dir` option with `rtl` value, for example, for [ar](./config/i18n.ts#L22)
5. If the language requires special pluralization rules, add `pluralRule` callback option, for example, for [ar](./config/i18n.ts#L23)
4. If the language is `right-to-left`, add `dir` option with `rtl` value, for example, for [ar](./config/i18n.ts#L71)
5. If the language requires special pluralization rules, add `pluralRule` callback option, for example, for [ar](./config/i18n.ts#L72)
Check [Pluralization rule callback](https://vue-i18n.intlify.dev/guide/essentials/pluralization.html#custom-pluralization) for more info.
### Messages interpolation
Most of the messages used in Elk do not require any interpolation, however, there are some messages that require interpolation: check [Message Format Syntax](https://vue-i18n.intlify.dev/guide/essentials/syntax.html) for more info.
Most of the messages used in Elk do not require any interpolation, however, some messages require interpolation: check [Message Format Syntax](https://vue-i18n.intlify.dev/guide/essentials/syntax.html) for more info.
We're using these types of interpolation:
- [List interpolation](https://vue-i18n.intlify.dev/guide/essentials/syntax.html#list-interpolation)
@ -131,7 +135,7 @@ Check [Custom Plural Number Formatting Entries](#custom-plural-number-formatting
When using plural number formatting, we'll have always `{n}` available in the message, for example, `You have {n} new notifications|You have {n} new notification|You have {n} new notifications` or `You have no new notifications|You have 1 new notification|You have {n} new notifications`.
We've included `v` named parameter, it will be used to pass the formatted number using [Intl.NumberFormat::format](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/format): will be the number with separators symbols. The exception to previous rule is when we're using `plural` **with** `i18n-t` component, in this case, we'll need to use `{0}` instead `{v}` to access the number.
We've included `v` named parameter, it will be used to pass the formatted number using [Intl.NumberFormat::format](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/format): will be the number with separators symbols. The exception to the previous rule is when we're using `plural` **with** `i18n-t` component, in this case, we'll need to use `{0}` instead `{v}` to access the number.
Additionally, Elk will use [compact notation for numbers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#parameters) for some entries, check `notation` and `compactDisplay` options: for example, `1K` for `1000`, `1M` for `1000000`, `1B` for `1000000000` and so on. That entry will be available in the message using `{v}` named parameter (or `{0}` if using the message **with** `i18n-t` component).

View file

@ -6,7 +6,10 @@ WORKDIR /elk
FROM base AS builder
# Prepare pnpm https://pnpm.io/installation#using-corepack
RUN corepack enable
# workaround for npm registry key change
# ref. `pnpm@10.1.0` / `pnpm@9.15.4` cannot be installed due to key id mismatch · Issue #612 · nodejs/corepack
# - https://github.com/nodejs/corepack/issues/612#issuecomment-2629496091
RUN npm i -g corepack@latest && corepack enable
# Prepare deps
RUN apk update
@ -14,6 +17,7 @@ RUN apk add git --no-cache
# Prepare build deps ( ignore postinstall scripts for now )
COPY package.json ./
COPY .npmrc ./
COPY pnpm-lock.yaml ./
COPY patches ./patches
RUN pnpm i --frozen-lockfile --ignore-scripts
@ -34,8 +38,8 @@ ARG GID=911
# Create a dedicated user and group
RUN set -eux; \
addgroup -g $UID elk; \
adduser -u $GID -D -G elk elk;
addgroup -g $GID elk; \
adduser -u $UID -D -G elk elk;
USER elk

View file

@ -1,28 +1,16 @@
<p align="center">
<a href="https://elk.zone" target="_blank" rel="noopener noreferrer">
<img width="160" height="160" src="./public/logo.svg" alt="Elk logo">
</a>
</p>
# Yolk
<h1 align="center"/>Elk <sup><em>alpha</em></sup></h1>
Hi! Yolk is my custom fork of [Elk](https://github.com/elk-zon/elk), a nimble Mastodon client.
<p align="center">
A nimble Mastodon web client
</p>
I [decided](https://social.ayco.io/@ayo/114921112446517000) to have a personal fork of Elk because I really like the cross-account functionalities I use it for (e.g., I can open the Explore tab of my fosstodon account, then engage in a post with my self-hosted account, etc)... but I find sometimes I want to change little things which will make the app a bit more opinionated on my tastes (e.g., icons, colors, spacing, etc)... and some behavioral features.
<br/>
<p align="center">
<a href="https://chat.elk.zone"><img src="https://img.shields.io/badge/chat-discord-blue?style=flat&logo=discord" alt="discord chat"></a>
<a href="https://pr.new/elk-zone/elk"><img src="https://developer.stackblitz.com/img/start_pr_dark_small.svg" alt="Start new PR in StackBlitz Codeflow"></a>
<a href="https://volta.net/elk-zone/elk?utm_source=elk_readme"><img src="https://user-images.githubusercontent.com/904724/209143798-32345f6c-3cf8-4e06-9659-f4ace4a6acde.svg" alt="Open board on Volta"></a>
</p>
<br/>
I think doing this will make me use it as my main app daily. I have been switching between multiple apps because each one have strengths & weaknesses of their own.
<p align="center">
<a href="https://elk.zone/" target="_blank" rel="noopener noreferrer" >
<img src="./public/elk-og.png" alt="Elk screenshots" width="600" height="auto">
</a>
</p>
Crucial fixes (if I find them), quality of life improvements, and mastodon API feature parity will still go upstream to the main Elk project.
~ Ayo Ayco
---
## ⚠️ Elk is in Alpha
@ -37,56 +25,26 @@ The Elk team maintains a deployment at:
- 🦌 Production: [elk.zone](https://elk.zone)
- 🐙 Canary: [main.elk.zone](https://main.elk.zone) (deploys on every commit to `main` branch)
### Ecosystem
### Self-Host Docker Deployment
These are known deployments using Elk as an alternative Web client for Mastodon servers or as a base for other projects in the fediverse:
In order to host Elk yourself you can use the provided Dockerfile to build a container with elk. Be aware, that Elk only loads properly if the connection is done via SSL/TLS. The Docker container itself does not provide any SSL/TLS handling. You'll have to add this bit yourself.
One could put Elk behind popular reverse proxies with SSL Handling like Traefik, NGINX etc.
- [elk.h4.io](https://elk.h4.io) - Use Elk for the `h4.io` Server
- [elk.universeodon.com](https://elk.universeodon.com) - Use Elk for the Universeodon Server
- [elk.vmst.io](https://elk.vmst.io) - Use Elk for the `vmst.io` Server
1. checkout source ```git clone https://github.com/elk-zone/elk.git```
1. got into new source dir: ```cd elk```
1. create local storage directory for settings: ```mkdir elk-storage```
1. adjust permissions of storage dir: ```sudo chown 911:911 ./elk-storage```
1. start container: ```docker-compose up --build -d```
> [!NOTE]
> The provided Dockerfile creates a container which will eventually run Elk as non-root user and create a persistent named Docker volume upon first start (if that volume does not yet exist). This volume is always created with root permission. Failing to change the permissions of ```/elk/data``` inside this volume to UID:GID 911 (as specified for Elk in the Dockerfile) will prevent Elk from storing it's config for user accounts. You either have to fix the permission in the created named volume, or mount a directory with the correct permission to ```/elk/data``` into the container.
> **Note**: Community deployments are **NOT** maintained by the Elk team. It may not be synced with Elk's source code. Please do your own research about the host servers before using them.
## 💖 Sponsors
We are grateful for the generous sponsorship and help of:
<a href="https://nuxtlabs.com/" target="_blank" rel="noopener noreferrer" >
<img src="./images/nuxtlabs.svg" alt="NuxtLabs" height="85">
</a>
<br><br>
<a href="https://stackblitz.com/" target="_blank" rel="noopener noreferrer" >
<img src="./images/stackblitz.svg" alt="StackBlitz" height="85">
</a>
<br><br>
And all the companies and individuals sponsoring Elk Team and the members. If you're enjoying the app, consider sponsoring us:
- [Elk Team's GitHub Sponsors](https://github.com/sponsors/elk-zone)
Or you can sponsor our core team members individually:
- [Anthony Fu](https://github.com/sponsors/antfu)
- [Daniel Roe](https://github.com/sponsors/danielroe)
- [三咲智子 Kevin Deng](https://github.com/sponsors/sxzz)
- [Patak](https://github.com/sponsors/patak-dev)
We would also appreciate sponsoring other contributors to the Elk project. If someone helps you solve an issue or implement a feature you wanted, supporting them would help make this project and OS more sustainable.
## 📍 Roadmap
[Open board on Volta](https://volta.net/elk-zone/elk)
## 🧑‍💻 Contributing
We're really excited that you're interested in contributing to Elk! Before submitting your contribution, please read through the following guide.
### Online
You can use [StackBlitz Codeflow](https://stackblitz.com/codeflow) to fix bugs or implement features. You'll also see a Codeflow button on PRs to review them without a local setup. Once the elk repo has been cloned in Codeflow, the dev server will start automatically and print the URL to open the App. You should receive a prompt in the bottom-right suggesting to open it in the Editor or in another Tab. To learn more, check out the [Codeflow docs](https://developer.stackblitz.com/codeflow/what-is-codeflow).
[![Open in Codeflow](https://developer.stackblitz.com/img/open_in_codeflow.svg)](https://pr.new/elk-zone/elk)
### Local Setup
Clone the repository and run on the root folder:
@ -113,6 +71,10 @@ Elk uses [Vitest](https://vitest.dev). You can run the test suite with:
nr test
```
## 📲 PWA
You can consult the [PWA documentation](https://docs.elk.zone/pwa) to learn more about the PWA capabilities on Elk, how to install Elk PWA in your desktop or mobile device and some hints about PWA stuff on Elk.
## 🦄 Stack
- [Vite](https://vitejs.dev/) - Next Generation Frontend Tooling
@ -124,14 +86,14 @@ nr test
- [UnoCSS](https://uno.antfu.me/) - The instant on-demand atomic CSS engine
- [Iconify](https://github.com/iconify/icon-sets#iconify-icon-sets-in-json-format) - Iconify icon sets in JSON format
- [Masto.js](https://neet.github.io/masto.js) - Mastodon API client in TypeScript
- [shiki](https://shiki.matsu.io/) - A beautiful Syntax Highlighter
- [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) - Prompt for update and push notifications
- [shiki](https://shiki.style/) - A beautiful yet powerful syntax highlighter
- [vite-plugin-pwa](https://github.com/vite-pwa/vite-plugin-pwa) - Prompt for update, Web Push Notifications and Web Share Target API
## 👨‍💻 Contributors
<a href="https://github.com/elk-zone/elk/graphs/contributors">
<img src="https://contrib.rocks/image?repo=elk-zone/elk" />
</a>
<img src="https://contrib.rocks/image?repo=elk-zone/elk" />
</a>
## 📄 License

View file

@ -4,10 +4,12 @@ provideGlobalCommands()
const route = useRoute()
if (process.server && !route.path.startsWith('/settings')) {
if (import.meta.server && !route.path.startsWith('/settings')) {
const url = useRequestURL()
useHead({
meta: [
{ property: 'og:url', content: `https://elk.zone${route.path}` },
{ property: 'og:url', content: `${url.origin}${route.path}` },
],
})
}

View file

@ -1,13 +1,18 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
defineProps<{
const { account } = defineProps<{
account: mastodon.v1.Account
square?: boolean
}>()
const loaded = $ref(false)
const error = $ref(false)
const loaded = ref(false)
const error = ref(false)
const preferredMotion = usePreferredReducedMotion()
const accountAvatarSrc = computed(() => {
return preferredMotion.value === 'reduce' ? (account?.avatarStatic ?? account.avatar) : account.avatar
})
</script>
<template>
@ -16,10 +21,10 @@ const error = $ref(false)
width="400"
height="400"
select-none
:src="(error || !loaded) ? 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' : account.avatar"
:src="(error || !loaded) ? 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7' : accountAvatarSrc"
:alt="$t('account.avatar_description', [account.username])"
loading="lazy"
class="account-avatar"
class="account-avatar object-cover"
:class="(loaded ? 'bg-base' : 'bg-gray:10') + (square ? ' ' : ' rounded-full')"
:style="{ 'clip-path': square ? `url(#avatar-mask)` : 'none' }"
v-bind="$attrs"

View file

@ -1,16 +1,16 @@
<script lang="ts" setup>
<script setup lang="ts">
import type { mastodon } from 'masto'
const { account, as = 'div' } = $defineProps<{
defineOptions({
inheritAttrs: false,
})
const { account, as = 'div' } = defineProps<{
account: mastodon.v1.Account
as?: string
}>()
cacheAccount(account)
defineOptions({
inheritAttrs: false,
})
</script>
<template>

View file

@ -12,7 +12,7 @@ defineProps<{
>
<slot name="prepend" />
<CommonTooltip :content="$t('account.bot')" :disabled="showLabel">
<div i-ri:robot-line />
<div i-mdi:robot-outline />
</CommonTooltip>
<div v-if="showLabel">
{{ $t('account.bot') }}

View file

@ -19,8 +19,10 @@ cacheAccount(account)
overflow-hidden
:to="getAccountRoute(account)"
/>
<div h-full p1 shrink-0>
<AccountFollowButton :account="account" :context="relationshipContext" />
</div>
<slot>
<div h-full p1 shrink-0>
<AccountFollowButton :account="account" :context="relationshipContext" />
</div>
</slot>
</div>
</template>

View file

@ -1,8 +1,9 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
defineProps<{
const { hideEmojis = false } = defineProps<{
account: mastodon.v1.Account
hideEmojis?: boolean
}>()
</script>
@ -10,6 +11,7 @@ defineProps<{
<ContentRich
:content="getDisplayName(account, { rich: true })"
:emojis="account.emojis"
:hide-emojis="hideEmojis"
:markdown="false"
/>
</template>

View file

@ -0,0 +1,114 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
import { toggleFollowAccount, useRelationship } from '~/composables/masto/relationship'
const { account, context, command, ...props } = defineProps<{
account: mastodon.v1.Account
relationship?: mastodon.v1.Relationship
context?: 'followedBy' | 'following'
command?: boolean
}>()
const { t } = useI18n()
const isSelf = useSelfAccount(() => account)
const enable = computed(() => !isSelf.value && currentUser.value)
const relationship = computed(() => props.relationship || useRelationship(account).value)
const isLoading = computed(() => relationship.value === undefined)
const { client } = useMasto()
async function unblock() {
relationship.value!.blocking = false
try {
const newRel = await client.value.v1.accounts.$select(account.id).unblock()
Object.assign(relationship!, newRel)
}
catch (err) {
console.error(err)
// TODO error handling
relationship.value!.blocking = true
}
}
async function unmute() {
relationship.value!.muting = false
try {
const newRel = await client.value.v1.accounts.$select(account.id).unmute()
Object.assign(relationship!, newRel)
}
catch (err) {
console.error(err)
// TODO error handling
relationship.value!.muting = true
}
}
useCommand({
scope: 'Actions',
order: -2,
visible: () => command && enable,
name: () => `${relationship.value?.following ? t('account.unfollow') : t('account.follow')} ${getShortHandle(account)}`,
icon: 'i-ri:star-line',
onActivate: () => toggleFollowAccount(relationship.value!, account),
})
const buttonStyle = computed(() => {
if (relationship.value?.blocking)
return 'text-inverted bg-red border-red'
if (relationship.value?.muting)
return 'text-base bg-card border-base'
// If following, use a label style with a strong border for Mutuals
if (relationship.value ? relationship.value.following : context === 'following')
return `text-base ${relationship.value?.followedBy ? 'border-strong' : 'border-base'}`
// If loading, use a plain style
if (isLoading.value)
return 'text-base border-base'
// If not following, use a button style
return 'text-inverted bg-primary border-primary'
})
</script>
<template>
<button
v-if="enable"
gap-1 items-center group
border-1
rounded-full flex="~ gap2 center" font-500 min-w-30 h-fit px3 py1
:class="buttonStyle"
:hover="!relationship?.blocking && !relationship?.muting && relationship?.following ? 'border-red text-red' : 'bg-base border-primary text-primary'"
@click="relationship?.blocking ? unblock() : relationship?.muting ? unmute() : toggleFollowAccount(relationship!, account)"
>
<template v-if="isLoading">
<span i-svg-spinners-180-ring-with-bg />
</template>
<template v-else>
<template v-if="relationship?.blocking">
<span elk-group-hover="hidden">{{ $t('account.blocking') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.unblock') }}</span>
</template>
<template v-if="relationship?.muting">
<span elk-group-hover="hidden">{{ $t('account.muting') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.unmute') }}</span>
</template>
<template v-else-if="relationship ? relationship.following : context === 'following'">
<span elk-group-hover="hidden">{{ relationship?.followedBy ? $t('account.mutuals') : $t('account.following') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.unfollow') }}</span>
</template>
<template v-else-if="relationship?.requested">
<span elk-group-hover="hidden">{{ $t('account.follow_requested') }}</span>
<span hidden elk-group-hover="inline">{{ $t('account.withdraw_follow_request') }}</span>
</template>
<template v-else-if="relationship ? relationship.followedBy : context === 'followedBy'">
<span elk-group-hover="hidden">{{ $t('account.follows_you') }}</span>
<span hidden elk-group-hover="inline">{{ account.locked ? $t('account.request_follow') : $t('account.follow_back') }}</span>
</template>
<template v-else>
<span>{{ account.locked ? $t('account.request_follow') : $t('account.follow') }}</span>
</template>
</template>
</button>
</template>

View file

@ -0,0 +1,68 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
const { account, ...props } = defineProps<{
account: mastodon.v1.Account
relationship?: mastodon.v1.Relationship
}>()
const relationship = computed(() => props.relationship || useRelationship(account).value)
const { client } = useMasto()
async function authorizeFollowRequest() {
relationship.value!.requestedBy = false
relationship.value!.followedBy = true
try {
const newRel = await client.value.v1.followRequests.$select(account.id).authorize()
Object.assign(relationship!, newRel)
}
catch (err) {
console.error(err)
relationship.value!.requestedBy = true
relationship.value!.followedBy = false
}
}
async function rejectFollowRequest() {
relationship.value!.requestedBy = false
try {
const newRel = await client.value.v1.followRequests.$select(account.id).reject()
Object.assign(relationship!, newRel)
}
catch (err) {
console.error(err)
relationship.value!.requestedBy = true
}
}
</script>
<template>
<div flex gap-4>
<template v-if="relationship?.requestedBy">
<CommonTooltip :content="$t('account.authorize')">
<button
type="button"
rounded-full text-sm p2 border-1
hover:text-green transition-colors
@click="authorizeFollowRequest"
>
<span block text-current i-ri:check-fill />
</button>
</CommonTooltip>
<CommonTooltip :content="$t('account.reject')">
<button
type="button"
rounded-full text-sm p2 border-1
hover:text-red transition-colors
@click="rejectFollowRequest"
>
<span block text-current i-ri:close-fill />
</button>
</CommonTooltip>
</template>
<template v-else>
<span text-secondary>
{{ relationship?.followedBy ? $t('account.authorized') : $t('account.rejected') }}
</span>
</template>
</div>
</template>

View file

@ -5,7 +5,7 @@ const { account } = defineProps<{
account: mastodon.v1.Account
}>()
const serverName = $computed(() => getServerName(account))
const serverName = computed(() => getServerName(account))
</script>
<template>

View file

@ -0,0 +1,276 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
const { account } = defineProps<{
account: mastodon.v1.Account
command?: boolean
}>()
const { client } = useMasto()
const { t } = useI18n()
const createdAt = useFormattedDateTime(() => account.createdAt, {
month: 'long',
day: 'numeric',
year: 'numeric',
})
const relationship = useRelationship(account)
const namedFields = ref<mastodon.v1.AccountField[]>([])
const iconFields = ref<mastodon.v1.AccountField[]>([])
const isEditingPersonalNote = ref<boolean>(false)
const hasHeader = computed(() => !account.header.endsWith('/original/missing.png'))
const isCopied = ref<boolean>(false)
function getFieldIconTitle(fieldName: string) {
return fieldName === 'Joined' ? t('account.joined') : fieldName
}
function getNotificationIconTitle() {
return relationship.value?.notifying ? t('account.notifications_on_post_disable', { username: `@${account.username}` }) : t('account.notifications_on_post_enable', { username: `@${account.username}` })
}
function previewHeader() {
openMediaPreview([{
id: `${account.acct}:header`,
type: 'image',
previewUrl: account.header,
description: t('account.profile_description', [account.username]),
}])
}
function previewAvatar() {
openMediaPreview([{
id: `${account.acct}:avatar`,
type: 'image',
previewUrl: account.avatar,
description: t('account.avatar_description', [account.username]),
}])
}
async function toggleNotifications() {
relationship.value!.notifying = !relationship.value?.notifying
try {
const newRel = await client.value.v1.accounts.$select(account.id).follow({ notify: relationship.value?.notifying })
Object.assign(relationship!, newRel)
}
catch {
// TODO error handling
relationship.value!.notifying = !relationship.value?.notifying
}
}
watchEffect(() => {
const named: mastodon.v1.AccountField[] = []
const icons: mastodon.v1.AccountField[] = []
account.fields?.forEach((field) => {
const icon = getAccountFieldIcon(field.name)
if (icon)
icons.push(field)
else
named.push(field)
})
icons.push({
name: 'Joined',
value: createdAt.value,
})
namedFields.value = named
iconFields.value = icons
})
const personalNoteDraft = ref(relationship.value?.note ?? '')
watch(relationship, (relationship, oldValue) => {
if (!oldValue && relationship)
personalNoteDraft.value = relationship.note ?? ''
})
async function editNote(event: Event) {
if (!event.target || !('value' in event.target) || !relationship.value)
return
const newNote = event.target?.value as string
if (relationship.value.note?.trim() === newNote.trim())
return
const newNoteApiResult = await client.value.v1.accounts.$select(account.id).note.create({ comment: newNote })
relationship.value.note = newNoteApiResult.note
personalNoteDraft.value = relationship.value.note ?? ''
}
const isSelf = useSelfAccount(() => account)
const isNotifiedOnPost = computed(() => !!relationship.value?.notifying)
const personalNoteMaxLength = 2000
async function copyAccountName() {
try {
const shortHandle = getShortHandle(account)
const serverName = getServerName(account)
const accountName = `${shortHandle}@${serverName}`
await navigator.clipboard.writeText(accountName)
}
catch (err) {
console.error('Failed to copy account name:', err)
}
isCopied.value = true
setTimeout(() => {
isCopied.value = false
}, 2000)
}
</script>
<template>
<div flex flex-col>
<div v-if="relationship?.requestedBy" p-4 flex justify-between items-center bg-card>
<span text-primary font-bold>{{ $t('account.requested', [account.displayName]) }}</span>
<AccountFollowRequestButton :account="account" :relationship="relationship" />
</div>
<component :is="hasHeader ? 'button' : 'div'" border="b base" z-1 @click="hasHeader ? previewHeader() : undefined">
<img h-50 height="200" w-full object-cover :src="account.header" :alt="t('account.profile_description', [account.username])">
</component>
<div p4 mt--18 flex flex-col gap-4>
<div relative>
<div flex justify-between>
<button shrink-0 h-full :class="{ 'rounded-full': !isSelf, 'squircle': isSelf }" p1 bg-base border-bg-base z-2 @click="previewAvatar">
<AccountAvatar :square="isSelf" :account="account" hover:opacity-90 transition-opacity w-28 h-28 />
</button>
<div inset-ie-0 flex="~ wrap row-reverse" gap-2 items-center pt18 justify-start>
<!-- Edit profile -->
<NuxtLink
v-if="isSelf"
to="/settings/profile/appearance"
gap-1 items-center border="1" rounded-full flex="~ gap2 center" font-500 min-w-30 h-fit px3 py1
hover="border-primary text-primary bg-active"
>
{{ $t('settings.profile.appearance.title') }}
</NuxtLink>
<AccountFollowButton :account="account" :command="command" />
<span inset-ie-0 flex gap-2 items-center>
<AccountMoreButton
:account="account" :command="command"
@add-note="isEditingPersonalNote = true"
@remove-note="() => { isEditingPersonalNote = false; personalNoteDraft = '' }"
/>
<CommonTooltip v-if="!isSelf && relationship?.following" :content="getNotificationIconTitle()">
<button
:aria-pressed="isNotifiedOnPost"
:aria-label="t('account.notifications_on_post_enable', { username: `@${account.username}` })"
rounded-full text-sm p2 border-1 transition-colors
:class="isNotifiedOnPost ? 'text-primary border-primary hover:bg-red/20 hover:text-red hover:border-red' : 'border-base hover:text-primary'"
@click="toggleNotifications"
>
<span v-if="isNotifiedOnPost" i-ri:notification-4-fill block text-current />
<span v-else i-ri-notification-4-line block text-current />
</button>
</CommonTooltip>
<CommonTooltip :content="$t('list.modify_account')">
<VDropdown v-if="!isSelf && relationship?.following">
<button
:aria-label="$t('list.modify_account')"
rounded-full text-sm p2 border-1 transition-colors
border-base hover:text-primary
>
<span i-ri:play-list-add-fill block text-current />
</button>
<template #popper>
<ListLists :user-id="account.id" />
</template>
</VDropdown>
</CommonTooltip>
</span>
</div>
</div>
<div flex="~ col gap1" pt2>
<div flex gap2 items-center flex-wrap>
<AccountDisplayName :account="account" font-bold sm:text-2xl text-xl />
<AccountLockIndicator v-if="account.locked" show-label />
<AccountBotIndicator v-if="account.bot" show-label />
</div>
<div flex items-center gap-1>
<AccountHandle :account="account" overflow-unset line-clamp-unset />
<CommonTooltip placement="bottom" :content="$t('account.copy_account_name')" flex>
<button text-secondary-light text-sm :class="isCopied ? 'i-ri:check-fill text-green' : 'i-ri:file-copy-line'" @click="copyAccountName">
<span sr-only>{{ $t('account.copy_account_name') }}</span>
</button>
</CommonTooltip>
</div>
<div self-start mt-1>
<AccountRolesIndicator v-if="account.roles?.length" :account="account" />
</div>
</div>
</div>
<label
v-if="isEditingPersonalNote || (relationship?.note && relationship.note.length > 0)"
space-y-2
pb-4
block
border="b base"
>
<div flex flex-row space-x-2 flex-v-center>
<div i-ri-edit-2-line />
<p font-medium>
{{ $t('account.profile_personal_note') }}
</p>
<p text-secondary text-sm :class="{ 'text-orange': personalNoteDraft.length > (personalNoteMaxLength - 100) }">
{{ personalNoteDraft.length }} / {{ personalNoteMaxLength }}
</p>
</div>
<div position-relative>
<div
input-base
min-h-10ex
whitespace-pre-wrap
opacity-0
:class="{ 'trailing-newline': personalNoteDraft.endsWith('\n') }"
>
{{ personalNoteDraft }}
</div>
<textarea
v-model="personalNoteDraft"
input-base
position-absolute
style="height: 100%"
top-0
resize-none
:maxlength="personalNoteMaxLength"
@change="editNote"
/>
</div>
</label>
<div v-if="account.note" max-h-100 overflow-y-auto>
<ContentRich text-4 text-base :content="account.note" :emojis="account.emojis" />
</div>
<div v-if="namedFields.length" flex="~ col wrap gap1">
<div v-for="field in namedFields" :key="field.name" flex="~ gap-1" items-center>
<div mt="0.5" text-secondary uppercase text-xs font-bold>
<ContentRich :content="field.name" :emojis="account.emojis" />
</div>
<span text-secondary text-xs font-bold>|</span>
<ContentRich :content="field.value" :emojis="account.emojis" />
</div>
</div>
<div v-if="iconFields.length" flex="~ wrap gap-2">
<div v-for="field in iconFields" :key="field.name" flex="~ gap-1" px1 items-center :class="`${field.verifiedAt ? 'border-1 rounded-full border-dark' : ''}`">
<CommonTooltip :content="getFieldIconTitle(field.name)">
<div text-secondary :class="getAccountFieldIcon(field.name)" :title="getFieldIconTitle(field.name)" />
</CommonTooltip>
<ContentRich text-sm :content="field.value" :emojis="account.emojis" />
</div>
</div>
<AccountPostsFollowers :account="account" />
</div>
</div>
</template>
<style>
.trailing-newline::after {
content: '\a';
}
</style>

View file

@ -5,20 +5,20 @@ const { account } = defineProps<{
account: mastodon.v1.Account
}>()
const relationship = $(useRelationship(account))
const relationship = useRelationship(account)
</script>
<template>
<div v-show="relationship" flex="~ col gap2" rounded min-w-90 max-w-120 z-100 overflow-hidden p-4>
<div flex="~ gap2" items-center>
<NuxtLink :to="getAccountRoute(account)" flex-auto rounded-full hover:bg-active transition-100 pe5 me-a>
<AccountInfo :account="account" />
<AccountInfo :account="account" :hover-card="false" />
</NuxtLink>
<AccountFollowButton text-sm :account="account" :relationship="relationship" />
</div>
<div v-if="account.note" max-h-100 overflow-y-auto>
<ContentRich text-4 text-secondary :content="account.note" :emojis="account.emojis" />
</div>
<AccountPostsFollowers text-sm :account="account" />
<AccountPostsFollowers text-sm :account="account" :is-hover-card="true" />
</div>
</template>

View file

@ -0,0 +1,70 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
import { fetchAccountByHandle } from '~/composables/cache'
type WatcherType = [acc?: mastodon.v1.Account | null, h?: string, v?: boolean]
defineOptions({
inheritAttrs: false,
})
const props = defineProps<{
account?: mastodon.v1.Account | null
handle?: string
disabled?: boolean
}>()
const accountHover = ref()
const hovered = useElementHover(accountHover)
const account = ref<mastodon.v1.Account | null | undefined>(props.account)
watch(
() => [props.account, props.handle, hovered.value] satisfies WatcherType,
([newAccount, newHandle, newVisible], oldProps) => {
if (!newVisible || process.test)
return
if (newAccount) {
account.value = newAccount
return
}
if (newHandle) {
const [_oldAccount, oldHandle, _oldVisible] = oldProps ?? [undefined, undefined, false]
if (!oldHandle || newHandle !== oldHandle || !account.value) {
// new handle can be wrong: using server instead of webDomain
fetchAccountByHandle(newHandle).then((acc) => {
if (newHandle === props.handle)
account.value = acc
})
}
return
}
account.value = undefined
},
{ immediate: true, flush: 'post' },
)
const userSettings = useUserSettings()
</script>
<template>
<span ref="accountHover">
<VMenu
v-if="!disabled && account && !getPreferences(userSettings, 'hideAccountHoverCard')"
placement="bottom-start"
:delay="{ show: 500, hide: 100 }"
v-bind="$attrs"
:close-on-content-click="false"
no-auto-focus
>
<slot />
<template #popper>
<AccountHoverCard v-if="account" :account="account" />
</template>
</VMenu>
<slot v-else />
</span>
</template>

View file

@ -1,31 +1,35 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
const { account, as = 'div' } = defineProps<{
defineOptions({
inheritAttrs: false,
})
const { as = 'div' } = defineProps<{
account: mastodon.v1.Account
as?: string
hoverCard?: boolean
square?: boolean
}>()
defineOptions({
inheritAttrs: false,
})
</script>
<!-- TODO: Make this work for both buttons and links -->
<!-- This is sometimes (like in the sidebar) used directly as a button, and sometimes, like in follow notifications, as a link. I think this component may need a second refactor that either lets an implementation pass in a link or an action and adapt to what's passed in, or the implementations need to be updated to wrap in the action they want to take and this be just the layout for these items -->
<template>
<component :is="as" flex gap-3 v-bind="$attrs">
<component :is="as" flex items-center gap-3 v-bind="$attrs">
<AccountHoverWrapper :disabled="!hoverCard" :account="account">
<AccountBigAvatar :account="account" shrink-0 :square="square" />
</AccountHoverWrapper>
<div flex="~ col" shrink pt-1 h-full overflow-hidden justify-center leading-none select-none>
<div flex="~ col" shrink h-full overflow-hidden justify-center leading-none select-none p-1>
<div flex="~" gap-2>
<AccountDisplayName :account="account" font-bold line-clamp-1 ws-pre-wrap break-all text-lg />
<AccountLockIndicator v-if="account.locked" text-xs />
<AccountBotIndicator v-if="account.bot" text-xs />
</div>
<AccountHandle :account="account" text-secondary-light />
<div self-start mt-1>
<AccountRolesIndicator v-if="account.roles?.length" :account="account" :limit="1" />
</div>
</div>
</component>
</template>

View file

@ -6,17 +6,26 @@ const { link = true, avatar = true } = defineProps<{
link?: boolean
avatar?: boolean
}>()
const userSettings = useUserSettings()
</script>
<script lang="ts">
export default {
inheritAttrs: false,
}
</script>
<template>
<AccountHoverWrapper :account="account">
<NuxtLink
:to="link ? getAccountRoute(account) : undefined"
:class="link ? 'text-link-rounded -ml-1.8rem pl-1.8rem rtl-(ml0 pl-0.5rem -mr-1.8rem pr-1.8rem)' : ''"
:class="link ? 'text-link-rounded -ml-1.5rem pl-1.5rem rtl-(ml0 pl-0.5rem -mr-1.5rem pr-1.5rem)' : ''"
v-bind="$attrs"
min-w-0 flex gap-2 items-center
>
<AccountAvatar v-if="avatar" :account="account" w-5 h-5 />
<AccountDisplayName :account="account" line-clamp-1 ws-pre-wrap break-all />
<AccountDisplayName :account="account" :hide-emojis="getPreferences(userSettings, 'hideUsernameEmojis')" line-clamp-1 ws-pre-wrap break-all />
</NuxtLink>
</AccountHoverWrapper>
</template>

View file

@ -0,0 +1,23 @@
<script setup lang="ts">
defineProps<{
showLabel?: boolean
}>()
const { t } = useI18n()
</script>
<template>
<div
flex="~ gap1" items-center
:class="{ 'border border-base rounded-md px-1': showLabel }"
text-secondary-light
>
<slot name="prepend" />
<CommonTooltip content="Lock" :disabled="showLabel">
<div i-ri:lock-line />
</CommonTooltip>
<div v-if="showLabel">
{{ t('account.lock') }}
</div>
</div>
</template>

View file

@ -1,74 +1,63 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
import { toggleBlockAccount, toggleBlockDomain, toggleMuteAccount } from '~/composables/masto/relationship'
const { account } = defineProps<{
account: mastodon.v1.Account
command?: boolean
}>()
let relationship = $(useRelationship(account))
const emit = defineEmits<{
(evt: 'addNote'): void
(evt: 'removeNote'): void
}>()
const isSelf = $(useSelfAccount(() => account))
const relationship = useRelationship(account)
const isSelf = useSelfAccount(() => account)
const { t } = useI18n()
const { client } = $(useMasto())
const { client } = useMasto()
const useStarFavoriteIcon = usePreferences('useStarFavoriteIcon')
const { share, isSupported: isShareSupported } = useShare()
const toggleMute = async () => {
if (!relationship!.muting && await openConfirmDialog({
title: t('confirm.mute_account.title', [account.acct]),
confirm: t('confirm.mute_account.confirm'),
cancel: t('confirm.mute_account.cancel'),
}) !== 'confirm')
return
function shareAccount() {
share({ url: location.href })
}
relationship!.muting = !relationship!.muting
relationship = relationship!.muting
? await client.v1.accounts.mute(account.id, {
// TODO support more options
async function toggleReblogs() {
if (!relationship.value!.showingReblogs) {
const dialogChoice = await openConfirmDialog({
title: t('confirm.show_reblogs.title'),
description: t('confirm.show_reblogs.description', [account.acct]),
confirm: t('confirm.show_reblogs.confirm'),
cancel: t('confirm.show_reblogs.cancel'),
})
: await client.v1.accounts.unmute(account.id)
if (dialogChoice.choice !== 'confirm')
return
}
const showingReblogs = !relationship.value?.showingReblogs
relationship.value = await client.value.v1.accounts.$select(account.id).follow({ reblogs: showingReblogs })
}
const toggleBlockUser = async () => {
if (!relationship!.blocking && await openConfirmDialog({
title: t('confirm.block_account.title', [account.acct]),
confirm: t('confirm.block_account.confirm'),
cancel: t('confirm.block_account.cancel'),
}) !== 'confirm')
return
relationship!.blocking = !relationship!.blocking
relationship = await client.v1.accounts[relationship!.blocking ? 'block' : 'unblock'](account.id)
async function addUserNote() {
emit('addNote')
}
const toggleBlockDomain = async () => {
if (!relationship!.domainBlocking && await openConfirmDialog({
title: t('confirm.block_domain.title', [getServerName(account)]),
confirm: t('confirm.block_domain.confirm'),
cancel: t('confirm.block_domain.cancel'),
}) !== 'confirm')
async function removeUserNote() {
if (!relationship.value!.note || relationship.value!.note.length === 0)
return
relationship!.domainBlocking = !relationship!.domainBlocking
await client.v1.domainBlocks[relationship!.domainBlocking ? 'block' : 'unblock'](getServerName(account))
}
const toggleReblogs = async () => {
if (!relationship!.showingReblogs && await openConfirmDialog({
title: t('confirm.show_reblogs.title', [account.acct]),
confirm: t('confirm.show_reblogs.confirm'),
cancel: t('confirm.show_reblogs.cancel'),
}) !== 'confirm')
return
const showingReblogs = !relationship?.showingReblogs
relationship = await client.v1.accounts.follow(account.id, { reblogs: showingReblogs })
const newNote = await client.value.v1.accounts.$select(account.id).note.create({ comment: '' })
relationship.value!.note = newNote.note
emit('removeNote')
}
</script>
<template>
<CommonDropdown :eager-mount="command">
<button flex gap-1 items-center w-full rounded op75 hover="op100 text-purple" group aria-label="More actions">
<div rounded-5 p2 group-hover="bg-purple/10">
<button flex gap-1 items-center w-full rounded op75 hover="op100 text-purple" group :aria-label="t('actions.more')">
<div rounded-5 p2 elk-group-hover="bg-purple/10">
<div i-ri:more-2-fill />
</div>
</button>
@ -81,16 +70,26 @@ const toggleReblogs = async () => {
:command="command"
/>
</NuxtLink>
<CommonDropdownItem
is="button"
v-if="isShareSupported"
:text="$t('menu.share_account', [`@${account.acct}`])"
icon="i-ri:share-line"
:command="command"
@click="shareAccount()"
/>
<template v-if="currentUser">
<template v-if="!isSelf">
<CommonDropdownItem
is="button"
:text="$t('menu.mention_account', [`@${account.acct}`])"
icon="i-ri:at-line"
:command="command"
@click="mentionUser(account)"
/>
<CommonDropdownItem
is="button"
:text="$t('menu.direct_message_account', [`@${account.acct}`])"
icon="i-ri:message-3-line"
:command="command"
@ -98,6 +97,7 @@ const toggleReblogs = async () => {
/>
<CommonDropdownItem
is="button"
v-if="!relationship?.showingReblogs"
icon="i-ri:repeat-line"
:text="$t('menu.show_reblogs', [`@${account.acct}`])"
@ -105,6 +105,7 @@ const toggleReblogs = async () => {
@click="toggleReblogs()"
/>
<CommonDropdownItem
is="button"
v-else
:text="$t('menu.hide_reblogs', [`@${account.acct}`])"
icon="i-ri:repeat-line"
@ -113,51 +114,82 @@ const toggleReblogs = async () => {
/>
<CommonDropdownItem
v-if="!relationship?.muting"
:text="$t('menu.mute_account', [`@${account.acct}`])"
icon="i-ri:volume-up-fill"
is="button"
v-if="!relationship?.note || relationship?.note?.length === 0"
:text="$t('menu.add_personal_note', [`@${account.acct}`])"
icon="i-ri-edit-2-line"
:command="command"
@click="toggleMute()"
@click="addUserNote()"
/>
<CommonDropdownItem
is="button"
v-else
:text="$t('menu.unmute_account', [`@${account.acct}`])"
icon="i-ri:volume-mute-line"
:text="$t('menu.remove_personal_note', [`@${account.acct}`])"
icon="i-ri-edit-2-line"
:command="command"
@click="toggleMute()"
@click="removeUserNote()"
/>
<CommonDropdownItem
is="button"
v-if="!relationship?.muting"
:text="$t('menu.mute_account', [`@${account.acct}`])"
icon="i-ri:volume-mute-line"
:command="command"
@click="toggleMuteAccount (relationship!, account)"
/>
<CommonDropdownItem
is="button"
v-else
:text="$t('menu.unmute_account', [`@${account.acct}`])"
icon="i-ri:volume-up-fill"
:command="command"
@click="toggleMuteAccount (relationship!, account)"
/>
<CommonDropdownItem
is="button"
v-if="!relationship?.blocking"
:text="$t('menu.block_account', [`@${account.acct}`])"
icon="i-ri:forbid-2-line"
:command="command"
@click="toggleBlockUser()"
@click="toggleBlockAccount (relationship!, account)"
/>
<CommonDropdownItem
is="button"
v-else
:text="$t('menu.unblock_account', [`@${account.acct}`])"
icon="i-ri:checkbox-circle-line"
:command="command"
@click="toggleBlockUser()"
@click="toggleBlockAccount (relationship!, account)"
/>
<template v-if="getServerName(account) !== currentServer">
<CommonDropdownItem
is="button"
v-if="!relationship?.domainBlocking"
:text="$t('menu.block_domain', [getServerName(account)])"
icon="i-ri:shut-down-line"
:command="command"
@click="toggleBlockDomain()"
@click="toggleBlockDomain(relationship!, account)"
/>
<CommonDropdownItem
is="button"
v-else
:text="$t('menu.unblock_domain', [getServerName(account)])"
icon="i-ri:restart-line"
:command="command"
@click="toggleBlockDomain()"
@click="toggleBlockDomain(relationship!, account)"
/>
</template>
<CommonDropdownItem
is="button"
:text="$t('menu.report_account', [`@${account.acct}`])"
icon="i-ri:flag-2-line"
:command="command"
@click="openReportDialog(account)"
/>
</template>
<template v-else>
@ -165,7 +197,7 @@ const toggleReblogs = async () => {
<CommonDropdownItem :text="$t('account.pinned')" icon="i-ri:pushpin-line" :command="command" />
</NuxtLink>
<NuxtLink to="/favourites">
<CommonDropdownItem :text="$t('account.favourites')" icon="i-ri:heart-3-line" :command="command" />
<CommonDropdownItem :text="$t('account.favourites')" :icon="useStarFavoriteIcon ? 'i-ri:star-line' : 'i-ri:heart-3-line'" :command="command" />
</NuxtLink>
<NuxtLink to="/mutes">
<CommonDropdownItem :text="$t('account.muted_users')" icon="i-ri:volume-mute-line" :command="command" />

View file

@ -1,17 +1,17 @@
<script setup lang="ts">
import type { Paginator, mastodon } from 'masto'
import type { mastodon } from 'masto'
const { paginator, account, context } = defineProps<{
paginator: Paginator<mastodon.v1.Account[], mastodon.DefaultPaginationParams>
const { account, context } = defineProps<{
paginator: mastodon.Paginator<mastodon.v1.Account[], mastodon.DefaultPaginationParams | undefined>
context?: 'following' | 'followers'
account?: mastodon.v1.Account
relationshipContext?: 'followedBy' | 'following'
}>()
const fallbackContext = $computed(() => {
const fallbackContext = computed(() => {
return ['following', 'followers'].includes(context!)
})
const showOriginSite = $computed(() =>
const showOriginSite = computed(() =>
account && account.id !== currentUser.value?.account.id && getServerName(account) !== currentServer.value,
)
</script>

View file

@ -0,0 +1,78 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
defineProps<{
account: mastodon.v1.Account
isHoverCard?: boolean
}>()
const userSettings = useUserSettings()
</script>
<template>
<div flex gap-5>
<NuxtLink
:to="getAccountRoute(account)"
replace
text-secondary
exact-active-class="text-primary"
>
<template #default="{ isExactActive }">
<CommonLocalizedNumber
keypath="account.posts_count"
:count="account.statusesCount"
font-bold
:class="isExactActive ? 'text-primary' : 'text-base'"
/>
</template>
</NuxtLink>
<NuxtLink
v-if="!(isHoverCard && getPreferences(userSettings, 'hideFollowerCount'))"
:to="getAccountFollowingRoute(account)"
replace
text-secondary exact-active-class="text-primary"
>
<template #default="{ isExactActive }">
<template
v-if="!getPreferences(userSettings, 'hideFollowerCount')"
>
<CommonLocalizedNumber
v-if="account.followingCount >= 0"
keypath="account.following_count"
:count="account.followingCount"
font-bold
:class="isExactActive ? 'text-primary' : 'text-base'"
/>
<div v-else flex gap-x-1>
<span font-bold text-base>Hidden</span>
<span>{{ $t('account.following') }}</span>
</div>
</template>
<span v-else>{{ $t('account.following') }}</span>
</template>
</NuxtLink>
<NuxtLink
v-if="!(isHoverCard && getPreferences(userSettings, 'hideFollowerCount'))"
:to="getAccountFollowersRoute(account)"
replace text-secondary
exact-active-class="text-primary"
>
<template #default="{ isExactActive }">
<template v-if="!getPreferences(userSettings, 'hideFollowerCount')">
<CommonLocalizedNumber
v-if="account.followersCount >= 0"
keypath="account.followers_count"
:count="account.followersCount"
font-bold
:class="isExactActive ? 'text-primary' : 'text-base'"
/>
<div v-else flex gap-x-1>
<span font-bold text-base>Hidden</span>
<span>{{ $t('account.followers') }}</span>
</div>
</template>
<span v-else>{{ $t('account.followers') }}</span>
</template>
</NuxtLink>
</div>
</template>

View file

@ -0,0 +1,31 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
defineProps<{
account: mastodon.v1.Account
limit?: number
}>()
</script>
<template>
<div
flex="~ gap1" items-center
class="border border-base rounded-md px-1"
text-secondary-light
>
<slot name="prepend" />
<div v-for="role in account.roles?.slice(0, limit)" :key="role.id" flex>
<div :style="`color: ${role.color}; border-color: ${role.color}`">
{{ role.name }}
</div>
</div>
</div>
<div
v-if="limit && account.roles?.length > limit"
flex="~ gap1" items-center
class="border border-base rounded-md px-1"
text-secondary-light
>
+{{ account.roles?.length - limit }}
</div>
</template>

View file

@ -1,16 +1,18 @@
<script setup lang="ts">
import type { CommonRouteTabOption } from '#shared/types'
const { t } = useI18n()
const route = useRoute()
const server = $(computedEager(() => route.params.server as string))
const account = $(computedEager(() => route.params.account as string))
const server = computed(() => route.params.server as string)
const account = computed(() => route.params.account as string)
const tabs = $computed(() => [
const tabs = computed<CommonRouteTabOption[]>(() => [
{
name: 'account-index',
to: {
name: 'account-index',
params: { server, account },
params: { server: server.value, account: account.value },
},
display: t('tab.posts'),
icon: 'i-ri:file-list-2-line',
@ -19,7 +21,7 @@ const tabs = $computed(() => [
name: 'account-replies',
to: {
name: 'account-replies',
params: { server, account },
params: { server: server.value, account: account.value },
},
display: t('tab.posts_with_replies'),
icon: 'i-ri:chat-1-line',
@ -28,12 +30,12 @@ const tabs = $computed(() => [
name: 'account-media',
to: {
name: 'account-media',
params: { server, account },
params: { server: server.value, account: account.value },
},
display: t('tab.media'),
icon: 'i-ri:camera-2-line',
},
] as const)
])
</script>
<template>

View file

@ -0,0 +1,46 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
defineOptions({
inheritAttrs: false,
})
const { tagName } = defineProps<{
tagName?: string
disabled?: boolean
}>()
const tag = ref<mastodon.v1.Tag>()
const tagHover = ref()
const hovered = useElementHover(tagHover)
watch(hovered, (newHovered) => {
if (newHovered && tagName) {
fetchTag(tagName).then((t) => {
tag.value = t
})
}
})
const userSettings = useUserSettings()
</script>
<template>
<span ref="tagHover">
<VMenu
v-if="!disabled && !getPreferences(userSettings, 'hideTagHoverCard')"
placement="bottom-start"
:delay="{ show: 500, hide: 100 }"
v-bind="$attrs"
:close-on-content-click="false"
no-auto-focus
>
<slot />
<template #popper>
<TagCardSkeleton v-if="!tag" />
<TagCard v-else :tag="tag" />
</template>
</VMenu>
<slot v-else />
</span>
</template>

View file

@ -1,6 +1,6 @@
<script setup lang="ts">
import type { LocaleObject } from '@nuxtjs/i18n'
import type { AriaAnnounceType, AriaLive } from '~/composables/aria'
import type { LocaleObject } from '#i18n'
const router = useRouter()
const { t, locale, locales } = useI18n()
@ -11,16 +11,16 @@ const localeMap = (locales.value as LocaleObject[]).reduce((acc, l) => {
return acc
}, {} as Record<string, string>)
let ariaLive = $ref<AriaLive>('polite')
let ariaMessage = $ref<string>('')
const ariaLive = ref<AriaLive>('polite')
const ariaMessage = ref<string>('')
const onMessage = (event: AriaAnnounceType, message?: string) => {
function onMessage(event: AriaAnnounceType, message?: string) {
if (event === 'announce')
ariaMessage = message!
ariaMessage.value = message!
else if (event === 'mute')
ariaLive = 'off'
ariaLive.value = 'off'
else
ariaLive = 'polite'
ariaLive.value = 'polite'
}
watch(locale, (l, ol) => {
@ -38,12 +38,14 @@ onMounted(() => {
announce(t('a11y.loading_page'))
})
router.afterEach((to, from) => {
from && setTimeout(() => {
requestAnimationFrame(() => {
const title = document.title.trim().split('|')
announce(t('a11y.route_loaded', [title[0]]))
})
}, 512)
if (from) {
setTimeout(() => {
requestAnimationFrame(() => {
const title = document.title.trim().split('|')
announce(t('a11y.route_loaded', [title[0]]))
})
}, 512)
}
})
})
</script>

View file

@ -1,17 +1,16 @@
<script setup lang="ts">
import type { AriaLive } from '~/composables/aria'
// tsc complaining when using $defineProps
withDefaults(defineProps<{
title: string
const {
ariaLive = 'polite',
heading = 'h2',
messageKey = (message: any) => message,
} = defineProps<{
ariaLive?: AriaLive
messageKey?: (message: any) => any
heading?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6'
}>(), {
heading: 'h2',
messageKey: (message: any) => message,
ariaLive: 'polite',
})
title: string
messageKey?: (message: any) => any
}>()
const { announceLogs, appendLogs, clearLogs, logs } = useAriaLog()

View file

@ -1,12 +1,9 @@
<script setup lang="ts">
import type { AriaLive } from '~/composables/aria'
// tsc complaining when using $defineProps
withDefaults(defineProps<{
const { ariaLive = 'polite' } = defineProps<{
ariaLive?: AriaLive
}>(), {
ariaLive: 'polite',
})
}>()
const { announceStatus, clearStatus, status } = useAriaStatus()

View file

@ -1,19 +1,15 @@
<script lang="ts" setup>
<script setup lang="ts">
import type { ResolvedCommand } from '~/composables/command'
const emit = defineEmits<{
(event: 'activate'): void
}>()
const {
cmd,
index,
active = false,
} = $defineProps<{
const { active = false } = defineProps<{
cmd: ResolvedCommand
index: number
active?: boolean
}>()
const emit = defineEmits<{
(event: 'activate'): void
}>()
</script>
<template>

View file

@ -1,11 +1,11 @@
<script setup lang="ts">
const props = defineProps<{
const { name } = defineProps<{
name: string
}>()
const isMac = useIsMac()
const keys = $computed(() => props.name.toLowerCase().split('+'))
const keys = computed(() => name.toLowerCase().split('+'))
</script>
<template>

View file

@ -1,6 +1,6 @@
<script setup lang="ts">
import type { SearchResult as SearchResultType } from '~/composables/masto/search'
import type { CommandScope, QueryResult, QueryResultItem } from '~/composables/command'
import type { SearchResult as SearchResultType } from '~/composables/masto/search'
const emit = defineEmits<{
(event: 'close'): void
@ -10,31 +10,33 @@ const registry = useCommandRegistry()
const router = useRouter()
const inputEl = $ref<HTMLInputElement>()
const resultEl = $ref<HTMLDivElement>()
const inputEl = ref<HTMLInputElement>()
const resultEl = ref<HTMLDivElement>()
const scopes = $ref<CommandScope[]>([])
let input = $(commandPanelInput)
const scopes = ref<CommandScope[]>([])
const input = commandPanelInput
onMounted(() => {
inputEl?.focus()
inputEl.value?.focus()
})
const commandMode = $computed(() => input.startsWith('>'))
const commandMode = computed(() => input.value.startsWith('>'))
const query = $computed(() => commandMode ? '' : input.trim())
const query = computed(() => commandMode.value ? '' : input.value.trim())
const { accounts, hashtags, loading } = useSearch($$(query))
const { accounts, hashtags, loading } = useSearch(query)
const toSearchQueryResultItem = (search: SearchResultType): QueryResultItem => ({
index: 0,
type: 'search',
search,
onActivate: () => router.push(search.to),
})
function toSearchQueryResultItem(search: SearchResultType): QueryResultItem {
return {
index: 0,
type: 'search',
search,
onActivate: () => router.push(search.to),
}
}
const searchResult = $computed<QueryResult>(() => {
if (query.length === 0 || loading.value)
const searchResult = computed<QueryResult>(() => {
if (query.value.length === 0 || loading.value)
return { length: 0, items: [], grouped: {} as any }
// TODO extract this scope
@ -59,52 +61,56 @@ const searchResult = $computed<QueryResult>(() => {
}
})
const result = $computed<QueryResult>(() => commandMode
? registry.query(scopes.map(s => s.id).join('.'), input.slice(1).trim())
: searchResult,
const result = computed<QueryResult>(() => commandMode.value
? registry.query(scopes.value.map(s => s.id).join('.'), input.value.slice(1).trim())
: searchResult.value,
)
let active = $ref(0)
watch($$(result), (n, o) => {
const isMac = useIsMac()
const modifierKeyName = computed(() => isMac.value ? '⌘' : 'Ctrl')
const active = ref(0)
watch(result, (n, o) => {
if (n.length !== o.length || !n.items.every((i, idx) => i === o.items[idx]))
active = 0
active.value = 0
})
const findItemEl = (index: number) =>
resultEl?.querySelector(`[data-index="${index}"]`) as HTMLDivElement | null
const onCommandActivate = (item: QueryResultItem) => {
function findItemEl(index: number) {
return resultEl.value?.querySelector(`[data-index="${index}"]`) as HTMLDivElement | null
}
function onCommandActivate(item: QueryResultItem) {
if (item.onActivate) {
item.onActivate()
emit('close')
}
else if (item.onComplete) {
scopes.push(item.onComplete())
input = '> '
scopes.value.push(item.onComplete())
input.value = '> '
}
}
const onCommandComplete = (item: QueryResultItem) => {
function onCommandComplete(item: QueryResultItem) {
if (item.onComplete) {
scopes.push(item.onComplete())
input = '> '
scopes.value.push(item.onComplete())
input.value = '> '
}
else if (item.onActivate) {
item.onActivate()
emit('close')
}
}
const intoView = (index: number) => {
function intoView(index: number) {
const el = findItemEl(index)
if (el)
el.scrollIntoView({ block: 'nearest' })
}
function setActive(index: number) {
const len = result.length
active = (index + len) % len
intoView(active)
const len = result.value.length
active.value = (index + len) % len
intoView(active.value)
}
const onKeyDown = (e: KeyboardEvent) => {
function onKeyDown(e: KeyboardEvent) {
switch (e.key) {
case 'p':
case 'ArrowUp': {
@ -112,7 +118,7 @@ const onKeyDown = (e: KeyboardEvent) => {
break
e.preventDefault()
setActive(active - 1)
setActive(active.value - 1)
break
}
@ -122,7 +128,7 @@ const onKeyDown = (e: KeyboardEvent) => {
break
e.preventDefault()
setActive(active + 1)
setActive(active.value + 1)
break
}
@ -130,9 +136,9 @@ const onKeyDown = (e: KeyboardEvent) => {
case 'Home': {
e.preventDefault()
active = 0
active.value = 0
intoView(active)
intoView(active.value)
break
}
@ -140,7 +146,7 @@ const onKeyDown = (e: KeyboardEvent) => {
case 'End': {
e.preventDefault()
setActive(result.length - 1)
setActive(result.value.length - 1)
break
}
@ -148,7 +154,7 @@ const onKeyDown = (e: KeyboardEvent) => {
case 'Enter': {
e.preventDefault()
const cmd = result.items[active]
const cmd = result.value.items[active.value]
if (cmd)
onCommandActivate(cmd)
@ -158,7 +164,7 @@ const onKeyDown = (e: KeyboardEvent) => {
case 'Tab': {
e.preventDefault()
const cmd = result.items[active]
const cmd = result.value.items[active.value]
if (cmd)
onCommandComplete(cmd)
@ -166,9 +172,9 @@ const onKeyDown = (e: KeyboardEvent) => {
}
case 'Backspace': {
if (input === '>' && scopes.length) {
if (input.value === '>' && scopes.value.length) {
e.preventDefault()
scopes.pop()
scopes.value.pop()
}
break
}
@ -233,8 +239,8 @@ const onKeyDown = (e: KeyboardEvent) => {
<!-- Footer -->
<div class="flex items-center px-3 py-1 text-xs">
<div i-ri:lightbulb-flash-line /> Tip: Use
<CommandKey name="Ctrl+K" /> to search,
<CommandKey name="Ctrl+/" /> to activate command mode.
<CommandKey :name="`${modifierKeyName}+K`" /> to search,
<CommandKey :name="`${modifierKeyName}+/`" /> to activate command mode.
</div>
</div>
</template>

View file

@ -1,10 +1,8 @@
<script lang="ts" setup>
<script setup lang="ts">
const emit = defineEmits<{
(event: 'close'): void
}>()
const { modelValue: visible } = defineModel<{
modelValue?: boolean
}>()
const visible = defineModel<boolean>()
function close() {
emit('close')

View file

@ -0,0 +1,16 @@
<script setup lang="ts">
defineOptions({
inheritAttrs: false,
})
const { blurhash = '', shouldLoadImage = true } = defineProps<{
blurhash?: string
src: string
srcset?: string
shouldLoadImage?: boolean
}>()
</script>
<template>
<UnLazyImage v-bind="$attrs" :blurhash="blurhash" :src="src" :src-set="srcset" :lazy-load="shouldLoadImage" auto-sizes />
</template>

View file

@ -1,22 +1,28 @@
<script setup lang="ts">
defineProps<{
label: string
label?: string
hover?: boolean
iconChecked?: string
iconUnchecked?: string
checkedIconColor?: string
prependCheckbox?: boolean
}>()
const { modelValue } = defineModel<{
modelValue: boolean
}>()
const modelValue = defineModel<boolean | null>()
</script>
<template>
<label
class="common-checkbox flex items-center cursor-pointer py-1 text-md w-full gap-y-1"
:class="hover ? 'hover:bg-active ms--2 px-4 py-2' : null"
v-bind="$attrs"
@click.prevent="modelValue = !modelValue"
>
<span flex-1 ms-2 pointer-events-none>{{ label }}</span>
<span v-if="label && !prependCheckbox" flex-1 ms-2 pointer-events-none>{{ label }}</span>
<span
:class="modelValue ? 'i-ri:checkbox-line' : 'i-ri:checkbox-blank-line'"
:class="[
modelValue ? (iconChecked ?? 'i-ri:checkbox-line') : (iconUnchecked ?? 'i-ri:checkbox-blank-line'),
modelValue && checkedIconColor,
]"
text-lg
aria-hidden="true"
/>
@ -25,6 +31,7 @@ const { modelValue } = defineModel<{
type="checkbox"
sr-only
>
<span v-if="label && prependCheckbox" flex-1 ms-2 pointer-events-none>{{ label }}</span>
</label>
</template>

View file

@ -1,39 +1,29 @@
<script lang="ts" setup>
<script setup lang="ts">
import type { Boundaries } from 'vue-advanced-cropper'
import { Cropper } from 'vue-advanced-cropper'
import 'vue-advanced-cropper/dist/style.css'
export interface Props {
const { stencilAspectRatio = 1 / 1, stencilSizePercentage = 0.9 } = defineProps<{
/** Crop frame aspect ratio (width/height), default 1/1 */
stencilAspectRatio?: number
/** The ratio of the longest edge of the cut box to the length of the cut screen, default 0.9, not more than 1 */
stencilSizePercentage?: number
}
const props = withDefaults(defineProps<Props>(), {
stencilAspectRatio: 1 / 1,
stencilSizePercentage: 0.9,
})
const { modelValue: file } = defineModel<{
/** Images to be cropped */
modelValue: File | null
}>()
const file = defineModel<File | null>()
const cropperDialog = ref(false)
const cropper = ref<InstanceType<typeof Cropper>>()
const cropperFlag = ref(false)
const cropperImage = reactive({
src: '',
type: 'image/jpg',
})
const stencilSize = ({ boundaries }: { boundaries: Boundaries }) => {
function stencilSize({ boundaries }: { boundaries: Boundaries }) {
return {
width: boundaries.width * props.stencilSizePercentage,
height: boundaries.height * props.stencilSizePercentage,
width: boundaries.width * stencilSizePercentage,
height: boundaries.height * stencilSizePercentage,
}
}
@ -55,7 +45,7 @@ watch(file, (file, _, onCleanup) => {
cropperFlag.value = false
})
const cropImage = () => {
function cropImage() {
if (cropper.value && file.value) {
cropperFlag.value = true
cropperDialog.value = false
@ -85,7 +75,7 @@ const cropImage = () => {
}"
:stencil-size="stencilSize"
:stencil-props="{
aspectRatio: props.stencilAspectRatio,
aspectRatio: stencilAspectRatio,
movable: false,
resizable: false,
handlers: {},

View file

@ -1,22 +1,18 @@
<script setup lang="ts">
defineProps<{
describedBy: string
}>()
defineOptions({
inheritAttrs: false,
})
defineProps<{ describedBy: string }>()
</script>
<template>
<div
role="alert"
aria-live="polite"
:aria-describedby="describedBy"
flex="~ col"
gap-1 text-sm
pt-1 ps-2 pe-1 pb-2
text-red-600 dark:text-red-400
border="~ base rounded red-600 dark:red-400"
v-bind="$attrs"
>
<slot />
</div>

View file

@ -1,50 +1,50 @@
<script lang="ts" setup>
import { fileOpen } from 'browser-fs-access'
<script setup lang="ts">
import type { FileWithHandle } from 'browser-fs-access'
import { fileOpen } from 'browser-fs-access'
const props = withDefaults(defineProps<{
const {
original,
allowedFileTypes = ['image/jpeg', 'image/png'],
allowedFileSize = 1024 * 1024 * 5, // 5 MB
} = defineProps<{
/** The image src before change */
original?: string
/** Allowed file types */
allowedFileTypes?: string[]
/** Allowed file size */
allowedFileSize?: number
imgClass?: string
loading?: boolean
}>(), {
allowedFileTypes: () => ['image/jpeg', 'image/png'],
allowedFileSize: 1024 * 1024 * 5, // 5 MB
})
}>()
const emit = defineEmits<{
(event: 'pick', value: FileWithHandle): void
(event: 'error', code: number, message: string): void
}>()
const { modelValue: file } = defineModel<{
modelValue: FileWithHandle | null
}>()
const file = defineModel<FileWithHandle | null>()
const { t } = useI18n()
const defaultImage = computed(() => props.original || '')
const defaultImage = computed(() => original || '')
/** Preview of selected images */
const previewImage = ref('')
/** The current images on display */
const imageSrc = computed<string>(() => previewImage.value || defaultImage.value)
const pickImage = async () => {
async function pickImage() {
if (import.meta.server)
return
const image = await fileOpen({
description: 'Image',
mimeTypes: props.allowedFileTypes,
mimeTypes: allowedFileTypes,
})
if (!props.allowedFileTypes.includes(image.type)) {
if (!allowedFileTypes.includes(image.type)) {
emit('error', 1, t('error.unsupported_file_format'))
return
}
else if (image.size > props.allowedFileSize) {
else if (image.size > allowedFileSize) {
emit('error', 2, t('error.file_size_cannot_exceed_n_mb', [5]))
return
}

View file

@ -2,7 +2,7 @@
const {
zIndex = 100,
background = 'transparent',
} = $defineProps<{
} = defineProps<{
zIndex?: number
background?: string
}>()

View file

@ -0,0 +1,121 @@
<script setup lang="ts" generic="T, O, U = T">
import type { mastodon } from 'masto'
// @ts-expect-error missing types
import { DynamicScroller } from 'vue-virtual-scroller'
import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
const {
paginator,
keyProp = 'id',
virtualScroller = false,
stream,
eventType,
preprocess,
endMessage = true,
} = defineProps<{
paginator: mastodon.Paginator<T[], O>
keyProp?: keyof T
virtualScroller?: boolean
stream?: mastodon.streaming.Subscription
eventType?: 'update' | 'notification'
preprocess?: (items: (U | T)[]) => U[]
endMessage?: boolean | string
}>()
defineSlots<{
default: (props: {
items: U[]
item: U
index: number
active?: boolean
older: U
newer: U // newer is undefined when index === 0
}) => void
items: (props: {
items: U[]
}) => void
updater: (props: {
number: number
update: () => void
}) => void
loading: (props: object) => void
done: (props: { items: U[] }) => void
}>()
const { t } = useI18n()
const nuxtApp = useNuxtApp()
const { items, prevItems, update, state, endAnchor, error } = usePaginator(paginator, toRef(() => stream), eventType, preprocess)
nuxtApp.hook('elk-logo:click', () => {
update()
nuxtApp.$scrollToTop()
})
function createEntry(item: any) {
items.value = [...items.value, preprocess?.([item]) ?? item]
}
function updateEntry(item: any) {
const id = item[keyProp]
const index = items.value.findIndex(i => (i as any)[keyProp] === id)
if (index > -1)
items.value = [...items.value.slice(0, index), preprocess?.([item]) ?? item, ...items.value.slice(index + 1)]
}
function removeEntry(entryId: any) {
items.value = items.value.filter(i => (i as any)[keyProp] !== entryId)
}
defineExpose({ createEntry, removeEntry, updateEntry })
</script>
<template>
<div>
<slot v-if="prevItems.length" name="updater" v-bind="{ number: prevItems.length, update }" />
<slot name="items" :items="items as U[]">
<template v-if="virtualScroller">
<DynamicScroller
v-slot="{ item, active, index }"
:items="items"
:min-item-size="200"
:key-field="keyProp"
page-mode
>
<slot
v-bind="{ key: item[keyProp] }"
:item="item"
:active="active"
:older="items[index + 1] as U"
:newer="items[index - 1] as U"
:index="index"
:items="items as U[]"
/>
</DynamicScroller>
</template>
<template v-else>
<slot
v-for="(item, index) of items"
v-bind="{ key: (item as U)[keyProp as keyof U] }"
:item="item as U"
:older="items[index + 1] as U"
:newer="items[index - 1] as U"
:index="index"
:items="items as U[]"
/>
</template>
</slot>
<div ref="endAnchor" />
<slot v-if="state === 'loading'" name="loading">
<TimelineSkeleton />
</slot>
<slot v-else-if="state === 'done' && endMessage !== false" name="done" :items="items as U[]">
<div p5 text-secondary italic text-center>
{{ t(typeof endMessage === 'string' && items.length <= 0 ? endMessage : 'common.end_of_list') }}
</div>
</slot>
<div v-else-if="state === 'error'" p5 text-secondary>
{{ t('common.error') }}: {{ error }}
</div>
</div>
</template>

View file

@ -14,7 +14,7 @@ const build = useBuildInfo()
<p>
<i18n-t keypath="help.build_preview.desc1">
<NuxtLink :href="`https://github.com/elk-zone/elk/commit/${build.commit}`" target="_blank" text-rose hover:underline>
<code>{{ build.commit.slice(0, 7) }}</code>
<code>{{ build.shortCommit }}</code>
</NuxtLink>
</i18n-t>
</p>

View file

@ -4,9 +4,7 @@ defineProps<{
value: any
hover?: boolean
}>()
const { modelValue } = defineModel<{
modelValue: any
}>()
const modelValue = defineModel()
</script>
<template>

View file

@ -0,0 +1,86 @@
<script setup lang="ts">
import type { CommonRouteTabMoreOption, CommonRouteTabOption } from '#shared/types'
const { options, command, preventScrollTop = false } = defineProps<{
options: CommonRouteTabOption[]
moreOptions?: CommonRouteTabMoreOption
command?: boolean
replace?: boolean
preventScrollTop?: boolean
}>()
const { t } = useI18n()
const router = useRouter()
useCommands(() => command
? options.map(tab => ({
scope: 'Tabs',
name: tab.display,
icon: tab.icon ?? 'i-ri:file-list-2-line',
onActivate: () => router.replace(tab.to),
}))
: [])
</script>
<template>
<div flex w-full items-center lg:text-lg of-x-auto scrollbar-hide border="b base">
<template
v-for="(option, index) in options.filter(item => !item.hide)"
:key="option?.name || index"
>
<NuxtLink
v-if="!option.disabled"
:to="option.to"
:replace="replace"
relative flex flex-auto cursor-pointer sm:px6 px2 rounded transition-all
tabindex="0"
hover:bg-active transition-100
exact-active-class="children:(text-secondary !border-primary !op100 !text-base)"
@click="!preventScrollTop && $scrollToTop()"
>
<span ws-nowrap mxa sm:px2 sm:py3 xl:pb4 xl:pt5 py2 text-center border-b-3 text-secondary-light hover:text-secondary border-transparent>{{ option.display || '&nbsp;' }}</span>
</NuxtLink>
<div v-else flex flex-auto sm:px6 px2 xl:pb4 xl:pt5>
<span ws-nowrap mxa sm:px2 sm:py3 py2 text-center text-secondary-light op50>{{ option.display }}</span>
</div>
</template>
<template v-if="isHydrated && moreOptions?.options?.length">
<CommonDropdown placement="bottom" flex cursor-pointer mx-1.25rem>
<CommonTooltip placement="top" :content="moreOptions.tooltip || t('action.more')">
<button
cursor-pointer
flex
gap-1
w-12
rounded
hover:bg-active
btn-action-icon
op75
px4
group
:aria-label="t('action.more')"
:class="moreOptions.match ? 'text-primary' : 'text-secondary'"
>
<span v-if="moreOptions.icon" :class="moreOptions.icon" text-sm me--1 block />
<span i-ri:arrow-down-s-line text-sm me--1 block />
</button>
</CommonTooltip>
<template #popper>
<NuxtLink
v-for="(option, index) in moreOptions.options.filter(item => !item.hide)"
:key="option?.name || index"
:to="option.to"
>
<CommonDropdownItem>
<span flex="~ row" gap-x-4 items-center :class="option.match ? 'text-primary' : ''">
<span v-if="option.icon" :class="[option.icon, option.match ? 'text-primary' : 'text.secondary']" text-md me--1 block />
<span v-else block>&#160;</span>
<span>{{ option.display }}</span>
</span>
</CommonDropdownItem>
</NuxtLink>
</template>
</commondropdown>
</template>
</div>
</template>

View file

@ -1,5 +1,9 @@
<script setup lang="ts">
const { as = 'div', active } = defineProps<{ as: any; active: boolean }>()
const { as = 'div', active } = defineProps<{
as?: string
active: boolean
}>()
const el = ref()
watch(() => active, (active) => {

View file

@ -8,11 +8,9 @@ const { options, command } = defineProps<{
command?: boolean
}>()
const { modelValue } = defineModel<{
modelValue: string
}>()
const modelValue = defineModel<string>({ required: true })
const tabs = $computed(() => {
const tabs = computed(() => {
return options.map((option) => {
if (typeof option === 'string')
return { name: option, display: option }
@ -21,19 +19,19 @@ const tabs = $computed(() => {
})
})
function toValidName(otpion: string) {
return otpion.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-')
function toValidName(option: string) {
return option.toLowerCase().replace(/[^a-z0-9]/gi, '-')
}
useCommands(() => command
? tabs.map(tab => ({
scope: 'Tabs',
? tabs.value.map(tab => ({
scope: 'Tabs',
name: tab.display,
icon: tab.icon ?? 'i-ri:file-list-2-line',
name: tab.display,
icon: tab.icon ?? 'i-ri:file-list-2-line',
onActivate: () => modelValue.value = tab.name,
}))
onActivate: () => modelValue.value = tab.name,
}))
: [])
</script>
@ -51,7 +49,7 @@ useCommands(() => command
><label
flex flex-auto cursor-pointer px3 m1 rounded transition-all
:for="`tab-${toValidName(option.name)}`"
tabindex="1"
tabindex="0"
hover:bg-active transition-100
@keypress.enter="modelValue = option.name"
><span

View file

@ -1,15 +1,19 @@
<script setup lang="ts">
import type { Popper as VTooltipType } from 'floating-vue/dist'
import type { Popper as VTooltipType } from 'floating-vue'
defineProps<{
export interface Props extends Partial<typeof VTooltipType> {
content?: string
} & Partial<typeof VTooltipType>>()
}
defineProps<Props>()
</script>
<template>
<VTooltip
v-if="isHydrated"
v-bind="$attrs"
auto-hide
no-auto-focus
>
<slot />
<template #popper>

View file

@ -0,0 +1,23 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
const {
history,
maxDay = 2,
} = defineProps<{
history: mastodon.v1.TagHistory[]
maxDay?: number
}>()
const ongoingHot = computed(() => history.slice(0, maxDay))
const people = computed(() =>
ongoingHot.value.reduce((total: number, item) => total + (Number(item.accounts) || 0), 0),
)
</script>
<template>
<p>
{{ $t('command.n_people_in_the_past_n_days', [people, maxDay]) }}
</p>
</template>

View file

@ -1,4 +1,4 @@
<script lang="ts" setup>
<script setup lang="ts">
import type { mastodon } from 'masto'
import sparkline from '@fnando/sparkline'
@ -6,22 +6,22 @@ const {
history,
width = 60,
height = 40,
} = $defineProps<{
} = defineProps<{
history?: mastodon.v1.TagHistory[]
width?: number
height?: number
}>()
const historyNum = $computed(() => {
const historyNum = computed(() => {
if (!history)
return [1, 1, 1, 1, 1, 1, 1]
return [...history].reverse().map(item => Number(item.accounts) || 0)
})
const sparklineEl = $ref<SVGSVGElement>()
const sparklineEl = ref<SVGSVGElement>()
const sparklineFn = typeof sparkline !== 'function' ? (sparkline as any).default : sparkline
watch([$$(historyNum), $$(sparklineEl)], ([historyNum, sparklineEl]) => {
watch([historyNum, sparklineEl], ([historyNum, sparklineEl]) => {
if (!sparklineEl)
return
sparklineFn(sparklineEl, historyNum)

View file

@ -1,18 +1,18 @@
<script setup lang="ts">
const props = defineProps<{
count: number
keypath: string
}>()
defineOptions({
inheritAttrs: false,
})
const { count } = defineProps<{
count: number
keypath: string
}>()
const { formatHumanReadableNumber, formatNumber, forSR } = useHumanReadableNumber()
const useSR = $computed(() => forSR(props.count))
const rawNumber = $computed(() => formatNumber(props.count))
const humanReadableNumber = $computed(() => formatHumanReadableNumber(props.count))
const useSR = computed(() => forSR(count))
const rawNumber = computed(() => formatNumber(count))
const humanReadableNumber = computed(() => formatHumanReadableNumber(count))
</script>
<template>

View file

@ -6,10 +6,12 @@ defineProps<{
autoBoundaryMaxSize?: boolean
}>()
const dropdown = $ref<any>()
const dropdown = ref<any>()
const colorMode = useColorMode()
const hide = () => dropdown.hide()
function hide() {
return dropdown.value.hide()
}
provide(InjectionKeyDropdownContext, {
hide,
})

View file

@ -1,21 +1,28 @@
<script setup lang="ts">
const props = withDefaults(defineProps<{
const {
is = 'div',
text,
description,
icon,
command,
} = defineProps<{
is?: string
text?: string
description?: string
icon?: string
checked?: boolean
command?: boolean
}>(), {
is: 'div',
})
}>()
const emit = defineEmits(['click'])
const type = computed(() => is === 'button' ? 'button' : null)
const { hide } = useDropdownContext() || {}
const el = ref<HTMLDivElement>()
const handleClick = (evt: MouseEvent) => {
function handleClick(evt: MouseEvent) {
hide?.()
emit('click', evt)
}
@ -24,11 +31,11 @@ useCommand({
scope: 'Actions',
order: -1,
visible: () => props.command && props.text,
visible: () => command && text,
name: () => props.text!,
icon: () => props.icon ?? 'i-ri:question-line',
description: () => props.description,
name: () => text!,
icon: () => icon ?? 'i-ri:question-line',
description: () => description,
onActivate() {
const clickEvent = new MouseEvent('click', {
@ -46,6 +53,8 @@ useCommand({
v-bind="$attrs"
:is="is"
ref="el"
:type="type"
w-full
flex gap-3 items-center cursor-pointer px4 py3
select-none
hover-bg-active

View file

@ -1,10 +1,10 @@
<script setup lang="ts">
const props = defineProps<{
const { code, lang } = defineProps<{
code: string
lang?: string
}>()
const raw = $computed(() => decodeURIComponent(props.code).replace(/&#39;/g, '\''))
const raw = computed(() => decodeURIComponent(code).replace(/&#39;/g, '\''))
const langMap: Record<string, string> = {
js: 'javascript',
@ -13,7 +13,7 @@ const langMap: Record<string, string> = {
}
const highlighted = computed(() => {
return props.lang ? highlightCode(raw, (langMap[props.lang] || props.lang) as any) : raw
return lang ? highlightCode(raw.value, (langMap[lang] || lang) as any) : raw
})
</script>

View file

@ -7,10 +7,12 @@ defineOptions({
const {
content,
emojis,
hideEmojis = false,
markdown = true,
} = defineProps<{
content: string
emojis?: mastodon.v1.CustomEmoji[]
hideEmojis?: boolean
markdown?: boolean
}>()
@ -21,6 +23,7 @@ export default () => h(
{ class: 'content-rich', dir: 'auto' },
contentToVNode(content, {
emojis: emojisObject.value,
hideEmojis,
markdown,
}),
)

View file

@ -5,7 +5,7 @@ const { conversation } = defineProps<{
conversation: mastodon.v1.Conversation
}>()
const withAccounts = $computed(() =>
const withAccounts = computed(() =>
conversation.accounts.filter(account => account.id !== conversation.lastStatus?.account.id),
)
</script>

View file

@ -1,12 +1,13 @@
<script setup lang="ts">
import type { Paginator, mastodon } from 'masto'
import type { mastodon } from 'masto'
const { paginator } = defineProps<{
paginator: Paginator<mastodon.v1.Conversation[], mastodon.DefaultPaginationParams>
defineProps<{
paginator: mastodon.Paginator<mastodon.v1.Conversation[], mastodon.DefaultPaginationParams>
}>()
function preprocess(items: mastodon.v1.Conversation[]): mastodon.v1.Conversation[] {
return items.filter(items => !items.lastStatus?.filtered?.find(
const isAuthored = (conversation: mastodon.v1.Conversation) => conversation.lastStatus ? conversation.lastStatus.account.id === currentUser.value?.account.id : false
return items.filter(item => isAuthored(item) || !item.lastStatus?.filtered?.find(
filter => filter.filter.filterAction === 'hide' && filter.filter.context.includes('thread'),
))
}

View file

@ -0,0 +1,30 @@
<script setup lang="ts">
const { alt, dataEmojiId } = defineProps<{
as: string
alt?: string
dataEmojiId?: string
}>()
const title = ref<string | undefined>()
if (alt) {
if (alt.startsWith(':')) {
title.value = alt.replace(/:/g, '')
}
else {
import('node-emoji').then(({ find }) => {
title.value = find(alt)?.key.replace(/_/g, ' ')
})
}
}
// if it has a data-emoji-id, use that as the title instead
if (dataEmojiId)
title.value = dataEmojiId
</script>
<template>
<component :is="as" v-bind="$attrs" :alt="alt" :data-emoji-id="dataEmojiId" :title="title">
<slot />
</component>
</template>

View file

@ -2,15 +2,17 @@
const emit = defineEmits<{
(event: 'close'): void
}>()
const vAutoFocus = (el: HTMLElement) => el.focus()
</script>
<template>
<div my-8 px-3 sm:px-8 md:max-w-200 flex="~ col gap-4" relative>
<button btn-action-icon absolute top--8 right-0 m1 aria-label="Close" @click="emit('close')">
<div i-ri:close-line />
<button v-auto-focus type="button" btn-action-icon absolute top--8 right-0 m1 :aria-label="$t('action.close')" @click="emit('close')">
<span i-ri:close-line />
</button>
<img :alt="$t('app_logo')" src="/logo.svg" w-20 h-20 height="80" width="80" mxa class="rtl-flip">
<img :alt="$t('app_logo')" :src="`/${''}logo.svg`" w-20 h-20 height="80" width="80" mxa class="rtl-flip">
<h1 mxa text-4xl mb4>
{{ $t('help.title') }}
</h1>
@ -28,21 +30,23 @@ const emit = defineEmits<{
</NuxtLink>
{{ $t('help.desc_para6') }}
</p>
{{ $t('help.desc_para3') }}
<p flex="~ gap-2 wrap" mxa>
<template v-for="team of teams" :key="team.github">
<NuxtLink :href="`https://github.com/sponsors/${team.github}`" target="_blank" external rounded-full transition duration-300 border="~ transparent" hover="scale-105 border-primary">
<NuxtLink hover:text-primary href="https://github.com/sponsors/elk-zone" target="_blank">
{{ $t('help.desc_para3') }}
</NuxtLink>
<p flex="~ gap-2 wrap justify-center" mxa>
<template v-for="team of elkTeamMembers" :key="team.github">
<NuxtLink :href="team.link" target="_blank" external rounded-full transition duration-300 border="~ transparent" hover="scale-105 border-primary">
<img :src="`/avatars/${team.github}-100x100.png`" :alt="team.display" rounded-full w-15 h-15 height="60" width="60">
</NuxtLink>
</template>
</p>
<p italic flex justify-center w-full>
<NuxtLink href="https://github.com/sponsors/elk-zone" target="_blank">
<span text-xl font-script hover:text-primary transition duration-300>The Elk Team</span>
<span text-xl font-script hover:text-primary transition duration-300>{{ $t('help.footer_team') }}</span>
</NuxtLink>
</p>
<button btn-solid mxa tabindex="2" @click="emit('close')">
<button type="button" btn-solid mxa @click="emit('close')">
{{ $t('action.enter_app') }}
</button>
</div>

View file

@ -0,0 +1,56 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
const { account, list } = defineProps<{
account: mastodon.v1.Account
hoverCard?: boolean
list: string
}>()
cacheAccount(account)
const client = useMastoClient()
const isRemoved = ref(false)
async function edit() {
try {
if (isRemoved.value)
await client.v1.lists.$select(list).accounts.create({ accountIds: [account.id] })
else
await client.v1.lists.$select(list).accounts.remove({ accountIds: [account.id] })
isRemoved.value = !isRemoved.value
}
catch (err) {
console.error(err)
}
}
</script>
<template>
<div flex justify-between hover:bg-active transition-100 items-center>
<AccountInfo
:account="account" hover p1 as="router-link"
:hover-card="hoverCard"
shrink
overflow-hidden
:to="getAccountRoute(account)"
/>
<div>
<CommonTooltip
:content="isRemoved ? $t('list.add_account') : $t('list.remove_account')"
:hover="isRemoved ? 'text-green' : 'text-red'"
>
<button
text-sm p2 border-1 transition-colors
border-dark
bg-base
btn-action-icon
@click="edit"
>
<span :class="isRemoved ? 'i-ri:user-add-line' : 'i-ri:user-unfollow-line'" />
</button>
</CommonTooltip>
</div>
</div>
</template>

View file

@ -0,0 +1,23 @@
<script setup lang="ts">
import type { SearchResult } from '~/composables/masto/search'
defineProps<{
result: SearchResult
active: boolean
}>()
</script>
<template>
<CommonScrollIntoView
as="div"
:active="active"
py2 block px2
:aria-selected="active"
:class="{ 'bg-active': active }"
>
<AccountInfo
v-if="result.type === 'account'"
:account="result.data"
/>
</CommonScrollIntoView>
</template>

View file

@ -0,0 +1,211 @@
<script setup lang="ts">
import type { mastodon } from 'masto'
import { useForm } from 'slimeform'
const emit = defineEmits<{
(e: 'listUpdated', list: mastodon.v1.List): void
(e: 'listRemoved', id: string): void
}>()
const list = defineModel<mastodon.v1.List>({ required: true })
const { t } = useI18n()
const client = useMastoClient()
const { form, isDirty, submitter, reset } = useForm({
form: () => ({ ...list.value }),
})
const isEditing = ref<boolean>(false)
const deleting = ref<boolean>(false)
const actionError = ref<string | undefined>(undefined)
const input = ref<HTMLInputElement>()
const editBtn = ref<HTMLButtonElement>()
const deleteBtn = ref<HTMLButtonElement>()
async function prepareEdit() {
isEditing.value = true
actionError.value = undefined
await nextTick()
input.value?.focus()
}
async function cancelEdit() {
isEditing.value = false
actionError.value = undefined
await nextTick()
reset()
editBtn.value?.focus()
}
const { submit, submitting } = submitter(async () => {
try {
list.value = await client.v1.lists.$select(form.id).update({
title: form.title,
})
cancelEdit()
}
catch (err) {
console.error(err)
actionError.value = (err as Error).message
await nextTick()
input.value?.focus()
}
})
async function removeList() {
if (deleting.value)
return
const confirmDelete = await openConfirmDialog({
title: t('confirm.delete_list.title'),
description: t('confirm.delete_list.description', [list.value.title]),
confirm: t('confirm.delete_list.confirm'),
cancel: t('confirm.delete_list.cancel'),
})
deleting.value = true
actionError.value = undefined
await nextTick()
if (confirmDelete.choice === 'confirm') {
await nextTick()
try {
await client.v1.lists.$select(list.value.id).remove()
emit('listRemoved', list.value.id)
}
catch (err) {
console.error(err)
actionError.value = (err as Error).message
await nextTick()
deleteBtn.value?.focus()
}
finally {
deleting.value = false
}
}
else {
deleting.value = false
}
}
async function clearError() {
actionError.value = undefined
await nextTick()
if (isEditing.value)
input.value?.focus()
else
deleteBtn.value?.focus()
}
onDeactivated(cancelEdit)
</script>
<template>
<form
hover:bg-active flex justify-between items-center gap-x-2
:aria-describedby="actionError ? `action-list-error-${list.id}` : undefined"
:class="actionError ? 'border border-base border-rounded rounded-be-is-0 rounded-be-ie-0 border-b-unset border-$c-danger-active' : null"
@submit.prevent="submit"
>
<div
v-if="isEditing"
bg-base border="~ base" h10 m2 ps-1 pe-4 rounded-3 w-full flex="~ row"
items-center relative focus-within:box-shadow-outline gap-3
>
<CommonTooltip v-if="isEditing" :content="$t('list.cancel_edit')">
<button
type="button"
rounded-full text-sm p2 transition-colors
hover:text-primary
@click="cancelEdit()"
>
<span block text-current i-ri:close-fill />
</button>
</CommonTooltip>
<input
ref="input"
v-model="form.title"
rounded-3 w-full bg-transparent
outline="focus:none" pe-4 pb="1px"
flex-1 placeholder-text-secondary
@keydown.esc="cancelEdit()"
>
</div>
<NuxtLink v-else :to="`list/${list.id}`" block grow p4>
{{ form.title }}
</NuxtLink>
<div mr4 flex gap2>
<CommonTooltip v-if="isEditing" :content="$t('list.save')">
<button
type="submit"
text-sm p2 border-1 transition-colors
border-dark hover:text-primary
btn-action-icon
:disabled="deleting || !isDirty || submitting"
>
<template v-if="isEditing">
<span v-if="submitting" aria-hidden="true" block animate animate-spin preserve-3d class="rtl-flip">
<span block i-ri:loader-2-fill aria-hidden="true" />
</span>
<span v-else block text-current i-ri:save-2-fill class="rtl-flip" />
</template>
</button>
</CommonTooltip>
<CommonTooltip v-else :content="$t('list.edit')">
<button
ref="editBtn"
type="button"
text-sm p2 border-1 transition-colors
border-dark hover:text-primary
btn-action-icon
@click.prevent="prepareEdit"
>
<span block text-current i-ri:edit-2-line class="rtl-flip" />
</button>
</CommonTooltip>
<CommonTooltip :content="$t('list.delete')">
<button
type="button"
text-sm p2 border-1 transition-colors
border-dark hover:text-primary
btn-action-icon
:disabled="isEditing"
@click.prevent="removeList"
>
<span v-if="deleting" aria-hidden="true" block animate animate-spin preserve-3d class="rtl-flip">
<span block i-ri:loader-2-fill aria-hidden="true" />
</span>
<span v-else block text-current i-ri:delete-bin-2-line class="rtl-flip" />
</button>
</CommonTooltip>
</div>
</form>
<CommonErrorMessage
v-if="actionError"
:id="`action-list-error-${list.id}`"
:described-by="`action-list-failed-${list.id}`"
class="rounded-bs-is-0 rounded-bs-ie-0 border-t-dashed m-b-2"
>
<header :id="`action-list-failed-${list.id}`" flex justify-between>
<div flex items-center gap-x-2 font-bold>
<div aria-hidden="true" i-ri:error-warning-fill />
<p>{{ $t(`list.${isEditing ? 'edit_error' : 'delete_error'}`) }}</p>
</div>
<CommonTooltip placement="bottom" :content="$t('list.clear_error')">
<button
flex rounded-4 p1 hover:bg-active cursor-pointer transition-100 :aria-label="$t('list.clear_error')"
@click="clearError"
>
<span aria-hidden="true" w="1.75em" h="1.75em" i-ri:close-line />
</button>
</CommonTooltip>
</header>
<ol ps-2 sm:ps-1>
<li flex="~ col sm:row" gap-y-1 sm:gap-x-2>
<strong sr-only>{{ $t('list.error_prefix') }}</strong>
<span>{{ actionError }}</span>
</li>
</ol>
</CommonErrorMessage>
</template>

View file

@ -0,0 +1,61 @@
<script setup lang="ts">
const { userId } = defineProps<{
userId: string
}>()
const { client } = useMasto()
const paginator = client.value.v1.lists.list()
const listsWithUser = ref((await client.value.v1.accounts.$select(userId).lists.list()).map(list => list.id))
function indexOfUserInList(listId: string) {
return listsWithUser.value.indexOf(listId)
}
async function edit(listId: string) {
try {
const index = indexOfUserInList(listId)
if (index === -1) {
await client.value.v1.lists.$select(listId).accounts.create({ accountIds: [userId] })
listsWithUser.value.push(listId)
}
else {
await client.value.v1.lists.$select(listId).accounts.remove({ accountIds: [userId] })
listsWithUser.value = listsWithUser.value.filter(id => id !== listId)
}
}
catch (err) {
console.error(err)
}
}
</script>
<template>
<CommonPaginator :paginator="paginator">
<template #default="{ item }">
<div p4 hover:bg-active block w="100%" flex justify-between items-center gap-4>
<p>{{ item.title }}</p>
<CommonTooltip
:content="indexOfUserInList(item.id) === -1 ? $t('list.add_account') : $t('list.remove_account')"
:hover="indexOfUserInList(item.id) === -1 ? 'text-green' : 'text-red'"
>
<button
text-sm p2 border-1 transition-colors
border-dark
btn-action-icon
@click="() => edit(item.id)"
>
<span :class="indexOfUserInList(item.id) === -1 ? 'i-ri:user-add-line' : 'i-ri:user-unfollow-line'" />
</button>
</CommonTooltip>
</div>
</template>
<template #done>
<NuxtLink
p4 hover:bg-active block w="100%" flex justify-between items-center gap-4
to="/lists"
>
<p>{{ $t('list.manage') }}</p>
</NuxtLink>
</template>
</CommonPaginator>
</template>

View file

@ -0,0 +1,166 @@
<script setup lang="ts">
const emit = defineEmits(['close'])
const { t } = useI18n()
/* TODOs:
* - I18n
*/
interface ShortcutDef {
keys: string[]
isSequence: boolean
}
interface ShortcutItem {
description: string
shortcut: ShortcutDef
}
interface ShortcutItemGroup {
name: string
items: ShortcutItem[]
}
const isMac = useIsMac()
const modifierKeyName = computed(() => isMac.value ? '⌘' : 'Ctrl')
const shortcutItemGroups = computed<ShortcutItemGroup[]>(() => [
{
name: t('magic_keys.groups.navigation.title'),
items: [
{
description: t('magic_keys.groups.navigation.shortcut_help'),
shortcut: { keys: ['?'], isSequence: false },
},
{
description: t('magic_keys.groups.navigation.next_status'),
shortcut: { keys: ['j'], isSequence: false },
},
{
description: t('magic_keys.groups.navigation.previous_status'),
shortcut: { keys: ['k'], isSequence: false },
},
{
description: t('magic_keys.groups.navigation.go_to_search'),
shortcut: { keys: ['/'], isSequence: false },
},
{
description: t('magic_keys.groups.navigation.go_to_home'),
shortcut: { keys: ['g', 'h'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_notifications'),
shortcut: { keys: ['g', 'n'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_conversations'),
shortcut: { keys: ['g', 'c'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_favourites'),
shortcut: { keys: ['g', 'f'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_bookmarks'),
shortcut: { keys: ['g', 'b'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_explore'),
shortcut: { keys: ['g', 'e'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_local'),
shortcut: { keys: ['g', 'l'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_federated'),
shortcut: { keys: ['g', 't'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_lists'),
shortcut: { keys: ['g', 'i'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_settings'),
shortcut: { keys: ['g', 's'], isSequence: true },
},
{
description: t('magic_keys.groups.navigation.go_to_profile'),
shortcut: { keys: ['g', 'p'], isSequence: true },
},
],
},
{
name: t('magic_keys.groups.actions.title'),
items: [
{
description: t('magic_keys.groups.actions.search'),
shortcut: { keys: [modifierKeyName.value, 'k'], isSequence: false },
},
{
description: t('magic_keys.groups.actions.command_mode'),
shortcut: { keys: [modifierKeyName.value, '/'], isSequence: false },
},
{
description: t('magic_keys.groups.actions.compose'),
shortcut: { keys: ['c'], isSequence: false },
},
{
description: t('magic_keys.groups.actions.show_new_items'),
shortcut: { keys: ['.'], isSequence: false },
},
{
description: t('magic_keys.groups.actions.favourite'),
shortcut: { keys: ['f'], isSequence: false },
},
{
description: t('magic_keys.groups.actions.boost'),
shortcut: { keys: ['b'], isSequence: false },
},
],
},
{
name: t('magic_keys.groups.media.title'),
items: [],
},
])
</script>
<template>
<div px-3 sm:px-5 py-2 sm:py-4 max-w-220 relative max-h-screen>
<button btn-action-icon absolute top-1 sm:top-2 right-1 sm:right-2 m1 :aria-label="$t('modals.aria_label_close')" @click="emit('close')">
<div i-ri:close-fill />
</button>
<h2 text-xl font-700 mb3>
{{ $t('magic_keys.dialog_header') }}
</h2>
<div mb2 grid grid-cols-1 md:grid-cols-3 gap-y- md:gap-x-6 lg:gap-x-8>
<div
v-for="group in shortcutItemGroups"
:key="group.name"
>
<h3 font-700 my-2 text-lg>
{{ group.name }}
</h3>
<div
v-for="item in group.items"
:key="item.description"
flex my-1 lg:my-2 justify-between place-items-center max-w-full text-base
>
<div mr-2 break-words overflow-hidden leading-4 h-full inline-block align-middle>
{{ item.description }}
</div>
<div>
<template
v-for="(key, idx) in item.shortcut.keys"
:key="idx"
>
<span v-if="idx !== 0" mx1 text-sm op80>{{ item.shortcut.isSequence ? $t('magic_keys.sequence_then') : '+' }}</span>
<code class="px2 md:px1.5 lg:px2 lg:px2 py0 lg:py-0.5" rounded bg-code border="px $c-border-code" shadow-sm my1 font-mono font-600>{{ key }}</code>
</template>
</div>
</div>
</div>
</div>
</div>
</template>

View file

@ -0,0 +1,70 @@
<script setup lang="ts">
defineProps<{
/** Show the back button on small screens */
backOnSmallScreen?: boolean
/** Show the back button on both small and big screens */
back?: boolean
/** Do not applying overflow hidden to let use floatable components in title */
noOverflowHidden?: boolean
}>()
const container = ref()
const route = useRoute()
const userSettings = useUserSettings()
const { height: windowHeight } = useWindowSize()
const { height: containerHeight } = useElementBounding(container)
const wideLayout = computed(() => route.meta.wideLayout ?? false)
const sticky = computed(() => route.path?.startsWith('/settings/'))
const containerClass = computed(() => {
// we keep original behavior when not in settings page and when the window height is smaller than the container height
if (!isHydrated.value || !sticky.value || (windowHeight.value < containerHeight.value))
return null
return 'lg:sticky lg:top-0'
})
</script>
<template>
<div ref="container" :class="containerClass">
<div
sticky top-0 z-20
pt="[env(safe-area-inset-top,0)]"
bg="[rgba(var(--rgb-bg-base),0.7)]"
class="native:lg:w-[calc(100vw-5rem)] native:xl:w-[calc(135%+(100vw-1200px)/2)]"
:class="{
'backdrop-blur': !getPreferences(userSettings, 'optimizeForLowPerformanceDevice'),
}"
>
<div flex justify-between gap-2 min-h-53px px5 py1 :class="{ 'xl:hidden': $route.name !== 'tag' }" class="native:xl:flex" border="b base">
<div flex gap-2 items-center :overflow-hidden="!noOverflowHidden ? '' : false" w-full>
<button
v-if="backOnSmallScreen || back"
btn-text flex items-center ms="-3" p-3 xl:hidden
:aria-label="$t('nav.back')"
@click="$router.go(-1)"
>
<div text-lg i-ri:arrow-left-line class="rtl-flip" />
</button>
<div :truncate="!noOverflowHidden ? '' : false" flex w-full data-tauri-drag-region class="native-mac:justify-start native-mac:text-center">
<slot name="title" />
</div>
<div sm:hidden h-7 w-1px />
</div>
<div flex items-center flex-shrink-0 gap-x-2>
<slot name="actions" />
<PwaBadge xl:hidden />
<NavUser v-if="isHydrated" />
<NavUserSkeleton v-else />
</div>
</div>
<slot name="header">
<div hidden />
</slot>
</div>
<PwaInstallPrompt xl:hidden />
<div :class="isHydrated && wideLayout ? 'xl:w-full sm:max-w-600px' : 'sm:max-w-600px md:shrink-0'" m-auto>
<div hidden :class="{ 'xl:block': $route.name !== 'tag' && !$slots.header }" h-6 />
<slot />
</div>
</div>
</template>

View file

@ -0,0 +1,45 @@
<script setup lang="ts">
const model = defineModel<number>()
const isValid = defineModel<boolean>('isValid')
const days = ref<number | ''>(0)
const hours = ref<number | ''>(1)
const minutes = ref<number | ''>(0)
watchEffect(() => {
if (days.value === '' || hours.value === '' || minutes.value === '') {
isValid.value = false
return
}
const duration
= days.value * 24 * 60 * 60
+ hours.value * 60 * 60
+ minutes.value * 60
if (duration <= 0) {
isValid.value = false
return
}
isValid.value = true
model.value = duration
})
</script>
<template>
<div flex flex-grow-0 gap-2>
<label flex items-center gap-2>
<input v-model="days" type="number" min="0" max="1999" input-base :class="!isValid ? 'input-error' : null">
{{ $t('confirm.mute_account.days', days === '' ? 0 : days) }}
</label>
<label flex items-center gap-2>
<input v-model="hours" type="number" min="0" max="24" input-base :class="!isValid ? 'input-error' : null">
{{ $t('confirm.mute_account.hours', hours === '' ? 0 : hours) }}
</label>
<label flex items-center gap-2>
<input v-model="minutes" type="number" min="0" max="59" step="5" input-base :class="!isValid ? 'input-error' : null">
{{ $t('confirm.mute_account.minute', minutes === '' ? 0 : minutes) }}
</label>
</div>
</template>

View file

@ -0,0 +1,56 @@
<script setup lang="ts">
import type { ConfirmDialogChoice, ConfirmDialogOptions } from '#shared/types'
const { extraOptionType } = defineProps<ConfirmDialogOptions>()
const emit = defineEmits<{
(evt: 'choice', choice: ConfirmDialogChoice): void
}>()
const hasDuration = ref(false)
const isValidDuration = ref(true)
const duration = ref(60 * 60) // default to 1 hour
const shouldMuteNotifications = ref(true)
const isMute = computed(() => extraOptionType === 'mute')
function handleChoice(choice: ConfirmDialogChoice['choice']) {
const dialogChoice = {
choice,
...isMute.value && {
extraOptions: {
mute: {
duration: hasDuration.value ? duration.value : 0,
notifications: shouldMuteNotifications.value,
},
},
},
}
emit('choice', dialogChoice)
}
</script>
<template>
<div flex="~ col" gap-6>
<div font-bold text-lg>
{{ title }}
</div>
<div v-if="description">
{{ description }}
</div>
<div v-if="isMute" flex-col flex gap-4>
<CommonCheckbox v-model="hasDuration" :label="$t('confirm.mute_account.specify_duration')" prepend-checkbox checked-icon-color="text-primary" />
<ModalDurationPicker v-if="hasDuration" v-model="duration" v-model:is-valid="isValidDuration" />
<CommonCheckbox v-model="shouldMuteNotifications" :label="$t('confirm.mute_account.notifications')" prepend-checkbox checked-icon-color="text-primary" />
</div>
<div flex justify-end gap-2>
<button btn-text @click="handleChoice('cancel')">
{{ cancel || $t('confirm.common.cancel') }}
</button>
<button btn-solid :disabled="!isValidDuration" @click="handleChoice('confirm')">
{{ confirm || $t('confirm.common.confirm') }}
</button>
</div>
</div>
</template>

View file

@ -1,14 +1,17 @@
<script setup lang="ts">
import type { ConfirmDialogChoice } from '#shared/types'
import type { mastodon } from 'masto'
import type { ConfirmDialogChoice } from '~/types'
import {
isCommandPanelOpen,
isConfirmDialogOpen,
isEditHistoryDialogOpen,
isErrorDialogOpen,
isFavouritedBoostedByDialogOpen,
isKeyboardShortcutsDialogOpen,
isMediaPreviewOpen,
isPreviewHelpOpen,
isPublishDialogOpen,
isReportDialogOpen,
isSigninDialogOpen,
} from '~/composables/dialog'
@ -31,21 +34,21 @@ useEventListener('keydown', (e: KeyboardEvent) => {
}
})
const handlePublished = (status: mastodon.v1.Status) => {
function handlePublished(status: mastodon.v1.Status) {
lastPublishDialogStatus.value = status
isPublishDialogOpen.value = false
}
const handlePublishClose = () => {
function handlePublishClose() {
lastPublishDialogStatus.value = null
}
const handleConfirmChoice = (choice: ConfirmDialogChoice) => {
function handleConfirmChoice(choice: ConfirmDialogChoice) {
confirmDialogChoice.value = choice
isConfirmDialogOpen.value = false
}
const handleFavouritedBoostedByClose = () => {
function handleFavouritedBoostedByClose() {
isFavouritedBoostedByDialogOpen.value = false
}
</script>
@ -60,13 +63,14 @@ const handleFavouritedBoostedByClose = () => {
</ModalDialog>
<ModalDialog
v-model="isPublishDialogOpen"
max-w-180 flex
max-w-180 flex w-full
@close="handlePublishClose"
>
<!-- This `w-0` style is used to avoid overflow problems in flex layoutsso don't remove it unless you know what you're doing -->
<PublishWidget
<PublishWidgetList
v-if="dialogDraftKey"
:draft-key="dialogDraftKey" expanded flex-1 w-0
:draft-key="dialogDraftKey"
expanded
class="flex-1"
@published="handlePublished"
/>
</ModalDialog>
@ -87,6 +91,9 @@ const handleFavouritedBoostedByClose = () => {
<ModalDialog v-model="isConfirmDialogOpen" py-4 px-8 max-w-125>
<ModalConfirm v-if="confirmDialogLabel" v-bind="confirmDialogLabel" @choice="handleConfirmChoice" />
</ModalDialog>
<ModalDialog v-model="isErrorDialogOpen" py-4 px-8 max-w-125>
<ModalError v-if="errorDialogData" v-bind="errorDialogData" />
</ModalDialog>
<ModalDialog
v-model="isFavouritedBoostedByDialogOpen"
max-w-180
@ -94,5 +101,11 @@ const handleFavouritedBoostedByClose = () => {
>
<StatusFavouritedBoostedBy />
</ModalDialog>
<ModalDialog v-model="isKeyboardShortcutsDialogOpen" max-w-full sm:max-w-140 md:max-w-170 lg:max-w-220 md:min-w-160>
<MagickeysKeyboardShortcuts @close="closeKeyboardShortcuts()" />
</ModalDialog>
<ModalDialog v-model="isReportDialogOpen" keep-alive max-w-175>
<ReportModal v-if="reportAccount" :account="reportAccount" :status="reportStatus" @close="closeReportDialog()" />
</ModalDialog>
</template>
</template>

View file

@ -1,64 +1,38 @@
<script lang="ts" setup>
<script setup lang="ts">
import { useFocusTrap } from '@vueuse/integrations/useFocusTrap'
export interface Props {
/**
* level of depth
*
* @default 100
*/
zIndex?: number
/**
* whether to allow close dialog by clicking mask layer
*
* @default true
*/
closeByMask?: boolean
/**
* use v-if, destroy all the internal elements after closed
*
* @default true
*/
useVIf?: boolean
/**
* keep the dialog opened even when in other views
*
* @default false
*/
keepAlive?: boolean
/**
* The aria-labelledby id for the dialog.
*/
dialogLabelledBy?: string
}
const props = withDefaults(defineProps<Props>(), {
zIndex: 100,
closeByMask: true,
useVIf: true,
keepAlive: false,
})
const emit = defineEmits<{
/** v-model dialog visibility */
(event: 'close',): void
}>()
const { modelValue: visible } = defineModel<{
/** v-model dislog visibility */
modelValue: boolean
}>()
defineOptions({
inheritAttrs: false,
})
const {
zIndex = 100,
closeByMask = true,
useVIf = true,
keepAlive = false,
} = defineProps<{
// level of depth
zIndex?: number
// whether to allow close dialog by clicking mask layer
closeByMask?: boolean
// use v-if, destroy all the internal elements after closed
useVIf?: boolean
// keep the dialog opened even when in other views
keepAlive?: boolean
// The aria-labelledby id for the dialog.
dialogLabelledBy?: string
}>()
const emit = defineEmits<{
/** v-model dialog visibility */
(event: 'close'): void
}>()
const visible = defineModel<boolean>({ required: true })
const deactivated = useDeactivated()
const route = useRoute()
const userSettings = useUserSettings()
/** scrollable HTML element */
const elDialogMain = ref<HTMLDivElement>()
@ -80,12 +54,14 @@ defineExpose({
/** close the dialog */
function close() {
if (!visible.value)
return
visible.value = false
emit('close')
}
function clickMask() {
if (props.closeByMask)
if (closeByMask)
close()
}
@ -97,7 +73,7 @@ watch(visible, (value) => {
const notInCurrentPage = computed(() => deactivated.value || routePath.value !== route.path)
watch(notInCurrentPage, (value) => {
if (props.keepAlive)
if (keepAlive)
return
if (value)
close()
@ -106,7 +82,7 @@ watch(notInCurrentPage, (value) => {
// controls the state of v-if.
// when useVIf is toggled, v-if has the same state as modelValue, otherwise v-if is true
const isVIf = computed(() => {
return props.useVIf
return useVIf
? visible.value
: true
})
@ -114,14 +90,16 @@ const isVIf = computed(() => {
// controls the state of v-show.
// when useVIf is toggled, v-show is true, otherwise it has the same state as modelValue
const isVShow = computed(() => {
return !props.useVIf
return !useVIf
? visible.value
: true
})
const bindTypeToAny = ($attrs: any) => $attrs as any
function bindTypeToAny($attrs: any) {
return $attrs as any
}
const trapFocusDialog = () => {
function trapFocusDialog() {
if (isVShow.value)
nextTick().then(() => activate())
}
@ -155,7 +133,13 @@ useEventListener('keydown', (e: KeyboardEvent) => {
<!-- corresponding to issue: #106, so please don't remove it. -->
<!-- Mask layer: blur -->
<div class="dialog-mask" absolute inset-0 z-0 bg-transparent opacity-100 backdrop-filter backdrop-blur-sm touch-none />
<div
class="dialog-mask"
:class="{
'backdrop-blur-sm': !getPreferences(userSettings, 'optimizeForLowPerformanceDevice'),
}"
absolute inset-0 z-0 bg-transparent opacity-100 backdrop-filter touch-none
/>
<!-- Mask layer: dimming -->
<div class="dialog-mask" absolute inset-0 z-0 bg-black opacity-48 touch-none h="[calc(100%+0.5px)]" @click="clickMask" />
<!-- Dialog container -->

View file

@ -0,0 +1,31 @@
<script setup lang="ts">
import type { ErrorDialogData } from '#shared/types'
defineProps<ErrorDialogData>()
</script>
<template>
<div flex="~ col" gap-6>
<div font-bold text-lg text-center>
{{ title }}
</div>
<div
flex="~ col"
gap-1 text-sm
pt-1 ps-2 pe-1 pb-2
text-red-600 dark:text-red-400
border="~ base rounded red-600 dark:red-400"
>
<ol ps-2 sm:ps-1>
<li v-for="(message, i) in messages" :key="i" flex="~ col sm:row" gap-y-1 sm:gap-x-2>
{{ message }}
</li>
</ol>
</div>
<div flex justify-end gap-2>
<button btn-text @click="closeErrorDialog()">
{{ close }}
</button>
</div>
</div>
</template>

View file

@ -37,43 +37,41 @@ onUnmounted(() => locked.value = false)
</script>
<template>
<div relative h-full w-full flex pt-12 w-100vh @click="onClick">
<div relative h-full w-full flex pt-12 @click="onClick">
<button
v-if="hasNext" pointer-events-auto btn-action-icon bg="black/20" :aria-label="$t('action.previous')"
v-if="hasNext" pointer-events-auto btn-action-icon bg="black/20" :aria-label="$t('action.next')"
hover:bg="black/40" dark:bg="white/30" dark-hover:bg="white/20" absolute top="1/2" right-1 z5
:title="$t('action.next')" @click="next"
>
<div i-ri:arrow-right-s-line text-white />
</button>
<button
v-if="hasPrev" pointer-events-auto btn-action-icon bg="black/20" aria-label="action.next"
v-if="hasPrev" pointer-events-auto btn-action-icon bg="black/20" :aria-label="$t('action.prev')"
hover:bg="black/40" dark:bg="white/30" dark:hover-bg="white/20" absolute top="1/2" left-1 z5
:title="$t('action.prev')" @click="prev"
>
<div i-ri:arrow-left-s-line text-white />
</button>
<div flex flex-row items-center mxa>
<div flex="~ col center" max-h-full max-w-full>
<ModalMediaPreviewCarousel v-model="index" :media="mediaPreviewList" @close="emit('close')" />
<div flex="~ col center" h-full w-full>
<ModalMediaPreviewCarousel v-model="index" :media="mediaPreviewList" @close="emit('close')" />
<div bg="black/30" dark:bg="white/10" ms-4 mb-6 mt-4 text-white rounded-full flex="~ center shrink-0" overflow-hidden>
<div v-if="mediaPreviewList.length > 1" p="y-1 x-3" rounded-r-0 shrink-0>
{{ index + 1 }} / {{ mediaPreviewList.length }}
</div>
<p
v-if="current.description" bg="dark/30" dark:bg="white/10" p="y-1 x-3" rounded-ie-full line-clamp-1
ws-pre-wrap break-all :title="current.description" w-full
>
{{ current.description }}
</p>
<div bg="black/30" dark:bg="white/10" mb-6 mt-4 text-white rounded-full flex="~ center shrink-0" overflow-hidden>
<div v-if="mediaPreviewList.length > 1" p="y-1 x-3" rounded-r-0 shrink-0>
{{ index + 1 }} / {{ mediaPreviewList.length }}
</div>
<p
v-if="current.description" bg="dark/30" dark:bg="white/10" p="y-1 x-3" rounded-ie-full line-clamp-1
ws-pre-wrap break-all :title="current.description" w-full
>
{{ current.description }}
</p>
</div>
</div>
<div absolute top-0 w-full flex justify-end>
<button
btn-action-icon bg="black/30" aria-label="action.close" hover:bg="black/40" dark:bg="white/30"
btn-action-icon bg="black/30" :aria-label="$t('action.close')" hover:bg="black/40" dark:bg="white/30"
dark:hover-bg="white/20" pointer-events-auto shrink-0 @click="emit('close')"
>
<div i-ri:close-line text-white />

View file

@ -0,0 +1,286 @@
<script setup lang="ts">
import type { Vector2 } from '@vueuse/gesture'
import type { mastodon } from 'masto'
import { useGesture } from '@vueuse/gesture'
import { useReducedMotion } from '@vueuse/motion'
const { media = [] } = defineProps<{
media?: mastodon.v1.MediaAttachment[]
}>()
const emit = defineEmits<{
(event: 'close'): void
}>()
const modelValue = defineModel<number>({ required: true })
const slideGap = 20
const doubleTapThreshold = 250
const view = ref()
const slider = ref()
const slide = ref()
const image = ref()
const reduceMotion = import.meta.server ? ref(false) : useReducedMotion()
const isInitialScrollDone = useTimeout(350)
const canAnimate = computed(() => isInitialScrollDone.value && !reduceMotion.value)
const scale = ref(1)
const x = ref(0)
const y = ref(0)
const isDragging = ref(false)
const isPinching = ref(false)
const maxZoomOut = ref(1)
const isZoomedIn = computed(() => scale.value > 1)
const enableAutoplay = usePreferences('enableAutoplay')
function goToFocusedSlide() {
scale.value = 1
x.value = slide.value[modelValue.value].offsetLeft * scale.value
y.value = 0
}
onMounted(() => {
const slideGapAsScale = slideGap / view.value.clientWidth
maxZoomOut.value = 1 - slideGapAsScale
goToFocusedSlide()
})
watch(modelValue, goToFocusedSlide)
let lastOrigin = [0, 0]
let initialScale = 0
useGesture({
onPinch({ first, initial: [initialDistance], movement: [deltaDistance], da: [distance], origin, touches }) {
isPinching.value = true
if (first) {
initialScale = scale.value
}
else {
if (touches === 0)
handleMouseWheelZoom(initialScale, deltaDistance, origin)
else
handlePinchZoom(initialScale, initialDistance, distance, origin)
}
lastOrigin = origin
},
onPinchEnd() {
isPinching.value = false
isDragging.value = false
if (!isZoomedIn.value)
goToFocusedSlide()
},
onDrag({ movement, delta, pinching, tap, last, swipe, event, xy }) {
event.preventDefault()
if (pinching)
return
if (last)
handleLastDrag(tap, swipe, movement, xy)
else
handleDrag(delta, movement)
},
}, {
domTarget: view,
eventOptions: {
passive: false,
},
})
const shiftRestrictions = computed(() => {
const focusedImage = image.value[modelValue.value]
const focusedSlide = slide.value[modelValue.value]
const scaledImageWidth = focusedImage.offsetWidth * scale.value
const scaledHorizontalOverflow = scaledImageWidth / 2 - view.value.clientWidth / 2 + slideGap
const horizontalOverflow = Math.max(0, scaledHorizontalOverflow / scale.value)
const scaledImageHeight = focusedImage.offsetHeight * scale.value
const scaledVerticalOverflow = scaledImageHeight / 2 - view.value.clientHeight / 2 + slideGap
const verticalOverflow = Math.max(0, scaledVerticalOverflow / scale.value)
return {
left: focusedSlide.offsetLeft - horizontalOverflow,
right: focusedSlide.offsetLeft + horizontalOverflow,
top: focusedSlide.offsetTop - verticalOverflow,
bottom: focusedSlide.offsetTop + verticalOverflow,
}
})
function handlePinchZoom(initialScale: number, initialDistance: number, distance: number, [originX, originY]: Vector2) {
scale.value = initialScale * (distance / initialDistance)
scale.value = Math.max(maxZoomOut.value, scale.value)
const deltaCenterX = originX - lastOrigin[0]
const deltaCenterY = originY - lastOrigin[1]
handleZoomDrag([deltaCenterX, deltaCenterY])
}
function handleMouseWheelZoom(initialScale: number, deltaDistance: number, [originX, originY]: Vector2) {
scale.value = initialScale + (deltaDistance / 1000)
scale.value = Math.max(maxZoomOut.value, scale.value)
const deltaCenterX = lastOrigin[0] - originX
const deltaCenterY = lastOrigin[1] - originY
handleZoomDrag([deltaCenterX, deltaCenterY])
}
function handleLastDrag(tap: boolean, swipe: Vector2, movement: Vector2, position: Vector2) {
isDragging.value = false
if (tap)
handleTap(position)
else if (swipe[0] || swipe[1])
handleSwipe(swipe, movement)
else if (!isZoomedIn.value)
slideToClosestSlide()
}
let lastTapAt = 0
function handleTap([positionX, positionY]: Vector2) {
const now = Date.now()
const isDoubleTap = now - lastTapAt < doubleTapThreshold
lastTapAt = now
if (!isDoubleTap)
return
if (isZoomedIn.value) {
goToFocusedSlide()
}
else {
const focusedSlideBounding = slide.value[modelValue.value].getBoundingClientRect()
const slideCenterX = focusedSlideBounding.left + focusedSlideBounding.width / 2
const slideCenterY = focusedSlideBounding.top + focusedSlideBounding.height / 2
scale.value = 3
x.value += positionX - slideCenterX
y.value += positionY - slideCenterY
restrictShiftToInsideSlide()
}
}
function handleSwipe([horiz, vert]: Vector2, [movementX, movementY]: Vector2) {
if (isZoomedIn.value || isPinching.value)
return
const isHorizontalDrag = Math.abs(movementX) >= Math.abs(movementY)
if (isHorizontalDrag) {
if (horiz === 1) // left
modelValue.value = Math.max(0, modelValue.value - 1)
if (horiz === -1) // right
modelValue.value = Math.min(media.length - 1, modelValue.value + 1)
}
else if (vert === 1 || vert === -1) {
emit('close')
}
goToFocusedSlide()
}
function slideToClosestSlide() {
const startOfFocusedSlide = slide.value[modelValue.value].offsetLeft * scale.value
const slideWidth = slide.value[modelValue.value].offsetWidth * scale.value
if (x.value > startOfFocusedSlide + slideWidth / 2)
modelValue.value = Math.min(media.length - 1, modelValue.value + 1)
else if (x.value < startOfFocusedSlide - slideWidth / 2)
modelValue.value = Math.max(0, modelValue.value - 1)
goToFocusedSlide()
}
function handleDrag(delta: Vector2, movement: Vector2) {
isDragging.value = true
if (isZoomedIn.value)
handleZoomDrag(delta)
else
handleSlideDrag(movement)
}
function handleZoomDrag([deltaX, deltaY]: Vector2) {
x.value -= deltaX / scale.value
y.value -= deltaY / scale.value
restrictShiftToInsideSlide()
}
function handleSlideDrag([movementX, movementY]: Vector2) {
goToFocusedSlide()
if (Math.abs(movementY) > Math.abs(movementX)) // vertical movement is more than horizontal
y.value -= movementY / scale.value
else
x.value -= movementX / scale.value
if (media.length === 1)
x.value = 0
}
function restrictShiftToInsideSlide() {
x.value = Math.min(shiftRestrictions.value.right, Math.max(shiftRestrictions.value.left, x.value))
y.value = Math.min(shiftRestrictions.value.bottom, Math.max(shiftRestrictions.value.top, y.value))
}
const sliderStyle = computed(() => {
const style = {
transform: `scale(${scale.value}) translate(${-x.value}px, ${-y.value}px)`,
transition: 'none',
gap: `${slideGap}px`,
}
if (canAnimate.value && !isDragging.value && !isPinching.value)
style.transition = 'all 0.3s ease'
return style
})
const imageStyle = computed(() => ({
cursor: isDragging.value ? 'grabbing' : 'grab',
}))
</script>
<template>
<div ref="view" flex flex-row h-full w-full overflow-hidden>
<div ref="slider" :style="sliderStyle" w-full h-full flex items-center>
<div
v-for="item in media"
:key="item.id"
ref="slide"
flex-shrink-0
w-full
h-full
flex
items-center
justify-center
>
<component
:is="item.type === 'gifv' ? 'video' : 'img'"
ref="image"
:autoplay="enableAutoplay"
controls
loop
select-none
max-w-full
max-h-full
:style="imageStyle"
:draggable="false"
:src="item.url || item.previewUrl"
:alt="item.description || ''"
/>
</div>
</div>
</div>
</template>

View file

@ -0,0 +1,64 @@
<script setup lang="ts">
import type { Component } from 'vue'
import type { NavButtonName } from '../../composables/settings'
import {
NavButtonBookmark,
NavButtonCompose,
NavButtonExplore,
NavButtonFavorite,
NavButtonFederated,
NavButtonHashtag,
NavButtonHome,
NavButtonList,
NavButtonLocal,
NavButtonMention,
NavButtonMoreMenu,
NavButtonNotification,
NavButtonSearch,
} from '#components'
import { STORAGE_KEY_BOTTOM_NAV_BUTTONS } from '~/constants'
interface NavButton {
name: string
component: Component
}
const navButtons: NavButton[] = [
{ name: 'home', component: NavButtonHome },
{ name: 'search', component: NavButtonSearch },
{ name: 'notification', component: NavButtonNotification },
{ name: 'mention', component: NavButtonMention },
{ name: 'favorite', component: NavButtonFavorite },
{ name: 'bookmark', component: NavButtonBookmark },
{ name: 'compose', component: NavButtonCompose },
{ name: 'explore', component: NavButtonExplore },
{ name: 'local', component: NavButtonLocal },
{ name: 'federated', component: NavButtonFederated },
{ name: 'list', component: NavButtonList },
{ name: 'hashtag', component: NavButtonHashtag },
{ name: 'moreMenu', component: NavButtonMoreMenu },
]
const defaultSelectedNavButtonNames: NavButtonName[] = currentUser.value
? ['home', 'search', 'notification', 'mention', 'moreMenu']
: ['explore', 'local', 'federated', 'moreMenu']
const selectedNavButtonNames = useLocalStorage<NavButtonName[]>(STORAGE_KEY_BOTTOM_NAV_BUTTONS, defaultSelectedNavButtonNames)
const selectedNavButtons = computed(() => selectedNavButtonNames.value.map(name => navButtons.find(navButton => navButton.name === name)))
// only one icon can be lit up at the same time
const moreMenuVisible = ref(false)
</script>
<template>
<!-- This weird styles above are used for scroll locking, don't change it unless you know exactly what you're doing. -->
<nav
h-14 border="t base" flex flex-row text-xl
of-y-scroll scrollbar-hide overscroll-none
class="after-content-empty after:(h-[calc(100%+0.5px)] w-0.1px pointer-events-none)"
>
<Component :is="navButton!.component" v-for="navButton in selectedNavButtons" :key="navButton!.name" :active-class="moreMenuVisible ? '' : 'text-primary'" />
</nav>
</template>

View file

@ -0,0 +1,194 @@
<script setup lang="ts">
import { invoke } from '@vueuse/core'
const modelValue = defineModel<boolean>({ required: true })
const colorMode = useColorMode()
const userSettings = useUserSettings()
const drawerEl = ref<HTMLDivElement>()
function toggleVisible() {
modelValue.value = !modelValue.value
}
const buttonEl = ref<HTMLDivElement>()
/**
* Close the drop-down menu if the mouse click is not on the drop-down menu button when the drop-down menu is opened
* @param mouse
*/
function clickEvent(mouse: MouseEvent) {
if (mouse.target && !buttonEl.value?.children[0].contains(mouse.target as any)) {
if (modelValue.value) {
document.removeEventListener('click', clickEvent)
modelValue.value = false
}
}
}
function toggleDark() {
colorMode.preference = colorMode.value === 'dark' ? 'light' : 'dark'
}
watch(modelValue, (val) => {
if (val && typeof document !== 'undefined')
document.addEventListener('click', clickEvent)
})
onBeforeUnmount(() => {
document.removeEventListener('click', clickEvent)
})
// Pull down to close
const { dragging, dragDistance } = invoke(() => {
const triggerDistance = 120
let scrollTop = 0
let beforeTouchPointY = 0
const dragDistance = ref(0)
const dragging = ref(false)
useEventListener(drawerEl, 'scroll', (e: Event) => {
scrollTop = (e.target as HTMLDivElement).scrollTop
// Prevent the page from scrolling when the drawer is being dragged.
if (dragDistance.value > 0)
(e.target as HTMLDivElement).scrollTop = 0
}, { passive: true })
useEventListener(drawerEl, 'touchstart', (e: TouchEvent) => {
if (!modelValue.value)
return
beforeTouchPointY = e.touches[0].pageY
dragDistance.value = 0
}, { passive: true })
useEventListener(drawerEl, 'touchmove', (e: TouchEvent) => {
if (!modelValue.value)
return
// Do not move the entire drawer when its contents are not scrolled to the top.
if (scrollTop > 0 && dragDistance.value <= 0) {
dragging.value = false
beforeTouchPointY = e.touches[0].pageY
return
}
const { pageY } = e.touches[0]
// Calculate the drag distance.
dragDistance.value += pageY - beforeTouchPointY
if (dragDistance.value < 0)
dragDistance.value = 0
beforeTouchPointY = pageY
// Marked as dragging.
if (dragDistance.value > 1)
dragging.value = true
// Prevent the page from scrolling when the drawer is being dragged.
if (dragDistance.value > 0) {
if (e?.cancelable && e?.preventDefault)
e.preventDefault()
e?.stopPropagation()
}
}, { passive: true })
useEventListener(drawerEl, 'touchend', () => {
if (!modelValue.value)
return
if (dragDistance.value >= triggerDistance)
modelValue.value = false
dragging.value = false
// code
}, { passive: true })
return {
dragDistance,
dragging,
}
})
</script>
<template>
<div ref="buttonEl" flex items-center static>
<slot :toggle-visible="toggleVisible" :show="modelValue" />
<!-- Drawer -->
<Transition
enter-active-class="transition duration-250 ease-out"
enter-from-class="opacity-0 children:(translate-y-full)"
enter-to-class="opacity-100 children:(translate-y-0)"
leave-active-class="transition duration-250 ease-in"
leave-from-class="opacity-100 children:(translate-y-0)"
leave-to-class="opacity-0 children:(translate-y-full)"
>
<div
v-show="modelValue"
absolute inset-x-0 top-auto bottom-full z-20 h-100vh
flex items-end of-y-scroll of-x-hidden scrollbar-hide overscroll-none
bg="black/50"
>
<!-- The style `scrollbar-hide overscroll-none overflow-y-scroll mb="-1px"` and `h="[calc(100%+0.5px)]"` is used to implement scroll locking, -->
<!-- corresponding to issue: #106, so please don't remove it. -->
<div absolute inset-0 opacity-0 h="[calc(100vh+0.5px)]" />
<div
ref="drawerEl"
:style="{
transform: dragging ? `translateY(${dragDistance}px)` : '',
}"
:class="{
'duration-0': dragging,
'duration-250': !dragging,
'backdrop-blur-md': !getPreferences(userSettings, 'optimizeForLowPerformanceDevice'),
}"
transition="transform ease-in"
flex-1 min-w-48 py-6 mb="-1px"
of-y-auto scrollbar-hide overscroll-none max-h="[calc(100vh-200px)]"
rounded-t-lg bg="white/85 dark:neutral-900/85" backdrop-filter
border-t-1 border-base
>
<!-- Nav -->
<NavSide />
<!-- Divider line -->
<div border="neutral-300 dark:neutral-700 t-1" m="x-3 y-2" />
<!-- Function menu -->
<div flex="~ col gap2">
<!-- Toggle Theme -->
<button
flex flex-row items-center
block px-5 py-2 focus-blue w-full
text-sm text-base capitalize text-left whitespace-nowrap
transition-colors duration-200 transform
hover="bg-gray-100 dark:(bg-gray-700 text-white)"
@click="toggleDark()"
>
<span class="i-ri:sun-line dark:i-ri:moon-line flex-shrink-0 text-xl me-4 !align-middle" />
{{ colorMode.value === 'light' ? $t('menu.toggle_theme.dark') : $t('menu.toggle_theme.light') }}
</button>
<!-- Zen Mode -->
<button
flex flex-row items-center
block px-5 py-2 focus-blue w-full
text-sm text-base capitalize text-left whitespace-nowrap
transition-colors duration-200 transform
hover="bg-gray-100 dark:(bg-gray-700 text-white)"
:aria-label="$t('nav.zen_mode')"
@click="togglePreferences('zenMode')"
>
<span :class="getPreferences(userSettings, 'zenMode') ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line'" class="flex-shrink-0 text-xl me-4 !align-middle" />
{{ $t('nav.zen_mode') }}
</button>
</div>
</div>
</div>
</Transition>
</div>
</template>

View file

@ -1,7 +1,7 @@
<script setup lang="ts">
const buildInfo = useRuntimeConfig().public.buildInfo
const buildInfo = useBuildInfo()
const timeAgoOptions = useTimeAgoOptions()
const config = useRuntimeConfig()
const userSettings = useUserSettings()
const buildTimeDate = new Date(buildInfo.time)
@ -23,11 +23,14 @@ function toggleDark() {
<button
flex
text-lg
:class="userSettings.zenMode ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line'"
:class="getPreferences(userSettings, 'zenMode') ? 'i-ri:layout-right-2-line' : 'i-ri:layout-right-line'"
:aria-label="$t('nav.zen_mode')"
@click="userSettings.zenMode = !userSettings.zenMode"
@click="togglePreferences('zenMode')"
/>
</CommonTooltip>
<CommonTooltip :content="$t('magic_keys.dialog_header')">
<button flex i-ri:keyboard-box-line dark-i-ri:keyboard-box-line text-lg :aria-label="$t('magic_keys.dialog_header')" @click="toggleKeyboardShortcuts" />
</CommonTooltip>
<CommonTooltip :content="$t('settings.about.sponsor_action')">
<NuxtLink
flex
@ -65,7 +68,7 @@ function toggleDark() {
target="_blank"
font-mono
>
{{ buildInfo.commit.slice(0, 7) }}
{{ buildInfo.shortCommit }}
</NuxtLink>
</template>
</div>
@ -73,6 +76,12 @@ function toggleDark() {
<NuxtLink cursor-pointer hover:underline to="/settings/about">
{{ $t('settings.about.label') }}
</NuxtLink>
<template v-if="config.public.privacyPolicyUrl">
&middot;
<NuxtLink cursor-pointer hover:underline :to="config.public.privacyPolicyUrl">
{{ $t('nav.privacy') }}
</NuxtLink>
</template>
&middot;
<NuxtLink href="/m.webtoo.ls/@elk" target="_blank">
Mastodon

View file

@ -0,0 +1,23 @@
<script setup lang="ts">
</script>
<template>
<span shrink-0 aspect="1/1" sm:h-8 xl:h-10 class="rtl-flip">
<!-- <svg
xmlns="http://www.w3.org/2000/svg" w-full
aspect="1/1" sm:h-8 xl:h-10 sm:w-8 xl:w-10 viewBox="0 0 250 250" fill="none"
> -->
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48"><defs><mask id="ipTEgg0"><g fill="none" stroke="#fff" stroke-width="4"><circle cx="24" cy="24" r="10" fill="#555555" stroke-linecap="round" stroke-linejoin="round" /><path d="M44 24c0 2.633-.508 5.146-1.433 7.448c-.936 2.331-4.129.071-7.346 3.521c-3.216 3.45-.71 6.267-3.204 7.36A19.9 19.9 0 0 1 24 44C12.954 44 4 35.046 4 24S12.954 4 24 4s20 8.954 20 20Z" /><path stroke-linecap="round" d="M20 25s.21 1.21 1 2s2 1 2 1" /></g></mask></defs><path fill="#ff8d00" d="M0 0h48v48H0z" mask="url(#ipTEgg0)" /></svg>
</span>
</template>
<style scoped>
svg path.wood {
fill: var(--c-primary);
}
svg path.body {
fill: var(--c-text-secondary);
}
</style>

View file

@ -0,0 +1,82 @@
<script setup lang="ts">
import { STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE } from '~/constants'
defineProps<{
command?: boolean
}>()
const { notifications } = useNotifications()
const useStarFavoriteIcon = usePreferences('useStarFavoriteIcon')
const lastAccessedNotificationRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_NOTIFICATION_ROUTE, '')
const lastAccessedExploreRoute = useLocalStorage(STORAGE_KEY_LAST_ACCESSED_EXPLORE_ROUTE, '')
const notificationsLink = computed(() => {
const hydrated = isHydrated.value
const user = currentUser.value
const lastRoute = lastAccessedNotificationRoute.value
if (!hydrated || !user || !lastRoute) {
return '/notifications'
}
return `/notifications/${lastRoute}`
})
const exploreLink = computed(() => {
const hydrated = isHydrated.value
const server = currentServer.value
let lastRoute = lastAccessedExploreRoute.value
if (!hydrated) {
return '/explore'
}
if (lastRoute.length) {
lastRoute = `/${lastRoute}`
}
return server ? `/${server}/explore${lastRoute}` : `/explore${lastRoute}`
})
</script>
<template>
<nav sm:px3 flex="~ col gap2" shrink text-size-base leading-normal md:text-lg h-full mt-1 overflow-y-auto>
<NavSideItem :text="$t('nav.search')" to="/search" icon="i-ri:search-line" xl:hidden :command="command" />
<div class="spacer" shrink xl:hidden />
<NavSideItem :text="$t('nav.home')" to="/home" icon="i-ri:home-5-line" user-only :command="command" />
<NavSideItem :text="$t('nav.notifications')" :to="notificationsLink" icon="i-ri:notification-4-line" user-only :command="command">
<template #icon>
<div flex relative>
<div class="i-ri:notification-4-line" text-xl />
<div v-if="notifications" class="top-[-0.3rem] right-[-0.3rem]" absolute font-bold rounded-full h-4 w-4 text-xs bg-primary text-inverted flex items-center justify-center>
{{ notifications < 10 ? notifications : '•' }}
</div>
</div>
</template>
</NavSideItem>
<NavSideItem :text="$t('nav.conversations')" to="/conversations" icon="i-ri:at-line" user-only :command="command" />
<NavSideItem :text="$t('nav.favourites')" to="/favourites" :icon="useStarFavoriteIcon ? 'i-ri:star-line' : 'i-ri:heart-3-line'" user-only :command="command" />
<NavSideItem :text="$t('nav.bookmarks')" to="/bookmarks" icon="i-ri:bookmark-line" user-only :command="command" />
<div class="spacer" shrink hidden sm:block />
<NavSideItem :text="$t('action.compose')" to="/compose" icon="i-ri:quill-pen-line" user-only :command="command" />
<div class="spacer" shrink hidden sm:block />
<NavSideItem :text="$t('nav.explore')" :to="exploreLink" icon="i-ri:compass-3-line" :command="command" />
<NavSideItem :text="$t('nav.local')" :to="isHydrated ? `/${currentServer}/public/local` : '/public/local'" icon="i-ri:group-2-line " :command="command" />
<NavSideItem :text="$t('nav.federated')" :to="isHydrated ? `/${currentServer}/public` : '/public'" icon="i-ri:earth-line" :command="command" />
<NavSideItem :text="$t('nav.lists')" :to="isHydrated ? `/${currentServer}/lists` : '/lists'" icon="i-ri:list-check" user-only :command="command" />
<NavSideItem :text="$t('nav.hashtags')" to="/hashtags" icon="i-ri:hashtag" user-only :command="command" />
<div class="spacer" shrink hidden sm:block />
<NavSideItem :text="$t('nav.settings')" to="/settings" icon="i-ri:settings-3-line" :command="command" />
</nav>
</template>
<style scoped>
.spacer {
margin-top: 0.5em;
}
@media screen and ( max-height: 920px ) and ( min-width: 640px ) {
.spacer {
margin-top: 0;
}
}
</style>

View file

@ -0,0 +1,108 @@
<script setup lang="ts">
const { text, icon, to, userOnly = false, command } = defineProps<{
text?: string
icon: string
to: string | Record<string, string>
userOnly?: boolean
command?: boolean
}>()
defineSlots<{
icon: (props: object) => void
default: (props: object) => void
}>()
const router = useRouter()
useCommand({
scope: 'Navigation',
name: () => text ?? (typeof to === 'string' ? to as string : to.name),
icon: () => icon,
visible: () => command,
onActivate() {
router.push(to)
},
})
const activeClass = ref('text-primary')
onHydrated(async () => {
// TODO: force NuxtLink to reevaluate, we now we are in this route though, so we should force it to active
// we don't have currentServer defined until later
activeClass.value = ''
await nextTick()
activeClass.value = 'text-primary'
})
// Optimize rendering for the common case of being logged in, only show visual feedback for disabled user-only items
// when we know there is no user.
const noUserDisable = computed(() => !isHydrated.value || (userOnly && !currentUser.value))
const noUserVisual = computed(() => isHydrated.value && userOnly && !currentUser.value)
</script>
<template>
<NuxtLink
:to="to"
:disabled="noUserDisable"
:class="noUserVisual ? 'op25 pointer-events-none ' : ''"
:active-class="activeClass"
group focus:outline-none disabled:pointer-events-none
:tabindex="noUserDisable ? -1 : null"
@click="$scrollToTop"
>
<CommonTooltip :disabled="!isMediumOrLargeScreen" :content="text" placement="right">
<div
class="item"
flex items-center gap4
xl="ml0 mr5 px5 w-auto"
:class="isSmallScreen
? `
w-full
px5 sm:mxa
transition-colors duration-200 transform
hover-bg-gray-100 hover-dark:(bg-gray-700 text-white)
` : `
w-fit rounded-3
px2 mx3 sm:mxa
transition-100
elk-group-hover-bg-active
group-focus-visible:ring-2
group-focus-visible:ring-current
`"
>
<slot name="icon">
<div :class="icon" text-xl />
</slot>
<slot>
<span block sm:hidden xl:block select-none>{{ isHydrated ? text : '&nbsp;' }}</span>
</slot>
</div>
</CommonTooltip>
</NuxtLink>
</template>
<style scoped>
.item {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
}
@media screen and ( max-height: 820px ) and ( min-width: 1280px ) {
.item {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
}
}
@media screen and ( max-height: 780px ) and ( min-width: 640px ) {
.item {
padding-top: 0.35rem;
padding-bottom: 0.35rem;
}
}
@media screen and ( max-height: 780px ) and ( min-width: 1280px ) {
.item {
padding-top: 0.05rem;
padding-bottom: 0.05rem;
}
}
</style>

View file

@ -0,0 +1,50 @@
<script setup lang="ts">
const { env } = useBuildInfo()
const router = useRouter()
const back = ref<any>('')
const nuxtApp = useNuxtApp()
function onClickLogo() {
nuxtApp.hooks.callHook('elk-logo:click')
}
onMounted(() => {
back.value = router.options.history.state.back
})
router.afterEach(() => {
back.value = router.options.history.state.back
})
</script>
<template>
<div flex justify-between sticky top-0 bg-base z-1 py-4 native:py-7 data-tauri-drag-region>
<NuxtLink
flex items-end gap-3
py2 px-5
text-2xl
select-none
focus-visible:ring="2 current"
to="/home"
@click.prevent="onClickLogo"
>
<NavLogo shrink-0 aspect="1/1" sm:h-8 xl:h-10 class="rtl-flip" />
<div v-show="isHydrated" hidden xl:block>
<span pr-1>{{ $t('app_name') }}</span>
<sup text-sm italic mt-1>{{ env === 'release' ? 'alpha' : env }}</sup>
</div>
</NuxtLink>
<div hidden xl:flex items-center me-6 mt-2 gap-1>
<CommonTooltip :content="$t('nav.back')" :distance="0">
<button
type="button"
:aria-label="$t('nav.back')"
btn-text p-3 :class="{ 'pointer-events-none op0': !back || back === '/', 'xl:flex': $route.name !== 'tag' }"
@click="$router.go(-1)"
>
<div text-xl i-ri:arrow-left-line class="rtl-flip" />
</button>
</CommonTooltip>
</div>
</div>
</template>

View file

@ -0,0 +1,47 @@
<script setup lang="ts">
const { busy, oauth, singleInstanceServer } = useSignIn()
</script>
<template>
<VDropdown v-if="isHydrated && currentUser" sm:hidden>
<div style="-webkit-touch-callout: none;">
<AccountAvatar
:account="currentUser.account"
h-8
w-8
:draggable="false"
square
/>
</div>
<template #popper="{ hide }">
<UserSwitcher @click="hide()" />
</template>
</VDropdown>
<template v-else>
<button
v-if="singleInstanceServer"
flex="~ row"
gap-x-1 items-center justify-center btn-solid text-sm px-2 py-1 xl:hidden
:disabled="busy"
@click="oauth()"
>
<span v-if="busy" aria-hidden="true" block animate animate-spin preserve-3d class="rtl-flip">
<span block i-ri:loader-2-fill aria-hidden="true" />
</span>
<span v-else aria-hidden="true" block i-ri:login-circle-line class="rtl-flip" />
<i18n-t keypath="action.sign_in_to">
<strong>{{ currentServer }}</strong>
</i18n-t>
</button>
<button
v-else
flex="~ row"
gap-x-1 items-center justify-center btn-solid text-sm px-2 py-1 xl:hidden
@click="openSigninDialog()"
>
<span aria-hidden="true" block i-ri:login-circle-line class="rtl-flip" />
{{ $t('action.sign_in') }}
</button>
</template>
</template>

Some files were not shown because too many files have changed in this diff Show more